14887Schin /***********************************************************************
24887Schin * *
34887Schin * This software is part of the ast package *
4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property *
54887Schin * and is licensed under the *
64887Schin * Common Public License, Version 1.0 *
78462SApril.Chin@Sun.COM * by AT&T Intellectual Property *
84887Schin * *
94887Schin * A copy of the License is available at *
104887Schin * http://www.opensource.org/licenses/cpl1.0.txt *
114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
124887Schin * *
134887Schin * Information and Software Systems Research *
144887Schin * AT&T Research *
154887Schin * Florham Park NJ *
164887Schin * *
174887Schin * Glenn Fowler <gsf@research.att.com> *
184887Schin * David Korn <dgk@research.att.com> *
194887Schin * Phong Vo <kpv@research.att.com> *
204887Schin * *
214887Schin ***********************************************************************/
224887Schin #pragma prototyped
234887Schin
244887Schin /*
254887Schin * Glenn Fowler
264887Schin * AT&T Research
274887Schin *
284887Schin * 8 bit character code map name/id lookup support
294887Schin */
304887Schin
314887Schin #include <ast.h>
324887Schin #include <ccode.h>
334887Schin #include <ctype.h>
344887Schin
354887Schin static const Ccmap_t maps[] =
364887Schin {
374887Schin {
384887Schin "ascii",
394887Schin "a|ascii|?(iso)?(-)646|?(iso)?(-)8859|latin",
404887Schin "8 bit ascii",
414887Schin "ISO-8859-%s",
424887Schin "1",
434887Schin CC_ASCII,
444887Schin },
454887Schin
464887Schin {
474887Schin "ebcdic",
484887Schin "e|ebcdic?(-)?([1e])",
494887Schin "X/Open ebcdic",
504887Schin "EBCDIC",
514887Schin 0,
524887Schin CC_EBCDIC_E,
534887Schin },
544887Schin
554887Schin {
564887Schin "ebcdic-o",
574887Schin "o|ebcdic?(-)[3o]|?(cp|ibm)1047|open?(-)edition",
584887Schin "mvs OpenEdition ebcdic",
594887Schin "EBCDIC-O",
604887Schin 0,
614887Schin CC_EBCDIC_O,
624887Schin },
634887Schin
644887Schin {
654887Schin "ebcdic-h",
664887Schin "h|ebcdic?(-)h|?(cp|ibm)?(00)37|[oa]s?(/-)400",
674887Schin "ibm OS/400 AS/400 ebcdic",
684887Schin "EBCDIC-H",
694887Schin 0,
704887Schin CC_EBCDIC_H,
714887Schin },
724887Schin
734887Schin {
744887Schin "ebcdic-s",
754887Schin "s|ebcdic?(-)s|siemens|posix-bc",
764887Schin "siemens posix-bc ebcdic",
774887Schin "EBCDIC-S",
784887Schin 0,
794887Schin CC_EBCDIC_S,
804887Schin },
814887Schin
824887Schin {
834887Schin "ebcdic-i",
844887Schin "i|ebcdic?(-)[2i]|ibm",
854887Schin "X/Open ibm ebcdic (not idempotent)",
864887Schin "EBCDIC-I",
874887Schin 0,
884887Schin CC_EBCDIC_I,
894887Schin },
904887Schin
914887Schin {
924887Schin "ebcdic-m",
934887Schin "m|ebcdic?(-)m|mvs",
944887Schin "mvs ebcdic",
954887Schin "EBCDIC-M",
964887Schin 0,
974887Schin CC_EBCDIC_M,
984887Schin },
994887Schin
1004887Schin {
1014887Schin "ebcdic-u",
1024887Schin "u|ebcdic?(-)(u|mf)|microfocus",
1034887Schin "microfocus cobol ebcdic",
1044887Schin "EBCDIC-U",
1054887Schin 0,
1064887Schin CC_EBCDIC_U,
1074887Schin },
1084887Schin
1094887Schin {
1104887Schin "native",
1114887Schin "n|native|local",
1124887Schin "native code set",
1134887Schin 0,
1144887Schin 0,
1154887Schin CC_NATIVE,
1164887Schin },
1174887Schin
1184887Schin { 0 },
1194887Schin };
1204887Schin
1214887Schin /*
1224887Schin * ccode map list iterator
1234887Schin */
1244887Schin
1254887Schin Ccmap_t*
ccmaplist(Ccmap_t * mp)1264887Schin ccmaplist(Ccmap_t* mp)
1274887Schin {
1284887Schin return !mp ? (Ccmap_t*)maps : (++mp)->name ? mp : (Ccmap_t*)0;
1294887Schin }
1304887Schin
1314887Schin /*
1324887Schin * return ccode map id given name
1334887Schin */
1344887Schin
1354887Schin int
ccmapid(const char * name)1364887Schin ccmapid(const char* name)
1374887Schin {
1384887Schin register const Ccmap_t* mp;
1394887Schin register int c;
1404887Schin const Ccmap_t* bp;
1414887Schin int n;
1424887Schin int sub[2];
1434887Schin
1444887Schin bp = 0;
1454887Schin n = 0;
1464887Schin for (mp = maps; mp->name; mp++)
1474887Schin if (strgrpmatch(name, mp->match, sub, elementsof(sub) / 2, STR_MAXIMAL|STR_LEFT|STR_ICASE))
1484887Schin {
1494887Schin if (!(c = name[sub[1]]))
1504887Schin return mp->ccode;
1514887Schin if (sub[1] > n && !isalpha(c))
1524887Schin {
1534887Schin n = sub[1];
1544887Schin bp = mp;
1554887Schin }
1564887Schin }
1574887Schin return bp ? bp->ccode : -1;
1584887Schin }
1594887Schin
1604887Schin /*
1614887Schin * return ccode map name given id
1624887Schin */
1634887Schin
1644887Schin char*
ccmapname(register int id)1654887Schin ccmapname(register int id)
1664887Schin {
1674887Schin register const Ccmap_t* mp;
1684887Schin
1694887Schin for (mp = maps; mp->name; mp++)
1704887Schin if (id == mp->ccode)
1714887Schin return (char*)mp->name;
1724887Schin return 0;
1734887Schin }
174