Annotation of sys/dev/microcode/aic7xxx/aicasm_macro_scan.l, Revision 1.1.1.1
1.1 nbrk 1: %{
2: /*
3: /* $OpenBSD: aicasm_macro_scan.l,v 1.4 2004/09/18 19:51:53 mickey Exp $ */
4: /*
5: * Sub-Lexical Analyzer for macro invokation in
6: * the Aic7xxx SCSI Host adapter sequencer assembler.
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: aicasm_macro_scan.l,v 1.4 2004/09/18 19:51:53 mickey Exp $
44: *
45: * $FreeBSD: src/sys/dev/aic7xxx/aicasm/aicasm_macro_scan.l,v 1.5 2003/12/16 23:54:07 gibbs Exp $
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: #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_macro_gram.h"
65:
66: #define MAX_STR_CONST 4096
67: static char string_buf[MAX_STR_CONST];
68: static char *string_buf_ptr;
69: static int parren_count;
70: static char buf[255];
71: %}
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(buf, sizeof(buf), "Invalid character "
149: "'%c'", mmtext[0]);
150: stop(buf, EX_DATAERR);
151: }
152: %%
153:
154: int
155: mmwrap()
156: {
157: stop("EOF encountered in macro call", EX_DATAERR);
158: }
CVSweb