Localize it.

off_t -> long.
Install strfile & unstr
-Wall cleanup
Fix matching bug with offensive database
This commit is contained in:
Andrey A. Chernov 1996-05-27 22:43:43 +00:00
parent d9378aac9a
commit f17947b74a
9 changed files with 130 additions and 130 deletions

View File

@ -1,11 +1,5 @@
# @(#)Makefile 8.1 (Berkeley) 5/31/93
SUBDIR= fortune
.if !make(install) && !make(distribute)
SUBDIR+=strfile
.endif
SUBDIR+= datfiles
SUBDIR= fortune strfile datfiles unstr
.include <bsd.subdir.mk>

View File

@ -25,8 +25,10 @@ CAESAR=/usr/games/caesar
.if exists(${.CURDIR}/../strfile/obj/strfile)
STRFILE=${.CURDIR}/../strfile/obj/strfile
.else
.elif exists(${.CURDIR}/../strfile/strfile)
STRFILE=${.CURDIR}/../strfile/strfile
.else
STRFILE=/usr/games/strfile
.endif
CLEANFILES+=${BLDS}

View File

@ -2,7 +2,7 @@
PROG= fortune
MAN6= fortune.6
CFLAGS+=-I${.CURDIR}/../strfile
CFLAGS+=-DDEBUG -Wall -I${.CURDIR}/../strfile
DPADD= ${COMPAT}
LDADD= -lcompat

View File

@ -35,13 +35,13 @@
*/
#ifndef lint
static char copyright[] =
static const char copyright[] =
"@(#) Copyright (c) 1986, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
static char sccsid[] = "@(#)fortune.c 8.1 (Berkeley) 5/31/93";
static const char sccsid[] = "@(#)fortune.c 8.1 (Berkeley) 5/31/93";
#endif /* not lint */
# include <sys/param.h>
@ -55,6 +55,8 @@ static char sccsid[] = "@(#)fortune.c 8.1 (Berkeley) 5/31/93";
# include <ctype.h>
# include <stdlib.h>
# include <string.h>
# include <locale.h>
# include <time.h>
# include "strfile.h"
# include "pathnames.h"
@ -66,11 +68,11 @@ static char sccsid[] = "@(#)fortune.c 8.1 (Berkeley) 5/31/93";
# define CPERS 20 /* # of chars for each sec */
# define SLEN 160 /* # of chars in short fortune */
# define POS_UNKNOWN ((off_t) -1) /* pos for file unknown */
# define POS_UNKNOWN ((long) -1) /* pos for file unknown */
# define NO_PROB (-1) /* no prob specified for file */
# ifdef DEBUG
# define DPRINTF(l,x) if (Debug >= l) fprintf x; else
# define DPRINTF(l,x) { if (Debug >= l) fprintf x; }
# undef NDEBUG
# else
# define DPRINTF(l,x)
@ -80,7 +82,7 @@ static char sccsid[] = "@(#)fortune.c 8.1 (Berkeley) 5/31/93";
typedef struct fd {
int percent;
int fd, datfd;
off_t pos;
long pos;
FILE *inf;
char *name;
char *path;
@ -112,7 +114,7 @@ char *Fortbuf = NULL; /* fortune buffer for -m */
int Fort_len = 0;
off_t Seekpts[2]; /* seek pointers to fortunes */
long Seekpts[2]; /* seek pointers to fortunes */
FILEDESC *File_list = NULL, /* Head of file list */
*File_tail = NULL; /* Tail of file list */
@ -186,6 +188,8 @@ char *av[];
int fd;
#endif /* OK_TO_WRITE_DISK */
(void) setlocale(LC_CTYPE, "");
getargs(ac, av);
#ifndef NO_REGEX
@ -194,7 +198,7 @@ char *av[];
#endif
init_prob();
srandom((int)(time((time_t *) NULL) + getpid()));
srandom((int)(time((time_t *) NULL) ^ getpid()));
do {
get_fort();
} while ((Short_only && fortlen() > SLEN) ||
@ -235,19 +239,23 @@ void
display(fp)
FILEDESC *fp;
{
register char *p, ch;
register char *p;
register unsigned char ch;
char line[BUFSIZ];
open_fp(fp);
(void) fseek(fp->inf, (long)Seekpts[0], 0);
(void) fseek(fp->inf, Seekpts[0], 0);
for (Fort_len = 0; fgets(line, sizeof line, fp->inf) != NULL &&
!STR_ENDSTRING(line, fp->tbl); Fort_len++) {
if (fp->tbl.str_flags & STR_ROTATED)
for (p = line; ch = *p; ++p)
if (isupper(ch))
*p = 'A' + (ch - 'A' + 13) % 26;
else if (islower(ch))
*p = 'a' + (ch - 'a' + 13) % 26;
for (p = line; (ch = *p) != '\0'; ++p) {
if (isascii(ch)) {
if (isupper(ch))
*p = 'A' + (ch - 'A' + 13) % 26;
else if (islower(ch))
*p = 'a' + (ch - 'a' + 13) % 26;
}
}
fputs(line, stdout);
}
(void) fflush(stdout);
@ -267,7 +275,7 @@ fortlen()
nchar = (Seekpts[1] - Seekpts[0] <= SLEN);
else {
open_fp(Fortfile);
(void) fseek(Fortfile->inf, (long)Seekpts[0], 0);
(void) fseek(Fortfile->inf, Seekpts[0], 0);
nchar = 0;
while (fgets(line, sizeof line, Fortfile->inf) != NULL &&
!STR_ENDSTRING(line, Fortfile->tbl))
@ -399,11 +407,11 @@ register int file_cnt;
&File_list, &File_tail, NULL);
for (i = 0; i < file_cnt; i++) {
percent = NO_PROB;
if (!isdigit(files[i][0]))
if (!isdigit((unsigned char)files[i][0]))
sp = files[i];
else {
percent = 0;
for (sp = files[i]; isdigit(*sp); sp++)
for (sp = files[i]; isdigit((unsigned char)*sp); sp++)
percent = percent * 10 + *sp - '0';
if (percent > 100) {
fprintf(stderr, "percentages must be <= 100\n");
@ -791,12 +799,14 @@ int check_for_offend;
*datp = datfile;
else
free(datfile);
#ifdef OK_TO_WRITE_DISK
if (posp != NULL) {
#ifdef OK_TO_WRITE_DISK
*posp = copy(file, (unsigned int) (strlen(file) + 4)); /* +4 for ".dat" */
(void) strcat(*posp, ".pos");
}
#else
*posp = NULL;
#endif /* OK_TO_WRITE_DISK */
}
DPRINTF(2, (stderr, "TRUE\n"));
return TRUE;
}
@ -856,7 +866,7 @@ void *ptr;
void
init_prob()
{
register FILEDESC *fp, *last;
register FILEDESC *fp, *last = NULL;
register int percent, num_noprob, frac;
/*
@ -955,17 +965,17 @@ get_fort()
if (fp->next != NULL) {
sum_noprobs(fp);
choice = random() % Noprob_tbl.str_numstr;
DPRINTF(1, (stderr, "choice = %d (of %d) \n", choice,
DPRINTF(1, (stderr, "choice = %d (of %ld) \n", choice,
Noprob_tbl.str_numstr));
while (choice >= fp->tbl.str_numstr) {
choice -= fp->tbl.str_numstr;
fp = fp->next;
DPRINTF(1, (stderr,
" skip \"%s\", %d (choice = %d)\n",
" skip \"%s\", %ld (choice = %d)\n",
fp->name, fp->tbl.str_numstr,
choice));
}
DPRINTF(1, (stderr, "using \"%s\", %d\n", fp->name,
DPRINTF(1, (stderr, "using \"%s\", %ld\n", fp->name,
fp->tbl.str_numstr));
}
get_tbl(fp);
@ -1007,15 +1017,15 @@ FILEDESC *parent;
else {
get_tbl(parent);
choice = random() % parent->tbl.str_numstr;
DPRINTF(1, (stderr, " choice = %d (of %d)\n",
DPRINTF(1, (stderr, " choice = %d (of %ld)\n",
choice, parent->tbl.str_numstr));
for (fp = parent->child; choice >= fp->tbl.str_numstr;
fp = fp->next) {
choice -= fp->tbl.str_numstr;
DPRINTF(1, (stderr, "\tskip %s, %d (choice = %d)\n",
DPRINTF(1, (stderr, "\tskip %s, %ld (choice = %d)\n",
fp->name, fp->tbl.str_numstr, choice));
}
DPRINTF(1, (stderr, " using %s, %d\n", fp->name,
DPRINTF(1, (stderr, " using %s, %ld\n", fp->name,
fp->tbl.str_numstr));
return fp;
}
@ -1106,7 +1116,7 @@ FILEDESC *fp;
}
if (++(fp->pos) >= fp->tbl.str_numstr)
fp->pos -= fp->tbl.str_numstr;
DPRINTF(1, (stderr, "pos for %s is %qd\n", fp->name, fp->pos));
DPRINTF(1, (stderr, "pos for %s is %ld\n", fp->name, fp->pos));
}
/*
@ -1159,7 +1169,7 @@ register STRFILE *tp;
{
tp->str_numstr = 0;
tp->str_longlen = 0;
tp->str_shortlen = -1;
tp->str_shortlen = ~((unsigned long)0);
}
/*
@ -1207,7 +1217,6 @@ int lev;
fprintf(stderr, " %s", STR(list->name));
DPRINTF(1, (stderr, " (%s, %s, %s)\n", STR(list->path),
STR(list->datfile), STR(list->posfile)));
putc('\n', stderr);
if (list->child != NULL)
print_list(list->child, lev + 1);
list = list->next;
@ -1229,7 +1238,7 @@ register char *orig;
cnt = 1; /* allow for '\0' */
for (sp = orig; *sp != '\0'; sp++)
if (isalpha(*sp))
if (isalpha((unsigned char)*sp))
cnt += 4;
else
cnt++;
@ -1239,16 +1248,16 @@ register char *orig;
}
for (sp = new; *orig != '\0'; orig++) {
if (islower(*orig)) {
if (islower((unsigned char)*orig)) {
*sp++ = '[';
*sp++ = *orig;
*sp++ = toupper(*orig);
*sp++ = toupper((unsigned char)*orig);
*sp++ = ']';
}
else if (isupper(*orig)) {
else if (isupper((unsigned char)*orig)) {
*sp++ = '[';
*sp++ = *orig;
*sp++ = tolower(*orig);
*sp++ = tolower((unsigned char)*orig);
*sp++ = ']';
}
else
@ -1310,9 +1319,10 @@ void
matches_in_list(list)
FILEDESC *list;
{
register char *sp;
register char *sp, *p;
register FILEDESC *fp;
int in_file;
unsigned char ch;
for (fp = list; fp != NULL; fp = fp->next) {
if (fp->child != NULL) {
@ -1328,6 +1338,15 @@ FILEDESC *list;
sp += strlen(sp);
else {
*sp = '\0';
if (fp->tbl.str_flags & STR_ROTATED)
for (p = Fortbuf; (ch = *p) != '\0'; ++p) {
if (isascii(ch)) {
if (isupper(ch))
*p = 'A' + (ch - 'A' + 13) % 26;
else if (islower(ch))
*p = 'a' + (ch - 'a' + 13) % 26;
}
}
if (RE_EXEC(Fortbuf)) {
printf("%c%c", fp->tbl.str_delim,
fp->tbl.str_delim);

View File

@ -1,6 +1,9 @@
# @(#)Makefile 8.1 (Berkeley) 5/31/93
PROG= strfile
NOMAN= noman
MAN8= strfile.8
MLINKS= strfile.8 unstr.8
CFLAGS+= -Wall
.include "${.CURDIR}/../../Makefile.inc"
.include <bsd.prog.mk>

View File

@ -35,25 +35,25 @@
*/
#ifndef lint
static char copyright[] =
static const 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[] = "@(#)strfile.c 8.1 (Berkeley) 5/31/93";
static const char sccsid[] = "@(#)strfile.c 8.1 (Berkeley) 5/31/93";
#endif /* not lint */
# include <machine/endian.h>
# include <sys/param.h>
# include <stdio.h>
# include <stdlib.h>
# include <ctype.h>
# include <string.h>
# include <time.h>
# include <locale.h>
# include <unistd.h>
# include "strfile.h"
# ifndef MAXPATHLEN
# define MAXPATHLEN 1024
# endif /* MAXPATHLEN */
/*
* This program takes a file composed of strings seperated by
* lines starting with two consecutive delimiting character (default
@ -83,12 +83,7 @@ static char sccsid[] = "@(#)strfile.c 8.1 (Berkeley) 5/31/93";
# 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) { \
if (ptr == NULL) \
ptr = malloc((unsigned int) (CHUNKSIZE * sizeof *ptr)); \
else if (((sz) + 1) % CHUNKSIZE == 0) \
@ -97,7 +92,7 @@ static char sccsid[] = "@(#)strfile.c 8.1 (Berkeley) 5/31/93";
fprintf(stderr, "out of space\n"); \
exit(1); \
} \
} else
}
#ifdef NO_VOID
# define void char
@ -105,7 +100,7 @@ static char sccsid[] = "@(#)strfile.c 8.1 (Berkeley) 5/31/93";
typedef struct {
char first;
off_t pos;
long pos;
} STR;
char *Infile = NULL, /* input file name */
@ -119,7 +114,7 @@ int Rflag = FALSE; /* randomize order flag */
int Xflag = FALSE; /* set rotated bit */
long Num_pts = 0; /* number of pointers/strings */
off_t *Seekpts;
long *Seekpts;
FILE *Sort_1, *Sort_2; /* pointers for sorting */
@ -127,9 +122,8 @@ STRFILE Tbl; /* statistics table */
STR *Firstch; /* first chars of each string */
char *fgets(), *strcpy(), *strcat();
void *malloc(), *realloc();
void getargs(), add_offset(), do_order(), randomize(), usage();
int cmp_str();
/*
* main:
@ -140,18 +134,20 @@ void *malloc(), *realloc();
* CHUNKSIZE blocks; if the latter, we just write each pointer,
* and then seek back to the beginning to write in the table.
*/
main(ac, av)
void main(ac, av)
int ac;
char **av;
{
register char *sp, dc;
register FILE *inf, *outf;
register off_t last_off, length, pos, *p;
register long last_off, length, pos, *p;
register int first, cnt;
register char *nsp;
register STR *fp;
static char string[257];
(void) setlocale(LC_CTYPE, "");
getargs(ac, av); /* evalute arguments */
dc = Delimch;
if ((inf = fopen(Infile, "r")) == NULL) {
@ -164,14 +160,14 @@ char **av;
exit(1);
}
if (!STORING_PTRS)
(void) fseek(outf, sizeof Tbl, 0);
(void) fseek(outf, (long) sizeof Tbl, 0);
/*
* Write the strings onto the file
*/
Tbl.str_longlen = 0;
Tbl.str_shortlen = (unsigned int) 0xffffffff;
Tbl.str_shortlen = ~((unsigned long) 0);
Tbl.str_delim = dc;
Tbl.str_version = VERSION;
first = Oflag;
@ -179,7 +175,7 @@ char **av;
last_off = 0;
do {
sp = fgets(string, 256, inf);
if (sp == NULL || sp[0] == dc && sp[1] == '\n') {
if (sp == NULL || (sp[0] == dc && sp[1] == '\n')) {
pos = ftell(inf);
length = pos - last_off - (sp ? strlen(sp) : 0);
last_off = pos;
@ -193,12 +189,12 @@ char **av;
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];
@ -225,14 +221,14 @@ char **av;
if (Num_pts == 2)
puts("There was 1 string");
else
printf("There were %d strings\n", Num_pts - 1);
printf("There were %ld strings\n", Num_pts - 1);
printf("Longest string: %lu byte%s\n", Tbl.str_longlen,
Tbl.str_longlen == 1 ? "" : "s");
printf("Shortest string: %lu byte%s\n", Tbl.str_shortlen,
Tbl.str_shortlen == 1 ? "" : "s");
}
(void) fseek(outf, (off_t) 0, 0);
rewind(outf);
Tbl.str_version = htonl(Tbl.str_version);
Tbl.str_numstr = htonl(Num_pts - 1);
Tbl.str_longlen = htonl(Tbl.str_longlen);
@ -251,7 +247,7 @@ char **av;
/*
* This routine evaluates arguments from the command line
*/
getargs(argc, argv)
void getargs(argc, argv)
int argc;
char **argv;
{
@ -265,7 +261,7 @@ char **argv;
Delimch = *optarg;
if (!isascii(Delimch)) {
printf("bad delimiting character: '\\%o\n'",
Delimch);
(unsigned char)Delimch);
}
break;
case 'i': /* ignore case in ordering */
@ -304,7 +300,7 @@ char **argv;
}
}
usage()
void usage()
{
(void) fprintf(stderr,
"strfile [-iorsx] [-c char] sourcefile [datafile]\n");
@ -315,11 +311,11 @@ usage()
* add_offset:
* Add an offset to the list, or write it out, as appropriate.
*/
add_offset(fp, off)
void add_offset(fp, off)
FILE *fp;
off_t off;
long off;
{
off_t net;
long net;
if (!STORING_PTRS) {
net = htonl(off);
@ -335,12 +331,11 @@ off_t off;
* do_order:
* Order the strings alphabetically (possibly ignoring case).
*/
do_order()
void do_order()
{
register int i;
register off_t *lp;
register long *lp;
register STR *fp;
extern int cmp_str();
Sort_1 = fopen(Infile, "r");
Sort_2 = fopen(Infile, "r");
@ -359,38 +354,21 @@ do_order()
* 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;
}
cmp_str(p1, p2)
int cmp_str(p1, p2)
STR *p1, *p2;
{
register int c1, c2;
register int n1, n2;
static char s1[2], s2[2];
int r;
# define SET_N(nf,ch) (nf = (ch == '\n'))
# define IS_END(ch,nf) (ch == Delimch && nf)
# define IS_END(ch,nf) (ch == EOF || (ch == (unsigned char) Delimch && nf))
c1 = p1->first;
c2 = p2->first;
s1[0] = c1 = (unsigned char) p1->first;
s2[0] = c2 = (unsigned char) p2->first;
if ((r = strcoll(s1, s2)) != 0)
return r;
if (c1 != c2)
return c1 - c2;
@ -399,9 +377,9 @@ STR *p1, *p2;
n1 = FALSE;
n2 = FALSE;
while (!isalnum(c1 = getc(Sort_1)) && c1 != '\0')
while (!isalnum(c1 = getc(Sort_1)) && c1 != '\0' && c1 != EOF)
SET_N(n1, c1);
while (!isalnum(c2 = getc(Sort_2)) && c2 != '\0')
while (!isalnum(c2 = getc(Sort_2)) && c2 != '\0' && c2 != EOF)
SET_N(n2, c2);
while (!IS_END(c1, n1) && !IS_END(c2, n2)) {
@ -411,6 +389,10 @@ STR *p1, *p2;
if (isupper(c2))
c2 = tolower(c2);
}
s1[0] = c1;
s2[0] = c2;
if ((r = strcoll(s1, s2)) != 0)
return r;
if (c1 != c2)
return c1 - c2;
SET_N(n1, c1);
@ -422,6 +404,10 @@ STR *p1, *p2;
c1 = 0;
if (IS_END(c2, n2))
c2 = 0;
s1[0] = c1;
s2[0] = c2;
if ((r = strcoll(s1, s2)) != 0)
return r;
return c1 - c2;
}
@ -431,14 +417,13 @@ STR *p1, *p2;
* not to randomize across delimiter boundaries. All
* randomization is done within each block.
*/
randomize()
void randomize()
{
register int cnt, i;
register off_t tmp;
register off_t *sp;
extern time_t time();
register long tmp;
register long *sp;
srandom((int)(time((time_t *) NULL) + getpid()));
srandom((int)(time((time_t *) NULL) ^ getpid()));
Tbl.str_flags |= STR_RANDOM;
cnt = Tbl.str_numstr;

View File

@ -37,7 +37,7 @@
*/
#define STR_ENDSTRING(line,tbl) \
((line)[0] == (tbl).str_delim && (line)[1] == '\n')
(((unsigned char)(line)[0]) == (tbl).str_delim && (line)[1] == '\n')
typedef struct { /* information table */
#define VERSION 1

View File

@ -2,6 +2,7 @@
PROG= unstr
NOMAN= noman
CFLAGS+=-I${.CURDIR}/../strfile
CFLAGS+=-Wall -I${.CURDIR}/../strfile
.include "${.CURDIR}/../../Makefile.inc"
.include <bsd.prog.mk>

View File

@ -35,13 +35,13 @@
*/
#ifndef lint
static char copyright[] =
static const char copyright[] =
"@(#) Copyright (c) 1991, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
static char sccsid[] = "@(#)unstr.c 8.1 (Berkeley) 5/31/93";
static const char sccsid[] = "@(#)unstr.c 8.1 (Berkeley) 5/31/93";
#endif /* not lint */
/*
@ -57,15 +57,11 @@ static char sccsid[] = "@(#)unstr.c 8.1 (Berkeley) 5/31/93";
* Ken Arnold Aug 13, 1978
*/
# include <machine/endian.h>
# include <sys/param.h>
# include "strfile.h"
# include <stdio.h>
# include <ctype.h>
# ifndef MAXPATHLEN
# define MAXPATHLEN 1024
# endif /* MAXPATHLEN */
# include <string.h>
# include "strfile.h"
char *Infile, /* name of input file */
Datafile[MAXPATHLEN], /* name of data file */
@ -73,10 +69,10 @@ char *Infile, /* name of input file */
FILE *Inf, *Dataf;
char *strcat(), *strcpy();
void getargs(), order_unstr();
/* ARGSUSED */
main(ac, av)
void main(ac, av)
int ac;
char **av;
{
@ -108,7 +104,7 @@ char **av;
exit(0);
}
getargs(av)
void getargs(av)
register char *av[];
{
if (!*++av) {
@ -120,12 +116,12 @@ register char *av[];
(void) strcat(Datafile, ".dat");
}
order_unstr(tbl)
void order_unstr(tbl)
register STRFILE *tbl;
{
register int i;
register char *sp;
auto off_t pos;
long pos;
char buf[BUFSIZ];
for (i = 0; i < tbl->str_numstr; i++) {