github.com/afumu/libc@v0.0.6/darwin/gen.c (about)

     1  #include <stdio.h>
     2  #include <ctype.h>
     3  
     4  // typedef struct {
     5  // 	char		__magic[8];	/* Magic saying what version we are */
     6  // 	char		__encoding[32];	/* ASCII name of this encoding */
     7  // 
     8  // 	__darwin_rune_t	(*__sgetrune)(const char *, __darwin_size_t, char const **);
     9  // 	int		(*__sputrune)(__darwin_rune_t, char *, __darwin_size_t, char **);
    10  // 	__darwin_rune_t	__invalid_rune;
    11  // 
    12  // 	__uint32_t	__runetype[_CACHED_RUNES];
    13  // 	__darwin_rune_t	__maplower[_CACHED_RUNES];
    14  // 	__darwin_rune_t	__mapupper[_CACHED_RUNES];
    15  // 
    16  // 	/*
    17  // 	 * The following are to deal with Runes larger than _CACHED_RUNES - 1.
    18  // 	 * Their data is actually contiguous with this structure so as to make
    19  // 	 * it easier to read/write from/to disk.
    20  // 	 */
    21  // 	_RuneRange	__runetype_ext;
    22  // 	_RuneRange	__maplower_ext;
    23  // 	_RuneRange	__mapupper_ext;
    24  // 
    25  // 	void		*__variable;	/* Data which depends on the encoding */
    26  // 	int		__variable_len;	/* how long that data is */
    27  // 
    28  // 	/*
    29  // 	 * extra fields to deal with arbitrary character classes
    30  // 	 */
    31  // 	int		__ncharclasses;
    32  // 	_RuneCharClass	*__charclasses;
    33  // } _RuneLocale;
    34  
    35  
    36  #define SZ(a) (sizeof(a)/sizeof(a[0]))
    37  
    38  int main() {
    39  	printf("#include <ctype.h>\n\n");
    40  
    41  	printf(
    42  "	__maskrune(__darwin_ct_rune_t _c, unsigned long _f)\n"
    43  "{\n"
    44  "	return (int)_DefaultRuneLocale.__runetype[_c & 0xff] & (__uint32_t)_f;\n"
    45  "}\n"
    46  );
    47  	printf("\n__darwin_ct_rune_t __toupper(__darwin_ct_rune_t c) { return toupper(c); }\n");
    48  	printf("\n__darwin_ct_rune_t __tolower(__darwin_ct_rune_t c) { return tolower(c); }\n");
    49  
    50  	printf("_RuneLocale _DefaultRuneLocale = {\n");
    51  
    52  	printf("\t.__magic = {");
    53  	for (int i = 0; i < SZ(_DefaultRuneLocale.__magic); i++) {
    54  		printf("%i, ", _DefaultRuneLocale.__magic[i]);
    55  	}
    56  	printf("},\n");
    57  
    58  	printf("\t.__encoding = {");
    59  	for (int i = 0; i < SZ(_DefaultRuneLocale.__encoding); i++) {
    60  		printf("%i, ", _DefaultRuneLocale.__encoding[i]);
    61  	}
    62  	printf("},\n");
    63  
    64  	printf("\t.__invalid_rune = 0x%x,\n", (unsigned)_DefaultRuneLocale.__invalid_rune);
    65  
    66  	printf("\t.__runetype = {");
    67  	for (int i = 0; i < SZ(_DefaultRuneLocale.__runetype); i++) {
    68  		if (i%16 == 0) {
    69  			printf("\n\t\t");
    70  		}
    71  		printf("0x%x, ", _DefaultRuneLocale.__runetype[i]);
    72  	}
    73  	printf("\n\t},\n");
    74  
    75  	printf("\t.__maplower = {");
    76  	for (int i = 0; i < SZ(_DefaultRuneLocale.__maplower); i++) {
    77  		if (i%16 == 0) {
    78  			printf("\n\t\t");
    79  		}
    80  		printf("0x%x, ", _DefaultRuneLocale.__maplower[i]);
    81  	}
    82  	printf("\n\t},\n");
    83  
    84  	printf("\t.__mapupper= {");
    85  	for (int i = 0; i < SZ(_DefaultRuneLocale.__mapupper); i++) {
    86  		if (i%16 == 0) {
    87  			printf("\n\t\t");
    88  		}
    89  		printf("0x%x, ", _DefaultRuneLocale.__mapupper[i]);
    90  	}
    91  	printf("\n\t},\n");
    92  
    93  	printf("\n};\n");
    94  	printf("\n_RuneLocale *_CurrentRuneLocale = &_DefaultRuneLocale;\n");
    95  }