Subversion Repositories pentevo

Rev

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

  1. /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
  2.  
  3. #include "stdinc.h"
  4.  
  5. #include <string.h>
  6. #include "strutil.h"
  7.  
  8. #define TMPNAME "tempfile"
  9.  
  10. #ifdef CKMALLOC
  11. #undef malloc
  12. #undef realloc
  13.  
  14. void *ckmalloc(size_t s)
  15. {
  16.   void *tmp = malloc(s);
  17.  
  18.   if (!tmp)
  19.   {
  20.     fprintf(stderr, "allocation error(malloc): out of memory");
  21.     exit(255);
  22.   }
  23.   return tmp;
  24. }
  25.  
  26. void *ckrealloc(void *p, size_t s)
  27. {
  28.   void *tmp = realloc(p, s);
  29.   if (!tmp)
  30.   {
  31.     fprintf(stderr, "allocation error(realloc): out of memory");
  32.     exit(255);
  33.   }
  34.   return tmp;
  35. }
  36. #endif
  37. void doexec(char *cmdline)
  38. {
  39.  int res=system(cmdline);
  40.  if (res!=0)
  41.  {
  42.    fprintf(stderr, "command \"%s\" failed\n", cmdline); exit(2);
  43.  }
  44. }
  45.  
  46. int main(int argc, char **argv)
  47. {
  48.   FILE *src,*dest;
  49.   int ch;
  50.   char cmdline[1024];
  51.   long charcnt,metacnt,crcnt;
  52.  
  53.   if (argc<2)
  54.   {
  55.     fprintf(stderr, "usage: %s <file> [destfile|destdir/]\n", argv[0]);
  56.     exit(1);
  57.   }
  58.  
  59. #ifdef _WIN32
  60.   {
  61.     char *p;
  62.     int z;
  63.  
  64.     for (z = 1; z < argc; z++)
  65.     {
  66.       argv[z] = as_strdup(argv[z]);
  67.       for (p = argv[z]; *p; p++)
  68.         if (*p == '\\')
  69.           *p = '/';
  70.     }
  71.   }
  72. #endif
  73.  
  74.   src = fopen(argv[1], OPENRDMODE);
  75.   if (src == NULL)
  76.   {
  77.     fprintf(stderr, "error opening %s for reading\n", argv[1]); exit(2);
  78.   }
  79.   if (argc < 3)
  80.     strcpy(cmdline, TMPNAME);
  81.   else
  82.   {
  83.     int l = strlen(argv[2]);
  84.  
  85.     if (strchr("/\\", argv[2][l - 1]))
  86.     {
  87.       const char *p = strrchr(argv[1], argv[2][l - 1]);
  88.       as_snprintf(cmdline, sizeof(cmdline), "%s%s", argv[2], p ? p + 1 : argv[1]);
  89.     }
  90.     else
  91.       strcpy(cmdline, argv[2]);
  92.   }
  93.   dest = fopen(cmdline, OPENWRMODE);
  94.   if (dest == NULL)
  95.   {
  96.     fprintf(stderr, "error opening %s for writing\n", cmdline); exit(2);
  97.   }
  98.   charcnt = metacnt = crcnt = 0;
  99.   while (!feof(src))
  100.   {
  101.     ch = fgetc(src); charcnt++;
  102.     switch (ch)
  103.     {
  104.       case EOF:
  105.         break;
  106.       case 10:
  107.         fputc(13, dest);
  108.         fputc(10, dest);
  109.         crcnt++;
  110.         break;
  111.       default:
  112.         if (ch & 0x80)
  113.         {
  114.           fprintf(stderr, "%s: non-ASCII character 0x%02x @ 0x%x\n",
  115.                   argv[1], ch, (unsigned)ftell(src));
  116.           metacnt++;
  117.         }
  118.         fputc(ch, dest);
  119.     }
  120.   }
  121.   fclose(src);
  122.   fclose(dest);
  123.   if (argc == 2)
  124.   {
  125. #if defined (__MSDOS__) || defined(__EMX__)
  126.     as_snprintf(cmdline, sizeof(cmdline), "copy %s %s", TMPNAME, argv[1]);
  127. #else
  128.     as_snprintf(cmdline, sizeof(cmdline), "cp %s %s", TMPNAME, argv[1]);
  129. #endif
  130.     doexec(cmdline);
  131.     unlink(TMPNAME);
  132.   }
  133.   printf("%s: %ld char(s), %ld cr(s) added, %ld meta char(s) detected\n",
  134.          argv[1], charcnt, crcnt, metacnt);
  135.  
  136.   return metacnt ? 2 : 0;
  137. }
  138.