diff options
| author | jtc <jtc@NetBSD.org> | 1994-12-22 06:17:28 +0000 |
|---|---|---|
| committer | jtc <jtc@NetBSD.org> | 1994-12-22 06:17:28 +0000 |
| commit | 7f8ee3fcb6f9098a04e1d2ca15a8dcacd0797c27 (patch) | |
| tree | 5152d2be3ae2a12134f0e982d4ab9f30dfd36a61 /usr.bin/locate/code/locate.code.c | |
| parent | 33cf3304f6537f7fccc48c79a0b64018d3318c2e (diff) | |
Merged with 4.4lite.
Changed to conform to NetBSD's new RCS Id convention.
Diffstat (limited to 'usr.bin/locate/code/locate.code.c')
| -rw-r--r-- | usr.bin/locate/code/locate.code.c | 169 |
1 files changed, 110 insertions, 59 deletions
diff --git a/usr.bin/locate/code/locate.code.c b/usr.bin/locate/code/locate.code.c index 1f56cfb1c5f..03b3e025c3f 100644 --- a/usr.bin/locate/code/locate.code.c +++ b/usr.bin/locate/code/locate.code.c @@ -1,6 +1,8 @@ +/* $NetBSD: locate.code.c,v 1.3 1994/12/22 06:17:43 jtc Exp $ */ + /* - * Copyright (c) 1989 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * James A. Woods. @@ -35,14 +37,16 @@ */ #ifndef lint -char copyright[] = -"@(#) Copyright (c) 1989 The Regents of the University of California.\n\ - All rights reserved.\n"; +static char copyright[] = +"@(#) Copyright (c) 1989, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -/*static char sccsid[] = "from: @(#)locate.code.c 4.8 (Berkeley) 6/1/90";*/ -static char rcsid[] = "$Id: locate.code.c,v 1.2 1993/08/01 18:13:52 mycroft Exp $"; +#if 0 +static char sccsid[] = "@(#)locate.code.c 8.1 (Berkeley) 6/6/93"; +#endif +static char rcsid[] = "$NetBSD: locate.code.c,v 1.3 1994/12/22 06:17:43 jtc Exp $"; #endif /* not lint */ /* @@ -54,7 +58,7 @@ static char rcsid[] = "$Id: locate.code.c,v 1.2 1993/08/01 18:13:52 mycroft Exp * code common_bigrams < list > squozen_list * * METHOD: Uses 'front compression' (see ";login:", Volume 8, Number 1 - * February/March 1983, p. 8 ). Output format is, per line, an + * February/March 1983, p. 8). Output format is, per line, an * offset differential count byte followed by a partially bigram- * encoded ascii residue. A bigram is a two-character sequence, * the first 128 most common of which are encoded in one byte. @@ -67,100 +71,147 @@ static char rcsid[] = "$Id: locate.code.c,v 1.2 1993/08/01 18:13:52 mycroft Exp * /usr/src/cmd/armadillo.c 14 armadillo.c * /usr/tmp/zoo 5 tmp/zoo * - * The codes are: + * The codes are: * - * 0-28 likeliest differential counts + offset to make nonnegative + * 0-28 likeliest differential counts + offset to make nonnegative * 30 switch code for out-of-range count to follow in next word * 128-255 bigram codes (128 most common, as determined by 'updatedb') * 32-127 single character (printable) ascii residue (ie, literal) * - * SEE ALSO: updatedb.csh, bigram.c, find.c - * + * SEE ALSO: updatedb.csh, bigram.c + * * AUTHOR: James A. Woods, Informatics General Corp., * NASA Ames Research Center, 10/82 */ #include <sys/param.h> +#include <err.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> #include <stdio.h> #include "locate.h" -#define BGBUFSIZE (NBG * 2) /* size of bigram buffer */ +#define BGBUFSIZE (NBG * 2) /* size of bigram buffer */ char buf1[MAXPATHLEN] = " "; char buf2[MAXPATHLEN]; char bigrams[BGBUFSIZE + 1] = { 0 }; -main ( argc, argv ) - int argc; char *argv[]; +int bgindex __P((char *)); +void usage __P((void)); + +int +main(argc, argv) + int argc; + char *argv[]; { - register char *cp, *oldpath = buf1, *path = buf2; - int code, count, diffcount, oldcount = 0; + register char *cp, *oldpath, *path; + int ch, code, count, diffcount, oldcount; FILE *fp; - if ((fp = fopen(argv[1], "r")) == NULL) { - printf("Usage: code common_bigrams < list > squozen_list\n"); - exit(1); - } - /* first copy bigram array to stdout */ - fgets ( bigrams, BGBUFSIZE + 1, fp ); - fwrite ( bigrams, 1, BGBUFSIZE, stdout ); - fclose( fp ); + while ((ch = getopt(argc, argv, "")) != EOF) + switch(ch) { + case '?': + default: + usage(); + } + argc -= optind; + argv += optind; + + if (argc != 1) + usage(); + + if ((fp = fopen(argv[0], "r")) == NULL) + err(1, "%s", argv[0]); + + /* First copy bigram array to stdout. */ + (void)fgets(bigrams, BGBUFSIZE + 1, fp); + if (fwrite(bigrams, 1, BGBUFSIZE, stdout) != BGBUFSIZE) + err(1, "stdout"); + (void)fclose(fp); - while ( fgets ( path, sizeof(buf2), stdin ) != NULL ) { - /* truncate newline */ + oldpath = buf1; + path = buf2; + oldcount = 0; + while (fgets(path, sizeof(buf2), stdin) != NULL) { + /* Truncate newline. */ cp = path + strlen(path) - 1; if (cp > path && *cp == '\n') *cp = '\0'; - /* squelch characters that would botch the decoding */ - for ( cp = path; *cp != NULL; cp++ ) { - if ( (unsigned char)*cp >= PARITY ) + + /* Squelch characters that would botch the decoding. */ + for (cp = path; *cp != NULL; cp++) { + if ((u_char)*cp >= PARITY) *cp &= PARITY-1; - else if ( *cp <= SWITCH ) + else if (*cp <= SWITCH) *cp = '?'; } - /* skip longest common prefix */ - for ( cp = path; *cp == *oldpath; cp++, oldpath++ ) - if ( *oldpath == NULL ) + + /* Skip longest common prefix. */ + for (cp = path; *cp == *oldpath; cp++, oldpath++) + if (*oldpath == NULL) break; count = cp - path; diffcount = count - oldcount + OFFSET; oldcount = count; - if ( diffcount < 0 || diffcount > 2*OFFSET ) { - putc ( SWITCH, stdout ); - putw ( diffcount, stdout ); - } - else - putc ( diffcount, stdout ); + if (diffcount < 0 || diffcount > 2 * OFFSET) { + if (putchar(SWITCH) == EOF || + putw(diffcount, stdout) == EOF) + err(1, "stdout"); + } else + if (putchar(diffcount) == EOF) + err(1, "stdout"); - while ( *cp != NULL ) { - if ( *(cp + 1) == NULL ) { - putchar ( *cp ); + while (*cp != NULL) { + if (*(cp + 1) == NULL) { + if (putchar(*cp) == EOF) + err(1, "stdout"); break; } - if ( (code = bgindex ( cp )) < 0 ) { - putchar ( *cp++ ); - putchar ( *cp++ ); - } - else { /* found, so mark byte with parity bit */ - putchar ( (code / 2) | PARITY ); + if ((code = bgindex(cp)) < 0) { + if (putchar(*cp++) == EOF || + putchar(*cp++) == EOF) + err(1, "stdout"); + } else { + /* Found, so mark byte with parity bit. */ + if (putchar((code / 2) | PARITY) == EOF) + err(1, "stdout"); cp += 2; } } - if ( path == buf1 ) /* swap pointers */ - path = buf2, oldpath = buf1; - else - path = buf1, oldpath = buf2; + if (path == buf1) { /* swap pointers */ + path = buf2; + oldpath = buf1; + } else { + path = buf1; + oldpath = buf2; + } } + /* Non-zero status if there were errors */ + if (fflush(stdout) != 0 || ferror(stdout)) + exit(1); + exit(0); } -bgindex ( bg ) /* return location of bg in bigrams or -1 */ +int +bgindex(bg) /* Return location of bg in bigrams or -1. */ char *bg; { - register char *p; - register char bg0 = bg[0], bg1 = bg[1]; + register char bg0, bg1, *p; - for ( p = bigrams; *p != NULL; p++ ) - if ( *p++ == bg0 && *p == bg1 ) + bg0 = bg[0]; + bg1 = bg[1]; + for (p = bigrams; *p != NULL; p++) + if (*p++ == bg0 && *p == bg1) break; - return ( *p == NULL ? -1 : --p - bigrams ); + return (*p == NULL ? -1 : --p - bigrams); +} + +void +usage() +{ + (void)fprintf(stderr, + "usage: locate.code common_bigrams < list > squozen_list\n"); + exit(1); } |
