From 02365c20643dc9daf97ff00deb9487d973d96ec3 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 13 Nov 2013 09:09:45 +0000 Subject: [PATCH] * newlib/libc/include/getopt.h (struct option): name field should be "const char *". * newlib/libc/stdlib/getopt.c (getopt_internal): Use fputs()/fputc() instead of fprintf() to save code space. Fix signed/unsigned comparison. --- newlib/ChangeLog | 8 ++++++++ newlib/libc/include/getopt.h | 2 +- newlib/libc/stdlib/getopt.c | 36 ++++++++++++++++++++++-------------- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 65d473467..f0e82c6d6 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,11 @@ +2013-11-13 Freddie Chopin + + * newlib/libc/include/getopt.h (struct option): name field should be + "const char *". + * newlib/libc/stdlib/getopt.c (getopt_internal): Use fputs()/fputc() + instead of fprintf() to save code space. Fix signed/unsigned + comparison. + 2013-11-12 Sebastian Huber * libc/libc/stdlib/getopt.c (getopt_internal): Fix NULL pointer access. diff --git a/newlib/libc/include/getopt.h b/newlib/libc/include/getopt.h index ba8da4a7f..e12d253d4 100644 --- a/newlib/libc/include/getopt.h +++ b/newlib/libc/include/getopt.h @@ -104,7 +104,7 @@ extern "C" /* types defined by this include file */ struct option { - char *name; /* the name of the long option */ + const char *name; /* the name of the long option */ int has_arg; /* one of the above macros */ int *flag; /* determines if getopt_long() returns a * value for a long option; if it is diff --git a/newlib/libc/stdlib/getopt.c b/newlib/libc/stdlib/getopt.c index 2a4e7d4a2..2ab53aa6d 100644 --- a/newlib/libc/stdlib/getopt.c +++ b/newlib/libc/stdlib/getopt.c @@ -177,7 +177,9 @@ write_globals (struct getopt_data *data) optwhere = data->optwhere; } -/* getopt_internal: the function that does all the dirty work */ +/* getopt_internal: the function that does all the dirty work + NOTE: to reduce the code and RAM footprint this function uses + fputs()/fputc() to do output to stderr instead of fprintf(). */ static int getopt_internal (int argc, char *const argv[], const char *shortopts, const struct option *longopts, int *longind, int only, @@ -301,7 +303,7 @@ getopt_internal (int argc, char *const argv[], const char *shortopts, match_chars) == 0) { /* do we have an exact match? */ - if (match_chars == (int) (strlen (longopts[optindex].name))) + if (match_chars == strlen (longopts[optindex].name)) { longopt_match = optindex; break; @@ -315,12 +317,14 @@ getopt_internal (int argc, char *const argv[], const char *shortopts, { /* we have ambiguous options */ if (data->opterr) - fprintf (stderr, "%s: option `%s' is ambiguous " - "(could be `--%s' or `--%s')\n", - argv[0], - argv[data->optind], - longopts[longopt_match].name, - longopts[optindex].name); + fputs (argv[0], stderr); + fputs (": option `", stderr); + fputs (argv[data->optind], stderr); + fputs ("' is ambiguous (could be `--", stderr); + fputs (longopts[longopt_match].name, stderr); + fputs ("' or `--", stderr); + fputs (longopts[optindex].name, stderr); + fputs ("')\n", stderr); return (data->optopt = '?'); } } @@ -338,9 +342,10 @@ getopt_internal (int argc, char *const argv[], const char *shortopts, { /* couldn't find option in shortopts */ if (data->opterr) - fprintf (stderr, - "%s: invalid option -- `-%c'\n", - argv[0], argv[data->optind][data->optwhere]); + fputs (argv[0], stderr); + fputs (": invalid option -- `-", stderr); + fputc (argv[data->optind][data->optwhere], stderr); + fputs ("'\n", stderr); data->optwhere++; if (argv[data->optind][data->optwhere] == '\0') { @@ -377,17 +382,20 @@ getopt_internal (int argc, char *const argv[], const char *shortopts, { if (data->opterr) { - fprintf (stderr, "%s: argument required for option `", argv[0]); + fputs (argv[0], stderr); + fputs (": argument required for option `-", stderr); if (longopt_match >= 0) { - fprintf (stderr, "--%s'\n", longopts[longopt_match].name); + fputc ('-', stderr); + fputs (longopts[longopt_match].name, stderr); data->optopt = initial_colon ? ':' : '\?'; } else { - fprintf (stderr, "-%c'\n", *cp); + fputc (*cp, stderr); data->optopt = *cp; } + fputs ("'\n", stderr); } data->optind++; return initial_colon ? ':' : '\?'; -- 2.43.5