aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/aic7xxx/aicasm/aicasm_scan.l
diff options
context:
space:
mode:
authorJustin T. Gibbs <gibbs@FreeBSD.org>2001-07-18 21:03:32 +0000
committerJustin T. Gibbs <gibbs@FreeBSD.org>2001-07-18 21:03:32 +0000
commit2d0fbde8e7737d87b96629aec00c3b5a54672cc8 (patch)
treeddd7fb60cb076b56748bdc3e8cf396bd354eebe8 /sys/dev/aic7xxx/aicasm/aicasm_scan.l
parent7063595315224708d97e009a153dc6427f73eea2 (diff)
downloadsrc-2d0fbde8e7737d87b96629aec00c3b5a54672cc8.tar.gz
src-2d0fbde8e7737d87b96629aec00c3b5a54672cc8.zip
Notes
Diffstat (limited to 'sys/dev/aic7xxx/aicasm/aicasm_scan.l')
-rw-r--r--sys/dev/aic7xxx/aicasm/aicasm_scan.l57
1 files changed, 49 insertions, 8 deletions
diff --git a/sys/dev/aic7xxx/aicasm/aicasm_scan.l b/sys/dev/aic7xxx/aicasm/aicasm_scan.l
index 7bfe505846f1..1ec85ed85cf9 100644
--- a/sys/dev/aic7xxx/aicasm/aicasm_scan.l
+++ b/sys/dev/aic7xxx/aicasm/aicasm_scan.l
@@ -29,7 +29,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: //depot/src/aic7xxx/aicasm/aicasm_scan.l#4 $
+ * $Id: //depot/src/aic7xxx/aicasm/aicasm_scan.l#5 $
*
* $FreeBSD$
*/
@@ -54,6 +54,7 @@
char string_buf[MAX_STR_CONST];
char *string_buf_ptr;
int parren_count;
+int quote_count;
%}
PATH [-/A-Za-z0-9_.]*[./][-/A-Za-z0-9_.]*
@@ -63,6 +64,7 @@ SPACE [ \t]+
%x COMMENT
%x CEXPR
%x INCLUDE
+%x STRING
%%
\n { ++yylineno; }
@@ -94,8 +96,9 @@ if[ \t]*\( {
}
<CEXPR>\n { ++yylineno; }
<CEXPR>[^()\n]+ {
- char *yptr = yytext;
+ char *yptr;
+ yptr = yytext;
while (*yptr != '\0') {
/* Remove duplicate spaces */
if (*yptr == '\t')
@@ -109,6 +112,25 @@ if[ \t]*\( {
}
}
+VERSION { return T_VERSION; }
+\" {
+ string_buf_ptr = string_buf;
+ BEGIN STRING;
+ }
+<STRING>[^"]+ {
+ char *yptr;
+
+ yptr = yytext;
+ while (*yptr)
+ *string_buf_ptr++ = *yptr++;
+ }
+<STRING>\" {
+ /* All done */
+ BEGIN INITIAL;
+ *string_buf_ptr = '\0';
+ yylval.str = string_buf;
+ return T_STRING;
+ }
{SPACE} ;
/* Register/SCB/SRAM definition keywords */
@@ -175,7 +197,7 @@ nop { return T_NOP; }
else { return T_ELSE; }
/* Allowed Symbols */
-[-+,:()~|&."{};<>[\]!] { return yytext[0]; }
+[-+,:()~|&."{};<>[\]!=] { return yytext[0]; }
/* Number processing */
0[0-7]* {
@@ -194,17 +216,36 @@ else { return T_ELSE; }
}
/* Include Files */
-#include { return T_INCLUDE; BEGIN INCLUDE;}
-<INCLUDE>[<>\"] { return yytext[0]; }
-<INCLUDE>{PATH} { yylval.str = strdup(yytext); return T_PATH; }
-<INCLUDE>; { BEGIN INITIAL; return yytext[0]; }
+#include{SPACE} {
+ BEGIN INCLUDE;
+ quote_count = 0;
+ return T_INCLUDE;
+ }
+<INCLUDE>[<] { return yytext[0]; }
+<INCLUDE>[>] { BEGIN INITIAL; return yytext[0]; }
+<INCLUDE>[\"] {
+ if (quote_count != 0)
+ BEGIN INITIAL;
+ quote_count++;
+ return yytext[0];
+ }
<INCLUDE>. { stop("Invalid include line", EX_DATAERR); }
/* For parsing C include files with #define foo */
#define { yylval.value = TRUE; return T_CONST; }
/* Throw away macros */
#define[^\n]*[()]+[^\n]* ;
-{PATH} { yylval.str = strdup(yytext); return T_PATH; }
+<INITIAL,INCLUDE>{PATH} {
+ char *yptr;
+
+ yptr = yytext;
+ string_buf_ptr = string_buf;
+ while (*yptr)
+ *string_buf_ptr++ = *yptr++;
+ yylval.str = string_buf;
+ *string_buf_ptr = '\0';
+ return T_PATH;
+ }
{WORD} { yylval.sym = symtable_get(yytext); return T_SYMBOL; }