diff options
author | Jim Meyering <jim@meyering.net> | 1997-10-14 13:07:12 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 1997-10-14 13:07:12 +0000 |
commit | 7fff797d97d0ddc8bd240f54302b4be370385e3e (patch) | |
tree | 191a306bab1d308bbb7d06d4ff3b184da4091a1c /src | |
parent | 42a2bc284610268916cd8040e17a7a1d9f7c8d81 (diff) | |
download | coreutils-7fff797d97d0ddc8bd240f54302b4be370385e3e.tar.xz |
Declare xstrdup.
(my_setlocale): New function.
(main): Guard against failure of strdup (use xstrdup) and setlocale.
Diffstat (limited to 'src')
-rw-r--r-- | src/sort.c | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/src/sort.c b/src/sort.c index a621ff2ee..e734928a2 100644 --- a/src/sort.c +++ b/src/sort.c @@ -38,6 +38,7 @@ #include "error.h" #include "xstrtod.h" +#undef ENABLE_NLS #ifdef ENABLE_NLS /* FIXME: this may need some heading.... applies to Debian linux for reading the structure of _NL_ITEM... to get abreviated month names */ @@ -57,6 +58,8 @@ char *realloc (); void free (); #endif +char *xstrdup (); + /* Undefine, to avoid warning about redefinition on some systems. */ #undef min #define min(a, b) ((a) < (b) ? (a) : (b)) @@ -2379,11 +2382,23 @@ key_init (struct keyfield *key) key->eword = -1; } +/* strdup and return the result of setlocale, but guard against a NULL + return value. If setlocale returns NULL, strdup FAIL_VAL instead. */ + +static inline char * +my_setlocale (const char *locale, const char *fail_val) +{ + char *s = setlocale (LC_ALL, locale); + if (s == NULL) + s = (char *) fail_val; + return xstrdup (s); +} + int main (int argc, char **argv) { struct keyfield *key = NULL, gkey; - char *s, *c_locale_string, *posix_locale_string; + char *s; int i, t, t2; int checkonly = 0, mergeonly = 0, nfiles = 0; char *minus = "-", *outfile = minus, **files, *tmp; @@ -2396,18 +2411,24 @@ main (int argc, char **argv) #ifdef ENABLE_NLS - /* Drepper pointed out that not all systems return a sane - string with setlocale() call. So we need to know what this - system identifies as "C" and "POSIX" locales. */ - c_locale_string = strdup(setlocale(LC_ALL, "C")); - posix_locale_string = strdup(setlocale(LC_ALL, "POSIX")); - s = setlocale(LC_ALL, ""); - if (strcmp(s, c_locale_string) && strcmp(s, posix_locale_string)) - need_locale = 1; /* Neither C nor POSIX, we need to initialize it */ - - /* These two have served their purpose, clean up */ - free(c_locale_string); - free(posix_locale_string); + /* Determine whether the current locale is C or POSIX. */ + { + char *c_locale_string = my_setlocale ("C", ""); + char *posix_locale_string = my_setlocale ("POSIX", ""); + char *current_locale_string = my_setlocale ("", "FAILED"); + + if (!STREQ (current_locale_string, c_locale_string) + && !STREQ (current_locale_string, posix_locale_string)) + { + /* The current locale is neither C nor POSIX. + We'll need to do more work. */ + need_locale = 1; + } + + free (c_locale_string); + free (posix_locale_string); + free (current_locale_string); + } /* Let's get locale's representation of the decimal point */ decimal_point = *( localeconv() )->decimal_point; |