/* Conversion d'une chaine vers une table et vice versa */ #include #include #include #include #include "etc.h" /* Copie les mots d'une chaine dans une table de pointeurs Chaque mot est alloué par strdup(). Retourne le nombre de mot placé dans la table. Retourne -1 si le nombre excède lentb (aucune allocation dans ce cas) Ne place pas de NULL à la fin de la table. L'appelant est responsable de libéré l'espace alloué Si une séquence est englobé par deux quotes, les quotes ne sont pas retirés de la séquence. */ export int str_str2tb ( const char *str, /* chaine de decomposer */ char *tb[], /* table qui contiendra les mots */ int lentb, /* Nombre d'item maximum dans tb */ char quote) /* caractère pour englober une sequence */ /* non divisable "... ... " */ /* ou '\0' si absent */ { int nbmot = 0; while (*str != '\0'){ while (isspace(*str)) str++; if (*str > ' '){ const char *mot; const char *ptpatch; /* Pointeur pour correction */ /* temporaire dans str */ /* Indique aussi fin mot ou séquence */ if (*str == quote){ mot = (str+1); ptpatch = str = str_copyquote (NULL,str); if ((int)(str - mot) >= 1 && str[-1] == quote){ /* Terminaison normale par un quote */ ptpatch --; /* Pointe sur le quote */ } }else{ mot = str; ptpatch = str = str_skipword (str); } if (nbmot >= lentb){ nbmot = -1; break; }else{ int len = (int)(ptpatch - mot); char *tmp = (char*)malloc_err (len+1,0); if (tmp != NULL){ tb[nbmot++] = tmp; memcpy (tmp,mot,len); tmp[len] = '\0'; }else{ break; } } } } return nbmot; }