|
|
1.1 root 1: #ident "@(#)cmd3.c 1.3 'attmail mail(1) command'"
2: #ident "@(#)mailx:cmd3.c 1.11.3.1"
3: /* Copyright (c) 1984 AT&T */
4: /* All Rights Reserved */
5:
6: /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
7: /* The copyright notice above does not evidence any */
8: /* actual or intended publication of such source code. */
9:
10: #ident "@(#)mailx:cmd3.c 1.11.1.2"
11:
12: #include "rcv.h"
13:
14: /*
15: * mailx -- a modified version of a University of California at Berkeley
16: * mail program
17: *
18: * Still more user commands.
19: */
20:
21: static int bangexp();
22: static int diction();
23: static char *getfilename();
24: static int resp1();
25: static int Resp1();
26: static char *reedit();
27: static int shell1();
28: static void sort();
29:
30: static char prevfile[PATHSIZE];
31: static char origprevfile[PATHSIZE];
32: static char lastbang[256];
33:
34: /*
35: * Process a shell escape by saving signals, ignoring signals,
36: * and forking a sh -c
37: */
38:
39: shell(str)
40: char *str;
41: {
42: shell1(str);
43: printf("!\n");
44: return(0);
45: }
46:
47: static int
48: shell1(str)
49: char *str;
50: {
51: void (*sig[2])();
52: int stat[1];
53: register int t;
54: register pid_t p;
55: char *Shell;
56: char cmd[BUFSIZ];
57:
58: strcpy(cmd, str);
59: if (bangexp(cmd) < 0)
60: return(-1);
61: if ((Shell = value("SHELL")) == NOSTR || *Shell=='\0')
62: Shell = SHELL;
63: for (t = SIGINT; t <= SIGQUIT; t++)
64: sig[t-SIGINT] = sigset(t, SIG_IGN);
65: p = fork();
66: if (p == 0) {
67: sigchild();
68: for (t = SIGINT; t <= SIGQUIT; t++)
69: if (sig[t-SIGINT] != (void (*)())SIG_IGN) /* adb */
70: sigset(t, SIG_DFL);
71: execlp(Shell, Shell, "-c", cmd, (char *)0);
72: perror(Shell);
73: _exit(1);
74: }
75: while (wait(stat) != p)
76: ;
77: if (p == (pid_t)-1)
78: perror("fork");
79: for (t = SIGINT; t <= SIGQUIT; t++)
80: sigset(t, sig[t-SIGINT]);
81: return(0);
82: }
83:
84: /*
85: * Fork an interactive shell.
86: */
87:
88: dosh(str)
89: char *str;
90: {
91: void (*sig[2])();
92: int stat[1];
93: register int t;
94: register pid_t p;
95: char *Shell;
96:
97: (void) str;
98: if ((Shell = value("SHELL")) == NOSTR || *Shell=='\0')
99: Shell = SHELL;
100: for (t = SIGINT; t <= SIGQUIT; t++)
101: sig[t-SIGINT] = sigset(t, SIG_IGN);
102: p = fork();
103: if (p == 0) {
104: sigchild();
105: for (t = SIGINT; t <= SIGQUIT; t++)
106: if (sig[t-SIGINT] != (void (*)())SIG_IGN) /* adb */
107: sigset(t, SIG_DFL);
108: execlp(Shell, Shell, (char *)0);
109: perror(Shell);
110: _exit(1);
111: }
112: while (wait(stat) != p)
113: ;
114: if (p == (pid_t)-1)
115: perror("fork");
116: for (t = SIGINT; t <= SIGQUIT; t++)
117: sigset(t, sig[t-SIGINT]);
118: putchar('\n');
119: return(0);
120: }
121:
122: /*
123: * Expand the shell escape by expanding unescaped !'s into the
124: * last issued command where possible.
125: */
126: static int
127: bangexp(str)
128: char *str;
129: {
130: char bangbuf[BUFSIZ];
131: register char *cp, *cp2;
132: register int n;
133: int changed = 0;
134: int bangit = (value("bang")!=NOSTR);
135:
136: cp = str;
137: cp2 = bangbuf;
138: n = BUFSIZ;
139: while (*cp) {
140: if (*cp=='!' && bangit) {
141: if (n < strlen(lastbang)) {
142: overf:
143: printf("Command buffer overflow\n");
144: return(-1);
145: }
146: changed++;
147: strcpy(cp2, lastbang);
148: cp2 += strlen(lastbang);
149: n -= strlen(lastbang);
150: cp++;
151: continue;
152: }
153: if (*cp == '\\' && cp[1] == '!') {
154: if (--n <= 1)
155: goto overf;
156: *cp2++ = '!';
157: cp += 2;
158: changed++;
159: }
160: if (--n <= 1)
161: goto overf;
162: *cp2++ = *cp++;
163: }
164: *cp2 = 0;
165: if (changed) {
166: printf("!%s\n", bangbuf);
167: fflush(stdout);
168: }
169: strcpy(str, bangbuf);
170: strncpy(lastbang, bangbuf, sizeof lastbang);
171: lastbang[(sizeof lastbang)-1] = 0;
172: return(0);
173: }
174:
175: /*
176: * Print out a nice help message from some file or another.
177: */
178:
179: help()
180: {
181: register c;
182: register FILE *f;
183:
184: if ((f = fopen(HELPFILE, "r")) == NULL) {
185: printf("No help just now.\n");
186: return(1);
187: }
188: while ((c = getc(f)) != EOF)
189: putchar(c);
190: fclose(f);
191: return(0);
192: }
193:
194: /*
195: * Change user's working directory.
196: */
197:
198: schdir(str)
199: char *str;
200: {
201: register char *cp;
202:
203: for (cp = str; *cp == ' '; cp++)
204: ;
205: if (*cp == '\0')
206: cp = homedir;
207: else
208: if ((cp = expand(cp)) == NOSTR)
209: return(1);
210: if (chdir(cp) < 0) {
211: perror(cp);
212: return(1);
213: }
214: return(0);
215: }
216:
217: /*
218: * Reply to a list of messages. Extract each name from the
219: * message header and send them off to mail1()
220: */
221:
222: respond(msgvec)
223: int *msgvec;
224: {
225: if (value("flipr") != NOSTR) return(Resp1(msgvec, 0));
226: else return(resp1(msgvec, 0));
227: }
228:
229: followup(msgvec)
230: int *msgvec;
231: {
232: if (value("flipf") != NOSTR) return(Resp1(msgvec, 1));
233: else return(resp1(msgvec, 1));
234: }
235:
236: static int
237: resp1(msgvec, useauthor)
238: int *msgvec;
239: {
240: char recfile[128];
241: struct message *mp;
242: char *cp, buf[2 * LINESIZE], *rcv, *skin_rcv, *replyto, **ap;
243: struct name *np;
244: struct header head;
245: char mylocalname[100], mydomname[200];
246:
247: if (msgvec[1] != 0) {
248: printf("Sorry, can't reply to multiple messages at once\n");
249: return(1);
250: }
251:
252: strcpy(mylocalname, myname);
253: strcat(mylocalname, "@");
254: strcpy(mydomname, mylocalname);
255: strcat(mylocalname, host);
256: strcat(mydomname, domain);
257:
258: mp = &message[msgvec[0] - 1];
259: dot = mp;
260:
261: rcv = nameof(mp);
262: strncpy(recfile, rcv, sizeof recfile);
263:
264: if ((replyto = hfield("reply-to", mp, addto)) != NOSTR)
265: strcpy(buf, replyto);
266: else if ((cp = hfield("to", mp, addto)) != NOSTR)
267: strcpy(buf, cp);
268: else
269: strcpy(buf, "");
270: np = elide(extract(buf, GTO));
271: #ifdef OPTIM
272: /* rcv = netrename(rcv); */
273: #endif /* OPTIM */
274: /*
275: * Delete my name from the reply list,
276: * and with it, all my alternate names.
277: */
278: skin_rcv = skin(rcv);
279: mapf(np, skin_rcv);
280: np = delname(np, myname);
281: np = delname(np, mylocalname);
282: np = delname(np, mydomname);
283: np = delname(np, skin_rcv);
284: if (altnames != 0)
285: for (ap = altnames; *ap; ap++)
286: np = delname(np, *ap);
287: head.h_seq = 1;
288: cp = detract(np, 0);
289: if (cp != NOSTR && replyto == NOSTR) {
290: strcpy(buf, cp);
291: strcat(buf, unuucp(rcv));
292: strcat(buf, ", ");
293: }
294: else {
295: if (cp == NOSTR && replyto != NOSTR)
296: printf("Empty reply-to field -- replying to author\n");
297: if (cp == NOSTR) {
298: strcpy(buf, unuucp(rcv));
299: strcat(buf, ", ");
300: } else
301: strcpy(buf, cp);
302: }
303: head.h_to = buf;
304: head.h_subject = hfield("subject", mp, addone);
305: if (head.h_subject == NOSTR)
306: head.h_subject = hfield("subj", mp, addone);
307: head.h_subject = reedit(head.h_subject);
308: head.h_cc = NOSTR;
309: cp = hfield("cc", mp, addto);
310: if (cp != NOSTR) {
311: np = elide(extract(cp, GCC));
312: mapf(np, skin_rcv);
313: np = delname(np, myname);
314: np = delname(np, mylocalname);
315: np = delname(np, mydomname);
316: np = delname(np, skin_rcv);
317: if (altnames != 0)
318: for (ap = altnames; *ap; ap++)
319: np = delname(np, *ap);
320: head.h_cc = detract(np, 0);
321: }
322: head.h_bcc = NOSTR;
323: head.h_defopt = NOSTR;
324: head.h_others = NOSTRPTR;
325: mail1(&head, useauthor ? recfile : 0);
326: return(0);
327: }
328:
329: void
330: getrecf(buf, recfile, useauthor)
331: char *buf, *recfile;
332: {
333: register char *bp, *cp;
334: register char *recf = recfile;
335: register int folderize = (value("outfolder")!=NOSTR);
336:
337: if (useauthor) {
338: if (folderize)
339: *recf++ = '+';
340: if (debug) fprintf(stderr, "buf='%s'\n", buf);
341: for (bp=skin(buf), cp=recf; *bp && !any(*bp, ", "); bp++)
342: if (*bp=='!')
343: cp = recf;
344: else
345: *cp++ = *bp;
346: *cp = '\0';
347: if (cp==recf)
348: *recfile = '\0';
349: } else {
350: if ((cp = value("record")) && *cp) {
351: if (folderize && *cp!='+' && *cp!='/'
352: && *expand(cp)!='/')
353: *recf++ = '+';
354: strcpy(recf, cp);
355: } else
356: *recf = '\0';
357: }
358: if (debug) fprintf(stderr, "recfile='%s'\n", recfile);
359: }
360:
361: /*
362: * Modify the subject we are replying to to begin with Re: if
363: * it does not already.
364: */
365:
366: static char *
367: reedit(subj)
368: char *subj;
369: {
370: char sbuf[10];
371: register char *newsubj;
372:
373: if (subj == NOSTR)
374: return(NOSTR);
375: strncpy(sbuf, subj, 3);
376: sbuf[3] = 0;
377: if (icequal(sbuf, "re:"))
378: return(subj);
379: newsubj = salloc((unsigned)(strlen(subj) + 5));
380: sprintf(newsubj, "Re: %s", subj);
381: return(newsubj);
382: }
383:
384: /*
385: * Preserve the named messages, so that they will be sent
386: * back to the system mailbox.
387: */
388:
389: preserve(msgvec)
390: int *msgvec;
391: {
392: register struct message *mp;
393: register int *ip, mesg;
394:
395: if (edit) {
396: printf("Cannot \"preserve\" in edit mode\n");
397: return(1);
398: }
399: for (ip = msgvec; *ip != NULL; ip++) {
400: mesg = *ip;
401: mp = &message[mesg-1];
402: mp->m_flag |= MPRESERVE;
403: mp->m_flag &= ~MBOX;
404: dot = mp;
405: }
406: return(0);
407: }
408:
409: /*
410: * Print the size of each message.
411: */
412:
413: messize(msgvec)
414: int *msgvec;
415: {
416: register struct message *mp;
417: register int *ip, mesg;
418:
419: for (ip = msgvec; *ip != NULL; ip++) {
420: mesg = *ip;
421: mp = &message[mesg-1];
422: printf("%d: %ld\n", mesg, mp->m_size);
423: }
424: return(0);
425: }
426:
427: /*
428: * Quit quickly. If we are sourcing, just pop the input level
429: * by returning an error.
430: */
431:
432: int
433: rexit(e)
434: {
435: if (sourcing)
436: return(1);
437: if (Tflag != NOSTR)
438: close(creat(Tflag, TEMPPERM));
439: if (!edit)
440: Verhogen();
441: exit(e);
442: /* NOTREACHED */
443: }
444:
445: /*
446: * Set or display a variable value. Syntax is similar to that
447: * of csh.
448: */
449:
450: set(arglist)
451: char **arglist;
452: {
453: register struct var *vp;
454: register char *cp, *cp2;
455: char varbuf[BUFSIZ], **ap, **p;
456: int errs, h, s;
457:
458: if (argcount(arglist) == 0) {
459: for (h = 0, s = 1; h < HSHSIZE; h++)
460: for (vp = variables[h]; vp != NOVAR; vp = vp->v_link)
461: s++;
462: ap = (char **) salloc(s * sizeof *ap);
463: for (h = 0, p = ap; h < HSHSIZE; h++)
464: for (vp = variables[h]; vp != NOVAR; vp = vp->v_link)
465: *p++ = vp->v_name;
466: *p = NOSTR;
467: sort(ap);
468: for (p = ap; *p != NOSTR; p++)
469: if (((cp = value(*p)) != 0) && *cp)
470: printf("%s=\"%s\"\n", *p, cp);
471: else
472: printf("%s\n", *p);
473: return(0);
474: }
475: errs = 0;
476: for (ap = arglist; *ap != NOSTR; ap++) {
477: cp = *ap;
478: cp2 = varbuf;
479: while (*cp != '=' && *cp != '\0')
480: *cp2++ = *cp++;
481: *cp2 = '\0';
482: if (*cp == '\0')
483: cp = "";
484: else
485: cp++;
486: if (equal(varbuf, "")) {
487: printf("Non-null variable name required\n");
488: errs++;
489: continue;
490: }
491: assign(varbuf, cp);
492: }
493: return(errs);
494: }
495:
496: /*
497: * Unset a bunch of variable values.
498: */
499:
500: unset(arglist)
501: char **arglist;
502: {
503: register int errs;
504: register char **ap;
505:
506: errs = 0;
507: for (ap = arglist; *ap != NOSTR; ap++)
508: errs += deassign(*ap);
509: return(errs);
510: }
511:
512: /*
513: * Check to see if environment variable should override variable settings
514: */
515:
516: check_environment()
517: {
518: register struct var *vp;
519: register int h;
520: register char *cp;
521:
522: for( h =0; h < HSHSIZE; h++) {
523: for( vp = variables[h]; vp != NOVAR; vp = vp->v_link) {
524: if( (cp = getenv(vp->v_name)) != NULL) {
525: assign(vp->v_name,cp);
526: }
527: }
528: }
529: }
530:
531: /*
532: * Put add users to a group.
533: */
534:
535: group(argv)
536: char **argv;
537: {
538: register struct grouphead *gh;
539: register struct mgroup *gp;
540: register int h;
541: int s;
542: char **ap, *gname, **p;
543:
544: if (argcount(argv) == 0) {
545: for (h = 0, s = 1; h < HSHSIZE; h++)
546: for (gh = groups[h]; gh != NOGRP; gh = gh->g_link)
547: s++;
548: ap = (char **) salloc(s * sizeof *ap);
549: for (h = 0, p = ap; h < HSHSIZE; h++)
550: for (gh = groups[h]; gh != NOGRP; gh = gh->g_link)
551: *p++ = gh->g_name;
552: *p = NOSTR;
553: sort(ap);
554: for (p = ap; *p != NOSTR; p++)
555: printgroup(*p);
556: return(0);
557: }
558: if (argcount(argv) == 1) {
559: printgroup(*argv);
560: return(0);
561: }
562: gname = *argv;
563: h = hash(gname);
564: if ((gh = findgroup(gname)) == NOGRP) {
565: gh = (struct grouphead *) calloc(sizeof *gh, 1);
566: gh->g_name = vcopy(gname);
567: gh->g_list = NOGE;
568: gh->g_link = groups[h];
569: groups[h] = gh;
570: }
571:
572: /*
573: * Insert names from the command list into the group.
574: * Who cares if there are duplicates? They get tossed
575: * later anyway.
576: */
577:
578: for (ap = argv+1; *ap != NOSTR; ap++) {
579: gp = (struct mgroup *) calloc(sizeof *gp, 1);
580: gp->ge_name = vcopy(*ap);
581: gp->ge_link = gh->g_list;
582: gh->g_list = gp;
583: }
584: return(0);
585: }
586:
587: /*
588: * Sort the passed string vecotor into ascending dictionary
589: * order.
590: */
591:
592: static void
593: sort(list)
594: char **list;
595: {
596: register char **ap;
597:
598: for (ap = list; *ap != NOSTR; ap++)
599: ;
600: if (ap-list < 2)
601: return;
602: qsort(list, ap-list, sizeof *list, diction);
603: }
604:
605: /*
606: * Do a dictionary order comparison of the arguments from
607: * qsort.
608: */
609: static int
610: diction(a, b)
611: register char **a, **b;
612: {
613: return(strcmp(*a, *b));
614: }
615:
616: /*
617: * The do nothing command for comments.
618: */
619:
620: null(e)
621: char *e;
622: {
623: (void) e;
624: return(0);
625: }
626:
627: /*
628: * Print out the current edit file, if we are editing.
629: * Otherwise, print the name of the person who's mail
630: * we are reading.
631: */
632: int
633: file(argv)
634: char **argv;
635: {
636: register char *cp;
637: int edit;
638:
639: if (argv[0] == NOSTR) {
640: newfileinfo();
641: return(0);
642: }
643:
644: /*
645: * Acker's! Must switch to the new file.
646: * We use a funny interpretation --
647: * # -- gets the previous file
648: * % -- gets the invoker's post office box
649: * %user -- gets someone else's post office box
650: * & -- gets invoker's mbox file
651: * string -- reads the given file
652: */
653:
654: cp = getfilename(argv[0], &edit);
655: if (cp == NOSTR)
656: return(-1);
657: if (setfile(cp, edit)) {
658: strcpy(origname, origprevfile);
659: return(-1);
660: }
661: newfileinfo();
662: return(0);
663: }
664:
665: /*
666: * Evaluate the string given as a new mailbox name.
667: * Ultimately, we want this to support a number of meta characters.
668: * Possibly:
669: * % -- for my system mail box
670: * %user -- for user's system mail box
671: * # -- for previous file
672: * & -- get's invoker's mbox file
673: * file name -- for any other file
674: */
675:
676: static char *
677: getfilename(name, aedit)
678: char *name;
679: int *aedit;
680: {
681: register char *cp;
682: char savename[BUFSIZ];
683: char oldmailname[BUFSIZ];
684: char tmp[BUFSIZ];
685:
686: /*
687: * Assume we will be in "edit file" mode, until
688: * proven wrong.
689: */
690: *aedit = 1;
691: switch (*name) {
692: case '%':
693: *aedit = 0;
694: strcpy(prevfile, mailname);
695: strcpy(origprevfile, origname);
696: if (name[1] != 0) {
697: strcpy(savename, myname);
698: strcpy(oldmailname, mailname);
699: strncpy(myname, name+1, PATHSIZE-1);
700: myname[PATHSIZE-1] = 0;
701: findmail();
702: cp = savestr(mailname);
703: strcpy(origname, cp);
704: strcpy(myname, savename);
705: strcpy(mailname, oldmailname);
706: return(cp);
707: }
708: strcpy(oldmailname, mailname);
709: findmail();
710: cp = savestr(mailname);
711: strcpy(mailname, oldmailname);
712: strcpy(origname, cp);
713: return(cp);
714:
715: case '#':
716: if (name[1] != 0)
717: goto regular;
718: if (prevfile[0] == 0) {
719: printf("No previous file\n");
720: return(NOSTR);
721: }
722: cp = savestr(prevfile);
723: strcpy(prevfile, mailname);
724: strcpy(tmp, origname);
725: strcpy(origname, origprevfile);
726: strcpy(origprevfile, tmp);
727: return(cp);
728:
729: case '&':
730: strcpy(prevfile, mailname);
731: strcpy(origprevfile, origname);
732: if (name[1] == 0) {
733: char *tmp;
734: tmp=Getf("MBOX");
735: strcpy(origname, tmp);
736: return(tmp);
737: }
738: /* Fall into . . . */
739:
740: default:
741: regular:
742: strcpy(prevfile, mailname);
743: strcpy(origprevfile, origname);
744: cp = expand(name);
745: strcpy(origname, cp);
746: if (cp[0] != '/') {
747: name = getcwd(NOSTR, PATHSIZE);
748: strcat(name, "/");
749: strcat(name, cp);
750: cp = name;
751: }
752: return(cp);
753: }
754: }
755:
756: /*
757: * Expand file names like echo
758: */
759:
760: echo(str)
761: char *str;
762: {
763: char cmd[LINESIZE];
764:
765: sprintf(cmd, "echo %s", str);
766: shell1(cmd);
767: return(0);
768: }
769:
770: /*
771: * Reply to a series of messages by simply mailing to the senders
772: * and not messing around with the To: and Cc: lists as in normal
773: * reply.
774: */
775:
776: Respond(msgvec)
777: int msgvec[];
778: {
779: if (value("flipr") != NOSTR) return(resp1(msgvec, 0));
780: else return(Resp1(msgvec, 0));
781: }
782:
783: Followup(msgvec)
784: int *msgvec;
785: {
786: if (value("flipf") != NOSTR) return(resp1(msgvec, 1));
787: else return(Resp1(msgvec, 1));
788: }
789:
790: static int
791: Resp1(msgvec, useauthor)
792: int *msgvec;
793: {
794: char recfile[128];
795: struct header head;
796: struct message *mp;
797: register int s, *ap;
798: register char *cp, *subject;
799:
800: #ifdef V9
801: /* just use UPAS-envelopes for return addresses */
802: extern char *Fromname();
803:
804: for (s = 0, ap = msgvec; *ap != 0; ap++) {
805: mp = &message[*ap - 1];
806: dot = mp;
807: s += strlen(Fromname(mp)) + 2;
808: }
809: if (s == 0)
810: return(0);
811: cp = salloc(++s);
812: head.h_to = cp;
813: for (ap = msgvec; *ap != 0; ap++) {
814: mp = &message[*ap - 1];
815: cp = copy(Fromname(mp), cp);
816: *cp++ = ',';
817: *cp++ = ' ';
818: }
819: *cp = 0;
820: #else
821: for (s = 0, ap = msgvec; *ap != 0; ap++) {
822: mp = &message[*ap - 1];
823: dot = mp;
824: s += strlen(nameof(mp)) + 2;
825: }
826: if (s == 0)
827: return(0);
828: cp = salloc((unsigned)(++s));
829: head.h_to = cp;
830: for (ap = msgvec; *ap != 0; ap++) {
831: mp = &message[*ap - 1];
832: cp = copy(nameof(mp), cp);
833: *cp++ = ',';
834: *cp++ = ' ';
835: }
836: *cp = 0;
837: #endif /* V9 */
838: strncpy(recfile, head.h_to, sizeof recfile);
839: mp = &message[msgvec[0] - 1];
840: subject = hfield("subject", mp, addone);
841: head.h_seq = 1;
842: if (subject == NOSTR)
843: subject = hfield("subj", mp, addone);
844: head.h_subject = reedit(subject);
845: if (subject != NOSTR)
846: head.h_seq++;
847: head.h_cc = NOSTR;
848: head.h_bcc = NOSTR;
849: head.h_defopt = NOSTR;
850: head.h_others = NOSTRPTR;
851: mail1(&head, useauthor ? recfile : 0);
852: return(0);
853: }
854:
855: /*
856: * Conditional commands. These allow one to parameterize one's
857: * .mailrc and do some things if sending, others if receiving.
858: */
859:
860: ifcmd(argv)
861: char **argv;
862: {
863: register char *cp;
864:
865: if (cond != CANY) {
866: printf("Illegal nested \"if\"\n");
867: return(1);
868: }
869: cond = CANY;
870: cp = argv[0];
871: switch (*cp) {
872: case 'r': case 'R':
873: cond = CRCV;
874: break;
875:
876: case 's': case 'S':
877: cond = CSEND;
878: break;
879:
880: default:
881: printf("Unrecognized if-keyword: \"%s\"\n", cp);
882: return(1);
883: }
884: return(0);
885: }
886:
887: /*
888: * Implement 'else'. This is pretty simple -- we just
889: * flip over the conditional flag.
890: */
891:
892: elsecmd()
893: {
894:
895: switch (cond) {
896: case CANY:
897: printf("\"Else\" without matching \"if\"\n");
898: return(1);
899:
900: case CSEND:
901: cond = CRCV;
902: break;
903:
904: case CRCV:
905: cond = CSEND;
906: break;
907:
908: default:
909: printf("invalid condition encountered\n");
910: cond = CANY;
911: break;
912: }
913: return(0);
914: }
915:
916: /*
917: * End of if statement. Just set cond back to anything.
918: */
919:
920: endifcmd()
921: {
922:
923: if (cond == CANY) {
924: printf("\"Endif\" without matching \"if\"\n");
925: return(1);
926: }
927: cond = CANY;
928: return(0);
929: }
930:
931: /*
932: * Set the list of alternate names.
933: */
934: alternates(namelist)
935: char **namelist;
936: {
937: register int c;
938: register char **ap, **ap2, *cp;
939:
940: c = argcount(namelist) + 1;
941: if (c == 1) {
942: if (altnames == 0)
943: return(0);
944: for (ap = altnames; *ap; ap++)
945: printf("%s ", *ap);
946: printf("\n");
947: return(0);
948: }
949: if (altnames != 0)
950: free((char *) altnames);
951: altnames = (char **) calloc(c, sizeof (char *));
952: for (ap = namelist, ap2 = altnames; *ap; ap++, ap2++) {
953: cp = (char *) calloc(strlen(*ap) + 1, sizeof (char));
954: strcpy(cp, *ap);
955: *ap2 = cp;
956: }
957: *ap2 = 0;
958: return(0);
959: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.