/*  --- LA, CSSE, Monash University, Australia 3800,  3/2/2005 ---  */

#include <stdio.h>

main(int   argc,  /* Count of command line arguments (parameters) */
     char *argv[] /* Values of parameters: array of string (pointer to char) */
    )
 { FILE *inp;  int i, result, Ai, *A, N;

   printf("command line:");
   for(i = 0; i < argc; i++)
      printf(" argv[%d]=\"%s\"", i, argv[i]);   /* print each cmd line param */
   printf("\n");                                /* NB argv[0] = program name */

   inp = stdin;                                 /* default input file, but...*/
                                                /* if there is a genuine     */
   if(argc > 1)                                 /* command line parameter... */
    { inp = fopen(argv[1], "r");                /* mode "r" i.e. read, text  */
      if(!inp)                                  /* error, could not open it  */
       { printf("could not open file \"%s\", halting\n", argv[1]);
         exit(1);
       }
    }
   else                     /* no genuine command line parameters, use stdin */
      printf("no file specified, reading from stdin\n");


/* ------------------------------------------------------------- */
/* Read some integers from a file, stop at EOF, allocate as much */
/* space as necessary, do it all in linear time.                 */

   N = 1;
   A = (int*)malloc(N*sizeof(int));           /* allocate a small array A[] */

   for(i = 0; ; i++)
    { result = fscanf(inp, "%i", &Ai);
      if(result == EOF)                       /* done */
         break;
   /* else */
      if( i >= N )
       { N = 2*N;
         A = (int*)realloc(A, N*sizeof(int)); /* enlarge A[] if necessary */
       }
      A[i] = Ai;
      printf("A[%i] = %i\n", i, A[i]);        /* trace */
    }
   N = i;
   A = (int*)realloc(A, N*sizeof(int));       /* trim A[] down to size */

   printf("N = %i\n", N);                     /* trace */

 }/*main*/

/* malloc, realloc, L.Allison Comp Sci Monash */
