cppsetup.c revision 0eb10989
10eb10989Smrg/* $Xorg: cppsetup.c,v 1.5 2001/02/09 02:03:16 xorgcvs Exp $ */ 20eb10989Smrg/* 30eb10989Smrg 40eb10989SmrgCopyright (c) 1993, 1994, 1998 The Open Group 50eb10989Smrg 60eb10989SmrgPermission to use, copy, modify, distribute, and sell this software and its 70eb10989Smrgdocumentation for any purpose is hereby granted without fee, provided that 80eb10989Smrgthe above copyright notice appear in all copies and that both that 90eb10989Smrgcopyright notice and this permission notice appear in supporting 100eb10989Smrgdocumentation. 110eb10989Smrg 120eb10989SmrgThe above copyright notice and this permission notice shall be included in 130eb10989Smrgall copies or substantial portions of the Software. 140eb10989Smrg 150eb10989SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 160eb10989SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 170eb10989SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 180eb10989SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 190eb10989SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 200eb10989SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 210eb10989Smrg 220eb10989SmrgExcept as contained in this notice, the name of The Open Group shall not be 230eb10989Smrgused in advertising or otherwise to promote the sale, use or other dealings 240eb10989Smrgin this Software without prior written authorization from The Open Group. 250eb10989Smrg 260eb10989Smrg*/ 270eb10989Smrg/* $XFree86: xc/config/makedepend/cppsetup.c,v 3.10 2001/12/14 19:53:20 dawes Exp $ */ 280eb10989Smrg 290eb10989Smrg#include "def.h" 300eb10989Smrg 310eb10989Smrg#ifdef CPP 320eb10989Smrg/* 330eb10989Smrg * This file is strictly for the sake of cpy.y and yylex.c (if 340eb10989Smrg * you indeed have the source for cpp). 350eb10989Smrg */ 360eb10989Smrg#define IB 1 370eb10989Smrg#define SB 2 380eb10989Smrg#define NB 4 390eb10989Smrg#define CB 8 400eb10989Smrg#define QB 16 410eb10989Smrg#define WB 32 420eb10989Smrg#define SALT '#' 430eb10989Smrg#if defined(pdp11) || defined(vax) || defined(ns16000) || defined(mc68000) || defined(ibm032) 440eb10989Smrg#define COFF 128 450eb10989Smrg#else 460eb10989Smrg#define COFF 0 470eb10989Smrg#endif 480eb10989Smrg/* 490eb10989Smrg * These variables used by cpy.y and yylex.c 500eb10989Smrg */ 510eb10989Smrgextern char *outp, *inp, *newp, *pend; 520eb10989Smrgextern char *ptrtab; 530eb10989Smrgextern char fastab[]; 540eb10989Smrgextern char slotab[]; 550eb10989Smrg 560eb10989Smrg/* 570eb10989Smrg * cppsetup 580eb10989Smrg */ 590eb10989Smrgstruct filepointer *currentfile; 600eb10989Smrgstruct inclist *currentinc; 610eb10989Smrg 620eb10989Smrgint 630eb10989Smrgcppsetup(char *line, struct filepointer *filep, struct inclist *inc) 640eb10989Smrg{ 650eb10989Smrg char *p, savec; 660eb10989Smrg static boolean setupdone = FALSE; 670eb10989Smrg boolean value; 680eb10989Smrg 690eb10989Smrg if (!setupdone) { 700eb10989Smrg cpp_varsetup(); 710eb10989Smrg setupdone = TRUE; 720eb10989Smrg } 730eb10989Smrg 740eb10989Smrg currentfile = filep; 750eb10989Smrg currentinc = inc; 760eb10989Smrg inp = newp = line; 770eb10989Smrg for (p=newp; *p; p++) 780eb10989Smrg ; 790eb10989Smrg 800eb10989Smrg /* 810eb10989Smrg * put a newline back on the end, and set up pend, etc. 820eb10989Smrg */ 830eb10989Smrg *p++ = '\n'; 840eb10989Smrg savec = *p; 850eb10989Smrg *p = '\0'; 860eb10989Smrg pend = p; 870eb10989Smrg 880eb10989Smrg ptrtab = slotab+COFF; 890eb10989Smrg *--inp = SALT; 900eb10989Smrg outp=inp; 910eb10989Smrg value = yyparse(); 920eb10989Smrg *p = savec; 930eb10989Smrg return(value); 940eb10989Smrg} 950eb10989Smrg 960eb10989Smrgstruct symtab **lookup(symbol) 970eb10989Smrg char *symbol; 980eb10989Smrg{ 990eb10989Smrg static struct symtab *undefined; 1000eb10989Smrg struct symtab **sp; 1010eb10989Smrg 1020eb10989Smrg sp = isdefined(symbol, currentinc, NULL); 1030eb10989Smrg if (sp == NULL) { 1040eb10989Smrg sp = &undefined; 1050eb10989Smrg (*sp)->s_value = NULL; 1060eb10989Smrg } 1070eb10989Smrg return (sp); 1080eb10989Smrg} 1090eb10989Smrg 1100eb10989Smrgpperror(tag, x0,x1,x2,x3,x4) 1110eb10989Smrg int tag,x0,x1,x2,x3,x4; 1120eb10989Smrg{ 1130eb10989Smrg warning("\"%s\", line %d: ", currentinc->i_file, currentfile->f_line); 1140eb10989Smrg warning(x0,x1,x2,x3,x4); 1150eb10989Smrg} 1160eb10989Smrg 1170eb10989Smrg 1180eb10989Smrgyyerror(s) 1190eb10989Smrg register char *s; 1200eb10989Smrg{ 1210eb10989Smrg fatalerr("Fatal error: %s\n", s); 1220eb10989Smrg} 1230eb10989Smrg#else /* not CPP */ 1240eb10989Smrg 1250eb10989Smrg#include "ifparser.h" 1260eb10989Smrgstruct _parse_data { 1270eb10989Smrg struct filepointer *filep; 1280eb10989Smrg struct inclist *inc; 1290eb10989Smrg char *filename; 1300eb10989Smrg const char *line; 1310eb10989Smrg}; 1320eb10989Smrg 1330eb10989Smrgstatic const char * 1340eb10989Smrgmy_if_errors (IfParser *ip, const char *cp, const char *expecting) 1350eb10989Smrg{ 1360eb10989Smrg struct _parse_data *pd = (struct _parse_data *) ip->data; 1370eb10989Smrg int lineno = pd->filep->f_line; 1380eb10989Smrg char *filename = pd->filename; 1390eb10989Smrg char prefix[300]; 1400eb10989Smrg int prefixlen; 1410eb10989Smrg int i; 1420eb10989Smrg 1430eb10989Smrg sprintf (prefix, "\"%s\":%d", filename, lineno); 1440eb10989Smrg prefixlen = strlen(prefix); 1450eb10989Smrg fprintf (stderr, "%s: %s", prefix, pd->line); 1460eb10989Smrg i = cp - pd->line; 1470eb10989Smrg if (i > 0 && pd->line[i-1] != '\n') { 1480eb10989Smrg putc ('\n', stderr); 1490eb10989Smrg } 1500eb10989Smrg for (i += prefixlen + 3; i > 0; i--) { 1510eb10989Smrg putc (' ', stderr); 1520eb10989Smrg } 1530eb10989Smrg fprintf (stderr, "^--- expecting %s\n", expecting); 1540eb10989Smrg return NULL; 1550eb10989Smrg} 1560eb10989Smrg 1570eb10989Smrg 1580eb10989Smrg#define MAXNAMELEN 256 1590eb10989Smrg 1600eb10989Smrgstatic struct symtab ** 1610eb10989Smrglookup_variable (IfParser *ip, const char *var, int len) 1620eb10989Smrg{ 1630eb10989Smrg char tmpbuf[MAXNAMELEN + 1]; 1640eb10989Smrg struct _parse_data *pd = (struct _parse_data *) ip->data; 1650eb10989Smrg 1660eb10989Smrg if (len > MAXNAMELEN) 1670eb10989Smrg return 0; 1680eb10989Smrg 1690eb10989Smrg strncpy (tmpbuf, var, len); 1700eb10989Smrg tmpbuf[len] = '\0'; 1710eb10989Smrg return isdefined (tmpbuf, pd->inc, NULL); 1720eb10989Smrg} 1730eb10989Smrg 1740eb10989Smrg 1750eb10989Smrgstatic int 1760eb10989Smrgmy_eval_defined (IfParser *ip, const char *var, int len) 1770eb10989Smrg{ 1780eb10989Smrg if (lookup_variable (ip, var, len)) 1790eb10989Smrg return 1; 1800eb10989Smrg else 1810eb10989Smrg return 0; 1820eb10989Smrg} 1830eb10989Smrg 1840eb10989Smrg#define isvarfirstletter(ccc) (isalpha(ccc) || (ccc) == '_') 1850eb10989Smrg 1860eb10989Smrgstatic long 1870eb10989Smrgmy_eval_variable (IfParser *ip, const char *var, int len) 1880eb10989Smrg{ 1890eb10989Smrg long val; 1900eb10989Smrg struct symtab **s; 1910eb10989Smrg 1920eb10989Smrg s = lookup_variable (ip, var, len); 1930eb10989Smrg if (!s) 1940eb10989Smrg return 0; 1950eb10989Smrg do { 1960eb10989Smrg var = (*s)->s_value; 1970eb10989Smrg if (!isvarfirstletter(*var) || !strcmp((*s)->s_name, var)) 1980eb10989Smrg break; 1990eb10989Smrg s = lookup_variable (ip, var, strlen(var)); 2000eb10989Smrg } while (s); 2010eb10989Smrg 2020eb10989Smrg var = ParseIfExpression(ip, var, &val); 2030eb10989Smrg if (var && *var) debug(4, ("extraneous: '%s'\n", var)); 2040eb10989Smrg return val; 2050eb10989Smrg} 2060eb10989Smrg 2070eb10989Smrgint 2080eb10989Smrgcppsetup(char *filename, 2090eb10989Smrg char *line, 2100eb10989Smrg struct filepointer *filep, 2110eb10989Smrg struct inclist *inc) 2120eb10989Smrg{ 2130eb10989Smrg IfParser ip; 2140eb10989Smrg struct _parse_data pd; 2150eb10989Smrg long val = 0; 2160eb10989Smrg 2170eb10989Smrg pd.filep = filep; 2180eb10989Smrg pd.inc = inc; 2190eb10989Smrg pd.line = line; 2200eb10989Smrg pd.filename = filename; 2210eb10989Smrg ip.funcs.handle_error = my_if_errors; 2220eb10989Smrg ip.funcs.eval_defined = my_eval_defined; 2230eb10989Smrg ip.funcs.eval_variable = my_eval_variable; 2240eb10989Smrg ip.data = (char *) &pd; 2250eb10989Smrg 2260eb10989Smrg (void) ParseIfExpression (&ip, line, &val); 2270eb10989Smrg if (val) 2280eb10989Smrg return IF; 2290eb10989Smrg else 2300eb10989Smrg return IFFALSE; 2310eb10989Smrg} 2320eb10989Smrg#endif /* CPP */ 2330eb10989Smrg 234