From dc17f155ff8ea25735376e7a7b0098f9e48984b5 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 27 Jun 2003 08:10:57 +0000 Subject: Cope with NUL seperated directives. Fix reporting of unparseable directives. --- ld/ChangeLog | 6 ++++++ ld/deffilep.y | 33 ++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 9 deletions(-) (limited to 'ld') diff --git a/ld/ChangeLog b/ld/ChangeLog index 37a9e49e724..1d6ed6714a0 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2003-06-27 Nick Clifton + + * deffilep.y (def_file_add_directive): Cope with NUL seperated + directives. Fix reporting of unparseable directives. + (def_error): Check for a NULL def_filename. + 2003-06-27 Alan Modra * emultempl/aix.em: Convert to C90, remove unnecessary prototypes diff --git a/ld/deffilep.y b/ld/deffilep.y index 45b1bda6f43..fba1c2e6fbc 100644 --- a/ld/deffilep.y +++ b/ld/deffilep.y @@ -601,18 +601,26 @@ def_file_add_directive (my_def, param, len) { def_file *save_def = def; const char *pend = param + len; - const char *tend = param; + char * tend = (char *) param; int i; def = my_def; while (param < pend) { - while (param < pend && ISSPACE (*param)) + while (param < pend && (ISSPACE (*param) || * param == '\n' || * param == 0)) param++; - for (tend = param + 1; - tend < pend && !(ISSPACE (tend[-1]) && *tend == '-'); + if (param == pend) + break; + + /* Scan forward until we encounter any of: + - the end of the buffer + - the start of a new option + - a newline seperating options + - a NUL seperating options. */ + for (tend = (char *) (param + 1); + tend < pend && !(ISSPACE (tend[-1]) && *tend == '-') && (*tend != '\n') && (*tend != 0); tend++) ; @@ -628,15 +636,22 @@ def_file_add_directive (my_def, param, len) lex_parse_string = param + len + 1; lex_forced_token = diropts[i].token; saw_newline = 0; - def_parse (); + if (def_parse ()) + continue; break; } } if (!diropts[i].param) - /* xgettext:c-format */ - einfo (_("Warning: .drectve `%.*s' unrecognized\n"), - tend - param, param); + { + char saved; + + saved = * tend; + * tend = 0; + /* xgettext:c-format */ + einfo (_("Warning: .drectve `%s' unrecognized\n"), param); + * tend = saved; + } lex_parse_string = 0; param = tend; @@ -843,7 +858,7 @@ static int def_error (err) const char *err; { - einfo ("%P: %s:%d: %s\n", def_filename, linenumber, err); + einfo ("%P: %s:%d: %s\n", def_filename ? def_filename : "", linenumber, err); return 0; } -- cgit v1.2.1