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

📄 shift.c

📁 C语言写的报文转换程序
💻 C
字号:
/**************************************** **filename:shift_data.c **used for:transfering data style ** ** **author:Zeng Yantao曾衍涛 **date:2006.6.28 **developed under SuSE linux OS. *****************************************/#include <string.h>#include <stdio.h>#include <stdlib.h>#include "commcont.h"#include "comm_tb.h"#include "up_data.h"#include "dw_data.h"//#define DEF_DATA/*#ifndef DEF_DATA#define DEF_DATAtypedef struct{    char FDID[21];    int FDLI;    char FDVL[61];    int FDLN;    int GTTP;  int CVTP;//only 0 or 1 is legal.0 is the default value.  char PREF[21];//prefix,ended with '\0';if CVTP==0,  only PREF[0] is used.examples: " ","0","086","138",.....  char SUFF[21];//suffix.similar with prefix.  int DECS;// for checking the size of decimal bit.0 stands for none.-1 if no need of checking.for normal use it should be valued >0.  int OFFS;//useful only if CVTP==0.}UP_DATA,DW_DATA;*//**********************************************以上数据结构在数据表中有相应表示,此处使用以下几个域:**FDVL:数据的存储空间,对于dw_DATA**FDLN:FDVL中有效数据的长度**GTTP:=0表示无预设值;=1表示有预设值,此时shift_data函数将直接返回,不做任何转换。**CVTP:=0表示需要进行数值的单位、精度转换,并且前缀或后缀的填充方式为单个字符重复填充;=1表示字符串型,填充方式为串连接,不进行数值转换。**PREF:前缀。形式为以'\0'结束的字符串。**SUFF:后缀。其他同上。**DECS:小数位数。=0表示舍去小数位,>0表示固定的小数位数,<0表示小数位数可变**OFFS:数值型数据的计量单位。例如,如果0表示以元为单位,那么,2表示以分为单位,-5表示以万元为单位。*********************************************///#endifstatic char *shift_digit(UP_DATA *data_from, DW_DATA *data_to);static int clear_fix(UP_DATA *data_from);static int add_fix(DW_DATA *data_to);extern COMM_TB sCOMM_TB;int shift_data(UP_DATA *data_from, DW_DATA *data_to){  /***********************************   **此文件中唯一的对外接口函数,传地址调用,转换结果写入*data_to结构中。所有参数指向的存储空间由调用函数负责分配。   **功能:从data_from中读取数据及其格式信息,并按照data_to中规定的格式向data_to->FDVL写入。   **依次调用clear_fix,shift_digit,add_fix函数   **clear_fix清除原数据中和格式有关的信息,包括前缀,后缀   **如果数据为数值型,调用shift_digit进行单位转换(如24.3->2430,432.33->43.233)   **add_fix函数将转换后的数据按照data_to中规定的格式写入data_to->FDVL中。   **返回值:0:成功;1,2,...,7:失败,一般为数据格式配置错误。   **返回值非零时数据转换的结果可能是不正确的。   ***********************************/    int tp;    char *mid;    int err_flag=0;        if(data_to->GTTP==1){	return 0;    }    if( clear_fix(data_from) !=0 )err_flag+=1;//get the clean values.#ifdef DEBUG    printf("%s\n",data_from->FDVL);#endif    if(tp==0){      if( ( mid = shift_digit(data_from,data_to) ) == NULL )err_flag+=2;    }#if defined DEBUG    printf( "mid-string:%serr_flag%dlength-of-mid:%d",mid,err_flag,strlen(mid) );#endif    strcpy(data_to->FDVL, mid);//no length of result has been checked here.    free(mid);    if( add_fix(data_to) != 0 )err_flag+=4;//fix the length,prefix,suffix of the finally data.    return err_flag;}static char *shift_digit(UP_DATA *data_from, DW_DATA *data_to){  //return value is a string ended with '\0',which describe the data after shift .  //the memory of return value should be freed outside the function.    int dw1, dw2, ddw;        size_t dt_len;    int suf_len;    char *dt, *dta, *dtb, *dtb_base;    char *res;    int i,j,k,afo;//j : the length of dta; k : the length of dtb;     //******************************    dw1=data_from->OFFS;    dw2=data_to->OFFS;    suf_len=data_to->DECS;    dt=data_from->FDVL;    //*********************************    dt_len=strlen(data_from->FDVL);    /********************************************      no longer any prefix or suffix data exists in FDVL,so      should not use the value of data_from->FDLN here.    */    dta=(char *)malloc( dt_len * 2);    dtb=(char *)malloc( dt_len * 2);    dtb_base=dtb;    memset(dta,'\0',dt_len*2);    memset(dtb,'\0',dt_len*2);    //dta[0]='\0';dtb[0]='\0';        for(i=0,j=0,k=0,afo=0;i<dt_len;i++){      if (dt[i]=='.' && afo==0){	afo=1;	continue;      }      else if(afo==0){	dta[j]=dt[i];	j++;	continue;      }      else{ 	/*(af==1)*/	dtb[k]=dt[i];	k++;	continue;      }    }    //************************************    ddw=dw2-dw1;        if(ddw>0){      //if dw1==0  23.4 dw2==2 ==>2340	for(i=0,afo=0;i<ddw;i++,j++,dtb++,k--){	  if(dtb=='\0')dta[j]='0';	  else	    dta[j]=*dtb;	}	dta[j]='\0';    }    else if(ddw<0){	for(i=k;i>=0;i--)dtb[i-ddw]=dtb[i];	for(i=(-ddw)-1;i>=0;i--,j--){	    dtb[i]=dta[j-1];	    dta[j-1]='\0';	}    }    else      ;    if(j==0){	dta[0]='0';	dta[1]='\0';	j=1;    }    //*********************    //if suf_len<0 , the code here should not be used.    if(suf_len>=0){      if(k<suf_len){	for(i=k;i<suf_len;i++){            dtb[i]='0';        }      }      else if(k>suf_len){	dtb[suf_len]='\0';      }      k=suf_len;    }#ifdef DEBUG	printf("dta:%s\ndtb:%s\n",dta,dtb);#endif    //*************************    res=(char *)malloc( (size_t)(j+k+1)*2 );    if(k==0)sprintf(res,"%s",dta);    if(k>0)sprintf(res,"%s.%s",dta,dtb);#ifdef DEBUG    printf("%s\n",res);#endif    if(dta!=NULL)free(dta);    if(dtb!=NULL)free(dtb_base);    return res;}static int clear_fix(UP_DATA *data_from){    char *res = (char *)malloc( data_from->FDLN+1 );    char *pref, *suff;    size_t pref_len, suff_len;    size_t src_len, res_len;    int i,j;    char *pref_index, *suff_index;    pref = data_from->PREF;    suff = data_from->SUFF;    //*********************    pref_len = ( strlen(pref) );    suff_len = ( strlen(suff) );    //************************************************    if(sCOMM_TB.UPTY[0]=='0')src_len = data_from->FDLN;    else if(sCOMM_TB.UPTY[0]=='1')src_len = strlen(data_from->FDVL);    //*****************************************    else	src_len=strlen(data_from->FDVL);//*****************    //******************************************************    //the value of i stands for the index where prefix ends .    if(data_from->CVTP==0 && pref_len>0){	for(i=0;;){	    if(data_from->FDVL[i]==pref[0]){		i++;	    }	    else		break;	}    }    else if(data_from->CVTP==1 && pref_len>0){	if( (pref_index = strstr(data_from->FDVL,pref)) !=NULL && pref_index - data_from->FDVL == 0 ){	    i=pref_len;	}    }    else	i=0;    //*******************************************    //the value of j stands for the re-index where suffix start .    if(data_from->CVTP==0 && suff_len>0){	for(j=0;;){	    if(data_from->FDVL[ src_len-j-1 ]==suff[0]){		j++;	    }	    else		break;	}    }    else if(data_from->CVTP==1 && suff_len>0){	if( (suff_index =strstr(data_from->FDVL,suff)) != NULL \	    && data_from->FDVL + src_len - suff_index == suff_len ){	    j=suff_len;	}    }    else	j=0;    res_len=src_len-i-j;    memcpy(res, data_from->FDVL+i, res_len );    res[res_len]='\0';        strcpy( data_from->FDVL, res );//the data of FDVL is transfered,without prefix or suffix.    free(res);    return 0;}static int add_fix(DW_DATA *data_to){  /*  **if the lenth of whole_data,prefix,suffix is configured wrong, the function return 1, else return 0.   **  **  */    size_t len_to, len_mid;    char *res;    char *pref, *suff;    size_t pref_len,suff_len;        int i;    int var_flag=0;    //*************************************************************    if(sCOMM_TB.DWTY[0]=='0')len_to = data_to->FDLN;    else if(sCOMM_TB.DWTY[0]=='1'){	len_to=100;	var_flag=1;    }    else{	len_to=100;	var_flag=1;    }    //*************************************************************    res = (char *)malloc(len_to * 2);    memset(res, '\0', len_to * 2);    len_mid = strlen(data_to->FDVL);        pref=data_to->PREF;    suff=data_to->SUFF;    pref_len=strlen(pref);    suff_len=strlen(suff);#ifdef DEBUG    printf("pref_len=%dsuff_len=%dtext_len=%d\nFDVL:%s\n",pref_len,suff_len,len_mid,data_to->FDVL);#endif    //*************************************add prefix    if(pref_len>0 && data_to->CVTP==1){	memcpy(res, pref, pref_len );	strcpy(res+pref_len, data_to->FDVL);     }    else if(pref_len>0 && data_to->CVTP==0 && var_flag==0){        pref_len = (i = len_to - len_mid);	for(;i>0;i--){	    res[i-1]=pref[0];	}	strcpy(res+pref_len, data_to->FDVL);    }    else{	pref_len=0;	strcpy(res, data_to->FDVL);    }#ifdef DEBUG    printf("pref_len=%dsuff_len=%dtext_len=%d\nres=%s\n",pref_len,suff_len,len_mid,res);#endif    //*************************************add suffix    if(suff_len>0 && data_to->CVTP==1){      //memcpy(data_to->FDVL, res, pref_len + len_mid );	strcpy(res + pref_len + len_mid, suff);	if(var_flag==0)strncpy(data_to->FDVL, res, len_to);	else if(var_flag==1)strcpy(data_to->FDVL,res);	if(var_flag==0 && pref_len+len_mid+suff_len != len_to){	  return 1;//configuration wrong.	}	else	  return 0;    }    else if(var_flag==0 && suff_len>0 && data_to->CVTP==0){      //memcpy(data_to->FDVL,res, pref_len+ len_mid);	suff_len = (i=len_to - len_mid - pref_len);	if(suff_len>0){	  for(;i>0;i--){	    res[pref_len + len_mid + i - 1 ]=suff[0];	  }	}	memcpy(data_to->FDVL, res, len_to);	data_to->FDVL[len_to]='\0';	if(suff_len>=0)return 0;	else return 1;//the configuration is wrong.    }    else{	strcpy(data_to->FDVL, res);#ifdef DEBUG	printf("res=%sdata_to->FDVL=%s\n",res,data_to->FDVL);#endif	return 0;    }    return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -