/* $OpenXM: OpenXM/src/asir-doc/html_tools/gen_hh.c,v 1.6 2017/08/31 06:42:51 ohara Exp $ */
#include
#include
#include
#if !defined(_MSC_VER)
#include
#else
#include
#endif
#define HEADER_INDEX \
"\n" \
"\n\n" \
"\n" \
"\n\n"
#define HEADER_TOC \
"\n" \
"\n\n" \
"\n" \
"\n\n" \
"\n\n"
void gen_hhp(char *out, int n, char *indir, char *prefix_, char *help)
{
int i;
FILE *outf;
outf = fopen(out,"w");
fprintf(outf,"[OPTIONS]\n");
fprintf(outf,"Compatibility=1.1 or later\n");
fprintf(outf,"Compiled file=%s.chm\n",help);
fprintf(outf,"Contents file=%s.hhc\n",help);
fprintf(outf,"Default topic=%s\\%s_toc.html\n",indir,prefix_);
fprintf(outf,"Display compile progress=No\n");
fprintf(outf,"Index file=%s.hhk\n",help);
fprintf(outf,"Language=0x411 “ú–{Œê\n\n\n[FILES]\n");
fprintf(outf,"%s\\%s_toc.html\n",indir,prefix_);
for ( i = 1; i <= n; i++ )
fprintf(outf,"%s\\%s_%d.html\n",indir,prefix_,i);
fprintf(outf,"\n[INFOTYPES]\n");
}
void conv_toc(char *in, char *out, char *prefix_, char *indir)
{
char buf[BUFSIZ];
char *fname,*ptr,*ptr1;
int c;
FILE *inf,*outf;
inf = fopen(in,"r");
outf = fopen(out,"w");
fputs(HEADER_TOC,outf);
while ( 1 ) {
c = fgetc(inf);
if ( c == EOF )
break;
ungetc(c,inf);
fgets(buf,BUFSIZ,inf);
if ( !strncmp(buf,"Jump to:",strlen("Jump to:")) )
break;
if ( fname = strstr(buf,prefix_) ) {
ptr = strchr(buf,'#');
if(!ptr) continue;
*ptr = 0;
ptr = strchr(ptr+1,'>');
ptr++;
if ( *ptr == '<' )
ptr = strchr(ptr+1,'>')+1;
ptr1 = strchr(ptr,'<');
if(ptr1) *ptr1 = 0;
fprintf(outf,"- \n");
}
}
fprintf(outf,"
\n\n");
}
void conv_index(char *in, char *out, char *prefix_, char *indir)
{
char buf[BUFSIZ];
char *fname,*ptr,*ptr1;
FILE *inf,*outf;
inf = fopen(in,"r");
outf = fopen(out,"w");
fputs(HEADER_INDEX, outf);
while ( 1 ) {
fgets(buf,BUFSIZ,inf);
if ( !strncmp(buf,"Jump to:",strlen("Jump to:")) )
break;
}
while ( 1 ) {
fgets(buf,BUFSIZ,inf);
if ( !strncmp(buf,"Jump to:",strlen("Jump to:")) )
break;
if ( fname = strstr(buf,prefix_) ) {
ptr = strchr(buf,'#');
if(!ptr) continue;
*ptr = 0;
ptr = strchr(ptr+1,'>');
ptr++;
if ( *ptr == '<' )
ptr = strchr(ptr+1,'>')+1;
ptr1 = strchr(ptr,'<');
if(ptr1) *ptr1 = 0;
fprintf(outf,"\n");
}
}
fprintf(outf,"\n");
}
#if !defined(_MSC_VER)
int find_files(char *indir,char *base)
{
DIR *d;
struct dirent *dent;
int n=0,n1;
char *ptr,*ptr1;
char name[BUFSIZ];
int len=strlen(base);
d = opendir(indir);
if(!d) {
exit(1);
}
while ( dent = readdir(d) ) {
strcpy(name,dent->d_name);
ptr = name+len;
ptr = strchr(ptr,'_');
if ( !ptr )
continue;
ptr++;
ptr1 = strchr(ptr,'.');
if ( !ptr1 )
continue;
*ptr1 = 0;
if ( !strcmp(ptr,"toc") )
continue;
n1 = atoi(ptr);
if ( n1 > n )
n = n1;
}
closedir(d);
return n;
}
#else
int find_files(char *indir,char *base)
{
HANDLE h;
WIN32_FIND_DATA fd;
char *ptr,*ptr1;
char pattern[BUFSIZ];
char name[BUFSIZ];
int n=0,n1;
int len=strlen(base);
sprintf(pattern, "%s\\%s_*.*", indir, base);
h = FindFirstFileEx(pattern, FindExInfoStandard, &fd, FindExSearchNameMatch, NULL, 0);
if(h == INVALID_HANDLE_VALUE) {
exit(1);
}
do {
strcpy(name,fd.cFileName);
ptr = name+len;
ptr = strchr(ptr,'_') + 1;
ptr1 = strchr(ptr,'.');
*ptr1 = 0;
if ( !strcmp(ptr,"toc") )
continue;
n1 = atoi(ptr);
if ( n1 > n )
n = n1;
} while(FindNextFile(h, &fd));
return n;
}
#endif
int main(int argc, char *argv[])
{
int n;
char *indir,*outdir;
char in[BUFSIZ],out[BUFSIZ],prefix_[BUFSIZ];
char *prefix,*lang;
char help[BUFSIZ],base[BUFSIZ];
indir = argv[1];
outdir = argv[2];
prefix = indir;
if(argc>3) {
lang = argv[3];
sprintf(base,"%s-%s",prefix,lang);
}else {
sprintf(base,"%s", "man");
}
sprintf(help,"%shelp",prefix);
sprintf(prefix_,"%s_", base);
sprintf(in,"%s/%s_toc.html",indir,base);
sprintf(out,"%s/%s.hhc",outdir,help);
conv_toc(in,out,prefix_,indir);
n = find_files(indir, base);
sprintf(in,"%s/%s_%d.html",indir,base,n);
sprintf(out,"%s/%s.hhk",outdir,help);
conv_index(in,out,prefix_,indir);
sprintf(out,"%s/%s.hhp",outdir,help);
gen_hhp(out,n,indir,base,help);
return 0;
}