чување 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:
| M | TODO | | | 4 | +--- |
| M | table.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,
- ¤t_symbol_set,
- ¤t_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, ¤t_symbol_set,
¤t_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, ¤t_symbol_set,
+ ¤t_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;
}
-