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