/* Program to store elements in an array of expanding size */

#include <stdio.h>
#include <stdlib.h>

/* Print elements in an array */
void printArray(int arr [], int numValues)
{
  int i;
  printf ("array elements:  ");
  if (numValues > 0)
    {
      printf ("%d", arr[0]);
      for (i = 1; i < numValues; i++)
        printf ("   %d", arr[i]);
    }
  printf ("\n");
  
}

/* Add an item to the array
 * Preconditions: 
 *   0 <= size <= capacity
 * Postconditions:
 *   *size afterward is one larger
 *   (*arr)[(*size)-1] = newValue
 */
void add(int newValue, int* arr[], int* size, int* capacity)
{
  if (*size == *capacity)             /* if current array is full, expand it */
    { 
      int* newArr = malloc(2 * (*capacity) * sizeof(int));
      for (int i = 0; i < *capacity; i++) /* copy items from old array to new */
        newArr[i] = (*arr)[i];
      free (*arr);                                    /* deallocate old array */
      *arr = newArr;                   /* update array reference to new array */
    }
  (*arr)[*size] = newValue;                           /* add new value at end */
  (*size)++;
}

/* Main driver program: Creates, add/expands, and prints array */
int main ()
{
  int arrayCapacity = 1;  /* initial capacity of array */
  int currentSize = 0;
  int * myArray = malloc(arrayCapacity * sizeof (int)); /* active array */

  for (int item = 0; item < 101; item++)
    add(3*item, &myArray, &currentSize, &arrayCapacity );

  printArray (myArray, currentSize);

  return 0;
}
