FMX_PROC(errcode) BE_XPathAll ( short /* funcId */, const ExprEnv& /* environment */, const DataVect& data_vect, Data& results ) { errcode error_result = kNoError; TextAutoPtr txt; try { int numParams = data_vect.Size(); StringAutoPtr xml = ParameterAsUTF8String ( data_vect, 0 ); StringAutoPtr xpath = ParameterAsUTF8String ( data_vect, 1 ); StringAutoPtr nsList( new string); if (numParams > 2) nsList = ParameterAsUTF8String ( data_vect, 2 ); results.SetAsText(*ApplyXPathAll (xml, xpath, nsList), data_vect.At(0).GetLocale() ); } catch ( bad_alloc e ) { error_result = kLowMemoryError; } catch ( exception e ) { error_result = kErrorUnknown; } return error_result; } // BE_XPathAll
FMX_PROC(errcode) BE_ApplyXSLTInMemory ( short /* funcId */, const ExprEnv& /* environment */, const DataVect& data_vect, Data& results) { errcode error_result = kNoError; try { StringAutoPtr xml = ParameterAsUTF8String ( data_vect, 0 ); StringAutoPtr xslt = ParameterAsUTF8String ( data_vect, 1 ); results.SetAsText( *ApplyXSLTInMemory ( xml, xslt ), data_vect.At(0).GetLocale() ); } catch ( bad_alloc e ) { error_result = kLowMemoryError; } catch ( exception e ) { error_result = kErrorUnknown; } return error_result; } // BE_ApplyXSLTInMemory
FMX_PROC(errcode) BE_ExtractScriptVariables ( short /* funcId */, const ExprEnv& /* environment */, const DataVect& data_vect, Data& results) { errcode error_result = kNoError; try { BEWStringVector variables; WStringAutoPtr calculation = ParameterAsWideString ( data_vect, 0 ); wstring search_for = L"$/\""; // variables, comments and strings (including escaped strings) size_t found = calculation->find_first_of ( search_for ); while ( found != wstring::npos ) { size_t end = 0; size_t search_from = found + 1; switch ( calculation->at ( found ) ) { case L'$': // variables { /* find the end of the variable + - * / ^ & = ≠ < > ≤ ≥ ( , ; ) [ ] " :: $ } unicode escapes are required on Windows */ end = calculation->find_first_of ( L" ;+-=*/&^<>\t\r[]()\u2260\u2264\u2265,", search_from ); if ( end == wstring::npos ) { end = calculation->size(); } // add the variable to the list wstring wanted = calculation->substr ( found, end - found ); variables.PushBack ( wanted ); search_from = end + 1; } break; case L'/': // comments switch ( calculation->at ( search_from ) ) { case L'/': end = calculation->find ( L"\r", search_from ); search_from = end + 1; break; case L'*': end = calculation->find ( L"*/", search_from ); search_from = end + 2; break; default: break; } break; case L'\"': // escaped strings end = calculation->find ( L"\"", search_from ); while ( (end != string::npos) && (calculation->at ( end - 1 ) == L'\\') ) { end = calculation->find ( L"\"", end + 1 ); } search_from = end + 1; break; // default: } // this is not on an eternal quest if ( (end != string::npos) && (search_from < calculation->size()) ) { found = calculation->find_first_of ( search_for, search_from ); } else { found = string::npos; } } results.SetAsText( *(variables.AsValueList()), data_vect.At(0).GetLocale() ); } catch ( bad_alloc e ) { error_result = kLowMemoryError; } catch ( exception e ) { error_result = kErrorUnknown; } return error_result; } // BE_ExtractScriptVariables