home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 June / Chip_1999-06_cd.bin / ctenari / Kvarda / source / FILE_HTMLADD.C < prev    next >
C/C++ Source or Header  |  1996-01-30  |  8KB  |  282 lines

  1. /************************************************************************\
  2. *
  3. * MODULE    : FILE_HTMLADD.C
  4. *
  5. * PROGRAMS  : HTMLADD
  6. *
  7. * PURPOSE   : Conversion of source file to target file replacing    
  8. *             source code page characters with codes >127 by 
  9. *             HTML character entities
  10. *
  11. \************************************************************************/
  12.  
  13. #include <windows.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16.  
  17. #include "CONV_SUB.H"
  18.  
  19. /************************************************************************\
  20. * Time mode setting
  21. *   current   set date/time of the target file to the current file
  22. *   original  set date/time of the target file to be the same as
  23. *             of the source (original) file
  24. \************************************************************************/
  25.  
  26. enum {original, current};
  27.  
  28. static int TimeMode = original;
  29. FILETIME CurrentTime;
  30.  
  31. void SetOriginalFileTime (void)
  32. {
  33.    TimeMode=original;
  34. }
  35.  
  36. void SetCurrentFileTime (void)
  37. {
  38.    TimeMode=current;
  39.    CoFileTimeNow(&CurrentTime);
  40. }
  41.  
  42. /************************************************************************\
  43. * Encoding setting
  44. *   EncDir    encoding directory (directory of the code page tables)
  45. *   CodePage  target code page
  46. \************************************************************************/
  47.  
  48. static char EncDir[_MAX_PATH];
  49. static char CodePage[_MAX_FNAME]={"CP1250"};
  50.  
  51. void SetEncodingDirectory (char *directory)
  52. {
  53.    int n;
  54.    strncpy(EncDir,directory,_MAX_PATH);
  55.    EncDir[_MAX_PATH-1]='\0';
  56.    n=strlen(EncDir);
  57.    while (n>0 && EncDir[n]=='\\')
  58.      {
  59.       EncDir[n]='\0';
  60.       n--;
  61.      }
  62. }
  63.  
  64. void SetSourceCodePage (char *cp)
  65. {
  66.    strncpy (CodePage,cp,_MAX_FNAME);
  67.    CodePage[_MAX_FNAME-1]='\0';
  68. }
  69.  
  70. /************************************************************************\
  71. * Directory for temporary files
  72. \************************************************************************/
  73.  
  74. static char TempDir[_MAX_PATH]={""};
  75.  
  76. /************************************************************************\
  77. * Conversion tables
  78. *   Conv0,nConv0   structure for creation of conversion table
  79. *   Conv,nConv     conversion table
  80. \************************************************************************/
  81.  
  82. static struct {
  83.    char entity[20];
  84.    char description[30];
  85.    int  ichar;
  86.    BOOL use;
  87.   } Conv0[256];
  88. static int nConv0=0;
  89.  
  90. static char Conv[256][20];
  91. static int nChar[256];
  92.  
  93. /************************************************************************\
  94. *
  95. * FUNCTION    : InitConversionTable
  96. *
  97. * LOCAL VARS  : fname       - code page table filename
  98. *               f           - code page table file handle
  99. *               line        - buffer for code page table line
  100. *               entity      - HTML entity
  101. *               description - character description
  102. *               ichar       - character code
  103. *
  104. \************************************************************************/
  105.  
  106. BOOL InitConversionTable (void)
  107. {
  108.    int  i,j,n,ichar;
  109.    char entity[20],description[30],line[100];
  110.    char fname[_MAX_FNAME];
  111.    FILE *f;
  112.  
  113.    if (GetTempPath((DWORD)sizeof(TempDir),TempDir)==0)
  114.       return (FALSE);
  115.  
  116. // HTML entities table reading
  117.  
  118.    strcat(strcpy(fname,EncDir),"\\HTML.ENC");
  119.    f=fopen(fname,"rt");
  120.    if (f==NULL)
  121.      {
  122.       printf("\n Error: Unable to find %s",fname);
  123.       return (FALSE);
  124.      }
  125.    while(!feof(f))
  126.      {
  127.       if (fgets(line,100,f)==NULL)
  128.          break;
  129.       if (line[0]==';')
  130.          continue;
  131.       line[99]='\0';
  132.       memset(entity,0,20);
  133.       memset(description,0,30);
  134.       sscanf(line,"%s %s",entity,description);
  135.       n=strlen(entity);
  136.       if (entity[0]!='&' || entity[n-1]!=';')
  137.          continue;
  138.       if (strcmp(entity,"&")==0 || strcmp(entity,"<")==0 || 
  139.           strcmp(entity,""")==0)
  140.          continue; 
  141.       Conv0[nConv0].use=FALSE;
  142.       strcpy(Conv0[nConv0].entity,entity);
  143.       strcpy(Conv0[nConv0].description,description);
  144.       Conv0[nConv0].ichar=32;
  145.       nConv0++;
  146.      }
  147.    fclose(f);
  148.  
  149. // source code page table reading and assignment to the HTML entities
  150.  
  151.    strcat(strcat(strcat(strcpy(fname,EncDir),"\\"),CodePage),".ENC");
  152.    f=fopen(fname,"rt");
  153.    if (f==NULL)
  154.      {
  155.       printf("\n Error: Unable to find %s",fname);
  156.       return (FALSE);
  157.      }
  158.    while(!feof(f))
  159.      {
  160.       if (fgets(line,100,f)==NULL)
  161.          break;
  162.       if (line[0]==';')
  163.          continue;
  164.       line[99]='\0';
  165.       memset(description,0,30);
  166.       sscanf(line,"%d %s",&ichar,description);
  167.       if (strlen(description)<1)
  168.          continue;
  169.       for(i=0; i<nConv0; i++)
  170.         {
  171.          if (Conv0[i].use==TRUE)
  172.             continue;
  173.          if (strcmp(description,Conv0[i].description)==0)
  174.            { 
  175.             Conv0[i].ichar=ichar;
  176.             Conv0[i].use=TRUE;
  177.            }
  178.         }
  179.      }
  180.    fclose(f);
  181.  
  182. // finishing file conversion table
  183.  
  184.    for (i=0; i<256; i++)
  185.      {
  186.       Conv[i][0]=(char)i;
  187.       Conv[i][1]='\0';
  188.       nChar[i]=1;
  189.      }
  190.  
  191.    for (i=0; i<nConv0; i++)
  192.       if (Conv0[i].use==TRUE && Conv0[i].ichar>127)
  193.         {
  194.          j=Conv0[i].ichar;
  195.          strcpy (Conv[j],Conv0[i].entity);
  196.          nChar[j]=strlen(Conv[j]);
  197.         }
  198.  
  199.    return (TRUE);
  200. }
  201.  
  202. /************************************************************************\
  203. *
  204. * FUNCTION    : ConvertFile
  205. *
  206. * INPUTS      : SourceDir  - source file name
  207. *               TargetDir  - target file name
  208. *
  209. * RETURNS     : None
  210. *
  211. * LOCAL VARS  : hSFile     - source file handle
  212. *               hTFile     - target file handle
  213. *               hTempFile  - temporary file handle
  214. *               TempName   - temporary file name
  215. *               ssize      - source file size
  216. *               stime      - source file time
  217. *               buff       - buffer for source file content
  218. *
  219. \************************************************************************/
  220.  
  221. void ConvertFile(char *SFileName, char *TFileName)
  222. {
  223.    HANDLE hSFile, hTFile, hTempFile;
  224.    char buff[16384];
  225.    char TempName[_MAX_FNAME];
  226.    DWORD dwBytesRead,dwBytesWritten;
  227.    DWORD ssize;
  228.    FILETIME stime;
  229.    int i,j;
  230.  
  231.    if (GetTempFileName(TempDir,"HTA",0,TempName)==0)
  232.       return;
  233.    hTempFile= CreateFile(TempName,GENERIC_WRITE,0,
  234.                          (LPSECURITY_ATTRIBUTES)NULL,CREATE_ALWAYS,
  235.                          FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
  236.    if (hTempFile==INVALID_HANDLE_VALUE)
  237.       return;
  238.  
  239.    hSFile= CreateFile(SFileName,GENERIC_READ,0,
  240.                       (LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING,
  241.                       FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
  242.    if (hSFile==INVALID_HANDLE_VALUE)
  243.       return;
  244.    ssize=GetFileSize(hSFile,NULL);
  245.    GetFileTime(hSFile,NULL,NULL,&stime);
  246.  
  247.    do 
  248.      {
  249.       if (ReadFile(hSFile, (LPSTR)buff, 16384, &dwBytesRead, NULL)) 
  250.         {
  251.          for (i=0; i<(int)dwBytesRead; i++)
  252.            {
  253.             j=(int)buff[i];
  254.             if (j<0)
  255.                j+=256;
  256.             WriteFile(hTempFile,(LPSTR)Conv[j],nChar[j],&dwBytesWritten,NULL);
  257.            }
  258.         }
  259.      }
  260.    while (dwBytesRead==16384);
  261.  
  262.    CloseHandle(hSFile);
  263.    CloseHandle(hTempFile);
  264.  
  265.    CopyFile(TempName,TFileName,FALSE);
  266.    DeleteFile(TempName);
  267.  
  268.    hTFile= CreateFile(TFileName,GENERIC_WRITE,0,
  269.                       (LPSECURITY_ATTRIBUTES) NULL,OPEN_EXISTING,
  270.                       FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
  271.    if (hTFile==INVALID_HANDLE_VALUE)
  272.       return;
  273.    if (TimeMode==current)
  274.       SetFileTime(hTFile,NULL,NULL,&CurrentTime);
  275.    else
  276.       SetFileTime(hTFile,NULL,NULL,&stime);
  277.    CloseHandle(hTFile);
  278.    printf("\n  Converted target file: %s", TFileName);
  279.    return;
  280. }
  281.  
  282.