?? mapcode.cpp
字號:
USGS HZ_E2A(USGS EBCDIC_Code)/* EBCDIC DBCS to ASCII DBCS If the EBCDIC DBCS invalid, return ASCII DBCS blank (0xA1A1)*/{ USGC HB_A, LB_A, HB_E, LB_E; USGS GB_Code; /* USGS code_err = 0xFFFF; */ USGS GB_BLANK = 0xA1A1; int i, n_ea1, n_ea2; HB_E = (EBCDIC_Code & 0xFF00) >> 8; LB_E = EBCDIC_Code & 0x00FF; if(EBCDIC_Code != 0x4040 && EBCDIC_Code < 0x4141) return GB_BLANK; if(EBCDIC_Code > 0x46EF && EBCDIC_Code < 0x48A0) return GB_BLANK; if(EBCDIC_Code > 0x6C9F) return GB_BLANK; if(LB_E < 0x41 || LB_E > 0xFD) return GB_BLANK; if(HB_E >= 0x48 && HB_E <= 0x6C && LB_E == 0x80) return GB_BLANK; if(HB_E >= 0x48 && HB_E <= 0x6C && LB_E >= 0x41 && LB_E <= 0xFD) { HB_A = (HB_E - 0x48) * 2 + 0xB0 - 1; if(LB_E >= 0xA0) HB_A = HB_A + 1; if(LB_E < 0x80) LB_A = LB_E - 0x41 + 0xA1; else { if(LB_E < 0xA0) LB_A = LB_E - 0x81 + 0xE0; else /* LB_E >= 0xA0 */ LB_A = LB_E + 1; } GB_Code = HB_A << 8 | LB_A; return GB_Code; } n_ea1 = sizeof(HZE_A1)/sizeof(HZE_A1[0]); n_ea2 = sizeof(HZE_A2)/sizeof(HZE_A2[0]); for(i=0; i<n_ea1; i++) if(EBCDIC_Code == HZE_A1[i][0]) return HZE_A1[i][1]; for(i=0; i<n_ea2; i++) if(EBCDIC_Code >= HZE_A2[i][0] && EBCDIC_Code <= HZE_A2[i][1]) return HZE_A2[i][2] + EBCDIC_Code - HZE_A2[i][0]; return GB_BLANK;}/* ------------------------------------------------------------------------- */int Str_A2E(USGC *src, int src_len, USGC *dest)/* ASCII string to EBCDIC Return length after string conversion*/{ int i, j; char hz_stat, is_hanzi; USGS GB, EB; hz_stat = NO; for(i=0, j=0; i<src_len; i++) { is_hanzi = NO; if(src[i] > 0xA0 && src[i] < 0xFF) { if((i+1) < src_len && src[i+1] > 0xA0 && src[i+1] < 0xFF) is_hanzi = YES; } if(is_hanzi == YES) { GB = src[i] << 8 | src[i+1]; EB = HZ_A2E(GB); if(hz_stat == NO) { hz_stat = YES; dest[j++] = 0x0E; } dest[j++] = (EB & 0xFF00) >> 8; dest[j++] = EB & 0x00FF; i++; } else { if(hz_stat == YES) { hz_stat = NO; dest[j++] = 0x0F; } dest[j++] = ASCIItoEBCDIC(src[i]); } } if(hz_stat == YES) { hz_stat = NO; dest[j++] = 0x0F; } dest[j] = NUL; return j;}/* ------------------------------------------------------------------------- */int Str_E2A(USGC *src, int src_len, USGC *dest)/* EBCDIC string to ASCII Return length after string conversion*/{ int i, j; char hz_stat; USGS GB, EB; hz_stat = NO; for(i=0, j=0; i<src_len; i++) { if(hz_stat == NO && src[i] == 0x0E) { hz_stat = YES; continue; } if(hz_stat == YES) { if(src[i] == 0x0F || (i+1) >= src_len) { hz_stat = NO; continue; } if(src[i+1] == 0x0F) { hz_stat = NO; continue; } } if(hz_stat == YES) { EB = src[i] << 8 | src[i+1]; if(gl_E2Acvt7x_6B == YES) /* M.L.Y 1999.10.28 add */ EB = EBCDIC_cvt7x_6B(EB); GB = HZ_E2A(EB); dest[j++] = (GB & 0xFF00) >> 8; dest[j++] = GB & 0x00FF; i++; } else dest[j++] = EBCDICtoASCII(src[i]); } dest[j] = NUL; return j;}/* ------------------------------------------------------------------------- */int CvtFldA2E(USGC *Ebuf, int lenE, char fld_type, int fld_len, int fld_dec, USGC *Abuf, int lenA, LDU *val_ptr)/* ASCII string length: lenA Field max length: lenE Return: >=0 --- ok -1 --- error Ebuf data -2 --- error fld_type -3 --- unsupport fld_type -4 --- fld_len or lenA and lenE not match M.L.Y 1999.11*/{ int i, j; char hz_stat, is_hanzi, HHB, LHB; USGS GB, EB; long long_val = 0; double double_val = 0.0; switch(fld_type) { case 'P': j = fld_len / 2 + 1; if(lenE != j) return -4; double_val = val_ptr->double_val; long_val = double_val * pow(10, (double)fld_dec); for(i = 0; i < lenE; i++) { if(i == 0) { if(long_val < 0) { long_val = -long_val; LHB = 0x0D; } else LHB = 0x0F; HHB = long_val % 10; long_val /= 10; } else { LHB = long_val % 10; long_val /= 10; HHB = long_val % 10; long_val /= 10; } j = HHB << 4 | LHB; Ebuf[lenE-i-1] = j; } j = 0; break; case 'S': if(lenE != fld_len) return -4; double_val = val_ptr->double_val; long_val = double_val * pow(10, (double)fld_dec); for(i = 0; i < lenE; i++) { HHB = 0xF0; if(i == 0 && long_val < 0) { long_val = -long_val; HHB = 0xD0; } LHB = long_val % 10; long_val /= 10; j = HHB << 4 | LHB; Ebuf[lenE-i-1] = j; } j = 0; break; case 'B': j = fld_len > 4 ? 4 : 2; if(lenE != j) return -4; long_val = val_ptr->long_val; for(i = 0; i < lenE; i++) Ebuf[lenE-i-1] = (long_val >> (i*8)) & 0xFF; j = 0; break; case 'F': j = -3; break; case 'A': case 'H': if(lenA > lenE) return -4; case 'L': case 'T': case 'Z': for(i = 0; i < lenA; i++) Ebuf[i] = ASCIItoEBCDIC(Abuf[i]); j = i; break; case 'J': case 'E': case 'O': hz_stat = NO; for(i = 0, j = 0; i < lenA; i++) { is_hanzi = NO; if(Abuf[i] > 0xA0 && Abuf[i] < 0xFF) { if((i+1) < lenA && Abuf[i+1] > 0xA0 && Abuf[i+1] < 0xFF) is_hanzi = YES; } if(is_hanzi == YES) { GB = Abuf[i] << 8 | Abuf[i+1]; EB = HZ_A2E(GB); if(hz_stat == NO) { hz_stat = YES; Ebuf[j++] = 0x0E; } Ebuf[j++] = (EB & 0xFF00) >> 8; Ebuf[j++] = EB & 0x00FF; i++; } else { if(hz_stat == YES) { hz_stat = NO; Ebuf[j++] = 0x0F; } Ebuf[j++] = ASCIItoEBCDIC(Abuf[i]); } } if(hz_stat == YES) { hz_stat = NO; Ebuf[j++] = 0x0F; } break; case 'G': if(lenE != fld_len * 2) return -4; for(i = 0, j = 0; i < lenA; i++) { GB = Abuf[i] << 8 | Abuf[i+1]; EB = HZ_A2E(GB); Ebuf[j++] = (EB & 0xFF00) >> 8; Ebuf[j++] = EB & 0x00FF; i++; } break; default : j = -2; } return j;}/* ------------------------------------------------------------------------- */int CvtFldE2A(USGC *Ebuf, int lenE, char fld_type, int fld_len, int fld_dec, USGC *Abuf, int lenA, LDU *val_ptr)/* Field bytes: lenE Abuf max len: lenA Return: >=0 --- ok -1 --- error Ebuf data -2 --- error fld_type -3 --- unsupport fld_type -4 --- fld_len or lenA and lenE not match M.L.Y 1999.11*/{ int i, j; char hz_stat; USGS GB, EB; long long_val = 0; double double_val = 0.0; switch(fld_type) { case 'P': j = fld_len / 2 + 1; if(lenE != j) return -4; for(i = 0; i < lenE; i++) { j = Ebuf[i] >> 4; double_val = double_val * 10.0 + j; j = Ebuf[i] & 0x0F; if(i < lenE - 1) double_val = double_val * 10.0 + j; else { if(j != 0x0F && j != 0x0D) return -1; if(j == 0x0D) double_val = -double_val; double_val = double_val / pow(10, (double)fld_dec); } } val_ptr->double_val = double_val; j = 0; break; case 'S': if(lenE != fld_len) return -4;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -