📄 wb5.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <graphics.h>
#include <math.h>
#include <conio.h>
#include <string.h>
#define NG 1
#define OK 0
#define BCD unsigned char
#define CHR unsigned char
#define INT unsigned int
#define PTR long
FILE *stream_father;
FILE *stream_son;
FILE *stream_sonx;
PTR hz_search(BCD *cd, long cnt, PTR *tpt);
void read_rec(CHR *buf,long pt);
int nf_bcdcmp(BCD *pd, BCD *ps, int n);
long filesize(FILE *stream)
{
long curpos, length;
curpos = ftell(stream);
fseek(stream, 0L, SEEK_END);
length = ftell(stream);
fseek(stream, curpos, SEEK_SET);
return length;
}
/*这时一个测试程序DOS下, 输入ffff可退出*/
void main(void)
{
long fl;
long rec_max;
int r;
PTR x;
CHR c;
CHR ibf[4];
CHR data[6];
CHR hz[3];
stream_son = fopen("winwb98.bin","rb");
if(stream_son==NULL)
{
printf("Error: winwb98.bin not find! \n");
return;
}
fl=filesize(stream_son);
rec_max=fl/6;
while(1)
{
scanf("%4s", ibf);
for(r=0;r<4;r++)
{
if(ibf[r]==0)
{
for(;r<4;r++) ibf[r]=' ';
}
}
c=ibf[0];
ibf[0]=ibf[3];
ibf[3]=c;
c=ibf[1];
ibf[1]=ibf[2];
ibf[2]=c; //reverse
//if "ffff" exit
if(ibf[0]=='f' && ibf[1]=='f' && ibf[2]=='f' && ibf[3]=='f') break;
r=hz_search(ibf,rec_max,&x);
if(r==OK)
{
read_rec(data,x*6);
hz[0]=data[4];
hz[1]=data[5];
hz[2]='\0';
printf("\n%s",hz);
}
else
{
printf("not find!\n");
}
}
fclose(stream_son);
}
/********************************************************************
HZ search
BCD *cd HZ code
int cnt HZ total nunber
PTR *tpt set number
< return > FFFF:not find
* :pointer
*********************************************************************/
PTR hz_search(BCD *cd, long cnt, PTR *tpt)
{
CHR buf_p[6];
CHR buf_pp[6];
long pp,p;
long len;
long i, r;
*tpt=0;
p=0;
len=cnt;
while(1){
if(len<10){ /* last 10 ? */
r=NG;
for(i=len;i>0;i--){
read_rec(buf_p,p);
if(nf_bcdcmp(cd,buf_p,4)==0){ /* code match ? */
r=OK;
break;
}
p+=6; /* table++ */
*tpt+=1;
}
break;
}
i=len%2;
len/=2; /* search area 1/2 */
pp=p+len*6;
read_rec(buf_p,pp);
r=nf_bcdcmp(cd,buf_p,4);
if (r==0){ /* search code(cd) = table code(pp) */
r=OK;
p=pp;
*tpt+=len;
break;
}
else if(r==1){ /* search code(cd) > table code(pp) */
p=pp;
*tpt+=len;
len+=i;
}
}
if(r==OK){
}
else{
r=0xFFFF;
}
return r;
}
void read_rec(CHR *buf,long pt)
{
INT i;
CHR c;
fseek(stream_son, pt, SEEK_SET);
for(i=0;i<6;i++)
{
c=fgetc(stream_son);
buf[i]=c;
}
}
/****************************************
BCD compare(near & far data)
BCD *pd
BCD far *ps
return pd>ps 1
pd<ps 2
pd=ps 0
****************************************/
int nf_bcdcmp(BCD *pd, BCD *ps, int n)
{
for(;n>0;n--){
if(*(pd+n-1)>*(ps+n-1)) return 1;
if(*(pd+n-1)<*(ps+n-1)) return 2;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -