⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmtext.c

📁 很小很全很猛地basic编译器
💻 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 + -