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