|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)mkheaders.c 1.14 (Berkeley) 8/11/83"; ! 3: #endif ! 4: ! 5: /* ! 6: * Make all the .h files for the optional entries ! 7: */ ! 8: ! 9: #include <stdio.h> ! 10: #include <ctype.h> ! 11: #include "config.h" ! 12: #include "y.tab.h" ! 13: ! 14: headers() ! 15: { ! 16: register struct file_list *fl; ! 17: ! 18: for (fl = ftab; fl != 0; fl = fl->f_next) ! 19: if (fl->f_needs != 0) ! 20: do_count(fl->f_needs, fl->f_needs, 1); ! 21: } ! 22: ! 23: /* ! 24: * count all the devices of a certain type and recurse to count ! 25: * whatever the device is connected to ! 26: */ ! 27: do_count(dev, hname, search) ! 28: register char *dev, *hname; ! 29: int search; ! 30: { ! 31: register struct device *dp, *mp; ! 32: register int count; ! 33: ! 34: for (count = 0,dp = dtab; dp != 0; dp = dp->d_next) ! 35: if (dp->d_unit != -1 && eq(dp->d_name, dev)) { ! 36: if (dp->d_type == PSEUDO_DEVICE) { ! 37: count = ! 38: dp->d_slave != UNKNOWN ? dp->d_slave : 1; ! 39: break; ! 40: } ! 41: count++; ! 42: /* ! 43: * Allow holes in unit numbering, ! 44: * assumption is unit numbering starts ! 45: * at zero. ! 46: */ ! 47: if (dp->d_unit + 1 > count) ! 48: count = dp->d_unit + 1; ! 49: if (search) { ! 50: mp = dp->d_conn; ! 51: if (mp != 0 && mp != (struct device *)-1 && ! 52: mp->d_conn != (struct device *)-1) { ! 53: do_count(mp->d_name, hname, 0); ! 54: search = 0; ! 55: } ! 56: } ! 57: } ! 58: do_header(dev, hname, count); ! 59: } ! 60: ! 61: do_header(dev, hname, count) ! 62: char *dev, *hname; ! 63: int count; ! 64: { ! 65: char *file, *name, *inw, *toheader(), *tomacro(); ! 66: struct file_list *fl, *fl_head; ! 67: FILE *inf, *outf; ! 68: int inc, oldcount; ! 69: ! 70: file = toheader(hname); ! 71: name = tomacro(dev); ! 72: inf = fopen(file, "r"); ! 73: oldcount = -1; ! 74: if (inf == 0) { ! 75: outf = fopen(file, "w"); ! 76: if (outf == 0) { ! 77: perror(file); ! 78: exit(1); ! 79: } ! 80: fprintf(outf, "#define %s %d\n", name, count); ! 81: (void) fclose(outf); ! 82: return; ! 83: } ! 84: fl_head = 0; ! 85: for (;;) { ! 86: char *cp; ! 87: if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) ! 88: break; ! 89: if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) ! 90: break; ! 91: inw = ns(inw); ! 92: cp = get_word(inf); ! 93: if (cp == 0 || cp == (char *)EOF) ! 94: break; ! 95: inc = atoi(cp); ! 96: if (eq(inw, name)) { ! 97: oldcount = inc; ! 98: inc = count; ! 99: } ! 100: cp = get_word(inf); ! 101: if (cp == (char *)EOF) ! 102: break; ! 103: fl = (struct file_list *) malloc(sizeof *fl); ! 104: fl->f_fn = inw; ! 105: fl->f_type = inc; ! 106: fl->f_next = fl_head; ! 107: fl_head = fl; ! 108: } ! 109: (void) fclose(inf); ! 110: if (count == oldcount) { ! 111: for (fl = fl_head; fl != 0; fl = fl->f_next) ! 112: free((char *)fl); ! 113: return; ! 114: } ! 115: if (oldcount == -1) { ! 116: fl = (struct file_list *) malloc(sizeof *fl); ! 117: fl->f_fn = name; ! 118: fl->f_type = count; ! 119: fl->f_next = fl_head; ! 120: fl_head = fl; ! 121: } ! 122: outf = fopen(file, "w"); ! 123: if (outf == 0) { ! 124: perror(file); ! 125: exit(1); ! 126: } ! 127: for (fl = fl_head; fl != 0; fl = fl->f_next) { ! 128: fprintf(outf, "#define %s %d\n", ! 129: fl->f_fn, count ? fl->f_type : 0); ! 130: free((char *)fl); ! 131: } ! 132: (void) fclose(outf); ! 133: } ! 134: ! 135: /* ! 136: * convert a dev name to a .h file name ! 137: */ ! 138: char * ! 139: toheader(dev) ! 140: char *dev; ! 141: { ! 142: static char hbuf[80]; ! 143: ! 144: (void) strcpy(hbuf, path(dev)); ! 145: (void) strcat(hbuf, ".h"); ! 146: return (hbuf); ! 147: } ! 148: ! 149: /* ! 150: * convert a dev name to a macro name ! 151: */ ! 152: char *tomacro(dev) ! 153: register char *dev; ! 154: { ! 155: static char mbuf[20]; ! 156: register char *cp; ! 157: ! 158: cp = mbuf; ! 159: *cp++ = 'N'; ! 160: while (*dev) ! 161: *cp++ = toupper(*dev++); ! 162: *cp++ = 0; ! 163: return (mbuf); ! 164: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.