1 %
{ /* deffilep.y - parser for .def files */
3 /* Copyright 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
24 #include "libiberty.h"
25 #include "safe-ctype.h"
33 #define ROUND_UP(a, b) (((a)+((b)-1))&~((b)-1))
35 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
36 as well as gratuitiously global symbol names, so we can have multiple
37 yacc generated parsers in ld. Note that these are only the variables
38 produced by yacc. If other parser generators (bison, byacc, etc) produce
39 additional global names that conflict at link time, then those parser
40 generators need to be fixed instead of adding those names to this list. */
42 #define yymaxdepth def_maxdepth
43 #define yyparse def_parse
45 #define yyerror def_error
46 #define yylval def_lval
47 #define yychar def_char
48 #define yydebug def_debug
49 #define yypact def_pact
56 #define yyexca def_exca
57 #define yyerrflag def_errflag
58 #define yynerrs def_nerrs
62 #define yy_yys def_yys
63 #define yystate def_state
66 #define yy_yyv def_yyv
68 #define yylloc def_lloc
69 #define yyreds def_reds /* With YYDEBUG defined. */
70 #define yytoks def_toks /* With YYDEBUG defined. */
71 #define yylhs def_yylhs
72 #define yylen def_yylen
73 #define yydefred def_yydefred
74 #define yydgoto def_yydgoto
75 #define yysindex def_yysindex
76 #define yyrindex def_yyrindex
77 #define yygindex def_yygindex
78 #define yytable def_yytable
79 #define yycheck def_yycheck
81 static void def_description
(const char *);
82 static void def_exports
(const char *, const char *, int, int);
83 static void def_heapsize
(int, int);
84 static void def_import
(const char *, const char *, const char *, const char *,
86 static void def_image_name
(const char *, int, int);
87 static void def_section
(const char *, int);
88 static void def_section_alt
(const char *, const char *);
89 static void def_stacksize
(int, int);
90 static void def_version
(int, int);
91 static void def_directive
(char *);
92 static void def_aligncomm
(char *str
, int align
);
93 static int def_parse
(void);
94 static int def_error
(const char *);
95 static int def_lex
(void);
97 static int lex_forced_token
= 0;
98 static const char *lex_parse_string
= 0;
99 static const char *lex_parse_string_end
= 0;
109 %token NAME LIBRARY DESCRIPTION STACKSIZE_K HEAPSIZE CODE DATAU DATAL
110 %token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL
111 %token PRIVATEU PRIVATEL ALIGNCOMM
112 %token READ WRITE EXECUTE SHARED NONAMEU NONAMEL DIRECTIVE
114 %token
<digits
> DIGITS
115 %type
<number
> NUMBER
116 %type
<digits
> opt_digits
117 %type
<number
> opt_base opt_ordinal
118 %type
<number
> attr attr_list opt_number exp_opt_list exp_opt
119 %type
<id
> opt_name opt_equal_name dot_name anylang_id opt_id
128 NAME opt_name opt_base
{ def_image_name
($2, $3, 0); }
129 | LIBRARY opt_name opt_base
{ def_image_name
($2, $3, 1); }
130 | DESCRIPTION ID
{ def_description
($2);}
131 | STACKSIZE_K NUMBER opt_number
{ def_stacksize
($2, $3);}
132 | HEAPSIZE NUMBER opt_number
{ def_heapsize
($2, $3);}
133 | CODE attr_list
{ def_section
("CODE", $2);}
134 | DATAU attr_list
{ def_section
("DATA", $2);}
138 | VERSIONK NUMBER
{ def_version
($2, 0);}
139 | VERSIONK NUMBER
'.' NUMBER
{ def_version
($2, $4);}
140 | DIRECTIVE ID
{ def_directive
($2);}
141 | ALIGNCOMM anylang_id
',' NUMBER
{ def_aligncomm
($2, $4);}
152 /* The opt_comma is necessary to support both the usual
153 DEF file syntax as well as .drectve syntax which
154 mandates <expsym>,<expoptlist>. */
155 dot_name opt_equal_name opt_ordinal opt_comma exp_opt_list
156 { def_exports
($1, $2, $3, $5); }
159 /* The opt_comma is necessary to support both the usual
160 DEF file syntax as well as .drectve syntax which
161 allows for comma separated opt list. */
162 exp_opt opt_comma exp_opt_list
{ $$
= $1 |
$3; }
167 | NONAMEL
{ $$
= 1; }
168 | CONSTANTU
{ $$
= 2; }
169 | CONSTANTL
{ $$
= 2; }
172 | PRIVATEU
{ $$
= 8; }
173 | PRIVATEL
{ $$
= 8; }
181 ID
'=' ID
'.' ID
'.' ID
{ def_import
($1, $3, $5, $7, -1); }
182 | ID
'=' ID
'.' ID
'.' NUMBER
{ def_import
($1, $3, $5, 0, $7); }
183 | ID
'=' ID
'.' ID
{ def_import
($1, $3, 0, $5, -1); }
184 | ID
'=' ID
'.' NUMBER
{ def_import
($1, $3, 0, 0, $5); }
185 | ID
'.' ID
'.' ID
{ def_import
( 0, $1, $3, $5, -1); }
186 | ID
'.' ID
{ def_import
( 0, $1, 0, $3, -1); }
195 ID attr_list
{ def_section
($1, $2);}
196 | ID ID
{ def_section_alt
($1, $2);}
200 attr_list opt_comma attr
{ $$
= $1 |
$3; }
208 opt_number: ',' NUMBER
{ $$
=$2;}
219 opt_name: ID
{ $$
= $1; }
222 char *name
= xmalloc
(strlen
($1) + 1 + strlen
($3) + 1);
223 sprintf
(name
, "%s.%s", $1, $3);
230 '@' NUMBER
{ $$
= $2;}
235 '=' dot_name
{ $$
= $2; }
239 opt_base: BASE
'=' NUMBER
{ $$
= $3;}
243 dot_name: ID
{ $$
= $1; }
246 char *name
= xmalloc
(strlen
($1) + 1 + strlen
($3) + 1);
247 sprintf
(name
, "%s.%s", $1, $3);
252 anylang_id: ID
{ $$
= $1; }
253 | anylang_id
'.' opt_digits opt_id
255 char *id
= xmalloc
(strlen
($1) + 1 + strlen
($3) + strlen
($4) + 1);
256 sprintf
(id
, "%s.%s%s", $1, $3, $4);
261 opt_digits: DIGITS
{ $$
= $1; }
265 opt_id: ID
{ $$
= $1; }
269 NUMBER: DIGITS
{ $$
= strtoul
($1, 0, 0); }
273 /*****************************************************************************
275 *****************************************************************************/
277 static FILE *the_file
;
278 static const char *def_filename
;
279 static int linenumber
;
280 static def_file
*def
;
281 static int saw_newline
;
285 struct directive
*next
;
290 static struct directive
*directives
= 0;
293 def_file_empty
(void)
295 def_file
*rv
= xmalloc
(sizeof
(def_file
));
296 memset
(rv
, 0, sizeof
(def_file
));
298 rv
->base_address
= (bfd_vma
) -1;
299 rv
->stack_reserve
= rv
->stack_commit
= -1;
300 rv
->heap_reserve
= rv
->heap_commit
= -1;
301 rv
->version_major
= rv
->version_minor
= -1;
306 def_file_parse
(const char *filename
, def_file
*add_to
)
310 the_file
= fopen
(filename
, "r");
311 def_filename
= filename
;
324 def
= def_file_empty
();
337 for
(d
= directives
; d
; d
= d
->next
)
340 printf
("Adding directive %08x `%s'\n", d
->name
, d
->name
);
342 def_file_add_directive
(def
, d
->name
, d
->len
);
349 def_file_free
(def_file
*def
)
357 if
(def
->description
)
358 free
(def
->description
);
360 if
(def
->section_defs
)
362 for
(i
= 0; i
< def
->num_section_defs
; i
++)
364 if
(def
->section_defs
[i
].name
)
365 free
(def
->section_defs
[i
].name
);
366 if
(def
->section_defs
[i
].class
)
367 free
(def
->section_defs
[i
].class
);
369 free
(def
->section_defs
);
374 for
(i
= 0; i
< def
->num_exports
; i
++)
376 if
(def
->exports
[i
].internal_name
377 && def
->exports
[i
].internal_name
!= def
->exports
[i
].name
)
378 free
(def
->exports
[i
].internal_name
);
379 if
(def
->exports
[i
].name
)
380 free
(def
->exports
[i
].name
);
387 for
(i
= 0; i
< def
->num_imports
; i
++)
389 if
(def
->imports
[i
].internal_name
390 && def
->imports
[i
].internal_name
!= def
->imports
[i
].name
)
391 free
(def
->imports
[i
].internal_name
);
392 if
(def
->imports
[i
].name
)
393 free
(def
->imports
[i
].name
);
400 def_file_module
*m
= def
->modules
;
401 def
->modules
= def
->modules
->next
;
405 while
(def
->aligncomms
)
407 def_file_aligncomm
*c
= def
->aligncomms
;
408 def
->aligncomms
= def
->aligncomms
->next
;
409 free
(c
->symbol_name
);
416 #ifdef DEF_FILE_PRINT
418 def_file_print
(FILE *file
, def_file
*def
)
422 fprintf
(file
, ">>>> def_file at 0x%08x\n", def
);
424 fprintf
(file
, " name: %s\n", def
->name ? def
->name
: "(unspecified)");
425 if
(def
->is_dll
!= -1)
426 fprintf
(file
, " is dll: %s\n", def
->is_dll ?
"yes" : "no");
427 if
(def
->base_address
!= (bfd_vma
) -1)
428 fprintf
(file
, " base address: 0x%08x\n", def
->base_address
);
429 if
(def
->description
)
430 fprintf
(file
, " description: `%s'\n", def
->description
);
431 if
(def
->stack_reserve
!= -1)
432 fprintf
(file
, " stack reserve: 0x%08x\n", def
->stack_reserve
);
433 if
(def
->stack_commit
!= -1)
434 fprintf
(file
, " stack commit: 0x%08x\n", def
->stack_commit
);
435 if
(def
->heap_reserve
!= -1)
436 fprintf
(file
, " heap reserve: 0x%08x\n", def
->heap_reserve
);
437 if
(def
->heap_commit
!= -1)
438 fprintf
(file
, " heap commit: 0x%08x\n", def
->heap_commit
);
440 if
(def
->num_section_defs
> 0)
442 fprintf
(file
, " section defs:\n");
444 for
(i
= 0; i
< def
->num_section_defs
; i
++)
446 fprintf
(file
, " name: `%s', class: `%s', flags:",
447 def
->section_defs
[i
].name
, def
->section_defs
[i
].class
);
448 if
(def
->section_defs
[i
].flag_read
)
449 fprintf
(file
, " R");
450 if
(def
->section_defs
[i
].flag_write
)
451 fprintf
(file
, " W");
452 if
(def
->section_defs
[i
].flag_execute
)
453 fprintf
(file
, " X");
454 if
(def
->section_defs
[i
].flag_shared
)
455 fprintf
(file
, " S");
456 fprintf
(file
, "\n");
460 if
(def
->num_exports
> 0)
462 fprintf
(file
, " exports:\n");
464 for
(i
= 0; i
< def
->num_exports
; i
++)
466 fprintf
(file
, " name: `%s', int: `%s', ordinal: %d, flags:",
467 def
->exports
[i
].name
, def
->exports
[i
].internal_name
,
468 def
->exports
[i
].ordinal
);
469 if
(def
->exports
[i
].flag_private
)
470 fprintf
(file
, " P");
471 if
(def
->exports
[i
].flag_constant
)
472 fprintf
(file
, " C");
473 if
(def
->exports
[i
].flag_noname
)
474 fprintf
(file
, " N");
475 if
(def
->exports
[i
].flag_data
)
476 fprintf
(file
, " D");
477 fprintf
(file
, "\n");
481 if
(def
->num_imports
> 0)
483 fprintf
(file
, " imports:\n");
485 for
(i
= 0; i
< def
->num_imports
; i
++)
487 fprintf
(file
, " int: %s, from: `%s', name: `%s', ordinal: %d\n",
488 def
->imports
[i
].internal_name
,
489 def
->imports
[i
].module
,
490 def
->imports
[i
].name
,
491 def
->imports
[i
].ordinal
);
495 if
(def
->version_major
!= -1)
496 fprintf
(file
, " version: %d.%d\n", def
->version_major
, def
->version_minor
);
498 fprintf
(file
, "<<<< def_file at 0x%08x\n", def
);
503 def_file_add_export
(def_file
*def
,
504 const char *external_name
,
505 const char *internal_name
,
509 int max_exports
= ROUND_UP
(def
->num_exports
, 32);
511 if
(def
->num_exports
>= max_exports
)
513 max_exports
= ROUND_UP
(def
->num_exports
+ 1, 32);
515 def
->exports
= xrealloc
(def
->exports
,
516 max_exports
* sizeof
(def_file_export
));
518 def
->exports
= xmalloc
(max_exports
* sizeof
(def_file_export
));
520 e
= def
->exports
+ def
->num_exports
;
521 memset
(e
, 0, sizeof
(def_file_export
));
522 if
(internal_name
&& !external_name
)
523 external_name
= internal_name
;
524 if
(external_name
&& !internal_name
)
525 internal_name
= external_name
;
526 e
->name
= xstrdup
(external_name
);
527 e
->internal_name
= xstrdup
(internal_name
);
528 e
->ordinal
= ordinal
;
534 def_get_module
(def_file
*def
, const char *name
)
538 for
(s
= def
->modules
; s
; s
= s
->next
)
539 if
(strcmp
(s
->name
, name
) == 0)
545 static def_file_module
*
546 def_stash_module
(def_file
*def
, const char *name
)
550 if
((s
= def_get_module
(def
, name
)) != NULL
)
552 s
= xmalloc
(sizeof
(def_file_module
) + strlen
(name
));
553 s
->next
= def
->modules
;
556 strcpy
(s
->name
, name
);
561 def_file_add_import
(def_file
*def
,
565 const char *internal_name
)
568 int max_imports
= ROUND_UP
(def
->num_imports
, 16);
570 if
(def
->num_imports
>= max_imports
)
572 max_imports
= ROUND_UP
(def
->num_imports
+1, 16);
575 def
->imports
= xrealloc
(def
->imports
,
576 max_imports
* sizeof
(def_file_import
));
578 def
->imports
= xmalloc
(max_imports
* sizeof
(def_file_import
));
580 i
= def
->imports
+ def
->num_imports
;
581 memset
(i
, 0, sizeof
(def_file_import
));
583 i
->name
= xstrdup
(name
);
585 i
->module
= def_stash_module
(def
, module
);
586 i
->ordinal
= ordinal
;
588 i
->internal_name
= xstrdup
(internal_name
);
590 i
->internal_name
= i
->name
;
603 { "-heap", HEAPSIZE
},
604 { "-stack", STACKSIZE_K
},
605 { "-attr", SECTIONS
},
606 { "-export", EXPORTS
},
607 { "-aligncomm", ALIGNCOMM
},
612 def_file_add_directive
(def_file
*my_def
, const char *param
, int len
)
614 def_file
*save_def
= def
;
615 const char *pend
= param
+ len
;
616 char * tend
= (char *) param
;
624 && (ISSPACE
(*param
) ||
*param
== '\n' ||
*param
== 0))
630 /* Scan forward until we encounter any of:
631 - the end of the buffer
632 - the start of a new option
633 - a newline seperating options
634 - a NUL seperating options. */
635 for
(tend
= (char *) (param
+ 1);
637 && !(ISSPACE
(tend
[-1]) && *tend
== '-')
638 && *tend
!= '\n' && *tend
!= 0);
642 for
(i
= 0; diropts
[i
].param
; i
++)
644 int len
= strlen
(diropts
[i
].param
);
646 if
(tend
- param
>= len
647 && strncmp
(param
, diropts
[i
].param
, len
) == 0
648 && (param
[len
] == ':' || param
[len
] == ' '))
650 lex_parse_string_end
= tend
;
651 lex_parse_string
= param
+ len
+ 1;
652 lex_forced_token
= diropts
[i
].token
;
660 if
(!diropts
[i
].param
)
666 /* xgettext:c-format */
667 einfo
(_
("Warning: .drectve `%s' unrecognized\n"), param
);
671 lex_parse_string
= 0;
678 /* Parser Callbacks. */
681 def_image_name
(const char *name
, int base
, int is_dll
)
683 /* If a LIBRARY or NAME statement is specified without a name, there is nothing
684 to do here. We retain the output filename specified on command line. */
687 const char* image_name
= lbasename
(name
);
688 if
(image_name
!= name
)
689 einfo
("%s:%d: Warning: path components stripped from %s, '%s'\n",
690 def_filename
, linenumber
, is_dll ?
"LIBRARY" : "NAME",
694 /* Append the default suffix, if none specified. */
695 if
(strchr
(image_name
, '.') == 0)
697 const char * suffix
= is_dll ?
".dll" : ".exe";
699 def
->name
= xmalloc
(strlen
(image_name
) + strlen
(suffix
) + 1);
700 sprintf
(def
->name
, "%s%s", image_name
, suffix
);
703 def
->name
= xstrdup
(image_name
);
706 /* Honor a BASE address statement, even if LIBRARY string is empty. */
707 def
->base_address
= base
;
708 def
->is_dll
= is_dll
;
712 def_description
(const char *text
)
714 int len
= def
->description ? strlen
(def
->description
) : 0;
716 len
+= strlen
(text
) + 1;
717 if
(def
->description
)
719 def
->description
= xrealloc
(def
->description
, len
);
720 strcat
(def
->description
, text
);
724 def
->description
= xmalloc
(len
);
725 strcpy
(def
->description
, text
);
730 def_stacksize
(int reserve
, int commit
)
732 def
->stack_reserve
= reserve
;
733 def
->stack_commit
= commit
;
737 def_heapsize
(int reserve
, int commit
)
739 def
->heap_reserve
= reserve
;
740 def
->heap_commit
= commit
;
744 def_section
(const char *name
, int attr
)
747 int max_sections
= ROUND_UP
(def
->num_section_defs
, 4);
749 if
(def
->num_section_defs
>= max_sections
)
751 max_sections
= ROUND_UP
(def
->num_section_defs
+1, 4);
753 if
(def
->section_defs
)
754 def
->section_defs
= xrealloc
(def
->section_defs
,
755 max_sections
* sizeof
(def_file_import
));
757 def
->section_defs
= xmalloc
(max_sections
* sizeof
(def_file_import
));
759 s
= def
->section_defs
+ def
->num_section_defs
;
760 memset
(s
, 0, sizeof
(def_file_section
));
761 s
->name
= xstrdup
(name
);
771 def
->num_section_defs
++;
775 def_section_alt
(const char *name
, const char *attr
)
779 for
(; *attr
; attr
++)
801 def_section
(name
, aval
);
805 def_exports
(const char *external_name
,
806 const char *internal_name
,
810 def_file_export
*dfe
;
812 if
(!internal_name
&& external_name
)
813 internal_name
= external_name
;
815 printf
("def_exports, ext=%s int=%s\n", external_name
, internal_name
);
818 dfe
= def_file_add_export
(def
, external_name
, internal_name
, ordinal
);
820 dfe
->flag_noname
= 1;
822 dfe
->flag_constant
= 1;
826 dfe
->flag_private
= 1;
830 def_import
(const char *internal_name
,
837 const char *ext
= dllext ? dllext
: "dll";
839 buf
= xmalloc
(strlen
(module
) + strlen
(ext
) + 2);
840 sprintf
(buf
, "%s.%s", module
, ext
);
843 def_file_add_import
(def
, name
, module
, ordinal
, internal_name
);
849 def_version
(int major
, int minor
)
851 def
->version_major
= major
;
852 def
->version_minor
= minor
;
856 def_directive
(char *str
)
858 struct directive
*d
= xmalloc
(sizeof
(struct directive
));
860 d
->next
= directives
;
862 d
->name
= xstrdup
(str
);
863 d
->len
= strlen
(str
);
867 def_aligncomm
(char *str
, int align
)
869 def_file_aligncomm
*c
= xmalloc
(sizeof
(def_file_aligncomm
));
871 c
->symbol_name
= xstrdup
(str
);
872 c
->alignment
= (unsigned int) align
;
874 c
->next
= def
->aligncomms
;
879 def_error
(const char *err
)
881 einfo
("%P: %s:%d: %s\n",
882 def_filename ? def_filename
: "<unknown-file>", linenumber
, err
);
887 /* Lexical Scanner. */
892 /* Never freed, but always reused as needed, so no real leak. */
893 static char *buffer
= 0;
894 static int buflen
= 0;
895 static int bufptr
= 0;
900 if
(bufptr
== buflen
)
902 buflen
+= 50; /* overly reasonable, eh? */
904 buffer
= xrealloc
(buffer
, buflen
+ 1);
906 buffer
= xmalloc
(buflen
+ 1);
908 buffer
[bufptr
++] = c
;
909 buffer
[bufptr
] = 0; /* not optimal, but very convenient. */
921 { "CONSTANT", CONSTANTU
},
922 { "constant", CONSTANTL
},
925 { "DESCRIPTION", DESCRIPTION
},
926 { "DIRECTIVE", DIRECTIVE
},
927 { "EXECUTE", EXECUTE
},
928 { "EXPORTS", EXPORTS
},
929 { "HEAPSIZE", HEAPSIZE
},
930 { "IMPORTS", IMPORTS
},
931 { "LIBRARY", LIBRARY
},
933 { "NONAME", NONAMEU
},
934 { "noname", NONAMEL
},
935 { "PRIVATE", PRIVATEU
},
936 { "private", PRIVATEL
},
938 { "SECTIONS", SECTIONS
},
939 { "SEGMENTS", SECTIONS
},
940 { "SHARED", SHARED
},
941 { "STACKSIZE", STACKSIZE_K
},
942 { "VERSION", VERSIONK
},
952 if
(lex_parse_string
)
954 if
(lex_parse_string
>= lex_parse_string_end
)
957 rv
= *lex_parse_string
++;
961 rv
= fgetc
(the_file
);
971 if
(lex_parse_string
)
977 return ungetc
(c
, the_file
);
985 if
(lex_forced_token
)
987 i
= lex_forced_token
;
988 lex_forced_token
= 0;
990 printf
("lex: forcing token %d\n", i
);
997 /* Trim leading whitespace. */
998 while
(c
!= EOF
&& (c
== ' ' || c
== '\t') && saw_newline
)
1004 printf
("lex: EOF\n");
1009 if
(saw_newline
&& c
== ';')
1015 while
(c
!= EOF
&& c
!= '\n');
1021 /* Must be something else. */
1027 while
(c
!= EOF
&& (ISXDIGIT
(c
) ||
(c
== 'x')))
1034 yylval.digits
= xstrdup
(buffer
);
1036 printf
("lex: `%s' returns DIGITS\n", buffer
);
1041 if
(ISALPHA
(c
) || strchr
("$:-_?@", c
))
1050 if
(ISBLANK
(c
) ) /* '@' followed by whitespace. */
1052 else if
(ISDIGIT
(c
)) /* '@' followed by digit. */
1058 printf
("lex: @ returns itself\n");
1062 while
(c
!= EOF
&& (ISALNUM
(c
) || strchr
("$:-_?/@", c
)))
1069 if
(ISALPHA
(q
)) /* Check for tokens. */
1071 for
(i
= 0; tokens
[i
].name
; i
++)
1072 if
(strcmp
(tokens
[i
].name
, buffer
) == 0)
1075 printf
("lex: `%s' is a string token\n", buffer
);
1077 return tokens
[i
].token
;
1081 printf
("lex: `%s' returns ID\n", buffer
);
1083 yylval.id
= xstrdup
(buffer
);
1087 if
(c
== '\'' || c
== '"')
1093 while
(c
!= EOF
&& c
!= q
)
1098 yylval.id
= xstrdup
(buffer
);
1100 printf
("lex: `%s' returns ID\n", buffer
);
1105 if
(c
== '=' || c
== '.' || c
== ',')
1108 printf
("lex: `%c' returns itself\n", c
);
1119 /*printf ("lex: 0x%02x ignored\n", c); */