# Kris Kennaway: > On Wed, Jan 26, 2005 at 09:10:47AM +1100, Tim Robbins wrote: > > > > I was planning on going through all text-processing utilities in the base > > system some time and either fixing line length problems or documenting them, > > similar to what I did with multibyte character support. I may make a start > > at that today. > > If someone could fix comm(1) that would be a big help for me, because > I have a local hack I have to carry around in all of my local package > source trees. Does this patch help? I haven't made any contributions before, so I just hope I'm not making a fool of myself with this... HTH, Mario Index: comm.c =================================================================== RCS file: /home/ncvs/src/usr.bin/comm/comm.c,v retrieving revision 1.21 diff -u -r1.21 comm.c --- comm.c 2 Jul 2004 22:48:29 -0000 1.21 +++ comm.c 29 Jan 2005 01:30:13 -0000 _at__at_ -66,6 +66,8 _at__at_ FILE *file(const char *); void show(FILE *, const char *, const wchar_t *, wchar_t *); int wcsicoll(const wchar_t *, const wchar_t *); +wchar_t *fgetwla(FILE *); + static void usage(void); int _at__at_ -75,7 +77,7 _at__at_ int ch, flag1, flag2, flag3, iflag; FILE *fp1, *fp2; const wchar_t *col1, *col2, *col3; - wchar_t line1[MAXLINELEN], line2[MAXLINELEN]; + wchar_t *line1, *line2; const wchar_t **p; flag1 = flag2 = flag3 = 1; _at__at_ -123,12 +125,14 _at__at_ for (read1 = read2 = 1;;) { /* read next line, check for EOF */ if (read1) { - file1done = !fgetws(line1, MAXLINELEN, fp1); + line1 = fgetwla(fp1); + file1done = (line1 == NULL); if (file1done && ferror(fp1)) err(1, "%s", argv[0]); } if (read2) { - file2done = !fgetws(line2, MAXLINELEN, fp2); + line2 = fgetwla(fp2); + file2done = (line2 == NULL); if (file2done && ferror(fp2)) err(1, "%s", argv[1]); } _at__at_ -170,6 +174,10 _at__at_ if (col2) (void)printf("%ls%ls", col2, line2); } + if (read1) + free(line1); + if (read2) + free(line2); } exit(0); } _at__at_ -177,10 +185,15 _at__at_ void show(FILE *fp, const char *fn, const wchar_t *offset, wchar_t *buf) { + wchar_t *line; + + line = buf; do { - (void)printf("%ls%ls", offset, buf); - } while (fgetws(buf, MAXLINELEN, fp)); + (void)printf("%ls%ls", offset, line); + free(line); + line = fgetwla(fp); + } while (line != NULL); if (ferror(fp)) err(1, "%s", fn); } _at__at_ -208,7 +221,13 _at__at_ int wcsicoll(const wchar_t *s1, const wchar_t *s2) { - wchar_t *p, line1[MAXLINELEN], line2[MAXLINELEN]; + wchar_t *p, *line1, *line2; + int comp; + + if( (line1 = malloc(wcslen(s1) + 1)) == NULL) + err(1, "%s", __func__); + if( (line2 = malloc(wcslen(s2) + 1)) == NULL) + err(1, "%s", __func__); for (p = line1; *s1; s1++) *p++ = towlower(*s1); _at__at_ -216,5 +235,28 _at__at_ for (p = line2; *s2; s2++) *p++ = towlower(*s2); *p = '\0'; - return (wcscoll(line1, line2)); + + comp = wcscoll(line1, line2); + free(line1); + free(line2); + + return comp; +} + +wchar_t * +fgetwla(FILE *fp) +{ + wchar_t *line, *wtmp; + size_t len; + + if ( (wtmp=fgetwln(fp, &len)) == NULL) + return NULL; + + if ( (line=malloc((len + 1) * sizeof(wchar_t))) == NULL) + err(1, "%s", __func__); + + wcsncpy(line, wtmp, len); + line[len] = L'\0'; + + return line; } --Received on Sat Jan 29 2005 - 01:08:50 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:27 UTC