Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef unsigned char BYTE;
  6. typedef unsigned short WORD;
  7.  
  8. #define mode_normal 0
  9. #define mode_string 1
  10. #define mode_comment 2
  11.  
  12. //-----------------------------------------------------------------------------
  13.  
  14. int main(int argc, char *argv[])
  15. {
  16.  BYTE h[]="0123456789ABCDEF";
  17.  BYTE b, l, i, o, mode, needcomma;
  18.  WORD nstr;
  19.  BYTE si[256], so[256], filename[256];
  20.  FILE *fi, *fo;
  21.  
  22.  printf("SFEP\n");
  23.  // раз уж залез в исходник, то может придумаешь путёвое название проге?!
  24.  // она делает из этого
  25.  //        .DB     "Привет",0
  26.  // вот это
  27.  //        .DB     $8F,$E0,$A8,$A2,$A5,$E2,0
  28.  // (вложенные кавычки не поддерживаются)
  29.  if (argc!=2) { printf("usage: sfep <FileName>\n"); return 2; }
  30.  filename[251]=0;
  31.  strncpy(filename,argv[1],251);
  32.  fi=fopen(filename,"rt");
  33.  if (!fi) { printf("Can't open file %s!\n",filename); return 1; }
  34.  
  35.  l=strlen(filename);
  36.  b=1;
  37.  do
  38.   b++;
  39.  while ((l>b) && (b<4) && (filename[l-b]!='.'));
  40.  if (filename[l-b]=='.')
  41.   strcpy(&filename[l-b],".inc");
  42.  else
  43.   strcat(filename,".inc");
  44.  fo=fopen(filename,"wt");
  45.  if (!fo) { printf("Can't create output file!\n"); return 1; }
  46.  
  47.  nstr=1;
  48.  si[254]=0;
  49.  while (!feof(fi))
  50.  {
  51.   if (fgets(si,254,fi))
  52.   {
  53.    for (l=0; l<254; l++) if ( (si[l]==0) || (si[l]==0x0d) || (si[l]==0x0a) ) break;
  54.    si[l]=0;
  55.    i=0;
  56.    o=0;
  57.    mode=mode_normal;
  58.    needcomma=0;
  59.    do
  60.    {
  61.     b=si[i];
  62.     switch (mode)
  63.     {
  64.      case mode_string:
  65.                         if (b=='\"')
  66.                          mode=mode_normal;
  67.                         else
  68.                         {
  69.                          if (needcomma) so[o++]=',';
  70.                          so[o++]='$';
  71.                          so[o++]=h[b>>4];
  72.                          so[o++]=h[b&0xf];
  73.                          needcomma=1;
  74.                         }
  75.                         break;
  76.      case mode_comment:
  77.                         so[o++]=b;
  78.                         break;
  79.      default:
  80.                         if (b=='\"')
  81.                         {
  82.                          mode=mode_string;
  83.                          needcomma=0;
  84.                         }
  85.                         else
  86.                         {
  87.                          so[o++]=b;
  88.                          if (b==',')
  89.                           needcomma=0;
  90.                          else if (b==';')
  91.                           mode=mode_comment;
  92.                         }
  93.     }
  94.     if (o>250)
  95.     {
  96.      printf("WARNING! Too long line %d. Loss of data is possible.\n",nstr);
  97.      i=254;
  98.     }
  99.     i++;
  100.    }
  101.    while (i<l);
  102.    so[o++]='\n';
  103.    so[o]=0;
  104.    fputs(so,fo);
  105.    nstr++;
  106.   }
  107.  }
  108.  
  109.  fclose(fi);
  110.  fclose(fo);
  111.  printf("Created file %s\n",filename);
  112.  return 0;
  113. }
  114.