diff options
Diffstat (limited to 'indexing/upmendex/source/fwrite.c')
-rw-r--r-- | indexing/upmendex/source/fwrite.c | 140 |
1 files changed, 117 insertions, 23 deletions
diff --git a/indexing/upmendex/source/fwrite.c b/indexing/upmendex/source/fwrite.c index 380e1cbf37..d1685ede1c 100644 --- a/indexing/upmendex/source/fwrite.c +++ b/indexing/upmendex/source/fwrite.c @@ -150,15 +150,16 @@ void verb_printf(FILE *fp, const char *format, ...) /* write ind file */ void indwrite(char *filename, struct index *ind, int pagenum) { - int i,j,hpoint=0,tpoint=0; + int i,j,hpoint=0,tpoint=0,ipoint=0,jpoint=0; char lbuff[BUFFERLEN],obuff[BUFFERLEN]; UChar datama[256],initial[INITIALLENGTH],initial_prev[INITIALLENGTH]; int chset,chset_prev; - FILE *fp; + FILE *fp=NULL; UErrorCode perr; - if (filename && kpse_out_name_ok(filename)) fp=fopen(filename,"wb"); - else { + if (filename && kpse_out_name_ok(filename)) + fp=fopen(filename,"wb"); + if (fp == NULL) { fp=stdout; #ifdef WIN32 setmode(fileno(fp), _O_BINARY); @@ -212,22 +213,68 @@ void indwrite(char *filename, struct index *ind, int pagenum) else if (chset==CH_HANGUL) { if (lethead_flag!=0) { fputs(lethead_prefix,fp); - for (j=tpoint;j<(u_strlen(tumunja));j++) { - if (initial_cmp_char(initial,tumunja[j])) { - fprint_uchar(fp,&tumunja[j-1],M_NONE,1); + for (j=tpoint;j<(u_strlen(hangul_head));j++) { + if (initial_cmp_char(initial,hangul_head[j])) { + fprint_uchar(fp,&hangul_head[j-1],M_NONE,1); tpoint=j; break; } } - if (j==(u_strlen(tumunja))) { - fprint_uchar(fp,&tumunja[j-1],M_NONE,1); + if (j==(u_strlen(hangul_head))) { + fprint_uchar(fp,&hangul_head[j-1],M_NONE,1); + } + fputs(lethead_suffix,fp); + } + widechar_to_multibyte(obuff,BUFFERLEN,ind[i].idx[0]); + SPRINTF(lbuff,"%s%s",item_0,obuff); + for (tpoint=0;tpoint<(u_strlen(hangul_head));tpoint++) { + if (initial_cmp_char(initial,hangul_head[tpoint])) { + break; + } + } + } + else if (chset==CH_DEVANAGARI) { + if (lethead_flag!=0) { + fputs(lethead_prefix,fp); + for (j=jpoint;j<(u_strlen(devanagari_head));j++) { + if (initial_cmp_char(initial,devanagari_head[j])) { + fprint_uchar(fp,&devanagari_head[j-1],M_NONE,1); + jpoint=j; + break; + } + } + if (j==(u_strlen(devanagari_head))) { + fprint_uchar(fp,&devanagari_head[j-1],M_NONE,1); } fputs(lethead_suffix,fp); } widechar_to_multibyte(obuff,BUFFERLEN,ind[i].idx[0]); SPRINTF(lbuff,"%s%s",item_0,obuff); - for (tpoint=0;tpoint<(u_strlen(tumunja));tpoint++) { - if (initial_cmp_char(initial,tumunja[tpoint])) { + for (jpoint=0;jpoint<(u_strlen(devanagari_head));jpoint++) { + if (initial_cmp_char(initial,devanagari_head[jpoint])) { + break; + } + } + } + else if (chset==CH_THAI) { + if (lethead_flag!=0) { + fputs(lethead_prefix,fp); + for (j=ipoint;j<(u_strlen(thai_head));j++) { + if (initial_cmp_char(initial,thai_head[j])) { + fprint_uchar(fp,&thai_head[j-1],M_NONE,1); + ipoint=j; + break; + } + } + if (j==(u_strlen(thai_head))) { + fprint_uchar(fp,&thai_head[j-1],M_NONE,1); + } + fputs(lethead_suffix,fp); + } + widechar_to_multibyte(obuff,BUFFERLEN,ind[i].idx[0]); + SPRINTF(lbuff,"%s%s",item_0,obuff); + for (ipoint=0;ipoint<(u_strlen(thai_head));ipoint++) { + if (initial_cmp_char(initial,thai_head[ipoint])) { break; } } @@ -303,8 +350,8 @@ void indwrite(char *filename, struct index *ind, int pagenum) } } else if (chset==CH_HANGUL) { - for (j=tpoint;j<(u_strlen(tumunja));j++) { - if (initial_cmp_char(initial,tumunja[j])) { + for (j=tpoint;j<(u_strlen(hangul_head));j++) { + if (initial_cmp_char(initial,hangul_head[j])) { break; } } @@ -313,13 +360,45 @@ void indwrite(char *filename, struct index *ind, int pagenum) fputs(group_skip,fp); if (lethead_flag!=0) { fputs(lethead_prefix,fp); - fprint_uchar(fp,&tumunja[j-1],M_NONE,1); + fprint_uchar(fp,&hangul_head[j-1],M_NONE,1); + fputs(lethead_suffix,fp); + } + } + } + else if (chset==CH_DEVANAGARI) { + for (j=jpoint;j<(u_strlen(devanagari_head));j++) { + if (initial_cmp_char(initial,devanagari_head[j])) { + break; + } + } + if ((j!=jpoint)||(j==0)) { + jpoint=j; + fputs(group_skip,fp); + if (lethead_flag!=0) { + fputs(lethead_prefix,fp); + fprint_uchar(fp,&devanagari_head[j-1],M_NONE,1); + fputs(lethead_suffix,fp); + } + } + } + else if (chset==CH_THAI) { + for (j=ipoint;j<(u_strlen(thai_head));j++) { + if (initial_cmp_char(initial,thai_head[j])) { + break; + } + } + if ((j!=ipoint)||(j==0)) { + ipoint=j; + fputs(group_skip,fp); + if (lethead_flag!=0) { + fputs(lethead_prefix,fp); + fprint_uchar(fp,&thai_head[j-1],M_NONE,1); fputs(lethead_suffix,fp); } } } else { - if (CH_LATIN<=chset_prev&&chset_prev<=CH_HANZI){ + if (CH_LATIN<=chset_prev&&chset_prev<=CH_THAI){ fputs(group_skip,fp); if (lethead_flag!=0 && symbol_flag) { if (strlen(symbol)) { @@ -402,7 +481,7 @@ void indwrite(char *filename, struct index *ind, int pagenum) } fputs(postamble,fp); - if (filename) fclose(fp); + if (fp!=stdout) fclose(fp); } /* write page block */ @@ -665,23 +744,27 @@ static void index_normalize(UChar *istr, UChar *ini, int *chset) ini[0]=kanatable[ch-KATATOP]; return; } - if (is_extkana(ch)) { + if (is_extkana(ch)) { /* ㇰㇱㇲㇳㇴ .. ㇻㇼㇽㇾㇿ */ ini[0]=extkanatable[ch-EXKANATOP]; return; } - else if (ch==0x309F) { ini[0]=0x30E8; return; } /* HIRAGANA YORI -> ヨ */ - else if (ch==0x30FF) { ini[0]=0x30B3; return; } /* KATAKANA KOTO -> コ */ + if (is_circkana(ch)) { /* ㋐㋑㋒㋓㋔ .. ㋻㋼㋽㋾ */ + ini[0]=circkanatable[ch-CRKANATOP]; + return; + } + else if (ch==0x309F) { ini[0]=0x3088; return; } /* HIRAGANA YORI -> よ */ + else if (ch==0x30FF) { ini[0]=0x3053; return; } /* KATAKANA KOTO -> こ */ else if (is_jpn_kana(istr)==2) { c32=U16_GET_SUPPLEMENTARY(istr[0],istr[1]); switch (c32) { case 0x1B150: case 0x1B164: - ini[0]=0x30F0; break; /* ヰ */ + ini[0]=0x3090; break; /* ゐ */ case 0x1B151: case 0x1B165: - ini[0]=0x30F1; break; /* ヱ */ + ini[0]=0x3091; break; /* ゑ */ case 0x1B152: case 0x1B166: - ini[0]=0x30F2; break; /* ヲ */ + ini[0]=0x3092; break; /* を */ case 0x1B167: default: - ini[0]=0x30F3; break; /* ン */ + ini[0]=0x3093; break; /* ん */ } return; } @@ -769,6 +852,17 @@ static void index_normalize(UChar *istr, UChar *ini, int *chset) u_strcpy(ini,hz_index[lo-1].idx); return; } + else if (is_devanagari(&ch)||is_thai(&ch)) { + if (ch==0x929||0x931||0x934||(0x958<=ch&&ch<=0x95F)) { + src[0]=ch; src[1]=0x00; + perr=U_ZERO_ERROR; + unorm2_normalize(unormalizer_NFD, src, 1, dest, 8, &perr); + if (U_SUCCESS(perr)) + ch=dest[0]; /* without modifier */ + } + ini[0]=ch; + return; + } if (ch==0x049||ch==0x069||ch==0x130||ch==0x131||ch==0x0CE||ch==0x0EE) { /* check dotted/dotless İ,I,i,ı and Î,î for Turkish */ strX[0] = 0x131; strX[1] = 0x5A; strX[2] = 0x00; /* ıZ */ |