Some inline comments below: +/* See LICENSE file for copyright and license details. */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h>
Sort these. +static int tflag = 0; +static int aflag = 0; +static int eflag = 0; +/*static int oflag = 0;*/ +static int oneflag = 0; +static int twoflag = 0; oflag is unused? +static char *estr = ""; +static char *empty_str = ""; +static int join_index1 = 1; +static int join_index2 = 1; +static int delim = ' '; +static int (*is_delim)(int); +static int afile; +static int print_unjoinable1 = 0; +static int print_unjoinable2 = 0; I'd prefer shorter names without underscores. +struct line_list_t { + int cur_lines; + int capacity; + struct line_t *lines; + struct line_t *next; +}; Use queue.h, do not roll your own lists. Do not add a _t suffix to the struct name. You can use a typedef here as explained in the coding conventions[0]. Use less verbose names, like "cap" or "cur". +struct line_t { + char *fields; + char *join_field; + int num_fields; + size_t len; + size_t buf_size; + int f_idx; + int iter_capacity; + char **iter_fields; + struct line_t *link; +}; Ditto. +static void +free_line_list(struct line_list_t *list) +{ + struct line_t *tofree = 0; + struct line_t *line = list->lines; + + if (list->next && list->next != list->lines) { + free(list->next->fields); + free(list->next); + } + + while (line) { + tofree = line; + line = line->link; + free(tofree->fields); + free(tofree->iter_fields); + free(tofree); + } +} Remove this function, we can rely on the OS to do this. This is only called at the end once so it doesn't really save us anything. +void +resize_iter(struct line_t *line) { "{" should be on the next line on its own. + size_t new_size; + + line->iter_capacity = line->iter_capacity * 2; + new_size = line->iter_capacity * sizeof(*line->iter_fields); + line->iter_fields = realloc(line->iter_fields, new_size); + if (!line->iter_fields) + enprintf(2, "malloc: "); +} Use libutil/ as much as possible. Do not use realloc, use erealloc. The error message is wrong too. +struct line_t * +create_line(void) +{ + struct line_t *new = calloc(1, sizeof(struct line_t)); + if (!new) + enprintf(2, "malloc: "); + new->iter_capacity = 10; + new->iter_fields = calloc(10, sizeof(*new->iter_fields)); + if (!new->iter_fields) + enprintf(2, "malloc: "); + return new; +} Ditto. +static int +get_line(FILE *fp, struct line_t *line, int ji) +{ + line->len = getline(&line->fields, &line->buf_size, fp); + if (-1 == line->len) Never use this style. I understand the reasoning but it is extremely non-idiomatic. The correct condition is: if (line->len == -1) I think you should also have a look at libutf/. We want the tools in sbase to be UTF-8 aware. [0] http://suckless.org/style Cheers, Dimitris