Expr *MakeImageMapFunc(void (*fn)(Expr *)) { Expr *expr = NULL; TOKEN *fntoken = cur_token; Image *img = NULL; token = GetToken(); if(token == OP_LPAREN) { /* Get the quoted file name and first comma... */ if((token = GetToken()) == TK_QUOTESTRING) { FILE *fp; /* Open the file... */ if((fp = SCN_FindFile(token_buffer, READBIN, scn_include_paths, SCN_FINDFILE_CHK_CUR_FIRST)) != NULL) { /* Load the image... */ img = Image_Load(fp, token_buffer); fclose(fp); if(img == NULL) { LogError("Unable to load image file: %s", token_buffer); PrintFileAndLineNumber(); } } else { LogError("Unable to open image file: %s", token_buffer); PrintFileAndLineNumber(); } } else ErrUnknown(token, "expecting image file name", "expression syntax"); /* Eat the first comma... */ if((token = GetToken()) != OP_COMMA) ErrUnknown(token, ",", "expression syntax"); /* Get the U, V expressions and finish. */ token = GetToken(); expr = Term0(); if(token == OP_RPAREN) { CheckParamCount(expr, fntoken->name, 2); token = GetToken(); if(expr != NULL) { expr->data = img; expr->fn = fn; expr->isvec = 1; } } else ErrUnknown(token, ")", "expression syntax"); } else ErrUnknown(token, "(", "expression syntax"); return expr; }
Expr *MakeFunc(void (*fn)(Expr *), int nparams, int returns_vec) { Expr *expr = NULL; TOKEN *fntoken = cur_token; token = GetToken(); if(token == OP_LPAREN) { if(nparams < 2) { expr = ExprNew(); expr->fn = fn; expr->isvec = returns_vec ? 1 : 0; token = GetToken(); expr->l = Term0(); if(token == OP_RPAREN) { CheckParamCount(expr->l, fntoken->name, nparams); token = GetToken(); } else ErrUnknown(token, ")", "expression syntax"); } else { token = GetToken(); expr = Term0(); if(token == OP_RPAREN) { CheckParamCount(expr, fntoken->name, nparams); token = GetToken(); if(expr != NULL) { expr->fn = fn; expr->isvec = returns_vec ? 1 : 0; } } else ErrUnknown(token, ")", "expression syntax"); } } else ErrUnknown(token, "(", "expression syntax"); return expr; }
int __fun_call(Executor& ks) { if(!CheckParamCount(ks,1)) { ks.kerror("param count should be 1"); return -1; } kvar_handler1<PL1_opx_num<P> >::g1(ks,kvar_helper_base::f1(ks)); return 1; }
int __fun_call(Executor& ks) { if(!CheckParamCount(ks,2)) { ks.kerror("param count should be 2"); return -1; } kvar_helper<N>::g2(ks); return 1; }
int __fun_call(Executor& ks) { if(!CheckParamCount(ks,1)) { return -1; } kvar_helper<N>::g1(ks); return 1; }
Expr *MakeHandleFunc(void (*fn)(Expr *), int handle_token, int nparams, int returns_vec) { Expr *expr = NULL; void *data = NULL; TOKEN *fntoken = cur_token; token = GetToken(); if(token == OP_LPAREN) { /* * Look for a handle to a declared type that matches * the type specified by handle_token. */ token = GetToken(); if(token == handle_token) { switch(token) { case DECL_COLOR_MAP: data = (void *)ColorMap_Copy((ColorMap *)cur_token->data); break; } } else { switch(handle_token) { case DECL_COLOR_MAP: ErrUnknown(token, "color map handle id", "expression syntax"); break; default: ErrUnknown(token, "handle to a declared item", "expression syntax"); break; } } /* Get the first comma if more params follow. */ if(nparams > 0) { token = GetToken(); if(token != OP_COMMA) ErrUnknown(token, ",", "expression syntax"); } if(nparams < 2) { expr = ExprNew(); expr->fn = fn; expr->data = data; expr->isvec = returns_vec ? 1 : 0; token = GetToken(); expr->l = Term0(); if(token == OP_RPAREN) { CheckParamCount(expr->l, fntoken->name, nparams); token = GetToken(); } else ErrUnknown(token, ")", "expression syntax"); } else { token = GetToken(); expr = Term0(); if(token == OP_RPAREN) { CheckParamCount(expr, fntoken->name, nparams); token = GetToken(); if(expr != NULL) { expr->fn = fn; expr->data = data; expr->isvec = returns_vec ? 1 : 0; } else if(data != NULL) { switch(token) { case DECL_COLOR_MAP: ColorMap_Delete((ColorMap *)data); break; } } } else ErrUnknown(token, ")", "expression syntax"); } } else ErrUnknown(token, "(", "expression syntax"); return expr; }