|
|
1.1 root 1: 0707070114030104531006660005500000040000010641070426654763700001000000015757COPYING
2: GNU CC GENERAL PUBLIC LICENSE
3: (Clarified 11 Feb 1988)
4:
5: Copyright (C) 1988 Richard M. Stallman
6: Everyone is permitted to copy and distribute verbatim copies
7: of this license, but changing it is not allowed. You can also
8: use this wording to make the terms for other programs.
9:
10: The license agreements of most software companies keep you at the
11: mercy of those companies. By contrast, our general public license is
12: intended to give everyone the right to share GNU CC. To make sure that
13: you get the rights we want you to have, we need to make restrictions
14: that forbid anyone to deny you these rights or to ask you to surrender
15: the rights. Hence this license agreement.
16:
17: Specifically, we want to make sure that you have the right to give
18: away copies of GNU CC, that you receive source code or else can get it
19: if you want it, that you can change GNU CC or use pieces of it in new
20: free programs, and that you know you can do these things.
21:
22: To make sure that everyone has such rights, we have to forbid you to
23: deprive anyone else of these rights. For example, if you distribute
24: copies of GNU CC, you must give the recipients all the rights that you
25: have. You must make sure that they, too, receive or can get the
26: source code. And you must tell them their rights.
27:
28: Also, for our own protection, we must make certain that everyone
29: finds out that there is no warranty for GNU CC. If GNU CC is modified by
30: someone else and passed on, we want its recipients to know that what
31: they have is not what we distributed, so that any problems introduced
32: by others will not reflect on our reputation.
33:
34: Therefore we (Richard Stallman and the Free Software Foundation,
35: Inc.) make the following terms which say what you must do to be
36: allowed to distribute or change GNU CC.
37:
38:
39: COPYING POLICIES
40:
41: 1. You may copy and distribute verbatim copies of GNU CC source code
42: as you receive it, in any medium, provided that you conspicuously and
43: appropriately publish on each copy a valid copyright notice "Copyright
44: (C) 1988 Free Software Foundation, Inc." (or with whatever year is
45: appropriate); keep intact the notices on all files that refer to this
46: License Agreement and to the absence of any warranty; and give any
47: other recipients of the GNU CC program a copy of this License
48: Agreement along with the program. You may charge a distribution fee
49: for the physical act of transferring a copy.
50:
51: 2. You may modify your copy or copies of GNU CC or any portion of it,
52: and copy and distribute such modifications under the terms of
53: Paragraph 1 above, provided that you also do the following:
54:
55: a) cause the modified files to carry prominent notices stating
56: that you changed the files and the date of any change; and
57:
58: b) cause the whole of any work that you distribute or publish,
59: that in whole or in part contains or is a derivative of GNU CC or
60: any part thereof, to be licensed at no charge to all third
61: parties on terms identical to those contained in this License
62: Agreement (except that you may choose to grant more extensive
63: warranty protection to some or all third parties, at your option).
64:
65: c) You may charge a distribution fee for the physical act of
66: transferring a copy, and you may at your option offer warranty
67: protection in exchange for a fee.
68:
69: Mere aggregation of another unrelated program with this program (or its
70: derivative) on a volume of a storage or distribution medium does not bring
71: the other program under the scope of these terms.
72:
73: 3. You may copy and distribute GNU CC (or a portion or derivative of it,
74: under Paragraph 2) in object code or executable form under the terms of
75: Paragraphs 1 and 2 above provided that you also do one of the following:
76:
77: a) accompany it with the complete corresponding machine-readable
78: source code, which must be distributed under the terms of
79: Paragraphs 1 and 2 above; or,
80:
81: b) accompany it with a written offer, valid for at least three
82: years, to give any third party free (except for a nominal
83: shipping charge) a complete machine-readable copy of the
84: corresponding source code, to be distributed under the terms of
85: Paragraphs 1 and 2 above; or,
86:
87: c) accompany it with the information you received as to where the
88: corresponding source code may be obtained. (This alternative is
89: allowed only for noncommercial distribution and only if you
90: received the program in object code or executable form alone.)
91:
92: For an executable file, complete source code means all the source code for
93: all modules it contains; but, as a special exception, it need not include
94: source code for modules which are standard libraries that accompany the
95: operating system on which the executable file runs.
96:
97: 4. You may not copy, sublicense, distribute or transfer GNU CC
98: except as expressly provided under this License Agreement. Any attempt
99: otherwise to copy, sublicense, distribute or transfer GNU CC is void and
100: your rights to use the program under this License agreement shall be
101: automatically terminated. However, parties who have received computer
102: software programs from you with this License Agreement will not have
103: their licenses terminated so long as such parties remain in full compliance.
104:
105: 5. If you wish to incorporate parts of GNU CC into other free programs
106: whose distribution conditions are different, write to the Free Software
107: Foundation at 675 Mass Ave, Cambridge, MA 02139. We have not yet worked
108: out a simple rule that can be stated here, but we will often permit this.
109: We will be guided by the two goals of preserving the free status of all
110: derivatives of our free software and of promoting the sharing and reuse of
111: software.
112:
113: Your comments and suggestions about our licensing policies and our
114: software are welcome! Please contact the Free Software Foundation, Inc.,
115: 675 Mass Ave, Cambridge, MA 02139, or call (617) 876-3296.
116:
117: NO WARRANTY
118:
119: BECAUSE GNU CC IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY NO
120: WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT
121: WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
122: RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE GNU CC "AS IS" WITHOUT
123: WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
124: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
125: A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
126: PERFORMANCE OF GNU CC IS WITH YOU. SHOULD GNU CC PROVE DEFECTIVE, YOU
127: ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
128:
129: IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
130: STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
131: WHO MAY MODIFY AND REDISTRIBUTE GNU CC AS PERMITTED ABOVE, BE LIABLE TO
132: YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR OTHER
133: SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
134: INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
135: BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR A
136: FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) GNU CC, EVEN
137: IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR FOR
138: ANY CLAIM BY ANY OTHER PARTY.
139: 0707070114030170161006660005500000040000010614560426655020300001100000011751alloca.c /*
140: alloca -- (mostly) portable public-domain implementation
141:
142: last edit: 86/01/26 D A Gwyn
143:
144: This implementation of the PWB library alloca() function,
145: which is used to allocate space off the run-time stack so
146: that it is automatically reclaimed upon procedure exit,
147: was inspired by discussions with J. Q. Johnson of Cornell.
148:
149: It should work under any C implementation that uses an
150: actual procedure stack (as opposed to a linked list of
151: frames). There are some preprocessor constants that can
152: be defined when compiling for your specific system, for
153: improved efficiency; however, the defaults should be okay.
154:
155: The general concept of this implementation is to keep
156: track of all alloca()-allocated blocks, and reclaim any
157: that are found to be deeper in the stack than the current
158: invocation. This heuristic does not reclaim storage as
159: soon as it becomes invalid, but it will do so eventually.
160:
161: As a special case, alloca(0) reclaims storage without
162: allocating any. It is a good idea to use alloca(0) in
163: your main control loop, etc. to force garbage collection.
164: */
165: #ifndef lint
166: static char SCCSid[] = "@(#)alloca.c 1.1"; /* for the "what" utility */
167: #endif
168:
169: #ifdef X3J11
170: typedef void *pointer; /* generic pointer type */
171: #else
172: typedef char *pointer; /* generic pointer type */
173: #endif
174:
175: #define NULL 0 /* null pointer constant */
176:
177: extern void free();
178: extern pointer xmalloc();
179:
180: /*
181: Define STACK_DIRECTION if you know the direction of stack
182: growth for your system; otherwise it will be automatically
183: deduced at run-time.
184:
185: STACK_DIRECTION > 0 => grows toward higher addresses
186: STACK_DIRECTION < 0 => grows toward lower addresses
187: STACK_DIRECTION = 0 => direction of growth unknown
188: */
189:
190: #ifndef STACK_DIRECTION
191: #define STACK_DIRECTION 0 /* direction unknown */
192: #endif
193:
194: #if STACK_DIRECTION != 0
195:
196: #define STACK_DIR STACK_DIRECTION /* known at compile-time */
197:
198: #else /* STACK_DIRECTION == 0; need run-time code */
199:
200: static int stack_dir; /* 1 or -1 once known */
201: #define STACK_DIR stack_dir
202:
203: static void
204: find_stack_direction (/* void */)
205: {
206: static char *addr = NULL; /* address of first
207: `dummy', once known */
208: auto char dummy; /* to get stack address */
209:
210: if (addr == NULL)
211: { /* initial entry */
212: addr = &dummy;
213:
214: find_stack_direction (); /* recurse once */
215: }
216: else /* second entry */
217: if (&dummy > addr)
218: stack_dir = 1; /* stack grew upward */
219: else
220: stack_dir = -1; /* stack grew downward */
221: }
222:
223: #endif /* STACK_DIRECTION == 0 */
224:
225: /*
226: An "alloca header" is used to:
227: (a) chain together all alloca()ed blocks;
228: (b) keep track of stack depth.
229:
230: It is very important that sizeof(header) agree with malloc()
231: alignment chunk size. The following default should work okay.
232: */
233:
234: #ifndef ALIGN_SIZE
235: #define ALIGN_SIZE sizeof(double)
236: #endif
237:
238: typedef union hdr
239: {
240: char align[ALIGN_SIZE]; /* to force sizeof(header) */
241: struct
242: {
243: union hdr *next; /* for chaining headers */
244: char *deep; /* for stack depth measure */
245: } h;
246: } header;
247:
248: /*
249: alloca( size ) returns a pointer to at least `size' bytes of
250: storage which will be automatically reclaimed upon exit from
251: the procedure that called alloca(). Originally, this space
252: was supposed to be taken from the current stack frame of the
253: caller, but that method cannot be made to work for some
254: implementations of C, for example under Gould's UTX/32.
255: */
256:
257: pointer
258: alloca (size) /* returns pointer to storage */
259: unsigned size; /* # bytes to allocate */
260: {
261: static header *last = NULL; /* -> last alloca header */
262: auto char probe; /* probes stack depth: */
263: register char *depth = &probe;
264:
265: #if STACK_DIRECTION == 0
266: if (STACK_DIR == 0) /* unknown growth direction */
267: find_stack_direction ();
268: #endif
269:
270: /* Reclaim garbage, defined as all alloca()ed storage that
271: was allocated from deeper in the stack than currently. */
272:
273: {
274: register header *hp; /* traverses linked list */
275:
276: for (hp = last; hp != NULL;)
277: if (STACK_DIR > 0 && hp->h.deep > depth
278: || STACK_DIR < 0 && hp->h.deep < depth)
279: {
280: register header *np = hp->h.next;
281:
282: free ((pointer) hp); /* collect garbage */
283:
284: hp = np; /* -> next header */
285: }
286: else
287: break; /* rest are not deeper */
288:
289: last = hp; /* -> last valid storage */
290: }
291:
292: if (size == 0)
293: return NULL; /* no allocation required */
294:
295: /* Allocate combined header + user data storage. */
296:
297: {
298: register pointer new = xmalloc (sizeof (header) + size);
299: /* address of header */
300:
301: ((header *)new)->h.next = last;
302: ((header *)new)->h.deep = depth;
303:
304: last = (header *)new;
305:
306: /* User storage begins just after header. */
307:
308: return (pointer)((char *)new + sizeof(header));
309: }
310: }
311:
312: /* like malloc and realloc but check for no memory left */
313: /*
314: pointer
315: xmalloc (size)
316: int size;
317: {
318: pointer val = (pointer) malloc (size);
319: if (!val) memory_full ();
320: return val;
321: }
322:
323: pointer
324: xrealloc (block, size)
325: long *block;
326: int size;
327: {
328: pointer val = (pointer) realloc (block, size);
329: if (!val) memory_full ();
330: return val;
331: }
332: memory_full ()
333: {
334: error ("Memory exhausted");
335: }
336: */
337: 0707070114030157531006660005500000040000010274400426654765600000700000035321cexp.y /* Parse C expressions for CCCP.
338: Copyright (C) 1987 Free Software Foundation.
339:
340: NO WARRANTY
341:
342: BECAUSE THIS PROGRAM IS LICENSED FREE OF CHARGE, WE PROVIDE ABSOLUTELY
343: NO WARRANTY, TO THE EXTENT PERMITTED BY APPLICABLE STATE LAW. EXCEPT
344: WHEN OTHERWISE STATED IN WRITING, FREE SOFTWARE FOUNDATION, INC,
345: RICHARD M. STALLMAN AND/OR OTHER PARTIES PROVIDE THIS PROGRAM "AS IS"
346: WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
347: BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
348: FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY
349: AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
350: DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
351: CORRECTION.
352:
353: IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL RICHARD M.
354: STALLMAN, THE FREE SOFTWARE FOUNDATION, INC., AND/OR ANY OTHER PARTY
355: WHO MAY MODIFY AND REDISTRIBUTE THIS PROGRAM AS PERMITTED BELOW, BE
356: LIABLE TO YOU FOR DAMAGES, INCLUDING ANY LOST PROFITS, LOST MONIES, OR
357: OTHER SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
358: USE OR INABILITY TO USE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR
359: DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY THIRD PARTIES OR
360: A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS) THIS
361: PROGRAM, EVEN IF YOU HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
362: DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
363:
364: GENERAL PUBLIC LICENSE TO COPY
365:
366: 1. You may copy and distribute verbatim copies of this source file
367: as you receive it, in any medium, provided that you conspicuously and
368: appropriately publish on each copy a valid copyright notice "Copyright
369: (C) 1987 Free Software Foundation"; and include following the
370: copyright notice a verbatim copy of the above disclaimer of warranty
371: and of this License. You may charge a distribution fee for the
372: physical act of transferring a copy.
373:
374: 2. You may modify your copy or copies of this source file or
375: any portion of it, and copy and distribute such modifications under
376: the terms of Paragraph 1 above, provided that you also do the following:
377:
378: a) cause the modified files to carry prominent notices stating
379: that you changed the files and the date of any change; and
380:
381: b) cause the whole of any work that you distribute or publish,
382: that in whole or in part contains or is a derivative of this
383: program or any part thereof, to be licensed at no charge to all
384: third parties on terms identical to those contained in this
385: License Agreement (except that you may choose to grant more extensive
386: warranty protection to some or all third parties, at your option).
387:
388: c) You may charge a distribution fee for the physical act of
389: transferring a copy, and you may at your option offer warranty
390: protection in exchange for a fee.
391:
392: Mere aggregation of another unrelated program with this program (or its
393: derivative) on a volume of a storage or distribution medium does not bring
394: the other program under the scope of these terms.
395:
396: 3. You may copy and distribute this program (or a portion or derivative
397: of it, under Paragraph 2) in object code or executable form under the terms
398: of Paragraphs 1 and 2 above provided that you also do one of the following:
399:
400: a) accompany it with the complete corresponding machine-readable
401: source code, which must be distributed under the terms of
402: Paragraphs 1 and 2 above; or,
403:
404: b) accompany it with a written offer, valid for at least three
405: years, to give any third party free (except for a nominal
406: shipping charge) a complete machine-readable copy of the
407: corresponding source code, to be distributed under the terms of
408: Paragraphs 1 and 2 above; or,
409:
410: c) accompany it with the information you received as to where the
411: corresponding source code may be obtained. (This alternative is
412: allowed only for noncommercial distribution and only if you
413: received the program in object code or executable form alone.)
414:
415: For an executable file, complete source code means all the source code for
416: all modules it contains; but, as a special exception, it need not include
417: source code for modules which are standard libraries that accompany the
418: operating system on which the executable file runs.
419:
420: 4. You may not copy, sublicense, distribute or transfer this program
421: except as expressly provided under this License Agreement. Any attempt
422: otherwise to copy, sublicense, distribute or transfer this program is void and
423: your rights to use the program under this License agreement shall be
424: automatically terminated. However, parties who have received computer
425: software programs from you with this License Agreement will not have
426: their licenses terminated so long as such parties remain in full compliance.
427:
428: 5. If you wish to incorporate parts of this program into other free
429: programs whose distribution conditions are different, write to the Free
430: Software Foundation at 675 Mass Ave, Cambridge, MA 02139. We have not yet
431: worked out a simple rule that can be stated here, but we will often permit
432: this. We will be guided by the two goals of preserving the free status of
433: all derivatives of our free software and of promoting the sharing and reuse of
434: software.
435:
436:
437: In other words, you are welcome to use, share and improve this program.
438: You are forbidden to forbid anyone else to use, share and improve
439: what you give them. Help stamp out software-hoarding!
440:
441: Adapted from expread.y of GDB by Paul Rubin, July 1986.
442:
443: /* Parse a C expression from text in a string */
444:
445: %{
446: #include "config.h"
447: #include <setjmp.h>
448: /* #define YYDEBUG 1 */
449:
450: static int yylex ();
451: static yyerror ();
452: int expression_value;
453:
454: static jmp_buf parse_return_error;
455:
456: /* some external tables of character types */
457: extern unsigned char is_idstart[], is_idchar[];
458:
459: %}
460:
461: %union {
462: long lval;
463: int voidval;
464: char *sval;
465: }
466:
467: %type <lval> exp exp1 start
468: %token <lval> INT CHAR
469: %token <sval> NAME
470: %token <lval> ERROR
471:
472: %right '?' ':'
473: %left ','
474: %left OR
475: %left AND
476: %left '|'
477: %left '^'
478: %left '&'
479: %left EQUAL NOTEQUAL
480: %left '<' '>' LEQ GEQ
481: %left LSH RSH
482: %left '+' '-'
483: %left '*' '/' '%'
484: %right UNARY
485:
486: /* %expect 40 */
487:
488: %%
489:
490: start : exp1
491: { expression_value = $1; }
492: ;
493:
494: /* Expressions, including the comma operator. */
495: exp1 : exp
496: | exp1 ',' exp
497: { $$ = $3; }
498: ;
499:
500: /* Expressions, not including the comma operator. */
501: exp : '-' exp %prec UNARY
502: { $$ = - $2; }
503: | '!' exp %prec UNARY
504: { $$ = ! $2; }
505: | '~' exp %prec UNARY
506: { $$ = ~ $2; }
507: | '(' exp1 ')'
508: { $$ = $2; }
509: ;
510:
511: /* Binary operators in order of decreasing precedence. */
512: exp : exp '*' exp
513: { $$ = $1 * $3; }
514: | exp '/' exp
515: { $$ = $1 / $3; }
516: | exp '%' exp
517: { $$ = $1 % $3; }
518: | exp '+' exp
519: { $$ = $1 + $3; }
520: | exp '-' exp
521: { $$ = $1 - $3; }
522: | exp LSH exp
523: { $$ = $1 << $3; }
524: | exp RSH exp
525: { $$ = $1 >> $3; }
526: | exp EQUAL exp
527: { $$ = ($1 == $3); }
528: | exp NOTEQUAL exp
529: { $$ = ($1 != $3); }
530: | exp LEQ exp
531: { $$ = ($1 <= $3); }
532: | exp GEQ exp
533: { $$ = ($1 >= $3); }
534: | exp '<' exp
535: { $$ = ($1 < $3); }
536: | exp '>' exp
537: { $$ = ($1 > $3); }
538: | exp '&' exp
539: { $$ = ($1 & $3); }
540: | exp '^' exp
541: { $$ = ($1 ^ $3); }
542: | exp '|' exp
543: { $$ = ($1 | $3); }
544: | exp AND exp
545: { $$ = ($1 && $3); }
546: | exp OR exp
547: { $$ = ($1 || $3); }
548: | exp '?' exp ':' exp
549: { $$ = $1 ? $3 : $5; }
550: | INT
551: { $$ = yylval.lval; }
552: | CHAR
553: { $$ = yylval.lval; }
554: | NAME
555: { $$ = 0; }
556: ;
557: %%
558:
559: /* During parsing of a C expression, the pointer to the next character
560: is in this variable. */
561:
562: static char *lexptr;
563:
564: /* Take care of parsing a number (anything that starts with a digit).
565: Set yylval and return the token type; update lexptr.
566: LEN is the number of characters in it. */
567:
568: /* maybe needs to actually deal with floating point numbers */
569:
570: static int
571: parse_number (olen)
572: int olen;
573: {
574: register char *p = lexptr;
575: register long n = 0;
576: register int c;
577: register int base = 10;
578: register len = olen;
579: char *err_copy;
580:
581: extern double atof ();
582:
583: for (c = 0; c < len; c++)
584: if (p[c] == '.') {
585: /* It's a float since it contains a point. */
586: yyerror ("floating point numbers not allowed in #if expressions");
587: return ERROR;
588:
589: /* ****************
590: yylval.dval = atof (p);
591: lexptr += len;
592: return FLOAT;
593: **************** */
594: }
595:
596: if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
597: p += 2;
598: base = 16;
599: len -= 2;
600: }
601: else if (*p == '0')
602: base = 8;
603:
604: while (len-- > 0) {
605: c = *p++;
606: n *= base;
607: if (c >= '0' && c <= '9')
608: n += c - '0';
609: else {
610: if (c >= 'A' && c <= 'Z') c += 'a' - 'A';
611: if (base == 16 && c >= 'a' && c <= 'f')
612: n += c - 'a' + 10;
613: else if (len == 0 && c == 'l')
614: ;
615: else {
616: yyerror ("Invalid number in #if expression");
617: return ERROR;
618: }
619: }
620: }
621:
622: lexptr = p;
623: yylval.lval = n;
624: return INT;
625: }
626:
627: struct token {
628: char *operator;
629: int token;
630: };
631:
632: #define NULL 0
633:
634: static struct token tokentab2[] = {
635: {"&&", AND},
636: {"||", OR},
637: {"<<", LSH},
638: {">>", RSH},
639: {"==", EQUAL},
640: {"!=", NOTEQUAL},
641: {"<=", LEQ},
642: {">=", GEQ},
643: {NULL, ERROR}
644: };
645:
646: /* Read one token, getting characters through lexptr. */
647:
648: static int
649: yylex ()
650: {
651: register int c;
652: register int namelen;
653: register char *tokstart;
654: register struct token *toktab;
655:
656: retry:
657:
658: tokstart = lexptr;
659: c = *tokstart;
660: /* See if it is a special token of length 2. */
661: for (toktab = tokentab2; toktab->operator != NULL; toktab++)
662: if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) {
663: lexptr += 2;
664: return toktab->token;
665: }
666:
667: switch (c) {
668: case 0:
669: return 0;
670:
671: case ' ':
672: case '\t':
673: case '\n':
674: lexptr++;
675: goto retry;
676:
677: case '\'':
678: lexptr++;
679: c = *lexptr++;
680: if (c == '\\')
681: c = parse_escape (&lexptr);
682: yylval.lval = c;
683: c = *lexptr++;
684: if (c != '\'') {
685: yyerror ("Invalid character constant in #if");
686: return ERROR;
687: }
688:
689: return CHAR;
690:
691: /* some of these chars are invalid in constant expressions;
692: maybe do something about them later */
693: case '/':
694: case '+':
695: case '-':
696: case '*':
697: case '%':
698: case '|':
699: case '&':
700: case '^':
701: case '~':
702: case '!':
703: case '@':
704: case '<':
705: case '>':
706: case '(':
707: case ')':
708: case '[':
709: case ']':
710: case '.':
711: case '?':
712: case ':':
713: case '=':
714: case '{':
715: case '}':
716: case ',':
717: lexptr++;
718: return c;
719:
720: case '"':
721: yyerror ("double quoted strings not allowed in #if expressions");
722: return ERROR;
723: }
724: if (c >= '0' && c <= '9') {
725: /* It's a number */
726: for (namelen = 0;
727: c = tokstart[namelen], is_idchar[c] || c == '.';
728: namelen++)
729: ;
730: return parse_number (namelen);
731: }
732:
733: if (!is_idstart[c]) {
734: yyerror ("Invalid token in expression");
735: return ERROR;
736: }
737:
738: /* It is a name. See how long it is. */
739:
740: for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++)
741: ;
742:
743: lexptr += namelen;
744: return NAME;
745: }
746:
747:
748: /* Parse a C escape sequence. STRING_PTR points to a variable
749: containing a pointer to the string to parse. That pointer
750: is updated past the characters we use. The value of the
751: escape sequence is returned.
752:
753: A negative value means the sequence \ newline was seen,
754: which is supposed to be equivalent to nothing at all.
755:
756: If \ is followed by a null character, we return a negative
757: value and leave the string pointer pointing at the null character.
758:
759: If \ is followed by 000, we return 0 and leave the string pointer
760: after the zeros. A value of 0 does not mean end of string. */
761:
762: static int
763: parse_escape (string_ptr)
764: char **string_ptr;
765: {
766: register int c = *(*string_ptr)++;
767: switch (c)
768: {
769: case 'a':
770: return '\a';
771: case 'b':
772: return '\b';
773: case 'e':
774: return 033;
775: case 'f':
776: return '\f';
777: case 'n':
778: return '\n';
779: case 'r':
780: return '\r';
781: case 't':
782: return '\t';
783: case 'v':
784: return '\v';
785: case '\n':
786: return -2;
787: case 0:
788: (*string_ptr)--;
789: return 0;
790: case '^':
791: c = *(*string_ptr)++;
792: if (c == '\\')
793: c = parse_escape (string_ptr);
794: if (c == '?')
795: return 0177;
796: return (c & 0200) | (c & 037);
797:
798: case '0':
799: case '1':
800: case '2':
801: case '3':
802: case '4':
803: case '5':
804: case '6':
805: case '7':
806: {
807: register int i = c - '0';
808: register int count = 0;
809: while (++count < 3)
810: {
811: if ((c = *(*string_ptr)++) >= '0' && c <= '7')
812: {
813: i *= 8;
814: i += c - '0';
815: }
816: else
817: {
818: (*string_ptr)--;
819: break;
820: }
821: }
822: return i;
823: }
824: default:
825: return c;
826: }
827: }
828:
829: static
830: yyerror (s)
831: char *s;
832: {
833: error (s);
834: longjmp (parse_return_error, 1);
835: }
836:
837: /* This page contains the entry point to this file. */
838:
839: /* Parse STRING as an expression, and complain if this fails
840: to use up all of the contents of STRING. */
841: /* We do not support C comments. They should be removed before
842: this function is called. */
843:
844: int
845: parse_c_expression (string)
846: char *string;
847: {
848: lexptr = string;
849:
850: if (lexptr == 0 || *lexptr == 0) {
851: error ("empty #if expression");
852: return 0; /* don't include the #if group */
853: }
854:
855: /* if there is some sort of scanning error, just return 0 and assume
856: the parsing routine has printed an error message somewhere.
857: there is surely a better thing to do than this. */
858: if (setjmp(parse_return_error))
859: return 0;
860:
861: if (yyparse ())
862: return 0; /* actually this is never reached
863: the way things stand. */
864: if (*lexptr)
865: error ("Junk after end of expression.");
866:
867: return expression_value; /* set by yyparse() */
868: }
869:
870: #ifdef TEST_EXP_READER
871: /* main program, for testing purposes. */
872: main()
873: {
874: int n;
875: char buf[1024];
876: extern int yydebug;
877: /*
878: yydebug = 1;
879: */
880: initialize_random_junk ();
881:
882: for (;;) {
883: printf("enter expression: ");
884: n = 0;
885: while ((buf[n] = getchar()) != '\n')
886: n++;
887: buf[n] = '\0';
888: printf("parser returned %d\n", parse_c_expression(buf));
889: }
890: }
891:
892: /* table to tell if char can be part of a C identifier. */
893: char is_idchar[256];
894: /* table to tell if char can be first char of a c identifier. */
895: char is_idstart[256];
896: /* table to tell if c is horizontal space. isspace() thinks that
897: newline is space; this is not a good idea for this program. */
898: char is_hor_space[256];
899:
900: /*
901: * initialize random junk in the hash table and maybe other places
902: */
903: initialize_random_junk()
904: {
905: register int i;
906:
907: /*
908: * Set up is_idchar and is_idstart tables. These should be
909: * faster than saying (is_alpha(c) || c == '_'), etc.
910: * Must do set up these things before calling any routines tthat
911: * refer to them.
912: */
913: for (i = 'a'; i <= 'z'; i++) {
914: ++is_idchar[i - 'a' + 'A'];
915: ++is_idchar[i];
916: ++is_idstart[i - 'a' + 'A'];
917: ++is_idstart[i];
918: }
919: for (i = '0'; i <= '9'; i++)
920: ++is_idchar[i];
921: ++is_idchar['_'];
922: ++is_idstart['_'];
923: #ifdef DOLLARS_IN_IDENTIFIERS
924: ++is_idchar['$'];
925: ++is_idstart['$'];
926: #endif
927:
928: /* horizontal space table */
929: ++is_hor_space[' '];
930: ++is_hor_space['\t'];
931: }
932:
933: error (msg)
934: {
935: printf("error: %s\n", msg);
936: }
937: #endif
938: 0707070114030157321006660005500000040000020640560426654766100001100000003137config.h /* Con
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.