root/drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. add_macro_arg
  2. mmerror

   1 %{
   2 /*
   3  * Sub-parser for macro invocation in the Aic7xxx SCSI
   4  * Host adapter sequencer assembler.
   5  *
   6  * Copyright (c) 2001 Adaptec Inc.
   7  * All rights reserved.
   8  *
   9  * Redistribution and use in source and binary forms, with or without
  10  * modification, are permitted provided that the following conditions
  11  * are met:
  12  * 1. Redistributions of source code must retain the above copyright
  13  *    notice, this list of conditions, and the following disclaimer,
  14  *    without modification.
  15  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  16  *    substantially similar to the "NO WARRANTY" disclaimer below
  17  *    ("Disclaimer") and any redistribution must be conditioned upon
  18  *    including a substantially similar Disclaimer requirement for further
  19  *    binary redistribution.
  20  * 3. Neither the names of the above-listed copyright holders nor the names
  21  *    of any contributors may be used to endorse or promote products derived
  22  *    from this software without specific prior written permission.
  23  *
  24  * Alternatively, this software may be distributed under the terms of the
  25  * GNU General Public License ("GPL") version 2 as published by the Free
  26  * Software Foundation.
  27  *
  28  * NO WARRANTY
  29  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  30  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  31  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  32  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  33  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  34  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  35  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  36  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  37  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  38  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  39  * POSSIBILITY OF SUCH DAMAGES.
  40  *
  41  * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_gram.y#5 $
  42  *
  43  * $FreeBSD$
  44  */
  45 
  46 #include <sys/types.h>
  47 
  48 #include <inttypes.h>
  49 #include <regex.h>
  50 #include <stdio.h>
  51 #include <stdlib.h>
  52 #include <string.h>
  53 #include <sysexits.h>
  54 
  55 #include "../queue.h"
  56 
  57 #include "aicasm.h"
  58 #include "aicasm_symbol.h"
  59 #include "aicasm_insformat.h"
  60 
  61 static symbol_t *macro_symbol;
  62 
  63 static void add_macro_arg(const char *argtext, int position);
  64 void mmerror(const char *string);
  65 
  66 %}
  67 
  68 %union {
  69         int             value;
  70         char            *str;
  71         symbol_t        *sym;
  72 }
  73 
  74 
  75 %token <str> T_ARG
  76 
  77 %token <sym> T_SYMBOL
  78 
  79 %type <value> macro_arglist
  80 
  81 %%
  82 
  83 macrocall:
  84         T_SYMBOL '('
  85         {
  86                 macro_symbol = $1;
  87         }
  88         macro_arglist ')'
  89         {
  90                 if (macro_symbol->info.macroinfo->narg != $4) {
  91                         printf("Narg == %d", macro_symbol->info.macroinfo->narg);
  92                         stop("Too few arguments for macro invocation",
  93                              EX_DATAERR);
  94                         /* NOTREACHED */
  95                 }
  96                 macro_symbol = NULL;
  97                 YYACCEPT;
  98         }
  99 ;
 100 
 101 macro_arglist:
 102         {
 103                 /* Macros can take 0 arguments */
 104                 $$ = 0;
 105         }
 106 |       T_ARG
 107         {
 108                 $$ = 1;
 109                 add_macro_arg($1, 1);
 110         }
 111 |       macro_arglist ',' T_ARG
 112         {
 113                 if ($1 == 0) {
 114                         stop("Comma without preceding argument in arg list",
 115                              EX_DATAERR);
 116                         /* NOTREACHED */
 117                 }
 118                 $$ = $1 + 1;
 119                 add_macro_arg($3, $$);
 120         }
 121 ;
 122 
 123 %%
 124 
 125 static void
 126 add_macro_arg(const char *argtext, int argnum)
 127 {
 128         struct macro_arg *marg;
 129         int i;
 130 
 131         if (macro_symbol == NULL || macro_symbol->type != MACRO) {
 132                 stop("Invalid current symbol for adding macro arg",
 133                      EX_SOFTWARE);
 134                 /* NOTREACHED */
 135         }
 136         /*
 137          * Macro Invocation.  Find the appropriate argument and fill
 138          * in the replace ment text for this call.
 139          */
 140         i = 0;
 141         STAILQ_FOREACH(marg, &macro_symbol->info.macroinfo->args, links) {
 142                 i++;
 143                 if (i == argnum)
 144                         break;
 145         }
 146         if (marg == NULL) {
 147                 stop("Too many arguments for macro invocation", EX_DATAERR);
 148                 /* NOTREACHED */
 149         }
 150         marg->replacement_text = strdup(argtext);
 151         if (marg->replacement_text == NULL) {
 152                 stop("Unable to replicate replacement text", EX_SOFTWARE);
 153                 /* NOTREACHED */
 154         }
 155 }
 156 
 157 void
 158 mmerror(const char *string)
 159 {
 160         stop(string, EX_DATAERR);
 161 }

/* [<][>][^][v][top][bottom][index][help] */