1*4882a593Smuzhiyun %{ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Sub-Lexical Analyzer for macro invokation in 4*4882a593Smuzhiyun * the Aic7xxx SCSI Host adapter sequencer assembler. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (c) 2001 Adaptec Inc. 7*4882a593Smuzhiyun * All rights reserved. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 10*4882a593Smuzhiyun * modification, are permitted provided that the following conditions 11*4882a593Smuzhiyun * are met: 12*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright 13*4882a593Smuzhiyun * notice, this list of conditions, and the following disclaimer, 14*4882a593Smuzhiyun * without modification. 15*4882a593Smuzhiyun * 2. Redistributions in binary form must reproduce at minimum a disclaimer 16*4882a593Smuzhiyun * substantially similar to the "NO WARRANTY" disclaimer below 17*4882a593Smuzhiyun * ("Disclaimer") and any redistribution must be conditioned upon 18*4882a593Smuzhiyun * including a substantially similar Disclaimer requirement for further 19*4882a593Smuzhiyun * binary redistribution. 20*4882a593Smuzhiyun * 3. Neither the names of the above-listed copyright holders nor the names 21*4882a593Smuzhiyun * of any contributors may be used to endorse or promote products derived 22*4882a593Smuzhiyun * from this software without specific prior written permission. 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * Alternatively, this software may be distributed under the terms of the 25*4882a593Smuzhiyun * GNU General Public License ("GPL") version 2 as published by the Free 26*4882a593Smuzhiyun * Software Foundation. 27*4882a593Smuzhiyun * 28*4882a593Smuzhiyun * NO WARRANTY 29*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 30*4882a593Smuzhiyun * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 31*4882a593Smuzhiyun * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 32*4882a593Smuzhiyun * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 33*4882a593Smuzhiyun * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34*4882a593Smuzhiyun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35*4882a593Smuzhiyun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36*4882a593Smuzhiyun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37*4882a593Smuzhiyun * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 38*4882a593Smuzhiyun * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 39*4882a593Smuzhiyun * POSSIBILITY OF SUCH DAMAGES. 40*4882a593Smuzhiyun * 41*4882a593Smuzhiyun * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_scan.l#8 $ 42*4882a593Smuzhiyun * 43*4882a593Smuzhiyun * $FreeBSD$ 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #include <sys/types.h> 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #include <inttypes.h> 49*4882a593Smuzhiyun #include <limits.h> 50*4882a593Smuzhiyun #include <regex.h> 51*4882a593Smuzhiyun #include <stdio.h> 52*4882a593Smuzhiyun #include <string.h> 53*4882a593Smuzhiyun #include <sysexits.h> 54*4882a593Smuzhiyun #include "../queue.h" 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #include "aicasm.h" 57*4882a593Smuzhiyun #include "aicasm_symbol.h" 58*4882a593Smuzhiyun #include "aicasm_macro_gram.h" 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define MAX_STR_CONST 4096 61*4882a593Smuzhiyun static char string_buf[MAX_STR_CONST]; 62*4882a593Smuzhiyun static char *string_buf_ptr; 63*4882a593Smuzhiyun static int parren_count; 64*4882a593Smuzhiyun static char buf[255]; 65*4882a593Smuzhiyun int mmlineno; 66*4882a593Smuzhiyun %} 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun WORD [A-Za-z_][-A-Za-z_0-9]* 69*4882a593Smuzhiyun SPACE [ \t]+ 70*4882a593Smuzhiyun MCARG [^(), \t]+ 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun %x ARGLIST 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun %% 75*4882a593Smuzhiyun \n { 76*4882a593Smuzhiyun ++mmlineno; 77*4882a593Smuzhiyun } 78*4882a593Smuzhiyun \r ; 79*4882a593Smuzhiyun <ARGLIST>{SPACE} ; 80*4882a593Smuzhiyun <ARGLIST>\( { 81*4882a593Smuzhiyun parren_count++; 82*4882a593Smuzhiyun if (parren_count == 1) { 83*4882a593Smuzhiyun string_buf_ptr = string_buf; 84*4882a593Smuzhiyun return ('('); 85*4882a593Smuzhiyun } 86*4882a593Smuzhiyun *string_buf_ptr++ = '('; 87*4882a593Smuzhiyun } 88*4882a593Smuzhiyun <ARGLIST>\) { 89*4882a593Smuzhiyun if (parren_count == 1) { 90*4882a593Smuzhiyun if (string_buf_ptr != string_buf) { 91*4882a593Smuzhiyun /* 92*4882a593Smuzhiyun * Return an argument and 93*4882a593Smuzhiyun * rescan this parren so we 94*4882a593Smuzhiyun * can return it as well. 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun *string_buf_ptr = '\0'; 97*4882a593Smuzhiyun mmlval.str = string_buf; 98*4882a593Smuzhiyun string_buf_ptr = string_buf; 99*4882a593Smuzhiyun unput(')'); 100*4882a593Smuzhiyun return T_ARG; 101*4882a593Smuzhiyun } 102*4882a593Smuzhiyun BEGIN INITIAL; 103*4882a593Smuzhiyun return (')'); 104*4882a593Smuzhiyun } 105*4882a593Smuzhiyun parren_count--; 106*4882a593Smuzhiyun *string_buf_ptr++ = ')'; 107*4882a593Smuzhiyun } 108*4882a593Smuzhiyun <ARGLIST>{MCARG} { 109*4882a593Smuzhiyun char *yptr; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun yptr = mmtext; 112*4882a593Smuzhiyun while (*yptr) 113*4882a593Smuzhiyun *string_buf_ptr++ = *yptr++; 114*4882a593Smuzhiyun } 115*4882a593Smuzhiyun <ARGLIST>\, { 116*4882a593Smuzhiyun if (string_buf_ptr != string_buf) { 117*4882a593Smuzhiyun /* 118*4882a593Smuzhiyun * Return an argument and 119*4882a593Smuzhiyun * rescan this comma so we 120*4882a593Smuzhiyun * can return it as well. 121*4882a593Smuzhiyun */ 122*4882a593Smuzhiyun *string_buf_ptr = '\0'; 123*4882a593Smuzhiyun mmlval.str = string_buf; 124*4882a593Smuzhiyun string_buf_ptr = string_buf; 125*4882a593Smuzhiyun unput(','); 126*4882a593Smuzhiyun return T_ARG; 127*4882a593Smuzhiyun } 128*4882a593Smuzhiyun return ','; 129*4882a593Smuzhiyun } 130*4882a593Smuzhiyun {WORD}[(] { 131*4882a593Smuzhiyun /* May be a symbol or a macro invocation. */ 132*4882a593Smuzhiyun mmlval.sym = symtable_get(mmtext); 133*4882a593Smuzhiyun if (mmlval.sym->type != MACRO) { 134*4882a593Smuzhiyun stop("Expecting Macro Name", 135*4882a593Smuzhiyun EX_DATAERR); 136*4882a593Smuzhiyun } 137*4882a593Smuzhiyun unput('('); 138*4882a593Smuzhiyun parren_count = 0; 139*4882a593Smuzhiyun BEGIN ARGLIST; 140*4882a593Smuzhiyun return T_SYMBOL; 141*4882a593Smuzhiyun } 142*4882a593Smuzhiyun . { 143*4882a593Smuzhiyun snprintf(buf, sizeof(buf), "Invalid character " 144*4882a593Smuzhiyun "'%c'", mmtext[0]); 145*4882a593Smuzhiyun stop(buf, EX_DATAERR); 146*4882a593Smuzhiyun } 147*4882a593Smuzhiyun %% 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun int 150*4882a593Smuzhiyun mmwrap() 151*4882a593Smuzhiyun { 152*4882a593Smuzhiyun stop("EOF encountered in macro call", EX_DATAERR); 153*4882a593Smuzhiyun } 154