17ce72dbaSJustin T. Gibbs %{ 2098ca2bdSWarner Losh /*- 37ce72dbaSJustin T. Gibbs * Sub-Lexical Analyzer for macro invokation in 47ce72dbaSJustin T. Gibbs * the Aic7xxx SCSI Host adapter sequencer assembler. 57ce72dbaSJustin T. Gibbs * 67ce72dbaSJustin T. Gibbs * Copyright (c) 2001 Adaptec Inc. 77ce72dbaSJustin T. Gibbs * All rights reserved. 87ce72dbaSJustin T. Gibbs * 97ce72dbaSJustin T. Gibbs * Redistribution and use in source and binary forms, with or without 107ce72dbaSJustin T. Gibbs * modification, are permitted provided that the following conditions 117ce72dbaSJustin T. Gibbs * are met: 127ce72dbaSJustin T. Gibbs * 1. Redistributions of source code must retain the above copyright 137ce72dbaSJustin T. Gibbs * notice, this list of conditions, and the following disclaimer, 147ce72dbaSJustin T. Gibbs * without modification. 157ce72dbaSJustin T. Gibbs * 2. Redistributions in binary form must reproduce at minimum a disclaimer 167ce72dbaSJustin T. Gibbs * substantially similar to the "NO WARRANTY" disclaimer below 177ce72dbaSJustin T. Gibbs * ("Disclaimer") and any redistribution must be conditioned upon 187ce72dbaSJustin T. Gibbs * including a substantially similar Disclaimer requirement for further 197ce72dbaSJustin T. Gibbs * binary redistribution. 207ce72dbaSJustin T. Gibbs * 3. Neither the names of the above-listed copyright holders nor the names 217ce72dbaSJustin T. Gibbs * of any contributors may be used to endorse or promote products derived 227ce72dbaSJustin T. Gibbs * from this software without specific prior written permission. 237ce72dbaSJustin T. Gibbs * 247ce72dbaSJustin T. Gibbs * Alternatively, this software may be distributed under the terms of the 257ce72dbaSJustin T. Gibbs * GNU General Public License ("GPL") version 2 as published by the Free 267ce72dbaSJustin T. Gibbs * Software Foundation. 277ce72dbaSJustin T. Gibbs * 287ce72dbaSJustin T. Gibbs * NO WARRANTY 297ce72dbaSJustin T. Gibbs * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 307ce72dbaSJustin T. Gibbs * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 317ce72dbaSJustin T. Gibbs * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 327ce72dbaSJustin T. Gibbs * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 337ce72dbaSJustin T. Gibbs * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 347ce72dbaSJustin T. Gibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 357ce72dbaSJustin T. Gibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 367ce72dbaSJustin T. Gibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 377ce72dbaSJustin T. Gibbs * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 387ce72dbaSJustin T. Gibbs * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 397ce72dbaSJustin T. Gibbs * POSSIBILITY OF SUCH DAMAGES. 407ce72dbaSJustin T. Gibbs * 41708d2cb0SJustin T. Gibbs * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_scan.l#8 $ 427ce72dbaSJustin T. Gibbs * 437ce72dbaSJustin T. Gibbs * $FreeBSD$ 447ce72dbaSJustin T. Gibbs */ 457ce72dbaSJustin T. Gibbs 467ce72dbaSJustin T. Gibbs #include <sys/types.h> 477ce72dbaSJustin T. Gibbs 4899ddedd8SJustin T. Gibbs #include <inttypes.h> 497ce72dbaSJustin T. Gibbs #include <limits.h> 507ce72dbaSJustin T. Gibbs #include <regex.h> 517ce72dbaSJustin T. Gibbs #include <stdio.h> 527ce72dbaSJustin T. Gibbs #include <string.h> 537ce72dbaSJustin T. Gibbs #include <sysexits.h> 547ce72dbaSJustin T. Gibbs #ifdef __linux__ 557ce72dbaSJustin T. Gibbs #include "../queue.h" 567ce72dbaSJustin T. Gibbs #else 577ce72dbaSJustin T. Gibbs #include <sys/queue.h> 587ce72dbaSJustin T. Gibbs #endif 597ce72dbaSJustin T. Gibbs 607ce72dbaSJustin T. Gibbs #include "aicasm.h" 617ce72dbaSJustin T. Gibbs #include "aicasm_symbol.h" 627ce72dbaSJustin T. Gibbs #include "aicasm_macro_gram.h" 637ce72dbaSJustin T. Gibbs 647ce72dbaSJustin T. Gibbs #define MAX_STR_CONST 4096 657ce72dbaSJustin T. Gibbs static char string_buf[MAX_STR_CONST]; 667ce72dbaSJustin T. Gibbs static char *string_buf_ptr; 677ce72dbaSJustin T. Gibbs static int parren_count; 68b18a2ef1SXin LI static char msgbuf[255]; 69b18a2ef1SXin LI 70b18a2ef1SXin LI extern int mmlex(void); 717ce72dbaSJustin T. Gibbs %} 727ce72dbaSJustin T. Gibbs 737ce72dbaSJustin T. Gibbs WORD [A-Za-z_][-A-Za-z_0-9]* 747ce72dbaSJustin T. Gibbs SPACE [ \t]+ 757ce72dbaSJustin T. Gibbs MCARG [^(), \t]+ 767ce72dbaSJustin T. Gibbs 777ce72dbaSJustin T. Gibbs %x ARGLIST 787ce72dbaSJustin T. Gibbs 797ce72dbaSJustin T. Gibbs %% 807ce72dbaSJustin T. Gibbs \n { 817ce72dbaSJustin T. Gibbs ++yylineno; 827ce72dbaSJustin T. Gibbs } 83708d2cb0SJustin T. Gibbs \r ; 847ce72dbaSJustin T. Gibbs <ARGLIST>{SPACE} ; 857ce72dbaSJustin T. Gibbs <ARGLIST>\( { 867ce72dbaSJustin T. Gibbs parren_count++; 877ce72dbaSJustin T. Gibbs if (parren_count == 1) { 887ce72dbaSJustin T. Gibbs string_buf_ptr = string_buf; 897ce72dbaSJustin T. Gibbs return ('('); 907ce72dbaSJustin T. Gibbs } 917ce72dbaSJustin T. Gibbs *string_buf_ptr++ = '('; 927ce72dbaSJustin T. Gibbs } 937ce72dbaSJustin T. Gibbs <ARGLIST>\) { 947ce72dbaSJustin T. Gibbs if (parren_count == 1) { 957ce72dbaSJustin T. Gibbs if (string_buf_ptr != string_buf) { 967ce72dbaSJustin T. Gibbs /* 977ce72dbaSJustin T. Gibbs * Return an argument and 987ce72dbaSJustin T. Gibbs * rescan this parren so we 997ce72dbaSJustin T. Gibbs * can return it as well. 1007ce72dbaSJustin T. Gibbs */ 1017ce72dbaSJustin T. Gibbs *string_buf_ptr = '\0'; 1027ce72dbaSJustin T. Gibbs mmlval.str = string_buf; 1037ce72dbaSJustin T. Gibbs string_buf_ptr = string_buf; 1047ce72dbaSJustin T. Gibbs unput(')'); 1057ce72dbaSJustin T. Gibbs return T_ARG; 1067ce72dbaSJustin T. Gibbs } 1077ce72dbaSJustin T. Gibbs BEGIN INITIAL; 1087ce72dbaSJustin T. Gibbs return (')'); 1097ce72dbaSJustin T. Gibbs } 1107ce72dbaSJustin T. Gibbs parren_count--; 1117ce72dbaSJustin T. Gibbs *string_buf_ptr++ = ')'; 1127ce72dbaSJustin T. Gibbs } 1137ce72dbaSJustin T. Gibbs <ARGLIST>{MCARG} { 1147ce72dbaSJustin T. Gibbs char *yptr; 1157ce72dbaSJustin T. Gibbs 1167ce72dbaSJustin T. Gibbs yptr = mmtext; 1177ce72dbaSJustin T. Gibbs while (*yptr) 1187ce72dbaSJustin T. Gibbs *string_buf_ptr++ = *yptr++; 1197ce72dbaSJustin T. Gibbs } 1207ce72dbaSJustin T. Gibbs <ARGLIST>\, { 1217ce72dbaSJustin T. Gibbs if (string_buf_ptr != string_buf) { 1227ce72dbaSJustin T. Gibbs /* 1237ce72dbaSJustin T. Gibbs * Return an argument and 1247ce72dbaSJustin T. Gibbs * rescan this comma so we 1257ce72dbaSJustin T. Gibbs * can return it as well. 1267ce72dbaSJustin T. Gibbs */ 1277ce72dbaSJustin T. Gibbs *string_buf_ptr = '\0'; 1287ce72dbaSJustin T. Gibbs mmlval.str = string_buf; 1297ce72dbaSJustin T. Gibbs string_buf_ptr = string_buf; 1307ce72dbaSJustin T. Gibbs unput(','); 1317ce72dbaSJustin T. Gibbs return T_ARG; 1327ce72dbaSJustin T. Gibbs } 1337ce72dbaSJustin T. Gibbs return ','; 1347ce72dbaSJustin T. Gibbs } 1357ce72dbaSJustin T. Gibbs {WORD}[(] { 1367ce72dbaSJustin T. Gibbs /* May be a symbol or a macro invocation. */ 1377ce72dbaSJustin T. Gibbs mmlval.sym = symtable_get(mmtext); 1387ce72dbaSJustin T. Gibbs if (mmlval.sym->type != MACRO) { 1397ce72dbaSJustin T. Gibbs stop("Expecting Macro Name", 1407ce72dbaSJustin T. Gibbs EX_DATAERR); 1417ce72dbaSJustin T. Gibbs } 1427ce72dbaSJustin T. Gibbs unput('('); 1437ce72dbaSJustin T. Gibbs parren_count = 0; 1447ce72dbaSJustin T. Gibbs BEGIN ARGLIST; 1457ce72dbaSJustin T. Gibbs return T_SYMBOL; 1467ce72dbaSJustin T. Gibbs } 1477ce72dbaSJustin T. Gibbs . { 148b18a2ef1SXin LI snprintf(msgbuf, sizeof(msgbuf), "Invalid character " 1497ce72dbaSJustin T. Gibbs "'%c'", mmtext[0]); 150b18a2ef1SXin LI stop(msgbuf, EX_DATAERR); 1517ce72dbaSJustin T. Gibbs } 1527ce72dbaSJustin T. Gibbs %% 1537ce72dbaSJustin T. Gibbs 1547ce72dbaSJustin T. Gibbs int 1557ce72dbaSJustin T. Gibbs mmwrap() 1567ce72dbaSJustin T. Gibbs { 1577ce72dbaSJustin T. Gibbs stop("EOF encountered in macro call", EX_DATAERR); 158b18a2ef1SXin LI return (1); 1597ce72dbaSJustin T. Gibbs } 160