| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 | #include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <stdint.h>#include <stddef.h>#ifndef __WCHAR_ENABLED#warning WHOA!!! __WCHAR_ENABLED is not defined! defining it now...#define __WCHAR_ENABLED#endif#define WANT_DATA#include "c8tables.h"#ifndef __CTYPE_HAS_8_BIT_LOCALES#warning __CTYPE_HAS_8_BIT_LOCALES is not defined.../* #define __CTYPE_HAS_8_BIT_LOCALES */#endif/*  #define __LOCALE_DATA_Cctype_TBL_LEN 328 *//*  #define __LOCALE_DATA_Cuplow_TBL_LEN 400 *//*  #define __LOCALE_DATA_Cc2wc_TBL_LEN 1448 *//*  #define __LOCALE_DATA_Cwc2c_TBL_LEN 3744 */#define WANT_WCctype_data#define WANT_WCuplow_data#define WANT_WCuplow_diff_data/* #define WANT_WCcomb_data *//*  #define WANT_WCwidth_data */#include "wctables.h"#undef WANT_WCctype_data#undef WANT_WCuplow_data#undef WANT_WCuplow_diff_data/* #undef WANT_WCcomb_data *//*  #undef WANT_WCwidth_data */ #define __LOCALE_DATA_WCctype_TBL_LEN		(__LOCALE_DATA_WCctype_II_LEN + __LOCALE_DATA_WCctype_TI_LEN + __LOCALE_DATA_WCctype_UT_LEN) #define __LOCALE_DATA_WCuplow_TBL_LEN		(__LOCALE_DATA_WCuplow_II_LEN + __LOCALE_DATA_WCuplow_TI_LEN + __LOCALE_DATA_WCuplow_UT_LEN) #define __LOCALE_DATA_WCuplow_diff_TBL_LEN (2 * __LOCALE_DATA_WCuplow_diffs)/*  #define WCcomb_TBL_LEN		(WCcomb_II_LEN + WCcomb_TI_LEN + WCcomb_UT_LEN) */#include "locale_collate.h"#include "locale_tables.h"#include "locale_mmap.h"/*  #undef __PASTE2 *//*  #define __PASTE2(A,B)		A ## B *//*  #undef __PASTE3 *//*  #define __PASTE3(A,B,C)		A ## B ## C *//*  #define __LOCALE_DATA_MAGIC_SIZE 64 *//*  #define COMMON_MMAP(X) \ *//*  	unsigned char	__PASTE3(lc_,X,_data)[__PASTE3(__lc_,X,_data_LEN)]; *//*  #define COMMON_MMIDX(X) \ *//*  	unsigned char	__PASTE3(lc_,X,_rows)[__PASTE3(__lc_,X,_rows_LEN)]; \ *//*  	uint16_t		__PASTE3(lc_,X,_item_offsets)[__PASTE3(__lc_,X,_item_offsets_LEN)]; \ *//*  	uint16_t		__PASTE3(lc_,X,_item_idx)[__PASTE3(__lc_,X,_item_idx_LEN)]; \ *//* ---------------------------------------------------------------------- */#define COMMON_OFFSETS(X) \	offsetof(__locale_mmap_t, __PASTE3(lc_,X,_rows)), \	offsetof(__locale_mmap_t, __PASTE3(lc_,X,_item_offsets)), \	offsetof(__locale_mmap_t, __PASTE3(lc_,X,_item_idx)), \	offsetof(__locale_mmap_t, __PASTE3(lc_,X,_data)) \static const size_t common_tbl_offsets[__LOCALE_DATA_CATEGORIES*4] = {	COMMON_OFFSETS(ctype),	COMMON_OFFSETS(numeric),	COMMON_OFFSETS(monetary),	COMMON_OFFSETS(time),	0, 0, 0, 0,					/* collate */	COMMON_OFFSETS(messages),};void out_uc(FILE *f, const unsigned char *p, size_t n, char *comment){	size_t i;	fprintf(f, "{\t/* %s */", comment);	for (i = 0 ; i < n ; i++) {		if (!(i & 7)) {			fprintf(f, "\n\t");		}		if (p[i]) {			fprintf(f, "%#04x, ", p[i]);		} else {			fprintf(f, "%#4x, ", p[i]);		}	}	fprintf(f, "\n},\n");}void out_u16(FILE *f, const uint16_t *p, size_t n, char *comment){	size_t i;	fprintf(f, "{\t/* %s */", comment);	for (i = 0 ; i < n ; i++) {		if (!(i & 7)) {			fprintf(f, "\n\t");		}		if (p[i]) {			fprintf(f, "%#06x, ", p[i]);		} else {			fprintf(f, "%#6x, ", p[i]);		}	}	fprintf(f, "\n},\n");}void out_i16(FILE *f, const int16_t *p, size_t n, char *comment){	size_t i;	fprintf(f, "{\t/* %s */", comment);	for (i = 0 ; i < n ; i++) {		if (!(i & 7)) {			fprintf(f, "\n\t");		}		fprintf(f, "%6d, ", p[i]);	}	fprintf(f, "\n},\n");}void out_size_t(FILE *f, const size_t *p, size_t n, char *comment){	size_t i;	fprintf(f, "{\t/* %s */", comment);	for (i = 0 ; i < n ; i++) {		if (!(i & 3)) {			fprintf(f, "\n\t");		}		if (p[i]) {			fprintf(f, "%#010zx, ", p[i]);		} else {			fprintf(f, "%#10zx, ", p[i]);		}	}	fprintf(f, "\n},\n");}int main(void){	FILE *lso;					/* static object */	int i;#ifdef __LOCALE_DATA_MAGIC_SIZE	unsigned char magic[__LOCALE_DATA_MAGIC_SIZE];	memset(magic, 0, __LOCALE_DATA_MAGIC_SIZE);#endif /* __LOCALE_DATA_MAGIC_SIZE */	if (!(lso = fopen("locale_data.c", "w"))) {		printf("can't open locale_data.c!\n");		return EXIT_FAILURE;	}	fprintf(lso,			"#include <stddef.h>\n"			"#include <stdint.h>\n"/* 			"#define __CTYPE_HAS_8_BIT_LOCALES\n" */			"#ifndef __WCHAR_ENABLED\n"			"#error __WCHAR_ENABLED not defined\n"			"#endif\n"			"#include \"c8tables.h\"\n"			"#include \"wctables.h\"\n"			"#include \"lt_defines.h\"\n"			"#include \"locale_mmap.h\"\n\n"			"static const __locale_mmap_t locale_mmap = {\n\n"			);#ifdef __LOCALE_DATA_MAGIC_SIZE	out_uc(lso, magic, __LOCALE_DATA_MAGIC_SIZE, "magic");#endif /* __LOCALE_DATA_MAGIC_SIZE */#ifdef __CTYPE_HAS_8_BIT_LOCALES	out_uc(lso, __LOCALE_DATA_Cctype_data, __LOCALE_DATA_Cctype_TBL_LEN, "tbl8ctype");	out_uc(lso, __LOCALE_DATA_Cuplow_data, __LOCALE_DATA_Cuplow_TBL_LEN, "tbl8uplow");#ifdef __WCHAR_ENABLED	out_u16(lso, __LOCALE_DATA_Cc2wc_data, __LOCALE_DATA_Cc2wc_TBL_LEN, "tbl8c2wc");	out_uc(lso, __LOCALE_DATA_Cwc2c_data, __LOCALE_DATA_Cwc2c_TBL_LEN, "tbl8wc2c");	/* translit  */#endif /* __WCHAR_ENABLED */#endif /* __CTYPE_HAS_8_BIT_LOCALES */#ifdef __WCHAR_ENABLED	out_uc(lso, __LOCALE_DATA_WCctype_data, __LOCALE_DATA_WCctype_TBL_LEN, "tblwctype");	out_uc(lso, __LOCALE_DATA_WCuplow_data, __LOCALE_DATA_WCuplow_TBL_LEN, "tblwuplow");	out_i16(lso, __LOCALE_DATA_WCuplow_diff_data, __LOCALE_DATA_WCuplow_diff_TBL_LEN, "tblwuplow_diff");/* 	const unsigned char tblwcomb[WCcomb_TBL_LEN]; */	/* width?? */#endif /* __WCHAR_ENABLED */	out_uc(lso, __lc_ctype_data, __lc_ctype_data_LEN, "lc_ctype_data");	out_uc(lso, __lc_numeric_data, __lc_numeric_data_LEN, "lc_numeric_data");	out_uc(lso, __lc_monetary_data, __lc_monetary_data_LEN, "lc_monetary_data");	out_uc(lso, __lc_time_data, __lc_time_data_LEN, "lc_time_data");	/* TODO -- collate*/	out_uc(lso, __lc_messages_data, __lc_messages_data_LEN, "lc_messages_data");#ifdef __CTYPE_HAS_8_BIT_LOCALES	fprintf(lso, "{ /* codeset_8_bit array */\n");	for (i = 0 ; i < __LOCALE_DATA_NUM_CODESETS ; i++) {		fprintf(lso, "{ /* codeset_8_bit[%d] */\n", i);		out_uc(lso, codeset_8_bit[i].idx8ctype, __LOCALE_DATA_Cctype_IDX_LEN, "idx8ctype");		out_uc(lso, codeset_8_bit[i].idx8uplow, __LOCALE_DATA_Cuplow_IDX_LEN, "idx8uplow");		out_uc(lso, codeset_8_bit[i].idx8c2wc, __LOCALE_DATA_Cc2wc_IDX_LEN, "idx8c2wc");		out_uc(lso, codeset_8_bit[i].idx8wc2c, __LOCALE_DATA_Cwc2c_II_LEN, "idx8wc2c");		fprintf(lso, "},\n");	}	fprintf(lso, "},\n");#endif /* __CTYPE_HAS_8_BIT_LOCALES */	out_uc(lso, __lc_ctype_rows, __lc_ctype_rows_LEN, "lc_ctype_rows");	out_u16(lso, __lc_ctype_item_offsets, __lc_ctype_item_offsets_LEN, "lc_ctype_item_offsets");	out_u16(lso, __lc_ctype_item_idx, __lc_ctype_item_idx_LEN, "lc_ctype_item_idx");	out_uc(lso, __lc_numeric_rows, __lc_numeric_rows_LEN, "lc_numeric_rows");	out_u16(lso, __lc_numeric_item_offsets, __lc_numeric_item_offsets_LEN, "lc_numeric_item_offsets");	out_u16(lso, __lc_numeric_item_idx, __lc_numeric_item_idx_LEN, "lc_numeric_item_idx");	out_uc(lso, __lc_monetary_rows, __lc_monetary_rows_LEN, "lc_monetary_rows");	out_u16(lso, __lc_monetary_item_offsets, __lc_monetary_item_offsets_LEN, "lc_monetary_item_offsets");	out_u16(lso, __lc_monetary_item_idx, __lc_monetary_item_idx_LEN, "lc_monetary_item_idx");	out_uc(lso, __lc_time_rows, __lc_time_rows_LEN, "lc_time_rows");	out_u16(lso, __lc_time_item_offsets, __lc_time_item_offsets_LEN, "lc_time_item_offsets");	out_u16(lso, __lc_time_item_idx, __lc_time_item_idx_LEN, "lc_time_item_idx");	out_uc(lso, __lc_messages_rows, __lc_messages_rows_LEN, "lc_messages_rows");	out_u16(lso, __lc_messages_item_offsets, __lc_messages_item_offsets_LEN, "lc_messages_item_offsets");	out_u16(lso, __lc_messages_item_idx, __lc_messages_item_idx_LEN, "lc_messages_item_idx");	/* collate should be last*/	assert(sizeof(__locale_collate_tbl)/sizeof(__locale_collate_tbl[0]) == __lc_collate_data_LEN) ;	out_u16(lso, __locale_collate_tbl, __lc_collate_data_LEN, "collate_data");	{		unsigned char co_buf[__LOCALE_DATA_CATEGORIES] = {			__lc_ctype_item_offsets_LEN,			__lc_numeric_item_offsets_LEN,			__lc_monetary_item_offsets_LEN,			__lc_time_item_offsets_LEN,			0,			__lc_messages_item_offsets_LEN		};		out_uc(lso, co_buf, __LOCALE_DATA_CATEGORIES, "lc_common_item_offsets_LEN");	}	out_size_t(lso, common_tbl_offsets, __LOCALE_DATA_CATEGORIES * 4, "lc_common_tbl_offsets");	/* offsets from start of locale_mmap_t */	/* rows, item_offsets, item_idx, data */#ifdef __LOCALE_DATA_NUM_LOCALES	out_uc(lso, __locales, __LOCALE_DATA_NUM_LOCALES * __LOCALE_DATA_WIDTH_LOCALES, "locales");	out_uc(lso, __locale_names5, 5 * __LOCALE_DATA_NUM_LOCALE_NAMES, "locale_names5");#ifdef __LOCALE_DATA_AT_MODIFIERS_LENGTH	out_uc(lso, __locale_at_modifiers, __LOCALE_DATA_AT_MODIFIERS_LENGTH, "locale_at_modifiers");#else#error __LOCALE_DATA_AT_MODIFIERS_LENGTH not defined!#endif /* __LOCALE_DATA_AT_MODIFIERS_LENGTH */#endif /* __LOCALE_DATA_NUM_LOCALES */	out_uc(lso, lc_names, __lc_names_LEN, "lc_names");#ifdef __CTYPE_HAS_8_BIT_LOCALES	out_uc(lso, (const unsigned char*) __LOCALE_DATA_CODESET_LIST, sizeof(__LOCALE_DATA_CODESET_LIST), "codeset_list");#endif /* __CTYPE_HAS_8_BIT_LOCALES */	fprintf(lso,			"\n};\n\n"			"const __locale_mmap_t *__locale_mmap = &locale_mmap;\n\n"			);	if (ferror(lso) || fclose(lso)) {		printf("error writing!\n");		return EXIT_FAILURE;	}	return EXIT_SUCCESS;}/* ---------------------------------------------------------------------- *//* TODO: * collate data (8-bit weighted single char only) * @ mappings! * codeset list? yes, since we'll want to be able to inspect them... * that means putting some header stuff in magic * fix ctype LEN defines in gen_c8tables */
 |