Преглед на файлове

libc/misc/locale/locale.c: remove one unneeded static data,
rewrite one exceptionally unreadable loop. Heed a few warnings
(wrong type for string op params)

text data bss dec hex filename
- 1164 16 0 1180 49c libc/misc/locale/newlocale.os
+ 1180 0 0 1180 49c libc/misc/locale/newlocale.os
- 494480 2751 15684 512915 7d393 lib/libuClibc-0.9.30-svn.so
+ 494472 2735 15684 512891 7d37b lib/libuClibc-0.9.30-svn.so

Denis Vlasenko преди 15 години
родител
ревизия
0e674ab3af
променени са 2 файла, в които са добавени 21 реда и са изтрити 13 реда
  1. 2 2
      extra/locale/locale_mmap.h
  2. 19 11
      libc/misc/locale/locale.c

+ 2 - 2
extra/locale/locale_mmap.h

@@ -35,7 +35,7 @@ typedef struct {
 
 #ifdef __CTYPE_HAS_8_BIT_LOCALES
 	const unsigned char tbl8ctype[__LOCALE_DATA_Cctype_TBL_LEN];
-    const unsigned char tbl8uplow[__LOCALE_DATA_Cuplow_TBL_LEN];
+	const unsigned char tbl8uplow[__LOCALE_DATA_Cuplow_TBL_LEN];
 #ifdef __WCHAR_ENABLED
 	const uint16_t tbl8c2wc[__LOCALE_DATA_Cc2wc_TBL_LEN]; /* char > 0x7f to wide char */
 	const unsigned char tbl8wc2c[__LOCALE_DATA_Cwc2c_TBL_LEN];
@@ -72,7 +72,7 @@ typedef struct {
 	const uint16_t collate_data[__lc_collate_data_LEN];
 
 	unsigned char lc_common_item_offsets_LEN[__LOCALE_DATA_CATEGORIES];
-    size_t lc_common_tbl_offsets[__LOCALE_DATA_CATEGORIES * 4];
+	size_t lc_common_tbl_offsets[__LOCALE_DATA_CATEGORIES * 4];
 	/* offsets from start of locale_mmap_t */
 	/* rows, item_offsets, item_idx, data */
 

+ 19 - 11
libc/misc/locale/locale.c

@@ -230,7 +230,8 @@ static void update_hr_locale(const unsigned char *spec)
 					+ __LOCALE_DATA_WIDTH_LOCALES * ((((int)(*s & 0x7f)) << 7)
 													 + (s[1] & 0x7f));
 				if (category == LC_ALL) {
-					n = stpcpy(n, CATEGORY_NAMES + (int) CATEGORY_NAMES[i]);
+					/* CATEGORY_NAMES is unsigned char* */
+					n = stpcpy(n, (char*) CATEGORY_NAMES + (int) CATEGORY_NAMES[i]);
 					*n++ = '=';
 				}
 				if (*loc == 0) {
@@ -1217,7 +1218,8 @@ static unsigned char *composite_locale(int category_mask, const char *locale,
 	t = strtok_r(buf, "=", &e);	/* This can't fail because of strchr test above. */
 	do {
 		c = 0;
-		while (strcmp(CATEGORY_NAMES + (int) CATEGORY_NAMES[c], t)) {
+		/* CATEGORY_NAMES is unsigned char* */
+		while (strcmp((char*) CATEGORY_NAMES + (int) CATEGORY_NAMES[c], t)) {
 			if (++c == LC_ALL) { /* Unknown category name! */
 				return NULL;
 			}
@@ -1262,11 +1264,13 @@ __locale_t newlocale(int category_mask, const char *locale, __locale_t base)
 	strcpy((char *) new_selector,
 		   (base ? (char *) base->cur_locale : C_LOCALE_SELECTOR));
 
-	if (!*locale) {			 /* locale == "", so check environment. */
-#ifndef __UCLIBC_HAS_THREADS__
-		static				/* If no threads, then envstr can be static. */
-#endif /*  __UCLIBC_HAS_THREADS__ */
-			const char *envstr[4] = { "LC_ALL", NULL, "LANG", posix };
+	if (!locale[0]) {	/* locale == "", so check environment. */
+		const char *envstr[4];
+
+		envstr[0] = "LC_ALL";
+		envstr[1] = NULL;
+		envstr[2] = "LANG";
+		envstr[3] = posix;
 
 		i = 1;
 		k = 0;
@@ -1275,12 +1279,16 @@ __locale_t newlocale(int category_mask, const char *locale, __locale_t base)
 				/* Note: SUSv3 doesn't define a fallback mechanism here.
 				 * So, if LC_ALL is invalid, we do _not_ continue trying
 				 * the other environment vars. */
-				envstr[1] = CATEGORY_NAMES + CATEGORY_NAMES[k];
+				envstr[1] = (char*) CATEGORY_NAMES + CATEGORY_NAMES[k];
 				j = 0;
-				do {
+				while (1) {
 					p = envstr[j];
-				} while ((++j < 4) && (!(p = getenv(p)) || !*p));
-
+					if (++j >= 4)
+						break; /* now p == "POSIX" */
+					p = getenv(p);
+					if (p && p[0])
+						break;
+				};
 
 				/* The user set something... is it valid? */
 				/* Note: Since we don't support user-supplied locales and