allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (05/15/89)
Posting-number: Volume 6, Issue 101 Submitted-by: glenn@osiris.UUCP (Glenn M. Mason) Archive-name: rwords [I fixed "dummyshar" this time; the file size is reported correctly. ++bsa] Here is the source for a simple, but very useful program for generating random word lists. Rwords is useful for generating input for testing software, such as debugging btree-lib code, etc. I compiled and tested this program on a Sun-3/60 and a Sun-4(SunOS-4.0). I hope that someone may find it useful. Enjoy! #! /bin/sh # This file was wrapped with "dummyshar". "sh" this file to extract. # Contents: rwords.c echo extracting 'rwords.c' if test -f 'rwords.c' -a -z "$1"; then echo Not overwriting 'rwords.c'; else sed 's/^X//' << \EOF > 'rwords.c' X/* X * NAME X * rwords - a random word list generator X * X * SYNOPSIS X * rwords [-fdictfile] n X * X * DESCRIPTION X * Rwords generates a random list of words from /usr/dict/words X * or an alternate user-specified word list file with the same X * format as /usr/dict/words. A number, n, must be specified on X * the command line which is the number of words to generate; n X * must be greater that 0. Words will be multiply generated in X * the case where n is greater than the number of words in the word X * file (note also that there is a very small probability that all X * words in the word file will be generated in any case) X * X * AUTHOR X * Glenn M. Mason, May 1989 X * (C)Laboratory for Applied Research in Academic Information X * The William H. Welch Medical Library, X * The Johns Hopkins University X * X */ X#include <stdio.h> X#include <ctype.h> X#include <fcntl.h> X#include <sys/types.h> X#include <sys/stat.h> X#include <sys/file.h> X#include <sys/timeb.h> X X#define DICT "/usr/dict/words" X X Xmain(argc,argv) Xint argc; Xchar *argv[]; X{ X char *words,usage[80]; X struct stat sbuf; X char wbuf[BUFSIZ]; X int fd,nw,nread; X register char *p,*q; X sprintf(usage,"Usage: %s [-fwordlist] n\n",argv[0]); X if (argc < 2) X fail(usage,0); X words = DICT; X if (argc > 2) { X if (strncmp(argv[1],"-f",2)) X fail(usage,0); X if (argv[1][2] == NULL) X fail(usage,0); X words = &argv[1][2]; X nw = atoi(argv[2]); X } X else X nw = atoi(argv[1]); X if (nw == 0) { X sprintf(usage,"%s: specify number of words > 0\n",argv[0]); X fail(usage,0); X } X if ((fd = open(words,O_RDONLY)) == -1) X fail(words,1); X if (fstat(fd,&sbuf) == -1) X fail("fstat",1); X if (!(sbuf.st_mode & S_IFREG)) { X sprintf(usage,"%s: not a regular file\n",words); X fail(usage,0); X } X srand48(time((time_t*)0)); /*non-repeating sequences*/ X while (nw > 0) { X long r = lrand48()%sbuf.st_size; X if (r < 2L) /* prob. at 1st byte = first word */ X r = 0L; X if (lseek(fd,(off_t)r,L_SET) == (off_t)-1) X fail("lseek",1); X if ((nread = read(fd,wbuf,sizeof(wbuf))) == -1) X fail("read",1); X if (nread < sizeof(wbuf)) X wbuf[nread] = NULL; X p = wbuf; X if (r != 0L) { X for (;*p != NULL && *p != '\n';p++) X ; X p++; X } X if (*p == NULL) /*EOF*/ X continue; X for (q = p;*q != NULL && *q != '\n';q++) X ; X if (*q == NULL) /*try again*/ X continue; X else X *q = NULL; /*... a word!*/ X nw--; X puts(p); X } X exit(0); X} X Xfail (s,flg) Xchar *s; Xint flg; X{ X if (flg) X perror(s); X else X fputs(s,stderr); X exit(1); X} EOF chars=`wc -c < 'rwords.c'` if test $chars != 2483; then echo 'rwords.c' is $chars characters, should be 2483 characters!; fi fi exit 0