📄 cyhs.c
字号:
#define OK 1#define YES 1#define NO 0#define ABS(x) ((x)>0 ? (x) : -(x))/*//////////////////////////////////////////////////////////////// 一组对屏幕确认结果进行处理的函数, 可以对屏幕上的给出确认 //// 回答的问题返回'1', 其它回答返回'0'. 同时程序中接收调用程 //// 序的提示信息. ////////////////////////////////////////////////////////////////*/quest(x,y,QuestStr)int x,y;char *QuestStr;{ char c,k; char buf[80]; MV(x,y); sprintf(buf,"\07%s吗? (Y/N):[ ]\n",QuestStr); write(1,buf,strlen(buf)); k = y+strlen(buf)-4; MV(x,k); read(0,&c,1); write(1,&c,1); while(!isin(c,"YyNn01")){ bell(1); MV(x,k); read(0,&c,1); write(1,&c,1); } switch(c){ case '1': case 'y': case 'Y': return(OK); case '0': case 'n': case 'N': case '\0': return(NO); default : bell(1); return(NO); }}NField(inStr, FiledChar, Num, outStr)char *inStr, FiledChar, *outStr;int Num;{ while( *inStr && Num ){ *outStr ++ = *inStr ++; if(*inStr==FiledChar) Num --; } *outStr ++= FiledChar; *outStr ='\0'; return 0;}field(N,inS,outS,FleldChar)int N;char FleldChar,inS[],outS[];{ int i,j,MaxN; i=j=MaxN=0; while(inS[i] && inS[i]!='\n'){ if(inS[i]==FleldChar)MaxN++; i++; } /* 计算inS的字段总数 */ if(N>MaxN){ outS[0]=0; return(0); } /* 对输入字段个数N值进行判断 */ i=0; while(N && inS[i] && inS[i]!='\n' ){ if(inS[i]==FleldChar)N--; i++; } /* 计算第N个字段在inS中的开始位置 */ while(inS[i] && inS[i]!=FleldChar && inS[i]!='\n' ) outS[j++]=inS[i++]; outS[j]=0; /* 从inS中取出第N个字段存放于outS中 */ return(j); /* 返回当前字段的长度 */}/* 将buf中的内容分解, 存放在SubStr子字符串中, 由一个输入字符串可以得到 一组数据分解结果, 程序在使用的时候, 必须传入该字符串数组的最大存 储空间, 这时系统进行工作的一个前提. */SplitBUF(buf, SubStr, dimch, Maxnu, Maxlen)char *buf, *SubStr, dimch;int Maxnu, Maxlen;{ int pdn, pc; /* pdn--当前成功转换的字符串的位置数, pc--在一个输出字符串中的位置值. */ pc=pdn=0; while( *buf && *buf != '\n' && pdn < Maxnu ){ if(*buf== dimch) { SubStr[Maxlen*pdn + pc]='\0'; pdn ++; pc=0; } else { SubStr[Maxlen*pdn +pc] = *buf; pc++; } buf ++; } for(; pdn < Maxnu ; pdn++) SubStr[Maxlen*pdn]='\0';}/*********************************************************************// 对文件Fname进行处理, 在in1位置搜索字符串inS, 在确认搜索成功的时候,// 将in2位置的字符串输出到outS中, 是一个可以对文件进行智能化处理的函数.// 每次进行数据处理时, 函数所需要处理的inS字段需要是文件中的一个索引// 字段, 如果进行处理的字段比较多, 就需要保持文件中有多个inS索引, 而// 输出结果字段outS可以在行的任意位置, 这是一个使用灵活的数据搜索函数.// 其中chs 是程序在进行数据处理时的数据分割符号.*********************************************************************/Find_NVal(Fname, in1, inS, in2, outS, chs)char *Fname, *inS, *outS, chs;int in1, in2;{ FILE *fp; int flag=0, len; char buf[128], str[4][32]; len = strlen(inS); fp = fopen(Fname, "r"); if(fp==NULL) return -1; while(fgets(buf, 100, fp)){ field(in1, buf, str[1], chs); if(!strncmp(inS, str[1], len)){ field(in2, buf, outS, chs); flag = 1; break; } } fclose(fp); return flag;}/***************************************************************// 一些需要与ESQL/C 混合编程的函数,需要与ESQL语言连接编译。// 可以对一个字符串的尾部空格进行处理的程序。****************************************************************/trim(Str)char Str[];{ int len; len=strlen(Str); while (len>0 && Str[len-1]==' ') --len; Str[len]='\0'; return(strlen(Str));}isin(c, Str)char c, *Str;/*// isin() 可以判断一个字符在一个字符串中的存在性.// 如果字符存在程序返回1, 否则返回0.*/{ while(*Str){ if(c==*Str)return(YES); Str++; } return(NO);}/* 判断一个字符串中的那个字符在另一个参考串中存在. */ISstrin(str, buf)char *str, *buf;{ while(*str){ if(isin(*str, buf)) return(YES); str ++; } return(NO);}/*// ////////////////////////////////////////////////// 一组屏幕处理的函数, 这组函数可以完成各种屏幕 //// 任务的处理工作. //// ////////////////////////////////////////////////*/SBR(){ char buf[32]; sprintf(buf, "\033[7m"); write(1, buf, strlen(buf)); fflush(stdout);}/*// 开始反显处理.*/CBR(){ char buf[32]; sprintf(buf, "\033[0m"); write(1,buf, strlen(buf)); fflush(stdout);}/*// 结束反显处理.*//*// 鸣笛N秒函数, 可以根据用户的需要持续在终端上鸣笛.*/bell(n)int n;{ while(n-- >0 )write(1,"\07",1); fflush(stdout); return 0;}/*// 终端屏幕清理函数, 可以将屏幕上的显示内容清理, 同时将// 光标移动在屏幕的最左上角.*/clean(){ char buf[32]; strcpy(buf, "\033[2J\n\033[1;1H"); write(1, buf, strlen(buf)); fflush(stdout); return 0;}clswin(x)int x;/*// 从指定的光标位置X 一致清理到屏幕的底部.*/{ MV(x,1); printf("\033[0J\n"); fflush(stdout); return(0);}/*// 连续清理屏幕上的X行到Y行, 程序中主要使用了行清理函数.*/Clear_line(X,Y)int X, Y;{ int ln; for(ln=X; ln<=Y; Cline(ln), ln++); fflush(stdout); return 0;}/*// 光标定位函数, 可以迅速确定光标在屏幕上的位置*/mv(x, y)int x, y;{ printf("\033[%d;%dH",x,y); fflush(stdout); return 0;}/*// 使用写屏技术在屏幕上迅速定位.*/MV(x, y)int x, y;{ char buf[32]; sprintf(buf,"\033[%d;%dH",x,y); write(1,buf,strlen(buf)); fflush(stdout); return 0;}/*// 在屏幕上格式化显示一组数据.*/mvs(x,y,format,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10)int x,y;char *format;char *s1,*s2,*s3,*s4,*s5,*s6,*s7,*s8,*s9,*s10;{ char Strings[256]; MV(x,y); sprintf(Strings,format,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10); write(1,Strings,strlen(Strings)); fflush(stdout); return(0);}cline(x) int x;/* 对屏幕上的第X行进行清理函数 */{ MV(x,1);printf("\033[2K"); fflush(stdout); return(0);}Cline(X)int X;{ MV(X,1); printf("%79s", ""); fflush(stdout);}StrNCpy(Str1,Str2,Num)char *Str1,*Str2;int Num;/* 将Str2的前Num位拷贝到Str1中 */{ int chnum; chnum=0; while(*Str2 && chnum < Num) {*Str1++ = *Str2++; chnum++;} while(Num-- > chnum) *Str1++ = ' '; *Str1=0; return(chnum);}/* 获得中创软件的软件序列号,可以得到软件的13位加密字 */Get_CVICserial(Fname, ser)char *ser, *Fname;{ FILE *fp; char buf[100], Pdir[80]; int fg=0; *ser='\0'; sprintf(Pdir,"/usr/%s", Fname); fp=fopen(Pdir, "r"); if(fp==NULL) return(fg); while(fgets(buf, 80, fp)){ if(!strncmp(buf,"SERIAL", 6)){ strcpy(ser, buf+7); fg=1; } } fclose(fp); return(fg);}/* 根据软件序列号制作加密控制字 */CHpassWD(in, code)char *in, *code;{ int k, l; char Str[6][32]; StrNCpy(Str[0], in, 13); StrNCpy(Str[1], "ljmsoft.comCN",13); k=0; while(k<13){ code[k] = Str[0][k] & Str[1][k]; k++; } code[k]='\0'; return(0);}CHuserPasswd(ScodeF, codeF, fg )int fg;char *ScodeF, *codeF;{ switch(fg){ case 1: /* 检查一个用户的加密控制字 */ { char serial[16], calcode[16], incode[16]; Get_CVICserial(ScodeF, serial); CHpassWD(serial, calcode); printf("\n%10s请输入用户加密码:"); scanf("%s", incode); return(strncmp(calcode, incode, 13)); } break; case 2: /* 对一个老用户进行合法性判断 */ { char serial[16], syscode[16], calcode[16]; FILE *fp; fp=fopen(codeF, "r"); if(fp==NULL){ return(-1); } else { fgets(syscode,15, fp); fclose(fp); Get_CVICserial(ScodeF, serial); CHpassWD(serial, calcode); return( strncmp(syscode, calcode, 13)); } } break; case 3: /* 对新用户进行加密处理 */ { char serial[16], calcode[16], incode[16]; Get_CVICserial(ScodeF, serial); CHpassWD(serial, calcode); printf("\n%10s请输入用户加密码:"); scanf("%s", incode); if(!strncmp(calcode, incode, 13)){ FILE *fp; fp=fopen(codeF, "w"); fprintf(fp, calcode); fclose(fp); } } break; }} /*//////////////////////////////////////////////////////////////////////// 一组对浮点数据进行打印处理的函数, 可以对接收的数据进行格式化处理.// 根据中国帐务处理要求, 浮点数一般需要每3位加一个分节号, 小数位保留// 2位, 本组函数就是为了实现这些功能的.//////////////////////////////////////////////////////////////////////*//* ************************************************************************** 浮点数处理函数,本程序可以对一个浮点数进行加工,以字符串的形式输出,可以按 照要求对一个浮点数加分节符,对于一个非常小的数据可以输出一个空白。* **************************************************************************//* ************************************************************************** prmny可以对一个浮点数按照三位分节处理,对于一个小于0.01的数据,输出一空白。 1234567.00--》1,234,567.00 程序可以对货币型数据(informix)进行处理。* **************************************************************************/prmny( Val, str)double Val;char *str;{ int i, len, l; char Str[50], buf[50]; str[0]=0; if(ABS(Val)<0.001) { strcpy(str, " "); return(0); } if(Val<0 ) sprintf(str,"━"); sprintf(buf,"%.2f", ABS(Val)/100 ); /* // 对输入的负数进行特别的处理, 显示的负号特别显眼. */ len=strlen(buf); i=l=0; if(len <7){ strcat(str, buf); return(len); } while(len){ Str[l++] = buf[i++]; if((len-6)%3==1 && len >=6 ) Str[l++] =','; len --; } Str[l++] = 0; if(Str[0]==',') Str[0]=' '; strcat(str, Str); return(strlen(str));}/* ************************************************************************** 本程序是对prmny功能的加强,可以处理任意的浮点数据,加入的分节符也可以任意指 定,程序对于一个非常小的数据输出为空白。 * **************************************************************************/Prndub(val, str, n)double val;char *str;int n;{ int i,j,len; char buf[100]; if(ABS(val)<0.00001) { strcpy( str, " "); return(0); } sprintf(buf,"%lf",val); i=j=len=0; i=strlen(buf); for(;buf[j]!='.';j++); if(val >=0 ){ if(j <=n ){strcpy(str,buf); return(strlen(str));} while(i){ *str++ = buf[len]; if( (j-n)%n==1 && j >=n && isdigit(buf[len-1]) ) *str++ = ','; i--; len++; j--; } *str++ = 0; return(strlen(str)); } else { if(j <=n+1 ){strcpy(str,buf); return(strlen(str));} while(i){ *str++ =buf[len]; if((j-n)%n ==1 && j >=n && isdigit(buf[len-1]) )*str++ =','; i--;j--; len++; } *str++ = 0; return(strlen(str)); }}/* 绿卡数据中户名转化程序,本程序可以将一个储蓄前台数据库中的一些 不符合绿卡规范的户名转化为规范的户名。如‘会 &&774$3#计’=‘会计’。*/CHanges_Name(in, out)char *in, *out;{ int kec; while(*in){ kec = *in & 0x0000ffff; if( kec > 0xffa0) *out ++ = *in; in ++; } *out = '\0';}/* 将一个内部格式的时间设置为一个yyyymmdd格式的日期 */Trans_RIQI(dy, str)long dy;char *str;{ static char datefmt[]="yyyymmdd"; rfmtdate(dy, datefmt, str); return(0); /*************************************** short int ymd[3]; rjulmdy(dy, ymd); sprintf(str,"%04d%02d%02d", ymd[2], ymd[0], ymd[1]); return(0); 本函数也可以使用日期的数组分解方式来实现。日期数组分解的格式为 月、日、年,如果需要按照年月日格式输出,需要进行调整。 ***************************************/}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -