static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface, LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName, LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp) { JScript *This = ASPARSEPROC_THIS(iface); parser_ctx_t *parser_ctx; DispatchEx *dispex; HRESULT hres; TRACE("(%p)->(%s %s %s %s %p %s %s %u %x %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrFormalParams), debugstr_w(pstrProcedureName), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLineNumber, dwFlags, ppdisp); if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED) return E_UNEXPECTED; hres = script_parse(This->ctx, pstrCode, pstrDelimiter, &parser_ctx); if(FAILED(hres)) { WARN("Parse failed %08x\n", hres); return hres; } hres = create_source_function(parser_ctx, NULL, parser_ctx->source, NULL, NULL, 0, &dispex); parser_release(parser_ctx); if(FAILED(hres)) return hres; *ppdisp = (IDispatch*)_IDispatchEx_(dispex); return S_OK; }
static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine, DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) { JScript *This = ASPARSE_THIS(iface); parser_ctx_t *parser_ctx; HRESULT hres; TRACE("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLine, dwFlags, pvarResult, pexcepinfo); if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED) return E_UNEXPECTED; hres = script_parse(This->ctx, pstrCode, pstrDelimiter, &parser_ctx); if(FAILED(hres)) return hres; if(!is_started(This->ctx)) { if(This->queue_tail) This->queue_tail = This->queue_tail->next = parser_ctx; else This->queue_head = This->queue_tail = parser_ctx; return S_OK; } hres = exec_global_code(This, parser_ctx); parser_release(parser_ctx); return hres; }
static spif_bool_t action_handle_script(event_t *ev, spif_eterm_action_t action) { REQUIRE_RVAL(!SPIF_PTR_ISNULL(ev), FALSE); REQUIRE_RVAL(!SPIF_STR_ISNULL(action->parameter), FALSE); script_parse(SPIF_STR_STR(action->parameter)); return 1; }
int script_doalias(const char *alias, const char *args) { int i; for (i = 0; i < scriptc; i++) if (strcasecmp(alias, scriptar[i].name) == 0) if (script_parse(scriptar[i].script, args) == 1) return(1); return(0); }
static int script_match_type(struct buff *buf, enum script_txout_type *type, uint8 **data_addr, size_t *data_len) { struct script *script; ASSERT(type); ASSERT(data_addr); ASSERT(data_len); *data_addr = NULL; script = script_parse(buf); if (script == NULL) { NOT_TESTED(); return 1; } *type = script_classify(script); switch (*type) { case TX_PUBKEY: *data_len = script->inst[0].len; *data_addr = safe_malloc(*data_len); memcpy(*data_addr, script->inst[0].data, *data_len); ASSERT(*data_addr); break; case TX_PUBKEYHASH: *data_len = script->inst[2].len; *data_addr = safe_malloc(*data_len); ASSERT(*data_len == sizeof(uint160)); memcpy(*data_addr, script->inst[2].data, *data_len); break; default: *data_addr = NULL; *data_len = 0; break; } script_free(script); return 0; }
static HRESULT construct_function(script_ctx_t *ctx, DISPPARAMS *dp, jsexcept_t *ei, IDispatch **ret) { function_expression_t *expr; WCHAR *str = NULL, *ptr; DWORD argc, len = 0, l; parser_ctx_t *parser; DispatchEx *function; BSTR *params = NULL; int i=0, j=0; HRESULT hres = S_OK; static const WCHAR function_anonymousW[] = {'f','u','n','c','t','i','o','n',' ','a','n','o','n','y','m','o','u','s','('}; static const WCHAR function_beginW[] = {')',' ','{','\n'}; static const WCHAR function_endW[] = {'\n','}',0}; argc = arg_cnt(dp); if(argc) { params = heap_alloc(argc*sizeof(BSTR)); if(!params) return E_OUTOFMEMORY; if(argc > 2) len = (argc-2)*2; /* separating commas */ for(i=0; i < argc; i++) { hres = to_string(ctx, get_arg(dp,i), ei, params+i); if(FAILED(hres)) break; len += SysStringLen(params[i]); } } if(SUCCEEDED(hres)) { len += (sizeof(function_anonymousW) + sizeof(function_beginW) + sizeof(function_endW)) / sizeof(WCHAR); str = heap_alloc(len*sizeof(WCHAR)); if(str) { memcpy(str, function_anonymousW, sizeof(function_anonymousW)); ptr = str + sizeof(function_anonymousW)/sizeof(WCHAR); if(argc > 1) { while(1) { l = SysStringLen(params[j]); memcpy(ptr, params[j], l*sizeof(WCHAR)); ptr += l; if(++j == argc-1) break; *ptr++ = ','; *ptr++ = ' '; } } memcpy(ptr, function_beginW, sizeof(function_beginW)); ptr += sizeof(function_beginW)/sizeof(WCHAR); if(argc) { l = SysStringLen(params[argc-1]); memcpy(ptr, params[argc-1], l*sizeof(WCHAR)); ptr += l; } memcpy(ptr, function_endW, sizeof(function_endW)); TRACE("%s\n", debugstr_w(str)); }else { hres = E_OUTOFMEMORY; } } while(--i >= 0) SysFreeString(params[i]); heap_free(params); if(FAILED(hres)) return hres; hres = script_parse(ctx, str, NULL, &parser); heap_free(str); if(FAILED(hres)) return hres; if(!parser->source || !parser->source->functions || parser->source->functions->next || parser->source->variables) { ERR("Invalid parser result!\n"); parser_release(parser); return E_UNEXPECTED; } expr = parser->source->functions->expr; hres = create_source_function(parser, expr->parameter_list, expr->source_elements, NULL, expr->src_str, expr->src_len, &function); parser_release(parser); if(FAILED(hres)) return hres; *ret = (IDispatch*)_IDispatchEx_(function); return S_OK; }