1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 #pragma prototyped
23
24 /*
25 * Glenn Fowler
26 * AT&T Research
27 *
28 * 8 bit character code map name/id lookup support
29 */
30
31 #include <ast.h>
32 #include <ccode.h>
33 #include <ctype.h>
34
35 static const Ccmap_t maps[] =
36 {
37 {
38 "ascii",
39 "a|ascii|?(iso)?(-)646|?(iso)?(-)8859|latin",
40 "8 bit ascii",
41 "ISO-8859-%s",
42 "1",
43 CC_ASCII,
44 },
45
46 {
47 "ebcdic",
48 "e|ebcdic?(-)?([1e])",
49 "X/Open ebcdic",
50 "EBCDIC",
51 0,
52 CC_EBCDIC_E,
53 },
54
55 {
56 "ebcdic-o",
57 "o|ebcdic?(-)[3o]|?(cp|ibm)1047|open?(-)edition",
58 "mvs OpenEdition ebcdic",
59 "EBCDIC-O",
60 0,
61 CC_EBCDIC_O,
62 },
63
64 {
65 "ebcdic-h",
66 "h|ebcdic?(-)h|?(cp|ibm)?(00)37|[oa]s?(/-)400",
67 "ibm OS/400 AS/400 ebcdic",
68 "EBCDIC-H",
69 0,
70 CC_EBCDIC_H,
71 },
72
73 {
74 "ebcdic-s",
75 "s|ebcdic?(-)s|siemens|posix-bc",
76 "siemens posix-bc ebcdic",
77 "EBCDIC-S",
78 0,
79 CC_EBCDIC_S,
80 },
81
82 {
83 "ebcdic-i",
84 "i|ebcdic?(-)[2i]|ibm",
85 "X/Open ibm ebcdic (not idempotent)",
86 "EBCDIC-I",
87 0,
88 CC_EBCDIC_I,
89 },
90
91 {
92 "ebcdic-m",
93 "m|ebcdic?(-)m|mvs",
94 "mvs ebcdic",
95 "EBCDIC-M",
96 0,
97 CC_EBCDIC_M,
98 },
99
100 {
101 "ebcdic-u",
102 "u|ebcdic?(-)(u|mf)|microfocus",
103 "microfocus cobol ebcdic",
104 "EBCDIC-U",
105 0,
106 CC_EBCDIC_U,
107 },
108
109 {
110 "native",
111 "n|native|local",
112 "native code set",
113 0,
114 0,
115 CC_NATIVE,
116 },
117
118 { 0 },
119 };
120
121 /*
122 * ccode map list iterator
123 */
124
125 Ccmap_t*
ccmaplist(Ccmap_t * mp)126 ccmaplist(Ccmap_t* mp)
127 {
128 return !mp ? (Ccmap_t*)maps : (++mp)->name ? mp : (Ccmap_t*)0;
129 }
130
131 /*
132 * return ccode map id given name
133 */
134
135 int
ccmapid(const char * name)136 ccmapid(const char* name)
137 {
138 register const Ccmap_t* mp;
139 register int c;
140 const Ccmap_t* bp;
141 int n;
142 int sub[2];
143
144 bp = 0;
145 n = 0;
146 for (mp = maps; mp->name; mp++)
147 if (strgrpmatch(name, mp->match, sub, elementsof(sub) / 2, STR_MAXIMAL|STR_LEFT|STR_ICASE))
148 {
149 if (!(c = name[sub[1]]))
150 return mp->ccode;
151 if (sub[1] > n && !isalpha(c))
152 {
153 n = sub[1];
154 bp = mp;
155 }
156 }
157 return bp ? bp->ccode : -1;
158 }
159
160 /*
161 * return ccode map name given id
162 */
163
164 char*
ccmapname(register int id)165 ccmapname(register int id)
166 {
167 register const Ccmap_t* mp;
168
169 for (mp = maps; mp->name; mp++)
170 if (id == mp->ccode)
171 return (char*)mp->name;
172 return 0;
173 }
174