X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/04f4d7044367099914cf1906ae27ac20c24e44cf..fae54db4d115cb57da03e0b7f5b4fa2abde95da2:/fortune/strfile/strfile.c?ds=inline diff --git a/fortune/strfile/strfile.c b/fortune/strfile/strfile.c index 69357391..15509370 100644 --- a/fortune/strfile/strfile.c +++ b/fortune/strfile/strfile.c @@ -1,4 +1,4 @@ -/* $NetBSD: strfile.c,v 1.10 1999/09/08 21:17:49 jsm Exp $ */ +/* $NetBSD: strfile.c,v 1.25 2007/12/18 08:45:03 dogcow Exp $ */ /*- * Copyright (c) 1989, 1993 @@ -15,11 +15,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -36,6 +32,7 @@ * SUCH DAMAGE. */ +#ifdef __NetBSD__ #include #ifndef lint __COPYRIGHT("@(#) Copyright (c) 1989, 1993\n\ @@ -46,26 +43,48 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 1993\n\ #if 0 static char sccsid[] = "@(#)strfile.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: strfile.c,v 1.10 1999/09/08 21:17:49 jsm Exp $"); +__RCSID("$NetBSD: strfile.c,v 1.25 2007/12/18 08:45:03 dogcow Exp $"); #endif #endif /* not lint */ +#endif /* __NetBSD__ */ + +/* n.b.: this file is used at build-time - i.e. during build.sh. */ # include # include -# include # include # include # include # include +# include # include + +# ifndef u_int32_t +# define u_int32_t unsigned int +# endif # include "strfile.h" # ifndef MAXPATHLEN # define MAXPATHLEN 1024 # endif /* MAXPATHLEN */ +u_int32_t +h2nl(u_int32_t h) +{ + unsigned char c[4]; + u_int32_t rv; + + c[0] = (h >> 24) & 0xff; + c[1] = (h >> 16) & 0xff; + c[2] = (h >> 8) & 0xff; + c[3] = (h >> 0) & 0xff; + memcpy(&rv, c, sizeof rv); + + return (rv); +} + /* - * This program takes a file composed of strings seperated by + * This program takes a file composed of strings separated by * lines starting with two consecutive delimiting character (default * character is '%') and creates another file which consists of a table * describing the file (structure from "strfile.h"), a table of seek @@ -93,23 +112,14 @@ __RCSID("$NetBSD: strfile.c,v 1.10 1999/09/08 21:17:49 jsm Exp $"); # define STORING_PTRS (Oflag || Rflag) # define CHUNKSIZE 512 -#ifdef lint -# define ALWAYS atoi("1") -#else -# define ALWAYS 1 -#endif -# define ALLOC(ptr,sz) if (ALWAYS) { \ +# define ALLOC(ptr,sz) do { \ if (ptr == NULL) \ - ptr = malloc((unsigned int) (CHUNKSIZE * sizeof *ptr)); \ + ptr = malloc(CHUNKSIZE * sizeof *ptr); \ else if (((sz) + 1) % CHUNKSIZE == 0) \ - ptr = realloc((void *) ptr, ((unsigned int) ((sz) + CHUNKSIZE) * sizeof *ptr)); \ + ptr = realloc(ptr, ((sz) + CHUNKSIZE) * sizeof *ptr); \ if (ptr == NULL) \ - errx(1, "out of space"); \ - } else - -#ifdef NO_VOID -# define void char -#endif + die("out of space"); \ + } while (0) typedef struct { char first; @@ -135,14 +145,26 @@ STRFILE Tbl; /* statistics table */ STR *Firstch; /* first chars of each string */ -void add_offset __P((FILE *, off_t)); -int cmp_str __P((const void *, const void *)); -void do_order __P((void)); -void getargs __P((int, char *[])); -int main __P((int, char *[])); -void randomize __P((void)); -char *unctrl __P((char)); -void usage __P((void)) __attribute__((__noreturn__)); +#ifdef __GNUC__ +#define NORETURN __dead +#else +#define NORETURN +#endif + +#ifndef __dead /* not NetBSD, presumably */ +#define __dead ; +#endif + +void add_offset(FILE *, off_t); +int cmp_str(const void *, const void *); +void die(const char *) NORETURN; +void dieperror(const char *, char *) NORETURN; +void do_order(void); +void fwrite_be_offt(off_t, FILE *); +void getargs(int, char *[]); +int main(int, char *[]); +void randomize(void); +void usage(void) NORETURN; /* @@ -167,22 +189,26 @@ main(ac, av) STR *fp; static char string[257]; + /* sanity test */ + if (sizeof(u_int32_t) != 4) + die("sizeof(unsigned int) != 4"); + getargs(ac, av); /* evalute arguments */ dc = Delimch; if ((inf = fopen(Infile, "r")) == NULL) - err(1, "open `%s'", Infile); + dieperror("open `%s'", Infile); if ((outf = fopen(Outfile, "w")) == NULL) - err(1, "open `%s'", Outfile); + dieperror("open `%s'", Outfile); if (!STORING_PTRS) - (void) fseek(outf, sizeof Tbl, 0); + (void) fseek(outf, sizeof Tbl, SEEK_SET); /* * Write the strings onto the file */ Tbl.str_longlen = 0; - Tbl.str_shortlen = (unsigned int) 0xffffffff; + Tbl.str_shortlen = (unsigned int) 0x7fffffff; Tbl.str_delim = dc; Tbl.str_version = VERSION; first = Oflag; @@ -197,19 +223,19 @@ main(ac, av) if (!length) continue; add_offset(outf, pos); - if (Tbl.str_longlen < length) + if ((off_t)Tbl.str_longlen < length) Tbl.str_longlen = length; - if (Tbl.str_shortlen > length) + if ((off_t)Tbl.str_shortlen > length) Tbl.str_shortlen = length; first = Oflag; } else if (first) { - for (nsp = sp; !isalnum(*nsp); nsp++) + for (nsp = sp; !isalnum((unsigned char)*nsp); nsp++) continue; ALLOC(Firstch, Num_pts); fp = &Firstch[Num_pts - 1]; - if (Iflag && isupper(*nsp)) - fp->first = tolower(*nsp); + if (Iflag && isupper((unsigned char)*nsp)) + fp->first = tolower((unsigned char)*nsp); else fp->first = *nsp; fp->pos = Seekpts[Num_pts - 1]; @@ -237,24 +263,26 @@ main(ac, av) puts("There was 1 string"); else printf("There were %d strings\n", (int)(Num_pts - 1)); - printf("Longest string: %lu byte%s\n", Tbl.str_longlen, + printf("Longest string: %lu byte%s\n", (unsigned long)Tbl.str_longlen, Tbl.str_longlen == 1 ? "" : "s"); - printf("Shortest string: %lu byte%s\n", Tbl.str_shortlen, + printf("Shortest string: %lu byte%s\n", (unsigned long)Tbl.str_shortlen, Tbl.str_shortlen == 1 ? "" : "s"); } - (void) fseek(outf, (off_t) 0, 0); - HTOBE32(Tbl.str_version); - Tbl.str_numstr = htobe32(Num_pts - 1); - HTOBE32(Tbl.str_longlen); - HTOBE32(Tbl.str_shortlen); - HTOBE32(Tbl.str_flags); + (void) fseek(outf, (off_t) 0, SEEK_SET); + Tbl.str_version = h2nl(Tbl.str_version); + Tbl.str_numstr = h2nl(Num_pts - 1); + Tbl.str_longlen = h2nl(Tbl.str_longlen); + Tbl.str_shortlen = h2nl(Tbl.str_shortlen); + Tbl.str_flags = h2nl(Tbl.str_flags); (void) fwrite((char *) &Tbl, sizeof Tbl, 1, outf); if (STORING_PTRS) { for (p = Seekpts, cnt = Num_pts; cnt--; ++p) - HTOBE64(*p); - (void) fwrite((char *) Seekpts, sizeof *Seekpts, (int) Num_pts, outf); + fwrite_be_offt(*p, outf); } + fflush(outf); + if (ferror(outf)) + dieperror("fwrite %s", Outfile); (void) fclose(outf); exit(0); } @@ -268,6 +296,8 @@ getargs(argc, argv) char **argv; { int ch; + extern int optind; + extern char *optarg; while ((ch = getopt(argc, argv, "c:iorsx")) != -1) switch(ch) { @@ -322,6 +352,26 @@ usage() exit(1); } +void +die(str) + const char *str; +{ + fprintf(stderr, "strfile: %s\n", str); + exit(1); +} + +void +dieperror(fmt, file) + const char *fmt; + char *file; +{ + fprintf(stderr, "strfile: "); + fprintf(stderr, fmt, file); + fprintf(stderr, ": "); + perror(NULL); + exit(1); +} + /* * add_offset: * Add an offset to the list, or write it out, as appropriate. @@ -331,11 +381,9 @@ add_offset(fp, off) FILE *fp; off_t off; { - off_t net; if (!STORING_PTRS) { - net = htobe64(off); - fwrite(&net, 1, sizeof net, fp); + fwrite_be_offt(off, fp); } else { ALLOC(Seekpts, Num_pts + 1); Seekpts[Num_pts] = off; @@ -367,31 +415,6 @@ do_order() Tbl.str_flags |= STR_ORDERED; } -/* - * cmp_str: - * Compare two strings in the file - */ -char * -unctrl(c) - char c; -{ - static char buf[3]; - - if (isprint(c)) { - buf[0] = c; - buf[1] = '\0'; - } - else if (c == 0177) { - buf[0] = '^'; - buf[1] = '?'; - } - else { - buf[0] = '^'; - buf[1] = c + 'A' - 1; - } - return buf; -} - int cmp_str(vp1, vp2) const void *vp1, *vp2; @@ -411,8 +434,8 @@ cmp_str(vp1, vp2) if (c1 != c2) return c1 - c2; - (void) fseek(Sort_1, p1->pos, 0); - (void) fseek(Sort_2, p2->pos, 0); + (void) fseek(Sort_1, p1->pos, SEEK_SET); + (void) fseek(Sort_2, p2->pos, SEEK_SET); n1 = FALSE; n2 = FALSE; @@ -471,3 +494,23 @@ randomize() sp[i] = tmp; } } + +/* + * fwrite_be_offt: + * Write out the off paramater as a 64 bit big endian number + */ + +void +fwrite_be_offt(off, f) + off_t off; + FILE *f; +{ + int i; + unsigned char c[8]; + + for (i = 7; i >= 0; i--) { + c[i] = off & 0xff; + off >>= 8; + } + fwrite(c, sizeof(c), 1, f); +}