xref: /aosp_15_r20/external/musl/src/locale/catgets.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define _BSD_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include <nl_types.h>
3*c9945492SAndroid Build Coastguard Worker #include <endian.h>
4*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
5*c9945492SAndroid Build Coastguard Worker #include <stdint.h>
6*c9945492SAndroid Build Coastguard Worker #include <errno.h>
7*c9945492SAndroid Build Coastguard Worker 
8*c9945492SAndroid Build Coastguard Worker #define V(p) be32toh(*(uint32_t *)(p))
9*c9945492SAndroid Build Coastguard Worker 
cmp(const void * a,const void * b)10*c9945492SAndroid Build Coastguard Worker static int cmp(const void *a, const void *b)
11*c9945492SAndroid Build Coastguard Worker {
12*c9945492SAndroid Build Coastguard Worker 	uint32_t x = V(a), y = V(b);
13*c9945492SAndroid Build Coastguard Worker 	return x<y ? -1 : x>y ? 1 : 0;
14*c9945492SAndroid Build Coastguard Worker }
15*c9945492SAndroid Build Coastguard Worker 
catgets(nl_catd catd,int set_id,int msg_id,const char * s)16*c9945492SAndroid Build Coastguard Worker char *catgets (nl_catd catd, int set_id, int msg_id, const char *s)
17*c9945492SAndroid Build Coastguard Worker {
18*c9945492SAndroid Build Coastguard Worker 	const char *map = (const char *)catd;
19*c9945492SAndroid Build Coastguard Worker 	uint32_t nsets = V(map+4);
20*c9945492SAndroid Build Coastguard Worker 	const char *sets = map+20;
21*c9945492SAndroid Build Coastguard Worker 	const char *msgs = map+20+V(map+12);
22*c9945492SAndroid Build Coastguard Worker 	const char *strings = map+20+V(map+16);
23*c9945492SAndroid Build Coastguard Worker 	uint32_t set_id_be = htobe32(set_id);
24*c9945492SAndroid Build Coastguard Worker 	uint32_t msg_id_be = htobe32(msg_id);
25*c9945492SAndroid Build Coastguard Worker 	const char *set = bsearch(&set_id_be, sets, nsets, 12, cmp);
26*c9945492SAndroid Build Coastguard Worker 	if (!set) {
27*c9945492SAndroid Build Coastguard Worker 		errno = ENOMSG;
28*c9945492SAndroid Build Coastguard Worker 		return (char *)s;
29*c9945492SAndroid Build Coastguard Worker 	}
30*c9945492SAndroid Build Coastguard Worker 	uint32_t nmsgs = V(set+4);
31*c9945492SAndroid Build Coastguard Worker 	msgs += 12*V(set+8);
32*c9945492SAndroid Build Coastguard Worker 	const char *msg = bsearch(&msg_id_be, msgs, nmsgs, 12, cmp);
33*c9945492SAndroid Build Coastguard Worker 	if (!msg) {
34*c9945492SAndroid Build Coastguard Worker 		errno = ENOMSG;
35*c9945492SAndroid Build Coastguard Worker 		return (char *)s;
36*c9945492SAndroid Build Coastguard Worker 	}
37*c9945492SAndroid Build Coastguard Worker 	return (char *)(strings + V(msg+8));
38*c9945492SAndroid Build Coastguard Worker }
39