1160814Ssimon%{ 2160814Ssimon/*- 3160814Ssimon * Sub-parser for macro invocation in the Aic7xxx SCSI 4160814Ssimon * Host adapter sequencer assembler. 5160814Ssimon * 6160814Ssimon * Copyright (c) 2001 Adaptec Inc. 7160814Ssimon * All rights reserved. 8160814Ssimon * 9160814Ssimon * Redistribution and use in source and binary forms, with or without 10160814Ssimon * modification, are permitted provided that the following conditions 11160814Ssimon * are met: 12160814Ssimon * 1. Redistributions of source code must retain the above copyright 13160814Ssimon * notice, this list of conditions, and the following disclaimer, 14160814Ssimon * without modification. 15160814Ssimon * 2. Redistributions in binary form must reproduce at minimum a disclaimer 16160814Ssimon * substantially similar to the "NO WARRANTY" disclaimer below 17160814Ssimon * ("Disclaimer") and any redistribution must be conditioned upon 18160814Ssimon * including a substantially similar Disclaimer requirement for further 19160814Ssimon * binary redistribution. 20160814Ssimon * 3. Neither the names of the above-listed copyright holders nor the names 21160814Ssimon * of any contributors may be used to endorse or promote products derived 22160814Ssimon * from this software without specific prior written permission. 23160814Ssimon * 24160814Ssimon * Alternatively, this software may be distributed under the terms of the 25238405Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 26160814Ssimon * Software Foundation. 27160814Ssimon * 28160814Ssimon * NO WARRANTY 29160814Ssimon * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 30160814Ssimon * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 31160814Ssimon * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 32160814Ssimon * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 33160814Ssimon * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34160814Ssimon * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35160814Ssimon * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36238405Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 37160814Ssimon * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 38160814Ssimon * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 39160814Ssimon * POSSIBILITY OF SUCH DAMAGES. 40160814Ssimon * 41160814Ssimon * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_gram.y#5 $ 42160814Ssimon * 43160814Ssimon * $FreeBSD$ 44160814Ssimon */ 45160814Ssimon 46160814Ssimon#include <sys/types.h> 47160814Ssimon 48160814Ssimon#include <inttypes.h> 49160814Ssimon#include <regex.h> 50160814Ssimon#include <stdio.h> 51160814Ssimon#include <stdlib.h> 52160814Ssimon#include <string.h> 53160814Ssimon#include <sysexits.h> 54160814Ssimon#include <sys/queue.h> 55160814Ssimon 56160814Ssimon#include "aicasm.h" 57160814Ssimon#include "aicasm_symbol.h" 58160814Ssimon#include "aicasm_insformat.h" 59160814Ssimon 60160814Ssimonstatic symbol_t *macro_symbol; 61160814Ssimon 62160814Ssimonstatic void add_macro_arg(const char *argtext, int position); 63160814Ssimon 64160814Ssimonextern int mmlex(void); 65160814Ssimonextern int mmparse(void); 66160814Ssimon 67160814Ssimon%} 68160814Ssimon 69160814Ssimon%union { 70160814Ssimon int value; 71160814Ssimon char *str; 72160814Ssimon symbol_t *sym; 73160814Ssimon} 74160814Ssimon 75160814Ssimon 76160814Ssimon%token <str> T_ARG 77160814Ssimon 78160814Ssimon%token <sym> T_SYMBOL 79160814Ssimon 80160814Ssimon%type <value> macro_arglist 81160814Ssimon 82238405Sjkim%% 83238405Sjkim 84macrocall: 85 T_SYMBOL '(' 86 { 87 macro_symbol = $1; 88 } 89 macro_arglist ')' 90 { 91 if (macro_symbol->info.macroinfo->narg != $4) { 92 printf("Narg == %d", macro_symbol->info.macroinfo->narg); 93 stop("Too few arguments for macro invocation", 94 EX_DATAERR); 95 /* NOTREACHED */ 96 } 97 macro_symbol = NULL; 98 YYACCEPT; 99 } 100; 101 102macro_arglist: 103 { 104 /* Macros can take 0 arguments */ 105 $$ = 0; 106 } 107| T_ARG 108 { 109 $$ = 1; 110 add_macro_arg($1, 1); 111 } 112| macro_arglist ',' T_ARG 113 { 114 if ($1 == 0) { 115 stop("Comma without preceding argument in arg list", 116 EX_DATAERR); 117 /* NOTREACHED */ 118 } 119 $$ = $1 + 1; 120 add_macro_arg($3, $$); 121 } 122; 123 124%% 125 126static void 127add_macro_arg(const char *argtext, int argnum) 128{ 129 struct macro_arg *marg; 130 int i; 131 132 if (macro_symbol == NULL || macro_symbol->type != MACRO) { 133 stop("Invalid current symbol for adding macro arg", 134 EX_SOFTWARE); 135 /* NOTREACHED */ 136 } 137 /* 138 * Macro Invocation. Find the appropriate argument and fill 139 * in the replace ment text for this call. 140 */ 141 i = 0; 142 STAILQ_FOREACH(marg, ¯o_symbol->info.macroinfo->args, links) { 143 i++; 144 if (i == argnum) 145 break; 146 } 147 if (marg == NULL) { 148 stop("Too many arguments for macro invocation", EX_DATAERR); 149 /* NOTREACHED */ 150 } 151 marg->replacement_text = strdup(argtext); 152 if (marg->replacement_text == NULL) { 153 stop("Unable to replicate replacement text", EX_SOFTWARE); 154 /* NOTREACHED */ 155 } 156} 157 158static void 159mmerror(const char *string) 160{ 161 stop(string, EX_DATAERR); 162} 163