extern int tt_line_set_data(struct tt_line *ln, int colnum, const char *data);
extern int tt_line_set_userdata(struct tt_line *ln, void *data);
-extern int tt_parse_columns_list(const char *list, int cols[], int *ncols,
+extern int tt_parse_columns_list(const char *list, int ary[], size_t arrsz,
int (name2id)(const char *, size_t));
#endif /* UTIL_LINUX_TT_H */
return 0;
}
-int tt_parse_columns_list(const char *list, int cols[], int *ncols,
+/* Returns: >= 0 : number of items added to ary[]
+ * -1 : parse error or unknown item
+ * -2 : arysz reached
+ */
+int tt_parse_columns_list(const char *list, int ary[], size_t arysz,
int (name2id)(const char *, size_t))
{
const char *begin = NULL, *p;
+ int n = 0;
- if (!list || !*list || !cols || !ncols || !name2id)
+ if (!list || !*list || !ary || !arysz || !name2id)
return -1;
- *ncols = 0;
-
for (p = list; p && *p; p++) {
const char *end = NULL;
int id;
id = name2id(begin, end - begin);
if (id == -1)
return -1;
- cols[ *ncols ] = id;
- (*ncols)++;
+ ary[ n++ ] = id;
+ if (n >= arysz)
+ return -2;
begin = NULL;
if (end && !*end)
break;
}
- return 0;
+ return n;
}
#ifdef TEST_PROGRAM
disable_columns_truncate();
break;
case 'o':
- if (tt_parse_columns_list(optarg, columns, &ncolumns,
- column_name_to_id))
+ ncolumns = tt_parse_columns_list(
+ optarg,
+ columns, ARRAY_SIZE(columns),
+ column_name_to_id);
+ if (ncolumns < 0)
exit(EXIT_FAILURE);
break;
case 'O':
set_match(COL_OPTIONS, optarg);
break;
case 'p':
- if (optarg &&
- tt_parse_columns_list(optarg, actions, &nactions,
- poll_action_name_to_id))
- exit(EXIT_FAILURE);
-
+ if (optarg) {
+ nactions = tt_parse_columns_list(
+ optarg,
+ actions, ARRAY_SIZE(actions),
+ poll_action_name_to_id);
+ if (nactions < 0)
+ exit(EXIT_FAILURE);
+ }
flags |= FL_POLL;
tt_flags &= ~TT_FL_TREE;
break;
tt_flags |= TT_FL_NOHEADINGS;
break;
case 'o':
- if (tt_parse_columns_list(optarg, columns, &ncolumns,
- column_name_to_id))
+ ncolumns = tt_parse_columns_list(
+ optarg,
+ columns, ARRAY_SIZE(columns),
+ column_name_to_id);
+ if (ncolumns < 0)
return EXIT_FAILURE;
break;
case 'P':
errx(EXIT_FAILURE, _("failed to parse --nr <M-N> range"));
break;
case 'o':
- if (tt_parse_columns_list(optarg, columns, &ncolumns,
- column_name_to_id))
+ ncolumns = tt_parse_columns_list(
+ optarg,
+ columns, ARRAY_SIZE(columns),
+ column_name_to_id);
+ if (ncolumns < 0)
return EXIT_FAILURE;
break;
case 'P':