///번역정보를 파일에 출력 int _fio_export_data (FILE *fp, BTREE* wi, void* keys) { char *ckeys, adigit[ASIZE], sbuf[SSIZE]; void *data; register int i; int cnt = 0; unsigned int *pkey; //pkey = malloc (sizeof(unsigned int)); //Win: <malloc.h> //Linux: <alloca.h> 스택에 메모리를 빠르게 할당, scope를 벗어나면 자동해제 되므로 free할 필요없음. pkey = alloca (sizeof(unsigned int)); if (!pkey) { printf ("## Failure to allocate alloca in _tw1_trans_key_data().\n"); return 0; //메모리 할당 실패 } sbuf[0] = '\0'; ckeys = (char*)keys; while (*ckeys) { i = 0; while ( (adigit[i++] = *ckeys++) != '_'); i--; adigit[i] = '\0'; *pkey = str_to_uint (adigit); data = bpt_search (wi, pkey); if (data) { cnt++; str_cat (sbuf, data); } str_cat (sbuf, " "); } sbuf[str_len (sbuf) - 1] = '\0'; //마지막 공백 제거 //free (pkey); //alloca 에서 스택에 할당된 메모리는 scope를 벗어나면 자동으로 해제됨 str_cat (sbuf, ".\n"); fputs (sbuf, fp); //파일에 저장 //번역 문장 보관용 스택에 입력 if (cnt > 0) tw2_stack_push (sbuf); return cnt; }
pdf_obj * pdf_obj_find(int n, int gen) { pdf_map *m = pdf_map_find(gen); return (pdf_obj*)bpt_search(m->head, n); }
//파일에 있는 문장 번역(영한 mode에 상관없이 번역) int fio_translation (char *fname, char *fname2, BTREE** ws, BTREE** wi, BTREE** hb[], int mode, BTREE* rs, QUEUE** qk, int flag) { FILE *fp, *fp2; char rows[SSIZE], keys[SSIZE], *rowp; register int i=0; int ch, rown=0, kcnt, trans_cnt=0; unsigned int h; BTREE* t1; void* data; printf ("File (%s >> %s) Translating...\n", fname, fname2); fp = fopen (fname, "r"); if (fp == NULL) { printf (", Input file(%s) not exist!\n", fname); return 0; } fp2 = fopen (fname2, "w"); if (fp2 == NULL) { printf (", Output file(%s) creating error!\n", fname2); return 0; } //문장 단위로 읽음 ch = fgetc (fp); while (ch != EOF) { while (ch != '\n' && ch != EOF && i < SSIZE-2) { //문장끝 rows[i++] = ch; if (um_end(ch)) break; //문장끝 부호(. ? !) ch = fgetc (fp); } if (i >= SSIZE-2) break; rows[i] = '\0'; rowp = str_trim_left (rows); if (*rowp == '/' && *(rowp+1) == '/') { //주석 fputs (rowp, fp2); //원문출력 fputc ('\n', fp2); ch = fgetc (fp); i = 0; continue; } if (ch == '\n') { rows[i++] = ' '; //fputc ('\n', fp2); } ch = fgetc (fp); if (ch != EOF && !um_whites(ch)) continue; //문장끝이 아님으로 판단하고 계속 읽음 rows[i] = '\0'; rowp = str_trim (rows); mode = str_is_eng_kor (rowp); //0:영문, 1:한글, -1:특수문자(개행문자도 특수문자로 취급) if (mode >= 0) { fputs (rowp, fp2); //원문출력 fputc ('\n', fp2); //문장을 인덱스키로 변환 str_copy (keys, rowp); if ((kcnt = tw1_words_input ("", keys, ws[mode], wi[mode], rs, qk[mode], FLAG_NONE)) > 0) { //printf (">> %s\n", keys); //해시값으로 번역키 B+트리 선택 h = hash_value (keys); t1 = hb[mode][h]; data = bpt_search (t1, keys); //번역키 if (data) { //번역 문장 보관용 스택에 입력 tw2_stack_push (rowp); ///번역정보(완전일치)를 파일에 출력 if (_fio_export_data (fp2, wi[!mode], data) > 0) trans_cnt++; else tw2_stack_pop (); //스택에 저장된 번역대상 문장 제거 } else { //완전일치키가 없을때, 번역키를 하나씩 분리하여 단어단위로 검색하여 출력 if (_fio_trans_key_each (fp2, keys, hb, wi, mode, kcnt) > 0) trans_cnt++; } } fputc ('\n', fp2); } printf ("%c*line: %u: ", CR, ++rown); //라인 수 i = 0; if (flag==FLAG_NONE && trans_cnt==TRANS_CNT) { //무료 //파일에 출력 fputs ("** 문장번역 개수를 제한합니다.\n", fp2); fputs ("** 유료 회원으로 등록하시면 제한없이 번역합니다.\n\n", fp2); //화면에 출력 printf ("** 문장번역을 %d개로 제한합니다.\n", TRANS_CNT); printf ("** 유료 회원으로 등록하시면 제한없이 번역합니다.\n\n"); break; } } //while fclose (fp2); fclose (fp); return trans_cnt; //번역한 문장 수 }