| #include <stdio.h> |
| #include <stdlib.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| |
| int main(void) |
| { |
| FILE *lmm; /* mmap-able file */ |
| FILE *lso; /* static object */ |
| struct stat fd_stat; |
| int c; |
| size_t i; |
| |
| if (!(lmm = fopen("locale.mmap", "r"))) { |
| printf("cannot open locale.mmap!\n"); |
| return EXIT_FAILURE; |
| } |
| |
| if (fstat(fileno(lmm), &fd_stat)) { |
| printf("cannot stat locale.mmap!\n"); |
| fclose(lmm); |
| return EXIT_FAILURE; |
| } |
| |
| if (!(lso = fopen("locale_data.c", "w"))) { |
| printf("cannot open locale_data.c!\n"); |
| fclose(lmm); |
| return EXIT_FAILURE; |
| } |
| |
| fprintf(lso, |
| "#include <stddef.h>\n" |
| "#include <stdint.h>\n" |
| "#include \"lt_defines.h\"\n" |
| "#include \"locale_mmap.h\"\n\n" |
| "typedef union {\n" |
| "\tunsigned char buf[%zu];\n" |
| "\t__locale_mmap_t lmm;\n" |
| "} locale_union_t;\n\n" |
| "static const locale_union_t locale_union = { {", |
| (size_t) fd_stat.st_size |
| ); |
| |
| i = 0; |
| while ((c = getc(lmm)) != EOF) { |
| if (!(i & 0x7)) { |
| fprintf(lso, "\n\t"); |
| } |
| fprintf(lso, "%#04x, ", c); |
| ++i; |
| } |
| fprintf(lso, |
| "\n} };\n\n" |
| "const __locale_mmap_t *__locale_mmap = &locale_union.lmm;\n\n" |
| ); |
| |
| if (ferror(lmm)) { |
| printf("error reading!\n"); |
| return EXIT_FAILURE; |
| } |
| |
| if (ferror(lso) || fclose(lso)) { |
| printf("error writing!\n"); |
| return EXIT_FAILURE; |
| } |
| |
| fclose(lmm); |
| |
| return EXIT_SUCCESS; |
| } |