MRXT: The Multi-Robot eXploration Tool
Multi-Robot autonomous exploration and mapping simulator.
src/mylib/StringTokenizer.cpp
00001 #include "StringTokenizer.h"
00002 
00003 StringTokenizer::StringTokenizer(char *line, char *delim) {
00004   char *bptr, *eptr, *dptr;
00005 
00006   nTokens = 0;
00007   first = NULL;
00008   last = NULL;
00009   if (!line) {
00010     printf("StringTokenizer::StringTokenizer : no hay linea\n");
00011     return;
00012   }
00013   if (!delim) {
00014     printf("StringTokenizer::StringTokenizer : no hay linea\n");
00015     return;
00016   }
00017   bptr = line;
00018   eptr = bptr;
00019   while ( 1 ) {
00020     char *aux;
00021     if (*eptr) { 
00022       // Si hay algun caracter en la linea miro si coincide con el delim
00023       dptr = delim;
00024       aux = eptr;
00025       //      printf("comparando <%c> y <%c>\n", *eptr, *dptr);
00026       while (*aux && *dptr && *aux==*dptr) { 
00027         // Si coincide busco el final de delim para ver si es un separador
00028         //      printf("<%c == %c>\n", *eptr, *dptr);
00029         aux++;
00030         dptr++;
00031       }
00032       //      printf("Delimitador : aux - eptr = %d\n", aux-eptr);
00033       if (!*dptr) {     
00034         // Si hemos reconocido un delimitador empezando en eptr nos quedamos con el token anterior
00035         /*
00036         printf("Hemos encontrado un delim que empezaba en bptr y termina en eptr:\n");
00037         printf("Longitud del token = %d\n", eptr-bptr);
00038         */
00039         addToken(bptr, eptr-bptr);
00040         /*
00041         for ( char *ptr = bptr ; ptr != eptr ; ptr++) {
00042           printf("[%c]", *ptr);
00043         }
00044         printf("\n");
00045         */
00046         eptr = aux;
00047         bptr = eptr;
00048       } else {
00049         eptr++;
00050       }
00051     } else {
00052       //      if (eptr-bptr+1 > 0) printf("Al final hay %dlentras\n", eptr-bptr+1);
00053       addToken(bptr, eptr-bptr);
00054       break;
00055     }
00056   }
00057   next = first;
00058 }
00059 
00060 int StringTokenizer::addToken(char *token, int size) {
00061   Nodo *n;
00062 
00063   if (!size) return -1;
00064   n = (Nodo *)malloc(sizeof(Nodo));
00065   n -> token = (char *)malloc(sizeof(char)*(size+1));
00066   strncpy(n -> token, token, size);
00067   n -> token[size] = '\0';
00068   if (first) last -> next = n;
00069   else first = n;
00070   last = n;
00071   n -> next = NULL;
00072   nTokens++;
00073   return 1;
00074 }
00075 
00076 StringTokenizer::~StringTokenizer() {
00077   Nodo *n;
00078 
00079   if ( first ) {
00080     n = first;
00081     first = first -> next;
00082     free (n -> token);
00083     free (n);
00084   }
00085 }
00086 
00087 char *StringTokenizer::nextToken(char *delim) {
00088   char *ptr = NULL;
00089   if ( next ) {
00090     ptr = next -> token;
00091     next = next -> next;
00092   }
00093   return ptr;
00094 }
00095 
00096 
00097 int StringTokenizer::countTokens() {
00098   return nTokens;
00099 }
00100 
00101 int StringTokenizer::hasMoreTokens() {
00102   if (first) return (first -> next!= NULL);
00103   else return 0;
00104 }
 All Classes Functions Variables Typedefs