mkoptions.c revision 16073
112772Speter/* 212772Speter * Copyright (c) 1995 Peter Wemm 312772Speter * Copyright (c) 1980, 1993 412772Speter * The Regents of the University of California. All rights reserved. 512772Speter * 612772Speter * Redistribution and use in source and binary forms, with or without 712772Speter * modification, are permitted provided that the following conditions 812772Speter * are met: 912772Speter * 1. Redistributions of source code must retain the above copyright 1012772Speter * notice, this list of conditions and the following disclaimer. 1112772Speter * 2. Redistributions in binary form must reproduce the above copyright 1212772Speter * notice, this list of conditions and the following disclaimer in the 1312772Speter * documentation and/or other materials provided with the distribution. 1412772Speter * 3. All advertising materials mentioning features or use of this software 1512772Speter * must display the following acknowledgement: 1612772Speter * This product includes software developed by the University of 1712772Speter * California, Berkeley and its contributors. 1812772Speter * 4. Neither the name of the University nor the names of its contributors 1912772Speter * may be used to endorse or promote products derived from this software 2012772Speter * without specific prior written permission. 2112772Speter * 2212772Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2312772Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2412772Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2512772Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2612772Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2712772Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2812772Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2912772Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3012772Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3112772Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3212772Speter * SUCH DAMAGE. 3312772Speter */ 3412772Speter 3512772Speter#ifndef lint 3612772Speterstatic char sccsid[] = "@(#)mkheaders.c 8.1 (Berkeley) 6/6/93"; 3712772Speter#endif /* not lint */ 3812772Speter 3912772Speter/* 4012772Speter * Make all the .h files for the optional entries 4112772Speter */ 4212772Speter 4312772Speter#include <stdio.h> 4412772Speter#include <ctype.h> 4512772Speter#include "config.h" 4616073Sphk#include "y.tab.h" 4712772Speter 4812772Speteroptions() 4912772Speter{ 5012772Speter struct opt_list *ol; 5112772Speter 5212772Speter /* fake the cpu types as options */ 5312772Speter /* Please forgive me for this hack.. :-) */ 5412772Speter struct opt *op; 5512772Speter struct cputype *cp; 5612772Speter 5712772Speter for (cp = cputype; cp; cp = cp->cpu_next) { 5812772Speter struct opt *op = (struct opt *)malloc(sizeof (struct opt)); 5912772Speter memset(op, 0, sizeof(*op)); 6012772Speter op->op_name = cp->cpu_name; 6112772Speter op->op_value = 0; 6212772Speter op->op_next = opt; 6312772Speter opt = op; 6412772Speter } 6512772Speter 6612772Speter read_options(); 6712772Speter for (ol = otab; ol != 0; ol = ol->o_next) 6812772Speter do_option(ol->o_name); 6912772Speter} 7012772Speter 7112772Speter/* 7212772Speter * Generate an <options>.h file 7312772Speter */ 7412772Speter 7512772Speterdo_option(name) 7612772Speter char *name; 7712772Speter{ 7812772Speter char *file, *inw, *tooption(); 7912772Speter struct opt *op, *op_head, *topp; 8012772Speter FILE *inf, *outf; 8112772Speter char *value; 8212772Speter char *oldvalue; 8312772Speter int seen; 8412772Speter 8512772Speter file = tooption(name); 8612772Speter 8712772Speter /* 8812772Speter * Check to see if the option was specified.. 8912772Speter */ 9012772Speter value = NULL; 9112772Speter for (op = opt; op; op = op->op_next) { 9212772Speter if (eq(name, op->op_name)) { 9312772Speter value = op->op_value; 9412772Speter if (!value) 9512772Speter value = ns("1"); 9612772Speter op->op_ownfile++; 9712772Speter } 9812772Speter } 9912772Speter 10012772Speter inf = fopen(file, "r"); 10112772Speter if (inf == 0) { 10212772Speter outf = fopen(file, "w"); 10312772Speter if (outf == 0) { 10412772Speter perror(file); 10512772Speter exit(1); 10612772Speter } 10712772Speter 10812772Speter /* was the option in the config file? */ 10912772Speter if (value) { 11012772Speter fprintf(outf, "#define %s %s\n", name, value); 11112772Speter } /* else empty file */ 11212772Speter 11312772Speter (void) fclose(outf); 11412772Speter return; 11512772Speter } 11612772Speter oldvalue = NULL; 11712772Speter op_head = NULL; 11812772Speter seen = 0; 11912772Speter for (;;) { 12012772Speter char *cp; 12112772Speter char *invalue; 12212772Speter 12312772Speter /* get the #define */ 12412772Speter if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) 12512772Speter break; 12612772Speter /* get the option name */ 12712772Speter if ((inw = get_word(inf)) == 0 || inw == (char *)EOF) 12812772Speter break; 12912772Speter inw = ns(inw); 13012772Speter cp = get_word(inf); 13112772Speter if (cp == 0 || cp == (char *)EOF) 13212772Speter break; 13312772Speter /* option value */ 13412772Speter invalue = ns(cp); /* malloced */ 13512772Speter if (eq(inw, name)) { 13612772Speter oldvalue = invalue; 13712772Speter invalue = value; 13812772Speter seen++; 13912772Speter } 14012772Speter op = (struct opt *) malloc(sizeof *op); 14112772Speter bzero(op, sizeof(*op)); 14212772Speter op->op_name = inw; 14312772Speter op->op_value = invalue; 14412772Speter op->op_next = op_head; 14512772Speter op_head = op; 14612772Speter 14712772Speter /* EOL? */ 14812772Speter cp = get_word(inf); 14912772Speter if (cp == (char *)EOF) 15012772Speter break; 15112772Speter } 15212772Speter (void) fclose(inf); 15312772Speter if ((value == NULL && oldvalue == NULL) || 15412772Speter (value && oldvalue && eq(value,oldvalue))) { 15512772Speter for (op = op_head; op != NULL; op = topp) { 15612772Speter topp = op->op_next; 15712772Speter free(op->op_name); 15812772Speter free(op->op_value); 15912772Speter free(op); 16012772Speter } 16112772Speter return; 16212772Speter } 16312772Speter 16412772Speter if (value && !seen) { 16512772Speter /* New option appears */ 16612772Speter op = (struct opt *) malloc(sizeof *op); 16712772Speter bzero(op, sizeof(*op)); 16812772Speter op->op_name = ns(name); 16912772Speter op->op_value = value ? ns(value) : NULL; 17012772Speter op->op_next = op_head; 17112772Speter op_head = op; 17212772Speter } 17312772Speter 17412772Speter outf = fopen(file, "w"); 17512772Speter if (outf == 0) { 17612772Speter perror(file); 17712772Speter exit(1); 17812772Speter } 17912772Speter for (op = op_head; op != NULL; op = topp) { 18012772Speter /* was the option in the config file? */ 18112772Speter if (op->op_value) { 18212772Speter fprintf(outf, "#define %s %s\n", 18312772Speter op->op_name, op->op_value); 18412772Speter } 18512772Speter topp = op->op_next; 18612772Speter free(op->op_name); 18712772Speter free(op->op_value); 18812772Speter free(op); 18912772Speter } 19012772Speter (void) fclose(outf); 19112772Speter} 19212772Speter 19312772Speter/* 19412772Speter * Find the filename to store the option spec into. 19512772Speter */ 19612772Speterchar * 19712772Spetertooption(name) 19812772Speter char *name; 19912772Speter{ 20012772Speter static char hbuf[80]; 20112772Speter char nbuf[80]; 20212772Speter struct opt_list *po; 20312772Speter 20412772Speter /* "cannot happen"? the otab list should be complete.. */ 20512772Speter (void) strcpy(nbuf, "options.h"); 20612772Speter 20712772Speter for (po = otab ; po != 0; po = po->o_next) { 20812772Speter if (eq(po->o_name, name)) { 20912772Speter strcpy(nbuf, po->o_file); 21012772Speter break; 21112772Speter } 21212772Speter } 21312772Speter 21412772Speter (void) strcpy(hbuf, path(nbuf)); 21512772Speter return (hbuf); 21612772Speter} 21712772Speter 21812772Speter/* 21912772Speter * read the options and options.<machine> files 22012772Speter */ 22112772Speterread_options() 22212772Speter{ 22312772Speter FILE *fp; 22412772Speter char fname[32]; 22512772Speter char *wd, *this, *val; 22612772Speter struct opt_list *po; 22712772Speter int first = 1; 22812772Speter char genopt[80]; 22912772Speter char *lower(); 23012772Speter 23112772Speter otab = 0; 23212772Speter (void) strcpy(fname, "../../conf/options"); 23312772Speteropenit: 23412772Speter fp = fopen(fname, "r"); 23512772Speter if (fp == 0) { 23612772Speter return; 23712772Speter } 23812772Speter if(ident == NULL) { 23912772Speter printf("no ident line specified\n"); 24012772Speter exit(1); 24112772Speter } 24212772Speternext: 24312772Speter wd = get_word(fp); 24412772Speter if (wd == (char *)EOF) { 24512772Speter (void) fclose(fp); 24612772Speter if (first == 1) { 24712772Speter (void) sprintf(fname, "options.%s", machinename); 24812772Speter first++; 24912772Speter goto openit; 25012772Speter } 25112772Speter if (first == 2) { 25212772Speter (void) sprintf(fname, "options.%s", raise(ident)); 25312772Speter first++; 25412772Speter fp = fopen(fname, "r"); 25512772Speter if (fp != 0) 25612772Speter goto next; 25712772Speter } 25812772Speter return; 25912772Speter } 26012772Speter if (wd == 0) 26112772Speter goto next; 26212772Speter /*************************************************\ 26312772Speter * If it's a comment ignore to the end of the line * 26412772Speter \*************************************************/ 26512772Speter if(wd[0] == '#') 26612772Speter { 26712772Speter while( ((wd = get_word(fp)) != (char *)EOF) && wd) 26812772Speter ; 26912772Speter goto next; 27012772Speter } 27112772Speter this = ns(wd); 27212772Speter val = get_word(fp); 27312772Speter if (val == (char *)EOF) 27412772Speter return; 27512772Speter if (val == 0) { 27612772Speter char *s = ns(this); 27712772Speter (void) strcpy(genopt, "opt_"); 27812772Speter (void) strcat(genopt, lower(s)); 27912772Speter (void) strcat(genopt, ".h"); 28012772Speter val = genopt; 28112772Speter free(s); 28212772Speter } 28312772Speter val = ns(val); 28412772Speter 28512772Speter for (po = otab ; po != 0; po = po->o_next) { 28612772Speter if (eq(po->o_name, this)) { 28712772Speter printf("%s: Duplicate option %s.\n", 28812772Speter fname, this); 28912772Speter exit(1); 29012772Speter } 29112772Speter } 29212772Speter 29312772Speter po = (struct opt_list *) malloc(sizeof *po); 29412772Speter bzero(po, sizeof(*po)); 29512772Speter po->o_name = this; 29612772Speter po->o_file = val; 29712772Speter po->o_next = otab; 29812772Speter otab = po; 29912772Speter 30012772Speter goto next; 30112772Speter} 30212772Speter 30312772Speterchar * 30412772Speterlower(str) 30512772Speter register char *str; 30612772Speter{ 30712772Speter register char *cp = str; 30812772Speter 30912772Speter while (*str) { 31012772Speter if (isupper(*str)) 31112772Speter *str = tolower(*str); 31212772Speter str++; 31312772Speter } 31412772Speter return (cp); 31512772Speter} 31612772Speter 317