2012-03-09 16:08:05 +00:00
|
|
|
|
// * This file is part of the COLOBOT source code
|
|
|
|
|
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
|
|
|
|
|
// *
|
|
|
|
|
// * This program is free software: you can redistribute it and/or modify
|
|
|
|
|
// * it under the terms of the GNU General Public License as published by
|
|
|
|
|
// * the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
// * (at your option) any later version.
|
|
|
|
|
// *
|
|
|
|
|
// * This program is distributed in the hope that it will be useful,
|
|
|
|
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
// * GNU General Public License for more details.
|
|
|
|
|
// *
|
|
|
|
|
// * You should have received a copy of the GNU General Public License
|
2012-03-11 19:49:33 +00:00
|
|
|
|
// * along with this program. If not, see http://www.gnu.org/licenses/.
|
2012-03-09 16:08:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// donne la longueur d'une cha<68>ne
|
|
|
|
|
// ex<65>cution
|
2012-03-08 18:32:05 +00:00
|
|
|
|
|
|
|
|
|
BOOL rStrLen( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) { ex = TX_OVERPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// recup<75>re le contenu de la string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString )
|
|
|
|
|
return CBotTypResult( TX_BADPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// le r<>sultat final est un nombre entier
|
2012-03-08 18:32:05 +00:00
|
|
|
|
return CBotTypResult( CBotTypInt );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// donne la partie gauche d'une cha<68>ne
|
|
|
|
|
// ex<65>cution
|
2012-03-08 18:32:05 +00:00
|
|
|
|
|
|
|
|
|
BOOL rStrLeft( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// recup<75>re le contenu de la string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
CBotString s = pVar->GivValString();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
pVar = pVar->GivNext();
|
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() > CBotTypDouble ) { ex = TX_BADNUM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// r<>cup<75>re ce nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
int n = pVar->GivValInt();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de 3e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) { ex = TX_OVERPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// prend la partie int<6E>ressante
|
2012-03-08 18:32:05 +00:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString )
|
|
|
|
|
return CBotTypResult( TX_BADSTRING );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
pVar = pVar->GivNext();
|
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() > CBotTypDouble )
|
|
|
|
|
return CBotTypResult( TX_BADNUM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de 3e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// le r<>sultat final est une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
return CBotTypResult( CBotTypString );
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// donne la partie droite d'une cha<68>ne
|
|
|
|
|
// ex<65>cution
|
2012-03-08 18:32:05 +00:00
|
|
|
|
|
|
|
|
|
BOOL rStrRight( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// recup<75>re le contenu de la string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
CBotString s = pVar->GivValString();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
pVar = pVar->GivNext();
|
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() > CBotTypDouble ) { ex = TX_BADNUM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// r<>cup<75>re ce nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
int n = pVar->GivValInt();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de 3e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) { ex = TX_OVERPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// prend la partie int<6E>ressante
|
2012-03-08 18:32:05 +00:00
|
|
|
|
s = s.Right( n );
|
|
|
|
|
|
|
|
|
|
// la met sur la pile
|
|
|
|
|
pResult->SetValString( s );
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// donne la partie centrale d'une cha<68>ne
|
|
|
|
|
// ex<65>cution
|
2012-03-08 18:32:05 +00:00
|
|
|
|
|
|
|
|
|
BOOL rStrMid( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// recup<75>re le contenu de la string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
CBotString s = pVar->GivValString();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
pVar = pVar->GivNext();
|
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() > CBotTypDouble ) { ex = TX_BADNUM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// r<>cup<75>re ce nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
int n = pVar->GivValInt();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// 3e param<61>tre optionnel
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL )
|
|
|
|
|
{
|
|
|
|
|
pVar = pVar->GivNext();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() > CBotTypDouble ) { ex = TX_BADNUM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// r<>cup<75>re ce nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
int l = pVar->GivValInt();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// mais pas de 4e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ){ ex = TX_OVERPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// prend la partie int<6E>ressante
|
2012-03-08 18:32:05 +00:00
|
|
|
|
s = s.Mid( n, l );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// prend la partie int<6E>ressante
|
2012-03-08 18:32:05 +00:00
|
|
|
|
s = s.Mid( n );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// la met sur la pile
|
|
|
|
|
pResult->SetValString( s );
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// donne la partie centrale d'une cha<68>ne
|
2012-03-08 18:32:05 +00:00
|
|
|
|
// compilation
|
|
|
|
|
|
|
|
|
|
CBotTypResult cStrStrIntInt( CBotVar* &pVar, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString )
|
|
|
|
|
return CBotTypResult( TX_BADSTRING );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
pVar = pVar->GivNext();
|
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() > CBotTypDouble )
|
|
|
|
|
return CBotTypResult( TX_BADNUM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// 3e param<61>tre optionnel
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL )
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
pVar = pVar->GivNext();
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() > CBotTypDouble )
|
|
|
|
|
return CBotTypResult( TX_BADNUM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de 4e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// le r<>sultat final est une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
return CBotTypResult( CBotTypString );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// donne le nombre contenu dans une cha<68>ne
|
|
|
|
|
// ex<65>cution
|
2012-03-08 18:32:05 +00:00
|
|
|
|
|
|
|
|
|
BOOL rStrVal( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// recup<75>re le contenu de la string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
CBotString s = pVar->GivValString();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// mais pas de 2e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString )
|
|
|
|
|
return CBotTypResult( TX_BADSTRING );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de 2e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// le r<>sultat final est un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
return CBotTypResult( CBotTypFloat );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// trouve une chaine dans une autre
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// ex<65>cution
|
2012-03-08 18:32:05 +00:00
|
|
|
|
|
|
|
|
|
BOOL rStrFind( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// recup<75>re le contenu de la string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
CBotString s = pVar->GivValString();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
pVar = pVar->GivNext();
|
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// r<>cup<75>re ce nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
CBotString s2 = pVar->GivValString();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de 3e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) { ex = TX_OVERPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// met le r<>sultat sur la pile
|
2012-03-08 18:32:05 +00:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString )
|
|
|
|
|
return CBotTypResult( TX_BADSTRING );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un second param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
pVar = pVar->GivNext();
|
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString )
|
|
|
|
|
return CBotTypResult( TX_BADSTRING );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de 3e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// le r<>sultat final est un nombre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
return CBotTypResult( CBotTypInt );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// donne une chaine en majuscule
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// ex<65>cution
|
2012-03-08 18:32:05 +00:00
|
|
|
|
|
|
|
|
|
BOOL rStrUpper( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// recup<75>re le contenu de la string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
CBotString s = pVar->GivValString();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// mais pas de 2e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
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
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// ex<65>cution
|
2012-03-08 18:32:05 +00:00
|
|
|
|
|
|
|
|
|
BOOL rStrLower( CBotVar* pVar, CBotVar* pResult, int& ex, void* pUser )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) { ex = TX_LOWPARAM ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString ) { ex = TX_BADSTRING ; return TRUE; }
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// recup<75>re le contenu de la string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
CBotString s = pVar->GivValString();
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// mais pas de 2e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
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 )
|
|
|
|
|
{
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// il faut un param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar == NULL ) return CBotTypResult( TX_LOWPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// qui doit <20>tre une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivType() != CBotTypString )
|
|
|
|
|
return CBotTypResult( TX_BADSTRING );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// pas de 2e param<61>tre
|
2012-03-08 18:32:05 +00:00
|
|
|
|
if ( pVar->GivNext() != NULL ) return CBotTypResult( TX_OVERPARAM );
|
|
|
|
|
|
2012-03-09 16:08:05 +00:00
|
|
|
|
// le r<>sultat final est une string
|
2012-03-08 18:32:05 +00:00
|
|
|
|
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 );
|
|
|
|
|
}
|