/**
 * \file StringTokenizer.cpp
 * Classe de gestion pour le découpage en sous-chaines d'une chaine de caracteres.
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */

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

#include "StringTokenizer.h"

/**
 * Constructeur pour un nouvel objet StringTokenizer.
 *
 * @param chaine La chaine a decouper.
 * @param delimiteur Le caractere delimiteur des sous-chaines.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
StringTokenizer::StringTokenizer(char *chaine,char delimiteur) {
  cpt = 1;
  dlmt = delimiteur;
  s = NULL;
  int l = 0;
  { while ( chaine[l] ) {
      if ( chaine[l] == delimiteur )
        cpt++;
      l++; } }
  s =(char **) calloc(cpt,sizeof(char *));
  int pi = 0;
  for ( int i = 0 ; i < cpt ; i++ ) {
    int pf = pi+1;
    while ( ( chaine[pf] != 0x00 ) && ( chaine[pf] != delimiteur ) )
      pf++;
    s[i] =(char *) calloc(pf-pi+1,sizeof(char));
    for ( int j = pi ; j < pf ; j++ )
      s[i][j-pi] = chaine[j];
    pi = pf+1; }
}

/**
 * Destructeur pour un objet StringTokenizer.
 *
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
StringTokenizer::~StringTokenizer() {
  if ( s ) {
    for ( int i = 0 ; i < cpt ; i++ )
      if ( s[i] )
        free(s[i]);
      free(s); }
}

/**
 * Retour du nombre de sous-chaines extraites.
 *
 * @return Le nombre de sous-chaines extraites.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
int StringTokenizer::size(void) {
  return(cpt);
}

/**
 * Retour d'une sous-chaines extraites.
 *
 * @param n L'indice de la sous-chaine.
 * @return La sous-chaine d'indice n.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
char *StringTokenizer::string(int n) {
  if ( ( n < 0 ) || ( n >= cpt ) )
    return(NULL);
  return(s[n]);
}
