?? gcf400.cpp
字號:
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 = (long)(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 = (long)(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,/* 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; for(i = 0; i < lenE; i++) { j = Ebuf[i]; if(i < lenE - 1) { if(j < 0xF0 || j > 0xF9) return -1; double_val = double_val * 10.0 + (j & 0x0F) * 1.0; } else { if((j & 0xF0) != 0xF0 && (j & 0xF0) != 0xD0) return -1; double_val = double_val * 10.0 + (j & 0x0F) * 1.0; if((j & 0xF0) == 0xD0) double_val = -double_val; double_val = double_val / pow(10, (double)fld_dec); } } val_ptr->double_val = double_val; j = 0; break; case 'B': j = fld_len > 4 ? 4 : 2; if(lenE != j) return -4; for(i = 0; i < lenE; i++) { j = Ebuf[i]; long_val = long_val << 8 | j; } val_ptr->long_val = long_val; j = 0; break; case 'F': j = -3; break; case 'A': case 'H': if(lenE > lenA) return -4; case 'L': case 'T': case 'Z': for(i = 0; i < lenE; i++) Abuf[i] = EBCDICtoASCII(Ebuf[i]); j = i; break; case 'J': case 'E': case 'O': hz_stat = NO; for(i = 0, j = 0; i < lenE; i++) { if(hz_stat == NO && Ebuf[i] == 0x0E) { hz_stat = YES; continue; } if(hz_stat == YES) { if(Ebuf[i] == 0x0F || (i+1) >= lenE) { hz_stat = NO; continue; } if(Ebuf[i+1] == 0x0F) { hz_stat = NO; continue; } } if(hz_stat == YES) { EB = Ebuf[i] << 8 | Ebuf[i+1]; if(gl_E2Acvt7x_6B == YES) EB = EBCDIC_cvt7x_6B(EB); GB = HZ_E2A(EB); Abuf[j++] = (GB & 0xFF00) >> 8; Abuf[j++] = GB & 0x00FF; i++; } else Abuf[j++] = EBCDICtoASCII(Ebuf[i]); } break; case 'G': if(lenE != fld_len * 2) return -4; for(i = 0, j = 0; i < lenE; i++) { EB = Ebuf[i] << 8 | Ebuf[i+1]; if(gl_E2Acvt7x_6B == YES) EB = EBCDIC_cvt7x_6B(EB); GB = HZ_E2A(EB); Abuf[j++] = (GB & 0xFF00) >> 8; Abuf[j++] = GB & 0x00FF; i++; } break; default : j = -2; } return j;}/* ------------------------------------------------------------------------- */USGC *truncate_Estr(USGC *Estr, int len)/* Truncate the EBCDIC string to length of len M.L.Y 1999.12.13*/{ int byte_stat = 0; /* byte stat: 0 -- SBCS byte, -1 -- 0x0E, -2 -- 0x0F, 1---N -- DBCS byte */ int i; for(i = 0; i < len; i++) { if(Estr[i] == 0x0E) byte_stat = -1; else if(Estr[i] == 0x0F) byte_stat = -2; else { if(byte_stat == -2) /* last char is 0x0F */ byte_stat = 0; /* SBCS char */ else if(byte_stat == -1) /* last char is 0x0E */ byte_stat = 1; /* DBCS 1st char */ else if(byte_stat > 0) /* last char is DBCS char */ byte_stat++; /* count bytes */ } } if(byte_stat == -1) Estr[len-1] = 0x40; /* blank space */ else if(byte_stat > 0) { if(byte_stat % 2 == 1) Estr[len-1] = 0x0F; else { Estr[len-2] = 0x0F; Estr[len-1] = 0x40; /* blank space */ } } Estr[len] = 0x00; return Estr;}/* ------------------------------------------------------------------------- */int C400trigraphs_to_std_C(USGC *strfrom, USGC *strto)/* Convert the C source line include AS/400 ILE C/400 trigraphs to standard C, return conversion number: ??= -> # ??/ -> \ ??( -> [ ??' -> ^ ??) -> ] ??! -> | ??< -> { ??- -> ~ ??> -> } M.L.Y 1998.09.08*/{ int i, j, k, m, n, conv; char *trigraphs = "()<>='!-/"; char *standardc = "[]{}#^|~\\"; m = strlen(trigraphs); for(i = 0, j = 0, n = 0; strfrom[i] != NUL; ) { conv = NO; if(strfrom[i] == '?' && strfrom[i+1] == '?') { for(k = 0; k < m; k++) { if(strfrom[i+2] == trigraphs[k]) { strto[j++] = standardc[k]; i = i + 3; conv = YES; n++; break; } } } if(conv != YES) { strto[j++] = strfrom[i++]; } } strto[j] = NUL; return n;}/* ------------------------------------------------------------------------- */int std_C_to_C400trigraphs(USGC *strfrom, USGC *strto)/* Convert the standard C source line to AS/400 ILE C/400 trigraphs, return conversion number: [ -> ??( ^ -> ??' ] -> ??) ~ -> ??- \ -> ??/ M.L.Y 1998.09.08*/{ int i, j, k, m, n, conv; char *standardc = "[]^~\\"; char *trigraphs = "()'-/"; m = strlen(standardc); for(i = 0, j = 0, n = 0; strfrom[i] != NUL; i++) { conv = NO; for(k = 0; k < m; k++) { if(strfrom[i] == standardc[k]) { strto[j++] = '?'; strto[j++] = '?'; strto[j++] = trigraphs[k]; conv = YES; n++; break; } } if(conv != YES) { strto[j++] = strfrom[i]; } } strto[j] = NUL; return n;}/* End of file */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -