Skip to content

Commit

Permalink
locale.c: Reorder cases in a switch
Browse files Browse the repository at this point in the history
This moves handling the CODESET to the end, as future commits will make
its handling more complicated.  The cases are now ordered so the
simplest (based on the direction of future commits) are first
  • Loading branch information
khwilliamson committed May 6, 2021
1 parent ac629e8 commit 73347a6
Showing 1 changed file with 61 additions and 60 deletions.
121 changes: 61 additions & 60 deletions locale.c
Expand Up @@ -2943,66 +2943,6 @@ S_my_nl_langinfo(const int item, bool toggle)
case NOEXPR: return "^[-0nN]";
case NOSTR: return "no";

case CODESET:

# ifndef WIN32

/* On non-windows, this is unimplemented, in part because of
* inconsistencies between vendors. The Darwin native
* nl_langinfo() implementation simply looks at everything past
* any dot in the name, but that doesn't work for other
* vendors. Many Linux locales that don't have UTF-8 in their
* names really are UTF-8, for example; z/OS locales that do
* have UTF-8 in their names, aren't really UTF-8 */
return "";

# else

{ /* But on Windows, the name does seem to be consistent, so
use that. */
const char * p;
const char * first;
Size_t offset = 0;
const char * name = querylocale_c(LC_CTYPE);

if (isNAME_C_OR_POSIX(name)) {
return "ANSI_X3.4-1968";
}

/* Find the dot in the locale name */
first = (const char *) strchr(name, '.');
if (! first) {
first = name;
goto has_nondigit;
}

/* Look at everything past the dot */
first++;
p = first;

while (*p) {
if (! isDIGIT(*p)) {
goto has_nondigit;
}

p++;
}

/* Here everything past the dot is a digit. Treat it as a
* code page */
retval = save_to_buffer("CP", &PL_langinfo_buf,
&PL_langinfo_bufsize, 0);
offset = STRLENs("CP");

has_nondigit:

retval = save_to_buffer(first, &PL_langinfo_buf,
&PL_langinfo_bufsize, offset);
}

break;

# endif
# ifdef HAS_LOCALECONV

case CRNCYSTR:
Expand Down Expand Up @@ -3438,6 +3378,67 @@ S_my_nl_langinfo(const int item, bool toggle)

break;

# endif

case CODESET:

# ifndef WIN32

/* On non-windows, this is unimplemented, in part because of
* inconsistencies between vendors. The Darwin native
* nl_langinfo() implementation simply looks at everything past
* any dot in the name, but that doesn't work for other
* vendors. Many Linux locales that don't have UTF-8 in their
* names really are UTF-8, for example; z/OS locales that do
* have UTF-8 in their names, aren't really UTF-8 */
return "";

# else

{ /* But on Windows, the name does seem to be consistent, so
use that. */
const char * p;
const char * first;
Size_t offset = 0;
const char * name = querylocale_c(LC_CTYPE);

if (isNAME_C_OR_POSIX(name)) {
return "ANSI_X3.4-1968";
}

/* Find the dot in the locale name */
first = (const char *) strchr(name, '.');
if (! first) {
first = name;
goto has_nondigit;
}

/* Look at everything past the dot */
first++;
p = first;

while (*p) {
if (! isDIGIT(*p)) {
goto has_nondigit;
}

p++;
}

/* Here everything past the dot is a digit. Treat it as a
* code page */
retval = save_to_buffer("CP", &PL_langinfo_buf,
&PL_langinfo_bufsize, 0);
offset = STRLENs("CP");

has_nondigit:

retval = save_to_buffer(first, &PL_langinfo_buf,
&PL_langinfo_bufsize, offset);
}

break;

# endif

}
Expand Down

0 comments on commit 73347a6

Please sign in to comment.