blob: 60edae112d5910d42a38631552309c5b9a12c0d3 [file] [log] [blame]
/* To compile use:
cc stringI.c lex.o -lm
*/
#include <stdio.h>
#include <stdlib.h>
#include "scanner.h" /* Useful Macro Definitions */
#define LEX_LEN_INCR 256
#define PERROR_1 0
char CH; /* Current input Character */
char *LEXEME; /* Input String */
char *FRONT,*BACK; /* FRONT and BACK characters of Input String*/
unsigned LEX_LEN = 0; /* Size of the Input String Buffer */
/* FORWORD function definitions */
/* extern char *calloc(); */
void FLUSH(void)
/* Clear input string (LEXEME), reset buffer to correct size, and reset
pointers */
{
/* reset buffer to correst size if necessary */
if (LEX_LEN > LEX_LEN_INCR)
{
free(LEXEME);
LEX_LEN = LEX_LEN_INCR;
LEXEME = calloc(LEX_LEN,sizeof(CH));
}
/* Clear input string */
*LEXEME = 0;
/* reset pointers */
BACK = LEXEME;
FRONT = BACK - 1;
}
void GETCHR(void)
/* gets the next character form input file and expands buffer if needed */
{
char *TEMP;
int I;
/* expand buffer if needed */
if (FRONT-BACK >= LEX_LEN-3)
{
LEX_LEN = LEX_LEN + LEX_LEN_INCR;
TEMP = calloc(LEX_LEN,sizeof(CH));
for (I = 0; I < LEX_LEN - LEX_LEN_INCR; I ++)
TEMP[I] = LEXEME[I];
}
/* get next character */
CH = getc(stdin);
/* update input string appropriately */
FRONT ++;
*FRONT = CH;
*(FRONT+1) = 0;
}
void BACKUP(void)
/* backups input string to last character of input and writes current
character back on input file */
{
if (FRONT < BACK)
(void) printf(
"%D SCANNER ERROR: Tried to BACKUP past beginning of a Token\n",
PERROR_1);
else
{
/* put current char back on input file */
(void) ungetc(CH,stdin);
/* backup input string one character */
*FRONT = 0;
FRONT --;
CH = *FRONT;
}
}