1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <alloca.h>
21: #include <errno.h>
22: #include <locale.h>
23: #include <nl_types.h>
24: #include <stdlib.h>
25: #include <string.h>
26: #include <unistd.h>
27: #include <sys/mman.h>
28:
29: #include "catgetsinfo.h"
30:
31:
32:
33: nl_catd
34: catopen (const char *cat_name, int flag)
35: {
36: __nl_catd result;
37: const char *env_var = NULL;
38: const char *nlspath = NULL;
39:
40: if (strchr (cat_name, '/') == NULL)
41: {
42: if (flag == NL_CAT_LOCALE)
43:
44: env_var = setlocale (LC_MESSAGES, NULL);
45: else
46:
47: env_var = getenv ("LANG");
48:
49: if (env_var == NULL || *env_var == '\0'
50: || (__libc_enable_secure && strchr (env_var, '/') != NULL))
51: env_var = "C";
52:
53: nlspath = getenv ("NLSPATH");
54: if (nlspath != NULL && *nlspath != '\0')
55: {
56:
57: size_t len = strlen (nlspath) + 1 + sizeof NLSPATH;
58: char *tmp = alloca (len);
59:
60: __stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH);
61: nlspath = tmp;
62: }
63: else
64: nlspath = NLSPATH;
65: }
66:
67: result = (__nl_catd) malloc (sizeof (*result));
68: if (result == NULL)
69:
70: return (nl_catd) -1;
71:
72: if (__open_catalog (cat_name, nlspath, env_var, result) != 0)
73: {
74:
75: free ((void *) result);
76: return (nl_catd) -1;
77: }
78:
79: return (nl_catd) result;
80: }
81:
82:
83:
84: char *
85: catgets (nl_catd catalog_desc, int set, int message, const char *string)
86: {
87: __nl_catd catalog;
88: size_t idx;
89: size_t cnt;
90:
91:
92: if (catalog_desc == (nl_catd) -1 || ++set <= 0 || message < 0)
93: return (char *) string;
94:
95: catalog = (__nl_catd) catalog_desc;
96:
97: idx = ((set * message) % catalog->plane_size) * 3;
98: cnt = 0;
99: do
100: {
101: if (catalog->name_ptr[idx + 0] == (u_int32_t) set
102: && catalog->name_ptr[idx + 1] == (u_int32_t) message)
103: return (char *) &catalog->strings[catalog->name_ptr[idx + 2]];
104:
105: idx += catalog->plane_size * 3;
106: }
107: while (++cnt < catalog->plane_depth);
108:
109: __set_errno (ENOMSG);
110: return (char *) string;
111: }
112:
113:
114:
115: int
116: catclose (nl_catd catalog_desc)
117: {
118: __nl_catd catalog;
119:
120:
121: if (catalog_desc == (nl_catd) -1)
122: {
123: __set_errno (EBADF);
124: return -1;
125: }
126:
127: catalog = (__nl_catd) catalog_desc;
128:
129: #ifdef _POSIX_MAPPED_FILES
130: if (catalog->status == mmapped)
131: __munmap ((void *) catalog->file_ptr, catalog->file_size);
132: else
133: #endif
134: if (catalog->status == malloced)
135: free ((void *) catalog->file_ptr);
136: else
137: {
138: __set_errno (EBADF);
139: return -1;
140: }
141:
142: free ((void *) catalog);
143:
144: return 0;
145: }