1 /* 2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 7 /* All Rights Reserved */ 8 9 /* 10 * Copyright (c) 1980 Regents of the University of California. 11 * All rights reserved. The Berkeley software License Agreement 12 * specifies the terms and conditions for redistribution. 13 */ 14 15 #pragma ident "%Z%%M% %I% %E% SMI" 16 17 #include <stdlib.h> 18 #include <signal.h> 19 #include <locale.h> 20 #include "refer..c" 21 22 extern void clfgrep(); 23 extern void doref(); 24 extern void dumpold(); 25 extern void err(); 26 extern void output(); 27 extern int prefix(); 28 extern void recopy(); 29 30 void cleanup(void); 31 void signals(void); 32 33 int 34 main(int argc, char *argv[]) /* process command-line arguments */ 35 { 36 char line[BUFSIZ], *s; 37 int nodeflt = 0; 38 39 (void) setlocale(LC_ALL, ""); 40 #if !defined(TEXT_DOMAIN) 41 #define TEXT_DOMAIN "SYS_TEST" 42 #endif 43 (void) textdomain(TEXT_DOMAIN); 44 45 signals(); 46 while (argc > 1 && argv[1][0] == '-') { 47 switch (argv[1][1]) { 48 case 'e': 49 endpush++; 50 break; 51 case 's': 52 sort++; 53 endpush = 1; 54 if (argv[1][2]) 55 keystr = argv[1]+2; 56 break; 57 case 'l': 58 labels++; 59 s = argv[1]+2; 60 nmlen = atoi(s); 61 while (*s) 62 if (*s++ == ',') 63 break; 64 dtlen = atoi(s); 65 break; 66 case 'k': 67 keywant = (argv[1][2] ? argv[1][2] : 'L'); 68 labels++; 69 break; 70 case 'n': 71 nodeflt = 1; 72 break; 73 case 'p': 74 argc--; 75 argv++; 76 *search++ = argv[1]; 77 if (search-rdata > NSERCH) 78 err(gettext( 79 "too many -p options (%d)"), NSERCH); 80 break; 81 case 'a': 82 authrev = atoi(argv[1]+2); 83 if (authrev <= 0) 84 authrev = 1000; 85 break; 86 case 'b': 87 bare = (argv[1][2] == '1') ? 1 : 2; 88 break; 89 case 'c': 90 smallcaps = argv[1]+2; 91 break; 92 case 'f': 93 refnum = atoi(argv[1]+2) - 1; 94 break; 95 case 'B': 96 biblio++; 97 bare = 2; 98 if (argv[1][2]) 99 convert = argv[1]+2; 100 break; 101 case 'S': 102 science++; 103 labels = 1; 104 break; 105 case 'P': 106 postpunct++; 107 break; 108 } 109 argc--; 110 argv++; 111 } 112 if (getenv("REFER") != NULL) 113 *search++ = getenv("REFER"); 114 else if (nodeflt == 0) 115 *search++ = "/usr/lib/refer/papers/Ind"; 116 if (sort && !labels) { 117 sprintf(ofile, "/tmp/rj%db", getpid()); 118 ftemp = fopen(ofile, "w"); 119 if (ftemp == NULL) { 120 fprintf(stderr, gettext("Can't open scratch file\n")); 121 exit(1); 122 } 123 } 124 if (endpush) { 125 sprintf(tfile, "/tmp/rj%da", getpid()); 126 fo = fopen(tfile, "w"); 127 if (fo == NULL) { 128 fo = ftemp; 129 fprintf(stderr, gettext("Can't open scratch file")); 130 } 131 sep = 002; /* separate records without confusing sort.. */ 132 } else 133 fo = ftemp; 134 do { 135 if (argc > 1) { 136 fclose(in); 137 Iline = 0; 138 in = fopen(Ifile = argv[1], "r"); 139 argc--; 140 argv++; 141 if (in == NULL) { 142 err(gettext("Can't read %s"), Ifile); 143 continue; 144 } 145 } 146 while (input(line)) { 147 Iline++; 148 if (biblio && *line == '\n') 149 doref(line); 150 else if (biblio && Iline == 1 && *line == '%') 151 doref(line); 152 else if (!prefix(".[", line)) 153 output(line); 154 else 155 doref(line); 156 } 157 } while (argc > 1); 158 159 if (endpush && fo != NULL) 160 dumpold(); 161 output(""); 162 if (sort && !labels) 163 recopy(ofile); 164 clfgrep(); 165 cleanup(); 166 return (0); 167 } 168 169 extern void intr(); 170 171 void 172 signals(void) 173 { 174 if (signal(SIGINT, SIG_IGN) != SIG_IGN) 175 signal(SIGINT, intr); 176 signal(SIGHUP, intr); 177 signal(SIGPIPE, intr); 178 signal(SIGTERM, intr); 179 } 180 181 void 182 intr(void) 183 { 184 signal(SIGINT, SIG_IGN); 185 cleanup(); 186 exit(1); 187 } 188 189 void 190 cleanup(void) 191 { 192 if (tfile[0]) 193 unlink(tfile); 194 if (gfile[0]) 195 unlink(gfile); 196 if (ofile[0]) 197 unlink(ofile); 198 if (hidenam[0]) 199 unlink(hidenam); 200 } 201