00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include "koscript_func.h"
00021
#include "koscript_context.h"
00022
#include "koscript_value.h"
00023
#include "koscript_parsenode.h"
00024
#include "koscript_util.h"
00025
#include "koscript_method.h"
00026
00027
#include <kapplication.h>
00028
#include <dcopclient.h>
00029
#include <klocale.h>
00030
00031
#include <iostream>
00032
00033
00034
extern KLocale* s_koscript_locale;
00035
00036
using namespace std;
00037
00038
bool KSScriptFunction::call( KSContext& context )
00039 {
00040
return m_node->eval( context );
00041 }
00042
00043
static bool ksfunc_mid( KSContext& context )
00044 {
00045
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00046
00047 uint len = 0xffffffff;
00048
if (
KSUtil::checkArgumentsCount( context, 3,
"mid",
false ) )
00049 {
00050
if(
KSUtil::checkType( context, args[2], KSValue::DoubleType,
false ) )
00051 len = (uint) args[2]->doubleValue();
00052
else if(
KSUtil::checkType( context, args[2], KSValue::IntType,
true ) )
00053 len = (uint) args[2]->intValue();
00054
else
00055
return false;
00056 }
00057
else if ( !
KSUtil::checkArgumentsCount( context, 2,
"mid",
true ) )
00058
return false;
00059
00060
if ( !
KSUtil::checkType( context, args[0], KSValue::StringType,
true ) )
00061
return false;
00062
00063
if( !
KSUtil::checkType( context, args[1], KSValue::IntType,
true ) )
00064
return false;
00065
int pos = args[1]->intValue();
00066
00067
QString tmp = args[0]->stringValue().mid( pos, len );
00068 context.setValue(
new KSValue(tmp));
00069
return true;
00070 }
00071
00072
static bool ksfunc_time( KSContext& context )
00073 {
00074
KSUtil::checkArgs( context,
"s",
"time", TRUE );
00075
00076
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00077
00078
QTime t = s_koscript_locale->readTime( args[0]->stringValue() );
00079
if ( !t.isValid() )
00080 {
00081
QString tmp( i18n(
"Invalid time format: %1") );
00082 context.setException(
new KSException(
"ParsingError", tmp.arg( args[0]->stringValue() ), -1 ) );
00083
return false;
00084 }
00085
00086 context.setValue(
new KSValue( t ) );
00087
00088
return true;
00089 }
00090
00091
static bool ksfunc_date( KSContext& context )
00092 {
00093
KSUtil::checkArgs( context,
"s",
"date", TRUE );
00094
00095
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00096
00097
QDate t = s_koscript_locale->readDate( args[0]->stringValue() );
00098
if ( !t.isValid() )
00099 {
00100
QString tmp( i18n(
"Invalid date format: %1") );
00101 context.setException(
new KSException(
"ParsingError", tmp.arg( args[0]->stringValue() ), -1 ) );
00102
return false;
00103 }
00104
00105 context.setValue(
new KSValue( t ) );
00106
00107
return true;
00108 }
00109
00114
static bool ksfunc_length( KSContext& context )
00115 {
00116
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00117
00118
if ( !
KSUtil::checkArgumentsCount( context, 1,
"length",
true ) )
00119
return false;
00120
00121
if (
KSUtil::checkType( context, args[0], KSValue::ListType,
false ) )
00122 {
00123 context.setValue(
new KSValue( (KScript::Long) args[0]->listValue().count() ) );
00124 }
00125
else if (
KSUtil::checkType( context, args[0], KSValue::MapType,
false ) )
00126 {
00127 context.setValue(
new KSValue( (KScript::Long) args[0]->mapValue().count() ) );
00128 }
00129
else if (
KSUtil::checkType( context, args[0], KSValue::StringType,
false ) )
00130 {
00131 context.setValue(
new KSValue( (KScript::Long) args[0]->stringValue().length() ) );
00132 }
00133
else
00134 {
00135
QString tmp( i18n(
"Cannot calculate length of a %1 value.") );
00136 context.setException(
new KSException(
"CastingError", tmp.arg( args[0]->typeName() ), -1 ) );
00137
return false;
00138 }
00139
00140
return true;
00141 }
00142
00143
static bool ksfunc_lower( KSContext& context )
00144 {
00145
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00146
00147
if ( !
KSUtil::checkArgs( context, args,
"s",
"lower", TRUE ) )
00148
return FALSE;
00149
00150 context.setValue(
new KSValue( args[0]->stringValue().lower() ) );
00151
00152
return TRUE;
00153 }
00154
00155
static bool ksfunc_upper( KSContext& context )
00156 {
00157
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00158
00159
if ( !
KSUtil::checkArgs( context, args,
"s",
"lower", TRUE ) )
00160
return FALSE;
00161
00162 context.setValue(
new KSValue( args[0]->stringValue().upper() ) );
00163
00164
return TRUE;
00165 }
00166
00167
static bool ksfunc_isEmpty( KSContext& context )
00168 {
00169
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00170
00171
if ( !
KSUtil::checkArgumentsCount( context, 1,
"isEmpty",
true ) )
00172
return false;
00173
00174
if (
KSUtil::checkType( context, args[0], KSValue::ListType,
false ) )
00175 {
00176 context.setValue(
new KSValue( args[0]->listValue().isEmpty() ) );
00177 }
00178
else if (
KSUtil::checkType( context, args[0], KSValue::MapType,
false ) )
00179 {
00180 context.setValue(
new KSValue( args[0]->mapValue().isEmpty() ) );
00181 }
00182
else if (
KSUtil::checkType( context, args[0], KSValue::StringType,
false ) )
00183 {
00184 context.setValue(
new KSValue( args[0]->stringValue().isEmpty() ) );
00185 }
00186
else
00187 {
00188
QString tmp( i18n(
"Cannot determine emptiness of a %1 value.") );
00189 context.setException(
new KSException(
"CastingError", tmp.arg( args[0]->typeName() ), -1 ) );
00190
return false;
00191 }
00192
00193
return true;
00194 }
00195
00199
static bool ksfunc_toInt( KSContext& context )
00200 {
00201
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00202
00203
if ( !
KSUtil::checkArgumentsCount( context, 1,
"toInt",
true ) )
00204
return false;
00205
00206
if (
KSUtil::checkType( context, args[0], KSValue::DoubleType,
false ) )
00207 {
00208 context.setValue(
new KSValue( (KScript::Long)args[0]->doubleValue() ) );
00209
return true;
00210 }
00211
else if (
KSUtil::checkType( context, args[0], KSValue::StringType,
false ) )
00212 {
00213
bool ok;
00214 KScript::Long l = args[0]->stringValue().toLong( &ok );
00215
if ( ok )
00216 {
00217 context.setValue(
new KSValue( l ) );
00218
return true;
00219 }
00220 }
00221
00222
QString tmp( i18n(
"Cannot calculate a numerical value from a %1 value.") );
00223 context.setException(
new KSException(
"CastingError", tmp.arg( args[0]->typeName() ), -1 ) );
00224
return false;
00225 }
00226
00230
static bool ksfunc_toFloat( KSContext& context )
00231 {
00232
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00233
00234
if ( !
KSUtil::checkArgumentsCount( context, 1,
"toFloat",
true ) )
00235
return false;
00236
00237
if (
KSUtil::checkType( context, args[0], KSValue::IntType,
false ) )
00238 {
00239 context.setValue(
new KSValue( (KScript::Double)args[0]->intValue() ) );
00240
return true;
00241 }
00242
else if (
KSUtil::checkType( context, args[0], KSValue::StringType,
false ) )
00243 {
00244
bool ok;
00245 KScript::Double l = args[0]->stringValue().toDouble( &ok );
00246
if ( ok )
00247 {
00248 context.setValue(
new KSValue( l ) );
00249
return true;
00250 }
00251 }
00252
00253
QString tmp( i18n(
"Cannot calculate a floating point value from a %1 value.") );
00254 context.setException(
new KSException(
"CastingError", tmp.arg( args[0]->typeName() ), -1 ) );
00255
return false;
00256 }
00257
00264
static bool ksfunc_arg( KSContext& context )
00265 {
00266
QValueList<KSValue::Ptr>& args = context.value()->listValue();
00267
00268
if ( !
KSUtil::checkArgumentsCount( context, 2,
"arg",
true ) )
00269
return false;
00270
00271
if ( !
KSUtil::checkType( context, args[0], KSValue::StringType, TRUE ) )
00272
return FALSE;
00273
00274
QString str = args[0]->stringValue();
00275
00276
if (
KSUtil::checkType( context, args[1], KSValue::StringType, FALSE ) )
00277 context.setValue(
new KSValue( str.arg( args[1]->stringValue() ) ) );
00278
else if (
KSUtil::checkType( context, args[1], KSValue::IntType, FALSE ) )
00279 context.setValue(
new KSValue( str.arg( args[1]->intValue() ) ) );
00280
else if (
KSUtil::checkType( context, args[1], KSValue::DoubleType, FALSE ) )
00281 context.setValue(
new KSValue( str.arg( args[1]->doubleValue() ) ) );
00282
else if (
KSUtil::checkType( context, args[1], KSValue::CharType, FALSE ) )
00283 context.setValue(
new KSValue( str.arg( args[1]->charValue() ) ) );
00284
else context.setValue(
new KSValue( str.arg( args[1]->toString( context ) ) ) );
00285
00286
return TRUE;
00287 }
00288
00289
static bool ksfunc_stringListSplit( KSContext &context )
00290 {
00291
QValueList<KSValue::Ptr> &args = context.value()->listValue();
00292
00293
if ( !
KSUtil::checkArgumentsCount( context, 2,
"arg",
true ) );
00294
00295
if ( !
KSUtil::checkType( context, args[0], KSValue::StringType, TRUE ) )
00296
return false;
00297
00298
QString sep = args[0]->stringValue();
00299
QString str = args[1]->stringValue();
00300
00301
QStringList strLst = QStringList::split( sep, str );
00302
00303
KSValue *v =
new KSValue( KSValue::ListType );
00304
00305 QStringList::ConstIterator it = strLst.begin();
00306 QStringList::ConstIterator end = strLst.end();
00307
for (; it != end; ++it )
00308 v->
listValue().append(
new KSValue( *it ) );
00309
00310 context.setValue( v );
00311
return true;
00312 }
00313
00314
static bool ksfunc_print( KSContext& context )
00315 {
00316
00317
QValueList<KSValue::Ptr>::Iterator it = context.value()->listValue().begin();
00318
QValueList<KSValue::Ptr>::Iterator end = context.value()->listValue().end();
00319
00320
if ( it == end )
00321 cout << endl;
00322
00323
for( ; it != end; ++it )
00324 cout << (*it)->toString( context ).local8Bit();
00325
00326
00327 context.setValue( 0 );
00328
00329
return true;
00330 }
00331
00332
static bool ksfunc_println( KSContext& context )
00333 {
00334
00335
QValueList<KSValue::Ptr>::Iterator it = context.value()->listValue().begin();
00336
QValueList<KSValue::Ptr>::Iterator end = context.value()->listValue().end();
00337
00338
if ( it == end )
00339 cout << endl;
00340
00341
for( ; it != end; ++it )
00342 cout << (*it)->toString( context ).local8Bit() << endl;
00343
00344
00345 context.setValue( 0 );
00346
00347
return true;
00348 }
00349
00350 KSModule::Ptr ksCreateModule_KScript(
KSInterpreter* interp )
00351 {
00352 KSModule::Ptr module =
new KSModule( interp,
"koscript" );
00353
00354
00355
00356
#if 0
00357
module->addObject(
"time",
new KSValue(
new KSBuiltinFunction( module,
"time", ksfunc_time ) ) );
00358 module->addObject(
"date",
new KSValue(
new KSBuiltinFunction( module,
"date", ksfunc_date ) ) );
00359 module->addObject(
"print",
new KSValue(
new KSBuiltinFunction( module,
"print", ksfunc_print ) ) );
00360 module->addObject(
"println",
new KSValue(
new KSBuiltinFunction( module,
"println", ksfunc_println ) ) );
00361 module->addObject(
"length",
new KSValue(
new KSBuiltinFunction( module,
"length", ksfunc_length ) ) );
00362 module->addObject(
"arg",
new KSValue(
new KSBuiltinFunction( module,
"arg", ksfunc_arg ) ) );
00363 module->addObject(
"mid",
new KSValue(
new KSBuiltinFunction( module,
"mid", ksfunc_mid ) ) );
00364 module->addObject(
"upper",
new KSValue(
new KSBuiltinFunction( module,
"upper", ksfunc_upper ) ) );
00365 module->addObject(
"lower",
new KSValue(
new KSBuiltinFunction( module,
"lower", ksfunc_lower ) ) );
00366 module->addObject(
"isEmpty",
new KSValue(
new KSBuiltinFunction( module,
"isEmpty", ksfunc_isEmpty ) ) );
00367 module->addObject(
"toInt",
new KSValue(
new KSBuiltinFunction( module,
"toInt", ksfunc_toInt ) ) );
00368 module->addObject(
"toFloat",
new KSValue(
new KSBuiltinFunction( module,
"toFloat", ksfunc_toFloat ) ) );
00369 module->addObject(
"stringListSplit",
new KSValue(
new KSBuiltinFunction( module,
"stringListSplit", ksfunc_stringListSplit ) ) );
00370
#endif
00371
00372
return module;
00373 }