Ejemplo n.º 1
0
///번역정보를 파일에 출력
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;
}
Ejemplo n.º 2
0
pdf_obj *
pdf_obj_find(int n, int gen)
{
      pdf_map *m = pdf_map_find(gen);
      return (pdf_obj*)bpt_search(m->head, n);
}
Ejemplo n.º 3
0
//파일에 있는 문장 번역(영한 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;	//번역한 문장 수
}