home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 1 / FFMCD01.bin / bbs / cliutil / addcr.lha / AddCR / Src / AddCR.c < prev    next >
C/C++ Source or Header  |  1993-08-16  |  6KB  |  230 lines

  1. #include <fcntl.h>
  2. #include <proto/dos.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. enum {AMIGA, IBM};
  8.  
  9. const char *version="$VER: AddCR 1.0 (4.8.93)";
  10.  
  11. /*********
  12.   Protos
  13. *********/
  14. extern int __asm amiga2ibm(register __a0 char *inbuffer,
  15.                              register __a1 char *outbuffer,
  16.                              register __d1 int bytes_read);
  17. extern int __asm ibm2amiga(register __a0 char *inbuffer,
  18.                              register __a1 char *outbuffer,
  19.                              register __d1 int bytes_read);
  20.  
  21. /********
  22.   Usage
  23. ********/
  24. void usage(void)
  25. {
  26.     printf("Usage: AddCR <switches> files..\n");
  27.     printf("where <switches> is of the following\n");
  28.     printf("    -a  Convert file to AMIGA format [CR].\n");
  29.     printf("    -b  Convert file to IBM format [LF][CR].\n");
  30.     printf("    -q  Quiet processing of file.\n");
  31.     printf("    -s  Save backup. (Rename original file to '*.bak')\n");
  32.     printf("Default: -b\n");
  33.     exit(0);
  34. }
  35.  
  36. /***********************
  37.   Check if file exists
  38. ***********************/
  39. int exists(char *filename)
  40. {
  41.     BPTR lock;
  42.  
  43.     if ((lock=Lock(filename, MODE_OLDFILE))==NULL)
  44.         return(FALSE);
  45.     else {
  46.         UnLock(lock);
  47.         return(TRUE);
  48.     }
  49. }
  50.  
  51. /*******
  52.   Main
  53. *******/
  54. int main(int argc, char *argv[])
  55. {
  56.     int  c, bufsize, mode, verbose, backup;
  57.     int  bytes_read, total_read, total_write, newlength;
  58.     int  infile, outfile;
  59.     char *inbuffer, *outbuffer;
  60.     char filename[256], bakname[256];
  61.  
  62.     /*******************************
  63.       Initialise default variables
  64.     *******************************/
  65.     backup      = FALSE;
  66.     verbose     = TRUE;
  67.     mode        = IBM;
  68.     bufsize     = 65536;
  69.  
  70.     /******************
  71.       Parse arguments
  72.     ******************/
  73.     if (*argv[1] == '?') usage();
  74.     while ((--argc>0) && ((*++argv)[0] == '-')) {
  75.         while (c = *++argv[0])
  76.             switch (c) {
  77.             case 'a':
  78.                 mode=AMIGA;
  79.                 break;
  80.             case 'b':
  81.                 mode=IBM;
  82.                 break;
  83.             case 'q':
  84.                 verbose=FALSE;
  85.                 break;
  86.             case 's':
  87.                 backup=TRUE;
  88.                 break;
  89.             default:
  90.                 printf("AddCR: Unrecognised switch '-%c'!\n\n",c);
  91.                 usage();
  92.             }
  93.     }
  94.     if (argc==0) usage();
  95.  
  96.     /********************
  97.       Title and credits
  98.     ********************/
  99.     if (verbose) {
  100.         printf("AddCR v1.0 by Son Le\nMode: ");
  101.         if (mode==IBM)
  102.             printf("Convert to IBM\n");
  103.         else
  104.             printf("Convert to AMIGA\n");
  105.     }
  106.  
  107.     /***************************
  108.       Allocating buffer memory
  109.     ***************************/
  110.     while ((inbuffer=(char *)malloc(bufsize*3))==NULL) {
  111.         bufsize /= 2;
  112.         if (bufsize<4096) {
  113.             printf("AddCR: Cannot allocate memory!\n");
  114.             exit(RETURN_FAIL);
  115.         }
  116.     }
  117.  
  118.     /********************************************************************
  119.      In IBM mode, buffer memory is divided 1:2 (in/out)
  120.        - for worse case scenario of buffer full of CR (->LF+CR)
  121.        - would double (x2) it's size when converted.
  122.      In AMIGA mode, buffer memory is divide 1:1 (in/out)
  123.        - no worse case scenario (LF+CR -> CR)
  124.        - worse case of buffer full of LF+CR will halve, when converted.
  125.     ********************************************************************/
  126.     if (mode==AMIGA) bufsize = (bufsize/2)*3;
  127.     outbuffer = (char *)((int)inbuffer + bufsize);
  128.  
  129.     /********************
  130.       Process all files
  131.     ********************/
  132.     argc++;
  133.     *argv--;
  134.     while ((--argc>0) && (*++argv)) {
  135.  
  136.         /***********************
  137.           Check if file exists
  138.         ***********************/
  139.         if (!exists(*argv)) {
  140.             printf("AddCR: Cannot find file '%s'!\n",*argv);
  141.             exit(0);
  142.         }
  143.  
  144.         /*******************
  145.           Extract filename
  146.         *******************/
  147.         stcgfn(filename,*argv);
  148.  
  149.         /******************
  150.           Open input file
  151.         ******************/
  152.         if ((infile=open(*argv,O_RDONLY))==-1) {
  153.             printf("AddCR: Error opening file '%s'!\n",*argv);
  154.             exit(RETURN_FAIL);
  155.         }
  156.  
  157.         /****************************************
  158.           Check if temporary output file exists
  159.         ****************************************/
  160.         if (exists("AddCR.tmp") && (verbose)) {
  161.             printf("AddCR: Temporary file 'AddCR.tmp' exists! Overwrite? (Y/n) ");
  162.             rawcon(1);
  163.             c=getchar();
  164.             rawcon(0);
  165.             putchar(c);
  166.             putchar('\n');
  167.             if ((c=='N') || (c=='n')) exit(0);
  168.         }
  169.  
  170.         /*******************
  171.           Open output file
  172.         *******************/
  173.         if ((outfile=creat("AddCR.tmp",0))==-1) {
  174.             printf("AddCR: Error opening temporary file 'AddCR.tmp'!\n");
  175.             exit(RETURN_FAIL);
  176.         }
  177.  
  178.         /************************
  179.           Read and process file
  180.         ************************/
  181.         total_read = total_write = 0;
  182.         bytes_read = bufsize;
  183.         while (bytes_read==bufsize) {
  184.             bytes_read = read(infile,inbuffer,bufsize);
  185.             total_read += bytes_read;
  186.             if (verbose) {
  187.                 printf("\x0dProcessing %s: %ld bytes",filename,total_read);
  188.                 fflush(stdout);
  189.             }
  190.             newlength=(mode==IBM)?amiga2ibm(inbuffer,outbuffer,bytes_read):
  191.                                   ibm2amiga(inbuffer,outbuffer,bytes_read);
  192.             if (bytes_read==bufsize) {
  193.                 if (inbuffer[bufsize-1]==13) {
  194.                     lseek(infile,-1,1);
  195.                     newlength--;
  196.                     total_read--;
  197.                 }
  198.             }
  199.             write(outfile,outbuffer,newlength);
  200.             total_write += newlength;
  201.         }
  202.         if (verbose)
  203.             printf("\x0dProcessing %s: (%ld bytes) => %ld bytes\n",
  204.                     filename, total_read, total_write);
  205.  
  206.         /**********
  207.           Cleanup
  208.         **********/
  209.         close(infile);
  210.         close(outfile);
  211.         if (backup) {
  212.             strcpy(bakname,*argv);
  213.             strcat(bakname,".bak");
  214.             if (Rename(*argv,bakname)==NULL) {
  215.                 printf("Cannot rename '%s' to '%s'!\n",*argv,bakname);
  216.                 exit(RETURN_FAIL);
  217.             }
  218.         } else {
  219.             if (DeleteFile(*argv)==NULL) {
  220.                 printf("Cannot delete original file '%s'!\n",*argv);
  221.                 exit(RETURN_FAIL);
  222.             }
  223.         }
  224.         if (Rename("AddCR.tmp",filename)==NULL)
  225.             printf("Cannot rename 'AddCR.tmp' to '%s'!\n",filename);
  226.     }
  227.     if (verbose) printf("Done!\n");
  228.     exit(0);
  229. }
  230.