colobot/src/CBot/StringFunctions.cpp

421 lines
11 KiB
C++
Raw Normal View History

// d<>finition des fonctions sur les cha<68>nes
// donne la longueur d'une cha<68>ne
// ex<65>cution
BOOL rStrLen( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// pas de second param<61>tre
if ( pVar->GivNext() != NULL ) { ex = TX_OVERPARAM ; return TRUE; }
// recup<75>re le contenu de la string
CBotString s = pVar->GivValString();
// met la longueur sur la pile
pResult->SetValInt( s.GivLength() );
return TRUE;
}
// int xxx ( string )
// compilation
CBotTypResult cIntStr( CBotVar* &pVar, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString )
return CBotTypResult( TX_BADPARAM );
// pas de second param<61>tre
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
// le r<>sultat final est un nombre entier
return CBotTypResult( CBotTypInt );
}
// donne la partie gauche d'une cha<68>ne
// ex<65>cution
BOOL rStrLeft( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// recup<75>re le contenu de la string
CBotString s = pVar->GivValString();
// il faut un second param<61>tre
pVar = pVar->GivNext();
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre un nombre
if ( pVar->GivType() > CBotTypDouble ) { ex = TX_BADNUM ; return TRUE; }
// r<>cup<75>re ce nombre
int n = pVar->GivValInt();
// pas de 3e param<61>tre
if ( pVar->GivNext() != NULL ) { ex = TX_OVERPARAM ; return TRUE; }
// prend la partie int<6E>ressante
s = s.Left( n );
// la met sur la pile
pResult->SetValString( s );
return TRUE;
}
// string xxx ( string, int )
// compilation
CBotTypResult cStrStrInt( CBotVar* &pVar, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString )
return CBotTypResult( TX_BADSTRING );
// il faut un second param<61>tre
pVar = pVar->GivNext();
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre un nombre
if ( pVar->GivType() > CBotTypDouble )
return CBotTypResult( TX_BADNUM );
// pas de 3e param<61>tre
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
// le r<>sultat final est une string
return CBotTypResult( CBotTypString );
}
// donne la partie droite d'une cha<68>ne
// ex<65>cution
BOOL rStrRight( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// recup<75>re le contenu de la string
CBotString s = pVar->GivValString();
// il faut un second param<61>tre
pVar = pVar->GivNext();
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre un nombre
if ( pVar->GivType() > CBotTypDouble ) { ex = TX_BADNUM ; return TRUE; }
// r<>cup<75>re ce nombre
int n = pVar->GivValInt();
// pas de 3e param<61>tre
if ( pVar->GivNext() != NULL ) { ex = TX_OVERPARAM ; return TRUE; }
// prend la partie int<6E>ressante
s = s.Right( n );
// la met sur la pile
pResult->SetValString( s );
return TRUE;
}
// donne la partie centrale d'une cha<68>ne
// ex<65>cution
BOOL rStrMid( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// recup<75>re le contenu de la string
CBotString s = pVar->GivValString();
// il faut un second param<61>tre
pVar = pVar->GivNext();
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre un nombre
if ( pVar->GivType() > CBotTypDouble ) { ex = TX_BADNUM ; return TRUE; }
// r<>cup<75>re ce nombre
int n = pVar->GivValInt();
// 3e param<61>tre optionnel
if ( pVar->GivNext() != NULL )
{
pVar = pVar->GivNext();
// qui doit <20>tre un nombre
if ( pVar->GivType() > CBotTypDouble ) { ex = TX_BADNUM ; return TRUE; }
// r<>cup<75>re ce nombre
int l = pVar->GivValInt();
// mais pas de 4e param<61>tre
if ( pVar->GivNext() != NULL ){ ex = TX_OVERPARAM ; return TRUE; }
// prend la partie int<6E>ressante
s = s.Mid( n, l );
}
else
{
// prend la partie int<6E>ressante
s = s.Mid( n );
}
// la met sur la pile
pResult->SetValString( s );
return TRUE;
}
// donne la partie centrale d'une cha<68>ne
// compilation
CBotTypResult cStrStrIntInt( CBotVar* &pVar, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString )
return CBotTypResult( TX_BADSTRING );
// il faut un second param<61>tre
pVar = pVar->GivNext();
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre un nombre
if ( pVar->GivType() > CBotTypDouble )
return CBotTypResult( TX_BADNUM );
// 3e param<61>tre optionnel
if ( pVar->GivNext() != NULL )
{
pVar = pVar->GivNext();
// qui doit <20>tre un nombre
if ( pVar->GivType() > CBotTypDouble )
return CBotTypResult( TX_BADNUM );
// pas de 4e param<61>tre
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
}
// le r<>sultat final est une string
return CBotTypResult( CBotTypString );
}
// donne le nombre contenu dans une cha<68>ne
// ex<65>cution
BOOL rStrVal( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// recup<75>re le contenu de la string
CBotString s = pVar->GivValString();
// mais pas de 2e param<61>tre
if ( pVar->GivNext() != NULL ){ ex = TX_OVERPARAM ; return TRUE; }
float val = GivNumFloat(s);
// la met la valeur sur la pile
pResult->SetValFloat( val );
return TRUE;
}
// float xxx ( string )
// compilation
CBotTypResult cFloatStr( CBotVar* &pVar, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString )
return CBotTypResult( TX_BADSTRING );
// pas de 2e param<61>tre
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
// le r<>sultat final est un nombre
return CBotTypResult( CBotTypFloat );
}
// trouve une chaine dans une autre
// ex<65>cution
BOOL rStrFind( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// recup<75>re le contenu de la string
CBotString s = pVar->GivValString();
// il faut un second param<61>tre
pVar = pVar->GivNext();
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// r<>cup<75>re ce nombre
CBotString s2 = pVar->GivValString();
// pas de 3e param<61>tre
if ( pVar->GivNext() != NULL ) { ex = TX_OVERPARAM ; return TRUE; }
// met le r<>sultat sur la pile
int res = s.Find(s2);
pResult->SetValInt( res );
if ( res < 0 ) pResult->SetInit( IS_NAN );
return TRUE;
}
// int xxx ( string, string )
// compilation
CBotTypResult cIntStrStr( CBotVar* &pVar, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString )
return CBotTypResult( TX_BADSTRING );
// il faut un second param<61>tre
pVar = pVar->GivNext();
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString )
return CBotTypResult( TX_BADSTRING );
// pas de 3e param<61>tre
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
// le r<>sultat final est un nombre
return CBotTypResult( CBotTypInt );
}
// donne une chaine en majuscule
// ex<65>cution
BOOL rStrUpper( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// recup<75>re le contenu de la string
CBotString s = pVar->GivValString();
// mais pas de 2e param<61>tre
if ( pVar->GivNext() != NULL ){ ex = TX_OVERPARAM ; return TRUE; }
s.MakeUpper();
// la met la valeur sur la pile
pResult->SetValString( s );
return TRUE;
}
// donne une chaine en minuscules
// ex<65>cution
BOOL rStrLower( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
// recup<75>re le contenu de la string
CBotString s = pVar->GivValString();
// mais pas de 2e param<61>tre
if ( pVar->GivNext() != NULL ){ ex = TX_OVERPARAM ; return TRUE; }
s.MakeLower();
// la met la valeur sur la pile
pResult->SetValString( s );
return TRUE;
}
// string xxx ( string )
// compilation
CBotTypResult cStrStr( CBotVar* &pVar, void* pUser )
{
// il faut un param<61>tre
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
// qui doit <20>tre une string
if ( pVar->GivType() != CBotTypString )
return CBotTypResult( TX_BADSTRING );
// pas de 2e param<61>tre
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
// le r<>sultat final est une string
return CBotTypResult( CBotTypString );
}
void InitStringFunctions()
{
CBotProgram::AddFunction("strlen", rStrLen, cIntStr );
CBotProgram::AddFunction("strleft", rStrLeft, cStrStrInt );
CBotProgram::AddFunction("strright", rStrRight, cStrStrInt );
CBotProgram::AddFunction("strmid", rStrMid, cStrStrIntInt );
CBotProgram::AddFunction("strval", rStrVal, cFloatStr );
CBotProgram::AddFunction("strfind", rStrFind, cIntStrStr );
CBotProgram::AddFunction("strupper", rStrUpper, cStrStr );
CBotProgram::AddFunction("strlower", rStrLower, cStrStr );
}