Annotation of 43BSD/contrib/mkmf/src/rule.c, revision 1.1.1.1

1.1       root        1: /* $Header: rule.c,v 1.2 85/05/16 12:49:56 nicklin Exp $ */
                      2: 
                      3: /*
                      4:  * Author: Peter J. Nicklin
                      5:  */
                      6: #include "Mkmf.h"
                      7: #include "null.h"
                      8: #include "rule.h"
                      9: #include "slist.h"
                     10: #include "suffix.h"
                     11: #include "system.h"
                     12: #include "yesno.h"
                     13: 
                     14: #define MAXNAMLEN      255
                     15: 
                     16: static RULEBLK *Ruletab[RULETABSIZE];  /* rules table */
                     17: static SLIST *Rulelist = NULL;         /* transformation rule list */
                     18: 
                     19: /*
                     20:  * buildruletable() converts a list of transformation rules into a hash table
                     21:  * for fast lookup. Returns YES if successful, otherwise NO.
                     22:  */
                     23: buildruletable()
                     24: {
                     25:        extern char *DEFRULE[];         /* default preprocessor rules */
                     26:        int i;                          /* default rule list counter */
                     27:        int instalrule();               /* instale rule in hash table */
                     28:        SLBLK *rblk;                    /* singly-linked rulename block */
                     29: 
                     30:        /* process default rules */
                     31:        for (i = 0; DEFRULE[i] != NULL; i++)
                     32:                {
                     33:                if (instalrule(DEFRULE[i]) == NO)
                     34:                        {
                     35:                        warn("out of memory");
                     36:                        return(NO);
                     37:                        }
                     38:                }
                     39: 
                     40:        /* process rules found in makefile */
                     41:        if (Rulelist != NULL)
                     42:                {
                     43:                for (rblk = Rulelist->head; rblk != NULL; rblk = rblk->next)
                     44:                        {
                     45:                        if (instalrule(rblk->key) == NO)
                     46:                                {
                     47:                                warn("out of memory");
                     48:                                return(NO);
                     49:                                }
                     50:                        }
                     51:                }
                     52:        return(YES);
                     53: }
                     54: 
                     55: 
                     56: 
                     57: /*
                     58:  * findrule() searchs a line for a transformation rule. Returns the
                     59:  * name of the transformation rule, or NULL if not found.
                     60:  */
                     61: char *
                     62: findrule(rulename, bp)
                     63:        char *rulename;                 /* transformation rule buffer */
                     64:        register char *bp;              /* I/O buffer pointer */
                     65: { 
                     66:        register char *rp;              /* rule name pointer */
                     67:        int dotcount = 0;               /* number of '.'s in rule */
                     68: 
                     69:        for (rp = rulename; *bp != ':' && *bp != ' ' && *bp != '\t'; rp++, bp++)
                     70:                {
                     71:                if ((*rp = *bp) == '.')
                     72:                        dotcount++;
                     73:                }
                     74:        *rp = '\0';
                     75: 
                     76:        /* eat up white space between rule and ':' */
                     77:        if (*bp != ':')
                     78:                {
                     79:                while (*bp == ' ' || *bp == '\t')
                     80:                        bp++;
                     81:                if (*bp != ':')
                     82:                        return(NULL);
                     83:                }
                     84: 
                     85:        return((dotcount == 2) ? rulename : NULL);
                     86: }
                     87: 
                     88: 
                     89: 
                     90: /*
                     91:  * instalrule() installs a source transformation rule in the rule lookup
                     92:  * table. The rule table consists of a set of singly-linked lists, indexed
                     93:  * by the first character of the suffix of the target file. The index of
                     94:  * the target file is used by lookuprule() to find out the name of the file
                     95:  * from which it was derived. Returns YES if successful, otherwise NO.
                     96:  */
                     97: instalrule(rule)
                     98:        char *rule;                     /* rule to be installed in Rule table */
                     99: {
                    100:        char *malloc();                 /* memory allocator */
                    101:        char *rindex();                 /* find last occurrence of character */
                    102:        char *strsav();                 /* save a string somewhere */
                    103:        char *target;                   /* target suffix */
                    104:        int lookupsfx();                /* get suffix type */
                    105:        int ruleindex;                  /* index into rule table */
                    106:        RULEBLK *rblk;                  /* rule list block */
                    107: 
                    108:        target = rindex(rule, '.') + 1;
                    109:        if (lookupsfx(target) == SFXSRC)
                    110:                {
                    111:                ruleindex = target[0];
                    112:                if ((rblk = (RULEBLK *) malloc(sizeof(RULEBLK))) == NULL)
                    113:                        return(NO);
                    114:                if ((rblk->r_rule = strsav(rule)) == NULL)
                    115:                        return(NO);
                    116:                rblk->r_next = Ruletab[ruleindex];
                    117:                Ruletab[ruleindex] = rblk;
                    118:                }
                    119:        return(YES);
                    120: }
                    121: 
                    122: 
                    123: 
                    124: /*
                    125:  * lookuprule() applies successive transformation rules to filename, and
                    126:  * checks to see if the file exists. Returns YES if filename exists,
                    127:  * otherwise NO.
                    128:  */
                    129: lookuprule(target, source)
                    130:        char *target;                   /* name of (transformed) file */
                    131:        char *source;                   /* name of source file */
                    132: {
                    133:        register char *r;               /* rule pointer */
                    134:        register char *s;               /* source buffer pointer */
                    135:        char *rindex();                 /* find last occurrence of character */
                    136:        char *sourcesuffix;             /* source file suffix */
                    137:        char *strcpy();                 /* string copy */
                    138:        char *rulesuffix;               /* target suffix in each rule */
                    139:        char *targetsuffix;             /* transformed file suffix string */
                    140:        int ruleindex;                  /* index into rule table */
                    141:        int strcmp();                   /* string comparison */
                    142:        RULEBLK *rblk;                  /* rule list block */
                    143: 
                    144:        if ((targetsuffix = rindex(target, '.')) == NULL)
                    145:                return(NO);
                    146:        ruleindex = targetsuffix[1];
                    147:        if (Ruletab[ruleindex] != NULL)
                    148:                {
                    149:                strcpy(source, target);
                    150:                sourcesuffix = rindex(source, '.');
                    151:                for (rblk=Ruletab[ruleindex]; rblk != NULL; rblk=rblk->r_next)
                    152:                        {
                    153:                        rulesuffix = rindex(rblk->r_rule, '.');
                    154:                        if (strcmp(rulesuffix, targetsuffix) == 0)
                    155:                                {
                    156:                                r = rblk->r_rule;
                    157:                                s = sourcesuffix;
                    158:                                while (*++s = *++r)
                    159:                                        if (*s == '.')
                    160:                                                {
                    161:                                                *s = '\0';
                    162:                                                break;
                    163:                                                }
                    164:                                if (FILEXIST(source))
                    165:                                        return(YES);
                    166:                                }
                    167:                        }
                    168:                }
                    169:        return(NO);
                    170: }
                    171: 
                    172: 
                    173: 
                    174: /*
                    175:  * storerule() appends a transformation rule to the end of a singly-linked
                    176:  * list. Returns integer NO if out of memory, otherwise YES.
                    177:  */
                    178: storerule(rulename)
                    179:        char *rulename;                 /* transformation rule name */
                    180: {
                    181:        char *slappend();               /* append rule to list */
                    182:        SLIST *slinit();                /* initialize transformation list */
                    183: 
                    184:        if (Rulelist == NULL)
                    185:                Rulelist = slinit();
                    186:        if (slappend(rulename, Rulelist) == NULL)
                    187:                return(NO);
                    188:        return(YES);
                    189: }

unix.superglobalmegacorp.com

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