#include <stdio.h>
#include <time.h>
#include <assert.h>

#define DOCID	\
"<!DOCTYPE HWPML SYSTEM []>\n\
<HWPML VER=\"HWPML1.1\" CODE=KS>\n"

#define DOCHEADFMT	\
"<HEAD>\n\
<INFORMATION>\n\
<PAPERMARGIN TOP=850 BOTTOM=780 LEFT=921 RIGHT=992 HEADER=425 FOOTER=425>\n\
<MISCINFO>\n\
<BACKGROUND>\n\
</MISCINFO>\n\
<SUMMATION>\n\
<TITLE></TITLE>\n\
<SUBJECT></SUBJECT>\n\
<AUTHOR></AUTHOR>\n\
<DAY> %s </DAY>\n\
</SUMMATION>\n\
<FONTLIST>\n\
<KORFONT N=7>\n\
<FONT ID=0>½Å¸íÁ¶</FONT>\n\
<FONT ID=1>Áß°íµñ</FONT>\n\
<FONT ID=2>°ß°íµñ</FONT>\n\
<FONT ID=3>ÈÞ¸Õ°¡´ÂÆÔÃ¼</FONT>\n\
<FONT ID=4>½Ã½ºÅÛ</FONT>\n\
<FONT ID=5>±¼¸²</FONT>\n\
<FONT ID=6>µ¸¿ò</FONT>\n\
</KORFONT>\n\
<ENGFONT N=7>\n\
<FONT ID=0>½Å¸íÁ¶</FONT>\n\
<FONT ID=1>Áß°íµñ</FONT>\n\
<FONT ID=2>°ß°íµñ</FONT>\n\
<FONT ID=3>Áß°£ÇÑ</FONT>\n\
<FONT ID=4>½Ã½ºÅÛ</FONT>\n\
<FONT ID=5>±¼¸²</FONT>\n\
<FONT ID=6>µ¸¿ò</FONT>\n\
</ENGFONT>\n\
<HANJAFONT N=5>\n\
<FONT ID=0>½Å¸íÁ¶</FONT>\n\
<FONT ID=1>Áß°íµñ</FONT>\n\
<FONT ID=2>½Ã½ºÅÛ</FONT>\n\
<FONT ID=3>±¼¸²</FONT>\n\
<FONT ID=4>µ¸¿ò</FONT>\n\
</HANJAFONT>\n\
<JAPANFONT N=5>\n\
<FONT ID=0>½Å¸íÁ¶</FONT>\n\
<FONT ID=1>Áß°íµñ</FONT>\n\
<FONT ID=2>½Ã½ºÅÛ</FONT>\n\
<FONT ID=3>±¼¸²</FONT>\n\
<FONT ID=4>µ¸¿ò</FONT>\n\
</JAPANFONT>\n\
<ETCFONT N=3>\n\
<FONT ID=0>½Å¸íÁ¶</FONT>\n\
<FONT ID=1>±¼¸²</FONT>\n\
<FONT ID=2>µ¸¿ò</FONT>\n\
</ETCFONT>\n\
<SPECIALFONT N=5>\n\
<FONT ID=0>½Å¸íÁ¶</FONT>\n\
<FONT ID=1>Áß°íµñ</FONT>\n\
<FONT ID=2>½Ã½ºÅÛ</FONT>\n\
<FONT ID=3>±¼¸²</FONT>\n\
<FONT ID=4>µ¸¿ò</FONT>\n\
</SPECIALFONT>\n\
<USERFONT N=3>\n\
<FONT ID=0>¸íÁ¶</FONT>\n\
<FONT ID=1>±¼¸²</FONT>\n\
<FONT ID=2>µ¸¿ò</FONT>\n\
</USERFONT>\n\
</FONTLIST>\n\
<STYLELIST>\n\
<STYLE ID=0 NAME=¹ÙÅÁ±Û>\n\
<CSTYLE>\n\
<FONTID>\n\
</CSTYLE>\n\
<PSTYLE>\n\
</STYLE>\n\
</STYLELIST>\n\
</HEAD>\n"

static char	HEADER_FMT[] = "\
<CTRLCODE ID=HEADEND>\n\
<DATA TYPE=0 OPTION=0>\n\
<P><PSTYLE INDENT=353>\
<TEXT><CHAR SIZE=350 SPACE=-5>\n\
<FONTID KOR=6 ENG=6 HANJA=4 JAPAN=4 ETC=2 SPECIAL=4 USER=2>ÆÄÀÏ ÀÌ¸§ : </FONTID></CHAR>\n\
<CHAR SIZE=350 SPACE=-2><FONTID KOR=5 ENG=5 HANJA=3 JAPAN=3 ETC=1 SPECIAL=3 USER=1><B>\n\
%s</B></FONTID></CHAR></TEXT>\n\
</P>\n\
</CTRLCODE>\n";

static char	L_FOOTER[] = "\
<CTRLCODE ID=HEADEND>\n\
<DATA TYPE=1 OPTION=0>\n\
<P><PSTYLE INDENT=353>\n\
<TEXT><CHAR SIZE=300><FONTID KOR=4 ENG=4 HANJA=2 JAPAN=2 SPECIAL=2>\n\
<O>HWPCAT 1.0</O></FONTID></CHAR>\n";

static char	R_FOOTER_FMT[] =  "\
<CHAR SIZE=300 SPACE=-5>\n\
<FONTID KOR=5 ENG=5 HANJA=3 JAPAN=3 ETC=1 SPECIAL=3 USER=1><I><B>\n\
%s%s ÀÎ¼â\n\
</B></I></FONTID></CHAR></TEXT>\n\
</P>\n\
</CTRLCODE>\n";

static char	BEGINTABLE[] = "\
<CTRLCODE ID=BOX>\n\
<BOX TYPE=TABLE MAXCOL=2>\n\
<MARGIN>\n\
<TR>\n\
<CELL HPOSX=0 HPOSY=0 HWIDTH=488 HHEIGHT=18500 VERALIGN=0 SHADE=10>\n";

static char	ENDTABLE[] = "\
</CELL>\n\
<CAPTION><P></P>\n\
</CAPTION>\n\
</CTRLCODE>\n";

/*############################################*/

#define	MAX_ROW 94
#define	MAX_COL	96

/* Ã¹ ±ÛÀÚ´Â ¿¬¼ÓµÇ´Â ÁÙÀÎÁö °Ë»ç
 * 96¹øÂ° ±îÁö´Â Á¤»óÀûÀ¸·Î ¾²´Ù°¡ ÇÑ±ÛÀÌ Áß°£¿¡ Àß¸®¸é,
 * 97¹øÂ°±îÁö »ç¿ëÇÒ¼ö ÀÖ´Ù.
 */
char    page_buf[MAX_ROW][MAX_COL+3];
int	pageNum = 0, lineNum = 0;

char	fileName[256];
char	*ptr, buf[MAX_COL + 1];
FILE	*ofp;

static int usage( void )
{
  printf("usage: hwpcat filename\n");
}

static char *get_date_string()
{
  time_t clock;
  struct tm *tm_now;
  static char buf[1024];

  if( ! buf[0] ) {
    /* get time from system */
    clock = time((time_t *) 0);
    /* get tm structure */
    tm_now = localtime(&clock);
    sprintf(buf, "%d³â %d¿ù %dÀÏ, %d½Ã %dºÐ",
	    tm_now->tm_year, tm_now->tm_mon + 1, tm_now->tm_mday,
	    tm_now->tm_hour, tm_now->tm_min);
  }
  return buf;
}

static char *get_rfooter_string()
{
  static char	buf[1024];
  int		len = strlen( get_date_string() );

  if( ! buf[0] ) {
    char space[100], *sptr = space;
    while( len++ < 65 )
      *sptr++ = ' ';
    *sptr = 0;
    sprintf(buf, R_FOOTER_FMT, space, get_date_string());
  }
  return buf;
}

static void
begin_page(int pageno)
{
  char	buf[100];
  if( pageno == 1 )
    fputs("<P>\n", ofp);
  else
    fputs("<P PAGEBREAK=1>\n", ofp);
  memset(buf, ' ', 100);
  memcpy(buf, fileName, strlen(fileName));
  sprintf(buf + 54, "%4d ÂÊ", pageno);
  fprintf(ofp, HEADER_FMT, buf);
  fputs(L_FOOTER, ofp);
  fputs(get_rfooter_string(), ofp);
}

static void
end_page( void )
{
  fputs("</P>\n", ofp);
}

static void hml_fputs( char *str, FILE *fp )
{
  char *s = str;
  int	len;

  assert( str != NULL );
  len = strlen(str) - 1;
  if( str[len] == '\n' || str[len] == '\r' )
    str[len] = 0;

  fputs("<TEXT><CHAR SIZE=150>", ofp);
  while( *str ) {
    if( *str == '&' )
      fputs("&amp;", fp);
    else if ( *str == '<' )
      fputs("&lt;", fp);
    else if ( *str == '>' )
      fputs("&gt;", fp);
    else
      fputc( *str, fp );
    str++;
  }
  if( str == s)
    fputc( ' ', fp );
  fputs("</CHAR></TEXT>\n", ofp);
}

/*############################################*/

int
main( int argc, char *argv[] )
{
  FILE	*fp;
  int	ii, row = 0,  col = 0;

  if( argc < 2 ) {
    usage();
    exit(0);
  }
  strcpy(fileName, argv[1]);
  if( (fp = fopen(fileName, "r")) == NULL ) {
    fprintf(stdout, "Can not open input file: %s\n", fileName);
    exit(0);
  }
  ofp = stdout;

  fputs(DOCID, ofp);
  fprintf(ofp, DOCHEADFMT, get_date_string());

  fputs("<BODY>\n", ofp);

  /////////////////////////////////////
  while( (ptr = fgets(buf, MAX_COL, fp)) )
  {
    col = 0;
    while( *ptr && col < MAX_COL )
      page_buf[row][col++] = *ptr++;
    if( col == MAX_COL )
    {
      fprintf(stdout, "Too long lines\n");
      exit(0);
    }

    if( ++row ==  MAX_ROW ) {
      begin_page(pageNum + 1);
      fputs(BEGINTABLE, ofp);
      for( ii = 0; ii < row; ii++ ) {
	fprintf(ofp, "<P><PSTYLE INDENT=39 LSPACE=130 ALIGN=RIGHT>\n");
	fprintf(ofp, "<TEXT><CHAR SIZE=150>%d</CHAR></TEXT></P>\n",
		++lineNum);
      }
      fputs("</CELL>\n", ofp);
    
      fputs("<CELL HPOSX=488 HPOSY=0 HWIDTH=12203 HHEIGHT=18500 VERALIGN=0>\n", ofp);
      for( ii = 0; ii < row; ii++ ) {
	fputs("<P><PSTYLE INDENT=39 LSPACE=130 ALIGN=LEFT>\n", ofp);
	fputs("<TEXT><CHAR SIZE=150>", ofp);
	hml_fputs(page_buf[ii], ofp);
	fputs("</CHAR></TEXT></P>\n", ofp);
      }
   
      fputs(ENDTABLE, ofp);
      end_page();
    
      row = 0;
      pageNum++;
    }
  }

  if( row != 0 ) {
    begin_page(pageNum + 1);
    fputs(BEGINTABLE, ofp);
    for( ii = 0; ii < row; ii++ ) {
      fprintf(ofp, "<P><PSTYLE INDENT=39 LSPACE=130 ALIGN=RIGHT>\n");
      fprintf(ofp, "<TEXT><CHAR SIZE=150>%d</CHAR></TEXT></P>\n",
	      ++lineNum);
    }
    fputs("</CELL>\n", ofp);
    
    fputs("<CELL HPOSX=488 HPOSY=0 HWIDTH=12203 HHEIGHT=18500 VERALIGN=0>\n", ofp);
    for( ii = 0; ii < row; ii++ ) {
      fputs("<P><PSTYLE INDENT=39 LSPACE=130 ALIGN=LEFT>\n", ofp);
      hml_fputs(page_buf[ii], ofp);
      fputs("</P>\n", ofp);
    }
   
    fputs(ENDTABLE, ofp);
    end_page();
  }
  ////////////////////////////////////

  fputs("</BODY>\n", ofp);
  fputs("</HWPML>\n", ofp);

  fclose(fp);
  if( ofp != stdout )
    fclose(ofp);

  if( pageNum == 0 )
    fprintf(stderr, "%d page is printed\n", 1);
  else
    fprintf(stderr, "%d pages are printed\n", pageNum + 1);
}

