The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/aic7xxx/aicasm/aicasm_macro_gram.y

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: c7fff2c9ac606fa102515abe0f4f1694


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.