From 3d1770b8cc9e596ac33757ace64462ad3d90a15c Mon Sep 17 00:00:00 2001 From: mekolat Date: Thu, 17 Sep 2015 20:21:57 -0400 Subject: add array_search --- src/map/script-fun.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'src/map/script-fun.cpp') diff --git a/src/map/script-fun.cpp b/src/map/script-fun.cpp index 2407b37..a06eb1b 100644 --- a/src/map/script-fun.cpp +++ b/src/map/script-fun.cpp @@ -820,6 +820,54 @@ void builtin_getelementofarray(ScriptState *st) } } +static +void builtin_array_search(ScriptState *st) +{ + ZString needle_str = ZString(conv_str(st, &AARG(0))); + int needle_int = conv_num(st, &AARG(0)); + SIR reg = AARG(1).get_if()->reg; // haystack + ZString name = variable_names.outtern(reg.base()); + char prefix = name.front(); + int i, c; + + if (prefix != '$' && prefix != '@' && prefix != '.') + { + PRINTF("builtin_array_search: illegal scope!\n"_fmt); + return; + } + + i = reg.index(); c = -1; + for (; i < 256; i++) + { + struct script_data vd = get_val2(st, reg.iplus(i)); + MATCH_BEGIN (vd) + { + MATCH_CASE (const ScriptDataStr&, u) + { + if (u.str == needle_str) + { + c = i; + goto Out; + } + continue; + } + MATCH_CASE (const ScriptDataInt&, u) + { + if (u.numi == needle_int) + { + c = i; + goto Out; + } + continue; + } + } + MATCH_END (); + abort(); + } + Out: + push_int(st->stack, c); +} + static void builtin_wgm(ScriptState *st) { @@ -3354,6 +3402,7 @@ BuiltinFunction builtin_functions[] = BUILTIN(cleararray, "Nei"_s, '\0'), BUILTIN(getarraysize, "N"_s, 'i'), BUILTIN(getelementofarray, "Ni"_s, '.'), + BUILTIN(array_search, "eN"_s, 'i'), BUILTIN(setlook, "ii"_s, '\0'), BUILTIN(countitem, "I"_s, 'i'), BUILTIN(checkweight, "Ii"_s, 'i'), -- cgit v1.2.3-60-g2f50