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

1.1       root        1: /****************************************************************
                      2: Copyright 1990, 1991 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: 
                     24: #include "defs.h"
                     25: #include "iob.h"
                     26: 
                     27: #define MEMBSIZE       32000
                     28: #define GMEMBSIZE      16000
                     29: 
                     30:  extern void exit();
                     31: 
                     32:  char *
                     33: gmem(n, round)
                     34:  int n, round;
                     35: {
                     36:        static char *last, *next;
                     37:        char *rv;
                     38:        if (round)
                     39: #ifdef CRAY
                     40:                if ((long)next & 0xe000000000000000)
                     41:                        next = (char *)(((long)next & 0x1fffffffffffffff) + 1);
                     42: #else
                     43: #ifdef MSDOS
                     44:                if ((int)next & 1)
                     45:                        next++;
                     46: #else
                     47:                next = (char *)(((long)next + sizeof(char *)-1)
                     48:                                & ~((long)sizeof(char *)-1));
                     49: #endif
                     50: #endif
                     51:        rv = next;
                     52:        if ((next += n) > last) {
                     53:                rv = Alloc(n + GMEMBSIZE);
                     54: 
                     55:                next = rv + n;
                     56:                last = next + GMEMBSIZE;
                     57:                }
                     58:        return rv;
                     59:        }
                     60: 
                     61:  struct memblock {
                     62:        struct memblock *next;
                     63:        char buf[MEMBSIZE];
                     64:        };
                     65:  typedef struct memblock memblock;
                     66: 
                     67:  static memblock *mem0;
                     68:  memblock *curmemblock, *firstmemblock;
                     69: 
                     70:  char *mem_first, *mem_next, *mem_last, *mem0_last;
                     71: 
                     72:  void
                     73: mem_init()
                     74: {
                     75:        curmemblock = firstmemblock = mem0
                     76:                = (memblock *)Alloc(sizeof(memblock));
                     77:        mem_first = mem0->buf;
                     78:        mem_next  = mem0->buf;
                     79:        mem_last  = mem0->buf + MEMBSIZE;
                     80:        mem0_last = mem0->buf + MEMBSIZE;
                     81:        mem0->next = 0;
                     82:        }
                     83: 
                     84:  char *
                     85: mem(n, round)
                     86:  int n, round;
                     87: {
                     88:        memblock *b;
                     89:        register char *rv, *s;
                     90: 
                     91:        if (round)
                     92: #ifdef CRAY
                     93:                if ((long)mem_next & 0xe000000000000000)
                     94:                        mem_next = (char *)(((long)mem_next & 0x1fffffffffffffff) + 1);
                     95: #else
                     96: #ifdef MSDOS
                     97:                if ((int)mem_next & 1)
                     98:                        mem_next++;
                     99: #else
                    100:                mem_next = (char *)(((long)mem_next + sizeof(char *)-1)
                    101:                                & ~((long)sizeof(char *)-1));
                    102: #endif
                    103: #endif
                    104:        rv = mem_next;
                    105:        s = rv + n;
                    106:        if (s >= mem_last) {
                    107:                if (n > MEMBSIZE)  {
                    108:                        fprintf(stderr, "mem(%d) failure!\n", n);
                    109:                        exit(1);
                    110:                        }
                    111:                if (!(b = curmemblock->next)) {
                    112:                        b = (memblock *)Alloc(sizeof(memblock));
                    113:                        curmemblock->next = b;
                    114:                        b->next = 0;
                    115:                        }
                    116:                curmemblock = b;
                    117:                rv = b->buf;
                    118:                mem_last = rv + sizeof(b->buf);
                    119:                s = rv + n;
                    120:                }
                    121:        mem_next = s;
                    122:        return rv;
                    123:        }
                    124: 
                    125:  char *
                    126: tostring(s,n)
                    127:  register char *s;
                    128:  int n;
                    129: {
                    130:        register char *s1, *se, **sf;
                    131:        char *rv, *s0;
                    132:        register int k = n + 2, t;
                    133: 
                    134:        sf = str_fmt;
                    135:        sf['%'] = "%";
                    136:        s0 = s;
                    137:        se = s + n;
                    138:        for(; s < se; s++) {
                    139:                t = *(unsigned char *)s;
                    140:                s1 = sf[t];
                    141:                while(*++s1)
                    142:                        k++;
                    143:                }
                    144:        sf['%'] = "%%";
                    145:        rv = s1 = mem(k,0);
                    146:        *s1++ = '"';
                    147:        for(s = s0; s < se; s++) {
                    148:                t = *(unsigned char *)s;
                    149:                sprintf(s1, sf[t], t);
                    150:                s1 += strlen(s1);
                    151:                }
                    152:        *s1 = 0;
                    153:        return rv;
                    154:        }
                    155: 
                    156:  char *
                    157: cpstring(s)
                    158:  register char *s;
                    159: {
                    160:        return strcpy(mem(strlen(s)+1,0), s);
                    161:        }
                    162: 
                    163:  void
                    164: new_iob_data(ios, name)
                    165:  register io_setup *ios;
                    166:  char *name;
                    167: {
                    168:        register iob_data *iod;
                    169:        register char **s, **se;
                    170: 
                    171:        iod = (iob_data *)
                    172:                mem(sizeof(iob_data) + ios->nelt*sizeof(char *), 1);
                    173:        iod->next = iob_list;
                    174:        iob_list = iod;
                    175:        iod->type = ios->fields[0];
                    176:        iod->name = cpstring(name);
                    177:        s = iod->fields;
                    178:        se = s + ios->nelt;
                    179:        while(s < se)
                    180:                *s++ = "0";
                    181:        *s = 0;
                    182:        }
                    183: 
                    184:  char *
                    185: string_num(pfx, n)
                    186:  char *pfx;
                    187:  long n;
                    188: {
                    189:        char buf[32];
                    190:        sprintf(buf, "%s%ld", pfx, n);
                    191:        /* can't trust return type of sprintf -- BSD gets it wrong */
                    192:        return strcpy(mem(strlen(buf)+1,0), buf);
                    193:        }
                    194: 
                    195: static defines *define_list;
                    196: 
                    197:  void
                    198: def_start(outfile, s1, s2, post)
                    199:  FILE *outfile;
                    200:  char *s1, *s2, *post;
                    201: {
                    202:        defines *d;
                    203:        int n, n1;
                    204:        extern int in_define;
                    205: 
                    206:        n = n1 = strlen(s1);
                    207:        if (s2)
                    208:                n += strlen(s2);
                    209:        d = (defines *)mem(sizeof(defines)+n, 1);
                    210:        d->next = define_list;
                    211:        define_list = d;
                    212:        strcpy(d->defname, s1);
                    213:        if (s2)
                    214:                strcpy(d->defname + n1, s2);
                    215:        in_define = 1;
                    216:        nice_printf(outfile, "#define %s", d->defname);
                    217:        if (post)
                    218:                nice_printf(outfile, " %s", post);
                    219:        }
                    220: 
                    221:  void
                    222: other_undefs(outfile)
                    223:  FILE *outfile;
                    224: {
                    225:        defines *d;
                    226:        if (d = define_list) {
                    227:                define_list = 0;
                    228:                nice_printf(outfile, "\n");
                    229:                do
                    230:                        nice_printf(outfile, "#undef %s\n", d->defname);
                    231:                        while(d = d->next);
                    232:                nice_printf(outfile, "\n");
                    233:                }
                    234:        }

unix.superglobalmegacorp.com

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