📄 shift.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 + -