📄 fmtext.c
字号:
#include <stdarg.h>
#include <unistd.h>
#include "pdt.h"
#define FLAG_CHINESE 0xA0
#define IsChinese(c) (c > FLAG_CHINESE)
/* 对字符串中的每个汉字串预留2个位置后进行拷贝(汉字缩短)
* 函数参数:
* char *szData 处理串
* int nSize 期望的长度
*/
RESULT CopyChnStr(char *szData, int nSize)
{
BOOL bInChinese = FALSE;
int i = 0, j = 0;
int nEnd = -2; /* 表示最后一个汉字的开始位置 */
while(TRUE)
{
if (szData[i] == 0 || j >= nSize)
break;
/* 20060821
if (IsChinese((unsigned char)szData[i]))
*/
if (((unsigned char)szData[i] > 0x80) && ((unsigned char)szData[i] < 0xFF))
{
if (!bInChinese)
bInChinese = TRUE;
i += 2;
j += 2;
nEnd = (i - 2);
}
else
{
if (bInChinese)
{
j += 2;
bInChinese = FALSE;
}
i ++;
j ++;
}
}
if (j > nSize)
{
if ( (szData[i - (j - nSize) - 1] >= 0x81) && (szData[i - (j - nSize) - 1] <= 0xFE) && (nEnd == (i - (j - nSize) - 1)) )
szData[i - (j - nSize) - 1] = ' ';
szData[i - (j - nSize)] = 0;
}
else
{
if ( (szData[i-2] >= 0x81) && (szData[i-2] <= 0xFE) && (nEnd == (i - 2)))
{
szData[i-2] = ' ';
szData[i-1] = ' ';
}
szData[i] = 0;
}
return NORMAL;
}
/* 对字符串中的每个汉字串增加2位直到预定长度
* 函数参数:
* char *szDataSrc 源串
* char *szDataDes 目地串
* int nSize 期望的长度
* PINT pnDataSrc 到达预定长度后源串指针
*/
RESULT FillChnStr(char *szDataSrc, char *szDataDes, int nSize, PINT pnDataSrc)
{
BOOL bInChinese = FALSE;
int i = 0, j = 0, k;
DETECT_NULL(szDataSrc);
DETECT_NULL(szDataDes);
while(TRUE)
{
if (szDataSrc[i] == 0 || j >= nSize)
break;
if (IsChinese((unsigned char)szDataSrc[i]))
{
if (!bInChinese)
bInChinese = TRUE;
memcpy(szDataDes + i, szDataSrc + i, 2);
i += 2;
j += 2;
}
else
{
if (bInChinese)
{
j += 2;
if (j >= nSize)
break;
bInChinese = FALSE;
}
memcpy(szDataDes + i, szDataSrc + i, 1);
i ++;
j ++;
}
}
/*
for (k = i; k < nSize; k ++)
szDataDes[k] = ' ';
szDataDes[nSize] = 0;
*/
(*pnDataSrc) = i;
return NORMAL;
}
/* 取字符串中的汉字串,如:"汉字 汉 字"串中有3个汉字串 */
void GetChineseItem(char *szData, int *pnItem)
{
BOOL bInChinese = FALSE;
int i = 0;
(*pnItem) = 0;
while(TRUE)
{
if (szData[i] == 0)
break;
if (IsChinese((unsigned char)szData[i]))
{
if (!bInChinese)
{
bInChinese = TRUE;
(*pnItem) ++;
}
i += 2;
}
else
{
if (bInChinese)
bInChinese = FALSE;
i ++;
}
}
}
/*
* 将数据转换成EBCDIC码后按格式放到缓冲区中
* 参数说明:char *str 缓冲区
* char *fmt1, ... 参数串
* 返回: 成功: 数据长度
* 失败: -1
*/
int tprintfEbcdic( char *str, char *fmt1, ...)
{
char szAscii[2048 + 1], szEbcdic[2048 + 1];
int nEbcdicSize, nAsciiSize;
va_list arglist;
char c,c1,*pc;
static char fmt[500],buf[4000];
int idx1,idx2,len,len1,state,p1;
strcpy(fmt,fmt1);
idx1=idx2=state=0; /* init */
va_start(arglist,fmt1);
while( 1 ){
c=fmt[idx1];
if( c==0 )break;
switch (state){
case 0:
if( c=='%' ) { p1=idx1;state=1; }
break;
case 1:
if( c=='c' ){
bufclr(szAscii);
szAscii[0]=va_arg(arglist,short int);
nAsciiSize = 1;
bufclr(szEbcdic);
ShiftAsciiToEbcdicExt((PUCHAR)szEbcdic, (PUCHAR)szAscii, \
nAsciiSize + 1, nAsciiSize);
buf[idx2] = szEbcdic[0];
idx2++;
state=0;
}
else if('0'<=c && c<='9'){
len=c-'0';
state=2;
}
else return(-1);
break;
case 2:/* '%'<num>^ */
if( '0'<=c && c<='9' ) len=10*len+c-'0';
else if(c=='.') state=3;
else if( c=='d' || c=='f' ){
c1=fmt[idx1+1];
fmt[idx1+1]=0;
if( c=='d' )
{
bufclr(szAscii);
nAsciiSize = sprintf(szAscii, fmt+p1, \
va_arg(arglist,short int));
bufclr(szEbcdic);
ShiftAsciiToEbcdicExt((PUCHAR)szEbcdic, \
(PUCHAR)szAscii, \
len + 1, len);
sprintf(buf+idx2, "%s", szEbcdic);
}
else
{ /* c=='f' */
bufclr(szAscii);
nAsciiSize = sprintf(szAscii, fmt+p1, \
va_arg(arglist, double));
bufclr(szEbcdic);
ShiftAsciiToEbcdicExt((PUCHAR)szEbcdic,(PUCHAR)szAscii, \
len + 1, len);
sprintf(buf+idx2, "%s", szEbcdic);
}
fmt[idx1+1]=c1;
idx2+=len;
state=0;
}
else if( c=='l' ) state=5;
else if( c=='s' ){
bufclr(szAscii);
/* sprintf(szAscii, "%s", va_arg(arglist,char*)); */
mstrcpy(len, va_arg(arglist,char*), szAscii);
bufclr(szEbcdic);
ShiftAsciiToEbcdicExt((PUCHAR)szEbcdic, \
(PUCHAR)szAscii, \
len + 1, len);
sprintf(buf+idx2, "%s", szEbcdic);
idx2+=len;
state=0;
}
else if(c=='h') state=2;
else return(-1);
break;
case 3: /* '%'<num>'.'^ */
if('0'<=c && c<='9') state=4;
else return(-1);
break;
case 4: /* '%'<num>'.'<num>^ */
if( '0'<=c && c<='9' ) state=4;
else if( c=='f' ){
c1=fmt[idx1+1];
fmt[idx1+1]=0;
bufclr(szAscii);
nAsciiSize = sprintf(szAscii, fmt+p1, \
va_arg(arglist, double));
bufclr(szEbcdic);
ShiftAsciiToEbcdicExt((PUCHAR)szEbcdic, \
(PUCHAR)szAscii, \
len + 1, len);
sprintf(buf+idx2, "%s", szEbcdic);
fmt[idx1+1]=c1;
idx2+=len;
state=0;
}
else if( c=='l' ) state=6;
else return(-1);
break;
case 5: /* '%'<num>'l'^ */
if( c=='f' || c=='d' ){
c1=fmt[idx1+1];
fmt[idx1+1]=0;
if( c=='f' )
{
bufclr(szAscii);
nAsciiSize = sprintf(szAscii, fmt+p1, \
va_arg(arglist, double));
bufclr(szEbcdic);
ShiftAsciiToEbcdicExt((PUCHAR)szEbcdic, \
(PUCHAR)szAscii, \
len + 1, len);
sprintf(buf+idx2, "%s", szEbcdic);
}
else /* c=='d' */
{
bufclr(szAscii);
nAsciiSize = sprintf(szAscii, fmt+p1, \
va_arg(arglist, long));
bufclr(szEbcdic);
ShiftAsciiToEbcdicExt((PUCHAR)szEbcdic, \
(PUCHAR)szAscii, \
len + 1, len);
sprintf(buf+idx2, "%s", szEbcdic);
}
fmt[idx1+1]=c1;
idx2+=len;
state=0;
}
else return(-1);
break;
case 6: /* '%'<num>'.'<num>'l'^ */
if( c=='f' ){
c1=fmt[idx1+1];
fmt[idx1+1]='\0';
bufclr(szAscii);
nAsciiSize = sprintf(szAscii, fmt+p1, \
va_arg(arglist, double));
bufclr(szEbcdic);
ShiftAsciiToEbcdicExt((PUCHAR)szEbcdic, \
(PUCHAR)szAscii, \
len + 1, len);
sprintf(buf+idx2, "%s", szEbcdic);
fmt[idx1+1]=c1;
idx2+=len;
state=0;
}
else return(-1);
break;
}/*end switch*/
idx1++;
} /*end while*/
buf[idx2]='\0';
memcpy(str, buf, idx2);
str[idx2] = '\0';
va_end(arglist);
return idx2;
}
/*
* 将数据从EBCDIC码转换到ASCII后按格式输出到变量中
* 参数说明:char *str 缓冲区
* UINT nSize 数据长度
* char *fmt1, ... 参数串
*/
short int tscanfEbcdic( char *szEbcdic, UINT nSize, char *fmt, ... )
{
va_list arglist;
char c,c1,fmt1[16];
int idx1,idx2,len=0;
int state;
double x;
char str[8192 + 1];
ShiftEbcdicToAsciiExt((PUCHAR)str, (PUCHAR)szEbcdic, nSize + 1, nSize);
idx1=idx2=state=0; /* init */
va_start(arglist,fmt);
while(1){
c=fmt[idx1];
if( !c ) break;
switch (state){
case 0:
if( c=='%' ) state=1;
break;
case 1: /* '%'^ */
if(c=='c'){
*va_arg(arglist,char*)=str[idx2];
idx2+=1;
state=0;
}
else if('0'<=c && c<='9'){
state=2;
len=c-'0';
}
else return(-1);
break;
case 2: /* '%'<num>^ */
if( '0'<=c && c<='9' ) len=10*len+c-'0';
else if(c=='.') state=4;
else if(c=='d' || c=='f' || c=='s' ) {
c1=str[idx2+len];
str[idx2+len]=0;
if( c=='d' ) *va_arg(arglist,short int*)=atoi(str+idx2);
else if( c=='f' ) *va_arg(arglist,float*)=atof(str+idx2);
else if( c=='s' ) nstrcpy(len,str+idx2,va_arg(arglist,char*));
idx2+=len;
str[idx2]=c1;
state=0;
}
else if(c=='h') state=2;
else if(c=='l') state=3;
else return(-1);
break;
case 3: /* '%'<num>'l'^ */
if( c=='d' || c=='f' ){
c1=str[idx2+len];
str[idx2+len]='\0';
if( c=='d' ) *va_arg(arglist,long*)=atol(str+idx2);
else if( c=='f' ) *va_arg(arglist,double*)=atof(str+idx2);
idx2+=len;
str[idx2]=c1;
state=0;
}
else return(-1);
break;
case 4: /* '%'<num>'.'^ */
if( '0'<=c && c<='9' ) state=5;
else return(-1);
break;
case 5: /* '%'<num>'.'<num>^ */
if( '0'<=c && c<='9' ) state=5;
else if( c=='f' ){
c1=str[idx2+len];
str[idx2+len]='\0';
*va_arg(arglist,float*)=(float)atof(str+idx2);
idx2+=len;
str[idx2]=c1;
state=0;
}
else if( c=='l' ) state=6;
else return(-1);
break;
case 6: /* '%'<num>'.'<num>'l'^ */
if( c=='f' ){
c1=str[idx2+len];
str[idx2+len]='\0';
*va_arg(arglist,double*)=atof(str+idx2);
idx2+=len;
str[idx2]=c1;
state=0;
}
else return(-1);
break;
}/*end switch*/
idx1++;
} /*end while*/
va_end(arglist);
return(0);
}
/* 按格式转换输出字符串,如果有汉字,缩减汉字数以免溢出 */
short int tprintfChn( char *str, char *fmt1, ... )
{
va_list arglist;
char c,c1,*pc;
static char fmt[500],buf[4000];
int idx1,idx2,len,len1,state,p1;
int nItem;
strcpy(fmt,fmt1);
idx1=idx2=state=0; /* init */
va_start(arglist,fmt1);
while( 1 ){
c=fmt[idx1];
if( c==0 )break;
switch (state){
case 0:
if( c=='%' ) { p1=idx1;state=1; }
break;
case 1:
if( c=='c' ){
buf[idx2]=va_arg(arglist,short int);
if (buf[idx2] == '\0') buf[idx2] = ' ';
idx2++;
state=0;
}
else if('0'<=c && c<='9'){
len=c-'0';
state=2;
}
else return(-1);
break;
case 2:/* '%'<num>^ */
if( '0'<=c && c<='9' ) len=10*len+c-'0';
else if(c=='.') state=3;
else if( c=='d' || c=='f' ){
c1=fmt[idx1+1];
fmt[idx1+1]=0;
if( c=='d' ) sprintf(buf+idx2,fmt+p1,va_arg(arglist,short int));
else{ /* c=='f' */
sprintf(buf+idx2,fmt+p1,va_arg(arglist,double));
}
fmt[idx1+1]=c1;
idx2+=len;
state=0;
}
else if( c=='l' ) state=5;
else if( c=='s' ){
pc=va_arg(arglist,char*);
CopyChnStr(pc, len);
len = strlen(pc);
mstrcpy(len,pc,buf+idx2);
idx2+=len;
state=0;
}
else if(c=='h') state=2;
else return(-1);
break;
case 3: /* '%'<num>'.'^ */
if('0'<=c && c<='9') state=4;
else return(-1);
break;
case 4: /* '%'<num>'.'<num>^ */
if( '0'<=c && c<='9' ) state=4;
else if( c=='f' ){
c1=fmt[idx1+1];
fmt[idx1+1]=0;
sprintf(buf+idx2,fmt+p1,va_arg(arglist,double));
fmt[idx1+1]=c1;
idx2+=len;
state=0;
}
else if( c=='l' ) state=6;
else return(-1);
break;
case 5: /* '%'<num>'l'^ */
if( c=='f' || c=='d' ){
c1=fmt[idx1+1];
fmt[idx1+1]=0;
if( c=='f' ) sprintf(buf+idx2,fmt+p1,va_arg(arglist,double));
else /* c=='d' */ sprintf(buf+idx2,fmt+p1,va_arg(arglist,long));
fmt[idx1+1]=c1;
idx2+=len;
state=0;
}
else return(-1);
break;
case 6: /* '%'<num>'.'<num>'l'^ */
if( c=='f' ){
c1=fmt[idx1+1];
fmt[idx1+1]='\0';
sprintf(buf+idx2,fmt+p1,va_arg(arglist,double));
fmt[idx1+1]=c1;
idx2+=len;
state=0;
}
else return(-1);
break;
}/*end switch*/
idx1++;
} /*end while*/
buf[idx2]='\0';
strcpy(str,buf);
va_end(arglist);
return(0);
}
/* end of fmtext.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -