Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2 | Rev 11 | ||
---|---|---|---|
Line 20... | Line 20... | ||
20 | * |
20 | * |
21 | * Revision 1.4 2001/10/31 22:20:08 mjames |
21 | * Revision 1.4 2001/10/31 22:20:08 mjames |
22 | * Tidying up problematical comments caused by CVS |
22 | * Tidying up problematical comments caused by CVS |
23 | * 'intelligent' comment guessing |
23 | * 'intelligent' comment guessing |
24 | * |
24 | * |
25 | * |
25 | * |
26 | */ |
26 | */ |
27 | #include "lx_support.h" |
27 | #include <stdio.h> |
- | 28 | #include <string.h> |
|
- | 29 | #include <stdlib.h> |
|
28 | 30 | ||
29 | #include "acf_yacc.h" |
- | |
30 | #include "cmdexec.h" |
- | |
31 | #include "cmdlog.h" |
- | |
32 | #include "cmdparse.h" |
- | |
33 | #include "cmdutil.h" |
- | |
34 | #include "database.h" |
- | |
35 | #include "expression.h" |
31 | #include "expression.h" |
36 | #include "generic.h" |
32 | #include "generic.h" |
- | 33 | #include "database.h" |
|
- | 34 | ||
- | 35 | ||
37 | #include "vertcl_main.h" |
36 | #include "vertcl_main.h" |
- | 37 | #include "lx_support.h" |
|
- | 38 | ||
- | 39 | ||
- | 40 | ||
- | 41 | #include "cmdparse.h" |
|
- | 42 | #include "cmdlog.h" |
|
- | 43 | #include "cmdutil.h" |
|
- | 44 | #include "cmdexec.h" |
|
- | 45 | ||
- | 46 | #include "acf_yacc.h" |
|
38 | 47 | ||
39 | #include <stdio.h> |
- | |
40 | #include <stdlib.h> |
- | |
41 | #include <string.h> |
- | |
42 | 48 | ||
43 | /* purpose to queue lex tokens until all have been used on a line or in a statement */ |
49 | /* purpose to queue lex tokens until all have been used on a line or in a statement */ |
44 | 50 | ||
45 | int yyval; /* propose to confuse LEX ... */ |
51 | int yyval; /* propose to confuse LEX ... */ |
46 | int yy_nArgs; |
52 | int yy_nArgs; |
47 | char **yy_Args; |
53 | char ** yy_Args; |
48 | 54 | ||
49 | #ident \ |
- | |
50 | "@(#)$Header: c:\\cygwin\\cvsroot/Vert03/vertlib/lx_support.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $" |
55 | #ident "@(#)$Header: c:\\cygwin\\cvsroot/Vert03/vertlib/lx_support.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $" |
51 | 56 | ||
52 | __declspec(dllexport) struct str *lx_first = NULL; |
57 | __declspec (dllexport)struct str * lx_first = NULL; |
53 | __declspec(dllexport) struct str *lx_last = NULL; |
58 | __declspec (dllexport)struct str * lx_last = NULL; |
54 | 59 | ||
55 | /* the Args values are for the current argc/argv context */ |
- | |
56 | void expand_string (char *source, char *dest, int nArgs, char *Args[]) |
- | |
57 | { |
- | |
58 | char num_buff[LINELEN]; |
- | |
59 | 60 | ||
60 | char *Ptr = source; |
- | |
61 | char *Optr = dest; |
- | |
62 | generic_info_t **chip_generics = NULL; |
- | |
63 | - | ||
64 | /* printf("IN ='%s'\n",source); */ |
- | |
65 | - | ||
66 | if (!source || !dest) |
- | |
67 | return; |
- | |
68 | - | ||
69 | dest[0] = 0; |
- | |
70 | while (*Ptr && (Optr - dest) < LINELEN - 1) |
- | |
71 | { |
- | |
72 | if (*Ptr == '\\') |
- | |
73 | { |
- | |
74 | Ptr++; |
- | |
75 | if (*Ptr) |
- | |
76 | { |
- | |
77 | *Optr++ = *Ptr++; |
- | |
78 | *Optr = 0; |
- | |
79 | }; |
- | |
80 | continue; |
- | |
81 | }; |
- | |
82 | - | ||
83 | if (*Ptr == '$') |
- | |
84 | { /* variable expansion */ |
- | |
85 | - | ||
86 | /* pattern 1 : $n - lookup argv[n] */ |
- | |
87 | if (Ptr[1] >= '0' && Ptr[1] <= '9') |
- | |
88 | { |
- | |
89 | int n = Ptr[1] - '0'; |
- | |
90 | if (n < nArgs) |
- | |
91 | { |
- | |
92 | /* space to place new word ? */ |
- | |
93 | if ((Optr + strlen (Args[n]) - dest) < LINELEN) |
- | |
94 | { |
- | |
95 | strcpy (Optr, Args[n]); |
- | |
96 | Optr += strlen (Args[n]); |
- | |
97 | *Optr = 0; |
- | |
98 | }; |
- | |
99 | - | ||
100 | Ptr += 2; |
- | |
101 | continue; |
- | |
102 | } |
- | |
103 | } |
- | |
104 | /* pattern 2 : look up a generic SYSVAR */ |
- | |
105 | else if (Ptr[1] == '(') |
- | |
106 | { |
- | |
107 | char var_name[WORDWIDTH], *env_val; |
- | |
108 | int c = 0; |
- | |
109 | generic_info_t generic[1]; |
- | |
110 | generic_type_t gen_type; |
- | |
111 | Ptr += 2; /* skip '$(' */ |
- | |
112 | var_name[0] = '\0'; |
- | |
113 | while (*Ptr && *Ptr != ')') |
- | |
114 | { |
- | |
115 | if (c < WORDWIDTH - 1) |
- | |
116 | { |
- | |
117 | var_name[c++] = *Ptr; |
- | |
118 | var_name[c] = '\0'; |
- | |
119 | } |
- | |
120 | Ptr++; |
- | |
121 | } |
- | |
122 | if (*Ptr) |
- | |
123 | Ptr++; |
- | |
124 | /* now lookup result */ |
- | |
125 | - | ||
126 | env_val = NULL; |
- | |
127 | /* try generic lookup first */ |
- | |
128 | - | ||
129 | gen_type = |
- | |
130 | get_generic_value (&global_generics, var_name, generic); |
- | |
131 | if (!gen_type) |
- | |
132 | gen_type = get_generic_value ( |
- | |
133 | &partition_generics, var_name, generic); |
- | |
134 | /* accept a string */ |
- | |
135 | if (gen_type == IS_STRING || gen_type == IS_ENV_VAL) |
- | |
136 | { |
- | |
137 | if (generic->expr) |
- | |
138 | env_val = generic->expr->left.s; |
- | |
139 | }; |
- | |
140 | if (gen_type == IS_INTEGER) |
- | |
141 | { |
- | |
142 | if (generic->expr) |
- | |
143 | { |
- | |
144 | sprintf ( |
- | |
145 | num_buff, |
- | |
146 | "%d", |
- | |
147 | eval_expression ( |
- | |
148 | generic->expr, chip_generics)); |
- | |
149 | env_val = num_buff; |
- | |
150 | } |
- | |
151 | } |
- | |
152 | if (gen_type == TO) |
- | |
153 | { |
- | |
154 | if (generic->expr) |
- | |
155 | { |
- | |
156 | sprintf ( |
- | |
157 | num_buff, |
- | |
158 | "%d TO %d", |
- | |
159 | eval_expression ( |
- | |
160 | generic->expr->left.e, chip_generics), |
- | |
161 | eval_expression ( |
- | |
162 | generic->expr->right.e, |
- | |
163 | chip_generics)); |
- | |
164 | env_val = num_buff; |
- | |
165 | } |
- | |
166 | } |
- | |
167 | if (gen_type == DOWNTO) |
- | |
168 | { |
- | |
169 | if (generic->expr) |
- | |
170 | { |
- | |
171 | sprintf ( |
- | |
172 | num_buff, |
- | |
173 | "%d DOWNTO %d", |
- | |
174 | eval_expression ( |
- | |
175 | generic->expr->left.e, chip_generics), |
- | |
176 | eval_expression ( |
- | |
177 | generic->expr->right.e, |
- | |
178 | chip_generics)); |
- | |
179 | env_val = num_buff; |
- | |
180 | } |
- | |
181 | } |
- | |
182 | - | ||
183 | /* try OS environment variables */ |
- | |
184 | if (!env_val) |
- | |
185 | env_val = getenv (var_name); |
- | |
186 | if (env_val && (Optr + strlen (env_val) - dest) < LINELEN) |
- | |
187 | { |
- | |
188 | strcpy (Optr, env_val); |
- | |
189 | Optr += strlen (env_val); |
- | |
190 | *Optr = 0; |
- | |
191 | continue; |
- | |
192 | }; |
- | |
193 | if ((Optr + strlen (var_name) - dest) < LINELEN) |
- | |
194 | { |
- | |
195 | sprintf (Optr, "$(%s)", var_name); |
- | |
196 | Optr += strlen (var_name) + 3; |
- | |
197 | *Optr = 0; |
- | |
198 | } |
- | |
199 | } |
- | |
200 | } |
- | |
201 | if (*Ptr != '\r' && *Ptr != '\n') |
- | |
202 | { |
- | |
203 | *Optr++ = *Ptr; |
- | |
204 | *Optr = 0; |
- | |
205 | } |
- | |
206 | Ptr++; |
- | |
207 | } |
- | |
208 | /* printf("OUT='%s'\n",dest); */ |
- | |
209 | } |
- | |
210 | 61 | ||
211 | char *make_string (char *token, struct str **pfirst, struct str **plast) |
- | |
212 | { |
- | |
213 | char *t; |
- | |
214 | struct str *s; |
- | |
215 | int l; |
- | |
216 | char workbuff[LINELEN]; |
- | |
217 | /* perform checks in the right order 18-02-2000 */ |
- | |
218 | if (!token) |
- | |
219 | return NULL; |
- | |
220 | l = strlen (token); |
- | |
221 | s = calloc (1, sizeof (struct str)); |
- | |
222 | if (!s) |
- | |
223 | return NULL; |
- | |
224 | - | ||
225 | /* eliminate quotes from the string : |
- | |
226 | * !! ASSUMES string is in Read/Write memory */ |
- | |
227 | if (l >= 2 && token[0] == '\"' && token[l - 1] == '\"') |
- | |
228 | { |
- | |
229 | strncpy (token, token + 1, l - 2); /* chuck quotes off string */ |
- | |
230 | token[l - 2] = '\0'; /* null terminate */ |
- | |
231 | } |
- | |
232 | - | ||
233 | /* the values yy_nArgs and yy_Args were filled |
- | |
234 | in just before calling yyparse */ |
- | |
235 | expand_string (token, workbuff, yy_nArgs, yy_Args); |
- | |
236 | l = strlen (workbuff); |
- | |
237 | - | ||
238 | t = malloc (l + 1); |
- | |
239 | if (!t) |
- | |
240 | return NULL; |
- | |
241 | - | ||
242 | strcpy (t, workbuff); /* copy string , join to structure */ |
- | |
243 | s->dat = t; |
- | |
244 | s->next = NULL; |
- | |
245 | - | ||
246 | if (!*pfirst) |
- | |
247 | *pfirst = s; |
- | |
248 | 62 | ||
249 | if (*plast) |
63 | /* the Args values are for the current argc/argv context */ |
- | 64 | void expand_string( char * source , char * dest, int nArgs, char * Args[]) { |
|
250 | (*plast)->next = s; |
65 | char num_buff[LINELEN]; |
251 | 66 | ||
- | 67 | char * Ptr = source; |
|
- | 68 | char * Optr= dest; |
|
- | 69 | generic_info_t ** chip_generics = NULL; |
|
- | 70 | ||
- | 71 | /* printf("IN ='%s'\n",source); */ |
|
- | 72 | ||
- | 73 | if(!source || !dest) |
|
- | 74 | return; |
|
- | 75 | ||
- | 76 | ||
- | 77 | dest[0] = 0; |
|
- | 78 | while(*Ptr && (Optr-dest)<LINELEN-1) { |
|
- | 79 | ||
- | 80 | if(*Ptr=='\\') { |
|
- | 81 | Ptr++; |
|
- | 82 | if (*Ptr) { |
|
- | 83 | *Optr++ = *Ptr++; |
|
- | 84 | *Optr = 0; |
|
- | 85 | }; |
|
- | 86 | continue; |
|
- | 87 | }; |
|
- | 88 | ||
- | 89 | if(*Ptr=='$') { /* variable expansion */ |
|
- | 90 | ||
- | 91 | /* pattern 1 : $n - lookup argv[n] */ |
|
- | 92 | if(Ptr[1] >='0' && Ptr[1] <='9') { |
|
- | 93 | int n = Ptr[1]-'0'; |
|
- | 94 | if (n < nArgs ) { |
|
- | 95 | ||
- | 96 | /* space to place new word ? */ |
|
- | 97 | if((Optr+strlen(Args[n])-dest)<LINELEN ) { |
|
- | 98 | strcpy(Optr, Args[n]); |
|
- | 99 | Optr+= strlen(Args[n]); |
|
- | 100 | *Optr = 0; |
|
- | 101 | }; |
|
- | 102 | ||
- | 103 | Ptr+=2; |
|
- | 104 | continue; |
|
- | 105 | } |
|
- | 106 | } |
|
- | 107 | /* pattern 2 : look up a generic SYSVAR */ |
|
- | 108 | else if (Ptr[1]=='(') { |
|
- | 109 | char var_name[WORDWIDTH], * env_val; |
|
- | 110 | int c = 0; |
|
- | 111 | generic_info_t generic[1]; |
|
- | 112 | generic_type_t gen_type; |
|
- | 113 | Ptr+=2; /* skip '$(' */ |
|
- | 114 | var_name[0] = '\0'; |
|
- | 115 | while(*Ptr && *Ptr != ')') { |
|
- | 116 | if(c<WORDWIDTH-1) { |
|
- | 117 | var_name[c++] = *Ptr; |
|
- | 118 | var_name[c] = '\0'; |
|
- | 119 | } |
|
- | 120 | Ptr++; |
|
- | 121 | } |
|
- | 122 | if(*Ptr) Ptr++; |
|
- | 123 | /* now lookup result */ |
|
- | 124 | ||
- | 125 | env_val = NULL; |
|
- | 126 | /* try generic lookup first */ |
|
- | 127 | ||
- | 128 | gen_type = get_generic_value(&global_generics,var_name,generic); |
|
- | 129 | if(!gen_type) |
|
- | 130 | gen_type = get_generic_value(&partition_generics,var_name,generic); |
|
- | 131 | /* accept a string */ |
|
- | 132 | if (gen_type==IS_STRING || gen_type == IS_ENV_VAL) { |
|
- | 133 | if(generic->expr) |
|
- | 134 | env_val = generic->expr->left.s; |
|
- | 135 | }; |
|
- | 136 | if (gen_type==IS_INTEGER) |
|
- | 137 | { |
|
- | 138 | if(generic->expr) |
|
- | 139 | { |
|
- | 140 | sprintf(num_buff,"%d",eval_expression(generic->expr,chip_generics)); |
|
- | 141 | env_val = num_buff; |
|
- | 142 | } |
|
- | 143 | } |
|
- | 144 | if (gen_type==TO) |
|
- | 145 | { |
|
- | 146 | if(generic->expr) |
|
- | 147 | { |
|
- | 148 | sprintf(num_buff,"%d TO %d",eval_expression(generic->expr->left.e,chip_generics),eval_expression(generic->expr->right.e,chip_generics)); |
|
- | 149 | env_val = num_buff; |
|
- | 150 | } |
|
- | 151 | } |
|
- | 152 | if (gen_type==DOWNTO) |
|
- | 153 | { |
|
- | 154 | if(generic->expr) |
|
- | 155 | { |
|
- | 156 | sprintf(num_buff,"%d DOWNTO %d",eval_expression(generic->expr->left.e,chip_generics),eval_expression(generic->expr->right.e,chip_generics)); |
|
- | 157 | env_val = num_buff; |
|
- | 158 | } |
|
- | 159 | } |
|
- | 160 | ||
- | 161 | ||
- | 162 | /* try OS environment variables */ |
|
- | 163 | if (!env_val) |
|
- | 164 | env_val = getenv(var_name); |
|
- | 165 | if (env_val && (Optr+strlen(env_val)-dest)<LINELEN ) { |
|
- | 166 | strcpy(Optr,env_val ); |
|
- | 167 | Optr+= strlen(env_val); |
|
- | 168 | *Optr = 0; |
|
- | 169 | continue; |
|
- | 170 | }; |
|
- | 171 | if ((Optr+strlen(var_name)-dest)<LINELEN ) { |
|
- | 172 | sprintf(Optr,"$(%s)",var_name); |
|
- | 173 | Optr+= strlen(var_name)+3; |
|
- | 174 | *Optr = 0; |
|
- | 175 | } |
|
- | 176 | ||
- | 177 | } |
|
- | 178 | } |
|
- | 179 | if(*Ptr != '\r' && *Ptr != '\n') |
|
- | 180 | { |
|
- | 181 | *Optr++ = *Ptr; |
|
- | 182 | *Optr = 0; |
|
- | 183 | } |
|
- | 184 | Ptr++; |
|
- | 185 | } |
|
- | 186 | /* printf("OUT='%s'\n",dest); */ |
|
- | 187 | } |
|
- | 188 | ||
- | 189 | char * make_string(char * token ,struct str ** pfirst,struct str ** plast ) |
|
- | 190 | { |
|
- | 191 | char * t; |
|
- | 192 | struct str * s; |
|
- | 193 | int l; |
|
- | 194 | char workbuff[LINELEN]; |
|
- | 195 | /* perform checks in the right order 18-02-2000 */ |
|
- | 196 | if(!token) |
|
- | 197 | return NULL; |
|
- | 198 | l = strlen(token); |
|
- | 199 | s = calloc(1,sizeof(struct str )); |
|
- | 200 | if (!s) |
|
- | 201 | return NULL; |
|
- | 202 | ||
- | 203 | /* eliminate quotes from the string : |
|
- | 204 | * !! ASSUMES string is in Read/Write memory */ |
|
- | 205 | if (l>=2 && token[0]=='\"' && token[l-1]=='\"') |
|
- | 206 | { |
|
- | 207 | strncpy (token,token+1,l-2); /* chuck quotes off string */ |
|
- | 208 | token[l-2] = '\0'; /* null terminate */ |
|
- | 209 | } |
|
- | 210 | ||
- | 211 | ||
- | 212 | /* the values yy_nArgs and yy_Args were filled |
|
- | 213 | in just before calling yyparse */ |
|
- | 214 | expand_string(token,workbuff,yy_nArgs,yy_Args); |
|
- | 215 | l = strlen(workbuff); |
|
- | 216 | ||
- | 217 | t = malloc(l+1); |
|
- | 218 | if (!t) |
|
- | 219 | return NULL; |
|
- | 220 | ||
- | 221 | strcpy(t,workbuff); /* copy string , join to structure */ |
|
- | 222 | s->dat = t; |
|
- | 223 | s->next = NULL; |
|
- | 224 | ||
- | 225 | ||
- | 226 | ||
- | 227 | ||
- | 228 | if (!*pfirst) |
|
- | 229 | *pfirst = s; |
|
- | 230 | ||
- | 231 | if(*plast) |
|
- | 232 | (*plast)->next = s; |
|
- | 233 | ||
252 | *plast = s; |
234 | *plast = s; |
253 | /* printf("MADE\n"); */ |
235 | /* printf("MADE\n"); */ |
- | 236 | ||
- | 237 | ||
- | 238 | return (t); /* pointer to the string that can be later tidily freed */ |
|
- | 239 | ||
- | 240 | ||
- | 241 | ||
- | 242 | } |
|
- | 243 | ||
- | 244 | ||
- | 245 | void free_strings( struct str ** pfirst, struct str ** plast) |
|
- | 246 | { |
|
- | 247 | struct str * s,* t; |
|
- | 248 | s = *pfirst; |
|
- | 249 | while(s) /* run down the list, freeing entries */ |
|
- | 250 | { |
|
- | 251 | if (s->dat) |
|
- | 252 | free(s->dat); |
|
- | 253 | t = s; |
|
- | 254 | s= s->next; |
|
- | 255 | free(t); |
|
- | 256 | } |
|
- | 257 | *pfirst = NULL; |
|
- | 258 | *plast = NULL; |
|
254 | 259 | ||
255 | return (t); /* pointer to the string that can be later tidily freed */ |
- | |
256 | } |
260 | } |
257 | 261 | ||
258 | void free_strings (struct str **pfirst, struct str **plast) |
- | |
259 | { |
- | |
260 | struct str *s, *t; |
- | |
261 | s = *pfirst; |
- | |
262 | while (s) /* run down the list, freeing entries */ |
- | |
263 | { |
- | |
264 | if (s->dat) |
- | |
265 | free (s->dat); |
- | |
266 | t = s; |
- | |
267 | s = s->next; |
- | |
268 | free (t); |
- | |
269 | } |
- | |
270 | *pfirst = NULL; |
- | |
271 | *plast = NULL; |
- | |
272 | } |
- | |
273 | 262 | ||
274 | /* called from YACC to deallocate memory structures cleanly */ |
263 | /* called from YACC to deallocate memory structures cleanly */ |
275 | void free_lex_strings (void) |
264 | void free_lex_strings(void) { |
276 | { |
- | |
277 | free_strings (&lx_first, &lx_last); |
265 | free_strings(&lx_first,&lx_last); |
278 | }; |
266 | }; |
279 | 267 | ||
280 | #define to_lower(c) ((c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c) |
268 | #define to_lower(c) ((c>='A' && c<='Z') ? c-'A'+'a':c) |
281 | 269 | ||
- | 270 | ||
282 | int streq (char *s1, char *s2) |
271 | int streq(char *s1,char *s2) |
283 | { |
272 | { |
284 | while (*s1 != '\0') |
273 | while (*s1 != '\0') { |
285 | { |
- | |
286 | if (to_lower (*s2) != to_lower (*s1)) |
274 | if (to_lower(*s2) != to_lower(*s1)) |
287 | return (0); |
275 | return( 0 ); |
288 | s1++; |
276 | s1++; |
289 | s2++; |
277 | s2++; |
290 | } |
278 | } |
291 | return (*s2 == '\0'); |
279 | return( *s2 == '\0' ); |
292 | } |
280 | } |
293 | 281 | ||
- | 282 | ||
294 | int strneq (char *s1, char *s2, int n) |
283 | int strneq(char *s1,char *s2,int n) |
295 | { |
284 | { |
296 | while (n && *s1 != '\0') |
285 | while (n && *s1 != '\0' ) { |
297 | { |
- | |
298 | if (to_lower (*s2) != to_lower (*s1)) |
286 | if (to_lower(*s2) != to_lower(*s1)) |
299 | return (0); |
287 | return( 0 ); |
300 | s1++; |
288 | s1++; |
301 | s2++; |
289 | s2++; |
302 | --n; |
290 | --n; |
303 | } |
291 | } |
304 | return (n == 0 || *s2 == '\0'); |
292 | return( n==0 || *s2 == '\0' ); |
305 | } |
293 | } |