📄 cb_dicprivate.c
字号:
*pe++ = '\n'; e_off++; }else{ //*pp++ = convert_yb(']'); *pp++ = ']'; p_off++; *pp = 0; } i++; *brace_flag=FALSE; } }else if(ch==0x02){//解释标志 (*Expl_Sn)++; //expl ++ *SubExpl_Sn=0; //sun expl reset to 0 *pe++ = '\n'; e_off++; i++; *brace_flag=FALSE; sn_num=get_expl_sn(*Expl_Sn); *pe++ = (BYTE)((sn_num>>8)&0x00ff); e_off++; *pe++ = (BYTE)(sn_num&0x00ff); e_off++; *pe++ = ' '; e_off++; }else if(ch==0x05){//词性标志 *pe++ = '\n'; e_off++; i++; *brace_flag=FALSE; *Expl_Sn=0; *SubExpl_Sn=0; }else if(ch==0x06){//sub解释标志 (*SubExpl_Sn)++; *pe++ = '\n'; e_off++; i++; *brace_flag = FALSE; sn_num = get_subexpl_sn(*SubExpl_Sn); *pe++ = (BYTE)((sn_num>>8)&0x00ff); e_off++; *pe++ = (BYTE)(sn_num&0x00ff); e_off++; }else if(ch== 0x07){//特征标志 *pe++ = '\n'; e_off++; i++; *brace_flag=FALSE; }else{ if(*brace_flag==TRUE){ //音标内容 //ch=convert_yb(ch); if(*YinBiao_Sn>1){ *pe++ = convert_yb( ch ); e_off++; }else{ *pp++ = convert_yb( ch ); p_off++; } }else{ //下面就是普通的单词字母了 //解释 if(*YinBiao_Sn>0){ if( check_spechar(ch,*(code_data_buf+i+1))){//带帽子的字幕 //下周问lili,看怎么显示 }else{ *pe++ = ch; e_off++; } //单词 }else{ if( check_spechar(ch,*(code_data_buf+i+1))){//带帽子的字幕 //下周问lili,看怎么显示 }else{ *pw++ = ch; w_off++; } } } i++; } } *pw = 0; *pp = 0; *pe = 0; *off_w = w_off; *off_p = p_off; *off_e = e_off; return FALSE;}int new_get_code(BQ_Init_t *base_info,BYTE *buffer,BOOL *half_part_flag,LONG *code_offset,BYTE *code_data_buf){ BYTE code_buf[CODE_BUF_LEN+1]; UINT32 read_off; int i; read_off=*code_offset; for(i=0;i<=MAX_LENGTH_ONE_CODE;i++) *(code_data_buf+i)=0; code_buf[0]=*(buffer+read_off); code_buf[1]=*(buffer+read_off+1); code_buf[2]=*(buffer+read_off+2); if(*half_part_flag!=FIRST_HALF){ asl3_code_buf(code_buf); } if( (code_buf[0]&0x80)==0) { read_code_data(base_info,1,code_buf,code_data_buf); if(*half_part_flag==FIRST_HALF){ *half_part_flag=SECOND_HALF; } else { *half_part_flag=FIRST_HALF; *code_offset+=1; } return(1); } //====================================== else if( (code_buf[0]&0xc0)==0x80 ) { read_code_data(base_info,2,code_buf,code_data_buf); if(*half_part_flag==FIRST_HALF){ *half_part_flag=SECOND_HALF; *code_offset+=1; } else { *half_part_flag=FIRST_HALF; *code_offset+=2; } return(3); } //====================================== else if( (code_buf[0]&0xe0)==0xc0 ) { read_code_data(base_info,3,code_buf,code_data_buf); *code_offset+=2; return(4); } //====================================== else if( (code_buf[0]&0xf0)==0xe0 ) { read_code_data(base_info,4,code_buf,code_data_buf); if(*half_part_flag==FIRST_HALF){ *half_part_flag=SECOND_HALF; *code_offset+=2; } else{ *half_part_flag=FIRST_HALF; *code_offset+=3; } return(5); } //====================================== else if( code_buf[0]==0xf0 ) { *code_data_buf=code_buf[1]; *(code_data_buf+1)='\0'; *code_offset+=2; return(4); } //====================================== else{ asl3_code_buf(code_buf); *code_data_buf=*code_buf; *(code_data_buf+1)=*(code_buf+1); *(code_data_buf+2)='\0'; if(*half_part_flag==FIRST_HALF){ *half_part_flag=SECOND_HALF; *code_offset+=2; } else { *half_part_flag=FIRST_HALF; *code_offset+=3; } return(5); } }BOOL new_check_end(UINT Word_Length,LONG cur_off,UINT GetDataSize_Flag){ if((UINT32)cur_off>=Word_Length) return 1; if(GetDataSize_Flag==1) { if(cur_off>300){ return TRUE; } } else if(GetDataSize_Flag==2) { if(cur_off>MAX_ITEM_LEN)return TRUE; // } else{;} return FALSE;}//==============================================//由内存数组中读取例句id列表//==============================================void new_write_example_id(BQ_Init_t *base_info,BOOL *half_part_flag,UCHAR *Data_Buffer,LONG *offset, UINT *lj_id_queue,INT8 *lj_id_num){ BYTE id_byte[3]; UINT example_id; FILE *data_fp; data_fp=base_info->fp; if(*half_part_flag){ *half_part_flag=0; *offset+=1; } id_byte[0]=*(Data_Buffer+*offset); id_byte[1]=*(Data_Buffer+*offset+1); id_byte[2]=*(Data_Buffer+*offset+2); *offset+=3; example_id=(UINT)id_byte[2]*256*256+(UINT)id_byte[1]*256+(UINT)id_byte[0]; *(lj_id_queue + *lj_id_num)=example_id; *lj_id_num +=1;}//+***************************************************************************//+ Function: get the word item, phonetic and expain data,example id,saved//+ their data in their relevant buffer//+ Input: base_info: initliazed data structure//+ cur_id://+ GetDataSize_Flag 0 all word data//+ 1 part data//+ 2 only item// fancha_flag 反查状态的标志,// ==0则非反查,输出"例"图标; // ==1则反查浏览得解释解压。不要例句//+ Output: word_detail->expl,word_detail->phone,word_detail->data.word//+ //+ retrun://+ Destroy://+ Note: Synopsys:New_Get_Data(...);//+***************************************************************************void cbp_get_word_data(BQ_Init_t *base_info,UINT cur_id,UINT GetDataSize_Flag, CB_WORD_DETAIL* word_detail,INT fancha_flag){ UINT16 Word_Length; UINT Syntax_Icon; UINT Syntax_ID; BYTE code_data_buf[MAX_LENGTH_ONE_CODE+1]; BOOL brace_flag=FALSE; int i; BYTE CatchBuffer[BUFFER_SIZE]; UINT out_data_off,w_off,p_off,e_off; BOOL have_lj_flag; BOOL half_part_flag; LONG word_data_offset; LONG expl_data_offset; UINT Expl_sn,SubExpl_sn,YinBiao_sn; word_detail->lj_id_num=0; if(cur_id > base_info->last_word_id)return; word_data_offset=get_addr_from_id(base_info,cur_id); Syntax_Icon=0; Word_Length=0; fseek(base_info->fp,word_data_offset,SEEK_SET); fread((UCHAR *)&Word_Length,DATA_LEN_SIZE,1,base_info->fp); fseek(base_info->fp,word_data_offset,SEEK_SET); //read the all record data to CatchBuffer fread((BYTE*)CatchBuffer,1,Word_Length,base_info->fp); expl_data_offset=2; Syntax_Icon=CatchBuffer[expl_data_offset]; expl_data_offset++; if(Syntax_Icon){ Syntax_ID=CatchBuffer[expl_data_offset]+256*CatchBuffer[expl_data_offset+1]+ 256*256*CatchBuffer[expl_data_offset+2] ; expl_data_offset+=SYNTAX_ID_SIZE; }else{ Syntax_ID=0xffffffff; } for(i=0;i<LJ_QUEUE_SIZE;i++) *(word_detail->lj_id_queue+i)=0xffffffff; half_part_flag=FIRST_HALF; out_data_off=0; w_off = 0; p_off = 0; e_off = 0; YinBiao_sn=0; Expl_sn=0; SubExpl_sn=0; while(out_data_off<=MAX_BQDATA_LEN){ new_get_code(base_info,CatchBuffer,&half_part_flag,&expl_data_offset,code_data_buf); if(fancha_flag==0) have_lj_flag=write_data_buf(word_detail,&w_off,&p_off,&e_off,code_data_buf,&brace_flag,&Expl_sn,&SubExpl_sn,&YinBiao_sn,1); else have_lj_flag=write_data_buf(word_detail,&w_off,&p_off,&e_off,code_data_buf,&brace_flag,&Expl_sn,&SubExpl_sn,&YinBiao_sn,0); out_data_off = w_off + p_off + e_off; if(have_lj_flag==TRUE){ new_write_example_id(base_info,&half_part_flag,CatchBuffer,&expl_data_offset,word_detail->lj_id_queue,&word_detail->lj_id_num); } if(new_check_end(Word_Length,expl_data_offset,GetDataSize_Flag)==TRUE)break; }}//***************************************************//由例句ID拿到例句的存储位置信息//input : bq_base_info// example_id//return :the offset of example sentance offset in file//***************************************************LONG cbp_get_ljaddr_from_id(BQ_Init_t* base_info,UINT example_id){ UINT id_temp; LONG data_offset; UINT16 data_len; UINT32 id_index_unit; FILE *dict_fp; dict_fp=base_info->fp; id_temp=example_id/128; data_offset=(LONG)(id_temp*PHY_INDEX_LEN+base_info->EXAMPLE_INDEX_OFFSET); fseek(dict_fp,data_offset,SEEK_SET); id_index_unit=0; fread(&id_index_unit,sizeof(UINT32),1,dict_fp); data_offset=(LONG)id_index_unit; id_temp=example_id%128; while(id_temp){ fseek(dict_fp,data_offset,SEEK_SET); data_len=0; fread(&data_len,sizeof(UINT16),1,dict_fp); data_offset=(LONG)data_len+data_offset; id_temp--; } return data_offset; }//+******************************************//+ function name :write_lj_data//+ Function: 将code_data_buf中解出来的数据追加到out_data_buf中out_data_off偏移位置//+ Input: //+ code_data_buf//+ return: FALSE--=no liju ; TRUE have_liju//+ Output: output_off //+ output_buf//+ Destroy://+******************************************void write_lj_data(UCHAR *output_buf,UINT *output_off,UCHAR *code_buf) { UINT off; UCHAR ch; UCHAR ch2; int i=0; off=*output_off; while(i<=MAX_LENGTH_ONE_CODE){ ch=*(code_buf+i); if(off==0){ *(output_buf+off)=LJ_ICON_1; off++; *(output_buf+off)=LJ_ICON_2; off++; *(output_buf+off)=LJ_ICON_3; off++; } else if(ch==0) { break; } else if(ch==0x03) {#if 0 *(output_buf+off)='<'; off++; *(output_buf+off)='T'; off++;#endif *(output_buf+off)='\n'; off++; i++; *(output_buf+off)=LJ_ICON_1; off++; *(output_buf+off)=LJ_ICON_2; off++; *(output_buf+off)=LJ_ICON_3; off++; *(output_buf+off)=0; *output_off=off; i++; } else{ //特殊字符如何显示 if(check_spechar(ch,*(code_buf+i+1)) ) { *(output_buf+off)='<'; off++; *(output_buf+off)='W'; off++; *(output_buf+off)='>'; off++; i++; ch2=*(code_buf+i); *(output_buf+off)=convert_spechar(ch,ch2); off++; *(output_buf+off)='<'; off++; *(output_buf+off)='N'; off++; *(output_buf+off)='>'; } else{ *(output_buf+off)=ch; } i++; off++; } } *(output_buf+off)=0; *output_off=off;}//+******************************************//+ function name :comm_Get_data//+ Function: decode function //现在只给例句用,//+ Input: base_info//+ data_Addr 数据CODE 地址//+ output_buf//+ output : output_buf//+ retrun://+ Destroy://+ Note://+******************************************void cbp_comm_get_data(BQ_Init_t* base_info,LONG data_fp_off, UINT word_length,BYTE *output_buf){ BOOL half_part_flag=FIRST_HALF; BYTE code_data_buf[MAX_LENGTH_ONE_CODE+1]; ULONG comm_data_fp_off=data_fp_off; ULONG start_off; UINT output_off; start_off=data_fp_off; *output_buf=0; output_off=0; while(strlen(output_buf)<1500){ get_code(base_info,&half_part_flag,&comm_data_fp_off,code_data_buf); strcat(output_buf,code_data_buf); write_lj_data(output_buf,&output_off,code_data_buf); if( (comm_data_fp_off-start_off)>= word_length){ break; } if(code_data_buf[0]==0){ break; } }}#pragma far_pic_off#pragma far_pid_off
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -