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* 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 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* 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