/*
+--------------------+
| SHELL CRONOMETRADO |
+--------------------+

        Este programa ejecuta otro programa cronomentrando el tiempo
empleado en la  ejecución del segundo. El programa  a ejecutar puede
ser un programa ejecutable con extensión .EXE o .COM, un fichero por
lotes  .BAT o  un comando  interno del  DOS como  dir. Además  dicho
programa se puede ejecutar con argumentos.

        El main() que está entre  comentarios es la versión que toma
los datos desde la línea de  órdenes del sistema operativo en vez de
preguntar por  ellos con las  funciones de entrada  estándar como se
hace en el main() actual.
*/

#include <process.h> /* system () */
#include <stdio.h>   /* puts (), printf () */
#include <time.h>    /* time_t, difftime (), time () */
#include <string.h>  /* strcat () */
#include <conio.h> /* getch () */

/*
void main (int argc, char **argv);
*/

void main (void);

void ejecutar (char *);

/*
void main (int argc, char **argv)
{
  if (argc == 1)
    puts ("\nEste programa cronometra el tiempo empleado al ejecutar
           el programa\npasado como argumento.\n");
  else
    {
      int cont;
      char nombre_programa_a_ejecutar[256] = { 0 };
      for (cont = 1; cont < argc; cont++)
        {
          if (*nombre_programa_a_ejecutar)
            strcat (nombre_programa_a_ejecutar, " ");
          strcat (nombre_programa_a_ejecutar, *(argv+cont));
        }
      ejecutar (nombre_programa_a_ejecutar);
    }
}
*/

void main (void)
{
  char nombre_programa_a_ejecutar[256] = { 0 };
  printf ("\nIntroduzca nombre de programa a ejecutar: ");
  do
    {
      gets (nombre_programa_a_ejecutar);
    } while (!*nombre_programa_a_ejecutar);
  ejecutar (nombre_programa_a_ejecutar);
  getch ();
}

void ejecutar (char *nombre_programa)
{
  int valor_devuelto;
  time_t tiempo1, tiempo2;
  tiempo1 = time (NULL);
  valor_devuelto = system (nombre_programa);
  tiempo2 = time (NULL);
  if (valor_devuelto == -1)
    printf ("\nError al intentar ejecutar el programa \"%s\".",
            nombre_programa);
  else
    {
      int horas, minutos, segundos;
      unsigned segundos_totales = (unsigned) difftime (tiempo2,
                                  tiempo1);
      segundos = segundos_totales % 60;
      minutos = (segundos_totales / 60) % 60;
      horas = (segundos_totales / 3600) % 24;
      printf ("\nTiempo empleado en la ejecución del programa "
               "\"%s\":\n", nombre_programa);

      if (horas)
        printf ("%d hor%s ", horas, horas == 1 ? "a" : "as");
      if (horas || minutos)
        printf ("%d minut%s ", minutos, minutos == 1 ? "o" : "os");
      printf ("%d segund%s", segundos, segundos == 1 ? "o" : "os");
    }
  puts ("");
}