/**** Convert upper case to lower case with low-level I/O calls ****/
/**** Inputs from file given in first argument and writes to file given ****/ 
/**** in second argument       ****/

#include <stdio.h>
#include <fcntl.h>
#define BUFSIZE 1024

void lower(char *buf, int length)
{   while (length-- > 0)
    {    *buf = tolower( *buf );
         buf++;
    }
}

int main(int argc, char *argv[])
{ char buffer[BUFSIZE];
  int NumChars;              /* number of characters */
  int fdread, fdwrite;       /* file descriptors for read file and write file */
  /* open argv[1] for reading */
  if ((fdread = open(argv[1], O_RDONLY)) == -1)
    {  fprintf(stderr,"%s; cannot open %s\n", argv[0], argv[1]);
       perror("");
       exit(1);
    }  
  /* open argv[2] for writing */
  if ((fdwrite = open(argv[2], O_WRONLY)) == -1)
    {  fprintf(stderr,"%s; cannot open %s\n", argv[0], argv[1]);
       perror("");
       exit(1);
    }  
   while ((NumChars = read(fdread, buffer, BUFSIZE)) > 0)
      {    lower(buffer,NumChars);
           NumChars = write(fdwrite, buffer, NumChars);
           if (NumChars == -1) break;
      }  /* END WHILE */
   if (NumChars == -1)    /* read or write failed */
      {    perror(argv[0]);
           exit(1);
      }
   close(fdread);
   close(fdwrite);

   return(0);
}

