diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/script.c | 94 |
1 files changed, 65 insertions, 29 deletions
diff --git a/src/map/script.c b/src/map/script.c index e3341d546..bc2b175f8 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -201,12 +201,43 @@ int mapreg_setreg(int num,int val); int mapreg_setregstr(int num,const char *str); enum c_op { - C_NOP,C_POS,C_INT,C_PARAM,C_FUNC,C_STR,C_CONSTSTR,C_ARG, - C_NAME,C_EOL, C_RETINFO, - C_USERFUNC, C_USERFUNC_POS, // user defined functions - - C_OP3,C_LOR,C_LAND,C_LE,C_LT,C_GE,C_GT,C_EQ,C_NE, //operator - C_XOR,C_OR,C_AND,C_ADD,C_SUB,C_MUL,C_DIV,C_MOD,C_NEG,C_LNOT,C_NOT,C_R_SHIFT,C_L_SHIFT + C_NOP, + C_POS, + C_INT, // number + C_PARAM, // parameter variable (see pc_readparam/pc_setparam) + C_FUNC, // buildin function call + C_STR, // string (free'd automatically) + C_CONSTSTR, // string (not free'd) + C_ARG, // start of argument list + C_NAME, + C_EOL, // end of line (extra stack values are cleared) + C_RETINFO, + C_USERFUNC, // internal script function + C_USERFUNC_POS, // internal script function label + + // operators + C_OP3, // a ? b : c + C_LOR, // a || b + C_LAND, // a && b + C_LE, // a <= b + C_LT, // a < b + C_GE, // a >= b + C_GT, // a > b + C_EQ, // a == b + C_NE, // a != b + C_XOR, // a ^ b + C_OR, // a | b + C_AND, // a & b + C_ADD, // a + b + C_SUB, // a - b + C_MUL, // a * b + C_DIV, // a / b + C_MOD, // a % b + C_NEG, // - a + C_LNOT, // ! a + C_NOT, // ~ a + C_R_SHIFT, // a << b + C_L_SHIFT // a >> b }; enum { @@ -981,7 +1012,8 @@ const char* parse_curly_close(const char* p) { // 構文関連の処理 // break, case, continue, default, do, for, function, // if, switch, while をこの内部で処理します。 -const char* parse_syntax(const char* p) { +const char* parse_syntax(const char* p) +{ const char *p2 = skip_word(p); switch(*p) { @@ -1264,43 +1296,47 @@ const char* parse_syntax(const char* p) { l=add_str(label); set_label(l,script_pos,p); return p; - } else if(p2 - p == 8 && !strncasecmp(p,"function",8)) { + } + else if( p2 - p == 8 && strncasecmp(p,"function",8) == 0 ) + {// internal script function const char *func_name; - // function - p=skip_space(p2); - if(p == p2) - disp_error_message("parse_syntax: expect space ' '",p); - // function - name - func_name = p; - p=skip_word(p); - if(*skip_space(p) == ';') { - // 関数の宣言 - 名前を登録して終わり + + func_name = skip_space(p2); + p = skip_word(func_name); + if( p == func_name ) + disp_error_message("parse_syntax:function: function name is missing or invalid", p); + if( *skip_space(p) == ';' ) + {// function <name> ; + // function declaration - just register the name int l; - l=add_word(func_name); - if(str_data[l].type == C_NOP) + l = add_word(func_name); + if( str_data[l].type == C_NOP )//## ??? [FlavioJS] str_data[l].type = C_USERFUNC; return skip_space(p) + 1; - } else { - // 関数の中身 + } + else + {// function <name> <line/block of code> char label[256]; int l; + syntax.curly[syntax.curly_count].type = TYPE_USERFUNC; syntax.curly[syntax.curly_count].count = 1; syntax.curly[syntax.curly_count].index = syntax.index++; syntax.curly[syntax.curly_count].flag = 0; - syntax.curly_count++; + ++syntax.curly_count; - // 関数終了まで飛ばす - sprintf(label,"goto __FN%x_FIN;",syntax.curly[syntax.curly_count-1].index); - syntax.curly[syntax.curly_count++].type = TYPE_NULL; + // Jump over the function code + sprintf(label, "goto __FN%x_FIN;", syntax.curly[syntax.curly_count-1].index); + syntax.curly[syntax.curly_count].type = TYPE_NULL; + ++syntax.curly_count; parse_line(label); - syntax.curly_count--; + --syntax.curly_count; - // 関数名のラベルを付ける + // Set the position of the function (label) l=add_word(func_name); - if(str_data[l].type == C_NOP) + if( str_data[l].type == C_NOP )//## ??? [FlavioJS] str_data[l].type = C_USERFUNC; - set_label(l,script_pos,p); + set_label(l, script_pos, p); if( parse_options&SCRIPT_USE_LABEL_DB ) strdb_put(scriptlabel_db, GETSTRING(str_data[l].str), (void*)script_pos); return skip_space(p); |