Annotation of 43BSDReno/contrib/isode-beta/pepsy/dfns.c, revision 1.1

1.1     ! root        1: /* dfns.c */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/pepsy/RCS/dfns.c,v 7.0 90/07/01 19:54:14 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/pepsy/RCS/dfns.c,v 7.0 90/07/01 19:54:14 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       dfns.c,v $
        !            12:  * Revision 7.0  90/07/01  19:54:14  mrose
        !            13:  * *** empty log message ***
        !            14:  * 
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  *                               NOTICE
        !            19:  *
        !            20:  *    Acquisition, use, and distribution of this module and related
        !            21:  *    materials are subject to the restrictions of a license agreement.
        !            22:  *    Consult the Preface in the User's Manual for the full terms of
        !            23:  *    this agreement.
        !            24:  *
        !            25:  */
        !            26: 
        !            27: 
        !            28: #include <stdio.h>
        !            29: #include "general.h"
        !            30: #include "mine.h"
        !            31: #include "pass2.h"
        !            32: 
        !            33: id_entry *id_table[TABLESIZE];
        !            34: 
        !            35: #define my_error(mesg) (fprintf(stderr, "%s\n",mesg),exit(1))
        !            36: 
        !            37: extern char *notidtoid(), *my_new_str(), *my_strcat();
        !            38: extern char *
        !            39: proc_name(), *mymodule;
        !            40: 
        !            41: /*
        !            42:  * Lookup the hash table (id_table) for the string t and insert it at
        !            43:  * the start of the appropriate chain if it is not already there.
        !            44:  * The argument flag indicates whether t is being defined (1) or used
        !            45:  * (0).
        !            46:  */
        !            47: char   *
        !            48: proc_name(t, flag)
        !            49: char   *t;
        !            50: int     flag;
        !            51: {
        !            52:     int     i;
        !            53:     static int curr = 0;
        !            54:     id_entry *ptr;
        !            55: 
        !            56:     i = hash_val(t);
        !            57:     for (ptr = id_table[i]; ptr != NULL && strcmp(t, ptr->h_value); ptr = ptr->next);
        !            58: 
        !            59:     if (ptr == NULL) {
        !            60:        if ((ptr = (id_entry *) malloc(sizeof(id_entry))) == NULL)
        !            61:            my_error("proc_name: Out of memory");
        !            62:        ptr->h_value = t;
        !            63:        ptr->r_value = my_strcat(notidtoid(t), notidtoid(mymodule));
        !            64:        ptr->count = 1;
        !            65:        if (flag) {
        !            66:            ptr->def_bit = flag;
        !            67:            ptr->def_value = curr++;
        !            68:        }
        !            69:        ptr->next = id_table[i];
        !            70:        id_table[i] = ptr;
        !            71:     } else if (!ptr->def_bit)
        !            72:        ptr->def_bit = flag;
        !            73: 
        !            74:     return ptr->r_value;
        !            75: }
        !            76: 
        !            77: /*
        !            78:  * output a sequence of #define statements (one for each value stored
        !            79:  * in the hash table) to the file specified by fp
        !            80:  */
        !            81: out_final_defs(fp)
        !            82: FILE   *fp;
        !            83: {
        !            84:     int     j;
        !            85:     id_entry *ptr;
        !            86: 
        !            87:     for (j = 0; j < TABLESIZE; j++)
        !            88:        for (ptr = id_table[j]; ptr != NULL; ptr = ptr->next) {
        !            89:            if (ptr->def_bit)
        !            90:                (void) fprintf(fp, "#define %s%s\t%d\n", PREFIX, ptr->r_value, ptr->def_value);
        !            91:            else
        !            92:                ferrs(0, "the identifier %s is used but not defined\n", ptr->h_value);
        !            93:            if (ptr->count > 1) /* not used */
        !            94:                (void) printf("The id %s has a count of %d\n", ptr->r_value, ptr->count);
        !            95:        }
        !            96: }
        !            97: 
        !            98: /*
        !            99:  * return a copy of the string s with '-' replaced by '_'
        !           100:  */
        !           101: char   *
        !           102: notidtoid(s)
        !           103: char   *s;
        !           104: {
        !           105: 
        !           106:     char   *t, *r;
        !           107: 
        !           108:     t = my_new_str(s);
        !           109:     for (r = t; *r != '\0'; r++)
        !           110:        if (*r == '-')
        !           111:            *r = '_';
        !           112:     return t;
        !           113: }
        !           114: 
        !           115: /*
        !           116:  * return a copy of the string s
        !           117:  */
        !           118: char   *
        !           119: my_new_str(s)
        !           120: char   *s;
        !           121: {
        !           122: 
        !           123:     char   *t;
        !           124: 
        !           125:     if ((t = (char *) malloc(strlen(s) + 1)) == NULL)
        !           126:        my_error("my_new_str: Out of memory");
        !           127: 
        !           128:     strcpy(t, s);
        !           129:     return t;
        !           130: }
        !           131: 
        !           132: /*
        !           133:  * return the concatenation of the strings s1 and s2
        !           134:  */
        !           135: char   *
        !           136: my_strcat(s1, s2)
        !           137: char   *s1, *s2;
        !           138: {
        !           139:     char   *s3, *s, *t;
        !           140: 
        !           141:     if (s1 == NULL || *s1 == '\0')
        !           142:        return my_new_str(s2);
        !           143: 
        !           144:     if ((s3 = (char *) malloc(strlen(s1) + strlen(s2) + 1)) == NULL)
        !           145:        my_error("my_strcat: Out of memory");
        !           146: 
        !           147:     for (s = s1, t = s3; *s != '\0'; s++, t++)
        !           148:        *t = *s;
        !           149:     strcpy(t, s2);
        !           150:     return s3;
        !           151: }
        !           152: 
        !           153: /*
        !           154:  * a simple hash function
        !           155:  */
        !           156: hash_val(s)
        !           157: char   *s;
        !           158: {
        !           159:     int     i, sum;
        !           160:     char   *t;
        !           161: 
        !           162:     sum = 0;
        !           163:     for (i = 1, t = s; *t != '\0'; i++, t++)
        !           164:        sum = sum + *t * i;
        !           165:     return (sum % TABLESIZE);
        !           166: }
        !           167: 
        !           168: /*
        !           169:  * initialize the table id_table
        !           170:  */
        !           171: init()
        !           172: {
        !           173:     int     i;
        !           174: 
        !           175:     for (i = 0; i <= TABLESIZE; i++)
        !           176:        id_table[i] = NULL;
        !           177: }
        !           178: #define BUFSIZE                128
        !           179: #define MAX(a, b)      ((a) > (b) ? (a) : (b))
        !           180: 
        !           181: static char *buf = NULL;
        !           182: static int len = 0;
        !           183: 
        !           184: /*
        !           185:  * Return in a static buffer the two strings concatenated
        !           186:  */
        !           187: char   *
        !           188: concat(s1, s2)
        !           189: char   *s1, *s2;
        !           190: {
        !           191:     int     tot;
        !           192: 
        !           193:     tot = strlen(s1) + strlen(s2) + 1;
        !           194: 
        !           195:     if (tot > len) {
        !           196:        len = MAX(BUFSIZE, tot);
        !           197:        if (buf == NULL) {
        !           198:            if ((buf = malloc(len)) == NULL)
        !           199:                ferr(1, "concat:malloc failed\n");
        !           200:        } else if ((buf = realloc(buf, len)) == NULL)
        !           201:            ferr(1, "concat:realloc failed\n");
        !           202:     }
        !           203:     strcpy(buf, s1);
        !           204:     strcat(buf, s2);
        !           205: 
        !           206:     return (buf);
        !           207: }
        !           208: 
        !           209: /*
        !           210:  * Generate a free call given the name of the parameter, the module
        !           211:  * name, and the name of the type
        !           212:  */
        !           213: char   *
        !           214: gfree(module, id, parm)
        !           215: char   *module;                        /* name of module we are in (usually
        !           216:                                 * mymodule) */
        !           217: char   *id;                    /* name of type we want to free */
        !           218: char   *parm;                  /* name of the pointer to the data */
        !           219: {
        !           220:     char   *p1 = notidtoid(module);
        !           221:     char   *p2 = notidtoid(id);
        !           222: 
        !           223:     if (buf == NULL) {
        !           224:        if ((buf = malloc(BUFSIZE)) == NULL)
        !           225:            ferr(1, "gfree:malloc failed\n");
        !           226:        len = BUFSIZ;
        !           227:     }
        !           228:     (void) sprintf(buf, "fre_obj((char *) %s, %s%s%s.md_dtab[%s%s%s], &%s%s%s)",
        !           229:            parm,
        !           230:            PREFIX, p1, MODTYP_SUFFIX,
        !           231:            PREFIX, p2, p1,
        !           232:            PREFIX, p1, MODTYP_SUFFIX);
        !           233:     free(p1);
        !           234:     free(p2);
        !           235: 
        !           236:     return (buf);
        !           237: }

unix.superglobalmegacorp.com

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