bool SetPreference ( WStringAutoPtr key, WStringAutoPtr value, WStringAutoPtr domain ) { HKEY registry_key; LSTATUS status; status = RegCreateKeyEx ( HKEY_CURRENT_USER, domain->c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, ®istry_key, NULL ); if ( status == ERROR_SUCCESS ) { status = RegSetValueEx ( registry_key, key->c_str(), 0, REG_SZ, (PBYTE)value->c_str(), (DWORD)(value->size() * sizeof(wchar_t)) + 1 ); RegCloseKey ( registry_key ); } g_last_error = (fmx::errcode)status; return ( status == ERROR_SUCCESS ); }
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