home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / TELECOM / UUCPbb_2_1_src.lzh / UUCPBB21 / filemove.c < prev    next >
Text File  |  1994-09-25  |  6KB  |  238 lines

  1. /*  filemove.c   Various routines to copy, move and append files.
  2.     Copyright (C) 1990, 1993  Rick Adams and Bob Billson
  3.  
  4.     This file is part of the OS-9 UUCP package, UUCPbb.
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.     The author of UUCPbb, Bob Billson, can be contacted at:
  21.     bob@kc2wz.bubble.org  or  uunet!kc2wz!bob  or  by snail mail:
  22.     21 Bates Way, Westfield, NJ 07090
  23. */
  24.  
  25. /* These functions return TRUE, on successful copying, FALSE if there
  26.    was an error. */
  27.  
  28. #include "uucp.h"
  29. #include <modes.h>
  30.  
  31. #define BSIZE     1024
  32.  
  33. FILE *skpheader();
  34.  
  35.  
  36. /* Fast move a file.  No LF <-> CR translation takes place.  The original
  37.    file remains unchanged. */
  38.  
  39. int filemovf (infile, dest)
  40. FILE *infile;
  41. char *dest;
  42. {
  43.      FILE *outfile;
  44.  
  45.      if ((outfile = fopen (dest, "w")) == NULL)
  46.           return (FALSE);
  47.  
  48.      return (fastcopy (infile, outfile, FALSE, FALSE));
  49. }
  50.  
  51.  
  52. /* Copy a file from one place to another.  No LF <-> CR translations is done.
  53.    The source file is deleted after a successful move. */
  54.  
  55. int filemove (source, dest)
  56. char *source, *dest;
  57. {
  58.      FILE *infile, *outfile;
  59.      int noerror;
  60.  
  61.      if ((infile = fopen (source, "r")) == NULL)
  62.           return (FALSE);
  63.  
  64.      if ((outfile = fopen (dest, "w")) == NULL)
  65.           return (FALSE);
  66.  
  67.      noerror = fastcopy (infile, outfile, FALSE, FALSE);
  68.  
  69.      if (noerror)
  70.           unlink (source);
  71.  
  72.      return (noerror);
  73. }
  74.  
  75.  
  76.  
  77. /* Copy file changing CRs to LFs.  The source file is deleted after a 
  78.    successful copy. */
  79.  
  80. int filemovl (source, dest)
  81. char *source, *dest;
  82. {
  83.      FILE *infile, *outfile;
  84.      int noerror;
  85.      
  86.      if ((infile = fopen (source, "r")) == NULL)
  87.           return (FALSE);
  88.  
  89.      if ((outfile = fopen (dest, "w")) == NULL)
  90.           return (FALSE);
  91.  
  92.      noerror = fastcopy (infile, outfile, TRUE, FALSE);
  93.  
  94.      if (noerror)
  95.           unlink (source);
  96.  
  97.      return (noerror);
  98. }
  99.  
  100.  
  101. /* Copy a file to another.  No LF <-> CR translation is done.  The source
  102.    file is left unchanged. */
  103.  
  104. int filecopy (source, dest)
  105. char *source, *dest;
  106. {
  107.      FILE *infile, *outfile;
  108.  
  109.      if ((infile = fopen (source, "r")) == NULL)
  110.           return (FALSE);
  111.  
  112.      if ((outfile = fopen (dest, "w")) == NULL)
  113.           return (FALSE);
  114.  
  115.      return (fastcopy (infile, outfile, FALSE, FALSE));
  116. }
  117.  
  118.  
  119. /* Append one file onto another.  If the variable lf2cr is TRUE, any LF are
  120.    changed to CRs during the copy.  If lf2cr is FALSE, any CRs are changed
  121.    to LFs during the copy.  The source file is left unchanged. */
  122.  
  123. int fileapnd (source, dest, lf2cr)
  124. char *source, *dest;
  125. flag lf2cr;
  126. {
  127.      FILE *infile, *outfile;
  128.  
  129.      if ((infile = fopen (source, "r")) == NULL)
  130.           return (FALSE);
  131.  
  132.      if ((outfile = fopen (dest, "a")) == NULL)
  133.           return (FALSE);
  134.  
  135.      return (fastcopy (infile, outfile, TRUE, lf2cr));
  136. }
  137.  
  138.  
  139.  
  140. /* Same as fileapnd() above, except all lines are skip until the first blank
  141.    line containing only a CR or LF is reached, appending begins with the
  142.    following line. */
  143.  
  144. int fileapskp (source, dest, lf2cr)
  145. char *source, *dest;
  146. int lf2cr;
  147. {
  148.      FILE *infile, *outfile;
  149.  
  150.      if ((infile = fopen (source, "r")) == NULL)
  151.           return (FALSE);
  152.  
  153.      if ((outfile = fopen (dest, "a")) == NULL)
  154.           return (FALSE);
  155.  
  156.      infile = skpheader (infile);
  157.      return (fastcopy (infile, outfile, TRUE, lf2cr));
  158. }
  159.  
  160.  
  161.  
  162. /* Fast copy a file.  If lf2cr is TRUE, all LFs are changed to CRs.  If lf2cr
  163.    is FALSE, all CRs are changed to LFs.
  164.  
  165.    Attempt to lessen file fragmentation by seeking outfile to the maximum
  166.    length of infile, write a byte, then rewind the file pointer.  */
  167.  
  168. int fastcopy (infile, outfile, fixLFCR, lf2cr)
  169. FILE *infile;
  170. FILE *outfile;
  171. int fixLFCR, lf2cr;
  172. {
  173.      char buff[BSIZE];
  174.      register char *bscan;
  175.      char *p, fromchar, tochar;
  176.      int count, noerror = TRUE;
  177.      long insize, _gs_size();
  178.  
  179.      if (fixLFCR)                                       /* LF->CR or CR->LF */
  180.        {
  181.           fromchar = lf2cr ? '\x0A' : '\x0D';
  182.           tochar   = lf2cr ? '\x0D' : '\x0A';
  183.        }
  184.  
  185.      if ((insize = _gs_size (fileno (infile))) != -1)
  186.        {
  187.           long origptr;
  188.  
  189.           origptr = ftell (outfile);
  190.           fseek (outfile, insize - 1, 1);
  191.           write (fileno (outfile), " ", 1);
  192.           fseek (outfile, origptr, 0);
  193.        }
  194.  
  195.      p = buff;
  196.  
  197.      while ((count = fread (p, sizeof (char), BSIZE, infile)) != 0)
  198.        {
  199.           if (fixLFCR)
  200.                for (bscan = p + count; --bscan >= p; )
  201.                     if (*bscan == fromchar)
  202.                          *bscan = tochar;
  203.  
  204.           if (fwrite (p, sizeof (char), count, outfile) == 0)
  205.                if (feof (outfile) == 0)
  206.                  {
  207.                     noerror = FALSE;
  208.                     break;
  209.                  }
  210.        }
  211.  
  212.      if (feof (infile) == 0)
  213.           noerror = FALSE;
  214.  
  215.      fclose (infile);
  216.      fclose (outfile);
  217.      return (noerror);
  218. }
  219.  
  220.  
  221.  
  222. /* Read a file until we come to a line starting with a CR or LF.  The file
  223.    pointer is returned pointing to the next line to read. */
  224.  
  225. FILE *skpheader (file)
  226. FILE *file;
  227. {
  228.      char buffer[256], *p;
  229.  
  230.      p = buffer;
  231.  
  232.      while (mfgets (p, sizeof (buffer), file) != NULL)
  233.           if (*p == '\0')
  234.                break;
  235.  
  236.      return (file);
  237. }
  238.