1dea673e9SRodney W. Grimes /* 2dea673e9SRodney W. Grimes * Copyright (c) 1980, 1993 3dea673e9SRodney W. Grimes * The Regents of the University of California. All rights reserved. 4dea673e9SRodney W. Grimes * 5dea673e9SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 6dea673e9SRodney W. Grimes * modification, are permitted provided that the following conditions 7dea673e9SRodney W. Grimes * are met: 8dea673e9SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 9dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 10dea673e9SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 11dea673e9SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 12dea673e9SRodney W. Grimes * documentation and/or other materials provided with the distribution. 13dea673e9SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 14dea673e9SRodney W. Grimes * must display the following acknowledgement: 15dea673e9SRodney W. Grimes * This product includes software developed by the University of 16dea673e9SRodney W. Grimes * California, Berkeley and its contributors. 17dea673e9SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 18dea673e9SRodney W. Grimes * may be used to endorse or promote products derived from this software 19dea673e9SRodney W. Grimes * without specific prior written permission. 20dea673e9SRodney W. Grimes * 21dea673e9SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22dea673e9SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23dea673e9SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24dea673e9SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25dea673e9SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26dea673e9SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27dea673e9SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28dea673e9SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29dea673e9SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30dea673e9SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31dea673e9SRodney W. Grimes * SUCH DAMAGE. 32dea673e9SRodney W. Grimes */ 33dea673e9SRodney W. Grimes 34dea673e9SRodney W. Grimes #ifndef lint 35d5831691SPhilippe Charnier #if 0 36dea673e9SRodney W. Grimes static char sccsid[] = "@(#)mkheaders.c 8.1 (Berkeley) 6/6/93"; 37d5831691SPhilippe Charnier #endif 38d5831691SPhilippe Charnier static const char rcsid[] = 3997d92980SPeter Wemm "$FreeBSD$"; 40dea673e9SRodney W. Grimes #endif /* not lint */ 41dea673e9SRodney W. Grimes 42dea673e9SRodney W. Grimes /* 43dea673e9SRodney W. Grimes * Make all the .h files for the optional entries 44dea673e9SRodney W. Grimes */ 45dea673e9SRodney W. Grimes 46d5831691SPhilippe Charnier #include <ctype.h> 47d5831691SPhilippe Charnier #include <err.h> 48dea673e9SRodney W. Grimes #include <stdio.h> 495bd7b809SJoerg Wunsch #include <string.h> 50dea673e9SRodney W. Grimes #include "config.h" 511d95dc91SPoul-Henning Kamp #include "y.tab.h" 52dea673e9SRodney W. Grimes 53188334f6SPeter Wemm static void do_header __P((char *, char *, int)); 54188334f6SPeter Wemm static void do_count __P((char *, char *, int)); 55188334f6SPeter Wemm static char *toheader __P((char *)); 56188334f6SPeter Wemm static char *tomacro __P((char *)); 57d5831691SPhilippe Charnier 58d5831691SPhilippe Charnier void 59dea673e9SRodney W. Grimes headers() 60dea673e9SRodney W. Grimes { 61dea673e9SRodney W. Grimes register struct file_list *fl; 62cea24a2bSJoerg Wunsch struct device *dp; 63dea673e9SRodney W. Grimes 64dea673e9SRodney W. Grimes for (fl = ftab; fl != 0; fl = fl->f_next) 65dea673e9SRodney W. Grimes if (fl->f_needs != 0) 66dea673e9SRodney W. Grimes do_count(fl->f_needs, fl->f_needs, 1); 67ed7e72e6SPeter Wemm for (dp = dtab; dp != 0; dp = dp->d_next) { 68cea24a2bSJoerg Wunsch if ((dp->d_type & TYPEMASK) == PSEUDO_DEVICE) { 69cea24a2bSJoerg Wunsch if (!(dp->d_type & DEVDONE)) 70cea24a2bSJoerg Wunsch printf("Warning: pseudo-device \"%s\" is unknown\n", 71cea24a2bSJoerg Wunsch dp->d_name); 72cea24a2bSJoerg Wunsch else 73cea24a2bSJoerg Wunsch dp->d_type &= TYPEMASK; 74cea24a2bSJoerg Wunsch } 75ed7e72e6SPeter Wemm if ((dp->d_type & TYPEMASK) == DEVICE) { 76ed7e72e6SPeter Wemm if (!(dp->d_type & DEVDONE)) 77ed7e72e6SPeter Wemm printf("Warning: device \"%s\" is unknown\n", 78ed7e72e6SPeter Wemm dp->d_name); 79ed7e72e6SPeter Wemm else 80ed7e72e6SPeter Wemm dp->d_type &= TYPEMASK; 81ed7e72e6SPeter Wemm } 82952017beSPeter Wemm if ((dp->d_type & TYPEMASK) == CONTROLLER) { 83952017beSPeter Wemm if (!(dp->d_type & DEVDONE)) 84952017beSPeter Wemm printf("Warning: controller \"%s\" is unknown\n", 85952017beSPeter Wemm dp->d_name); 86952017beSPeter Wemm else 87952017beSPeter Wemm dp->d_type &= TYPEMASK; 88952017beSPeter Wemm } 89ed7e72e6SPeter Wemm } 90dea673e9SRodney W. Grimes } 91dea673e9SRodney W. Grimes 92dea673e9SRodney W. Grimes /* 93dea673e9SRodney W. Grimes * count all the devices of a certain type and recurse to count 94dea673e9SRodney W. Grimes * whatever the device is connected to 95dea673e9SRodney W. Grimes */ 96188334f6SPeter Wemm static void 97dea673e9SRodney W. Grimes do_count(dev, hname, search) 98dea673e9SRodney W. Grimes register char *dev, *hname; 99dea673e9SRodney W. Grimes int search; 100dea673e9SRodney W. Grimes { 101dea673e9SRodney W. Grimes register struct device *dp, *mp; 102dea673e9SRodney W. Grimes register int count, hicount; 103dea673e9SRodney W. Grimes 104dea673e9SRodney W. Grimes /* 105dea673e9SRodney W. Grimes * After this loop, "count" will be the actual number of units, 106dea673e9SRodney W. Grimes * and "hicount" will be the highest unit declared. do_header() 107dea673e9SRodney W. Grimes * must use this higher of these values. 108dea673e9SRodney W. Grimes */ 109952017beSPeter Wemm for (hicount = count = 0, dp = dtab; dp != 0; dp = dp->d_next) { 110952017beSPeter Wemm if (eq(dp->d_name, dev)) { 111952017beSPeter Wemm if ((dp->d_type & TYPEMASK) == PSEUDO_DEVICE) 112952017beSPeter Wemm dp->d_type |= DEVDONE; 113952017beSPeter Wemm else if ((dp->d_type & TYPEMASK) == DEVICE) 114952017beSPeter Wemm dp->d_type |= DEVDONE; 115952017beSPeter Wemm else if ((dp->d_type & TYPEMASK) == CONTROLLER) 116952017beSPeter Wemm dp->d_type |= DEVDONE; 117952017beSPeter Wemm } 118dea673e9SRodney W. Grimes if (dp->d_unit != -1 && eq(dp->d_name, dev)) { 1198518c081SJoerg Wunsch if ((dp->d_type & TYPEMASK) == PSEUDO_DEVICE) { 120dea673e9SRodney W. Grimes count = 1211c56dc36SPeter Wemm dp->d_count != UNKNOWN ? dp->d_count : 1; 122dea673e9SRodney W. Grimes break; 123dea673e9SRodney W. Grimes } 124dea673e9SRodney W. Grimes count++; 125dea673e9SRodney W. Grimes /* 126dea673e9SRodney W. Grimes * Allow holes in unit numbering, 127dea673e9SRodney W. Grimes * assumption is unit numbering starts 128dea673e9SRodney W. Grimes * at zero. 129dea673e9SRodney W. Grimes */ 130dea673e9SRodney W. Grimes if (dp->d_unit + 1 > hicount) 131dea673e9SRodney W. Grimes hicount = dp->d_unit + 1; 132dea673e9SRodney W. Grimes if (search) { 133dea673e9SRodney W. Grimes mp = dp->d_conn; 134dea673e9SRodney W. Grimes if (mp != 0 && mp != TO_NEXUS && 135dea673e9SRodney W. Grimes mp->d_conn != 0 && mp->d_conn != TO_NEXUS) { 136dea673e9SRodney W. Grimes do_count(mp->d_name, hname, 0); 137dea673e9SRodney W. Grimes search = 0; 138dea673e9SRodney W. Grimes } 139dea673e9SRodney W. Grimes } 140dea673e9SRodney W. Grimes } 141952017beSPeter Wemm } 142dea673e9SRodney W. Grimes do_header(dev, hname, count > hicount ? count : hicount); 143dea673e9SRodney W. Grimes } 144dea673e9SRodney W. Grimes 145188334f6SPeter Wemm static void 146dea673e9SRodney W. Grimes do_header(dev, hname, count) 147dea673e9SRodney W. Grimes char *dev, *hname; 148dea673e9SRodney W. Grimes int count; 149dea673e9SRodney W. Grimes { 150188334f6SPeter Wemm char *file, *name, *inw; 151dea673e9SRodney W. Grimes struct file_list *fl, *fl_head, *tflp; 152dea673e9SRodney W. Grimes FILE *inf, *outf; 153dea673e9SRodney W. Grimes int inc, oldcount; 154dea673e9SRodney W. Grimes 155dea673e9SRodney W. Grimes file = toheader(hname); 156dea673e9SRodney W. Grimes name = tomacro(dev); 157dea673e9SRodney W. Grimes inf = fopen(file, "r"); 158dea673e9SRodney W. Grimes oldcount = -1; 159dea673e9SRodney W. Grimes if (inf == 0) { 160dea673e9SRodney W. Grimes outf = fopen(file, "w"); 161d5831691SPhilippe Charnier if (outf == 0) 162d5831691SPhilippe Charnier err(1, "%s", file); 163dea673e9SRodney W. Grimes fprintf(outf, "#define %s %d\n", name, count); 164dea673e9SRodney W. Grimes (void) fclose(outf); 165dea673e9SRodney W. Grimes return; 166dea673e9SRodney W. Grimes } 167dea673e9SRodney W. Grimes fl_head = NULL; 168dea673e9SRodney W. Grimes for (;;) { 169dea673e9SRodney W. Grimes char *cp; 170dea673e9SRodney W. Grimes if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) 171dea673e9SRodney W. Grimes break; 172dea673e9SRodney W. Grimes if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) 173dea673e9SRodney W. Grimes break; 174dea673e9SRodney W. Grimes inw = ns(inw); 175dea673e9SRodney W. Grimes cp = get_word(inf); 176dea673e9SRodney W. Grimes if (cp == 0 || cp == (char *)EOF) 177dea673e9SRodney W. Grimes break; 178dea673e9SRodney W. Grimes inc = atoi(cp); 179dea673e9SRodney W. Grimes if (eq(inw, name)) { 180dea673e9SRodney W. Grimes oldcount = inc; 181dea673e9SRodney W. Grimes inc = count; 182dea673e9SRodney W. Grimes } 183dea673e9SRodney W. Grimes cp = get_word(inf); 184dea673e9SRodney W. Grimes if (cp == (char *)EOF) 185dea673e9SRodney W. Grimes break; 186dea673e9SRodney W. Grimes fl = (struct file_list *) malloc(sizeof *fl); 187dea673e9SRodney W. Grimes bzero(fl, sizeof(*fl)); 1886d41b96fSPeter Wemm fl->f_fn = inw; /* malloced */ 189dea673e9SRodney W. Grimes fl->f_type = inc; 190dea673e9SRodney W. Grimes fl->f_next = fl_head; 191dea673e9SRodney W. Grimes fl_head = fl; 192dea673e9SRodney W. Grimes } 193dea673e9SRodney W. Grimes (void) fclose(inf); 194dea673e9SRodney W. Grimes if (count == oldcount) { 195dea673e9SRodney W. Grimes for (fl = fl_head; fl != NULL; fl = tflp) { 196dea673e9SRodney W. Grimes tflp = fl->f_next; 1976d41b96fSPeter Wemm free(fl->f_fn); 198dea673e9SRodney W. Grimes free(fl); 199dea673e9SRodney W. Grimes } 200dea673e9SRodney W. Grimes return; 201dea673e9SRodney W. Grimes } 202dea673e9SRodney W. Grimes if (oldcount == -1) { 203dea673e9SRodney W. Grimes fl = (struct file_list *) malloc(sizeof *fl); 204dea673e9SRodney W. Grimes bzero(fl, sizeof(*fl)); 2055bd7b809SJoerg Wunsch fl->f_fn = ns(name); 206dea673e9SRodney W. Grimes fl->f_type = count; 207dea673e9SRodney W. Grimes fl->f_next = fl_head; 208dea673e9SRodney W. Grimes fl_head = fl; 209dea673e9SRodney W. Grimes } 210dea673e9SRodney W. Grimes outf = fopen(file, "w"); 211d5831691SPhilippe Charnier if (outf == 0) 212d5831691SPhilippe Charnier err(1, "%s", file); 213dea673e9SRodney W. Grimes for (fl = fl_head; fl != NULL; fl = tflp) { 214dea673e9SRodney W. Grimes fprintf(outf, 215dea673e9SRodney W. Grimes "#define %s %u\n", fl->f_fn, count ? fl->f_type : 0); 216dea673e9SRodney W. Grimes tflp = fl->f_next; 2176d41b96fSPeter Wemm free(fl->f_fn); 218dea673e9SRodney W. Grimes free(fl); 219dea673e9SRodney W. Grimes } 220dea673e9SRodney W. Grimes (void) fclose(outf); 221dea673e9SRodney W. Grimes } 222dea673e9SRodney W. Grimes 223dea673e9SRodney W. Grimes /* 224dea673e9SRodney W. Grimes * convert a dev name to a .h file name 225dea673e9SRodney W. Grimes */ 226188334f6SPeter Wemm static char * 227dea673e9SRodney W. Grimes toheader(dev) 228dea673e9SRodney W. Grimes char *dev; 229dea673e9SRodney W. Grimes { 230dea673e9SRodney W. Grimes static char hbuf[80]; 231dea673e9SRodney W. Grimes 232dea673e9SRodney W. Grimes (void) strcpy(hbuf, path(dev)); 233dea673e9SRodney W. Grimes (void) strcat(hbuf, ".h"); 234dea673e9SRodney W. Grimes return (hbuf); 235dea673e9SRodney W. Grimes } 236dea673e9SRodney W. Grimes 237dea673e9SRodney W. Grimes /* 238dea673e9SRodney W. Grimes * convert a dev name to a macro name 239dea673e9SRodney W. Grimes */ 240188334f6SPeter Wemm static char * 241188334f6SPeter Wemm tomacro(dev) 242dea673e9SRodney W. Grimes register char *dev; 243dea673e9SRodney W. Grimes { 244dea673e9SRodney W. Grimes static char mbuf[20]; 245dea673e9SRodney W. Grimes register char *cp; 246dea673e9SRodney W. Grimes 247dea673e9SRodney W. Grimes cp = mbuf; 248dea673e9SRodney W. Grimes *cp++ = 'N'; 249dea673e9SRodney W. Grimes while (*dev) 250dea673e9SRodney W. Grimes *cp++ = islower(*dev) ? toupper(*dev++) : *dev++; 251dea673e9SRodney W. Grimes *cp++ = 0; 252dea673e9SRodney W. Grimes return (mbuf); 253dea673e9SRodney W. Grimes } 254