1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2011 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
35static 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
125Ccmap_t*
126ccmaplist(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
135int
136ccmapid(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
164char*
165ccmapname(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