table

Помоћни програм из командне линије за форматирање и приказ CSV-а
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување 9494cfed16d6cb63868f31be9be9a6340f270b65
родитељ e841fbe524c35a27b3d34d136fd49a986c19e575
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Fri, 13 Aug 2021 21:17:01 +0200

Formatted code using clang-format

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mtable.c | 376+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mutf8.h | 42+++++++++++++++++++++---------------------
измењених датотека: 2, додавања: 234(+), брисања: 184(-)

diff --git a/table.c b/table.c @@ -11,56 +11,75 @@ #include "defs.h" #include "version.h" -#define CHECKEXITNOMEM(ptr) do { if (!ptr) exit(error(ENOMEM, \ - "Memory allocation failed (out of memory?)")); } while (0) - -#define CALLOC(ptr, ptrtype, nmemb) do { ptr = calloc(nmemb, sizeof(ptrtype)); \ - CHECKEXITNOMEM(ptr); } while (0) - -#define REALLOC(ptr, ptrtype, newsize) do { ptrtype* newptr = realloc(ptr, newsize); \ - CHECKEXITNOMEM(newptr); \ - ptr = newptr; } while (0) +#define CHECKEXITNOMEM(ptr) \ + do \ + { \ + if (!ptr) \ + exit(error(ENOMEM, \ + "Memory allocation failed (out of memory?)")); \ + } while (0) + +#define CALLOC(ptr, ptrtype, nmemb) \ + do \ + { \ + ptr = calloc(nmemb, sizeof(ptrtype)); \ + CHECKEXITNOMEM(ptr); \ + } while (0) + +#define REALLOC(ptr, ptrtype, newsize) \ + do \ + { \ + ptrtype* newptr = realloc(ptr, newsize); \ + CHECKEXITNOMEM(newptr); \ + ptr = newptr; \ + } while (0) #define REALLOCARRAY(ptr, membtype, newcount) \ REALLOC(ptr, membtype, sizeof(membtype) * newcount); -#define CHECKCOPY(token, ptoken, token_size, parg) do { \ - if (ptoken + 2 > token + token_size) \ - { \ - size_t old_size = token_size; \ - token_size += BUFSIZE; \ - REALLOC(token, char, token_size); \ - ptoken = token + old_size - 1; \ - } \ - *ptoken++ = *parg++; } while (0) - -#define CHECKSET(format, pformat, format_size, num) do { \ - if (pformat + 2 > format + format_size) \ - { \ - size_t old_size = format_size; \ - format_size += BUFSIZE; \ - REALLOC(format, ULONG, format_size); \ - pformat = format + old_size - 1; \ - } \ - *pformat++ = num; } while (0) - -size_t colno = 0; -size_t lineno = 0; -int current_symbol_set = TABLE_SYMBOLS_DOUBLE; +#define CHECKCOPY(token, ptoken, token_size, parg) \ + do \ + { \ + if (ptoken + 2 > token + token_size) \ + { \ + size_t old_size = token_size; \ + token_size += BUFSIZE; \ + REALLOC(token, char, token_size); \ + ptoken = token + old_size - 1; \ + } \ + *ptoken++ = *parg++; \ + } while (0) + +#define CHECKSET(format, pformat, format_size, num) \ + do \ + { \ + if (pformat + 2 > format + format_size) \ + { \ + size_t old_size = format_size; \ + format_size += BUFSIZE; \ + REALLOC(format, ULONG, format_size); \ + pformat = format + old_size - 1; \ + } \ + *pformat++ = num; \ + } while (0) + +size_t colno = 0; +size_t lineno = 0; +int current_symbol_set = TABLE_SYMBOLS_DOUBLE; int current_inner_symbol_set = TABLE_INNER_DOUBLE_SINGLE; size_t current_table_column = 0; size_t current_rune_column = 0; -size_t table_columns = 0; -size_t rune_columns = 80; -size_t tab_length = 8; -u32 delimiter = L','; -ULONG* format = NULL; -size_t format_size = 0; -ULONG format_value = 0; -BOOL border_mode = FALSE; -BOOL handle_ansi = TRUE; -BOOL msdos = FALSE; -BOOL expand_tabs = FALSE; +size_t table_columns = 0; +size_t rune_columns = 80; +size_t tab_length = 8; +u32 delimiter = L','; +ULONG* format = NULL; +size_t format_size = 0; +ULONG format_value = 0; +BOOL border_mode = FALSE; +BOOL handle_ansi = TRUE; +BOOL msdos = FALSE; +BOOL expand_tabs = FALSE; int version() @@ -73,17 +92,18 @@ int usage() { printf("Usage: %s [-b|--border-mode] [-c <cols>|--columns=<cols>] [-d" - " <delim>|--delimiter=<delim>] [-f <format>|--format=<format>]" - " [-h|--help] [-m|--msdos] [-n|--no-ansi]" - " [-s <set>|--symbols=<set>] [-t|--expand-tabs] [-v|--version]\n", - PROGRAMNAME); + " <delim>|--delimiter=<delim>] [-f <format>|--format=<format>]" + " [-h|--help] [-m|--msdos] [-n|--no-ansi]" + " [-s <set>|--symbols=<set>] [-t|--expand-tabs] " + "[-v|--version]\n", + PROGRAMNAME); return 0; } int error(int code, char* fmt, ...) { - char buf[BUFSIZE]; + char buf[BUFSIZE]; va_list args; va_start(args, fmt); vsnprintf(buf, sizeof(buf), (const char*)fmt, args); @@ -98,14 +118,14 @@ substr(const char* src, int start, int finish) int len = strlen(src); if (finish > len) finish = len; - int substr_len = finish-start; + int substr_len = finish - start; if (substr_len < 0) substr_len = 0; char* result = NULL; - CALLOC(result, char, substr_len+1); + CALLOC(result, char, substr_len + 1); char* presult = result; - for (int i = start; i < finish && *(src+i) != '\0'; i++) - *presult++ = *(src+i); + for (int i = start; i < finish && *(src + i) != '\0'; i++) + *presult++ = *(src + i); *presult = 0; return result; @@ -117,7 +137,7 @@ startswith(const char* s, const char* what) if (!s || !what) return 0; - char* subs = substr(s, 0, strlen(what)); + char* subs = substr(s, 0, strlen(what)); BOOL result = !strcmp(subs, what); free(subs); @@ -126,32 +146,31 @@ startswith(const char* s, const char* what) } int -set_symbol_set(char* arg, int* current_symbol_set, - int* current_inner_symbol_set) +set_symbol_set(char* arg, int* current_symbol_set, int* current_inner_symbol_set) { if (!strcmp(arg, "aa")) { - *current_symbol_set = TABLE_SYMBOLS_ASCII; + *current_symbol_set = TABLE_SYMBOLS_ASCII; *current_inner_symbol_set = TABLE_INNER_ASCII_ASCII; } else if (!strcmp(arg, "ss")) { - *current_symbol_set = TABLE_SYMBOLS_SINGLE; + *current_symbol_set = TABLE_SYMBOLS_SINGLE; *current_inner_symbol_set = TABLE_INNER_SINGLE_SINGLE; } else if (!strcmp(arg, "sd")) { - *current_symbol_set = TABLE_SYMBOLS_SINGLE; + *current_symbol_set = TABLE_SYMBOLS_SINGLE; *current_inner_symbol_set = TABLE_INNER_SINGLE_DOUBLE; } else if (!strcmp(arg, "ds")) { - *current_symbol_set = TABLE_SYMBOLS_DOUBLE; + *current_symbol_set = TABLE_SYMBOLS_DOUBLE; *current_inner_symbol_set = TABLE_INNER_DOUBLE_SINGLE; } else if (!strcmp(arg, "dd")) { - *current_symbol_set = TABLE_SYMBOLS_DOUBLE; + *current_symbol_set = TABLE_SYMBOLS_DOUBLE; *current_inner_symbol_set = TABLE_INNER_DOUBLE_DOUBLE; } else @@ -176,12 +195,12 @@ int set_delimiter(u8* arg, u32* delimiter) { size_t delimiter_len = 0; - u8* parg = arg; + u8* parg = arg; u32 uch; while (parg && *parg) { - u8_char_to_u32(&uch, parg, &delimiter_len); + u8_char_to_u32(&uch, parg, &delimiter_len); if (uch != (u32)L'"' && uch != (u32)L'\'') { *delimiter = uch; @@ -197,14 +216,14 @@ int set_format(const char* arg, ULONG** format, size_t* format_size) { const char* parg = arg; - ULONG* pformat = NULL; - char* token = NULL; + ULONG* pformat = NULL; + char* token = NULL; size_t token_size = BUFSIZE; - char* ptoken = NULL; + char* ptoken = NULL; ULONG num; CALLOC(token, char, token_size); - ptoken = token; + ptoken = token; *format_size = SMALL_BUFSIZE; CALLOC(*format, ULONG, *format_size); pformat = *format; @@ -220,7 +239,7 @@ set_format(const char* arg, ULONG** format, size_t* format_size) } if (*parg == ':') { - if (parg == arg || !*(parg+1)) + if (parg == arg || !*(parg + 1)) { free(token); free(*format); @@ -228,7 +247,7 @@ set_format(const char* arg, ULONG** format, size_t* format_size) return 2; } *ptoken = 0; - num = strtol(token, NULL, 10); + num = strtol(token, NULL, 10); if (errno) { perror("strtol"); @@ -248,7 +267,7 @@ set_format(const char* arg, ULONG** format, size_t* format_size) if (*token) { *ptoken = 0; - num = strtol(token, NULL, 10); + num = strtol(token, NULL, 10); if (errno) { perror("strtol"); @@ -270,8 +289,8 @@ size_t number_of_columns(const u8* input, u32 delimiter) { u32 uch; - size_t ch_len = 0; - size_t result = 1; + size_t ch_len = 0; + size_t result = 1; const u8* pinput = NULL; pinput = input; @@ -281,7 +300,7 @@ number_of_columns(const u8* input, u32 delimiter) while (pinput && *pinput) { - u8_char_to_u32(&uch, pinput, &ch_len); + u8_char_to_u32(&uch, pinput, &ch_len); if (uch == delimiter) result++; pinput += ch_len; @@ -290,19 +309,18 @@ number_of_columns(const u8* input, u32 delimiter) return result; } -UINT round_div(UINT a, UINT b) +UINT +round_div(UINT a, UINT b) { - return (a + (b/2)) / b; + return (a + (b / 2)) / b; } BOOL within_column(size_t column_start) { - return format - ? (current_rune_column < - column_start + *(format+current_table_column)) - : (current_rune_column < - column_start + format_value); + return format ? (current_rune_column + < column_start + *(format + current_table_column)) + : (current_rune_column < column_start + format_value); } int @@ -331,15 +349,19 @@ main(int argc, char** argv) { arg += strlen("columns="); if (set_columns(arg, &rune_columns)) - return error(EINVAL, "Invalid argument: '%s'", - arg); + return error(EINVAL, + "Invalid argument: " + "'%s'", + arg); } else if (startswith(arg, "delimiter=")) { arg += strlen("delimiter="); if (set_delimiter((u8*)arg, &delimiter)) - return error(EINVAL, "Invalid argument: '%s'", - arg); + return error(EINVAL, + "Invalid argument: " + "'%s'", + arg); } else if (startswith(arg, "expand-tabs")) { @@ -364,16 +386,20 @@ main(int argc, char** argv) else if (startswith(arg, "symbols=")) { arg += strlen("symbols="); - if (set_symbol_set(arg, &current_symbol_set, - &current_inner_symbol_set)) - return error(EINVAL, "Invalid argument: '%s'", - arg); + if (set_symbol_set(arg, + &current_symbol_set, + &current_inner_symbol_set)) + return error(EINVAL, + "Invalid argument: " + "'%s'", + arg); } else if (!strcmp(arg, "help")) return usage(); else { - error(EINVAL, "Invalid argument: --%s", arg); + error(EINVAL, "Invalid argument: --%s", + arg); return usage(); } } @@ -412,7 +438,8 @@ main(int argc, char** argv) cmd = CMD_VERSION; break; default: - error(EINVAL, "Invalid argument: -%c", c); + error(EINVAL, "Invalid argument: -%c", + c); return usage(); } } @@ -422,23 +449,27 @@ main(int argc, char** argv) if (cmd == CMD_COLUMNS) { if (set_columns(arg, &rune_columns)) - return error(EINVAL, "Invalid argument: '%s'", arg); + return error(EINVAL, + "Invalid argument: '%s'", arg); } else if (cmd == CMD_DELIMITER) { if (set_delimiter((u8*)arg, &delimiter)) - return error(EINVAL, "Invalid argument: '%s'", arg); + return error(EINVAL, + "Invalid argument: '%s'", arg); } else if (cmd == CMD_FORMAT) { if (set_format(arg, &format, &format_size)) - return error(EINVAL, "Invalid argument: '%s'", arg); + return error(EINVAL, + "Invalid argument: '%s'", arg); } else if (cmd == CMD_SYMBOLS) { if (set_symbol_set(arg, &current_symbol_set, - &current_inner_symbol_set)) - return error(EINVAL, "Invalid argument: '%s'", arg); + &current_inner_symbol_set)) + return error(EINVAL, + "Invalid argument: '%s'", arg); } else filename = arg; @@ -459,13 +490,13 @@ main(int argc, char** argv) else input = stdin; - u8* line = NULL; - u8* pline = NULL; - BOOL quote = FALSE; + u8* line = NULL; + u8* pline = NULL; + BOOL quote = FALSE; u32 uch; u8 u8ch[7]; - size_t u8len = 0; - size_t ch_len = 0; + size_t u8len = 0; + size_t ch_len = 0; size_t output_lines = 0; size_t column_start = 0; @@ -474,98 +505,110 @@ main(int argc, char** argv) while (!feof(input)) { char* eol = NULL; - if (!fgets((char*)line, BUFSIZE-1, input)) + if (!fgets((char*)line, BUFSIZE - 1, input)) break; eol = strchr((char*)line, '\n'); if (eol) { - if (msdos && *line != '\n' && *(eol-1) == '\r') - *(eol-1) = 0; + if (msdos && *line != '\n' && *(eol - 1) == '\r') + *(eol - 1) = 0; *eol = 0; } if (!*line) continue; - quote = FALSE; - pline = line; - colno = 0; + quote = FALSE; + pline = line; + colno = 0; current_rune_column = 0; /* Top border */ if (lineno == 0) { if (!border_mode) - table_columns = number_of_columns(line, delimiter); + table_columns + = number_of_columns(line, delimiter); else table_columns = 1; /* Sanity check */ - if (rune_columns < table_columns+2) - rune_columns = table_columns+2; + if (rune_columns < table_columns + 2) + rune_columns = table_columns + 2; if (format && !border_mode) { - ULONG* pformat = format; + ULONG* pformat = format; ULONG format_sum = 0; while (*pformat) format_sum += *pformat++; pformat = format; while (*pformat && format_sum) { - *pformat = round_div((rune_columns-table_columns-2) - * (*pformat), format_sum); + *pformat + = round_div((rune_columns + - table_columns + - 2) + * (*pformat), + format_sum); pformat++; } } else - format_value = (rune_columns-table_columns-2) / table_columns; + format_value + = (rune_columns - table_columns - 2) + / table_columns; current_table_column = 0; - column_start = 0; + column_start = 0; while (current_table_column < table_columns) { if (current_rune_column == 0) { - u8len = u32_char_to_u8(u8ch, - *table_symbols[ - current_symbol_set][0]); + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set] + [0]); u8ch[u8len] = 0; printf("%s", u8ch); column_start++; } else if (!within_column(column_start)) { - if (current_table_column == table_columns-1) + if (current_table_column + == table_columns - 1) { - u8len = u32_char_to_u8(u8ch, - *table_symbols[ - current_symbol_set][2]); + u8len = u32_char_to_u8(u8ch, + *table_symbols + [current_symbol_set] + [2]); u8ch[u8len] = 0; printf("%s", u8ch); current_table_column++; } else { - u8len = u32_char_to_u8(u8ch, - *table_inner_symbols[ - current_inner_symbol_set][0]); + u8len = u32_char_to_u8(u8ch, + *table_inner_symbols + [current_inner_symbol_set] + [0]); u8ch[u8len] = 0; printf("%s", u8ch); column_start++; if (format) - column_start += *(format+current_table_column); + column_start += *(format + + current_table_column); else - column_start += format_value; + column_start + += format_value; current_table_column++; } } else { - u8len = u32_char_to_u8(u8ch, - *table_symbols[ - current_symbol_set][1]); + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set] + [1]); u8ch[u8len] = 0; printf("%s", u8ch); } @@ -578,10 +621,10 @@ main(int argc, char** argv) /* Inner rows */ current_table_column = 0; current_rune_column = 0; - column_start = 0; + column_start = 0; - u8len = u32_char_to_u8(u8ch, - *table_symbols[current_symbol_set][3]); + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set][3]); u8ch[u8len] = 0; printf("%s", u8ch); @@ -599,7 +642,7 @@ main(int argc, char** argv) else { u8* pch_end; - u8_char_to_u32(&uch, pline, &ch_len); + u8_char_to_u32(&uch, pline, &ch_len); if (border_mode) { pch_end = pline + ch_len; @@ -627,14 +670,17 @@ main(int argc, char** argv) { printf(" "); current_rune_column++; - if (current_rune_column % tab_length == 0) + if (current_rune_column + % tab_length + == 0) break; } pline++; colno++; } - else if (uch == delimiter && !quote - && current_table_column < table_columns-1) + else if (uch == delimiter && !quote + && current_table_column + < table_columns - 1) { if (handle_ansi && lineno == 0) printf("%s", ANSI_SGR_BOLD_OFF); @@ -646,14 +692,17 @@ main(int argc, char** argv) } column_start++; if (format) - column_start += *(format+current_table_column); + column_start += *(format + + current_table_column); else column_start += format_value; - if (current_table_column != table_columns-1) + if (current_table_column + != table_columns - 1) { - u8len = u32_char_to_u8(u8ch, - *table_inner_symbols[ - current_inner_symbol_set][1]); + u8len = u32_char_to_u8(u8ch, + *table_inner_symbols + [current_inner_symbol_set] + [1]); u8ch[u8len] = 0; printf("%s", u8ch); current_rune_column++; @@ -684,21 +733,22 @@ main(int argc, char** argv) if (handle_ansi && lineno == 0) printf("%s", ANSI_SGR_BOLD_OFF); - while (current_table_column < table_columns-1) + while (current_table_column < table_columns - 1) { while (within_column(column_start)) { printf(" "); current_rune_column++; } - u8len = u32_char_to_u8(u8ch, - *table_inner_symbols[ - current_inner_symbol_set][1]); + u8len = u32_char_to_u8(u8ch, + *table_inner_symbols[current_inner_symbol_set] + [1]); u8ch[u8len] = 0; printf("%s", u8ch); column_start++; if (format) - column_start += *(format+current_table_column); + column_start + += *(format + current_table_column); else column_start += format_value; current_table_column++; @@ -710,8 +760,8 @@ main(int argc, char** argv) current_rune_column++; } - u8len = u32_char_to_u8(u8ch, - *table_symbols[current_symbol_set][5]); + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set][5]); u8ch[u8len] = 0; printf("%s\n", u8ch); @@ -726,40 +776,41 @@ main(int argc, char** argv) if (output_lines) { current_table_column = 0; - current_rune_column = 0; - column_start = 0; + current_rune_column = 0; + column_start = 0; while (current_table_column < table_columns) { if (current_rune_column == 0) { - u8len = u32_char_to_u8(u8ch, - *table_symbols[ - current_symbol_set][6]); + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set][6]); u8ch[u8len] = 0; printf("%s", u8ch); column_start++; } else if (!within_column(column_start)) { - if (current_table_column == table_columns-1) + if (current_table_column == table_columns - 1) { - u8len = u32_char_to_u8(u8ch, - *table_symbols[ - current_symbol_set][8]); + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set] + [8]); u8ch[u8len] = 0; printf("%s", u8ch); current_table_column++; } else { - u8len = u32_char_to_u8(u8ch, - *table_inner_symbols[ - current_inner_symbol_set][2]); + u8len = u32_char_to_u8(u8ch, + *table_inner_symbols + [current_inner_symbol_set] + [2]); u8ch[u8len] = 0; printf("%s", u8ch); column_start++; if (format) - column_start += *(format+current_table_column); + column_start += *(format + + current_table_column); else column_start += format_value; current_table_column++; @@ -767,9 +818,8 @@ main(int argc, char** argv) } else { - u8len = u32_char_to_u8(u8ch, - *table_symbols[ - current_symbol_set][7]); + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set][7]); u8ch[u8len] = 0; printf("%s", u8ch); } diff --git a/utf8.h b/utf8.h @@ -3,31 +3,31 @@ #include <stdint.h> #include <sys/types.h> -#define XMASK1 0x7F /* b01111111 */ -#define XMASK2 0x1F /* b00011111 */ -#define XMASK3 0x0F /* b00001111 */ -#define XMASK4 0x07 /* b00000111 */ -#define XMASK5 0x03 /* b00000011 */ -#define XMASK6 0x01 /* b00000001 */ +#define XMASK1 0x7F /* b01111111 */ +#define XMASK2 0x1F /* b00011111 */ +#define XMASK3 0x0F /* b00001111 */ +#define XMASK4 0x07 /* b00000111 */ +#define XMASK5 0x03 /* b00000011 */ +#define XMASK6 0x01 /* b00000001 */ -#define XMASKR 0x3F /* b00111111 */ +#define XMASKR 0x3F /* b00111111 */ /* #define BOUND1 0x0*/ -#define BOUND2 0x80 -#define BOUND3 0x800 -#define BOUND4 0x10000 -#define BOUND5 0x200000 -#define BOUND6 0x800000 - -#define START1 0x00 /* b0xxxxxxx */ -#define START2 0xC0 /* b110xxxxx */ -#define START3 0xE0 /* b1110xxxx */ -#define START4 0xF0 /* b11110xxx */ -#define START5 0xF8 /* b111110xx */ -#define START6 0xFC /* b1111110x */ - -#define STARTR 0x80 /* b10xxxxxx */ +#define BOUND2 0x80 +#define BOUND3 0x800 +#define BOUND4 0x10000 +#define BOUND5 0x200000 +#define BOUND6 0x800000 + +#define START1 0x00 /* b0xxxxxxx */ +#define START2 0xC0 /* b110xxxxx */ +#define START3 0xE0 /* b1110xxxx */ +#define START4 0xF0 /* b11110xxx */ +#define START5 0xF8 /* b111110xx */ +#define START6 0xFC /* b1111110x */ + +#define STARTR 0x80 /* b10xxxxxx */ typedef uint8_t u8; typedef uint32_t u32;