lib Library API Documentation

koscript_context.cc

00001 /* This file is part of the KDE project 00002 Copyright (C) 1998, 1999, 2000 Torben Weis <weis@kde.org> 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 Boston, MA 02111-1307, USA. 00018 */ 00019 00020 #include "koscript_context.h" 00021 #include "koscript_parsenode.h" 00022 #include "koscript_property.h" 00023 00024 #include <stdio.h> 00025 00026 /************************************************* 00027 * 00028 * KSContext 00029 * 00030 *************************************************/ 00031 00032 KSContext::KSContext() 00033 { 00034 m_bLeftExpr = false; 00035 m_bReturning = false; 00036 } 00037 00038 KSContext::KSContext( KSContext& c, bool leftexpr ) 00039 { 00040 setScope( c ); 00041 m_bLeftExpr = leftexpr; 00042 m_bReturning = false; 00043 } 00044 00045 KSContext::~KSContext() 00046 { 00047 // You may NOT change the order of the following two lines! 00048 m_exception = 0; 00049 m_value = 0; 00050 m_extraData = 0; 00051 } 00052 00053 /************************************************* 00054 * 00055 * KSException 00056 * 00057 *************************************************/ 00058 00059 KSException::KSException( const QString& _type, const KSValue::Ptr& _ptr, int _line ) 00060 { 00061 m_type = new KSValue( _type ); 00062 m_value = _ptr; 00063 if ( _line >= 0 ) 00064 m_lines.append( _line ); 00065 } 00066 00067 KSException::KSException( const QString& _type, const QString& _val, int _line ) 00068 { 00069 m_type = new KSValue( _type ); 00070 m_value = new KSValue( _val ); 00071 if ( _line >= 0 ) 00072 m_lines.append( _line ); 00073 } 00074 00075 KSException::KSException( const KSValue::Ptr& _type, const KSValue::Ptr& _ptr, int _line ) 00076 { 00077 m_type = _type; 00078 m_value = _ptr; 00079 if ( _line >= 0 ) 00080 m_lines.append( _line ); 00081 } 00082 00083 void KSException::print( KSContext& context ) 00084 { 00085 printf("%s\n",toString( context ).local8Bit().data()); 00086 } 00087 00088 QString KSException::toString( KSContext& context ) 00089 { 00090 QString out("Exception '%1'\n%3\n"); 00091 00092 if ( m_value ) 00093 out = out.arg( m_type->toString( context ) ).arg( m_value->toString( context ) ); 00094 else 00095 out = out.arg( m_type->toString( context ) ).arg( "" ); 00096 00097 QValueList<int>::ConstIterator it = lines().begin(); 00098 for( ; it != lines().end(); ++it ) 00099 { 00100 QString l( "\nLine %1" ); 00101 l = l.arg( *it ); 00102 out += l; 00103 } 00104 00105 return out; 00106 } 00107 00108 /************************************************* 00109 * 00110 * KSScope 00111 * 00112 *************************************************/ 00113 00114 KSScope::KSScope( const KSNamespace* globalSpace, KSModule* module ) 00115 { 00116 Q_ASSERT( globalSpace ); 00117 00118 m_module = module; 00119 m_globalSpace = globalSpace; 00120 if ( m_module ) 00121 m_moduleSpace = m_module->nameSpace(); 00122 else 00123 m_moduleSpace = 0; 00124 m_localScope = 0; 00125 } 00126 00127 KSScope::KSScope( const KSScope& s ) : QShared() 00128 { 00129 m_module = s.m_module; 00130 m_globalSpace = s.m_globalSpace; 00131 m_moduleSpace = s.m_moduleSpace; 00132 m_localScope = s.m_localScope; 00133 } 00134 00135 KSValue* KSScope::object( const QString& name, bool _insert ) 00136 { 00137 int len = name.length(); 00138 00139 // Look in global namespace ? 00140 if ( len > 2 && name[0] == ':' && name[1] == ':' ) 00141 { 00142 // TODO 00143 } 00144 else if ( name.find( ':' ) == -1 ) 00145 { 00146 if ( m_localScope ) 00147 { 00148 KSValue *v = m_localScope->object( name, false ); 00149 if ( v ) 00150 return v; 00151 } 00152 00153 if ( m_moduleSpace ) 00154 { 00155 KSNamespace::Iterator it = m_moduleSpace->find( name ); 00156 if ( it != m_moduleSpace->end() ) 00157 return it.data(); 00158 } 00159 00160 KSNamespace::ConstIterator it = m_globalSpace->find( name ); 00161 if ( it != m_globalSpace->end() ) 00162 { 00163 KSSharedPtr<KSValue> ptr( it.data() ); 00164 return ptr; 00165 } 00166 00167 // let's search again, now using case-insensitive comparison 00168 // this way, function names in KSpread become case-insensitive 00169 if( m_moduleSpace ) 00170 { 00171 KSNamespace::ConstIterator it = m_moduleSpace->begin(); 00172 for( ; it != m_moduleSpace->end(); ++it ) 00173 if( it.key().lower() == name.lower() ) 00174 { 00175 KSSharedPtr<KSValue> ptr( it.data() ); 00176 return ptr; 00177 } 00178 } 00179 00180 it = m_globalSpace->begin(); 00181 for( ; it != m_globalSpace->end(); ++it ) 00182 if( it.key().lower() == name.lower() ) 00183 { 00184 KSSharedPtr<KSValue> ptr( it.data() ); 00185 return ptr; 00186 } 00187 00188 if ( !_insert ) 00189 return 0; 00190 00191 KSValue::Ptr v = new KSValue(); 00192 v->setMode( KSValue::LeftExpr ); 00193 addObject( name, v ); 00194 return v; 00195 } 00196 else 00197 { 00198 // TODO 00199 } 00200 00201 return 0; 00202 } 00203 00204 void KSScope::addObject( const QString& name, const KSValue::Ptr& value ) 00205 { 00206 if( m_localScope ) 00207 m_localScope->addObject( name, value ); 00208 else if( m_module ) 00209 m_module->addObject( name, value ); 00210 else 00211 Q_ASSERT( 0 ); 00212 } 00213 00214 /************************************************* 00215 * 00216 * KSModule 00217 * 00218 *************************************************/ 00219 00220 KSModule::KSModule( KSInterpreter* i, const QString& name, KSParseNode* code ) 00221 : QShared(), m_name( name ), m_code( code ), m_interpreter( i ) 00222 { 00223 } 00224 00225 KSModule::~KSModule() 00226 { 00227 if ( m_code ) 00228 delete m_code; 00229 } 00230 00231 void KSModule::addObject( const QString& name, const KSValue::Ptr& v ) 00232 { 00233 m_space.insert( name, v ); 00234 } 00235 00236 void KSModule::removeObject( const QString& name ) 00237 { 00238 m_space.remove( name ); 00239 } 00240 00241 00242 KSValue::Ptr KSModule::member( KSContext& context, const QString& name ) 00243 { 00244 KSNamespace::Iterator it = m_space.find( name ); 00245 if ( it == m_space.end() ) 00246 { 00247 if ( context.leftExpr() ) 00248 { 00249 this->ref(); 00250 KSValue::Ptr ptr( new KSValue( new KSProperty( this, name ) ) ); 00251 ptr->setMode( KSValue::LeftExpr ); 00252 return ptr; 00253 // KSValue::Ptr ptr( new KSValue ); 00254 // ptr->setMode( KSValue::LeftExpr ); 00255 // return ptr; 00256 } 00257 00258 QString tmp( "Unknown symbol '%1' in object of module '%2'" ); 00259 context.setException( new KSException( "UnknownName", tmp.arg( name ).arg( m_name ) ) ); 00260 return 0; 00261 } 00262 00263 return it.data(); 00264 } 00265 00266 bool KSModule::setMember( KSContext&, const QString& name, const KSValue::Ptr& v ) 00267 { 00268 m_space.insert( name, v ); 00269 00270 return true; 00271 } 00272 00273 bool KSModule::eval( KSContext& context ) 00274 { 00275 if ( !m_code ) 00276 return false; 00277 00278 return m_code->eval( context ); 00279 } 00280 00281 KSValue* KSModule::object( const QString& name ) 00282 { 00283 KSNamespace::Iterator nit = m_space.find( name ); 00284 if ( nit != m_space.end() ) 00285 return nit.data(); 00286 00287 return 0; 00288 } 00289 00290 void KSModule::setCode( KSParseNode* node ) 00291 { 00292 if ( m_code ) 00293 delete m_code; 00294 00295 m_code = node; 00296 } 00297 00298 /************************************************** 00299 * 00300 * KSSubScope 00301 * 00302 **************************************************/ 00303 00304 KSValue* KSSubScope::object( const QString& name, bool insert ) 00305 { 00306 QPtrListIterator<KSNamespace> it( m_spaces ); 00307 it.toLast(); 00308 for( ; it.current(); --it ) 00309 { 00310 KSNamespace::Iterator nit = it.current()->find( name ); 00311 if ( nit != it.current()->end() ) 00312 return nit.data(); 00313 } 00314 00315 if ( !insert ) 00316 return 0; 00317 00318 KSValue* v = new KSValue(); 00319 v->setMode( KSValue::LeftExpr ); 00320 addObject( name, v ); 00321 return v; 00322 } 00323 00324 void KSSubScope::addObject( const QString& name, const KSValue::Ptr& value ) 00325 { 00326 m_spaces.getLast()->insert( name, value ); 00327 }
KDE Logo
This file is part of the documentation for lib Library Version 1.3.5.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Nov 17 06:54:17 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003