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_scan.l

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-Lexical Analyzer for macro invokation in 
    4  * the Aic7xxx SCSI 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_scan.l#8 $
   44  *
   45  * $FreeBSD$
   46  */
   47 
   48 #include <sys/types.h>
   49 
   50 #include <inttypes.h>
   51 #include <limits.h>
   52 #include <regex.h>
   53 #include <stdio.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_macro_gram.h"
   61 
   62 #define MAX_STR_CONST 4096
   63 static char string_buf[MAX_STR_CONST];
   64 static char *string_buf_ptr;
   65 static int  parren_count;
   66 static char msgbuf[255];
   67 
   68 extern int mmlex(void);
   69 %}
   70 
   71 %option noinput
   72 
   73 WORD            [A-Za-z_][-A-Za-z_0-9]*
   74 SPACE           [ \t]+
   75 MCARG           [^(), \t]+
   76 
   77 %x ARGLIST
   78 
   79 %%
   80 \n                      {
   81                                 ++yylineno;
   82                         }
   83 \r                      ;
   84 <ARGLIST>{SPACE}        ;
   85 <ARGLIST>\(             {
   86                                 parren_count++;
   87                                 if (parren_count == 1) {
   88                                         string_buf_ptr = string_buf;
   89                                         return ('(');
   90                                 }
   91                                 *string_buf_ptr++ = '(';
   92                         }
   93 <ARGLIST>\)             {
   94                                 if (parren_count == 1) {
   95                                         if (string_buf_ptr != string_buf) {
   96                                                 /*
   97                                                  * Return an argument and
   98                                                  * rescan this parren so we
   99                                                  * can return it as well.
  100                                                  */
  101                                                 *string_buf_ptr = '\0';
  102                                                 mmlval.str = string_buf;
  103                                                 string_buf_ptr = string_buf;
  104                                                 unput(')');
  105                                                 return T_ARG;
  106                                         }
  107                                         BEGIN INITIAL;
  108                                         return (')');
  109                                 }
  110                                 parren_count--;
  111                                 *string_buf_ptr++ = ')';
  112                         }
  113 <ARGLIST>{MCARG}        {
  114                                 char *yptr;
  115 
  116                                 yptr = mmtext;
  117                                 while (*yptr)
  118                                         *string_buf_ptr++ = *yptr++;
  119                         }
  120 <ARGLIST>\,             {
  121                                 if (string_buf_ptr != string_buf) {
  122                                         /*
  123                                          * Return an argument and
  124                                          * rescan this comma so we
  125                                          * can return it as well.
  126                                          */
  127                                         *string_buf_ptr = '\0';
  128                                         mmlval.str = string_buf;
  129                                         string_buf_ptr = string_buf;
  130                                         unput(',');
  131                                         return T_ARG;
  132                                 }
  133                                 return ',';
  134                         }
  135 {WORD}[(]               {
  136                                 /* May be a symbol or a macro invocation. */
  137                                 mmlval.sym = symtable_get(mmtext);
  138                                 if (mmlval.sym->type != MACRO) {
  139                                         stop("Expecting Macro Name",
  140                                              EX_DATAERR);
  141                                 }
  142                                 unput('(');
  143                                 parren_count = 0;
  144                                 BEGIN ARGLIST;
  145                                 return T_SYMBOL;
  146                         }
  147 .                       { 
  148                                 snprintf(msgbuf, sizeof(msgbuf), "Invalid character "
  149                                          "'%c'", mmtext[0]);
  150                                 stop(msgbuf, EX_DATAERR);
  151                         }
  152 %%
  153 
  154 int
  155 mmwrap(void)
  156 {
  157         stop("EOF encountered in macro call", EX_DATAERR);
  158         return (1);
  159 }

Cache object: 814751e400f8d1a3811eeda2305eb855


[ 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.