|
|
1.1 root 1: /*
2: * process - process options for readnews
3: */
4:
5: static char *SccsId = "@(#)process.c 2.7 4/23/83";
6:
7: #include "rparams.h"
8:
9: #define OPTION 0 /* pick up an option string */
10: #define STRING 1 /* pick up a string of arguments */
11:
12: struct optable *optpt, options[] = { /*
13: optlet filchar flag newstate oldmode newmode buf */
14: 'p', '\0', FALSE, OPTION, UNKNOWN, UNKNOWN,(char *)NULL,
15: 't', '\0', FALSE, STRING, ANY, UNKNOWN,header.title,
16: 'a', ' ', FALSE, STRING, ANY, UNKNOWN,datebuf,
17: 'n', NGDELIM, FALSE, STRING, ANY, UNKNOWN,header.nbuf,
18: 'c', ' ', FALSE, STRING, UNKNOWN, UNKNOWN,coptbuf,
19: 'l', ' ', FALSE, OPTION, UNKNOWN, UNKNOWN,(char *)NULL,
20: 'r', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
21: 's', NGDELIM, FALSE, STRING, ANY, UNKNOWN,header.nbuf,
22: 'x', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
23: 'h', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
24: 'M', '\0', FALSE, OPTION, UNKNOWN, MAIL, (char *)NULL,
25: 'f', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
26: 'u', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
27: 'e', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
28: '\0', '\0', 0, 0, 0, 0, (char *)NULL
29: };
30:
31: process(argc,argv)
32: register int argc;
33: register char **argv;
34: {
35: register int state = OPTION;
36: register char *ptr;
37: char filchar;
38: int len, tlen;
39:
40: /* loop once per arg. */
41:
42: while (--argc) {
43: if (state == OPTION) {
44: if (**argv != '-') {
45: sprintf(bfr, "Bad option string \"%s\"", *argv);
46: xerror(bfr);
47: }
48: while (*++*argv != '\0') {
49: for (optpt = options; optpt->optlet != '\0'; ++optpt) {
50: if (optpt->optlet == **argv)
51: goto found;
52: }
53: /* unknown option letter */
54: fprintf(stderr, "Usage: readnews [ -a [ date ]] [ -n newsgroups ] [ -t titles ] [ -lprxhfuM ]\n");
55: fprintf(stderr, "\t[ -c [ ``mailer'' ]]\n\n");
56: fprintf(stderr, " readnews -s\n");
57: exit(1);
58:
59: found:;
60: if (mode != UNKNOWN && (mode&optpt->oldmode) == 0) {
61: sprintf(bfr, "Bad %c option", **argv);
62: xerror(bfr);
63: }
64: if (mode == UNKNOWN)
65: mode = optpt->newmode;
66: filchar = optpt->filchar;
67: optpt->flag = TRUE;
68: state = optpt->newstate;
69: ptr = optpt->buf;
70: len = LBUFLEN;
71: }
72:
73: argv++; /* done with this option arg. */
74:
75: } else {
76:
77: /*
78: * Pick up a piece of a string and put it into
79: * the appropriate buffer.
80: */
81: if (**argv == '-') {
82: state = OPTION;
83: argc++; /* uncount this arg. */
84: continue;
85: }
86:
87: if ((tlen = strlen(*argv)) >= len)
88: xerror("Argument string too long");
89: strcpy(ptr, *argv++);
90: ptr += tlen;
91: if (*(ptr-1) != filchar)
92: *ptr++ = filchar;
93: len -= tlen + 1;
94: *ptr = '\0';
95: }
96: }
97: return;
98: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.