123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #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;
- }
|