#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include <ctype.h>

typedef struct 
{
  int count, max;
  char **strings;
} stStringList;

#ifndef __cplusplus
typedef enum { false, true } bool;
#endif

#define GROW 5


#define NewStringList(list) \
  (list) = (stStringList *)malloc(sizeof(stStringList)); \
  (list)->strings = 0; \
  (list)->count = (list)->max = 0;

bool AddString(stStringList *list, char *str)
{
  if(list->count >= list->max)
  {
    char **strings = (char **)realloc(list->strings, sizeof(char *) * (list->max + GROW));
    if(strings)
    {
      list->strings = strings;
      list->max += GROW;
    }
    else 
      return false;
  }
  
  list->strings[list->count] = strdup(str);
  return list->strings[list->count] ? list->count++, true : false;
}


void ParseBuffer(stStringList *list, char *buffer)
{
  char *tok = strchr(buffer, '\n');

  tok ? *tok = '\0' : 0;
  
  tok = strtok(buffer, ",");
  while(tok)
  {
    while(isspace(*tok))
      tok++;
    
    AddString(list, tok);
    tok = strtok(0, ",");
  }
}


stStringList *ReadFile(const char *FileName)
{
  stStringList *list;
  char *str;
  FILE *fpSource = fopen(FileName, "rt");
  
  if(!fpSource)
    return 0;
  
  NewStringList(list);
  str = (char *)malloc(1024);
  
  while(fgets(str, sizeof(char) * 1024, fpSource))
    ParseBuffer(list, str);
  
  free(str);

  fclose(fpSource);
  
  return list;
}

void main(int ArgC, char *ArgV[])
{
  if(ArgC == 2)
  {
    stStringList *list = ReadFile(ArgV[1]);
    if(list)
    {
      int c;
      
      printf("Palavras Lidas: %d\n\n", list->count);
      for(c = 0; c < list->count; c++)
      {
        printf("%s\n", list->strings[c]);
        free(list->strings[c]);
      }
    
      free(list);
    }
  }
}
1