|
|
1.1 ! root 1: #define MAINLINE ! 2: #include "parms.h" ! 3: #include "structs.h" ! 4: ! 5: #ifdef RCSIDENT ! 6: static char rcsid[] = "$Header: main.c,v 1.7.0.1 85/03/08 10:40:05 notes Rel $"; ! 7: #endif RCSIDENT ! 8: ! 9: /* ! 10: * this main program will take in a notefile name, and ! 11: * then proceed to handle all of the processing for it. This includes ! 12: * calling all of the appropriate routines. It should stay in the ! 13: * package pretty much as is. It may not be the master routine, but ! 14: * it will be the chief 'driver' while within a particular note. ! 15: * ! 16: * Original author: Rob Kolstad Winter, 1980. ! 17: * Modifications: Ray Essick June, 1981. ! 18: * Modified more: Ray Essick May, 1982. ! 19: * ! 20: * ! 21: */ ! 22: ! 23: ! 24: static int seqon = NOSEQ; /* sequencer mode */ ! 25: ! 26: main (argc, argv) ! 27: char **argv; ! 28: { ! 29: ! 30: int i; ! 31: char *p, ! 32: *q, ! 33: *calledas; ! 34: int autoseq = 0; /* if autoseq */ ! 35: int notesargs = 0; /* count nf's */ ! 36: int nfsdone; ! 37: struct nflist_f *nfptr; ! 38: char bufstdout[BUFSIZ]; /* buffer for speed */ ! 39: ! 40: setbuf (stdout, bufstdout); /* buffer it */ ! 41: startup (argc, argv); /* common init */ ! 42: ! 43: if (globuid == Anonuid) ! 44: { ! 45: fprintf (stderr, "Sorry, you have the wrong uid (%d) to use notesfiles.\n", ! 46: globuid); ! 47: fprintf (stderr, "Consult your local system guru for more help\n"); ! 48: exit (BAD); ! 49: } ! 50: if ((calledas = rindex (argv[0], '/')) != 0) /* get invoking name */ ! 51: calledas++; ! 52: else ! 53: calledas = argv[0]; /* no slash */ ! 54: if (strcmp (calledas, "notes") && *calledas != '=') /* autoseq entry */ ! 55: { ! 56: autoseq++; /* is autoseq */ ! 57: setseq (NORMSEQ); /* turn on */ ! 58: } ! 59: ! 60: /* ! 61: * grab some variables from the environment ! 62: */ ! 63: if ((p = getenv ("SHELL")) != 0) ! 64: hisshell = p; /* his shell */ ! 65: if ((p = getenv ("NFED")) != 0) ! 66: hised = p; /* and his editor */ ! 67: else ! 68: if ((p = getenv ("EDITOR")) != 0) /* try this name */ ! 69: hised = p; /* his editor */ ! 70: ! 71: /* ! 72: * Scan the command line now to pluck options and ! 73: * notesfile specifications ! 74: */ ! 75: ! 76: if (*calledas == '=' && calledas[1] != '\0' && argc == 1)/* a =xxx case */ ! 77: { ! 78: expand (&calledas[1]); /* nf name */ ! 79: notesargs++; ! 80: } ! 81: ! 82: for (i = 1; i < argc; i++) ! 83: { ! 84: if (argv[i][0] == '-') /* option */ ! 85: { ! 86: switch (argv[i][1]) ! 87: { ! 88: case 's': /* sequencer */ ! 89: case 'x': /* extended sequencer */ ! 90: case 'i': /* index sequencer */ ! 91: case 'n': /* no sequencer */ ! 92: expand (argv[i]); /* change mode */ ! 93: break; ! 94: ! 95: case 't': /* term type */ ! 96: if (++i == argc) ! 97: { ! 98: fprintf (stderr, "-t must be followed by terminal type\n"); ! 99: exit (BAD); ! 100: } ! 101: histty = argv[i]; ! 102: break; ! 103: ! 104: case 'f': /* -f file option */ ! 105: if (++i == argc) /* see if there is one */ ! 106: { ! 107: fprintf (stderr, "-f must be followed by a file name\n"); ! 108: exit (BAD); ! 109: } ! 110: readrc (argv[i]); /* load the file */ ! 111: notesargs++; /* supplied args */ ! 112: break; ! 113: ! 114: case 'a': /* alternate sequencer */ ! 115: if (++i == argc) /* supplied name? */ ! 116: { ! 117: fprintf (stderr, "-a requires a name\n"); ! 118: exit (BAD); ! 119: } ! 120: else ! 121: { ! 122: struct auth_f whoami; ! 123: getname (&whoami, 0); /* grab real name */ ! 124: sprintf (Seqname, "%s:%s", whoami.aname, argv[i]); ! 125: } ! 126: break; ! 127: ! 128: case 'o': /* zero date */ ! 129: if (++i == argc) /* give a date? */ ! 130: { ! 131: fprintf (stderr, "-o requires a date\n"); ! 132: exit (BAD); ! 133: } ! 134: else ! 135: { ! 136: struct when_f ztime; ! 137: ! 138: switch (parsetime (argv[i], &ztime)) ! 139: { ! 140: case 0: /* ok */ ! 141: Basetime = ztime; /* store it */ ! 142: setseq (USERSEQ); /* readonly */ ! 143: break; ! 144: case -1: /* no good */ ! 145: fprintf (stderr, "%s: unable to parse time `%s'\n", ! 146: Invokedas, argv[i]); ! 147: exit (BAD); ! 148: case -2: /* in future */ ! 149: fprintf (stderr, "%s: parsed date (%s) is in the future\n", ! 150: Invokedas, argv[i]); ! 151: exit (BAD); ! 152: } ! 153: } ! 154: break; ! 155: ! 156: default: ! 157: fprintf (stderr, "Bad switch: `%c'\n", argv[i][1]); ! 158: } ! 159: } ! 160: else /* is a notesfile */ ! 161: { ! 162: expand (argv[i]); /* add it to list */ ! 163: notesargs++; /* supplied args */ ! 164: } ! 165: } ! 166: ! 167: /* ! 168: * now, check some things and let it fly ! 169: */ ! 170: ! 171: if (autoseq) /* grab sequencer */ ! 172: { ! 173: if ((q = getenv ("NFSEQ")) != NULL) /* grab NFSEQ */ ! 174: { ! 175: expand (q); ! 176: } ! 177: else ! 178: { ! 179: char rcbuf[WDLEN]; ! 180: sprintf (rcbuf, "%s/%s/%s", Mstdir, UTILITY, SEQFILE); ! 181: if (readrc (rcbuf) != 0) /* system list */ ! 182: expand (DFLTSEQ); /* give him default */ ! 183: } ! 184: } ! 185: ! 186: if (!autoseq && !notesargs) /* wants a list */ ! 187: { ! 188: usage (); ! 189: } ! 190: ! 191: intflag = 0; /* none yet */ ! 192: catchem (); /* catch interupts */ ! 193: ttystrt (); /* CBREAK mode */ ! 194: ! 195: nfsdone = 0; /* count groups */ ! 196: while ((nfptr = nextgroup ()) != (struct nflist_f *) NULL) ! 197: { ! 198: switch (control (nfptr -> nf_name, (int) nfptr -> nf_seqmode)) ! 199: { ! 200: case QUITFAST: /* leave now */ ! 201: case QUITUPD: /* likewise */ ! 202: goto leaving; ! 203: ! 204: case QUITBAD: /* err in name or nf */ ! 205: case QUITNEX: /* no nf there */ ! 206: case (-1): /* "normal" return */ ! 207: default: ! 208: break; ! 209: } ! 210: nfsdone++; /* count the ones done */ ! 211: } ! 212: if (nfsdone == 0) /* check if did any */ ! 213: { ! 214: ttystop (); /* turn it off */ ! 215: printf ("No notesfiles processed\n"); ! 216: fflush (stdout); ! 217: exit (GOOD); ! 218: } ! 219: ! 220: leaving: /* get out of here */ ! 221: at (0, 1); /* at bottom LHS */ ! 222: putc ('\n', stdout); ! 223: ttystop (); /* back to normal */ ! 224: exit (GOOD); ! 225: } ! 226: ! 227: /* ! 228: * tell him how to invoke the program ! 229: */ ! 230: ! 231: usage () ! 232: { ! 233: char cmdline[CMDLEN]; /* build a command */ ! 234: char *command; ! 235: fprintf (stderr, ! 236: "Usage: %s [-s] [-t ttytype] [-f file] [-a seqname] topic [...]\n", ! 237: Invokedas); ! 238: fprintf (stderr, "Hit <return> to continue\n"); /* ponder this */ ! 239: getc (stderr); /* thanks to harpo!ber 4/30/82 */ ! 240: if ((command = getenv ("PAGER")) == NULL) /* overridden? */ ! 241: command = PAGER; /* assign default */ ! 242: #ifndef FASTFORK ! 243: sprintf (cmdline, "%s < %s/%s/%s", command, Mstdir, UTILITY, AVAILHLP); ! 244: dounix (cmdline, 1, 0); /* print the list */ ! 245: #else ! 246: sprintf (cmdline, "%s/%s/%s", Mstdir, UTILITY, AVAILHLP); ! 247: dounix (1, 0, command, cmdline, 0, 0, 0); ! 248: #endif ! 249: exit (BAD); ! 250: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.