static void convert_line(FILE *sqlfile, char *word, char *meaning) { my_strstrip(meaning, 0, print_info); int word_len = strlen(word); char word_buf[word_len*2+3]; int meaning_len = strlen(meaning); char meaning_buf[meaning_len*2+3]; mysql_escape_string(word_buf, word, word_len); mysql_escape_string(meaning_buf, meaning, meaning_len); fputs("INSERT INTO dict (keyword, definition) VALUES('", sqlfile); fputs(word_buf, sqlfile); fputs("','", sqlfile); fputs(meaning_buf, sqlfile); fputs("');\n", sqlfile); }
void convert_tabfile(const char *filename, print_info_t print_info) { struct stat stats; if (g_stat (filename, &stats) == -1) { print_info("File not exist!\n"); return; } gchar *basefilename = g_path_get_basename(filename); gchar *ch = strrchr(basefilename, '.'); if (ch) *ch = '\0'; gchar *dirname = g_path_get_dirname(filename); FILE *tabfile; tabfile = g_fopen(filename,"r"); gchar *buffer = (gchar *)g_malloc (stats.st_size + 1); size_t readsize = fread (buffer, 1, stats.st_size, tabfile); fclose (tabfile); buffer[readsize] = '\0'; GArray *array = g_array_sized_new(FALSE,FALSE, sizeof(struct _worditem),20000); gchar *p, *p1, *p2; p = buffer; if ((guchar)*p==0xEF && (guchar)*(p+1)==0xBB && (guchar)*(p+2)==0xBF) // UTF-8 order characters. p+=3; struct _worditem worditem; glong linenum=1; while (1) { if (*p == '\0') { print_info("Convert over.\n"); break; } p1 = strchr(p,'\n'); if (!p1) { print_info("Error, no new line at the end\n"); return; } *p1 = '\0'; p1++; p2 = strchr(p,'\t'); if (!p2) { gchar *str = g_strdup_printf("Warning, no tab, %ld\n", linenum); print_info(str); g_free(str); p= p1; linenum++; continue; } *p2 = '\0'; p2++; worditem.word = p; worditem.definition = p2; my_strstrip(worditem.definition, linenum, print_info); g_strstrip(worditem.word); g_strstrip(worditem.definition); if (!worditem.word[0]) { gchar *str = g_strdup_printf("Warning: line %ld, bad word!\n", linenum); print_info(str); g_free(str); p= p1; linenum++; continue; } if (!worditem.definition[0]) { gchar *str = g_strdup_printf("Warning: line %ld, bad definition!\n", linenum); print_info(str); g_free(str); p= p1; linenum++; continue; } g_array_append_val(array, worditem); p= p1; linenum++; } g_array_sort(array,comparefunc); gchar ifofilename[256]; gchar idxfilename[256]; gchar dicfilename[256]; sprintf(ifofilename, "%s" G_DIR_SEPARATOR_S "%s.ifo", dirname, basefilename); sprintf(idxfilename, "%s" G_DIR_SEPARATOR_S "%s.idx", dirname, basefilename); sprintf(dicfilename, "%s" G_DIR_SEPARATOR_S "%s.dict", dirname, basefilename); FILE *ifofile = g_fopen(ifofilename,"wb"); if (!ifofile) { print_info("Write to ifo file failed!\n"); return; } FILE *idxfile = g_fopen(idxfilename,"wb"); if (!idxfile) { print_info("Write to idx file failed!\n"); return; } FILE *dicfile = g_fopen(dicfilename,"wb"); if (!dicfile) { print_info("Write to dict file failed!\n"); return; } guint32 offset_old; guint32 tmpglong; struct _worditem *pworditem; gint definition_len; gulong i; for (i=0; i< array->len; i++) { offset_old = ftell(dicfile); pworditem = &g_array_index(array, struct _worditem, i); definition_len = strlen(pworditem->definition); fwrite(pworditem->definition, 1 ,definition_len,dicfile); fwrite(pworditem->word,sizeof(gchar),strlen(pworditem->word)+1,idxfile); tmpglong = g_htonl(offset_old); fwrite(&(tmpglong),sizeof(guint32),1,idxfile); tmpglong = g_htonl(definition_len); fwrite(&(tmpglong),sizeof(guint32),1,idxfile); } fclose(idxfile); fclose(dicfile); gchar *str = g_strdup_printf("%s wordcount: %d\n", basefilename, array->len); print_info(str); g_free(str); #ifndef _WIN32 gchar command[256]; sprintf(command, "dictzip %s", dicfilename); system(command); #endif g_stat(idxfilename, &stats); fprintf(ifofile, "StarDict's dict ifo file\nversion=2.4.2\nwordcount=%d\nidxfilesize=%ld\nbookname=%s\nsametypesequence=m\n", array->len, stats.st_size, basefilename); fclose(ifofile); g_free(buffer); g_array_free(array,TRUE); g_free(basefilename); g_free(dirname); }
void convert(char *filename) { struct stat stats; if (stat (filename, &stats) == -1) { printf("file not exist!\n"); return; } gchar *basefilename = g_path_get_basename(filename); FILE *tabfile; tabfile = fopen(filename,"r"); gchar *buffer = (gchar *)g_malloc (stats.st_size + 1); size_t fread_size; fread_size = fread (buffer, 1, stats.st_size, tabfile); if (fread_size != (size_t)stats.st_size) { g_print("fread error!\n"); } fclose (tabfile); buffer[stats.st_size] = '\0'; GArray *array = g_array_sized_new(FALSE,FALSE, sizeof(struct _worditem),20000); gchar *p, *p1, *p2; p = buffer; struct _worditem worditem; glong linenum=1; while (1) { if (*p == '\0') { g_print("over\n"); break; } p1 = strchr(p,'\n'); if (!p1) { g_print("error, no end line\n"); return; } *p1 = '\0'; p1++; p2 = strchr(p,'\t'); if (!p2) { g_print("error, no tab, %ld\n", linenum); return; } *p2 = '\0'; p2++; worditem.word = p; my_strstrip(p2, linenum); worditem.definition = to_utf8_phonetic(p2, linenum); if (worditem.definition==NULL) worditem.definition = g_strdup(p2); g_strstrip(worditem.word); g_strstrip(worditem.definition); if (!worditem.word[0]) { g_print("%s-%ld, bad word!!!\n", basefilename, linenum); p= p1; linenum++; continue; } if (!worditem.definition[0]) { g_print("%s-%ld, bad definition!!!\n", basefilename, linenum); p= p1; linenum++; continue; } g_array_append_val(array, worditem); p= p1; linenum++; } g_array_sort(array,comparefunc); gchar idxfilename[256]; gchar dicfilename[256]; sprintf(idxfilename, "%s.idx", basefilename); sprintf(dicfilename, "%s.dict", basefilename); FILE *idxfile = fopen(idxfilename,"w"); FILE *dicfile = fopen(dicfilename,"w"); glong wordcount = array->len; long offset_old; glong tmpglong; const gchar *previous_word = ""; struct _worditem *pworditem; gulong i=0; glong thedatasize; const gchar *insert_word = "\n\n"; gboolean flag; pworditem = &g_array_index(array, struct _worditem, i); gint definition_len; while (i<array->len) { thedatasize = 0; offset_old = ftell(dicfile); flag = true; while (flag == true) { definition_len = strlen(pworditem->definition); fwrite(pworditem->definition, 1 ,definition_len,dicfile); thedatasize += definition_len; previous_word = pworditem->word; i++; if (i<array->len) { pworditem = &g_array_index(array, struct _worditem, i); if (strcmp(previous_word,pworditem->word)==0) { //g_print("D! %s\n",previous_word); flag = true; wordcount--; fwrite(insert_word,sizeof(gchar),strlen(insert_word),dicfile); thedatasize += strlen(insert_word); } else { flag = false; } } else { flag = false; } }