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