Annotation of researchv10no/cmd/f2c/sysdep.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.