/*
+-----------------------------------------------+
| COPIA DE UN FICHERO (SIMILAR AL COPY DEL DOS) |
+-----------------------------------------------+

        Este   programa   copia   un   fichero   a   otro   fichero.
Funcionalmente este programa es similar al copy del DOS o al cat del
UNIX. Si el  fichero de salida es con, se  está haciendo un type del
DOS. Si el  fichero de entrada es con, recuerda  que el carácter fin
de fichero se escribe con CTRL-Z en el DOS.

        La  función strcpy()  copia  el  string pasado  como segundo
argumento  en el  string pasado  como primer  argumento. La  función
toupper() devuelve el carácter pasado como argumento en mayúscula.
*/

#include <stdio.h>  /* printf (), gets (), fprintf (), stderr, EOF,
                    fopen (), fclose (), fgetc (), fputc (), NULL */

#include <conio.h> /* getch () */
#include <string.h> /* strcpy () */
#include <ctype.h> /* toupper () */

#define BOOLEAN int
#define TRUE    1
#define FALSE   0

#define ESC 27
#define ENTER '\r'

#define NUMMAXCARACTERES 255

void main (void)
{
  BOOLEAN salir = FALSE;
  char nombre_fichero_entrada[NUMMAXCARACTERES],
       nombre_fichero_salida[NUMMAXCARACTERES];
  FILE *pfe, *pfs; /* punteros a fichero de entrada y fichero de
                   salida resp. */
  char ch;

  while (! salir)
    {
      puts ("\n\nCOPIAR FICHERO CON EL SISTEMA DE FICHEROS DE ALTO
             NIVEL:\n");
      printf ("Introduzca nombre de fichero de entrada (ENTER o CON "
              "para teclado): ");
      gets (nombre_fichero_entrada);
      if (*nombre_fichero_entrada == '\0')
        strcpy (nombre_fichero_entrada, "con");
      printf ("Introduzca nombre de fichero de salida (ENTER o CON "
               "para pantalla): ");
      gets (nombre_fichero_salida);
      if (*nombre_fichero_salida == '\0')
        strcpy (nombre_fichero_salida, "con");
      if ((pfe = fopen (nombre_fichero_entrada, "r")) == NULL)
        fprintf (stderr, "\nERROR: No es posible abrir el fichero de "
                 "entrada %s.\n", nombre_fichero_entrada);
      else if ((pfs = fopen (nombre_fichero_salida, "w")) == NULL)
        {
          fprintf (stderr, "\nERROR: No es posible abrir el fichero "
                   "de salida %s.\n", nombre_fichero_salida);
          fclose (pfe);
        }
      else
        {
          int c;
          while ((c = fgetc (pfe)) != EOF)
            fputc (c, pfs);

          fclose (pfe);
          fclose (pfs);
        }

      printf ("\n\n¿Desea copiar otro fichero (S o ENTER: Sí; N o "
              "ESC: No)? ");
      do
        {
          ch = getch ();
        } while (ch != ENTER && toupper (ch) != 'S' &&
                 ch != ESC && toupper (ch) != 'N');
      salir = ch == ESC || toupper (ch) == 'N';
    }
}