@@ -132,7 +132,7 @@ static struct encoding const all_encodings[] = {
132132/*
133133 * Alias lookup function.
134134 * Defines
135- * struct alias { const char* name; unsigned int encoding_index; };
135+ * struct alias { int name; unsigned int encoding_index; };
136136 * const struct alias * aliases_lookup (const char *str, unsigned int len);
137137 * #define MAX_WORD_LENGTH ...
138138 */
@@ -144,30 +144,32 @@ static struct encoding const all_encodings[] = {
144144 * const struct alias * aliases2_lookup (const char *str);
145145 */
146146#if defined(USE_AIX ) || defined(USE_OSF1 ) || defined(USE_DOS ) || defined(USE_EXTRA ) /* || ... */
147- static struct alias sysdep_aliases [] = {
148- #ifdef USE_AIX
149- #include "aliases_aix.h"
150- #endif
151- #ifdef USE_OSF1
152- #include "aliases_osf1.h"
153- #endif
154- #ifdef USE_DOS
155- #include "aliases_dos.h"
156- #endif
157- #ifdef USE_EXTRA
158- #include "aliases_extra.h"
159- #endif
147+ struct stringpool2_t {
148+ #define S (tag ,name ,encoding_index ) char stringpool_##tag[sizeof(name)];
149+ #include "aliases2.h"
150+ #undef S
151+ };
152+ static const struct stringpool2_t stringpool2_contents = {
153+ #define S (tag ,name ,encoding_index ) name ,
154+ #include "aliases2.h"
155+ #undef S
156+ };
157+ #define stringpool2 ((const char *) &stringpool2_contents)
158+ static const struct alias sysdep_aliases [] = {
159+ #define S (tag ,name ,encoding_index ) { (int )(long )& ((struct stringpool2_t * )0 )-> stringpool_ ##tag , encoding_index },
160+ #include "aliases2.h"
161+ #undef S
160162};
161163#ifdef __GNUC__
162164__inline
163165#endif
164166const struct alias *
165167aliases2_lookup (register const char * str )
166168{
167- struct alias * ptr ;
169+ const struct alias * ptr ;
168170 unsigned int count ;
169171 for (ptr = sysdep_aliases , count = sizeof (sysdep_aliases )/sizeof (sysdep_aliases [0 ]); count > 0 ; ptr ++ , count -- )
170- if (!strcmp (str ,ptr -> name ))
172+ if (!strcmp (str , stringpool2 + ptr -> name ))
171173 return ptr ;
172174 return NULL ;
173175}
@@ -464,10 +466,13 @@ int iconvctl (iconv_t icd, int request, void* argument)
464466 }
465467}
466468
469+ /* An alias after its name has been converted from 'int' to 'const char*'. */
470+ struct nalias { const char * name ; unsigned int encoding_index ; };
471+
467472static int compare_by_index (const void * arg1 , const void * arg2 )
468473{
469- const struct alias * alias1 = (const struct alias * ) arg1 ;
470- const struct alias * alias2 = (const struct alias * ) arg2 ;
474+ const struct nalias * alias1 = (const struct nalias * ) arg1 ;
475+ const struct nalias * alias2 = (const struct nalias * ) arg2 ;
471476 return (int )alias1 -> encoding_index - (int )alias2 -> encoding_index ;
472477}
473478
@@ -496,7 +501,7 @@ void iconvlist (int (*do_one) (unsigned int namescount,
496501#define aliascount2 0
497502#endif
498503#define aliascount (aliascount1+aliascount2)
499- struct alias aliasbuf [aliascount ];
504+ struct nalias aliasbuf [aliascount ];
500505 const char * namesbuf [aliascount ];
501506 size_t num_aliases ;
502507 {
@@ -506,20 +511,26 @@ void iconvlist (int (*do_one) (unsigned int namescount,
506511 j = 0 ;
507512 for (i = 0 ; i < aliascount1 ; i ++ ) {
508513 const struct alias * p = & aliases [i ];
509- if (p -> name != NULL
514+ if (p -> name >= 0
510515 && p -> encoding_index != ei_local_char
511- && p -> encoding_index != ei_local_wchar_t )
512- aliasbuf [j ++ ] = * p ;
516+ && p -> encoding_index != ei_local_wchar_t ) {
517+ aliasbuf [j ].name = stringpool + p -> name ;
518+ aliasbuf [j ].encoding_index = p -> encoding_index ;
519+ j ++ ;
520+ }
513521 }
514522#ifndef aliases2_lookup
515- for (i = 0 ; i < aliascount2 ; i ++ )
516- aliasbuf [j ++ ] = sysdep_aliases [i ];
523+ for (i = 0 ; i < aliascount2 ; i ++ ) {
524+ aliasbuf [j ].name = stringpool2 + sysdep_aliases [i ].name ;
525+ aliasbuf [j ].encoding_index = sysdep_aliases [i ].encoding_index ;
526+ j ++ ;
527+ }
517528#endif
518529 num_aliases = j ;
519530 }
520531 /* Sort by encoding_index. */
521532 if (num_aliases > 1 )
522- qsort (aliasbuf , num_aliases , sizeof (struct alias ), compare_by_index );
533+ qsort (aliasbuf , num_aliases , sizeof (struct nalias ), compare_by_index );
523534 {
524535 /* Process all aliases with the same encoding_index together. */
525536 size_t j ;
0 commit comments