|
|
1.1 ! root 1: /**************************************************************** ! 2: Copyright 1990, 1991, 1992 by AT&T Bell Laboratories and Bellcore. ! 3: ! 4: Permission to use, copy, modify, and distribute this software ! 5: and its documentation for any purpose and without fee is hereby ! 6: granted, provided that the above copyright notice appear in all ! 7: copies and that both that the copyright notice and this ! 8: permission notice and warranty disclaimer appear in supporting ! 9: documentation, and that the names of AT&T Bell Laboratories or ! 10: Bellcore or any of their entities not be used in advertising or ! 11: publicity pertaining to distribution of the software without ! 12: specific, written prior permission. ! 13: ! 14: AT&T and Bellcore disclaim all warranties with regard to this ! 15: software, including all implied warranties of merchantability ! 16: and fitness. In no event shall AT&T or Bellcore be liable for ! 17: any special, indirect or consequential damages or any damages ! 18: whatsoever resulting from loss of use, data or profits, whether ! 19: in an action of contract, negligence or other tortious action, ! 20: arising out of or in connection with the use or performance of ! 21: this software. ! 22: ****************************************************************/ ! 23: #include "defs.h" ! 24: #include "usignal.h" ! 25: ! 26: char binread[] = "rb", textread[] = "r"; ! 27: char binwrite[] = "wb", textwrite[] = "w"; ! 28: char *c_functions = "c_functions"; ! 29: char *coutput = "c_output"; ! 30: char *initfname = "raw_data"; ! 31: char *initbname = "raw_data.b"; ! 32: char *blkdfname = "block_data"; ! 33: char *p1_file = "p1_file"; ! 34: char *p1_bakfile = "p1_file.BAK"; ! 35: char *sortfname = "init_file"; ! 36: char *proto_fname = "proto_file"; ! 37: ! 38: char link_msg[] = "-lF77 -lI77 -lm -lc"; ! 39: ! 40: #ifndef TMPDIR ! 41: #ifdef MSDOS ! 42: #define TMPDIR "" ! 43: #else ! 44: #define TMPDIR "/tmp" ! 45: #endif ! 46: #endif ! 47: ! 48: char *tmpdir = TMPDIR; ! 49: ! 50: void ! 51: Un_link_all(cdelete) ! 52: { ! 53: if (!debugflag) { ! 54: unlink(c_functions); ! 55: unlink(initfname); ! 56: unlink(p1_file); ! 57: unlink(sortfname); ! 58: unlink(blkdfname); ! 59: if (cdelete && coutput) ! 60: unlink(coutput); ! 61: } ! 62: } ! 63: ! 64: void ! 65: set_tmp_names() ! 66: { ! 67: int k; ! 68: if (debugflag == 1) ! 69: return; ! 70: k = strlen(tmpdir) + 16; ! 71: c_functions = (char *)ckalloc(7*k); ! 72: initfname = c_functions + k; ! 73: initbname = initfname + k; ! 74: blkdfname = initbname + k; ! 75: p1_file = blkdfname + k; ! 76: p1_bakfile = p1_file + k; ! 77: sortfname = p1_bakfile + k; ! 78: { ! 79: #ifdef MSDOS ! 80: char buf[64], *s, *t; ! 81: if (!*tmpdir || *tmpdir == '.' && !tmpdir[1]) ! 82: t = ""; ! 83: else { ! 84: /* substitute \ for / to avoid confusion with a ! 85: * switch indicator in the system("sort ...") ! 86: * call in formatdata.c ! 87: */ ! 88: for(s = tmpdir, t = buf; *s; s++, t++) ! 89: if ((*t = *s) == '/') ! 90: *t = '\\'; ! 91: if (t[-1] != '\\') ! 92: *t++ = '\\'; ! 93: *t = 0; ! 94: t = buf; ! 95: } ! 96: sprintf(c_functions, "%sf2c_func", t); ! 97: sprintf(initfname, "%sf2c_rd", t); ! 98: sprintf(blkdfname, "%sf2c_blkd", t); ! 99: sprintf(p1_file, "%sf2c_p1f", t); ! 100: sprintf(p1_bakfile, "%sf2c_p1fb", t); ! 101: sprintf(sortfname, "%sf2c_sort", t); ! 102: #else ! 103: int pid = getpid(); ! 104: sprintf(c_functions, "%s/f2c%d_func", tmpdir, pid); ! 105: sprintf(initfname, "%s/f2c%d_rd", tmpdir, pid); ! 106: sprintf(blkdfname, "%s/f2c%d_blkd", tmpdir, pid); ! 107: sprintf(p1_file, "%s/f2c%d_p1f", tmpdir, pid); ! 108: sprintf(p1_bakfile, "%s/f2c%d_p1fb", tmpdir, pid); ! 109: sprintf(sortfname, "%s/f2c%d_sort", tmpdir, pid); ! 110: #endif ! 111: sprintf(initbname, "%s.b", initfname); ! 112: } ! 113: if (debugflag) ! 114: fprintf(diagfile, "%s %s %s %s %s %s\n", c_functions, ! 115: initfname, blkdfname, p1_file, p1_bakfile, sortfname); ! 116: } ! 117: ! 118: char * ! 119: c_name(s,ft)char *s; ! 120: { ! 121: char *b, *s0; ! 122: int c; ! 123: ! 124: b = s0 = s; ! 125: while(c = *s++) ! 126: if (c == '/') ! 127: b = s; ! 128: if (--s < s0 + 3 || s[-2] != '.' ! 129: || ((c = *--s) != 'f' && c != 'F')) { ! 130: infname = s0; ! 131: Fatal("file name must end in .f or .F"); ! 132: } ! 133: *s = ft; ! 134: b = copys(b); ! 135: *s = c; ! 136: return b; ! 137: } ! 138: ! 139: static void ! 140: killed(sig) ! 141: { ! 142: signal(SIGINT, SIG_IGN); ! 143: #ifdef SIGQUIT ! 144: signal(SIGQUIT, SIG_IGN); ! 145: #endif ! 146: #ifdef SIGHUP ! 147: signal(SIGHUP, SIG_IGN); ! 148: #endif ! 149: signal(SIGTERM, SIG_IGN); ! 150: Un_link_all(1); ! 151: exit(126); ! 152: } ! 153: ! 154: static void ! 155: sig1catch(sig) ! 156: { ! 157: if (signal(sig, SIG_IGN) != SIG_IGN) ! 158: signal(sig, killed); ! 159: } ! 160: ! 161: static void ! 162: flovflo(sig) ! 163: { ! 164: Fatal("floating exception during constant evaluation; cannot recover"); ! 165: /* vax returns a reserved operand that generates ! 166: an illegal operand fault on next instruction, ! 167: which if ignored causes an infinite loop. ! 168: */ ! 169: signal(SIGFPE, flovflo); ! 170: } ! 171: ! 172: void ! 173: sigcatch(sig) ! 174: { ! 175: sig1catch(SIGINT); ! 176: #ifdef SIGQUIT ! 177: sig1catch(SIGQUIT); ! 178: #endif ! 179: #ifdef SIGHUP ! 180: sig1catch(SIGHUP); ! 181: #endif ! 182: sig1catch(SIGTERM); ! 183: signal(SIGFPE, flovflo); /* catch overflows */ ! 184: } ! 185: ! 186: ! 187: dofork() ! 188: { ! 189: #ifdef MSDOS ! 190: Fatal("Only one Fortran input file allowed under MS-DOS"); ! 191: #else ! 192: int pid, status, w; ! 193: extern int retcode; ! 194: ! 195: if (!(pid = fork())) ! 196: return 1; ! 197: if (pid == -1) ! 198: Fatal("bad fork"); ! 199: while((w = wait(&status)) != pid) ! 200: if (w == -1) ! 201: Fatal("bad wait code"); ! 202: retcode |= status >> 8; ! 203: #endif ! 204: return 0; ! 205: } ! 206: ! 207: /* Initialization of tables that change with the character set... */ ! 208: ! 209: char escapes[Table_size]; ! 210: ! 211: #ifdef non_ASCII ! 212: char *str_fmt[Table_size]; ! 213: static char *str0fmt[127] = { /*}*/ ! 214: #else ! 215: char *str_fmt[Table_size] = { ! 216: #endif ! 217: "\\000", "\\001", "\\002", "\\003", "\\004", "\\005", "\\006", "\\007", ! 218: "\\b", "\\t", "\\n", "\\013", "\\f", "\\r", "\\016", "\\017", ! 219: "\\020", "\\021", "\\022", "\\023", "\\024", "\\025", "\\026", "\\027", ! 220: "\\030", "\\031", "\\032", "\\033", "\\034", "\\035", "\\036", "\\037", ! 221: " ", "!", "\\\"", "#", "$", "%%", "&", "'", ! 222: "(", ")", "*", "+", ",", "-", ".", "/", ! 223: "0", "1", "2", "3", "4", "5", "6", "7", ! 224: "8", "9", ":", ";", "<", "=", ">", "?", ! 225: "@", "A", "B", "C", "D", "E", "F", "G", ! 226: "H", "I", "J", "K", "L", "M", "N", "O", ! 227: "P", "Q", "R", "S", "T", "U", "V", "W", ! 228: "X", "Y", "Z", "[", "\\\\", "]", "^", "_", ! 229: "`", "a", "b", "c", "d", "e", "f", "g", ! 230: "h", "i", "j", "k", "l", "m", "n", "o", ! 231: "p", "q", "r", "s", "t", "u", "v", "w", ! 232: "x", "y", "z", "{", "|", "}", "~" ! 233: }; ! 234: ! 235: #ifdef non_ASCII ! 236: char *chr_fmt[Table_size]; ! 237: static char *chr0fmt[127] = { /*}*/ ! 238: #else ! 239: char *chr_fmt[Table_size] = { ! 240: #endif ! 241: "\\0", "\\1", "\\2", "\\3", "\\4", "\\5", "\\6", "\\7", ! 242: "\\b", "\\t", "\\n", "\\13", "\\f", "\\r", "\\16", "\\17", ! 243: "\\20", "\\21", "\\22", "\\23", "\\24", "\\25", "\\26", "\\27", ! 244: "\\30", "\\31", "\\32", "\\33", "\\34", "\\35", "\\36", "\\37", ! 245: " ", "!", "\"", "#", "$", "%%", "&", "\\'", ! 246: "(", ")", "*", "+", ",", "-", ".", "/", ! 247: "0", "1", "2", "3", "4", "5", "6", "7", ! 248: "8", "9", ":", ";", "<", "=", ">", "?", ! 249: "@", "A", "B", "C", "D", "E", "F", "G", ! 250: "H", "I", "J", "K", "L", "M", "N", "O", ! 251: "P", "Q", "R", "S", "T", "U", "V", "W", ! 252: "X", "Y", "Z", "[", "\\\\", "]", "^", "_", ! 253: "`", "a", "b", "c", "d", "e", "f", "g", ! 254: "h", "i", "j", "k", "l", "m", "n", "o", ! 255: "p", "q", "r", "s", "t", "u", "v", "w", ! 256: "x", "y", "z", "{", "|", "}", "~" ! 257: }; ! 258: ! 259: void ! 260: fmt_init() ! 261: { ! 262: static char *str1fmt[6] = ! 263: { "\\b", "\\t", "\\n", "\\f", "\\r", "\\%03o" }; ! 264: register int i, j; ! 265: register char *s; ! 266: ! 267: /* str_fmt */ ! 268: ! 269: #ifdef non_ASCII ! 270: i = 0; ! 271: #else ! 272: i = 127; ! 273: #endif ! 274: for(; i < Table_size; i++) ! 275: str_fmt[i] = "\\%03o"; ! 276: #ifdef non_ASCII ! 277: for(i = 32; i < 127; i++) { ! 278: s = str0fmt[i]; ! 279: str_fmt[*(unsigned char *)s] = s; ! 280: } ! 281: str_fmt['"'] = "\\\""; ! 282: #else ! 283: if (Ansi == 1) ! 284: str_fmt[7] = chr_fmt[7] = "\\a"; ! 285: #endif ! 286: ! 287: /* chr_fmt */ ! 288: ! 289: #ifdef non_ASCII ! 290: for(i = 0; i < 32; i++) ! 291: chr_fmt[i] = chr0fmt[i]; ! 292: #else ! 293: i = 127; ! 294: #endif ! 295: for(; i < Table_size; i++) ! 296: chr_fmt[i] = "\\%o"; ! 297: #ifdef non_ASCII ! 298: for(i = 32; i < 127; i++) { ! 299: s = chr0fmt[i]; ! 300: j = *(unsigned char *)s; ! 301: if (j == '\\') ! 302: j = *(unsigned char *)(s+1); ! 303: chr_fmt[j] = s; ! 304: } ! 305: #endif ! 306: ! 307: /* escapes (used in lex.c) */ ! 308: ! 309: for(i = 0; i < Table_size; i++) ! 310: escapes[i] = i; ! 311: for(s = "btnfr0", i = 0; i < 6; i++) ! 312: escapes[*(unsigned char *)s++] = "\b\t\n\f\r"[i]; ! 313: /* finish str_fmt and chr_fmt */ ! 314: ! 315: if (Ansi) ! 316: str1fmt[5] = "\\v"; ! 317: if ('\v' == 'v') { /* ancient C compiler */ ! 318: str1fmt[5] = "v"; ! 319: #ifndef non_ASCII ! 320: escapes['v'] = 11; ! 321: #endif ! 322: } ! 323: else ! 324: escapes['v'] = '\v'; ! 325: for(s = "\b\t\n\f\r\v", i = 0; j = *(unsigned char *)s++;) ! 326: str_fmt[j] = chr_fmt[j] = str1fmt[i++]; ! 327: /* '\v' = 11 for both EBCDIC and ASCII... */ ! 328: chr_fmt[11] = Ansi ? "\\v" : "\\13"; ! 329: } ! 330: ! 331: ! 332: ! 333: /* Unless SYSTEM_SORT is defined, the following gives a simple ! 334: * in-core version of dsort(). On Fortran source with huge DATA ! 335: * statements, the in-core version may exhaust the available memory, ! 336: * in which case you might either recompile this source file with ! 337: * SYSTEM_SORT defined (if that's reasonable on your system), or ! 338: * replace the dsort below with a more elaborate version that ! 339: * does a merging sort with the help of auxiliary files. ! 340: */ ! 341: ! 342: #ifdef SYSTEM_SORT ! 343: ! 344: dsort(from, to) ! 345: char *from, *to; ! 346: { ! 347: char buf[200]; ! 348: sprintf(buf, "sort <%s >%s", from, to); ! 349: return system(buf) >> 8; ! 350: } ! 351: #else ! 352: ! 353: static int ! 354: compare(a,b) ! 355: char *a, *b; ! 356: { return strcmp(*(char **)a, *(char **)b); } ! 357: ! 358: dsort(from, to) ! 359: char *from, *to; ! 360: { ! 361: extern char *Alloc(); ! 362: ! 363: struct Memb { ! 364: struct Memb *next; ! 365: int n; ! 366: char buf[32000]; ! 367: }; ! 368: typedef struct Memb memb; ! 369: memb *mb, *mb1; ! 370: register char *x, *x0, *xe; ! 371: register int c, n; ! 372: FILE *f; ! 373: char **z, **z0; ! 374: int nn = 0; ! 375: ! 376: f = opf(from, textread); ! 377: mb = (memb *)Alloc(sizeof(memb)); ! 378: mb->next = 0; ! 379: x0 = x = mb->buf; ! 380: xe = x + sizeof(mb->buf); ! 381: n = 0; ! 382: for(;;) { ! 383: c = getc(f); ! 384: if (x >= xe && (c != EOF || x != x0)) { ! 385: if (!n) ! 386: return 126; ! 387: nn += n; ! 388: mb->n = n; ! 389: mb1 = (memb *)Alloc(sizeof(memb)); ! 390: mb1->next = mb; ! 391: mb = mb1; ! 392: memcpy(mb->buf, x0, n = x-x0); ! 393: x0 = mb->buf; ! 394: x = x0 + n; ! 395: xe = x0 + sizeof(mb->buf); ! 396: n = 0; ! 397: } ! 398: if (c == EOF) ! 399: break; ! 400: if (c == '\n') { ! 401: ++n; ! 402: *x++ = 0; ! 403: x0 = x; ! 404: } ! 405: else ! 406: *x++ = c; ! 407: } ! 408: clf(&f, from, 1); ! 409: f = opf(to, textwrite); ! 410: if (x > x0) { /* shouldn't happen */ ! 411: *x = 0; ! 412: ++n; ! 413: } ! 414: mb->n = n; ! 415: nn += n; ! 416: if (!nn) /* shouldn't happen */ ! 417: goto done; ! 418: z = z0 = (char **)Alloc(nn*sizeof(char *)); ! 419: for(mb1 = mb; mb1; mb1 = mb1->next) { ! 420: x = mb1->buf; ! 421: n = mb1->n; ! 422: for(;;) { ! 423: *z++ = x; ! 424: if (--n <= 0) ! 425: break; ! 426: while(*x++); ! 427: } ! 428: } ! 429: qsort((char *)z0, nn, sizeof(char *), compare); ! 430: for(n = nn, z = z0; n > 0; n--) ! 431: fprintf(f, "%s\n", *z++); ! 432: free((char *)z0); ! 433: done: ! 434: clf(&f, to, 1); ! 435: do { ! 436: mb1 = mb->next; ! 437: free((char *)mb); ! 438: } ! 439: while(mb = mb1); ! 440: return 0; ! 441: } ! 442: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.