summaryrefslogtreecommitdiff
path: root/language/korean/HLaTeX/contrib/hmakeindex.c
diff options
context:
space:
mode:
Diffstat (limited to 'language/korean/HLaTeX/contrib/hmakeindex.c')
-rw-r--r--language/korean/HLaTeX/contrib/hmakeindex.c281
1 files changed, 281 insertions, 0 deletions
diff --git a/language/korean/HLaTeX/contrib/hmakeindex.c b/language/korean/HLaTeX/contrib/hmakeindex.c
new file mode 100644
index 0000000000..955f60c6de
--- /dev/null
+++ b/language/korean/HLaTeX/contrib/hmakeindex.c
@@ -0,0 +1,281 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define HEXA_STRING "0123456789abcdef"
+
+#ifdef WIN32
+#include <io.h>
+#include <ctype.h>
+#define MKSTEMP mktemp
+#else
+#define MKSTEMP mkstemp
+#endif
+
+#define BIT(x) (1<<x)
+
+char idx[1024], ind[1024];
+int cho=-1, style_used=0;
+int to_8bit(void);
+int hangul_head(int);
+int doublebyte(int, int);
+int triplebyte(unsigned int, unsigned int, unsigned int);
+int ucs(int);
+void fputs_item(char *, FILE *);
+
+main(int argc, char *argv[])
+{
+ int i, outfile_used=0;
+ char prog[1024], args[1024], cmd[128], idx0[1024];
+ char *t, *l;
+
+ strcpy(prog, argv[0]);
+#ifdef WIN32
+ strcpy(args, "");
+ strcpy(ind, "");
+#else
+ bzero(args, 1024);
+ bzero(ind, 1024);
+#endif
+
+ printf("This is hmakeindex, version 1.0 (makeindex wrapper for Korean support).\n");
+
+ for(i=1; i<argc; i++) {
+ strcat(args, " ");
+ t=argv[i];
+ strcat(args, t);
+ switch(*t) {
+ case '-':
+ t++;
+ switch(*t) {
+ case 'o':
+ outfile_used=1;
+ strcat(args, " ");
+ strcat(args, argv[++i]);
+ strcpy(ind, argv[i]);
+ if((l=strrchr(ind, '.'))&&*(l+1)=='i'&&*(l+2)=='n'&&*(l+3)=='d')
+ *l=0;
+ break;
+ case 'p':
+ strcat(args, " ");
+ strcat(args, argv[++i]);
+ break;
+ case 's':
+ strcat(args, " ");
+ strcat(args, argv[++i]);
+ style_used=1;
+ break;
+ case 't':
+ strcat(args, " ");
+ strcat(args, argv[++i]);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ if((l=strrchr(argv[i], '.'))&&*(l+1)=='i'&&*(l+2)=='d'&&*(l+3)=='x')
+ *l=0;
+ strcpy(idx, argv[i]);
+ strcpy(idx0, argv[i]);
+ strcat(idx, ".idx");
+ break;
+ }
+ }
+
+ i=to_8bit();
+ sprintf(cmd, "makeindex %s", args);
+ system(cmd);
+
+ if(outfile_used==0) {
+ strcpy(ind, idx0);
+ strcat(ind, ".ind");
+ }
+ hangul_head(i);
+
+ exit(0);
+}
+
+int to_8bit() {
+ FILE *in, *out;
+ char line[1024], *h1, *h2, tempfile[9];
+ unsigned char *l;
+ int x, w=0, utf_seen=0, hangul_enc=0;
+
+ in = fopen(idx, "r");
+ if(!in) {
+ printf("\tError opening index file \"%s\"!!!\n", idx);
+ exit(1);
+ }
+
+ strcpy(tempfile, "IDXXXXXXX");
+ MKSTEMP(tempfile);
+ out = fopen(tempfile, "w");
+ if(!out) {
+ printf("\tError opening temporary file \"%s\"!!!\n", tempfile);
+ exit(1);
+ }
+
+ while(fgets(line, 1024, in)) {
+ l=line;
+ while(*l) {
+ if(*l=='^'&&*(l+1)=='^'
+ &&(h1=strchr(HEXA_STRING, *(l+2)))
+ &&(h2=strchr(HEXA_STRING, *(l+3)))) {
+ if(*h1>'9') x=*h1-87;
+ else x=*h1-48;
+ x*=16;
+ if(*h2>'9') x+=*h2-87;
+ else x+=*h2-48;
+ fputc(x, out);
+ l+=4;
+ hangul_enc=1;
+ if(w<161 || x<161) utf_seen=1;
+ w=x;
+ }
+ else {
+ if(w>127 && *l>127) {
+ /* 이미 변환된 .idx 파일의 경우 */
+ hangul_enc=1;
+ if(w<161 || *l<161) utf_seen=1;
+ }
+ w=*l;
+ /* 위치 표시 문자 '@'는 '\a'으로 변환하여 makeindex로 처리한 후
+ 나중에 제거한다. \hindexhead{#}의 "#" 처리에서 오류가 발생 */
+ if(*(l-1)!='"' && *l=='@') fputc('\a', out);
+ else fputc(*l, out);
+ l++;
+ }
+ }
+ }
+ fflush(NULL);
+ fclose(in);
+ fclose(out);
+
+ rename(tempfile, idx);
+
+ return(hangul_enc+utf_seen);
+}
+
+int hangul_head(encoding) {
+ FILE *in, *out;
+ char tempfile[9];
+ unsigned char line[1024], *l;
+ unsigned int cho=20, x;
+
+ strcpy(tempfile, "INDXXXXXX");
+ MKSTEMP(tempfile);
+ in=fopen(ind, "r");
+ out=fopen(tempfile, "w");
+
+ while(fgets(line, 1024, in)) {
+ l=line;
+ while(isspace(*l)) l++;
+ if(strncmp(l, "\\item", 5)==0) {
+ l+=5;
+ while(isspace(*l)) l++;
+ if(*l<128) {
+ fputs_item(line, out);
+ continue;
+ }
+ switch(encoding) {
+ case 1: /* EUC-KR */
+ x=doublebyte(*l, *(l+1));
+ break;
+ case 2: /* UTF-8 */
+ x=triplebyte(*l, *(l+1), *(l+2));
+ break;
+ default:
+ fprintf(stderr, "Encoding error in the ind file\n");
+ fputs(line, out);
+ break;
+ }
+ if(x!=cho && x<20) {
+ cho=x;
+ fprintf(out, "\n\\hindexhead{%d}\n", cho);
+ }
+ fputs_item(line, out);
+ }
+ else if(strncmp(l, "\\indexspace", 11)==0) {
+ if(cho<0 || cho>19) fputs(line, out);
+ }
+ else if(!(strncmp(l, "\\indexhead{", 11)==0&&*(l+11)>128)) {
+ fputs(line, out);
+ }
+ }
+
+ fflush(NULL);
+ fclose(in);
+ fclose(out);
+
+ rename(tempfile, ind);
+
+ return(1);
+}
+
+void fputs_item(char *item, FILE *fp) {
+ char *s;
+
+ if((s=strchr(item, '\a'))) fprintf(fp, " \\item %s", ++s);
+ else fputs(item, fp);
+}
+
+int doublebyte(int first, int second) {
+ unsigned int ksc;
+
+ if(first<0xa1) return(21);
+ else if(first<0xb1) return(0);
+ else if(first>0xc8) return(20);
+ ksc=(first<<8)+second;
+ if(ksc<0xb1ee) return(1);
+ else if(ksc<0xb3aa) return(2);
+ else if(ksc<0xb4d9) return(3);
+ else if(ksc<0xb5fb) return(4);
+ else if(ksc<0xb6f3) return(5);
+ else if(ksc<0xb8b6) return(6);
+ else if(ksc<0xb9d9) return(7);
+ else if(ksc<0xbafc) return(8);
+ else if(ksc<0xbbe7) return(9);
+ else if(ksc<0xbdce) return(10);
+ else if(ksc<0xbec6) return(11);
+ else if(ksc<0xc0da) return(12);
+ else if(ksc<0xc2a5) return(13);
+ else if(ksc<0xc2f7) return(14);
+ else if(ksc<0xc4ab) return(15);
+ else if(ksc<0xc5b8) return(16);
+ else if(ksc<0xc6c4) return(17);
+ else if(ksc<0xc7cf) return(18);
+ else if(ksc<0xc8ff) return(19);
+ else return(-1);
+}
+
+int triplebyte(unsigned int first, unsigned int second, unsigned int third) {
+ unsigned int utf;
+ int i;
+
+ if(first<=0x7f) utf=first;
+ else {
+ i=0;
+ while(first & BIT((6-i))) i++;
+ switch(i) {
+ case 1:
+ utf=((first - BIT(7) - BIT(6))<<6);
+ utf+=(second - BIT(7));
+ break;
+ case 2:
+ utf=((first - BIT(7) - BIT(6) - BIT(5))<<12);
+ utf+=((second - BIT(7))<<6);
+ utf+=(third - BIT(7));
+ break;
+ default:
+ break;
+ }
+ }
+
+ if(0xac00<=utf && utf<=0xd7a3)
+ return((utf-0xac00)/(21*28)+1);
+ else if((0x4e00<=utf && utf>=0x9fff) ||
+ (0xf900<=utf && utf>=0xfaff)) return(20);
+ else if(utf==first) return(21);
+ else return(0);
+}