/************************************************************/ /* RTFIndex v2.0 by Olivier Couvreur */ /* A WIN32 console application for building Index RTF files */ /* supports both WC 11.0 and VC 5.0 compiler */ /************************************************************/ #include #include #include #include #define NAME "RTFIndex" #define VERSION "2.0" #define AUTHOR "Olivier Couvreur" /* some macros in order to compile under WC 11.0 or VC 5.0 */ #if defined(__WATCOMC__) #include #define M_INITFIND #define M_FINDFIRST(a,b,c) (!_dos_findfirst(a,b,c)) #define M_FINDNEXT(c) _dos_findnext(c) #define M_FINDCLOSE(c) _dos_findclose(c) #define M_FINDDATA find_t #else #include #define M_INITFIND long findhandle=-1L; #define M_FINDFIRST(a,b,c) ((findhandle=_findfirst(a,c))!=-1L) #define M_FINDNEXT(c) _findnext(findhandle,c) #define M_FINDCLOSE(a) _findclose(findhandle) #define M_FINDDATA _finddata_t #endif /* The magic header */ char RTFHeader[]= "{\\rtf1\\ansi\\ansicpg1252\\uc1 \\deff0\\deflang1033\\deflangfe1036{\\fonttbl{\\f0\\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\f17\\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\f18\\froman\\fcharset204\\fprq2 Times New Roman Cyr;}" "{\\f20\\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\f21\\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\f22\\froman\\fcharset186\\fprq2 Times New Roman Baltic;}}{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;" "\\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\\red128\\green0\\blue0;\\red128\\green128\\blue0;" "\\red128\\green128\\blue128;\\red192\\green192\\blue192;}{\\stylesheet{\\widctlpar\\adjustright \\fs20\\lang1036 \\snext0 Normal;}{\\s4\\fi-284\\li284\\sb240\\sa60\\widctlpar\\adjustright \\b\\i\\cf2\\lang2057 \\sbasedon0 \\snext0 heading 4;}{\\*\\cs10 \\additive " "Default Paragraph Font;}{\\s15\\widctlpar\\adjustright \\fs20\\lang1036 \\sbasedon0 \\snext15 footnote text;}{\\*\\cs16 \\additive \\super \\sbasedon10 footnote reference;}{\\s17\\keepn\\widctlpar\\adjustright \\b\\fs28\\cf11\\lang1036 \\sbasedon0 \\snext17 Title;}{" "\\s18\\widctlpar\\tqc\\tx4536\\tqr\\tx9072\\adjustright \\fs20\\lang1036 \\sbasedon0 \\snext18 header;}{\\s19\\widctlpar\\tqc\\tx4536\\tqr\\tx9072\\adjustright \\fs20\\lang1036 \\sbasedon0 \\snext19 footer;}{\\*\\cs20 \\additive \\uldb\\nosupersub Lien;}{\\*\\cs21 \\additive " "\\v\\ulnone\\nosupersub R\\'e9f\\'e9rence;}}{\\info{\\title K$ Nom de la M\\'e9taAction}{\\author Xavier Billault}{\\keywords %s}{\\operator Yves BABITCH}{\\creatim\\yr1997\\mo3\\dy19\\hr9\\min34}{\\revtim\\yr1998\\mo7\\dy23\\hr12\\min5}{\\version12}{\\edmins17}" "{\\nofpages1}{\\nofwords13}{\\nofchars79}{\\*\\company UBI SOFT}{\\nofcharsws0}{\\vern89}}\\margl1417\\margr1417\\margt1417\\margb1417 \\deftab708\\widowctrl\\ftnbj\\aenddoc\\hyphhotz425\\hyphcaps0\\formshade\\viewkind1\\viewscale129\\viewzk2 \\fet0\\sectd " "\\linex0\\headery709\\footery709\\colsx709\\endnhere\\sectdefaultcl {\\*\\pnseclvl1\\pnucrm\\pnstart1\\pnindent720\\pnhang{\\pntxta .}}{\\*\\pnseclvl2\\pnucltr\\pnstart1\\pnindent720\\pnhang{\\pntxta .}}{\\*\\pnseclvl3\\pndec\\pnstart1\\pnindent720\\pnhang{\\pntxta .}}{\\*\\pnseclvl4" "\\pnlcltr\\pnstart1\\pnindent720\\pnhang{\\pntxta )}}{\\*\\pnseclvl5\\pndec\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl6\\pnlcltr\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl7\\pnlcrm\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}" "{\\pntxta )}}{\\*\\pnseclvl8\\pnlcltr\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}\\pard\\plain \\s17\\keepn\\widctlpar\\adjustright \\b\\fs28\\cf11\\lang1036 {\\cs16\\super #{\\footnote " "\\pard\\plain \\s15\\widctlpar\\adjustright \\fs20\\lang1036 {\\cs16\\super #}{ IDH_}{\\field\\fldedit{\\*\\fldinst { KEYWORDS \\\\* UPPER \\\\* MERGEFORMAT }}{\\fldrslt {%s}}}}K{\\footnote \\pard\\plain \\s15\\widctlpar\\adjustright \\fs20\\lang1036 {\\cs16\\super K}" "{\\field{\\*\\fldinst { KEYWORDS \\\\* MERGEFORMAT }}{\\fldrslt {%s}}}}${\\footnote \\pard\\plain \\s15\\widctlpar\\adjustright \\fs20\\lang1036 {\\cs16\\super $}{ }{\\field{\\*\\fldinst { KEYWORDS \\\\* MERGEFORMAT }}{\\fldrslt {%s}}}}}" "{\\field{\\*\\fldinst { KEYWORDS \\\\* MERGEFORMAT }}{\\fldrslt {%s}}}{\\par }" "\\pard\\plain \\s4\\fi-284\\li284\\sb240\\sa60\\widctlpar\\outlinelevel3\\adjustright \\b\\i\\cf2\\lang2057 " "\\pard\\plain \\widctlpar\\adjustright \\fs20\\lang1036 " "{\\par }"; char RTFFooter[]= "}\n"; #define MAX_STRING_SIZE 256 #define NB_MAX_RTF 1000 typedef struct { char FileName[MAX_STRING_SIZE]; char IndexName[MAX_STRING_SIZE]; } RTFIndexStruct; RTFIndexStruct RTFIndex[NB_MAX_RTF]; long filesize( FILE *fp ) { long save_pos, size_of_file; save_pos = ftell( fp ); fseek( fp, 0L, SEEK_END ); size_of_file = ftell( fp ); fseek( fp, save_pos, SEEK_SET ); return( size_of_file ); } /* look for ... string in text "keywords ...}" */ void AddRTFFileToIndex(char *directory,RTFIndexStruct *RTFIndex) { FILE *infp; char filename[MAX_STRING_SIZE]; char *ptr1,*ptr2; char *mem; long size; char keyword1[]="keywords "; char keyword2[]="}"; _makepath(filename,NULL,directory,RTFIndex->FileName,NULL); strupr(filename); if ((infp=fopen(filename,"r"))!=NULL) { size=filesize(infp); if ((mem=(char*) malloc(size))!=NULL) { fread(mem,size,1,infp); if ((ptr1=strstr(mem,keyword1))!=NULL) { ptr1+=strlen(keyword1); if ((ptr2=strstr(ptr1,keyword2))!=NULL) { *ptr2=0; strcpy(RTFIndex->IndexName,ptr1); } else { strcpy(RTFIndex->IndexName,"Keywords not found"); } } free(mem); } fclose(infp); } } int CompareIndex(const void *op1, const void *op2 ) { RTFIndexStruct *p1 = (RTFIndexStruct *) op1; RTFIndexStruct *p2 = (RTFIndexStruct*) op2; return( strcmp(p1->IndexName, p2->IndexName) ); } void GenerateRTFIndex(char *file,char *title,char *directory) { FILE *outfp; char completefilename[MAX_STRING_SIZE]; char *filename; char pattern[MAX_STRING_SIZE]; char supertitle[MAX_STRING_SIZE]; char str[MAX_STRING_SIZE]; struct M_FINDDATA FINDT; unsigned done=0; char *ptr; long i,n=0; M_INITFIND if ((ptr=strrchr(file,'.'))!=NULL) *ptr=0; _makepath(completefilename,NULL,NULL,file,"rtf"); strupr(completefilename); if ((filename=strrchr(completefilename,'\\'))==NULL) filename=&completefilename[0]; else filename++; _makepath(pattern,NULL,directory,"*","rtf"); strupr(pattern); /* find .rtf files in directory */ n=0; if (M_FINDFIRST(pattern,_A_NORMAL,&FINDT)) { done=0; while ( (!done) && (n0) { printf("Sorting index...\n"); qsort(&RTFIndex[0],n,sizeof(RTFIndexStruct),CompareIndex); printf("Generating index %s ...\n",completefilename); if ((outfp=fopen(completefilename,"w"))!=NULL) { strcpy(supertitle,title);strupr(supertitle); while ((ptr=strchr(supertitle,' '))!=NULL) *ptr='_'; fprintf(outfp,RTFHeader,title,supertitle,title,title,title); for (i=0;i