sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit f9a1e1166138aa4a8b9e872a1c2a9c5ed81c4543
parent 572cea058c59f577634969479e2206f4087d0089
Author: FRIGN <dev@frign.de>
Date:   Sun, 18 Jan 2015 00:07:29 +0100

Add mandoc-manpage for comm(1) and clean up code

and mark it as finished in README.

Diffstat:
MREADME | 2+-
Mcomm.1 | 74++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mcomm.c | 78+++++++++++++++++++++++++++++++++++++-----------------------------------------
3 files changed, 80 insertions(+), 74 deletions(-)

diff --git a/README b/README @@ -18,7 +18,7 @@ The following tools are implemented (* == finished): * cksum yes none * cmp yes none * cols non-posix none - comm yes none +* comm yes none cp no -H, -i, -L * cron non-posix none cut yes none diff --git a/comm.1 b/comm.1 @@ -1,33 +1,43 @@ -.TH COMM 1 sbase\-VERSION -.SH NAME -comm \- select or reject lines common to two files -.SH SYNOPSIS -.B comm -.RB [ \-123 ] -.IR file1 -.IR file2 -.SH DESCRIPTION -The comm utility reads -.IR file1 +.Dd January 18, 2015 +.Dt COMM 1 sbase\-VERSION +.Sh NAME +.Nm comm +.Nd select or reject lines common to two files +.Sh SYNOPSIS +.Nm comm +.Op Fl 123 +.Ar file1 +.Ar file2 +.Sh DESCRIPTION +.Nm +reads +.Ar file1 and -.IR file2, -which should be sorted lexically, -and produces three text columns as output: lines only in -.IR file1; -lines only in -.IR file2; -and lines in both files. -.SH OPTIONS -.TP -.BI \-1 -Suppress printing of column 1 -.TP -.BI \-2 -Suppress printing of column 2 -.TP -.BI \-3 -Suppress printing of column 3 -.SH SEE ALSO -.IR cmp (1), -.IR sort (1), -.IR uniq (1) +.Ar file2, +which should both be sorted lexically, and writes three text columns +to stdout: +.Bl -tag -width Ds +.It 1 +Lines only in +.Ar file1 . +.It 2 +Lines only in +.Ar file2 . +.It 3 +Common lines. +.El +.Sh OPTIONS +.Bl -tag -width Ds +.It Fl 1 | Fl 2 | Fl 3 +Suppress column 1 | 2 | 3 +.El +.Sh SEE ALSO +.Xr cmp 1 , +.Xr sort 1 , +.Xr uniq 1 +.Sh STANDARDS +The +.Nm +utility is compliant with the +.St -p1003.1-2008 +specification. diff --git a/comm.c b/comm.c @@ -8,13 +8,45 @@ #define CLAMP(x, l, h) MIN(h, MAX(l, x)) -static void printline(int, char *); -static char *nextline(char *, int, FILE *, char *); -static void finish(int, FILE *, char *); - static int show = 0x07; static void +printline(int pos, char *line) +{ + int i; + + if (!(show & (0x1 << pos))) + return; + + for (i = 0; i < pos; i++) { + if (show & (0x1 << i)) + putchar('\t'); + } + printf("%s", line); +} + +static char * +nextline(char *buf, int n, FILE *f, char *name) +{ + buf = fgets(buf, n, f); + if (!buf && !feof(f)) + eprintf("%s: read error:", name); + if (buf && !strchr(buf, '\n')) + eprintf("%s: line too long\n", name); + return buf; +} + +static void +finish(int pos, FILE *f, char *name) +{ + char buf[LINE_MAX + 1]; + + while (nextline(buf, sizeof(buf), f, name)) + printline(pos, buf); + exit(1); +} + +static void usage(void) { eprintf("usage: %s [-123] file1 file2\n", argv0); @@ -25,7 +57,7 @@ main(int argc, char *argv[]) { int i, diff = 0; FILE *fp[2]; - char lines[2][LINE_MAX+1]; + char lines[2][LINE_MAX + 1]; ARGBEGIN { case '1': @@ -73,39 +105,3 @@ main(int argc, char *argv[]) return 0; } - -static void -printline(int pos, char *line) -{ - int i; - - if (!(show & (0x1 << pos))) - return; - - for (i = 0; i < pos; i++) { - if (show & (0x1 << i)) - putchar('\t'); - } - printf("%s", line); -} - -static char * -nextline(char *buf, int n, FILE *f, char *name) -{ - buf = fgets(buf, n, f); - if (!buf && !feof(f)) - eprintf("%s: read error:", name); - if (buf && !strchr(buf, '\n')) - eprintf("%s: line too long\n", name); - return buf; -} - -static void -finish(int pos, FILE *f, char *name) -{ - char buf[LINE_MAX+1]; - - while (nextline(buf, sizeof(buf), f, name)) - printline(pos, buf); - exit(1); -}