|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.