-2001-03-04 Laurynas Biveinis <lauras@softhome.net>\r
-\r
- * gcc.c (convert_filename): Append executable suffix\r
- if NO_AUTO_EXE_SUFFIX is not defined.\r
- * gcc.texi: Document NO_AUTO_EXE_SUFFIX.\r
- * config/i386/djgpp.h: Define NO_AUTO_EXE_SUFFIX.\r
+2001-03-04 Neil Booth <neil@daikokuya.demon.co.uk>
+
+ * cppfiles.c (_cpp_execute_include): Don't make a null-terminated
+ copy of the filename. Don't use CPP_PREV_BUFFER. Don't call
+ strlen or strcpy; we already know the length.
+ (_cpp_compare_file_date): Similarly.
+ * cpphash.h (struct cpp_reader): Delete done_initialising.
+ (CPP_PREV_BUFFER): Delete.
+ * cppinit.c (cpp_start_read): Don't set done_initialising.
+ * cpplex.c (parse_string): Guarantee null-termination.
+ (_cpp_equiv_toklists): Remove.
+ * cpplib.c (glue_header_name): Null-terminate.
+ (do_line): Don't leak memory.
+ * cpplib.h (BT_WEAK): Delete.
+ * cppmain.c (cb_ident): Strings are now null-terminated.
+
+2001-03-04 Laurynas Biveinis <lauras@softhome.net>
+
+ * gcc.c (convert_filename): Append executable suffix
+ if NO_AUTO_EXE_SUFFIX is not defined.
+ * gcc.texi: Document NO_AUTO_EXE_SUFFIX.
+ * config/i386/djgpp.h: Define NO_AUTO_EXE_SUFFIX.
2001-03-03 David O'Brien <obrien@FreeBSD.org>
int include_next;
{
struct search_path *search_start = 0;
- unsigned int len = header->val.str.len;
unsigned int angle_brackets = header->type == CPP_HEADER_NAME;
+ const char *fname = (const char *) header->val.str.text;
struct include_file *inc;
- char *fname;
int print_dep;
/* Help protect #include or similar from recursion. */
}
}
- fname = alloca (len + 1);
- memcpy (fname, header->val.str.text, len);
- fname[len] = '\0';
-
if (!search_start)
{
if (angle_brackets)
/* Handle -H option. */
if (CPP_OPTION (pfile, print_include_names))
{
- cpp_buffer *fp = CPP_BUFFER (pfile);
- while ((fp = CPP_PREV_BUFFER (fp)) != NULL)
+ cpp_buffer *fp = pfile->buffer;
+ while ((fp = fp->prev) != NULL)
putc ('.', stderr);
fprintf (stderr, " %s\n", inc->name);
}
/* FIXME: ptr can be null, no? */
len = ptr->len;
- p = (char *) alloca (len + strlen (fname) + 2);
+ p = (char *) alloca (len + header->val.str.len + 2);
if (len)
{
memcpy (p, ptr->name, len);
p[len++] = '/';
}
- strcpy (p + len, fname);
+ memcpy (p + len, fname, header->val.str.len + 1);
_cpp_simplify_pathname (p);
deps_add_dep (pfile->deps, p);
}
cpp_reader *pfile;
const cpp_token *f;
{
- unsigned int len = f->val.str.len;
- char *fname;
+ const char *fname = (const char *) f->val.str.text;
struct search_path *search_start;
struct include_file *inc;
else if (CPP_OPTION (pfile, ignore_srcdir))
search_start = pfile->buffer->search_from;
- fname = alloca (len + 1);
- memcpy (fname, f->val.str.text, len);
- fname[len] = '\0';
inc = find_include_file (pfile, fname, search_start);
if (!inc)
/* We're printed a warning recommending against using #import. */
unsigned char import_warning;
- /* True after cpp_start_read completes. Used to inhibit some
- warnings while parsing the command line. */
- unsigned char done_initializing;
-
/* True if we are skipping a failed conditional group. */
unsigned char skipping;
/* Macros. */
-#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->prev)
#define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps)
#define CPP_IN_SYSTEM_HEADER(PFILE) \
(CPP_BUFFER (PFILE) && CPP_BUFFER (PFILE)->sysp)
p = q;
}
- pfile->done_initializing = 1;
-
/* The -imacros files can be scanned now, but the -include files
have to be pushed onto the buffer stack and processed later,
otherwise cppmain.c won't see the tokens. include_head was built
}
/* Parses a string, character constant, or angle-bracketed header file
- name. Handles embedded trigraphs and escaped newlines.
+ name. Handles embedded trigraphs and escaped newlines. The stored
+ string is guaranteed NUL-terminated, but it is not guaranteed that
+ this is the first NUL since embedded NULs are preserved.
- Multi-line strings are allowed, but they are deprecated within
- directives. */
+ Multi-line strings are allowed, but they are deprecated. */
static void
parse_string (pfile, token, terminator)
cpp_reader *pfile;
for (;;)
{
if (buffer->cur == buffer->rlimit)
+ c = EOF;
+ else
+ c = *buffer->cur++;
+
+ have_char:
+ /* We need space for the terminating NUL. */
+ if (dest >= limit)
+ limit = _cpp_next_chunk (pool, 0, &dest);
+
+ if (c == EOF)
{
- c = EOF;
unterminated (pfile, terminator);
break;
}
- c = *buffer->cur++;
- have_char:
/* Handle trigraphs, escaped newlines etc. */
if (c == '?' || c == '\\')
c = skip_escaped_newlines (buffer, c);
if (pfile->mlstring_pos.line == 0)
pfile->mlstring_pos = pfile->lexer_pos;
- handle_newline (buffer, c); /* Stores to read_ahead. */
- c = '\n';
+ c = handle_newline (buffer, c);
+ *dest++ = '\n';
+ goto have_char;
}
else if (c == '\0')
{
cpp_warning (pfile, "null character(s) preserved in literal");
}
- /* No terminating null for strings - they could contain nulls. */
- if (dest >= limit)
- limit = _cpp_next_chunk (pool, 0, &dest);
*dest++ = c;
-
- /* If we had a new line, the next character is in read_ahead. */
- if (c != '\n')
- continue;
- c = buffer->read_ahead;
- if (c != EOF)
- goto have_char;
}
/* Remember the next character. */
buffer->read_ahead = c;
+ *dest = '\0';
token->val.str.text = POOL_FRONT (pool);
token->val.str.len = dest - token->val.str.text;
- POOL_COMMIT (pool, token->val.str.len);
+ POOL_COMMIT (pool, token->val.str.len + 1);
}
/* The stored comment includes the comment start and any terminator. */
return 0;
}
-#if 0
-/* Compare two token lists. */
-int
-_cpp_equiv_toklists (a, b)
- const struct toklist *a, *b;
-{
- unsigned int i, count;
-
- count = a->limit - a->first;
- if (count != (b->limit - b->first))
- return 0;
-
- for (i = 0; i < count; i++)
- if (! _cpp_equiv_tokens (&a->first[i], &b->first[i]))
- return 0;
-
- return 1;
-}
-#endif
-
/* Determine whether two tokens can be pasted together, and if so,
what the resulting token is. Returns CPP_EOF if the tokens cannot
be pasted, or the appropriate type for the merged token if they
cpp_error (pfile, "missing terminating > character");
else
{
- token_mem = _cpp_pool_alloc (&pfile->ident_pool, total_len);
+ token_mem = _cpp_pool_alloc (&pfile->ident_pool, total_len + 1);
memcpy (token_mem, buffer, total_len);
+ token_mem[total_len] = '\0';
header->type = CPP_HEADER_NAME;
header->flags &= ~PREV_WHITE;
if (token.type == CPP_STRING)
{
char *fname;
- unsigned int len;
+ unsigned int len = token.val.str.len + 1;
- /* FIXME: memory leak. */
- len = token.val.str.len;
- fname = xmalloc (len + 1);
+ fname = (char *) _cpp_pool_alloc (&pfile->ident_pool, len);
memcpy (fname, token.val.str.text, len);
- fname[len] = '\0';
-
_cpp_simplify_pathname (fname);
/* Only accept flags for the # 55 form. */
BT_BASE_FILE, /* `__BASE_FILE__' */
BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
BT_TIME, /* `__TIME__' */
- BT_STDC, /* `__STDC__' */
- BT_WEAK /* Whether or not G++ supports weak
- symbols. */
+ BT_STDC /* `__STDC__' */
};
/* There is a slot in the hashnode for use by front ends when integrated
const cpp_string * str;
{
maybe_print_line (cpp_get_line (pfile)->output_line);
- fprintf (print.outf, "#ident \"%.*s\"\n", (int) str->len, str->text);
+ fprintf (print.outf, "#ident \"%s\"\n", str->text);
print.lineno++;
}