1 |
uberlord 07/10/08 10:25:04 |
2 |
|
3 |
Added: dash-0.5.4-posix-arith.patch digest-dash-0.5.4.1-r1 |
4 |
Log: |
5 |
Fully support POSIX arithmetic |
6 |
(Portage version: 2.1.3.11) |
7 |
|
8 |
Revision Changes Path |
9 |
1.1 app-shells/dash/files/dash-0.5.4-posix-arith.patch |
10 |
|
11 |
file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/app-shells/dash/files/dash-0.5.4-posix-arith.patch?rev=1.1&view=markup |
12 |
plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/app-shells/dash/files/dash-0.5.4-posix-arith.patch?rev=1.1&content-type=text/plain |
13 |
|
14 |
Index: dash-0.5.4-posix-arith.patch |
15 |
=================================================================== |
16 |
diff -ur a/src/arith.y b/src/arith.y |
17 |
--- a/src/arith.y 2007-07-13 09:26:42.000000000 +0100 |
18 |
+++ b/src/arith.y 2007-10-08 11:04:29.000000000 +0100 |
19 |
@@ -34,14 +34,19 @@ |
20 |
*/ |
21 |
|
22 |
#include <stdlib.h> |
23 |
-#include "expand.h" |
24 |
+#include <stdio.h> |
25 |
#include "shell.h" |
26 |
+#include "arith.h" |
27 |
+#include "expand.h" |
28 |
#include "error.h" |
29 |
#include "output.h" |
30 |
#include "memalloc.h" |
31 |
+#include "var.h" |
32 |
|
33 |
const char *arith_buf, *arith_startbuf; |
34 |
|
35 |
+static int arith_assign(char *, arith_t); |
36 |
+ |
37 |
#ifndef YYBISON |
38 |
int yyparse(void); |
39 |
#endif |
40 |
@@ -52,8 +57,18 @@ |
41 |
#endif |
42 |
|
43 |
%} |
44 |
-%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN |
45 |
- |
46 |
+%union { |
47 |
+ arith_t l_value; |
48 |
+ char* s_value; |
49 |
+} |
50 |
+%token <l_value> ARITH_NUM ARITH_LPAREN ARITH_RPAREN |
51 |
+%token <s_value> ARITH_VAR |
52 |
+%type <l_value> expr |
53 |
+%right ARITH_ASSIGN |
54 |
+%right ARITH_ADDASSIGN ARITH_SUBASSIGN |
55 |
+%right ARITH_MULASSIGN ARITH_DIVASSIGN ARITH_REMASSIGN |
56 |
+%right ARITH_RSHASSIGN ARITH_LSHASSIGN |
57 |
+%right ARITH_BANDASSIGN ARITH_BXORASSIGN ARITH_BORASSIGN |
58 |
%left ARITH_OR |
59 |
%left ARITH_AND |
60 |
%left ARITH_BOR |
61 |
@@ -105,8 +120,118 @@ |
62 |
| ARITH_SUB expr %prec ARITH_UNARYMINUS { $$ = -($2); } |
63 |
| ARITH_ADD expr %prec ARITH_UNARYPLUS { $$ = $2; } |
64 |
| ARITH_NUM |
65 |
- ; |
66 |
+ | ARITH_VAR { |
67 |
+ char *p; |
68 |
+ arith_t arith_val; |
69 |
+ char *str_val; |
70 |
+ if (lookupvar($1) == NULL) |
71 |
+ setvarsafe($1, "0", 0); |
72 |
+ str_val = lookupvar($1); |
73 |
+ arith_val = strtoarith_t(str_val, &p, 0); |
74 |
+ /* |
75 |
+ * Conversion is successful only in case |
76 |
+ * we've converted _all_ characters. |
77 |
+ */ |
78 |
+ if (*p != '\0') |
79 |
+ yyerror("variable conversion error"); |
80 |
+ $$ = arith_val; |
81 |
+ } |
82 |
+ | ARITH_VAR ARITH_ASSIGN expr { |
83 |
+ if (arith_assign($1, $3) != 0) |
84 |
+ yyerror("variable assignment error"); |
85 |
+ $$ = $3; |
86 |
+ } |
87 |
+ | ARITH_VAR ARITH_ADDASSIGN expr { |
88 |
+ arith_t value; |
89 |
+ value = atoarith_t(lookupvar($1)) + $3; |
90 |
+ if (arith_assign($1, value) != 0) |
91 |
+ yyerror("variable assignment error"); |
92 |
+ $$ = value; |
93 |
+ } |
94 |
+ | ARITH_VAR ARITH_SUBASSIGN expr { |
95 |
+ arith_t value; |
96 |
+ value = atoarith_t(lookupvar($1)) - $3; |
97 |
+ if (arith_assign($1, value) != 0) |
98 |
+ yyerror("variable assignment error"); |
99 |
+ $$ = value; |
100 |
+ } |
101 |
+ | ARITH_VAR ARITH_MULASSIGN expr { |
102 |
+ arith_t value; |
103 |
+ value = atoarith_t(lookupvar($1)) * $3; |
104 |
+ if (arith_assign($1, value) != 0) |
105 |
+ yyerror("variable assignment error"); |
106 |
+ $$ = value; |
107 |
+ } |
108 |
+ | ARITH_VAR ARITH_DIVASSIGN expr { |
109 |
+ arith_t value; |
110 |
+ if ($3 == 0) |
111 |
+ yyerror("division by zero"); |
112 |
+ value = atoarith_t(lookupvar($1)) / $3; |
113 |
+ if (arith_assign($1, value) != 0) |
114 |
+ yyerror("variable assignment error"); |
115 |
+ $$ = value; |
116 |
+ } |
117 |
+ | ARITH_VAR ARITH_REMASSIGN expr { |
118 |
+ arith_t value; |
119 |
+ if ($3 == 0) |
120 |
+ yyerror("division by zero"); |
121 |
+ value = atoarith_t(lookupvar($1)) % $3; |
122 |
+ if (arith_assign($1, value) != 0) |
123 |
+ yyerror("variable assignment error"); |
124 |
+ $$ = value; |
125 |
+ } |
126 |
+ | ARITH_VAR ARITH_RSHASSIGN expr { |
127 |
+ arith_t value; |
128 |
+ value = atoarith_t(lookupvar($1)) >> $3; |
129 |
+ if (arith_assign($1, value) != 0) |
130 |
+ yyerror("variable assignment error"); |
131 |
+ $$ = value; |
132 |
+ } |
133 |
+ | ARITH_VAR ARITH_LSHASSIGN expr { |
134 |
+ arith_t value; |
135 |
+ value = atoarith_t(lookupvar($1)) << $3; |
136 |
+ if (arith_assign($1, value) != 0) |
137 |
+ yyerror("variable assignment error"); |
138 |
+ $$ = value; |
139 |
+ } |
140 |
+ | ARITH_VAR ARITH_BANDASSIGN expr { |
141 |
+ arith_t value; |
142 |
+ value = atoarith_t(lookupvar($1)) & $3; |
143 |
+ if (arith_assign($1, value) != 0) |
144 |
+ yyerror("variable assignment error"); |
145 |
+ $$ = value; |
146 |
+ } |
147 |
+ | ARITH_VAR ARITH_BXORASSIGN expr { |
148 |
+ arith_t value; |
149 |
+ value = atoarith_t(lookupvar($1)) ^ $3; |
150 |
+ if (arith_assign($1, value) != 0) |
151 |
+ yyerror("variable assignment error"); |
152 |
+ $$ = value; |
153 |
+ } |
154 |
+ | ARITH_VAR ARITH_BORASSIGN expr { |
155 |
+ arith_t value; |
156 |
+ value = atoarith_t(lookupvar($1)) | $3; |
157 |
+ if (arith_assign($1, value) != 0) |
158 |
+ yyerror("variable assignment error"); |
159 |
+ $$ = value; |
160 |
+ } |
161 |
+; |
162 |
%% |
163 |
+ |
164 |
+#define lstrlen(var) (3 + (2 + CHAR_BIT * sizeof((var))) / 3) |
165 |
+ |
166 |
+static int |
167 |
+arith_assign(char *name, arith_t value) { |
168 |
+ char *str; |
169 |
+ int ret; |
170 |
+ |
171 |
+ str = (char *)ckmalloc(lstrlen(value)); |
172 |
+ sprintf(str, ARITH_FORMAT_STR, value); |
173 |
+ ret = setvarsafe(name, str, 0); |
174 |
+ free(str); |
175 |
+ return ret; |
176 |
+} |
177 |
+ |
178 |
int |
179 |
arith(s) |
180 |
const char *s; |
181 |
diff -ur a/src/arith_yylex.c b/src/arith_yylex.c |
182 |
--- a/src/arith_yylex.c 2007-07-13 09:26:42.000000000 +0100 |
183 |
+++ b/src/arith_yylex.c 2007-10-08 11:10:44.000000000 +0100 |
184 |
@@ -32,12 +32,16 @@ |
185 |
* SUCH DAMAGE. |
186 |
*/ |
187 |
|
188 |
+#include <ctype.h> |
189 |
#include <stdlib.h> |
190 |
+#include <string.h> |
191 |
+#include "shell.h" |
192 |
#include "arith.h" |
193 |
#include "expand.h" |
194 |
#include "error.h" |
195 |
+#include "memalloc.h" |
196 |
+#include "var.h" |
197 |
|
198 |
-extern int yylval; |
199 |
extern const char *arith_buf, *arith_startbuf; |
200 |
|
201 |
int |
202 |
@@ -45,6 +49,9 @@ |
203 |
{ |
204 |
int value; |
205 |
const char *buf = arith_buf; |
206 |
+ char *temp; |
207 |
+ char *var; |
208 |
+ char save; |
209 |
|
210 |
for (;;) { |
211 |
switch (*buf) { |
212 |
@@ -54,10 +61,16 @@ |
213 |
buf++; |
214 |
continue; |
215 |
default: |
216 |
-err: |
217 |
sh_error("arith: syntax error: \"%s\"", arith_startbuf); |
218 |
/* NOTREACHED */ |
219 |
case '0': |
220 |
+ if (*++buf == 'x') |
221 |
+ yylval.l_value = strtoll(buf+1, (char **)&arith_buf, 16); |
222 |
+ else |
223 |
+ yylval.l_value = strtoll(buf+1, (char **)&arith_buf, 8); |
224 |
+ if (isalnum(*arith_buf) || *arith_buf == '_') |
225 |
+ sh_error("arith: value does not fit base: \"%s\"", arith_buf); |
226 |
+ return ARITH_NUM; |
227 |
case '1': |
228 |
case '2': |
229 |
case '3': |
230 |
@@ -67,11 +80,79 @@ |
231 |
case '7': |
232 |
case '8': |
233 |
case '9': |
234 |
- yylval = strtoll(buf, (char **) &arith_buf, 0); |
235 |
+ yylval.l_value = strtoll(buf, (char **)&arith_buf, 10); |
236 |
+ if (isalnum(*arith_buf) || *arith_buf == '_') |
237 |
+ sh_error("arith: value does not fit base: \"%s\"", arith_buf); |
238 |
return ARITH_NUM; |
239 |
+ case 'A': |
240 |
+ case 'B': |
241 |
+ case 'C': |
242 |
+ case 'D': |
243 |
+ case 'E': |
244 |
+ case 'F': |
245 |
+ case 'G': |
246 |
+ case 'H': |
247 |
+ case 'I': |
248 |
+ case 'J': |
249 |
+ case 'K': |
250 |
+ case 'L': |
251 |
+ case 'M': |
252 |
+ case 'N': |
253 |
+ case 'O': |
254 |
+ case 'P': |
255 |
+ case 'Q': |
256 |
+ case 'R': |
257 |
+ case 'S': |
258 |
+ case 'T': |
259 |
+ case 'U': |
260 |
+ case 'V': |
261 |
+ case 'W': |
262 |
+ case 'X': |
263 |
+ case 'Y': |
264 |
+ case 'Z': |
265 |
+ case 'a': |
266 |
+ case 'b': |
267 |
+ case 'c': |
268 |
+ case 'd': |
269 |
+ case 'e': |
270 |
+ case 'f': |
271 |
+ case 'g': |
272 |
+ case 'h': |
273 |
+ case 'i': |
274 |
+ case 'j': |
275 |
+ case 'k': |
276 |
+ case 'l': |
277 |
+ case 'm': |
278 |
+ case 'n': |
279 |
+ case 'o': |
280 |
+ case 'p': |
281 |
+ case 'q': |
282 |
+ case 'r': |
283 |
+ case 's': |
284 |
+ case 't': |
285 |
+ case 'u': |
286 |
+ case 'v': |
287 |
+ case 'w': |
288 |
+ case 'x': |
289 |
+ case 'y': |
290 |
+ case 'z': |
291 |
+ temp = (char *)buf; |
292 |
+ while ((*temp && |
293 |
+ (isalnum(*temp) || *temp == '_'))) |
294 |
+ temp++; |
295 |
+ save = *temp; |
296 |
+ *temp = '\0'; |
297 |
+ if (lookupvar(buf) == NULL) |
298 |
+ setvarsafe(buf, "0", 0); |
299 |
+ var = (char *)ckmalloc(strlen(buf) + 1); |
300 |
+ yylval.s_value = strcpy(var, buf); |
301 |
+ *temp = save; |
302 |
+ arith_buf = temp; |
303 |
+ return ARITH_VAR; |
304 |
case '=': |
305 |
if (*++buf != '=') { |
306 |
- goto err; |
307 |
+ value = ARITH_ASSIGN; |
308 |
+ goto out; |
309 |
} |
310 |
value = ARITH_EQ; |
311 |
break; |
312 |
@@ -94,7 +175,11 @@ |
313 |
value = ARITH_LE; |
314 |
break; |
315 |
case '<': |
316 |
- value = ARITH_LSHIFT; |
317 |
+ if (*++buf != '=') { |
318 |
+ value = ARITH_LSHIFT; |
319 |
+ goto out; |
320 |
+ } |
321 |
+ value = ARITH_LSHASSIGN; |
322 |
break; |
323 |
default: |
324 |
value = ARITH_LT; |
325 |
@@ -102,19 +187,29 @@ |
326 |
} |
327 |
break; |
328 |
case '|': |
329 |
- if (*++buf != '|') { |
330 |
+ switch (*++buf) { |
331 |
+ case '|': |
332 |
value = ARITH_BOR; |
333 |
+ break; |
334 |
+ case '=': |
335 |
+ value = ARITH_BORASSIGN; |
336 |
+ break; |
337 |
+ default: |
338 |
+ value = ARITH_OR; |
339 |
goto out; |
340 |
} |
341 |
- value = ARITH_OR; |
342 |
- break; |
343 |
case '&': |
344 |
- if (*++buf != '&') { |
345 |
+ switch (*++buf) { |
346 |
+ case '&': |
347 |
+ value = ARITH_AND; |
348 |
+ break; |
349 |
+ case '=': |
350 |
+ value = ARITH_BANDASSIGN; |
351 |
+ break; |
352 |
+ default: |
353 |
value = ARITH_BAND; |
354 |
goto out; |
355 |
} |
356 |
- value = ARITH_AND; |
357 |
- break; |
358 |
case '!': |
359 |
if (*++buf != '=') { |
360 |
value = ARITH_NOT; |
361 |
@@ -132,25 +227,49 @@ |
362 |
value = ARITH_RPAREN; |
363 |
break; |
364 |
case '*': |
365 |
- value = ARITH_MUL; |
366 |
+ if (*++buf != '=') { |
367 |
+ value = ARITH_MUL; |
368 |
+ goto out; |
369 |
+ } |
370 |
+ value = ARITH_MULASSIGN; |
371 |
break; |
372 |
case '/': |
373 |
- value = ARITH_DIV; |
374 |
+ if (*++buf != '=') { |
375 |
+ value = ARITH_DIV; |
376 |
+ goto out; |
377 |
+ } |
378 |
+ value = ARITH_DIVASSIGN; |
379 |
break; |
380 |
case '%': |
381 |
- value = ARITH_REM; |
382 |
+ if (*++buf != '=') { |
383 |
+ value = ARITH_REM; |
384 |
+ goto out; |
385 |
+ } |
386 |
+ value = ARITH_REMASSIGN; |
387 |
break; |
388 |
case '+': |
389 |
- value = ARITH_ADD; |
390 |
+ if (*++buf != '=') { |
391 |
+ value = ARITH_ADD; |
392 |
+ goto out; |
393 |
+ } |
394 |
+ value = ARITH_ADDASSIGN; |
395 |
break; |
396 |
case '-': |
397 |
- value = ARITH_SUB; |
398 |
+ if (*++buf != '=') { |
399 |
+ value = ARITH_SUB; |
400 |
+ goto out; |
401 |
+ } |
402 |
+ value = ARITH_SUBASSIGN; |
403 |
break; |
404 |
case '~': |
405 |
value = ARITH_BNOT; |
406 |
break; |
407 |
case '^': |
408 |
- value = ARITH_BXOR; |
409 |
+ if (*++buf != '=') { |
410 |
+ value = ARITH_BXOR; |
411 |
+ goto out; |
412 |
+ } |
413 |
+ value = ARITH_BXORASSIGN; |
414 |
break; |
415 |
} |
416 |
break; |
417 |
diff -ur a/src/shell.h b/src/shell.h |
418 |
--- a/src/shell.h 2007-07-13 09:26:43.000000000 +0100 |
419 |
+++ b/src/shell.h 2007-10-08 11:04:29.000000000 +0100 |
420 |
@@ -58,6 +58,15 @@ |
421 |
#define BSD 1 |
422 |
#endif |
423 |
|
424 |
+/* |
425 |
+ * Type of used arithmetics. SUSv3 requires us to have at least signed long. |
426 |
+ */ |
427 |
+typedef long arith_t; |
428 |
+#define ARITH_FORMAT_STR "%ld" |
429 |
+#define atoarith_t(arg) strtol(arg, NULL, 0) |
430 |
+#define strtoarith_t(nptr, endptr, base) strtol(nptr, endptr, base) |
431 |
+ |
432 |
+ |
433 |
#ifndef DO_SHAREDVFORK |
434 |
#if __NetBSD_Version__ >= 104000000 |
435 |
#define DO_SHAREDVFORK |
436 |
|
437 |
|
438 |
|
439 |
1.1 app-shells/dash/files/digest-dash-0.5.4.1-r1 |
440 |
|
441 |
file : http://sources.gentoo.org/viewcvs.py/gentoo-x86/app-shells/dash/files/digest-dash-0.5.4.1-r1?rev=1.1&view=markup |
442 |
plain: http://sources.gentoo.org/viewcvs.py/gentoo-x86/app-shells/dash/files/digest-dash-0.5.4.1-r1?rev=1.1&content-type=text/plain |
443 |
|
444 |
Index: digest-dash-0.5.4.1-r1 |
445 |
=================================================================== |
446 |
MD5 bc457e490a589d2f87f2333616b67931 dash-0.5.4.tar.gz 212145 |
447 |
RMD160 322fc2fffc5fddf4223d39c57eaeb9b4222303fa dash-0.5.4.tar.gz 212145 |
448 |
SHA256 a9dc8f0237f632dd2c1bfeff80b1052e75fafaef0d767e3beab0bd8becced623 dash-0.5.4.tar.gz 212145 |
449 |
MD5 304e8c13d012585314d73589e50dea38 dash_0.5.4-1.diff.gz 24636 |
450 |
RMD160 5013da584493f1147a3be8a321985cf464da22af dash_0.5.4-1.diff.gz 24636 |
451 |
SHA256 0214f40865c2b904710cadf84ece22c932bbeac85b0fa9e6c5e9abd46d36e453 dash_0.5.4-1.diff.gz 24636 |
452 |
|
453 |
|
454 |
|
455 |
-- |
456 |
gentoo-commits@g.o mailing list |