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