char *stringLiteral();
char *currFname;
-extern int lineno ;
+extern int lineno, column;
extern char *filename ;
extern char *fullSrcFileName ;
int yylineno = 1 ;
void count() ;
-void comment();
int process_pragma(char *);
#undef yywrap
}
*asmp++ = '\n' ;
}
-"/*" { comment(); }
"at" { count(); TKEYWORD(AT) ; }
"auto" { count(); return(AUTO); }
"bit" { count(); TKEYWORD(BIT) ; }
"\r\n" { count(); }
"\n" { count(); }
[ \t\v\f] { count(); }
+\\ {
+ char ch=input();
+ if (ch!='\n') {
+ // that could have been removed by the preprocessor anyway
+ werror (W_STRAY_BACKSLASH, column);
+ unput(ch);
+ }
+}
. { count() ; }
%%
/* set the current line number to */
/* line number if printFlag is on */
if (!*s) {
- yylineno = lNum ;
- return 0;
+ lineno = yylineno = lNum ;
+ return 0;
}
/* if we have a filename then check */
s++ ;
if ( strncmp(s,fullSrcFileName,strlen(fullSrcFileName)) == 0) {
- yylineno = lNum - 2;
- currFname = fullSrcFileName ;
+ lineno = yylineno = lNum;
+ currFname = fullSrcFileName ;
} else {
char *sb = s;
/* mark the end of the filename */
*s = '\0';
currFname = Safe_calloc(1,strlen(sb)+1);
strcpy(currFname,sb);
- yylineno = lNum - 2;
+ lineno = yylineno = lNum;
}
filename = currFname ;
return 0;
}
-void comment()
-{
- char c, c1;
-
-loop:
- while ((c = input()) != '*' && c != 0)
- if ( c == '\n')
- yylineno++ ;
-
- if ((c1 = input()) != '/' && c != 0) {
- if ( c1 == '\n' )
- yylineno++ ;
-
- unput(c1);
- goto loop;
- }
-
-}
-
-
-
int column = 0;
int plineIdx=0;
void count()
{
- int i;
- for (i = 0; yytext[i] != '\0'; i++) {
- if (yytext[i] == '\n') {
- column = 0;
- lineno = ++yylineno ;
- }
- else
- if (yytext[i] == '\t')
- column += 8 - (column % 8);
- else
- column++;
- }
-
- /* ECHO; */
+ int i;
+ for (i = 0; yytext[i] != '\0'; i++) {
+ if (yytext[i] == '\n') {
+ column = 0;
+ lineno = ++yylineno ;
+ }
+ else
+ if (yytext[i] == '\t')
+ column += 8 - (column % 8);
+ else
+ column++;
+ }
+ /* ECHO; */
}
int check_type()
}
}
-char strLitBuff[2048] ;
+char strLitBuff[2048]; // TODO: this is asking for the next bug :)
/*
* 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 */
+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 escape char's are allowed */
+ if (ch == '\\') {
+ ch=input();
+ if (ch=='\n') {
+ /* \<newline> is a continuator */
+ lineno=++yylineno;
+ column=0;
+ continue;
+ }
+ *str++ = '\\'; /* backslash in place */
+ *str++ = ch; /* get the escape char, no further check */
+ continue; /* carry on */
}
+
+ /* if new line we have a new line break, which is illegal */
+ if (ch == '\n') {
+ werror (W_NEWLINE_IN_STRING);
+ *str++ = '\n';
+ lineno=++yylineno;
+ column=0;
+ continue;
+ }
+
+ /* 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) || ch=='\\')) {
+ switch (ch) {
+ case '\\':
+ if ((ch=input())!='\n') {
+ werror (W_STRAY_BACKSLASH, column);
+ unput(ch);
+ } else {
+ lineno=++yylineno;
+ column=0;
+ }
+ break;
+ case '\n':
+ yylineno++;
+ break;
+ }
+ }
- /* 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)
+ break;
- if (ch != '\"')
- {
- unput(ch) ;
- break ;
+ if (ch != '\"') {
+ unput(ch) ;
+ break ;
}
}
-
- *str++ = ch; /* Put next substring introducer into output string */
+ *str++ = ch; /* Put next substring introducer into output string */
}
-
-*str = '\0';
-
-return strLitBuff ;
+ *str = '\0';
+
+ return strLitBuff;
}
void doPragma (int op, char *cp)