Blame config/makedepend/cppsetup.c

Packit b099d7
/* $XConsortium: cppsetup.c /main/17 1996/09/28 16:15:03 rws $ */
Packit b099d7
/*
Packit b099d7
Packit b099d7
Copyright (c) 1993, 1994  X Consortium
Packit b099d7
Packit b099d7
Permission is hereby granted, free of charge, to any person obtaining a copy
Packit b099d7
of this software and associated documentation files (the "Software"), to deal
Packit b099d7
in the Software without restriction, including without limitation the rights
Packit b099d7
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Packit b099d7
copies of the Software, and to permit persons to whom the Software is
Packit b099d7
furnished to do so, subject to the following conditions:
Packit b099d7
Packit b099d7
The above copyright notice and this permission notice shall be included in
Packit b099d7
all copies or substantial portions of the Software.
Packit b099d7
Packit b099d7
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit b099d7
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit b099d7
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit b099d7
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit b099d7
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit b099d7
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit b099d7
Packit b099d7
Except as contained in this notice, the name of the X Consortium shall not be
Packit b099d7
used in advertising or otherwise to promote the sale, use or other dealings
Packit b099d7
in this Software without prior written authorization from the X Consortium.
Packit b099d7
Packit b099d7
*/
Packit b099d7
/* $XFree86: xc/config/makedepend/cppsetup.c,v 3.2 1996/12/30 13:57:53 dawes Exp $ */
Packit b099d7
Packit b099d7
#include "def.h"
Packit b099d7
Packit b099d7
#ifdef	CPP
Packit b099d7
/*
Packit b099d7
 * This file is strictly for the sake of cpy.y and yylex.c (if
Packit b099d7
 * you indeed have the source for cpp).
Packit b099d7
 */
Packit b099d7
#define IB 1
Packit b099d7
#define SB 2
Packit b099d7
#define NB 4
Packit b099d7
#define CB 8
Packit b099d7
#define QB 16
Packit b099d7
#define WB 32
Packit b099d7
#define SALT '#'
Packit b099d7
#if defined(pdp11) || defined(vax) || defined(ns16000) || defined(mc68000) || defined(ibm032)
Packit b099d7
#define COFF 128
Packit b099d7
#else
Packit b099d7
#define COFF 0
Packit b099d7
#endif
Packit b099d7
/*
Packit b099d7
 * These variables used by cpy.y and yylex.c
Packit b099d7
 */
Packit b099d7
extern char	*outp, *inp, *newp, *pend;
Packit b099d7
extern char	*ptrtab;
Packit b099d7
extern char	fastab[];
Packit b099d7
extern char	slotab[];
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * cppsetup
Packit b099d7
 */
Packit b099d7
struct filepointer	*currentfile;
Packit b099d7
struct inclist		*currentinc;
Packit b099d7
Packit b099d7
cppsetup(line, filep, inc)
Packit b099d7
	register char	*line;
Packit b099d7
	register struct filepointer	*filep;
Packit b099d7
	register struct inclist		*inc;
Packit b099d7
{
Packit b099d7
	register char *p, savec;
Packit b099d7
	static boolean setupdone = FALSE;
Packit b099d7
	boolean	value;
Packit b099d7
Packit b099d7
	if (!setupdone) {
Packit b099d7
		cpp_varsetup();
Packit b099d7
		setupdone = TRUE;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	currentfile = filep;
Packit b099d7
	currentinc = inc;
Packit b099d7
	inp = newp = line;
Packit b099d7
	for (p=newp; *p; p++)
Packit b099d7
		;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * put a newline back on the end, and set up pend, etc.
Packit b099d7
	 */
Packit b099d7
	*p++ = '\n';
Packit b099d7
	savec = *p;
Packit b099d7
	*p = '\0';
Packit b099d7
	pend = p;
Packit b099d7
Packit b099d7
	ptrtab = slotab+COFF;
Packit b099d7
	*--inp = SALT; 
Packit b099d7
	outp=inp; 
Packit b099d7
	value = yyparse();
Packit b099d7
	*p = savec;
Packit b099d7
	return(value);
Packit b099d7
}
Packit b099d7
Packit b099d7
struct symtab **lookup(symbol)
Packit b099d7
	char	*symbol;
Packit b099d7
{
Packit b099d7
	static struct symtab    *undefined;
Packit b099d7
	struct symtab   **sp;
Packit b099d7
Packit b099d7
	sp = isdefined(symbol, currentinc, NULL);
Packit b099d7
	if (sp == NULL) {
Packit b099d7
		sp = &undefined;
Packit b099d7
		(*sp)->s_value = NULL;
Packit b099d7
	}
Packit b099d7
	return (sp);
Packit b099d7
}
Packit b099d7
Packit b099d7
pperror(tag, x0,x1,x2,x3,x4)
Packit b099d7
	int	tag,x0,x1,x2,x3,x4;
Packit b099d7
{
Packit b099d7
	warning("\"%s\", line %d: ", currentinc->i_file, currentfile->f_line);
Packit b099d7
	warning(x0,x1,x2,x3,x4);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
yyerror(s)
Packit b099d7
	register char	*s;
Packit b099d7
{
Packit b099d7
	fatalerr("Fatal error: %s\n", s);
Packit b099d7
}
Packit b099d7
#else /* not CPP */
Packit b099d7
Packit b099d7
#include "ifparser.h"
Packit b099d7
struct _parse_data {
Packit b099d7
    struct filepointer *filep;
Packit b099d7
    struct inclist *inc;
Packit b099d7
    const char *line;
Packit b099d7
};
Packit b099d7
Packit b099d7
static const char *
Packit b099d7
my_if_errors (ip, cp, expecting)
Packit b099d7
    IfParser *ip;
Packit b099d7
    const char *cp;
Packit b099d7
    const char *expecting;
Packit b099d7
{
Packit b099d7
    struct _parse_data *pd = (struct _parse_data *) ip->data;
Packit b099d7
    int lineno = pd->filep->f_line;
Packit b099d7
    char *filename = pd->inc->i_file;
Packit b099d7
    char prefix[300];
Packit b099d7
    int prefixlen;
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    sprintf (prefix, "\"%s\":%d", filename, lineno);
Packit b099d7
    prefixlen = strlen(prefix);
Packit b099d7
    fprintf (stderr, "%s:  %s", prefix, pd->line);
Packit b099d7
    i = cp - pd->line;
Packit b099d7
    if (i > 0 && pd->line[i-1] != '\n') {
Packit b099d7
	putc ('\n', stderr);
Packit b099d7
    }
Packit b099d7
    for (i += prefixlen + 3; i > 0; i--) {
Packit b099d7
	putc (' ', stderr);
Packit b099d7
    }
Packit b099d7
    fprintf (stderr, "^--- expecting %s\n", expecting);
Packit b099d7
    return NULL;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
#define MAXNAMELEN 256
Packit b099d7
Packit b099d7
static struct symtab **
Packit b099d7
lookup_variable (ip, var, len)
Packit b099d7
    IfParser *ip;
Packit b099d7
    const char *var;
Packit b099d7
    int len;
Packit b099d7
{
Packit b099d7
    char tmpbuf[MAXNAMELEN + 1];
Packit b099d7
    struct _parse_data *pd = (struct _parse_data *) ip->data;
Packit b099d7
Packit b099d7
    if (len > MAXNAMELEN)
Packit b099d7
	return 0;
Packit b099d7
Packit b099d7
    strncpy (tmpbuf, var, len);
Packit b099d7
    tmpbuf[len] = '\0';
Packit b099d7
    return isdefined (tmpbuf, pd->inc, NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
static int
Packit b099d7
my_eval_defined (ip, var, len)
Packit b099d7
    IfParser *ip;
Packit b099d7
    const char *var;
Packit b099d7
    int len;
Packit b099d7
{
Packit b099d7
    if (lookup_variable (ip, var, len))
Packit b099d7
	return 1;
Packit b099d7
    else
Packit b099d7
	return 0;
Packit b099d7
}
Packit b099d7
Packit b099d7
#define isvarfirstletter(ccc) (isalpha(ccc) || (ccc) == '_')
Packit b099d7
Packit b099d7
static long
Packit b099d7
my_eval_variable (ip, var, len)
Packit b099d7
    IfParser *ip;
Packit b099d7
    const char *var;
Packit b099d7
    int len;
Packit b099d7
{
Packit b099d7
    struct symtab **s;
Packit b099d7
Packit b099d7
    s = lookup_variable (ip, var, len);
Packit b099d7
    if (!s)
Packit b099d7
	return 0;
Packit b099d7
    do {
Packit b099d7
	var = (*s)->s_value;
Packit b099d7
	if (!isvarfirstletter(*var))
Packit b099d7
	    break;
Packit b099d7
	s = lookup_variable (ip, var, strlen(var));
Packit b099d7
    } while (s);
Packit b099d7
Packit b099d7
    return strtol(var, NULL, 0);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
int cppsetup(line, filep, inc)
Packit b099d7
	register char	*line;
Packit b099d7
	register struct filepointer	*filep;
Packit b099d7
	register struct inclist		*inc;
Packit b099d7
{
Packit b099d7
    IfParser ip;
Packit b099d7
    struct _parse_data pd;
Packit b099d7
    long val = 0;
Packit b099d7
Packit b099d7
    pd.filep = filep;
Packit b099d7
    pd.inc = inc;
Packit b099d7
    pd.line = line;
Packit b099d7
    ip.funcs.handle_error = my_if_errors;
Packit b099d7
    ip.funcs.eval_defined = my_eval_defined;
Packit b099d7
    ip.funcs.eval_variable = my_eval_variable;
Packit b099d7
    ip.data = (char *) &pd;
Packit b099d7
Packit b099d7
    (void) ParseIfExpression (&ip, line, &val;;
Packit b099d7
    if (val)
Packit b099d7
	return IF;
Packit b099d7
    else
Packit b099d7
	return IFFALSE;
Packit b099d7
}
Packit b099d7
#endif /* CPP */
Packit b099d7