root/dev/microcode/aic7xxx/aicasm_macro_gram.y

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

DEFINITIONS

This source file includes following definitions.
  1. YYSTYPE
  2. yyparse
  3. add_macro_arg
  4. mmerror

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

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