#include #include #include #include #include "dict.h" static FILE *fp = NULL; static int lock = 0; static char* filepath; static uint8_t* dict_md5; #ifdef CPUBIT64 #define _dict_md5_2 ((uint64_t*)dict_md5) #else #define _dict_md5_4 ((uint32_t*)dict_md5) #endif static int fill_md5() { size_t size = get_dict_size(); uint8_t* dict_buff = (uint8_t*)malloc(size); if(dict_buff) { rewind(fp); if(fread(dict_buff, size, 1, fp) == 1) { if(dict_md5) free(dict_md5); dict_md5 = md5(dict_buff, size); free(dict_buff); return 1; } else { free(dict_buff); puts("Read dict error"); return 0; } } else { puts("Allocate memory error"); return 0; } } uint32_t last_nonnull(char* p, uint32_t max_size) { if(max_size > 1) while(!p[max_size - 1]) max_size--; return max_size; } int init_dict(char* file_path) { fp = fopen(file_path, "rb+"); if(fp) { lock = LOCK_UN; filepath = file_path; return fill_md5(); } else { puts("Open dict error"); return 0; } } FILE *open_dict(int lock_type) { if(lock & LOCK_EX) return NULL; else { if(!fp) fp = fopen(filepath, "rb+"); if(fp) { lock = lock_type; fill_md5(); rewind(fp); return fp; } else { puts("Open dict error"); return NULL; } } } void close_dict() { puts("Close dict"); lock = LOCK_UN; } off_t get_dict_size() { struct stat statbuf; if(stat(filepath, &statbuf)==0) return statbuf.st_size; else return -1; } int is_md5_equal(uint8_t* digest) { #ifdef CPUBIT64 uint64_t* digest2 = (uint64_t*)digest; return (digest2[0] == _dict_md5_2[0]) && (digest2[1] == _dict_md5_2[1]); #else uint32_t* digest4 = (uint32_t*)digest; return (digest4[0] == _dict_md5_4[0]) && (digest4[1] == _dict_md5_4[1]) && (digest4[2] == _dict_md5_4[2]) && (digest4[3] == _dict_md5_4[3]); #endif }