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> 50faa913d7SWarner Losh #include <sys/param.h> 51dea673e9SRodney W. Grimes #include "config.h" 521d95dc91SPoul-Henning Kamp #include "y.tab.h" 53dea673e9SRodney W. Grimes 54f71c01ccSPeter Wemm static void do_header(char *, int); 55775d6c0eSPeter Wemm static void nocount(char *); 56f71c01ccSPeter Wemm static char *toheader(char *); 57f71c01ccSPeter Wemm static char *tomacro(char *); 58d5831691SPhilippe Charnier 59d5831691SPhilippe Charnier void 60f71c01ccSPeter Wemm headers(void) 61dea673e9SRodney W. Grimes { 62f71c01ccSPeter Wemm struct file_list *fl; 63cea24a2bSJoerg Wunsch struct device *dp; 64ace85808SPeter Wemm int match; 65775d6c0eSPeter Wemm int errors; 66dea673e9SRodney W. Grimes 67775d6c0eSPeter Wemm errors = 0; 683f664fc6SPeter Wemm for (fl = ftab; fl != 0; fl = fl->f_next) { 693f664fc6SPeter Wemm if (fl->f_needs != 0) { 70ace85808SPeter Wemm match = 0; 713f664fc6SPeter Wemm for (dp = dtab; dp != 0; dp = dp->d_next) { 723f664fc6SPeter Wemm if (eq(dp->d_name, fl->f_needs)) { 73ace85808SPeter Wemm match++; 74246449f3SPeter Wemm dp->d_done |= DEVDONE; 753f664fc6SPeter Wemm } 763f664fc6SPeter Wemm } 7762a4bb55SPeter Wemm if (fl->f_flags & NEED_COUNT) 7862a4bb55SPeter Wemm do_header(fl->f_needs, match); 793f664fc6SPeter Wemm } 80ace85808SPeter Wemm } 81ed7e72e6SPeter Wemm for (dp = dtab; dp != 0; dp = dp->d_next) { 82775d6c0eSPeter Wemm if (!(dp->d_done & DEVDONE)) { 83775d6c0eSPeter Wemm warnx("Error: device \"%s\" is unknown", 84ed7e72e6SPeter Wemm dp->d_name); 85775d6c0eSPeter Wemm errors++; 86952017beSPeter Wemm } 87775d6c0eSPeter Wemm if (dp->d_count == UNKNOWN) 88775d6c0eSPeter Wemm continue; 89775d6c0eSPeter Wemm match = 0; 90775d6c0eSPeter Wemm for (fl = ftab; fl != 0; fl = fl->f_next) { 91775d6c0eSPeter Wemm if (fl->f_needs == 0) 92775d6c0eSPeter Wemm continue; 93775d6c0eSPeter Wemm if ((fl->f_flags & NEED_COUNT) == 0) 94775d6c0eSPeter Wemm continue; 95775d6c0eSPeter Wemm if (eq(dp->d_name, fl->f_needs)) { 96775d6c0eSPeter Wemm match++; 97775d6c0eSPeter Wemm break; 98775d6c0eSPeter Wemm } 99775d6c0eSPeter Wemm } 100775d6c0eSPeter Wemm if (match == 0) { 101775d6c0eSPeter Wemm warnx("Error: device \"%s\" does not take a count", 102775d6c0eSPeter Wemm dp->d_name); 103775d6c0eSPeter Wemm errors++; 104775d6c0eSPeter Wemm } 105775d6c0eSPeter Wemm } 106775d6c0eSPeter Wemm if (errors) 107775d6c0eSPeter Wemm errx(1, "%d errors", errors); 108ed7e72e6SPeter Wemm } 109dea673e9SRodney W. Grimes 110188334f6SPeter Wemm static void 11162a4bb55SPeter Wemm do_header(char *dev, int match) 112dea673e9SRodney W. Grimes { 11362a4bb55SPeter Wemm char *file, *name, *inw; 11462a4bb55SPeter Wemm struct file_list *fl, *fl_head, *tflp; 115f71c01ccSPeter Wemm struct device *dp; 11662a4bb55SPeter Wemm FILE *inf, *outf; 11762a4bb55SPeter Wemm int inc, oldcount; 118f71c01ccSPeter Wemm int count, hicount; 119dea673e9SRodney W. Grimes 120dea673e9SRodney W. Grimes /* 121dea673e9SRodney W. Grimes * After this loop, "count" will be the actual number of units, 122dea673e9SRodney W. Grimes * and "hicount" will be the highest unit declared. do_header() 123dea673e9SRodney W. Grimes * must use this higher of these values. 124dea673e9SRodney W. Grimes */ 12594142695SPeter Wemm for (hicount = count = 0, dp = dtab; dp != 0; dp = dp->d_next) { 126f71c01ccSPeter Wemm if (eq(dp->d_name, dev)) { 127dea673e9SRodney W. Grimes count = 1281c56dc36SPeter Wemm dp->d_count != UNKNOWN ? dp->d_count : 1; 129dea673e9SRodney W. Grimes break; 130dea673e9SRodney W. Grimes } 131dea673e9SRodney W. Grimes } 1323f664fc6SPeter Wemm file = toheader(dev); 133dea673e9SRodney W. Grimes name = tomacro(dev); 13462a4bb55SPeter Wemm if (match) 1353c36aab6SPeter Wemm printf("FYI: static unit limits for %s are set: %s=%d\n", dev, name, count); 136ace85808SPeter Wemm remember(file); 137dea673e9SRodney W. Grimes inf = fopen(file, "r"); 138dea673e9SRodney W. Grimes oldcount = -1; 139dea673e9SRodney W. Grimes if (inf == 0) { 140dea673e9SRodney W. Grimes outf = fopen(file, "w"); 141d5831691SPhilippe Charnier if (outf == 0) 142d5831691SPhilippe Charnier err(1, "%s", file); 143dea673e9SRodney W. Grimes fprintf(outf, "#define %s %d\n", name, count); 144dea673e9SRodney W. Grimes (void) fclose(outf); 145dea673e9SRodney W. Grimes return; 146dea673e9SRodney W. Grimes } 147dea673e9SRodney W. Grimes fl_head = NULL; 148dea673e9SRodney W. Grimes for (;;) { 149dea673e9SRodney W. Grimes char *cp; 150dea673e9SRodney W. Grimes if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) 151dea673e9SRodney W. Grimes break; 152dea673e9SRodney W. Grimes if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) 153dea673e9SRodney W. Grimes break; 154dea673e9SRodney W. Grimes inw = ns(inw); 155dea673e9SRodney W. Grimes cp = get_word(inf); 156dea673e9SRodney W. Grimes if (cp == 0 || cp == (char *)EOF) 157dea673e9SRodney W. Grimes break; 158dea673e9SRodney W. Grimes inc = atoi(cp); 159dea673e9SRodney W. Grimes if (eq(inw, name)) { 160dea673e9SRodney W. Grimes oldcount = inc; 161dea673e9SRodney W. Grimes inc = count; 162dea673e9SRodney W. Grimes } 163dea673e9SRodney W. Grimes cp = get_word(inf); 164dea673e9SRodney W. Grimes if (cp == (char *)EOF) 165dea673e9SRodney W. Grimes break; 166dea673e9SRodney W. Grimes fl = (struct file_list *) malloc(sizeof *fl); 167dea673e9SRodney W. Grimes bzero(fl, sizeof(*fl)); 1686d41b96fSPeter Wemm fl->f_fn = inw; /* malloced */ 169dea673e9SRodney W. Grimes fl->f_type = inc; 170dea673e9SRodney W. Grimes fl->f_next = fl_head; 171dea673e9SRodney W. Grimes fl_head = fl; 172dea673e9SRodney W. Grimes } 173dea673e9SRodney W. Grimes (void) fclose(inf); 174dea673e9SRodney W. Grimes if (count == oldcount) { 175dea673e9SRodney W. Grimes for (fl = fl_head; fl != NULL; fl = tflp) { 176dea673e9SRodney W. Grimes tflp = fl->f_next; 1776d41b96fSPeter Wemm free(fl->f_fn); 178dea673e9SRodney W. Grimes free(fl); 179dea673e9SRodney W. Grimes } 180dea673e9SRodney W. Grimes return; 181dea673e9SRodney W. Grimes } 182dea673e9SRodney W. Grimes if (oldcount == -1) { 183dea673e9SRodney W. Grimes fl = (struct file_list *) malloc(sizeof *fl); 184dea673e9SRodney W. Grimes bzero(fl, sizeof(*fl)); 1855bd7b809SJoerg Wunsch fl->f_fn = ns(name); 186dea673e9SRodney W. Grimes fl->f_type = count; 187dea673e9SRodney W. Grimes fl->f_next = fl_head; 188dea673e9SRodney W. Grimes fl_head = fl; 189dea673e9SRodney W. Grimes } 190dea673e9SRodney W. Grimes outf = fopen(file, "w"); 191d5831691SPhilippe Charnier if (outf == 0) 192d5831691SPhilippe Charnier err(1, "%s", file); 193dea673e9SRodney W. Grimes for (fl = fl_head; fl != NULL; fl = tflp) { 194dea673e9SRodney W. Grimes fprintf(outf, 195dea673e9SRodney W. Grimes "#define %s %u\n", fl->f_fn, count ? fl->f_type : 0); 196dea673e9SRodney W. Grimes tflp = fl->f_next; 1976d41b96fSPeter Wemm free(fl->f_fn); 198dea673e9SRodney W. Grimes free(fl); 199dea673e9SRodney W. Grimes } 200dea673e9SRodney W. Grimes (void) fclose(outf); 201dea673e9SRodney W. Grimes } 202dea673e9SRodney W. Grimes 203dea673e9SRodney W. Grimes /* 204dea673e9SRodney W. Grimes * convert a dev name to a .h file name 205dea673e9SRodney W. Grimes */ 206188334f6SPeter Wemm static char * 207f71c01ccSPeter Wemm toheader(char *dev) 208dea673e9SRodney W. Grimes { 209faa913d7SWarner Losh static char hbuf[MAXPATHLEN]; 210dea673e9SRodney W. Grimes 211faa913d7SWarner Losh snprintf(hbuf, sizeof(hbuf), "%s.h", path(dev)); 212dea673e9SRodney W. Grimes return (hbuf); 213dea673e9SRodney W. Grimes } 214dea673e9SRodney W. Grimes 215dea673e9SRodney W. Grimes /* 216dea673e9SRodney W. Grimes * convert a dev name to a macro name 217dea673e9SRodney W. Grimes */ 218188334f6SPeter Wemm static char * 219f71c01ccSPeter Wemm tomacro(char *dev) 220dea673e9SRodney W. Grimes { 221dea673e9SRodney W. Grimes static char mbuf[20]; 222f71c01ccSPeter Wemm char *cp; 223dea673e9SRodney W. Grimes 224dea673e9SRodney W. Grimes cp = mbuf; 225dea673e9SRodney W. Grimes *cp++ = 'N'; 226dea673e9SRodney W. Grimes while (*dev) 227dea673e9SRodney W. Grimes *cp++ = islower(*dev) ? toupper(*dev++) : *dev++; 228dea673e9SRodney W. Grimes *cp++ = 0; 229dea673e9SRodney W. Grimes return (mbuf); 230dea673e9SRodney W. Grimes } 231