aboutsummaryrefslogtreecommitdiff
path: root/toys
diff options
context:
space:
mode:
Diffstat (limited to 'toys')
-rw-r--r--toys/posix/sort.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/toys/posix/sort.c b/toys/posix/sort.c
index 9d2f2276..4b3fe24d 100644
--- a/toys/posix/sort.c
+++ b/toys/posix/sort.c
@@ -63,6 +63,7 @@ GLOBALS(
void *key_list;
int linecount;
char **lines;
+ char *name;
)
// The sort types are n, g, and M.
@@ -275,31 +276,37 @@ static int compare_keys(const void *xarg, const void *yarg)
return retval * ((flags&FLAG_r) ? -1 : 1);
}
-// Callback from loopfiles to handle input files.
-static void sort_read(int fd, char *name)
+// Read each line from file, appending to a big array.
+static void sort_lines(char **pline, long len)
{
- // Read each line from file, appending to a big array.
-
- for (;;) {
- char * line = FLAG(z) ? get_rawline(fd, NULL, 0) : get_line(fd);
+ char * line;
- if (!line) break;
+ if (!pline) return;
+ line = *pline;
+ if (!FLAG(z) && len && line[len-1]=='\n') line[--len] = 0;
+ *pline = NULL;
- // handle -c here so we don't allocate more memory than necessary.
- if (FLAG(c)) {
- int j = FLAG(u) ? -1 : 0;
+ // handle -c here so we don't allocate more memory than necessary.
+ if (FLAG(c)) {
+ int j = FLAG(u) ? -1 : 0;
- if (TT.lines && compare_keys((void *)&TT.lines, &line)>j)
- error_exit("%s: Check line %d\n", name, TT.linecount);
- free(TT.lines);
- TT.lines = (char **)line;
- } else {
- if (!(TT.linecount&63))
- TT.lines = xrealloc(TT.lines, sizeof(char *)*(TT.linecount+64));
- TT.lines[TT.linecount] = line;
- }
- TT.linecount++;
+ if (TT.lines && compare_keys((void *)&TT.lines, &line)>j)
+ error_exit("%s: Check line %d\n", TT.name, TT.linecount);
+ free(TT.lines);
+ TT.lines = (char **)line;
+ } else {
+ if (!(TT.linecount&63))
+ TT.lines = xrealloc(TT.lines, sizeof(char *)*(TT.linecount+64));
+ TT.lines[TT.linecount] = line;
}
+ TT.linecount++;
+}
+
+// Callback from loopfiles to handle input files.
+static void sort_read(int fd, char *name)
+{
+ TT.name = name;
+ do_lines(fd, FLAG(z) ? '\0' : '\n', sort_lines);
}
void sort_main(void)