/* * ===================================================================================== * * Filename: dict_idx.c * * Description: * * Version: 1.0 * Created: 2011年02月17日 00时15分39秒 * Revision: none * Compiler: gcc * * Author: 齐保元 (qby), qibaoyuan@126.com * Company: ict,gucas * * ===================================================================================== */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "dict_info.h" #include "dict_idx.h" static void* get_words(char* filename,DICT_INFO* dict_info,WORD_IDX* word_idx) { FILE* fd=fopen(filename,"rb"); size_t nread=0; if(NULL==fd || dict_info==NULL) { return NULL; } unsigned char buffer[dict_info->idx_file_size]; nread=fread(buffer,dict_info->idx_file_size,1,fd); unsigned char *head,*tail; head=tail=buffer; int it=0; int total=1; for(;it<dict_info->idx_file_size;it++) { if(*head=='/0') { strncpy((word_idx+total)->word,tail,head-tail+1); (word_idx+total)->offset=to_int(head+1); (word_idx+total)->length=to_int(head+5); total++; head+=9; tail=head; if(total==dict_info->word_count) break; }else{ head++; continue; } } } inline static int to_int(unsigned char* from_int) { return *(from_int+3)+(*(from_int+2)<<8)+(*(from_int+1)<<16)+(*from_int<<24); } WORD_IDX* get_idx(char* word,WORD_IDX *word_idx,DICT_INFO *dict_info) { if(word==NULL || word_idx==NULL || dict_info==NULL) { return NULL; } int head=0,tail=dict_info->word_count; int mid; int i=0; while(head<tail-1) { mid=(head+tail)>>1; int cmp=strcasecmp(word,word_idx[mid].word); if(0==cmp) { return &word_idx[mid]; }else if(0>cmp){ tail=mid; }else{ head=mid; } } return NULL; } #ifdef DEBUG int main(int argc,char** argv) { char* ifo_name="/home/qibaoyuan/source/stardict-21shijishuangxiangcidian-2.4.2/21shijishuangxiangcidian.ifo"; char* idx_name="/home/qibaoyuan/source/stardict-21shijishuangxiangcidian-2.4.2/21shijishuangxiangcidian.idx"; char* dict_name="/home/qibaoyuan/source/stardict-21shijishuangxiangcidian-2.4.2/21shijishuangxiangcidian.dict"; DICT_INFO* dict_info; dict_info=get_dict_info(ifo_name); WORD_IDX* idx=(WORD_IDX*)malloc(sizeof(WORD_IDX)*dict_info->word_count); get_words(idx_name,dict_info,idx); WORD_IDX* word=get_idx(argv[1],idx,dict_info); if(word==NULL){ printf("<NULL>/n"); exit(0); } printf("%s,%d,%d/n",word->word,word->offset,word->length); FILE* dict=fopen(dict_name,"r"); if(NULL==dict) { printf("dict error!/n"); return EXIT_FAILURE; } if(0!=fseek(dict,word->offset,SEEK_SET)) { printf("seek error/n"); return EXIT_FAILURE; } char explain[word->length+1]; memset(explain,'/0',word->length+1); fread(explain,word->length,1,dict); printf("%s/n",explain); free(idx); return EXIT_SUCCESS; } #endif /* * ===================================================================================== * * Filename: dict_idx.h * * Description: * * Version: 1.0 * Created: 2011年02月17日 00时10分38秒 * Revision: none * Compiler: gcc * * Author: 齐保元 (qby), qibaoyuan@126.com * Company: ict,gucas * * ===================================================================================== */ #ifndef __DICT_IDX_H__ #define __DICT_IDX_H__ #include "dict_info.h" #define DEBUG #define TRUE 1 #define IDX_EXT "idx" typedef struct { char word[100]; int offset; int length; }WORD_IDX; static void* get_words(char* filename,DICT_INFO* dict_info,WORD_IDX* word_idx); WORD_IDX *get_idx(char* word,WORD_IDX* word_idx,DICT_INFO* dict_info); inline static int to_int(unsigned char* from_int); #endif /* * ===================================================================================== * * Filename: dict_info.c * * Description: * * Version: 1.0 * Created: 2011年02月16日 23时33分45秒 * Revision: none * Compiler: gcc * * Author: 齐保元 (qby), qibaoyuan@126.com * Company: ict,gucas * * ===================================================================================== */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include "dict_info.h" DICT_INFO* get_dict_info(char* info_file) { FILE* ifo; char* line; char buffer[BUFFER_SIZE]; DICT_INFO* dict_info=(DICT_INFO*)malloc(sizeof(DICT_INFO)); memset(dict_info->version,0,100); memset(dict_info->book_name,0,100); memset(dict_info->same_type_per_seq,0,10); memset(dict_info->other_info,0,1000); ifo=fopen(info_file,"r"); if(NULL==ifo){ fprintf(stderr,"%s",strerror(errno)); return NULL; } while((line=fgets(buffer,BUFFER_SIZE,ifo))!=NULL){ parse_line(line,dict_info); } fclose(ifo); return dict_info; } static void parse_line(char* line,DICT_INFO *dict_info){ char* idx; if((idx=strchr(line,'='))!=NULL){ if(strstr(line,"version")!=NULL){ strcpy(dict_info->version,idx+1); }else if(strstr(line,"wordcount")!=NULL){ dict_info->word_count=atoi(idx+1); }else if(strstr(line,"idxfilesize")!=NULL){ dict_info->idx_file_size=atoi(idx+1); }else if(strstr(line,"bookname")!=NULL){ strcpy(dict_info->book_name,idx+1); }else if(strstr(line,"sametypesequence")!=NULL){ strcpy(dict_info->same_type_per_seq,idx+1); }else strcat(dict_info->other_info,line); } } /* * ===================================================================================== * * Filename: dict_info.h * * Description: * * Version: 1.0 * Created: 2011年02月16日 23时28分05秒 * Revision: none * Compiler: gcc * * Author: 齐保元 (qby), qibaoyuan@126.com * Company: ict,gucas * * ===================================================================================== */ #ifndef __DICT_INFO_H__ #define __DICT_INFO_H__ #define DEBUG #define BUFFER_SIZE 500 #define IFO_EXT ".ifo" typedef struct{ char version[100];//版本 int word_count;//单词数量 int idx_file_size;//索引文件大小 char book_name[100];//词典名称 char same_type_per_seq[10]; char other_info[1000]; }DICT_INFO; DICT_INFO* get_dict_info(char* line); static void parse_line(char* line,DICT_INFO* dict_info); #endif /* * ===================================================================================== * * Filename: test_dict_info.c * * Description: * * Version: 1.0 * Created: 2011年02月17日 00时54分02秒 * Revision: none * Compiler: gcc * * Author: 齐保元 (qby), qibaoyuan@126.com * Company: ict,gucas * * ===================================================================================== */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include "dict_info.h" #ifdef DEBUG int main(int argc,char**argv){ DICT_INFO* dict=get_dict_info("/home/qibaoyuan/source/stardict-21shijishuangxiangcidian-2.4.2/21shijishuangxiangcidian.ifo"); if(dict==NULL) { printf("error/n"); exit(EXIT_FAILURE); } printf("version:%s/n",dict->version); printf("bookname:%s/n",dict->book_name); printf("wordcount:%d/n",dict->word_count); printf("idxfilesize:%d/n",dict->idx_file_size); printf("sts:%s/n",dict->same_type_per_seq); printf("%s",dict->other_info); free(dict); return EXIT_SUCCESS; } #endif