@q
@prog cmd-change
1 99999 d
1 i
( cmd-change                                                         )
(   This is a program that will let you replace errors in a message  )
(   or property so that you can fix up typo's without having to      )
(   retype the entire thing.                                         )
(                                                                    )
( Usage:  change <object>=<prop>:/<old>/<new>      or                )
(         change <object>=<mesg>;/<old>/<new>                        )
(                                                                    )
(                                                                    )
( CHANGES: Added a 'checkperms' routine to prevent non-wiz users     )
(          from changing @wizard or ~restricted props -- Jessy 7/00  )
(                                                                    )
  
$include $lib/strings
  
: checkperms ( s --  )
  dup "@" stringpfx
  over "/@" instr
  3 pick "~" stringpfx
  4 rotate "/~" instr or or or
  me @ "W" flag? not and if
    "Permission denied." .tell pid kill
  then
;
 
: in-string? (str searchstr -- bool)
    instr dup not if
      "I don't see the sequence you want me to change." .tell
    then
;
  
: replace-text ( str old new -- str )
(doesn't crash the server like subst with expanding strs to >4096 chars )
    3 pick 3 pick instr dup if
      1 - 4 rotate swap strcut
      4 pick strlen strcut swap pop
      4 pick 4 pick replace-text
      3 pick swap strcat strcat
      rot rot
    else pop
    then
    pop pop
;
  
: error
    "Name: Change v1.02   Written by Tygryss   Last updated 3/31/92" .tell
    "Desc: Lets you replace some text in a message or property with" .tell
    "       new text.  Useful for fixing typos in a long message." .tell
    " " .tell
    "Syntax: change <object>=<propname>:/<old>/<new>   or" .tell
    "        change <object>=<mesgtype>;/<old>/<new>" .tell
    " " .tell
    "<mesgtype> can be name/desc/succ/osucc/fail/ofail/drop/odrop" .tell
    "The first character after the : or ; is the delimiter character," .tell
    "  in this case a '/'." .tell
;
  
: change-main
		"me" match me !
    "=" .split
    dup not if error exit then
    swap .stripspaces
    dup not if error exit then
    swap dup ":" instr over ";" instr
    over not over not and if error exit then
    dup not if pop 5000 then swap
    dup not if pop 5000 then swap
    < if ( : for property? )
        ":" .split
        dup not if error exit then
        swap .stripspaces
        dup not if error exit then
        swap 1 strcut swap over over
        instr not if error exit then
        swap over .split rot over swap
        instr if error exit then
        4 rotate match
        dup #-1 dbcmp if
            "I don't see that here."
            .tell exit
        then
        dup #-2 dbcmp if
            "I don't know which one you mean!"
            .tell exit
        then
        dup #-3 dbcmp if
            "I don't know what you mean!"
            .tell exit
        then
        dup owner me @ dbcmp not
        me @ "w" flag? not and if
            "Permission denied."
            .tell exit
        then
        4 rotate over over 
				dup checkperms
				getpropstr
        dup not if
            "I can't change a property that doesn't exist." .tell
            pop pop pop pop pop exit
        then
        dup 6 pick in-string? not if pop pop pop pop pop exit then
        5 rotate 5 rotate replace-text
        dup not if
            pop remove_prop
        else
            0 addprop
        then
        "Property changed." .tell
    else  ( ; for message? )
        ";" .split
        dup not if error exit then
        swap .stripspaces
        dup not if error exit then
        swap 1 strcut swap over over
        instr not if error exit then
        swap over .split rot over swap
        instr if error exit then
        4 rotate match
        dup #-1 dbcmp if
            "I don't see that here."
            .tell exit
        then
        dup #-2 dbcmp if
            "I don't know which one you mean!"
            .tell exit
        then
        dup #-3 dbcmp if
            "I don't know what you mean!"
            .tell exit
        then
        dup owner me @ dbcmp not
        me @ "w" flag? not and if
            "Permission denied."
            .tell exit
        then
        dup 5 rotate
        dup "@" 1 strncmp not if 1 strcut swap pop then
        dup      "name" stringcmp not if
            pop name 4 rotate 4 rotate
            3 pick 3 pick in-string? not if pop pop pop pop exit then
            replace-text setname
        else dup "desc" stringcmp not if
            pop desc 4 rotate 4 rotate
            3 pick 3 pick in-string? not if pop pop pop pop exit then
            replace-text setdesc
        else dup "succ" stringcmp not if
            pop succ 4 rotate 4 rotate
            3 pick 3 pick in-string? not if pop pop pop pop exit then
            replace-text setsucc
        else dup "osucc" stringcmp not if
            pop osucc 4 rotate 4 rotate
            3 pick 3 pick in-string? not if pop pop pop pop exit then
            replace-text setosucc
        else dup "fail" stringcmp not if
            pop fail 4 rotate 4 rotate
            3 pick 3 pick in-string? not if pop pop pop pop exit then
            replace-text setfail
        else dup "ofail" stringcmp not if
            pop ofail 4 rotate 4 rotate
            3 pick 3 pick in-string? not if pop pop pop pop exit then
            replace-text setofail
        else dup "drop" stringcmp not if
            pop drop 4 rotate 4 rotate
            3 pick 3 pick in-string? not if pop pop pop pop exit then
            replace-text setdrop
        else dup "odrop" stringcmp not if
            pop odrop 4 rotate 4 rotate
            3 pick 3 pick in-string? not if pop pop pop pop exit then
            replace-text setodrop
        else
            "I don't recognize the field named \""
            swap strcat "\"" strcat .tell exit
        then then then then then then then then
        "Message changed." .tell
    then
;
.
c
q
@register #me cmd-change=tmp/prog1
@set $tmp/prog1=W
@set $tmp/prog1=/_/de:A scroll containing a spell called cmd-change