Blame nss/coreconf/mkdepend/cppsetup.c

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