- 论坛徽章:
- 0
|
也SHOW一下我的 C 程序:
- /* ------------------------------------------------------------------------- */
- int CheckEBCDIC_String(USGC *Estr, int Estrlen, USGC *RetErrMsg, int REMlen)
- /*
- 检查EBCDIC字符串合法性(通用函数)
- M.L.Y 2004.10.15
- 本函数被RPGLE程序调用,其他程序如果需要也可以调用
- 参数:
- USGC *Estr - I, 待检查的EBCDIC字符串
- int Estrlen - I, 待检查的EBCDIC字符串长度
- USGC *RetErrMsg - O, 返回错误报告的信息BUFFER
- int REMlen - I, 返回错误报告的信息BUFFER最大长度
- 返回:
- 0 - 正确
- >0 - 出错位置
- 注意:必须保证RetErrMsg有足够的长度保存错误报告的信息
- */
- {
- int i, rc = 0;
- int stat = 0; /* 0=SBCS, 1=DBCS B1, 2=DBCS B2, 3=0x0E, 4=0x0F */
- USGS A1, E1;
- USGC vcs[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz"
- "01234567890"
- " !??/"#$??/%&'()*+,-./"
- ":;<=>?@??(??/??/??)??'_`{|}??-";
- for(i = 0; i < Estrlen; i++)
- {
- if(stat == 1) /* 汉字第1字节 */
- {
- if(Estr[i] <= 0x0F) /* 汉字第2字节不可能是00-0F */
- {
- rc = i + 1;
- sprintf(RetErrMsg, "第%d字节(汉字第2字节)非法(ec=1)", rc);
- break;
- }
- else
- {
- E1 = Estr[i-1] << 8 | Estr[i];
- A1 = GBK_E2A(E1);
- if(A1 == 0)
- {
- rc = i + 1;
- sprintf(RetErrMsg, "第%d,%d字节不是合法的GBK EBCDIC编码(ec=2)",
- rc-1, rc);
- break;
- }
- stat = 2;
- }
- }
- else if(stat == 2) /* 汉字第2字节 */
- {
- if(Estr[i] <= 0x0E) /* 汉字第1字节不可能是00-0E */
- {
- rc = i + 1;
- sprintf(RetErrMsg, "第%d字节不是0F或汉字第1字节非法(ec=3)",
- rc);
- break;
- }
- else if(Estr[i] == 0x0F)
- {
- stat = 4;
- }
- else
- {
- stat = 1;
- }
- }
- else if(stat == 3) /* 0x0E */
- {
- if(Estr[i] <= 0x0E) /* 汉字第1字节不可能是00-0E */
- {
- rc = i + 1;
- sprintf(RetErrMsg, "第%d字节0E后非0F或汉字第1字节非法(ec=4)",
- rc);
- break;
- }
- else if(Estr[i] == 0x0F)
- {
- stat = 4;
- }
- else
- {
- stat = 1;
- }
- }
- else if(stat == 4) /* 0x0F */
- {
- if(Estr[i] == 0x0E)
- {
- stat = 3;
- }
- else if(Estr[i] == 0x0F)
- {
- rc = i + 1;
- sprintf(RetErrMsg, "第%d字节为连续的0F(ec=5)", rc);
- break;
- }
- else
- {
- if(strchr(vcs, Estr[i]) == NULL)
- {
- rc = i + 1;
- sprintf(RetErrMsg, "第%d字节半角字符非法(ec=8)", rc);
- break;
- }
- stat = 0;
- }
- }
- else /* 半角字符 */
- {
- if(Estr[i] == 0x0E)
- {
- stat = 3;
- }
- else if(Estr[i] == 0x0F)
- {
- rc = i + 1;
- sprintf(RetErrMsg, "第%d字节为单独的0F(ec=6)", rc);
- break;
- }
- else
- {
- if(strchr(vcs, Estr[i]) == NULL)
- {
- rc = i + 1;
- sprintf(RetErrMsg, "第%d字节半角字符非法(ec=8)", rc);
- break;
- }
- stat = 0;
- }
- }
- }
- if(rc == 0 && stat != 0 && stat != 4)
- {
- rc = i;
- sprintf(RetErrMsg, "第%d字节字符串结尾非0F或半角字符(ec=7)", rc);
- }
- return rc;
- }
复制代码 |
|