1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292
|
/* Copyright 1989 GROUPE BULL -- See license conditions in file COPYRIGHT
** Copyright 1989 Massachusetts Institute of Technology
**/
/****************************\
* *
* Lex generator for Wool *
* *
\****************************/
%{
/* to have always at least MAX_TOKEN_LENGTH chars in all lexes */
#undef YYLMAX
#define YYLMAX MAX_TOKEN_LENGTH
/* here goes the definition of lex I/O, as macros for efficiency */
/* first, we forget the previous definitions, */
#undef output
#undef YY_INPUT
#undef ECHO
/* So here are OUR macros */
static int yyin_is_string; /* 0 ==> reading from STREAM yyin */
/* 1 ==> reading from STRING yystrin */
static int yyout_is_string; /* 0 ==> printing on STREAM yyout */
/* 1 ==> printing on WOOL_STRING_STREAM yystrout */
static char *yystrin; /* current pointer on input string */
static WOOL_STRING_STREAM yystrout; /* current wool output stream */
int yylineno=0; /* flex doesn't have this */
#define output(c) {\
if(yyout_is_string){\
*(yystrout->ptr)++ = c;\
*(yystrout->ptr) = '\0';\
if((yystrout->ptr) >= (yystrout->last)){\
yyoutflush();\
}\
}else{\
putc(c,yyout);\
}\
}
#define ECHO {\
int i;\
for (i=0; i<yyleng; i++)\
output(yytext[i]);\
}
#define YY_INPUT(buf, result, max_size) \
if(yyin_is_string) {\
strncpy(buf, yystrin, max_size-1);\
yystrin += result = strlen(buf);\
} else {\
if((result = read(fileno(yyin), buf, max_size)) < 0)\
YY_FATAL_ERROR("read() in flex scanner failed");\
}
/*
#define YY_INPUT(buf, result, max_size) \
if(yyin_is_string)\
(*buf = *yystrin)? yystrin++:0;\
result=1;\
} else {\
if((result = read(fileno(yyin), buf, max_size)) < 0)\
YY_FATAL_ERROR("read() in flex scanner failed");\
}
*/
/* handling of wool buffer stack */
#define WOOL_MAX_BUFFER_STACK 50
static YY_BUFFER_STATE wool_buffer_stack[WOOL_MAX_BUFFER_STACK];
static int wool_buffer_sp = 0;
/* counting the parentheses -- hack for wool_pool */
#define INC_PAR wool_pool_parentheses_level++
#define DEC_PAR if(wool_pool_parentheses_level)wool_pool_parentheses_level--
%}
FNCP [^-+\004 \t\n"'()0-9]
FNC [^\004 \t\n"'()0-9]
NC [^\004 \t\n"'()]
SIGN [-+]
%%
\n yylineno++; REJECT; /* That's faster than in the macro */
.[\010] ; /* handles backspacing */
.[\177] ; /* handles deleting */
\"([^\\\"\n]|\\(.|\n)|\"\")*\" return(STRING); /* strings */
\"([^\\\"\n]|\\(.|\n)|\"\")*\n return(NON_CLOSED_STRING); /* error */
\;.*\n ; /* comments */
[-+]?[0-9]+ return(NUMBER); /* integers */
0[xX][0-9a-fA-F]+ return(HEX_NUMBER); /* hex integers */
"(" {INC_PAR; return(LEFTPAR);} /* start of list */
")" {DEC_PAR; return(RIGHTPAR);} /* end of list */
"'" return(QUOTECHAR); /* quoting */
"{" {INC_PAR; return(LEFTBRA);} /* (progn */
"}" {DEC_PAR; return(RIGHTBRA);} /* ) */
{FNCP}{NC}* return (NAME); /* identifier */
{SIGN}{FNC}{NC}* return (NAME); /* +foo */
{SIGN} return (NAME); /* + */
[ \t\n] ; /* blanks */
<<EOF>> return(END_OF_FILE); /* pseudo-EOF handling */
. ; /* skip over control codes */
%%
/**********************\
* *
* WOOL's I/O package *
* *
\**********************/
/* externally callable function for unput:
* Doesn't do anything, since we solved include files by
* using switch_buffer() calls.
*/
wool_unput(buffer)
char *buffer;
{
}
/*
* yyoutflush
* to flush wool output buffer.
*/
void
yyoutflush(){
if(yyout_is_string){
ASSERT(yystrout->overflow_handler);
/*XXX-UWE-XXX*/
(*(yystrout->overflow_handler))(yystrout);
/* yystrout->ptr = yystrout-> buffer; */
/*XXX-UWE-XXX*/
}else{
fflush(yyout);
}
}
/*
* wool_input_redirect
* to set wool's parsing to the stream or string argument.
* arg1 = type (0 = string, 1 = stream);
* arg2 = stream or string
* arg3 = POINTER to (FILE *) or (char *) where will go the old stream
* (if NULL not set)(returns the old type)
* arg4 = used to be:
* where to save contents of unput buffer (if not NULL)
* now is:
* if not NULL, open new buffer; otherwise pop most
* recent.
*/
int wool_input_redirect(type, stream, oldstream_p, old_buffer_contents)
int type;
char *stream;
char **oldstream_p;
char *old_buffer_contents;
{
int oldtype = yyin_is_string;
if(oldstream_p) *oldstream_p =
(oldtype ? (char *) yystrin : (char *) yyin);
if(yyin_is_string = type){
yystrin = stream;
}else{
yyin = (FILE *) stream;
}
if(old_buffer_contents != NULL) {
/* open new buffer */
if(wool_buffer_sp >= WOOL_MAX_BUFFER_STACK)
YY_FATAL_ERROR("wool_buffer_stack overflow");
wool_buffer_stack[wool_buffer_sp++] = YY_CURRENT_BUFFER;
yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
} else{
/* pop most recent buffer */
if(--wool_buffer_sp < 0)
YY_FATAL_ERROR("wool_buffer_stack empty");
yy_delete_buffer( YY_CURRENT_BUFFER );
yy_switch_to_buffer(wool_buffer_stack[wool_buffer_sp]);
}
return oldtype;
}
/*
* wool_output_redirect
* to set wool's outputs to the stream or string argument.
* arg1 = type (0 = string, 1 = stream);
* arg2 = stream or string
* arg4 = POINTER to (FILE *) or WOOL_STRING_STREAM tu put the old stream
* (if NULL not set)(returns the old type)
*/
wool_output_redirect(type, stream, oldstream_p)
int type;
char *stream;
char **oldstream_p;
{
int oldtype = yyout_is_string;
if(oldstream_p) *oldstream_p =
(oldtype ? (char *) yystrout : (char *) yyout);
yyoutflush();
if(yyout_is_string = type){
yystrout = (WOOL_STRING_STREAM) stream;
}else{
yyout = (FILE *) stream;
}
return oldtype;
}
/*
* now, some functions to provide a printf - like service on wool's output.
*/
/* prints a string */
void
wool_puts(string)
register char *string;
{
while(*string) output(*string++);
}
/* put a newline */
wool_newline()
{
output('\n');
}
/* does a format with ONE arg. */
wool_printf(string, arg)
register char *string;
char *arg;
{
static char wool_temp_string[MAX_TEMP_STRING_SIZE];
sprintf(wool_temp_string, string, arg);
wool_puts(wool_temp_string);
}
/* prints a char */
void
wool_putchar(c)
char c;
{
output(c);
}
/*
* function to make a WOOL_STRING_STREAM of a given capacity
* arg1 = capactity in bytes
* arg2 = user function to be called on buffer when overflow occurs
*/
WOOL_STRING_STREAM WOOL_STRING_STREAM_make(nbytes, handler)
int nbytes;
int (* handler)();
{
WOOL_STRING_STREAM str = (WOOL_STRING_STREAM)
Malloc(sizeof(struct _WOOL_STRING_STREAM));
str->buffer = (char *) Malloc(nbytes);
*str->buffer = '\0'; /*XXX-UWE-XXX*/
str->ptr = str->buffer;
str->last = str->buffer + nbytes -1;
str->overflow_handler = handler;
return str;
}
/*
* and the function to free a stream
*/
WOOL_STRING_STREAM_free (str)
WOOL_STRING_STREAM str;
{
Free(str->buffer);
Free(str);
}
|