From 4abab5ad6c8465a7528ccdd5f49367da05f78bbd Mon Sep 17 00:00:00 2001 From: Vladimir Azarov Date: Tue, 1 Oct 2024 15:47:05 +0200 Subject: Initial version --- src/locale/catgets.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/locale/catgets.c (limited to 'src/locale/catgets.c') diff --git a/src/locale/catgets.c b/src/locale/catgets.c new file mode 100644 index 0000000..71c31c1 --- /dev/null +++ b/src/locale/catgets.c @@ -0,0 +1,38 @@ +#define _BSD_SOURCE +#include +#include +#include +#include +#include + +#define V(p) be32toh(*(uint32_t *)(p)) + +static int cmp(const void *a, const void *b) +{ + uint32_t x = V(a), y = V(b); + return xy ? 1 : 0; +} + +char *catgets (nl_catd catd, int set_id, int msg_id, const char *s) +{ + const char *map = (const char *)catd; + uint32_t nsets = V(map+4); + const char *sets = map+20; + const char *msgs = map+20+V(map+12); + const char *strings = map+20+V(map+16); + uint32_t set_id_be = htobe32(set_id); + uint32_t msg_id_be = htobe32(msg_id); + const char *set = bsearch(&set_id_be, sets, nsets, 12, cmp); + if (!set) { + errno = ENOMSG; + return (char *)s; + } + uint32_t nmsgs = V(set+4); + msgs += 12*V(set+8); + const char *msg = bsearch(&msg_id_be, msgs, nmsgs, 12, cmp); + if (!msg) { + errno = ENOMSG; + return (char *)s; + } + return (char *)(strings + V(msg+8)); +} -- cgit v1.2.3