static int input(FILE *fp, int *maxlength, wchar_t ***list, int *entries);
static void c_columnate(int maxlength, long termwidth, wchar_t **list, int entries);
static void r_columnate(int maxlength, long termwidth, wchar_t **list, int entries);
-static void maketbl(wchar_t **list, int entries, wchar_t *separator);
+static wchar_t *local_wcstok(wchar_t *p, const wchar_t *separator, int greedy, wchar_t **wcstok_state);
+static void maketbl(wchar_t **list, int entries, wchar_t *separator, int greedy);
static void print(wchar_t **list, int entries);
typedef struct _tbl {
unsigned int eval = 0; /* exit value */
int maxlength = 0; /* longest record */
wchar_t **list = NULL; /* array of pointers to records */
+ int greedy = 1;
/* field separator for table option */
wchar_t default_separator[] = { '\t', ' ', 0 };
break;
case 's':
separator = mbs_to_wcs(optarg);
+ greedy = 0;
break;
case 't':
tflag = 1;
exit(eval);
if (tflag)
- maketbl(list, entries, separator);
+ maketbl(list, entries, separator, greedy);
else if (maxlength >= termwidth)
print(list, entries);
else if (xflag)
}
}
-static void maketbl(wchar_t **list, int entries, wchar_t *separator)
+wchar_t *local_wcstok(wchar_t * p, const wchar_t * separator, int greedy,
+ wchar_t ** wcstok_state)
+{
+ wchar_t *result;
+ if (greedy)
+ return wcstok(p, separator, wcstok_state);
+
+ if (p == NULL) {
+ if (*wcstok_state == NULL)
+ return NULL;
+ else
+ p = *wcstok_state;
+ }
+ result = p;
+ p = wcspbrk(result, separator);
+ if (p == NULL)
+ *wcstok_state = NULL;
+ else {
+ *p = '\0';
+ *wcstok_state = p + 1;
+ }
+ return result;
+}
+
+static void maketbl(wchar_t **list, int entries, wchar_t *separator, int greedy)
{
TBL *t;
int cnt, i;
ssize_t maxcols = DEFCOLS, coloff;
TBL *tbl;
wchar_t **cols;
- wchar_t *wcstok_state;
+ wchar_t *wcstok_state = NULL;
t = tbl = xcalloc(entries, sizeof(TBL));
cols = xcalloc(maxcols, sizeof(wchar_t *));
for (lp = list, cnt = 0; cnt < entries; ++cnt, ++lp, ++t) {
coloff = 0;
p = *lp;
- while ((cols[coloff] = wcstok(p, separator, &wcstok_state)) != NULL) {
+ while ((cols[coloff] = local_wcstok(p, separator, greedy, &wcstok_state)) != NULL) {
if (++coloff == maxcols) {
maxcols += DEFCOLS;
cols = xrealloc(cols, maxcols * sizeof(wchar_t *));