#include #include #include #include #include #include #include #include #include #include #define E0 0 #define H0 0 #define E(x) { #x, x } struct errkey { const char *name; int key; }; static struct errkey errors[] = { E(E0), E(EPERM),E(ENOENT),E(ESRCH),E(EINTR),E(EIO),E(ENXIO),E(E2BIG),E(ENOEXEC), E(EBADF),E(ECHILD),E(EAGAIN),E(ENOMEM),E(EACCES),E(EFAULT),E(ENOTBLK), E(EBUSY),E(EEXIST),E(EXDEV),E(ENODEV),E(ENOTDIR),E(EISDIR),E(EINVAL), E(ENFILE),E(EMFILE),E(ENOTTY),E(ETXTBSY),E(EFBIG),E(ENOSPC),E(ESPIPE), E(EROFS),E(EMLINK),E(EPIPE),E(EDOM),E(ERANGE),E(EDEADLK),E(ENAMETOOLONG), E(ENOLCK),E(ENOSYS),E(ENOTEMPTY),E(ELOOP),E(EWOULDBLOCK),E(ENOMSG), E(EIDRM),E(ECHRNG),E(EL2NSYNC),E(EL3HLT),E(EL3RST),E(ELNRNG),E(EUNATCH), E(ENOCSI),E(EL2HLT),E(EBADE),E(EBADR),E(EXFULL),E(ENOANO),E(EBADRQC), E(EBADSLT),E(EDEADLOCK),E(EBFONT),E(ENOSTR),E(ENODATA),E(ETIME),E(ENOSR), E(ENONET),E(ENOPKG),E(EREMOTE),E(ENOLINK),E(EADV),E(ESRMNT),E(ECOMM), E(EPROTO),E(EMULTIHOP),E(EDOTDOT),E(EBADMSG),E(EOVERFLOW),E(ENOTUNIQ), E(EBADFD),E(EREMCHG),E(ELIBACC),E(ELIBBAD),E(ELIBSCN),E(ELIBMAX), E(ELIBEXEC),E(EILSEQ),E(ERESTART),E(ESTRPIPE),E(EUSERS),E(ENOTSOCK), E(EDESTADDRREQ),E(EMSGSIZE),E(EPROTOTYPE),E(ENOPROTOOPT), E(EPROTONOSUPPORT),E(ESOCKTNOSUPPORT),E(EOPNOTSUPP),E(ENOTSUP), E(EPFNOSUPPORT),E(EAFNOSUPPORT),E(EADDRINUSE),E(EADDRNOTAVAIL), E(ENETDOWN),E(ENETUNREACH),E(ENETRESET),E(ECONNABORTED),E(ECONNRESET), E(ENOBUFS),E(EISCONN),E(ENOTCONN),E(ESHUTDOWN),E(ETOOMANYREFS), E(ETIMEDOUT),E(ECONNREFUSED),E(EHOSTDOWN),E(EHOSTUNREACH), E(EALREADY),E(EINPROGRESS),E(ESTALE),E(EUCLEAN),E(ENOTNAM),E(ENAVAIL), E(EISNAM),E(EREMOTEIO),E(EDQUOT),E(ENOMEDIUM),E(EMEDIUMTYPE), E(ECANCELED),E(ENOKEY),E(EKEYEXPIRED),E(EKEYREVOKED),E(EKEYREJECTED), E(EOWNERDEAD),E(ENOTRECOVERABLE),E(ERFKILL),E(EHWPOISON), }; static struct errkey regerrors[] = { E(REG_OK),E(REG_NOMATCH),E(REG_BADPAT),E(REG_ECOLLATE),E(REG_ECTYPE), E(REG_EESCAPE),E(REG_ESUBREG),E(REG_EBRACK),E(REG_EPAREN),E(REG_EBRACE), E(REG_BADBR),E(REG_ERANGE),E(REG_ESPACE),E(REG_BADRPT), }; static struct errkey gaierrors[] = { E(EAI_BADFLAGS),E(EAI_NONAME),E(EAI_AGAIN),E(EAI_FAIL),E(EAI_NODATA), E(EAI_FAMILY),E(EAI_SOCKTYPE),E(EAI_SERVICE),E(EAI_MEMORY),E(EAI_SYSTEM), E(EAI_OVERFLOW), }; static struct errkey herrors[] = { E(H0),E(HOST_NOT_FOUND),E(TRY_AGAIN),E(NO_RECOVERY),E(NO_DATA), }; static int lc_remap(int v) { return v==CHAR_MAX ? -1 : v; } static void emit_time_strings(const char *label, size_t offset, int start, int count, const char *fmt) { printf("%s ", label); for (int i=0; idecimal_point); printf("thousands_sep \"%s\"\n", lc->thousands_sep); printf("grouping "); if (!lc->grouping[0]) printf("%d", -1); for (char *p = lc->grouping; *p; p++) { printf("%d", lc_remap(*p)); if (p[1]) putchar(';'); } putchar('\n'); puts("END LC_NUMERIC"); puts(""); puts("LC_MONETARY"); printf("int_curr_symbol \"%s\"\n", lc->int_curr_symbol); printf("currency_symbol \"%s\"\n", lc->currency_symbol); printf("mon_decimal_point \"%s\"\n", lc->mon_decimal_point); printf("mon_thousands_sep \"%s\"\n", lc->mon_thousands_sep); printf("mon_grouping "); if (!lc->mon_grouping[0]) printf("%d", -1); for (char *p = lc->mon_grouping; *p; p++) { printf("%d", lc_remap(*p)); if (p[1]) putchar(';'); } putchar('\n'); printf("positive_sign \"%s\"\n", lc->positive_sign); printf("negative_sign \"%s\"\n", lc->negative_sign); printf("int_frac_digits %d\n", lc_remap(lc->int_frac_digits)); printf("frac_digits %d\n", lc_remap(lc->frac_digits)); printf("p_cs_precedes %d\n", lc_remap(lc->p_cs_precedes)); printf("p_sep_by_space %d\n", lc_remap(lc->p_sep_by_space)); printf("n_cs_precedes %d\n", lc_remap(lc->n_cs_precedes)); printf("n_sep_by_space %d\n", lc_remap(lc->n_sep_by_space)); printf("p_sign_posn %d\n", lc_remap(lc->p_sign_posn)); printf("n_sign_posn %d\n", lc_remap(lc->n_sign_posn)); printf("int_p_cs_precedes %d\n", lc_remap(lc->int_p_cs_precedes)); printf("int_p_sep_by_space %d\n", lc_remap(lc->int_p_sep_by_space)); printf("int_n_cs_precedes %d\n", lc_remap(lc->int_n_cs_precedes)); printf("int_n_sep_by_space %d\n", lc_remap(lc->int_n_sep_by_space)); printf("int_p_sign_posn %d\n", lc_remap(lc->int_p_sign_posn)); printf("int_n_sign_posn %d\n", lc_remap(lc->int_n_sign_posn)); puts("END LC_MONETARY"); puts(""); puts("LC_MESSAGES"); printf("yesexpr \"%s\"\n", nl_langinfo(YESEXPR)); printf("noexpr \"%s\"\n", nl_langinfo(NOEXPR)); emit_error_strings(errors, sizeof errors/sizeof *errors, wrap_strerror); emit_error_strings(regerrors, sizeof regerrors/sizeof *regerrors, wrap_regerror); emit_error_strings(gaierrors, sizeof gaierrors/sizeof *gaierrors, wrap_gai_strerror); emit_error_strings(herrors, sizeof herrors/sizeof *herrors, wrap_hstrerror); puts("END LC_MESSAGES"); puts(""); }