/* *********************************************************** Program : Hangul Code Conversion Program Author : June-Yub Lee (jylee@math1.nyu.edu:jylee@math1.kaist.ac.kr) Created : Jan, 07, 1992 Modified : Ver. 1.1 Feb, 29, 1992 This Program is free software under the GNU General Public License. If you are installing this program for your own work or other users, please send me a e-mail so that I can fix any possible bug and update for new Hangul Code including UNICODE. ************************************************************ */ #include #include "hcode.h" #include "h3Bcode.h" extern void opt_check(); extern void rmprolog(); extern void printout(); extern void code2conv(); extern void m2code(); extern int getOne(); extern int HanCode(); extern int strNcmp(); main(argc,argv) int argc; char *argv[]; { FILE *fpin, *fpout; unsigned char c,c2=0,ST,EN,buf[MAXBUFSIZE]; int inCode, outCode, IC, Hanbuf[MAXHANSIZE]; buf[0] = 0; Hanbuf[0] = 0; opt_check(argc,argv,&inCode,&outCode, &fpin, &fpout); IC = inCode - NB; /* MultiByte Hangul Input if IC >= 0 */ if ( inCode == IS ) { ST = '\016'; EN = '\017'; rmprolog("\033$)C",fpin,fpout); } else if ( IC >= 0 ) { ST = (unsigned char) StartCode[IC][0]; EN = (unsigned char) EndCode[IC][0]; } else { ST = (unsigned char) EOF; EN = (unsigned char) EOF; } while ( (c=getc(fpin)) != (unsigned char) EOF ) { if ( c>=0x80 && inCode==TR || (c==0xa4||c>=0xb0&&c<=0xc8) && inCode==KS ) { if ( (c2=getc(fpin)) == (unsigned char) EOF ) { fprintf(stderr,"Uncompeleted 2-byte Hangul\n"); putc(c,fpout); ungetc(c2,fpin); } /* Unfinshed 2B Hangul */ Hanbuf[++Hanbuf[0]] = c*256 + c2; } else if ( c==ST && inCode==IS ) { while ( (c=getc(fpin)) != EN ) { /* Error Dealing Section missing */ c2=getc(fpin); Hanbuf[++Hanbuf[0]] = (c+0x80)*256 + (c2+0x80); } } else if ( c==ST && IC>=0 ) { while ( (c=getc(fpin)) != EN ) { if ( c==(unsigned char) EOF ) { fprintf(stderr,"Can't find EndCode in MultiByte Hangul\n"); ungetc(c,fpin); break; } /* EndCode Missing */ buf[++buf[0]] = c; if ( buf[0]>=MAXBUFSIZE-5 ) m2code(buf,IC,MULHAN,Hanbuf); } m2code(buf,IC,ENDHAN,Hanbuf); } else { if ( Hanbuf[0]!=0 ) printout(Hanbuf, fpout, inCode, outCode, 1); putc(c,fpout); } } if ( Hanbuf[0] != 0 ) { /* document ending with Hangul */ printout(Hanbuf, fpout, inCode, outCode, 1); } fclose(fpin); fclose(fpout); } /* ------------------------------------------------------ Command Line Option Check Routine Two integes Return : inCode and outCode Two file pointer : fhin, fhout Defaults : from_IS, to_KS, stdin, stdout; ------------------------------------------------------- */ void opt_check(argc, argv, inCode, outCode, fhin, fhout) char *argv[]; FILE **fhin, **fhout; int argc, *inCode, *outCode; { char *program = argv[0]; *inCode = IS; *outCode = KS; while (--argc) { argv++; if ( argv[0][0]!='-' || argv[0][1]=='\0' ) { break; } else if ( argv[0][2]=='\0' ) { *inCode = in_choice [ argv[0][1]-'a' ]; } else if ( argv[0][3]=='\0' ) { *inCode = in_choice [ argv[0][1]-'a' ]; *outCode = out_choice [ argv[0][2]-'a' ]; } else { fprintf(stderr,"Unknown Option: %s %s\n",program,syn); exit(-1); } if ( *inCode == 0 ) { fprintf(stderr,"Unknown InCode: %s %s\n",program,syn); exit(-1); } else if ( *outCode == 0 ) { fprintf(stderr,"Unknown OutCode: %s %s\n",program,syn); exit(-1); } } *fhin = stdin; *fhout = stdout; if ( argc > 2 ) { fprintf(stderr,"Unknown Syntax: %s %s\n",program,syn); exit(-1); } else if ( argc == 2 ) { if ( argv[0][0]!='-' && (*fhin=fopen(argv[0],"r"))==NULL ) { fprintf(stderr,"%s: Read Err on %s\n",program,argv[0]); exit(1); } if ( (*fhout=fopen(argv[1],"w")) == NULL ) { fprintf(stderr,"%s: Write Err on %s\n",program,argv[1]); exit(1); } } else if ( argc == 1 ) { if ( argv[0][0]!='-' && (*fhin=fopen(argv[0],"r"))==NULL ) { fprintf(stderr,"%s: Read Err on %s\n",program,argv[0]); exit(1); } } } /* ------------------------------------------------------ Search for Starting Mark and print out (ENGLISH) prologue mark : Starting Code Two file pointer : fhin, fhout ------------------------------------------------------- */ void rmprolog(mark,fpin,fpout) char mark[]; FILE *fpin, *fpout; { char c; int i,p=0,len=strlen(mark); while( (c=getc(fpin)) !=EOF ) { if (c==mark[p]) { if (p==len-1) return; else p++; } else { for ( i=0; i>8)-0x80,fpout); putc((Hanbuf[i]&0xff)-0x80,fpout); } putc('\017',fpout); } else if ( outCode>8,fpout); putc(Hanbuf[i]&0xff,fpout); } } else { int C=(outCode-NB),ch,ju,jo; for ( i=1; i<=Hanbuf[0]; i++) { ch = ( Hanbuf[i] >> 10 ) & 0x1f; ju = ( Hanbuf[i] >> 5 ) & 0x1f; jo = ( Hanbuf[i] ) & 0x1f; if ( stat == PRNONE ) fprintf(fpout,"%s",StartCode[C]); if ( ch==01 || ju==02 ) { if (stat == PRINTED) fprintf(fpout,"%s%s",EndCode[C],StartCode[C]); fprintf(fpout,"%s%s%s%s",ChoSung[ch][C], JungSung[ju][C],JongSung[jo][C],EndCode[C]); stat = PRNONE; } else { fprintf(fpout,"%s%s%s",ChoSung[ch][C], JungSung[ju][C],JongSung[jo][C]); stat = PRINTED; } } if (stat == PRINTED && putend == 1) { fprintf(fpout,"%s",EndCode[C]); stat = PRNONE; } } Hanbuf[0] = 0; }