Annotation of embedaddon/lrzsz/intl/explodename.c, revision 1.1.1.1
1.1 misho 1: /* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
2: Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
3:
4: This program is free software; you can redistribute it and/or modify
5: it under the terms of the GNU General Public License as published by
6: the Free Software Foundation; either version 2, or (at your option)
7: any later version.
8:
9: This program is distributed in the hope that it will be useful,
10: but WITHOUT ANY WARRANTY; without even the implied warranty of
11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12: GNU General Public License for more details.
13:
14: You should have received a copy of the GNU General Public License
15: along with this program; if not, write to the Free Software Foundation,
16: Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
17:
18: #ifdef HAVE_CONFIG_H
19: # include <config.h>
20: #endif
21:
22: #include <stdlib.h>
23: #include <string.h>
24: #include <sys/types.h>
25:
26: #include "loadinfo.h"
27:
28: /* On some strange systems still no definition of NULL is found. Sigh! */
29: #ifndef NULL
30: # if defined __STDC__ && __STDC__
31: # define NULL ((void *) 0)
32: # else
33: # define NULL 0
34: # endif
35: #endif
36:
37: /* @@ end of prolog @@ */
38:
39: int
40: _nl_explode_name (name, language, modifier, territory, codeset,
41: normalized_codeset, special, sponsor, revision)
42: char *name;
43: const char **language;
44: const char **modifier;
45: const char **territory;
46: const char **codeset;
47: const char **normalized_codeset;
48: const char **special;
49: const char **sponsor;
50: const char **revision;
51: {
52: enum { undecided, xpg, cen } syntax;
53: char *cp;
54: int mask;
55:
56: *modifier = NULL;
57: *territory = NULL;
58: *codeset = NULL;
59: *normalized_codeset = NULL;
60: *special = NULL;
61: *sponsor = NULL;
62: *revision = NULL;
63:
64: /* Now we determine the single parts of the locale name. First
65: look for the language. Termination symbols are `_' and `@' if
66: we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
67: mask = 0;
68: syntax = undecided;
69: *language = cp = name;
70: while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@'
71: && cp[0] != '+' && cp[0] != ',')
72: ++cp;
73:
74: if (*language == cp)
75: /* This does not make sense: language has to be specified. Use
76: this entry as it is without exploding. Perhaps it is an alias. */
77: cp = strchr (*language, '\0');
78: else if (cp[0] == '_')
79: {
80: /* Next is the territory. */
81: cp[0] = '\0';
82: *territory = ++cp;
83:
84: while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
85: && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
86: ++cp;
87:
88: mask |= TERRITORY;
89:
90: if (cp[0] == '.')
91: {
92: /* Next is the codeset. */
93: syntax = xpg;
94: cp[0] = '\0';
95: *codeset = ++cp;
96:
97: while (cp[0] != '\0' && cp[0] != '@')
98: ++cp;
99:
100: mask |= XPG_CODESET;
101:
102: if (*codeset != cp && (*codeset)[0] != '\0')
103: {
104: *normalized_codeset = _nl_normalize_codeset (*codeset,
105: cp - *codeset);
106: if (strcmp (*codeset, *normalized_codeset) == 0)
107: free ((char *) *normalized_codeset);
108: else
109: mask |= XPG_NORM_CODESET;
110: }
111: }
112: }
113:
114: if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
115: {
116: /* Next is the modifier. */
117: syntax = cp[0] == '@' ? xpg : cen;
118: cp[0] = '\0';
119: *modifier = ++cp;
120:
121: while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
122: && cp[0] != ',' && cp[0] != '_')
123: ++cp;
124:
125: mask |= XPG_MODIFIER | CEN_AUDIENCE;
126: }
127:
128: if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
129: {
130: syntax = cen;
131:
132: if (cp[0] == '+')
133: {
134: /* Next is special application (CEN syntax). */
135: cp[0] = '\0';
136: *special = ++cp;
137:
138: while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
139: ++cp;
140:
141: mask |= CEN_SPECIAL;
142: }
143:
144: if (cp[0] == ',')
145: {
146: /* Next is sponsor (CEN syntax). */
147: cp[0] = '\0';
148: *sponsor = ++cp;
149:
150: while (cp[0] != '\0' && cp[0] != '_')
151: ++cp;
152:
153: mask |= CEN_SPONSOR;
154: }
155:
156: if (cp[0] == '_')
157: {
158: /* Next is revision (CEN syntax). */
159: cp[0] = '\0';
160: *revision = ++cp;
161:
162: mask |= CEN_REVISION;
163: }
164: }
165:
166: /* For CEN syntax values it might be important to have the
167: separator character in the file name, not for XPG syntax. */
168: if (syntax == xpg)
169: {
170: if (*territory != NULL && (*territory)[0] == '\0')
171: mask &= ~TERRITORY;
172:
173: if (*codeset != NULL && (*codeset)[0] == '\0')
174: mask &= ~XPG_CODESET;
175:
176: if (*modifier != NULL && (*modifier)[0] == '\0')
177: mask &= ~XPG_MODIFIER;
178: }
179:
180: return mask;
181: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>