Switch to edit mode.
Name(s): @sub* @subst*1: $perm_utils:is_called_from(player, "my_huh") || raise(E_PERM)
2: if (!player.programmer)
3: return player:tell("Sorry, this is a programming verb. You need to be a programmer to use it.")
4: endif
5: if (verb in {"@sub", "@subst"})
6: substr = argstr
7: else
8: substr = tostr(verb[(`verb[1] == "@" ? verb[5..6] | verb[4..5] ! E_RANGE => ""' == "st" ? index(verb, "t") | index(verb, "b")) + 1..$], " ", argstr)
9: endif
10: if (rindex(substr, substr[1]) < 3)
11: return player:tell("Malformed substitution. Suggested syntax: @subst/<find>/<replace>/<options>")
12: elseif (length(subs = $string_utils:explode(substr, substr[1])) < 3)
13: return player:tell("You must specify a line number or a range of lines. (eg: 2, 4-7, 1-$)")
14: endif
15: if (!(open = index(subs[3], "[")) || !(close = index(subs[3], "]")) || open > close)
16: return player:tell("Malformed options. Use: lines[obj:verb]gc")
17: elseif (!(vloc = $code_utils:parse_verbref(subs[3][open + 1..close - 1])))
18: return player:tell("Malformed verbname.")
19: elseif (!valid(m = player:my_match_object(vloc[1])) || m:has_verb(vloc[2]) != {m})
20: return player:tell("That object does not have that verb.")
21: elseif (!caller_perms().wizard && !player.wizard && !(player == (own = verb_info(m, vloc[2])[1])))
22: return player:tell("You don't have permission to edit that verb.")
23: endif
24: global = index(`subs[3][close + 1] ! E_RANGE => ""', "g")
25: case = index(`subs[3][close + 1] ! E_RANGE => ""', "c")
26: subs[3] = subs[3][1..open - 1]
27: range = (i = index(subs[3], "-")) ? {subs[3][1..i - 1], subs[3][i + 1..$]} | {subs[3], subs[3]}
28: range = {range[1] == "$" ? tostr(length(verb_code(m, vloc[2]))) | range[1], range[2] == "$" ? tostr(length(verb_code(m, vloc[2]))) | range[2]}
29: if (tostr(toint(range[1])) != range[1] || tostr(toint(range[2])) != range[2])
30: return player:tell("From line ", range[1], " to line ", range[2], "???")
31: endif
32: "well, that's enough parsing for me. on to the actual substitution."
33: vcode = newcode = verb_code(m, vloc[2])
34: suspend(0)
35: range = {toint(range[1]), toint(range[2])}
36: didsubs = 0
37: for x in [range[1]..range[2]]
38: newcode[x] = strsub(vcode[x], subs[1], subs[2])
39: if (vcode[x] != newcode[x])
40: player:tell(x, " : ", newcode[x])
41: suspend(0)
42: didsubs = 1
43: endif
44: endfor
45: didsubs || player:tell("Search string not found!")
46: set_task_perms(player)
47: if (ERR = set_verb_code(m, vloc[2], newcode))
48: player:tell({"The substitutions caused the following errors:", @ERR})
49: else
50: player:tell("Verbcode compiled and written to ", m, ":", vloc[2])
51: endif
52: "Last modified by Dax (#789) on Tue May 3 14:13:13 2005 MDT."