1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| int TK_LoadEval::Str_GetToken(char *ChaineStr,std::vector <char *> &ListeToken)
{//parcours la chaine et la transforme en token
if (ChaineStr)
{ //Init
char *Ptr=ChaineStr;
int SizeStr=strlen(ChaineStr);
if (SizeStr)
{//si pas chaine vide
//Str_DelToken(&ListeToken);
ListeToken.clear();
ListeToken.reserve(SizeStr/2); //nettoie le vecteur et reserve la motie de la taille de la chaine
char *BufferCpy=(char *)calloc(SizeStr,sizeof(char));
char *ptrBuf=BufferCpy;
if (BufferCpy)
{//allocation reussie
while (*Ptr!=0)
{//pour tous les caracteres
if (!isspace(*Ptr))
{//c'est pas un blanc
if (!is_ProgSepar(*Ptr)) {*ptrBuf=*Ptr;ptrBuf++;} //pas un separateur
else //c'est un separateur
{ //on copie le buffer si present
if ((*BufferCpy)!=0)
{//le buffer n'est pas vide
*ptrBuf=0;
char *Chaine=(char *)calloc(strlen(BufferCpy)+1,sizeof(char));
memcpy(Chaine,BufferCpy,strlen(BufferCpy));
ListeToken.push_back(Chaine);
memset(BufferCpy,0,strlen(BufferCpy));ptrBuf=BufferCpy;
}
//on copie l'opérande
if (is_DblOper(Ptr))
{
char *Chaine=(char *)calloc(3,sizeof(char));
memcpy(Chaine,Ptr,2);Chaine[2]=0;
ListeToken.push_back(Chaine);
}
else
{
char *Chaine=(char *)calloc(2,sizeof(char));
memcpy(Chaine,Ptr,1);Chaine[1]=0;
ListeToken.push_back(Chaine);
}
}
}
else
{//c'est un blanc
if ((*BufferCpy)!=0)
{//le buffer n'est pas vide
*ptrBuf=0;
char *Chaine=(char *)calloc(strlen(BufferCpy)+1,sizeof(char));
memcpy(Chaine,BufferCpy,strlen(BufferCpy));
ListeToken.push_back(Chaine);
memset(BufferCpy,0,strlen(BufferCpy));ptrBuf=BufferCpy;
}
}
Ptr++;
}
//dernier item
if ((*BufferCpy)!=0)
{//le buffer n'est pas vide
*ptrBuf=0;
char *Chaine=(char *)calloc(strlen(BufferCpy)+1,sizeof(char));
memcpy(Chaine,BufferCpy,strlen(BufferCpy));
ListeToken.push_back(Chaine);
memset(BufferCpy,0,strlen(BufferCpy));
}
free(BufferCpy);
int tt=0;
fprintf(stdout,"Ligne: ' %s '\n\t< %s >" , ChaineStr,ListeToken[0] );
for (tt=1;tt<ListeToken.size();tt++) {fprintf(stdout,",< %s >",ListeToken[tt]);}
fprintf(stdout,"\n");
return 1;
}
}
}
return 0;
} |
Partager