/* Created by Andrew Woolston on November 13, 2010 for use on http://www.afome.com/
 * feel free to use this code for any purpose, but please let me know if you do end
 * up using the code. I'd love to see where my efforts are being utilized =) Enjoy! */
 
#include <iostream>

int splitString(char* stringToSplit, char* splitters, int numSplitters, char** result);
bool splitterContains(char toCheck, char* splitters, int numSplitters);

using namespace std;

int main()
{
  char testString[] = "This,,.....;is,another;test.string";
  char* result[16];
  char splitters[] = {',', '.',';'};
  int size = splitString(testString, splitters, 3, result);
  for (int i = 0; i < size; i++)
  {
    cout << result[i] << endl;
  }
}


//char* stringToSplit --- Pointer to the string to split
//char* splitters     --- Pointer to the array of delimiters
//int numSplitters    --- the size of splitters
//char** to Modify    --- A pointer to an array of char pointers. An example of intialization for this 
//                        parameter would be char* toModify[16];
//return value        --- returns the size of toModify after the algorithm has been run.
int splitString(char* stringToSplit, char* splitters, int numSplitters, char** toModify) {
  int size = 0;
  int curIndex = 0;
  bool parsingWord = false;
  char* curWord = new char();
 
  for (int i = 0; stringToSplit[i] != '\0'; i++) {
    if (splitterContains(stringToSplit[i], splitters, numSplitters)) {
      if (parsingWord) {
	toModify[size++] = curWord;
	curWord = new char();
	curIndex = 0;
      }
      parsingWord = false;
    }
    else
      parsingWord = true;
    
    if (parsingWord)
      curWord[curIndex++] = stringToSplit[i]; 
  }
  if (parsingWord)
    *(toModify + (size++)) = curWord;
  return size;
}

bool splitterContains(char toCheck, char* splitters, int numSplitters) {
  for (int i = 0; i < numSplitters; i++)
    if (toCheck == *(splitters + i))
      return true;
  return false;
}