|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)mkheaders.c 5.5 (Berkeley) 6/18/88"; ! 20: #endif /* not lint */ ! 21: ! 22: /* ! 23: * Make all the .h files for the optional entries ! 24: */ ! 25: ! 26: #include <stdio.h> ! 27: #include <ctype.h> ! 28: #include "config.h" ! 29: #include "y.tab.h" ! 30: ! 31: headers() ! 32: { ! 33: register struct file_list *fl; ! 34: ! 35: for (fl = ftab; fl != 0; fl = fl->f_next) ! 36: if (fl->f_needs != 0) ! 37: do_count(fl->f_needs, fl->f_needs, 1); ! 38: } ! 39: ! 40: /* ! 41: * count all the devices of a certain type and recurse to count ! 42: * whatever the device is connected to ! 43: */ ! 44: do_count(dev, hname, search) ! 45: register char *dev, *hname; ! 46: int search; ! 47: { ! 48: register struct device *dp, *mp; ! 49: register int count; ! 50: ! 51: for (count = 0,dp = dtab; dp != 0; dp = dp->d_next) ! 52: if (dp->d_unit != -1 && eq(dp->d_name, dev)) { ! 53: if (dp->d_type == PSEUDO_DEVICE) { ! 54: count = ! 55: dp->d_slave != UNKNOWN ? dp->d_slave : 1; ! 56: break; ! 57: } ! 58: count++; ! 59: /* ! 60: * Allow holes in unit numbering, ! 61: * assumption is unit numbering starts ! 62: * at zero. ! 63: */ ! 64: if (dp->d_unit + 1 > count) ! 65: count = dp->d_unit + 1; ! 66: if (search) { ! 67: mp = dp->d_conn; ! 68: if (mp != 0 && mp != TO_NEXUS && ! 69: mp->d_conn != 0 && mp->d_conn != TO_NEXUS) { ! 70: do_count(mp->d_name, hname, 0); ! 71: search = 0; ! 72: } ! 73: } ! 74: } ! 75: do_header(dev, hname, count); ! 76: } ! 77: ! 78: do_header(dev, hname, count) ! 79: char *dev, *hname; ! 80: int count; ! 81: { ! 82: char *file, *name, *inw, *toheader(), *tomacro(); ! 83: struct file_list *fl, *fl_head; ! 84: FILE *inf, *outf; ! 85: int inc, oldcount; ! 86: ! 87: file = toheader(hname); ! 88: name = tomacro(dev); ! 89: inf = fopen(file, "r"); ! 90: oldcount = -1; ! 91: if (inf == 0) { ! 92: outf = fopen(file, "w"); ! 93: if (outf == 0) { ! 94: perror(file); ! 95: exit(1); ! 96: } ! 97: fprintf(outf, "#define %s %d\n", name, count); ! 98: (void) fclose(outf); ! 99: return; ! 100: } ! 101: fl_head = 0; ! 102: for (;;) { ! 103: char *cp; ! 104: if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) ! 105: break; ! 106: if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) ! 107: break; ! 108: inw = ns(inw); ! 109: cp = get_word(inf); ! 110: if (cp == 0 || cp == (char *)EOF) ! 111: break; ! 112: inc = atoi(cp); ! 113: if (eq(inw, name)) { ! 114: oldcount = inc; ! 115: inc = count; ! 116: } ! 117: cp = get_word(inf); ! 118: if (cp == (char *)EOF) ! 119: break; ! 120: fl = (struct file_list *) malloc(sizeof *fl); ! 121: fl->f_fn = inw; ! 122: fl->f_type = inc; ! 123: fl->f_next = fl_head; ! 124: fl_head = fl; ! 125: } ! 126: (void) fclose(inf); ! 127: if (count == oldcount) { ! 128: for (fl = fl_head; fl != 0; fl = fl->f_next) ! 129: free((char *)fl); ! 130: return; ! 131: } ! 132: if (oldcount == -1) { ! 133: fl = (struct file_list *) malloc(sizeof *fl); ! 134: fl->f_fn = name; ! 135: fl->f_type = count; ! 136: fl->f_next = fl_head; ! 137: fl_head = fl; ! 138: } ! 139: outf = fopen(file, "w"); ! 140: if (outf == 0) { ! 141: perror(file); ! 142: exit(1); ! 143: } ! 144: for (fl = fl_head; fl != 0; fl = fl->f_next) { ! 145: fprintf(outf, "#define %s %u\n", ! 146: fl->f_fn, count ? fl->f_type : 0); ! 147: free((char *)fl); ! 148: } ! 149: (void) fclose(outf); ! 150: } ! 151: ! 152: /* ! 153: * convert a dev name to a .h file name ! 154: */ ! 155: char * ! 156: toheader(dev) ! 157: char *dev; ! 158: { ! 159: static char hbuf[80]; ! 160: ! 161: (void) strcpy(hbuf, path(dev)); ! 162: (void) strcat(hbuf, ".h"); ! 163: return (hbuf); ! 164: } ! 165: ! 166: /* ! 167: * convert a dev name to a macro name ! 168: */ ! 169: char *tomacro(dev) ! 170: register char *dev; ! 171: { ! 172: static char mbuf[20]; ! 173: register char *cp; ! 174: ! 175: cp = mbuf; ! 176: *cp++ = 'N'; ! 177: while (*dev) ! 178: *cp++ = toupper(*dev++); ! 179: *cp++ = 0; ! 180: return (mbuf); ! 181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.