table

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

чување 4abd1f93412aad602b67650f30c848e0ef24cae7
родитељ 19703585ff488790eae39b0713d98f566014b338
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sat, 18 Sep 2021 23:26:58 +0200

Convert while to goto in main to ease indenting

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

Diffstat:
MTODO | 4+---
Mtable.c | 689+++++++++++++++++++++++++++++++++++++++----------------------------------------
измењених датотека: 2, додавања: 342(+), брисања: 351(-)

diff --git a/TODO b/TODO @@ -1,9 +1,7 @@ TODO ==== - [x] Move away from libunistring - - [ ] Convert while to goto in main to ease indenting + [x] Convert while to goto in main to ease indenting Legend diff --git a/table.c b/table.c @@ -330,153 +330,154 @@ main(int argc, char** argv) Command cmd = CMD_NONE; char* filename = NULL; - while ((arg = *++argv)) +do_arg: + arg = *++argv; + if (!arg) + goto done_arg; + + if (*arg == '-') { - if (*arg == '-') + arg++; + char c = *arg++; + if (c == '-') { - arg++; - char c = *arg++; - if (c == '-') + if (!strcmp(arg, "version")) + cmd = CMD_VERSION; + else if (startswith(arg, "border-mode")) { - if (!strcmp(arg, "version")) - cmd = CMD_VERSION; - else if (startswith(arg, "border-mode")) - { - arg += strlen("border-mode"); - border_mode = TRUE; - } - else if (startswith(arg, "columns=")) - { - arg += strlen("columns="); - if (set_columns(arg, &rune_columns)) - 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); - } - else if (startswith(arg, "expand-tabs")) - { - arg += strlen("expand-tabs"); - expand_tabs = TRUE; - } - else if (startswith(arg, "format=")) - { - arg += strlen("format="); - set_format(arg, &format, &format_size); - } - else if (startswith(arg, "msdos")) - { - arg += strlen("msdos"); - msdos = TRUE; - } - else if (startswith(arg, "no-ansi")) - { - arg += strlen("no-ansi"); - handle_ansi = FALSE; - } - 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); - } - else if (!strcmp(arg, "help")) - return usage(); - else - { - error(EINVAL, "Invalid argument: --%s", - arg); - return usage(); - } - } - else - { - switch (c) - { - case 'b': - border_mode = TRUE; - break; - case 'c': - cmd = CMD_COLUMNS; - break; - case 'd': - cmd = CMD_DELIMITER; - break; - case 'f': - cmd = CMD_FORMAT; - break; - case 'h': - return usage(); - break; - case 'm': - msdos = TRUE; - break; - case 'n': - handle_ansi = FALSE; - break; - case 's': - cmd = CMD_SYMBOLS; - break; - case 't': - expand_tabs = TRUE; - break; - case 'v': - cmd = CMD_VERSION; - break; - default: - error(EINVAL, "Invalid argument: -%c", - c); - return usage(); - } + arg += strlen("border-mode"); + border_mode = TRUE; } - } - else - { - if (cmd == CMD_COLUMNS) + else if (startswith(arg, "columns=")) { + arg += strlen("columns="); if (set_columns(arg, &rune_columns)) return error(EINVAL, - "Invalid argument: '%s'", arg); + "Invalid argument: " + "'%s'", + arg); } - else if (cmd == CMD_DELIMITER) + else if (startswith(arg, "delimiter=")) { + arg += strlen("delimiter="); if (set_delimiter((u8*)arg, &delimiter)) return error(EINVAL, - "Invalid argument: '%s'", arg); + "Invalid argument: " + "'%s'", + arg); } - else if (cmd == CMD_FORMAT) + else if (startswith(arg, "expand-tabs")) { - if (set_format(arg, &format, &format_size)) - return error(EINVAL, - "Invalid argument: '%s'", arg); + arg += strlen("expand-tabs"); + expand_tabs = TRUE; + } + else if (startswith(arg, "format=")) + { + arg += strlen("format="); + set_format(arg, &format, &format_size); + } + else if (startswith(arg, "msdos")) + { + arg += strlen("msdos"); + msdos = TRUE; + } + else if (startswith(arg, "no-ansi")) + { + arg += strlen("no-ansi"); + handle_ansi = FALSE; } - else if (cmd == CMD_SYMBOLS) + 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); + "Invalid argument: " + "'%s'", + arg); } + else if (!strcmp(arg, "help")) + return usage(); else - filename = arg; - cmd = CMD_NONE; + { + error(EINVAL, "Invalid argument: --%s", arg); + return usage(); + } + } + else + { + switch (c) + { + case 'b': + border_mode = TRUE; + break; + case 'c': + cmd = CMD_COLUMNS; + break; + case 'd': + cmd = CMD_DELIMITER; + break; + case 'f': + cmd = CMD_FORMAT; + break; + case 'h': + return usage(); + break; + case 'm': + msdos = TRUE; + break; + case 'n': + handle_ansi = FALSE; + break; + case 's': + cmd = CMD_SYMBOLS; + break; + case 't': + expand_tabs = TRUE; + break; + case 'v': + cmd = CMD_VERSION; + break; + default: + error(EINVAL, "Invalid argument: -%c", c); + return usage(); + } + } + } + else + { + if (cmd == CMD_COLUMNS) + { + if (set_columns(arg, &rune_columns)) + 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); + } + else if (cmd == CMD_FORMAT) + { + if (set_format(arg, &format, &format_size)) + 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); + } + else + filename = arg; + cmd = CMD_NONE; } + goto do_arg; +done_arg: if (cmd == CMD_VERSION) return version(); @@ -502,273 +503,266 @@ main(int argc, char** argv) CALLOC(line, u8, BUFSIZE); - while (!feof(input)) +do_input: + if (feof(input)) + goto done_input; + + char* eol = NULL; + if (!fgets((char*)line, BUFSIZE - 1, input)) + goto done_input; + + eol = strchr((char*)line, '\n'); + if (eol) { - char* eol = NULL; - if (!fgets((char*)line, BUFSIZE - 1, input)) - break; + if (msdos && *line != '\n' && *(eol - 1) == '\r') + *(eol - 1) = 0; + *eol = 0; + } + + if (!*line) + goto do_input; - eol = strchr((char*)line, '\n'); - if (eol) + quote = FALSE; + pline = line; + colno = 0; + current_rune_column = 0; + + /* Top border */ + if (lineno != 0) + goto not_first; + + if (!border_mode) + 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 (format && !border_mode) + { + ULONG* pformat = format; + ULONG format_sum = 0; + while (*pformat) + format_sum += *pformat++; + pformat = format; + while (*pformat && format_sum) { - if (msdos && *line != '\n' && *(eol - 1) == '\r') - *(eol - 1) = 0; - *eol = 0; + *pformat = round_div((rune_columns - table_columns - 2) + * (*pformat), + format_sum); + pformat++; } + } + else + format_value + = (rune_columns - table_columns - 2) / table_columns; - if (!*line) - continue; + current_table_column = 0; + column_start = 0; - quote = FALSE; - pline = line; - colno = 0; - current_rune_column = 0; +do_column: + if (current_table_column >= table_columns) + goto done_columns; - /* Top border */ - if (lineno == 0) + if (current_rune_column == 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) + { + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set][2]); + u8ch[u8len] = 0; + printf("%s", u8ch); + current_table_column++; + } + else { - if (!border_mode) - table_columns - = number_of_columns(line, delimiter); + 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); else - table_columns = 1; + column_start += format_value; + current_table_column++; + } + } + else + { + u8len = u32_char_to_u8(u8ch, + *table_symbols[current_symbol_set][1]); + u8ch[u8len] = 0; + printf("%s", u8ch); + } + current_rune_column++; + goto do_column; - /* Sanity check */ - if (rune_columns < table_columns + 2) - rune_columns = table_columns + 2; +done_columns: + printf("\n"); + output_lines++; - if (format && !border_mode) - { - 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++; - } - } - else - format_value - = (rune_columns - table_columns - 2) - / table_columns; +not_first: + /* Inner rows */ + current_table_column = 0; + current_rune_column = 0; + column_start = 0; + + u8len = u32_char_to_u8(u8ch, *table_symbols[current_symbol_set][3]); + u8ch[u8len] = 0; + printf("%s", u8ch); + + if (handle_ansi && lineno == 0) + printf("%s", ANSI_SGR_BOLD_ON); + +do_line: + if (!pline || !*pline) + goto done_line; - current_table_column = 0; - column_start = 0; - while (current_table_column < table_columns) + if (*pline == '"') + { + quote = !quote; + pline++; + colno++; + } + else + { + u8* pch_end; + u8_char_to_u32(&uch, pline, &ch_len); + if (border_mode) + { + pch_end = pline + ch_len; + if (within_column(column_start)) { - if (current_rune_column == 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) - { - 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]); - u8ch[u8len] = 0; - printf("%s", u8ch); - column_start++; - if (format) - column_start += *(format - + current_table_column); - else - column_start - += format_value; - current_table_column++; - } - } - else - { - u8len = u32_char_to_u8(u8ch, - *table_symbols[current_symbol_set] - [1]); - u8ch[u8len] = 0; - printf("%s", u8ch); - } + while (pline != pch_end) + printf("%c", *pline++); current_rune_column++; } - printf("\n"); - output_lines++; + pline = pch_end; + colno += ch_len; } - - /* Inner rows */ - current_table_column = 0; - current_rune_column = 0; - column_start = 0; - - u8len = u32_char_to_u8(u8ch, - *table_symbols[current_symbol_set][3]); - u8ch[u8len] = 0; - printf("%s", u8ch); - - if (handle_ansi && lineno == 0) - printf("%s", ANSI_SGR_BOLD_ON); - - while (pline && *pline) + else if (ch_len <= 0) { - if (*pline == '"') + if (within_column(column_start)) { - quote = !quote; - pline++; - colno++; + printf("%c", *pline++); + current_rune_column++; } - else + colno++; + } + else if (uch == (u32)L'\t' && expand_tabs) + { + while (within_column(column_start)) { - u8* pch_end; - u8_char_to_u32(&uch, pline, &ch_len); - if (border_mode) - { - pch_end = pline + ch_len; - if (within_column(column_start)) - { - while (pline != pch_end) - printf("%c", *pline++); - current_rune_column++; - } - pline = pch_end; - colno += ch_len; - } - else if (ch_len <= 0) - { - if (within_column(column_start)) - { - printf("%c", *pline++); - current_rune_column++; - } - colno++; - } - else if (uch == (u32)L'\t' && expand_tabs) - { - while (within_column(column_start)) - { - printf(" "); - current_rune_column++; - if (current_rune_column - % tab_length - == 0) - break; - } - pline++; - colno++; - } - else if (uch == delimiter && !quote - && current_table_column - < table_columns - 1) - { - if (handle_ansi && lineno == 0) - printf("%s", ANSI_SGR_BOLD_OFF); - - while (within_column(column_start)) - { - printf(" "); - current_rune_column++; - } - column_start++; - if (format) - column_start += *(format - + current_table_column); - else - column_start += format_value; - if (current_table_column - != table_columns - 1) - { - u8len = u32_char_to_u8(u8ch, - *table_inner_symbols - [current_inner_symbol_set] - [1]); - u8ch[u8len] = 0; - printf("%s", u8ch); - current_rune_column++; - current_table_column++; - } - - if (handle_ansi && lineno == 0) - printf("%s", ANSI_SGR_BOLD_ON); - - pline += ch_len; - colno += ch_len; - } - else - { - pch_end = pline + ch_len; - if (within_column(column_start)) - { - while (pline != pch_end) - printf("%c", *pline++); - current_rune_column++; - } - pline = pch_end; - colno += ch_len; - } + printf(" "); + current_rune_column++; + if (current_rune_column % tab_length == 0) + break; } + pline++; + colno++; } - - if (handle_ansi && lineno == 0) - printf("%s", ANSI_SGR_BOLD_OFF); - - while (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); + while (within_column(column_start)) { printf(" "); current_rune_column++; } - 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); else column_start += format_value; - current_table_column++; - current_rune_column++; + if (current_table_column != table_columns - 1) + { + u8len = u32_char_to_u8(u8ch, + *table_inner_symbols + [current_inner_symbol_set][1]); + u8ch[u8len] = 0; + printf("%s", u8ch); + current_rune_column++; + current_table_column++; + } + + if (handle_ansi && lineno == 0) + printf("%s", ANSI_SGR_BOLD_ON); + + pline += ch_len; + colno += ch_len; } + else + { + pch_end = pline + ch_len; + if (within_column(column_start)) + { + while (pline != pch_end) + printf("%c", *pline++); + current_rune_column++; + } + pline = pch_end; + colno += ch_len; + } + } + goto do_line; + +done_line:; + + if (handle_ansi && lineno == 0) + printf("%s", ANSI_SGR_BOLD_OFF); + + while (current_table_column < table_columns - 1) + { while (within_column(column_start)) { printf(" "); current_rune_column++; } - u8len = u32_char_to_u8(u8ch, - *table_symbols[current_symbol_set][5]); + *table_inner_symbols[current_inner_symbol_set][1]); u8ch[u8len] = 0; - printf("%s\n", u8ch); - - output_lines++; - lineno++; + printf("%s", u8ch); + column_start++; + if (format) + column_start += *(format + current_table_column); + else + column_start += format_value; + current_table_column++; + current_rune_column++; } + while (within_column(column_start)) + { + printf(" "); + current_rune_column++; + } + + u8len = u32_char_to_u8(u8ch, *table_symbols[current_symbol_set][5]); + u8ch[u8len] = 0; + printf("%s\n", u8ch); + output_lines++; + lineno++; + + goto do_input; + +done_input: fclose(input); free(line); @@ -834,4 +828,3 @@ main(int argc, char** argv) return 0; } -