1 /*- 2 * %sccs.include.proprietary.c% 3 */ 4 5 #ifndef lint 6 static char sccsid[] = "@(#)refer1.c 4.6 (Berkeley) 04/18/91"; 7 #endif /* not lint */ 8 9 #include <signal.h> 10 #include "refer..c" 11 #include "pathnames.h" 12 13 main(argc,argv) /* process command-line arguments */ 14 char *argv[]; 15 { 16 char line[BUFSIZ], *s; 17 int nodeflt = 0; 18 19 signals(); 20 while (argv[1][0] == '-') { 21 switch(argv[1][1]) { 22 case 'e': 23 endpush++; 24 break; 25 case 's': 26 sort++; 27 endpush = 1; 28 if (argv[1][2]) 29 keystr = argv[1]+2; 30 break; 31 case 'l': 32 labels++; 33 s = argv[1]+2; 34 nmlen = atoi(s); 35 while (*s) 36 if (*s++ == ',') 37 break; 38 dtlen = atoi(s); 39 break; 40 case 'k': 41 keywant = (argv[1][2] ? argv[1][2] : 'L'); 42 labels++; 43 break; 44 case 'n': 45 nodeflt = 1; 46 break; 47 case 'p': 48 argc--; 49 argv++; 50 *search++ = argv[1]; 51 if (search-rdata > NSERCH) 52 err("too many -p options (%d)", NSERCH); 53 break; 54 case 'a': 55 authrev = atoi(argv[1]+2); 56 if (authrev<=0) 57 authrev = 1000; 58 break; 59 case 'b': 60 bare = (argv[1][2] == '1') ? 1 : 2; 61 break; 62 case 'c': 63 smallcaps = argv[1]+2; 64 break; 65 case 'f': 66 refnum = atoi(argv[1]+2) - 1; 67 break; 68 case 'B': 69 biblio++; 70 bare = 2; 71 if (argv[1][2]) 72 convert = argv[1]+2; 73 break; 74 case 'S': 75 science++; 76 labels = 1; 77 break; 78 case 'P': 79 postpunct++; 80 break; 81 } 82 argc--; 83 argv++; 84 } 85 if (getenv("REFER") != NULL) 86 *search++ = getenv("REFER"); 87 else if (nodeflt == 0) 88 *search++ = _PATH_IND; 89 if (!labels) { 90 sprintf(ofile, "%s/rj%db", _PATH_TMP, getpid()); 91 ftemp = fopen(ofile, "w"); 92 if (ftemp == NULL) { 93 fprintf(stderr, "Can't open scratch file\n"); 94 exit(1); 95 } 96 } 97 if (endpush) { 98 sprintf(tfile, "%s/rj%da", _PATH_TMP, getpid()); 99 fo = fopen(tfile, "w"); 100 if (fo == NULL) { 101 fo = ftemp; 102 fprintf(stderr, "Can't open scratch file"); 103 } 104 sep = 002; /* separate records without confusing sort..*/ 105 } else 106 fo = ftemp; 107 do { 108 if (argc > 1) { 109 fclose(in); 110 Iline = 0; 111 in = fopen(Ifile = argv[1], "r"); 112 argc--; 113 argv++; 114 if (in == NULL) { 115 err("Can't read %s", Ifile); 116 continue; 117 } 118 } 119 while (input(line)) { 120 Iline++; 121 if (biblio && *line == '\n') 122 doref(line); 123 else if (biblio && Iline == 1 && *line == '%') 124 doref(line); 125 else if (!prefix(".[", line)) 126 output(line); 127 else 128 doref(line); 129 } 130 } while (argc > 1); 131 132 if (endpush && fo != NULL) 133 dumpold(); 134 output(""); 135 if (!labels) 136 recopy(ofile); 137 clfgrep(); 138 cleanup(); 139 exit(0); 140 } 141 142 signals() 143 { 144 void intr(); 145 146 if (signal(SIGINT, SIG_IGN) != SIG_IGN) 147 signal(SIGINT, intr); 148 signal(SIGHUP, intr); 149 signal(SIGPIPE, intr); 150 signal(SIGTERM, intr); 151 } 152 153 void 154 intr() 155 { 156 signal(SIGINT, SIG_IGN); 157 cleanup(); 158 exit(1); 159 } 160 161 cleanup() 162 { 163 if (tfile[0]) 164 unlink(tfile); 165 if (gfile[0]) 166 unlink(gfile); 167 if (ofile[0]) 168 unlink(ofile); 169 if (hidenam[0]) 170 unlink(hidenam); 171 } 172