Annotation of sys/dev/microcode/aic7xxx/aicasm_macro_gram.y, Revision 1.1.1.1
1.1 nbrk 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, ¯o_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: }
CVSweb