/*************************************************************************************************************************************/
/* */
/* A N A L Y S E D E S E X P R E S S I O N S D U P R E - P R O C E S S E U R ' cpp ' : */
/* */
/* */
/* Author of '$xcp/cpp$D/beau_yylex$c' : */
/* */
/* Unknown... */
/* */
/* */
/* Version amelioree de '$xcp/cpp$D/beau_yylex$c' par : */
/* */
/* Jean-Francois Colonna (LACTAMME, AAAAMMJJhhmmss). */
/* */
/*************************************************************************************************************************************/
#define CHAR char
/* ATTENTION : ne pas mettre : */
/* */
/* #ifdef SYSTEME_FX2800_CONCENTRIX_SCC */
/* #undef CHAR */
/* #define CHAR unsigned char */
/* #else SYSTEME_FX2800_CONCENTRIX_SCC */
/* #endif SYSTEME_FX2800_CONCENTRIX_SCC */
/* */
/* car paradoxalement, cela evite de gros ennuis... */
#ifdef SYSTEME_HP705_HPUX_CC
# undef CHAR
# define CHAR unsigned char
#else SYSTEME_HP705_HPUX_CC
#endif SYSTEME_HP705_HPUX_CC
#ifdef SYSTEME_HP710_HPUX_CC
# undef CHAR
# define CHAR unsigned char
#else SYSTEME_HP710_HPUX_CC
#endif SYSTEME_HP710_HPUX_CC
#ifdef SYSTEME_HP720_HPUX_CC
# undef CHAR
# define CHAR unsigned char
#else SYSTEME_HP720_HPUX_CC
#endif SYSTEME_HP720_HPUX_CC
#ifdef SYSTEME_HP750_HPUX_CC
# undef CHAR
# define CHAR unsigned char
#else SYSTEME_HP750_HPUX_CC
#endif SYSTEME_HP750_HPUX_CC
#include "beau_cpp.I"
#define isid(a) ((fastab+COFF)[a]&IB)
#define IB 1
#define COFF 0
extern int uflag;
/* Ne pas editer (si egal 1) les messages d'erreur du type : */
/* */
/* Error : ...: undef symbol ... in preprocessor if */
/* */
yylex()
{
static int ifdef = 0;
static CHAR *op2[] = {"||","&&",">>","<<",">=","<=","!=","=="};
static int val2[] = {OROR,ANDAND,RS,LS,GE,LE,NE,EQ};
static CHAR *opc = "b\bt\tn\nf\fr\r\\\\";
extern CHAR fastab[];
extern CHAR *outp,*inp,*newp;
extern int flslvl;
register CHAR savc,*s;
CHAR *skipbl();
int val;
register CHAR **p2;
struct symtab
{
CHAR *name;
CHAR *value;
} *sp,*lookup();
for (;;)
{
newp = skipbl(newp);
if (*inp == '\n')
{
/* End of #if */
return(stop);
}
else
{
}
savc = *newp;
*newp = '\0';
if ((*inp == '/') && (inp[1] == '*'))
{
/* Found a comment with -C option, still toss here */
*newp = savc;
outp = inp = newp;
continue;
}
else
{
}
for (p2 = op2+8;--p2 >= op2;)
{
/* Check 2-char ops */
if (strcmp(*p2,inp) == 0)
{
val = val2[p2-op2];
goto ret;
}
else
{
}
}
s = "+-*/%<>&^|?:!~(),";
/* Check 1-char ops */
while (*s)
{
if (*s++ == *inp)
{
val= *--s;
goto ret;
}
else
{
}
}
if ((*inp<='9') && (*inp>='0'))
/* A number */
{
if (*inp == '0')
{
yylval= ((inp[1] == 'x') || (inp[1] == 'X')) ? tobinary(inp+2,16) : tobinary(inp+1,8);
}
else
{
yylval = tobinary(inp,10);
}
val = number;
}
else
{
if (isid(*inp))
{
if ((strcmp(inp,"defined") == 0) || (strcmp(inp,"dfd") == 0))
/* La fonction 'dfd(...)' a ete rajoute le 19970218103116 afin de raccourcir certaines */
/* lignes ('v $xiii/di_image$FON dfd'). */
{
ifdef = 1;
++flslvl;
val = DEFINED;
}
else
{
if (ifdef != 0)
{
/* Cas de la fonction 'defined(...)' (et de son equivalent 'dfd(...)') : */
register CHAR *p;
register int savech;
/* Make sure names <= NCPS chars */
if ((newp-inp) > NCPS)
{
p = inp+NCPS;
}
else
{
p = newp;
}
savech = *p;
*p = '\0';
sp = lookup(inp,-1);
*p = savech;
ifdef = 0;
--flslvl;
}
else
{
/* Cas d'une directive '#if' : */
sp = lookup(inp,-1);
if (sp->value == 0)
{
if (uflag == 0)
{
yypperror("undef symbol %s in preprocessor if",inp);
/* ATTENTION, dans la norme (traduite en particulier par '/lib/cpp'), lorsqu'un symbole */
/* est inexistant dans une directive '#if', il est considere comme existant avec une valeur */
/* nulle. Cela me paraissant extrement dangereux, je conserve cela, mais en editant un */
/* message d'erreur (cette modification a ete faite le 1995031600). */
/* */
/* Le 20210301160547, 'yypperror(...)' -a deux arguments- a remplace 'pperror(...)' -qui */
/* en demandait trois-... */
}
else
{
}
}
else
{
}
}
yylval = (sp->value == 0) ? 0 : 1;
val = number;
}
}
else
{
if (*inp == '\'')
/* Character constant */
{
val = number;
if (inp[1] == '\\')
/* Escaped */
{
CHAR c;
if (newp[-1] == '\'')
{
newp[-1] = '\0';
}
else
{
}
s = opc;
while (*s)
{
if (*s++ != inp[2])
{
++s;
}
else
{
yylval = *s;
goto ret;
}
}
if ((inp[2] <= '9') && (inp[2] >= '0'))
{
yylval = c = tobinary(inp+2,8);
}
else
{
yylval = inp[2];
}
}
else
yylval = inp[1];
}
else
{
if (strcmp("\\\n",inp) == 0)
{
*newp = savc;
continue;
}
else
{
*newp = savc;
yypperror("Illegal character %c in preprocessor if",*inp);
/* Le 20210301160547, 'yypperror(...)' -a deux arguments- a remplace 'pperror(...)' -qui */
/* en demandait trois-... */
continue;
}
}
}
}
ret:
/* Check for non-ident after defined (note need the paren!) */
if ((ifdef) && (val != '(') && (val != DEFINED))
{
yypperror("\"defined\" modifying non-identifier \"%s\" in preprocessor if",inp);
/* Le 20210301160547, 'yypperror(...)' -a deux arguments- a remplace 'pperror(...)' -qui */
/* en demandait trois-... */
ifdef = 0;
flslvl--;
}
else
{
}
*newp = savc;
outp = inp = newp;
return(val);
}
}
tobinary(st,b)
CHAR *st;
{
int n,c,t;
CHAR *s;
n = 0;
s = st;
while (c = *s++)
{
switch (c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
t = c-'0';
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
t = c-'a';
if (b > 10)
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
t = c-'A';
if (b > 10)
{
break;
}
else
{
}
default:
t = -1;
if ((c == 'l') || (c == 'L'))
{
if (*s == '\0')
{
break;
}
else
{
}
}
else
{
}
yypperror("Illegal number %s",st);
/* Le 20210301160547, 'yypperror(...)' -a deux arguments- a remplace 'pperror(...)' -qui */
/* en demandait trois-... */
}
if (t < 0)
break;
n = n*b+t;
}
return(n);
}