P8000/WEGA/contrib/ingres/dbs/src/eql/comment.c

63 lines
1.4 KiB
C

# include <stdio.h>
# include "gen.h"
# include "constants.h"
# include "globals.h"
/*
** COMMENT.C -- routine to scan comments inside an EQL statement
**
** Uses the endcmnt token code to find the endcmnt
** terminal string, then reads the input until it sees this
** terminal (must be <= 2 characters), returning EOF_TOK and
** giving an error diagnostic if end-of-file is encountered.
**
** Returns:
** CONTINUE -- valid comment
** EOF_TOK -- EOF in comment
**
** Side Effects:
** deletes comments from within an EQL statement
**
*/
comment()
{
register int i;
register int l;
register struct optab *op;
char buf[3];
/* find end of comment operator */
for (op = Optab; op->op_term; op++)
if (op->op_token == Tokens.sp_endcmnt)
break;
if (!op->op_term)
AAsyserr(13000);
/* scan for the end of comment */
l = AAlength(op->op_term);
if (l > sizeof buf - 1)
AAsyserr(13001, l, op->op_term, sizeof buf -1);
/* fill buffer to length of endmnt terminal */
for (i = 0; i < l; i++)
{
if ((buf[i] = getch()) == EOF_TOK)
{
nontermcom :
/* non-terminated comment */
yysemerr("premature EOF encountered in comment", (char *) 0);
return (EOF_TOK);
}
}
/* shift on input until endcmnt */
while (!AAbequal(buf, op->op_term, l))
{
for (i = 0; i < l - 1; i++)
buf[i] = buf[i + 1];
if ((buf[l - 1] = getch()) == EOF_TOK)
goto nontermcom;
}
return (CONTINUE);
}