ING_DB
This commit is contained in:
parent
f369a823c1
commit
17c282105d
|
|
@ -0,0 +1,167 @@
|
|||
# include <stdio.h>
|
||||
# include "gen.h"
|
||||
# include "constants.h"
|
||||
# include "globals.h"
|
||||
|
||||
char *Line_pos; /* position in input line */
|
||||
char Line_buf[MAXSTRING + 1]; /* buffer for input line */
|
||||
|
||||
static int Peekc[2] = {-1,-1};
|
||||
|
||||
/*
|
||||
** GETCH.C -- I/O manipulation routines
|
||||
**
|
||||
** Defines:
|
||||
** getch()
|
||||
** backup()
|
||||
** int Peekc[2] -- 2 char stack, if[0] != -1, the character to
|
||||
** be returned on the next call to getch().
|
||||
** char *Line_pos -- if != 0 *Line_pos is next
|
||||
** character that should be returned.
|
||||
** char Line_buf[MAXSTRING + 1] -- holds current
|
||||
** input line's text.
|
||||
**
|
||||
**
|
||||
**
|
||||
** initializes peek buffer to be empty
|
||||
*/
|
||||
|
||||
/*
|
||||
** GETCH -- Get a character from the input stream
|
||||
**
|
||||
** Returns:
|
||||
** the next character on the input stream, or
|
||||
** the backed up character if there is one.
|
||||
** EOF_TOK is returned on EOF.
|
||||
**
|
||||
** Side Effects:
|
||||
** If a backed up character exists, unloads it.
|
||||
** *Line_pos is returned if Line_pos != 0
|
||||
** and no backup character exists. Line_buf
|
||||
** contains the line from which characters are being
|
||||
** returned. A call with Line_pos == 0 forces
|
||||
** reading of the next input line. Yyline is
|
||||
** incremented when a newline is returned.
|
||||
** If an EOF is in the middle of a line,
|
||||
** then a newline will be appended.
|
||||
*/
|
||||
getch()
|
||||
{
|
||||
register char *cp;
|
||||
register int ch;
|
||||
static eoflag;
|
||||
extern int yyline;
|
||||
|
||||
if (Peekc[0] >= 0)
|
||||
{
|
||||
/* have a backed up character */
|
||||
ch = Peekc[0];
|
||||
if (ch == '\n')
|
||||
yyline += 1;
|
||||
Peekc[0] = Peekc[1];
|
||||
Peekc[1] = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( ; ; )
|
||||
{
|
||||
/* no lookahead character */
|
||||
if (!Line_pos)
|
||||
{
|
||||
if (eoflag)
|
||||
{
|
||||
eoflag = 0;
|
||||
|
||||
/* try to restore previous file */
|
||||
if (!restoref())
|
||||
return (0);
|
||||
# ifdef xDEBUG
|
||||
if (Chardebug || Lex_debug)
|
||||
printf("include file - pop\n");
|
||||
# endif
|
||||
}
|
||||
for (cp = Line_buf; (*cp = getc(In_file)) != '\n'
|
||||
&& ctoi(*cp) != EOF; cp++)
|
||||
{
|
||||
if (cp - Line_buf > sizeof Line_buf - 1)
|
||||
{
|
||||
printf("WARNING : line %d too long, broken in two\n",
|
||||
yyline);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ctoi(*cp) == EOF)
|
||||
{
|
||||
eoflag++;
|
||||
if (cp == Line_buf)
|
||||
/* EOF after '\n' */
|
||||
continue;
|
||||
/* EOF in middle of line */
|
||||
*cp = '\n';
|
||||
}
|
||||
Line_pos = Line_buf;
|
||||
|
||||
/* test for a "#include" line */
|
||||
if (tst_include())
|
||||
{
|
||||
/* Force reloading Line_buf */
|
||||
Line_pos = 0;
|
||||
eoflag = 0;
|
||||
# ifdef xDEBUG
|
||||
if (Chardebug || Lex_debug)
|
||||
printf("include file - push\n");
|
||||
# endif
|
||||
continue;
|
||||
}
|
||||
}
|
||||
cp = Line_pos;
|
||||
if (*cp == '\n')
|
||||
{
|
||||
Line_pos = 0;
|
||||
yyline += 1;
|
||||
}
|
||||
else
|
||||
Line_pos++;
|
||||
ch = *cp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ch = ctou(ch);
|
||||
|
||||
# ifdef xDEBUG
|
||||
if (Chardebug)
|
||||
printf("getch - returning '%c'.\n", ch);
|
||||
# endif
|
||||
|
||||
return (ch);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** BACKUP -- Back up a character on the input stream.
|
||||
** Backs up a single character into Peekc.
|
||||
**
|
||||
** Parameters:
|
||||
** ch - character to back up
|
||||
**
|
||||
** Side Effects:
|
||||
** pushes Peekc[0] to Peekc[1].
|
||||
** sets Peekc[0] to backed up character.
|
||||
*/
|
||||
backup(ch)
|
||||
register int ch;
|
||||
{
|
||||
extern int yyline;
|
||||
|
||||
# ifdef xDEBUG
|
||||
if (Chardebug)
|
||||
printf("backed up : '%c'\n", ch);
|
||||
# endif
|
||||
|
||||
if (Peekc[1] >= 0)
|
||||
AAsyserr(13002, yyline, Peekc[0], Peekc[1], ch);
|
||||
|
||||
Peekc[1] = Peekc[0];
|
||||
if ((Peekc[0] = ctou(ch)) == '\n')
|
||||
--yyline;
|
||||
}
|
||||
Loading…
Reference in New Issue