}
#define TKEYWORD(token) return (isTargetKeyword(yytext) ? token :\
check_type(yytext))
-char asmbuff[MAX_INLINEASM] ;
+char *asmbuff=NULL;
+int asmbuffSize=0;
char *asmp ;
extern int check_type ();
extern int isTargetKeyword ();
%}
%x asm
%%
-"_asm" { count(); asmp = asmbuff ;BEGIN(asm) ;}
-<asm>"_endasm" { count() ;
- *asmp = '\0' ;
- strcpy(yylval.yyinline,asmbuff) ;
- BEGIN(INITIAL) ;
- return (INLINEASM) ; }
-<asm>. { *asmp++ = yytext[0] ; }
-<asm>\n { count(); *asmp++ = '\n' ;}
+"_asm" {
+ count();
+ asmp = asmbuff = Safe_realloc (asmbuff, INITIAL_INLINEASM);
+ asmbuffSize=INITIAL_INLINEASM;
+ BEGIN(asm) ;
+}
+<asm>"_endasm" {
+ count();
+ *asmp = '\0';
+ yylval.yyinline = Safe_calloc (1, strlen(asmbuff)+1);
+ strcpy(yylval.yyinline,asmbuff);
+ BEGIN(INITIAL);
+ return (INLINEASM);
+}
+<asm>. {
+ if (asmp-asmbuff >= asmbuffSize-2) {
+ // increase the buffersize with 50%
+ int size=asmp-asmbuff;
+ asmbuffSize=asmbuffSize*3/2;
+ asmbuff = Safe_realloc (asmbuff, asmbuffSize);
+ asmp=asmbuff+size;
+ }
+ *asmp++ = yytext[0];
+}
+<asm>\n {
+ count();
+ if (asmp-asmbuff >= asmbuffSize-3) {
+ // increase the buffersize with 50%
+ int size=asmp-asmbuff;
+ asmbuffSize=asmbuffSize*3/2;
+ asmbuff = Safe_realloc (asmbuff, asmbuffSize);
+ asmp=asmbuff+size;
+ }
+ *asmp++ = '\n' ;
+}
"/*" { comment(); }
"at" { count(); TKEYWORD(AT) ; }
"auto" { count(); return(AUTO); }
"void" { count(); return(VOID); }
"volatile" { count(); return(VOLATILE); }
"using" { count(); TKEYWORD(USING); }
+"_naked" { count(); TKEYWORD(NAKED); }
"while" { count(); return(WHILE); }
"xdata" { count(); TKEYWORD(XDATA); }
"_data" { count(); TKEYWORD(_NEAR); }
char strLitBuff[2048] ;
+/*
+ * Change by JTV 2001-05-19 to not concantenate strings
+ * to support ANSI hex and octal escape sequences in string liteals
+ */
+
char *stringLiteral ()
+
{
- int ch;
- char *str = strLitBuff ;
-
- *str++ = '\"' ;
- /* put into the buffer till we hit the */
- /* first \" */
- while (1) {
-
- ch = input() ;
- if (!ch) break ; /* end of input */
- /* if it is a \ then everything allowed */
- if (ch == '\\') {
- *str++ = ch ; /* backslash in place */
- *str++ = input() ; /* following char in place */
- continue ; /* carry on */
- }
-
- /* if new line we have a new line break */
- if (ch == '\n') break ;
-
- /* if this is a quote then we have work to do */
- /* find the next non whitespace character */
- /* if that is a double quote then carry on */
- if (ch == '\"') {
-
- while ((ch = input()) && isspace(ch)) ;
- if (!ch) break ;
- if (ch != '\"') {
- unput(ch) ;
- break ;
- }
-
- continue ;
- }
- *str++ = ch;
- }
- *str++ = '\"' ;
- *str = '\0';
- return strLitBuff ;
+int ch;
+char *str = strLitBuff ;
+
+*str++ = '\"' ;
+/* put into the buffer till we hit the */
+/* first \" */
+
+while (1)
+ {
+ ch = input() ;
+
+ if (!ch)
+ break ; /* end of input */
+
+ /* if it is a \ then everything allowed */
+
+ if (ch == '\\')
+ {
+ *str++ = ch ; /* backslash in place */
+ *str++ = input() ; /* following char in place */
+ continue ; /* carry on */
+ }
+
+ /* if new line we have a new line break */
+ if (ch == '\n')
+ break ;
+
+ /* if this is a quote then we have work to do */
+ /* find the next non whitespace character */
+ /* if that is a double quote then carry on */
+
+ if (ch == '\"')
+ {
+ *str++ = ch ; /* Pass end of this string or substring to evaluator */
+
+ while ((ch = input()) && isspace(ch)) ;
+
+ if (!ch)
+ break ;
+
+ if (ch != '\"')
+ {
+ unput(ch) ;
+ break ;
+ }
+ }
+
+ *str++ = ch; /* Put next substring introducer into output string */
+ }
+
+*str = '\0';
+
+return strLitBuff ;
}
void doPragma (int op, char *cp)