-1998-11-26 01:17 -0500 Zack Weinberg <zack@rabi.phys.columbia.edu>
+1998-12-07 Zack Weinberg <zack@rabi.phys.columbia.edu>
+
+ * cpplib.c (initialize_char_syntax): Use ISALPHA and ISALNUM
+ so it'll work on non-ASCII platforms. Always consider $ an
+ identifier character. Take no arguments.
+ (cpp_reader_init): Call initialize_char_syntax with no
+ arguments.
+ (cpp_start_read): Don't call initialize_char_syntax again.
+ Clear is_idchar['$'] and is_idstart['$'] if not
+ opts->dollars_in_ident.
+
+ * cpplib.h (struct cpp_reader): Replace void *data element by
+ cpp_options *opts. Rearrange elements to make gdb printout
+ less annoying (put buffer stack at end).
+ (CPP_OPTIONS): Get rid of now-unnecessary cast.
+
+ * cppmain.c: s/data/opts/ when initializing cpp_reader
+ structure.
+ * c-decl.c: Likewise.
+ * objc/objc-act.c: Likewise.
+ * fix-header.c: Likewise.
+
+1998-12-07 Zack Weinberg <zack@rabi.phys.columbia.edu>
* cpplib.h (struct cpp_buffer): Replace dir and dlen members
with a struct file_name_list pointer.
if (! cpp_initialized)
{
cpp_reader_init (&parse_in);
- parse_in.data = &parse_options;
+ parse_in.opts = &parse_options;
cpp_options_init (&parse_options);
cpp_initialized = 1;
}
static void make_assertion PROTO ((cpp_reader *, char *, U_CHAR *));
static void path_include PROTO ((cpp_reader *, char *));
static void initialize_builtins PROTO ((cpp_reader *));
-static void initialize_char_syntax PROTO ((struct cpp_options *));
+static void initialize_char_syntax PROTO ((void));
#if 0
static void trigraph_pcp ();
#endif
/* table to tell if c is horizontal or vertical space. */
U_CHAR is_space[256] = { 0 };
-/* Initialize syntactic classifications of characters. */
-
+/* Initialize syntactic classifications of characters. */
static void
-initialize_char_syntax (opts)
- struct cpp_options *opts;
+initialize_char_syntax ()
{
register int i;
* faster than saying (is_alpha (c) || c == '_'), etc.
* Set up these things before calling any routines tthat
* refer to them.
+ * XXX We should setlocale(LC_CTYPE, "C") here for safety.
*/
- for (i = 'a'; i <= 'z'; i++) {
- is_idchar[i - 'a' + 'A'] = 1;
- is_idchar[i] = 1;
- is_idstart[i - 'a' + 'A'] = 1;
- is_idstart[i] = 1;
- }
- for (i = '0'; i <= '9'; i++)
- is_idchar[i] = 1;
- is_idchar['_'] = 1;
+ for (i = 0; i < 256; i++)
+ {
+ is_idchar[i] = ISALNUM (i);
+ is_idstart[i] = ISALPHA (i);
+ }
+
+ is_idchar['_'] = 1;
is_idstart['_'] = 1;
- is_idchar['$'] = opts->dollars_in_ident;
- is_idstart['$'] = opts->dollars_in_ident;
+
+ /* These will be reset later if -$ is in effect. */
+ is_idchar['$'] = 1;
+ is_idstart['$'] = 1;
/* horizontal space table */
is_hor_space[' '] = 1;
opts->in_fname = NULL;
opts->out_fname = NULL;
- /* Initialize is_idchar to allow $. */
opts->dollars_in_ident = 1;
- initialize_char_syntax (opts);
+ initialize_char_syntax ();
opts->no_line_commands = 0;
opts->no_trigraphs = 1;
variable specifies other defaults. */
struct default_include *include_defaults = include_defaults_array;
+ /* Now that we know dollars_in_ident for real,
+ reset is_idchar/is_idstart. */
+ is_idchar['$'] = opts->dollars_in_ident;
+ is_idstart['$'] = opts->dollars_in_ident;
+
/* Add dirs from CPATH after dirs from -I. */
/* There seems to be confusion about what CPATH should do,
so for the moment it is not documented. */
if (p != 0 && ! opts->no_standard_includes)
path_include (pfile, p);
- /* Now that dollars_in_ident is known, initialize is_idchar. */
- initialize_char_syntax (opts);
-
/* Do partial setup of input buffer for the sake of generating
early #line directives (when -g is in effect). */
fp = cpp_push_buffer (pfile, NULL, 0);
Applying cpp_get_token repeatedly yields a stream of pre-processor
tokens. Usually, there is only one cpp_reader object active. */
-struct cpp_reader {
+struct cpp_reader
+{
parse_underflow_t get_token;
cpp_buffer *buffer;
- cpp_buffer buffer_stack[CPP_STACK_MAX];
-
- int errors; /* Error counter for exit code */
- void *data;
+ cpp_options *opts;
/* A buffer used for both for cpp_get_token's output, and also internally. */
unsigned char *token_buffer;
/* End of the written part of token_buffer. */
unsigned char *limit;
+ /* Error counter for exit code */
+ int errors;
+
/* Line where a newline was first seen in a string constant. */
int multiline_string_line;
#ifdef __cplusplus
~cpp_reader () { cpp_cleanup (this); }
#endif
+
+ cpp_buffer buffer_stack[CPP_STACK_MAX];
};
#define CPP_FATAL_LIMIT 1000
#define CPP_ADJUST_WRITTEN(PFILE,DELTA) ((PFILE)->limit += (DELTA))
#define CPP_SET_WRITTEN(PFILE,N) ((PFILE)->limit = (PFILE)->token_buffer + (N))
-#define CPP_OPTIONS(PFILE) ((cpp_options *) (PFILE)->data)
+#define CPP_OPTIONS(PFILE) ((PFILE)->opts)
#define CPP_BUFFER(PFILE) ((PFILE)->buffer)
#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)+1)
/* The bottom of the buffer stack. */
#define CPP_NULL_BUFFER(PFILE) (&(PFILE)->buffer_stack[CPP_STACK_MAX])
-/* Pointed to by cpp_reader::data. */
+/* Pointed to by cpp_reader.opts. */
struct cpp_options {
char *in_fname;
progname = p;
cpp_reader_init (&parse_in);
- parse_in.data = opts;
+ parse_in.opts = opts;
cpp_options_init (opts);
obstack_init (&scan_file_obstack);
cpp_reader_init (&scan_in);
- scan_in.data = &scan_options;
+ scan_in.opts = &scan_options;
cpp_options_init (&scan_options);
i = cpp_handle_options (&scan_in, argc, argv);
if (i < argc && ! CPP_FATAL_ERRORS (&scan_in))
if (! cpp_initialized)
{
cpp_reader_init (&parse_in);
- parse_in.data = &parse_options;
+ parse_in.opts = &parse_options;
cpp_options_init (&parse_options);
cpp_initialized = 1;
}