|
|
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.