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