Annotation of 43BSD/contrib/mkmf/src/macro.c, revision 1.1

1.1     ! root        1: /* $Header: macro.c,v 1.3 85/05/02 07:53:52 nicklin Exp $ */
        !             2: 
        !             3: /*
        !             4:  * Author: Peter J. Nicklin
        !             5:  */
        !             6: #include <ctype.h>
        !             7: #include <stdio.h>
        !             8: #include "Mkmf.h"
        !             9: #include "hash.h"
        !            10: #include "macro.h"
        !            11: #include "null.h"
        !            12: #include "slist.h"
        !            13: #include "yesno.h"
        !            14: 
        !            15: extern char IOBUF[];                   /* I/O buffer line */
        !            16: 
        !            17: /*
        !            18:  * findmacro() searchs a line for a macro definition. Returns the name,
        !            19:  * or null if not found.
        !            20:  */
        !            21: char *
        !            22: findmacro(macroname, bp)
        !            23:        char *macroname;                /* macro name receiving buffer */
        !            24:        register char *bp;              /* buffer pointer */
        !            25: {
        !            26:        register char *mp;              /* macro name pointer */
        !            27: 
        !            28:        mp = macroname;
        !            29:        while(isalnum(*bp))
        !            30:                *mp++ = *bp++;
        !            31:        *mp = '\0';
        !            32:        while(*bp == ' ' || *bp == '\t')
        !            33:                bp++;
        !            34:        if (*bp != '=')
        !            35:                return(NULL);
        !            36:        return(macroname);
        !            37: }
        !            38:        
        !            39: 
        !            40: 
        !            41: /*
        !            42:  * getmacro() loads the body of a macro definition into mdefbuf and returns
        !            43:  * a pointer to mdefbuf. If the macro definition continues on more than
        !            44:  * one line further lines are fetched from the input stream.
        !            45:  */
        !            46: char *
        !            47: getmacro(mdefbuf, stream)
        !            48:        char *mdefbuf;                  /* receiving macro definition buffer */
        !            49:        FILE *stream;                   /* input stream */
        !            50: {
        !            51:        extern short CONTINUE;          /* does the line continue? */
        !            52:        char *getlin();                 /* get a line from input stream */
        !            53:        register char *bp;              /* buffer pointer */
        !            54:        register char *mp;              /* macro definition buffer pointer */
        !            55: 
        !            56:        bp = IOBUF;
        !            57:        mp = mdefbuf;
        !            58:        while (*bp++ != '=')
        !            59:                continue;
        !            60:        if (WHITESPACE(*bp))
        !            61:                bp++;
        !            62:        while (*bp != '\0')
        !            63:                *mp++ = *bp++;
        !            64:        while (CONTINUE == YES)
        !            65:                {
        !            66:                *mp++ = ' ';
        !            67:                if (getlin(stream) == NULL)
        !            68:                        break;
        !            69:                bp = IOBUF;
        !            70:                while (*bp != '\0')
        !            71:                        *mp++ = *bp++;
        !            72:                }
        !            73:        *mp = '\0';
        !            74:        return(mdefbuf);
        !            75: }
        !            76: 
        !            77: 
        !            78: 
        !            79: /*
        !            80:  * putmacro() prints a macro definition from the macro definition table.
        !            81:  */
        !            82: void
        !            83: putmacro(macrovalue, stream)
        !            84:        char *macrovalue;               /* value of macro definition */
        !            85:        register FILE *stream;          /* output stream */
        !            86: {
        !            87:        register char *iop;             /* IOBUF pointer */
        !            88:        register int c;                 /* current character */
        !            89: 
        !            90:        iop = IOBUF;
        !            91:        while ((c = *iop++) != '=')
        !            92:                putc(c, stream);
        !            93:        fprintf(stream, "= %s\n", macrovalue);
        !            94: }
        !            95: 
        !            96: 
        !            97: 
        !            98: /*
        !            99:  * putobjmacro() derives and prints object file names from the SRCLIST list.
        !           100:  */
        !           101: void
        !           102: putobjmacro(stream)
        !           103:        register FILE *stream;          /* output stream */
        !           104: {
        !           105:        extern SLIST *SRCLIST;          /* source file name list */
        !           106:        register char *iop;             /* IOBUF pointer */
        !           107:        register int c;                 /* current character */
        !           108:        char *rindex();                 /* find last occurrence of character */
        !           109:        char *suffix;                   /* suffix pointer */
        !           110:        HASHBLK *lookupinclude();       /* look up include name in hash table */
        !           111:        int cnt = 0;                    /* number of object filenames printed */
        !           112:        int lookuptypeofinclude();      /* look up the brand of include */
        !           113:        int type;                       /* file type */
        !           114:        SLBLK *lbp;                     /* list block pointer */
        !           115:        void putobj();                  /* print object file name */
        !           116: 
        !           117:        iop = IOBUF;
        !           118:        while ((c = *iop++) != '=')
        !           119:                putc(c, stream);
        !           120:        putc('=', stream);
        !           121:        for (lbp = SRCLIST->head; lbp != NULL; lbp = lbp->next)
        !           122:                {
        !           123:                suffix = rindex(lbp->key, '.');
        !           124:                type = lookuptypeofinclude(++suffix);
        !           125:                if (lookupinclude(lbp->key, type) == NULL)
        !           126:                        {
        !           127:                        cnt += 1;
        !           128:                        if (cnt == 1)
        !           129:                                {
        !           130:                                putc(' ', stream);
        !           131:                                putobj(lbp->key, stream);
        !           132:                                }
        !           133:                        else    {
        !           134:                                fprintf(stream, " \\\n\t\t");
        !           135:                                putobj(lbp->key, stream);
        !           136:                                }
        !           137:                        }
        !           138:                }
        !           139:        putc('\n', stream);
        !           140: }
        !           141: 
        !           142: 
        !           143: 
        !           144: /*
        !           145:  * putslmacro() copies a macro definition from a list.
        !           146:  */
        !           147: void
        !           148: putslmacro(slist, stream)
        !           149:        SLIST *slist;                   /* singly-linked macro def list */
        !           150:        register FILE *stream;          /* output stream */
        !           151: {
        !           152:        register char *iop;             /* IOBUF pointer */
        !           153:        register int c;                 /* current character */
        !           154:        SLBLK *lbp;                     /* list block pointer */
        !           155: 
        !           156:        iop = IOBUF;
        !           157:        while ((c = *iop++) != '=')
        !           158:                putc(c, stream);
        !           159:        putc('=', stream);
        !           160:        if (SLNUM(slist) > 0)
        !           161:                {
        !           162:                lbp = slist->head;
        !           163:                fprintf(stream, " %s", lbp->key);
        !           164:                }
        !           165:        if (SLNUM(slist) > 1)
        !           166:                for (lbp = lbp->next; lbp != NULL; lbp = lbp->next)
        !           167:                        fprintf(stream, " \\\n\t\t%s", lbp->key);
        !           168:        putc('\n', stream);
        !           169: }
        !           170: 
        !           171: 
        !           172: 
        !           173: /*
        !           174:  * storemacro() stores a macro definition in the macro definition table.
        !           175:  * Returns integer YES if a macro definition (macro=definition), otherwise
        !           176:  * NO. exit(1) is called if out of memory.
        !           177:  */
        !           178: storemacro(macdef)
        !           179:        char *macdef;                   /* macro definition string */
        !           180: {
        !           181:        extern HASH *MDEFTABLE;         /* macro definition table */
        !           182:        register int i;                 /* macro value index */
        !           183:        register int j;                 /* macro name index */
        !           184:        HASHBLK *htinstall();           /* install hash table entry */
        !           185: 
        !           186:        for (i = 0; macdef[i] != '='; i++)
        !           187:                if (macdef[i] == '\0')
        !           188:                        return(NO);
        !           189:        
        !           190:        /* removing trailing blanks and tabs from end of macro name */
        !           191:        for (j = i; j > 0; j--)
        !           192:                if (!WHITESPACE(macdef[j-1]))
        !           193:                        break;
        !           194:        macdef[j] = '\0';
        !           195: 
        !           196:        /* remove leading blanks and tabs from macro value */
        !           197:        for (i++; WHITESPACE(macdef[i]); i++)
        !           198:                continue;
        !           199:        if (htinstall(macdef, macdef+i, VREADWRITE, MDEFTABLE) == NULL)
        !           200:                exit(1);
        !           201:        return(YES);
        !           202: }

unix.superglobalmegacorp.com

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