ds2.9a12/bin/
ds2.9a12/extra/
ds2.9a12/extra/crat/
ds2.9a12/extra/creremote/
ds2.9a12/extra/mingw/
ds2.9a12/extra/wolfpaw/
ds2.9a12/fluffos-2.14-ds13/
ds2.9a12/fluffos-2.14-ds13/Win32/
ds2.9a12/fluffos-2.14-ds13/compat/
ds2.9a12/fluffos-2.14-ds13/compat/simuls/
ds2.9a12/fluffos-2.14-ds13/include/
ds2.9a12/fluffos-2.14-ds13/testsuite/
ds2.9a12/fluffos-2.14-ds13/testsuite/clone/
ds2.9a12/fluffos-2.14-ds13/testsuite/command/
ds2.9a12/fluffos-2.14-ds13/testsuite/data/
ds2.9a12/fluffos-2.14-ds13/testsuite/etc/
ds2.9a12/fluffos-2.14-ds13/testsuite/include/
ds2.9a12/fluffos-2.14-ds13/testsuite/inherit/
ds2.9a12/fluffos-2.14-ds13/testsuite/inherit/master/
ds2.9a12/fluffos-2.14-ds13/testsuite/log/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/compiler/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/efuns/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/operators/
ds2.9a12/fluffos-2.14-ds13/testsuite/u/
ds2.9a12/lib/cmds/admins/
ds2.9a12/lib/cmds/common/
ds2.9a12/lib/cmds/creators/include/
ds2.9a12/lib/daemon/services/
ds2.9a12/lib/daemon/tmp/
ds2.9a12/lib/doc/
ds2.9a12/lib/doc/bguide/
ds2.9a12/lib/doc/efun/all/
ds2.9a12/lib/doc/efun/arrays/
ds2.9a12/lib/doc/efun/buffers/
ds2.9a12/lib/doc/efun/compile/
ds2.9a12/lib/doc/efun/floats/
ds2.9a12/lib/doc/efun/functions/
ds2.9a12/lib/doc/efun/general/
ds2.9a12/lib/doc/efun/mixed/
ds2.9a12/lib/doc/efun/numbers/
ds2.9a12/lib/doc/efun/parsing/
ds2.9a12/lib/doc/hbook/
ds2.9a12/lib/doc/help/classes/
ds2.9a12/lib/doc/help/races/
ds2.9a12/lib/doc/lfun/
ds2.9a12/lib/doc/lfun/all/
ds2.9a12/lib/doc/lfun/lib/abilities/
ds2.9a12/lib/doc/lfun/lib/armor/
ds2.9a12/lib/doc/lfun/lib/bank/
ds2.9a12/lib/doc/lfun/lib/bot/
ds2.9a12/lib/doc/lfun/lib/clay/
ds2.9a12/lib/doc/lfun/lib/clean/
ds2.9a12/lib/doc/lfun/lib/clerk/
ds2.9a12/lib/doc/lfun/lib/client/
ds2.9a12/lib/doc/lfun/lib/combat/
ds2.9a12/lib/doc/lfun/lib/connect/
ds2.9a12/lib/doc/lfun/lib/container/
ds2.9a12/lib/doc/lfun/lib/corpse/
ds2.9a12/lib/doc/lfun/lib/creator/
ds2.9a12/lib/doc/lfun/lib/daemon/
ds2.9a12/lib/doc/lfun/lib/damage/
ds2.9a12/lib/doc/lfun/lib/deterioration/
ds2.9a12/lib/doc/lfun/lib/donate/
ds2.9a12/lib/doc/lfun/lib/door/
ds2.9a12/lib/doc/lfun/lib/equip/
ds2.9a12/lib/doc/lfun/lib/file/
ds2.9a12/lib/doc/lfun/lib/fish/
ds2.9a12/lib/doc/lfun/lib/fishing/
ds2.9a12/lib/doc/lfun/lib/flashlight/
ds2.9a12/lib/doc/lfun/lib/follow/
ds2.9a12/lib/doc/lfun/lib/ftp_client/
ds2.9a12/lib/doc/lfun/lib/ftp_data_connection/
ds2.9a12/lib/doc/lfun/lib/fuel/
ds2.9a12/lib/doc/lfun/lib/furnace/
ds2.9a12/lib/doc/lfun/lib/genetics/
ds2.9a12/lib/doc/lfun/lib/holder/
ds2.9a12/lib/doc/lfun/lib/id/
ds2.9a12/lib/doc/lfun/lib/interactive/
ds2.9a12/lib/doc/lfun/lib/lamp/
ds2.9a12/lib/doc/lfun/lib/leader/
ds2.9a12/lib/doc/lfun/lib/light/
ds2.9a12/lib/doc/lfun/lib/limb/
ds2.9a12/lib/doc/lfun/lib/living/
ds2.9a12/lib/doc/lfun/lib/load/
ds2.9a12/lib/doc/lfun/lib/look/
ds2.9a12/lib/doc/lfun/lib/manipulate/
ds2.9a12/lib/doc/lfun/lib/meal/
ds2.9a12/lib/doc/lfun/lib/messages/
ds2.9a12/lib/doc/lfun/lib/player/
ds2.9a12/lib/doc/lfun/lib/poison/
ds2.9a12/lib/doc/lfun/lib/position/
ds2.9a12/lib/doc/lfun/lib/post_office/
ds2.9a12/lib/doc/lfun/lib/potion/
ds2.9a12/lib/doc/lfun/lib/room/
ds2.9a12/lib/doc/lfun/lib/server/
ds2.9a12/lib/doc/lfun/lib/spell/
ds2.9a12/lib/doc/lfun/lib/torch/
ds2.9a12/lib/doc/lfun/lib/vendor/
ds2.9a12/lib/doc/lfun/lib/virt_sky/
ds2.9a12/lib/doc/lfun/lib/weapon/
ds2.9a12/lib/doc/lfun/lib/worn_storage/
ds2.9a12/lib/doc/lpc/basic/
ds2.9a12/lib/doc/lpc/concepts/
ds2.9a12/lib/doc/lpc/constructs/
ds2.9a12/lib/doc/lpc/etc/
ds2.9a12/lib/doc/lpc/intermediate/
ds2.9a12/lib/doc/lpc/types/
ds2.9a12/lib/doc/misc/
ds2.9a12/lib/doc/old/
ds2.9a12/lib/domains/
ds2.9a12/lib/domains/Praxis/adm/
ds2.9a12/lib/domains/Praxis/attic/
ds2.9a12/lib/domains/Praxis/cemetery/mon/
ds2.9a12/lib/domains/Praxis/data/
ds2.9a12/lib/domains/Praxis/death/
ds2.9a12/lib/domains/Praxis/mountains/
ds2.9a12/lib/domains/Praxis/obj/armour/
ds2.9a12/lib/domains/Praxis/obj/magic/
ds2.9a12/lib/domains/Praxis/obj/weapon/
ds2.9a12/lib/domains/Praxis/orc_valley/
ds2.9a12/lib/domains/Ylsrim/
ds2.9a12/lib/domains/Ylsrim/adm/
ds2.9a12/lib/domains/Ylsrim/armor/
ds2.9a12/lib/domains/Ylsrim/broken/
ds2.9a12/lib/domains/Ylsrim/fish/
ds2.9a12/lib/domains/Ylsrim/meal/
ds2.9a12/lib/domains/Ylsrim/npc/
ds2.9a12/lib/domains/Ylsrim/obj/
ds2.9a12/lib/domains/Ylsrim/virtual/
ds2.9a12/lib/domains/Ylsrim/weapon/
ds2.9a12/lib/domains/campus/adm/
ds2.9a12/lib/domains/campus/etc/
ds2.9a12/lib/domains/campus/meals/
ds2.9a12/lib/domains/campus/save/
ds2.9a12/lib/domains/campus/txt/ai/charles/
ds2.9a12/lib/domains/campus/txt/ai/charles/bak2/
ds2.9a12/lib/domains/campus/txt/ai/charles/bak2/bak1/
ds2.9a12/lib/domains/campus/txt/ai/charly/
ds2.9a12/lib/domains/campus/txt/ai/charly/bak/
ds2.9a12/lib/domains/campus/txt/jenny/
ds2.9a12/lib/domains/cave/doors/
ds2.9a12/lib/domains/cave/etc/
ds2.9a12/lib/domains/cave/meals/
ds2.9a12/lib/domains/cave/weap/
ds2.9a12/lib/domains/default/creator/
ds2.9a12/lib/domains/default/doors/
ds2.9a12/lib/domains/default/etc/
ds2.9a12/lib/domains/default/vehicles/
ds2.9a12/lib/domains/default/virtual/
ds2.9a12/lib/domains/default/weap/
ds2.9a12/lib/domains/town/txt/shame/
ds2.9a12/lib/domains/town/virtual/
ds2.9a12/lib/domains/town/virtual/bottom/
ds2.9a12/lib/domains/town/virtual/space/
ds2.9a12/lib/estates/
ds2.9a12/lib/ftp/
ds2.9a12/lib/lib/comp/
ds2.9a12/lib/lib/daemons/
ds2.9a12/lib/lib/daemons/include/
ds2.9a12/lib/lib/lvs/
ds2.9a12/lib/lib/user/
ds2.9a12/lib/lib/virtual/
ds2.9a12/lib/log/
ds2.9a12/lib/log/adm/
ds2.9a12/lib/log/archive/
ds2.9a12/lib/log/chan/
ds2.9a12/lib/log/errors/
ds2.9a12/lib/log/law/adm/
ds2.9a12/lib/log/law/email/
ds2.9a12/lib/log/law/names/
ds2.9a12/lib/log/law/sites-misc/
ds2.9a12/lib/log/law/sites-register/
ds2.9a12/lib/log/law/sites-tempban/
ds2.9a12/lib/log/law/sites-watch/
ds2.9a12/lib/log/open/
ds2.9a12/lib/log/reports/
ds2.9a12/lib/log/router/
ds2.9a12/lib/log/secure/
ds2.9a12/lib/log/watch/
ds2.9a12/lib/obj/book_source/
ds2.9a12/lib/obj/include/
ds2.9a12/lib/powers/prayers/
ds2.9a12/lib/powers/spells/
ds2.9a12/lib/realms/template/adm/
ds2.9a12/lib/realms/template/area/armor/
ds2.9a12/lib/realms/template/area/npc/
ds2.9a12/lib/realms/template/area/obj/
ds2.9a12/lib/realms/template/area/room/
ds2.9a12/lib/realms/template/area/weap/
ds2.9a12/lib/realms/template/bak/
ds2.9a12/lib/realms/template/cmds/
ds2.9a12/lib/save/kills/o/
ds2.9a12/lib/secure/cfg/classes/
ds2.9a12/lib/secure/cmds/builders/
ds2.9a12/lib/secure/cmds/creators/include/
ds2.9a12/lib/secure/cmds/players/
ds2.9a12/lib/secure/cmds/players/include/
ds2.9a12/lib/secure/daemon/imc2server/
ds2.9a12/lib/secure/daemon/include/
ds2.9a12/lib/secure/lib/
ds2.9a12/lib/secure/lib/include/
ds2.9a12/lib/secure/lib/net/include/
ds2.9a12/lib/secure/lib/std/
ds2.9a12/lib/secure/log/adm/
ds2.9a12/lib/secure/log/bak/
ds2.9a12/lib/secure/log/intermud/
ds2.9a12/lib/secure/log/network/
ds2.9a12/lib/secure/modules/
ds2.9a12/lib/secure/npc/
ds2.9a12/lib/secure/obj/include/
ds2.9a12/lib/secure/room/
ds2.9a12/lib/secure/save/
ds2.9a12/lib/secure/save/backup/
ds2.9a12/lib/secure/save/boards/
ds2.9a12/lib/secure/tmp/
ds2.9a12/lib/secure/upgrades/files/
ds2.9a12/lib/secure/verbs/creators/
ds2.9a12/lib/std/board/
ds2.9a12/lib/std/lib/
ds2.9a12/lib/tmp/
ds2.9a12/lib/verbs/admins/include/
ds2.9a12/lib/verbs/builders/
ds2.9a12/lib/verbs/common/
ds2.9a12/lib/verbs/common/include/
ds2.9a12/lib/verbs/creators/
ds2.9a12/lib/verbs/creators/include/
ds2.9a12/lib/verbs/rooms/
ds2.9a12/lib/verbs/rooms/include/
ds2.9a12/lib/www/client/
ds2.9a12/lib/www/errors/
ds2.9a12/lib/www/images/
ds2.9a12/lib/www/lpmuds/downloads_files/
ds2.9a12/lib/www/lpmuds/intermud_files/
ds2.9a12/lib/www/lpmuds/links_files/
ds2.9a12/win32/
#include <lib.h>
#include <modules.h>

string array eventReadFunctions(string source);
int eventModString(string file, string param, string replace);

string first_arg, globalstr, globalstr2, globalstr3;
string *global_array;
mixed globalmixed;
string *where_append;

string eventAppendLast(string file, string fun, string addendum){
    int done;
    string *source;
    string junk1, junk2, junk3, junk4, junk5;
    string ret = "";
    globalstr = file;

    if(!grepp(file,"\n") && unguarded( (:file_exists(globalstr):) ) && !check_privs(this_player(),globalstr)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return "";
    }
    if(!grepp(file,"\n") && unguarded( (: file_exists(globalstr):) )) {
        file = unguarded( (: read_file(globalstr) :) );
    }

    unguarded( (: global_array  = this_object()->eventReadFunctions(globalstr) :) );
    source = global_array;
    foreach(string func in source){
        if(sscanf(func,"%s"+fun+"%s(%s)%s\n%s",junk1, junk2, junk3, junk4, junk5) == 5 && !done){
            func = reverse_string(func);
            func = replace_string(func,"}","SIHT_ECALPER",1);
            func = reverse_string(func);
            func = replace_string(func,"REPLACE_THIS",addendum+"\n}");
            done = 1;
        }
        ret += func + "\n";
    }
    return ret;
}

string eventAppend(string file, string *params, string addendum){
    int found, count, primary_line, secondary_line;
    string *file_arr;
    string *top_array;
    string *bottom_array;
    string search_str, new_string;
    int tmpnull = 0;

    if(!grepp(file,"\n") && file_exists(file)) globalstr = read_file(file); 
    else globalstr = file;

    if(!grepp(globalstr,"\n") && unguarded( (: file_exists(globalstr):) ) && !check_privs(this_player(),globalstr)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return "";
    }
    if(!grepp(globalstr,"\n") && unguarded( (: file_exists(globalstr):) )) {
        file = unguarded( (: read_file(globalstr) :) );
    }
    foreach(string param in params){
        if(!found && param && sizeof(param) && param != "" && stringp(param)){
            if(strsrch(file,param) != -1){ 
                search_str = param;
                found = 1;
            }
        }
    }

    if(!found || !search_str || search_str == ""){

        return file;
    }

    file_arr = explode(file,"\n");

    foreach(string line in file_arr){
        if(line && line != "" && strsrch(line, search_str) != -1) {
            primary_line = member_array(line, file_arr);
            count = primary_line;
        }
        if(primary_line > tmpnull){
            count++;
            if(last(line,1,1) == ";" ) {
                secondary_line = count;
            }
        }
        if(secondary_line) break;
    }

    top_array = file_arr[0..secondary_line-1];
    bottom_array = file_arr[secondary_line..sizeof(file_arr)-1];
    new_string = implode(top_array,"\n");
    new_string += addendum;
    new_string += implode(bottom_array,"\n");

    return new_string;
}

varargs mapping eventReadMapping(string file, string *params, int destructive){
    int numero, count, found, primary_line, secondary_line;
    string *file_arr;
    string *mapping_array;
    string filename, new_string, search_str, mapping_string, junk1, junk2;
    mapping new_mapping = ([]);
    mixed mixed_var;

    if(file_exists(file) && !check_privs(this_player(),file)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return ([]);
    }

    if(!grepp(file,"\n") && file_exists(file)) {
        first_arg  =  file;
        file = read_file(file);
    }

    foreach(string param in params){
        if(!found){
            if(strsrch(file,param) != -1)
                search_str = param;
            found = 1;
        }
    }

    if(!found){
        return ([]);
    }

    file_arr = explode(file,"\n");

    foreach(string line in file_arr){
        if(strsrch(line, search_str) != -1) {
            primary_line = member_array(line, file_arr);
            count = primary_line - 1;
        }
        if(primary_line){
            count++;
            if(last(line,1,1 ) == ";") {
                secondary_line = count;
            }
        }
        if(secondary_line) break;
    }


    if(primary_line != secondary_line ) 
        mapping_array = file_arr[primary_line..secondary_line];
    else mapping_array = ({ file_arr[primary_line] });

    mapping_array = file_arr[primary_line..secondary_line];

    new_string = implode(mapping_array," ");
    if(!new_string) write("Problem here.");
    if(sscanf(new_string,"%s([%s])%s",junk1,mapping_string, junk2) < 3){
        write("It's a null mapping");
        return ([]);
    }
    mapping_array = explode(mapping_string,",");
    foreach(string foo in mapping_array){
        string *sub_array;
        if(!foo) break;
        if(strsrch(foo,":") == -1) break;
        sub_array = explode(foo,":");
        if(sub_array[0] && sub_array[1]) {
            sub_array[0] = trim(replace_string(replace_string(sub_array[0]," \t",""),"\"",""));
            sub_array[1] = trim(replace_string(replace_string(sub_array[1]," \t",""),"\"",""));
            if(sscanf(sub_array[1],"%d",numero) == 1) mixed_var = numero;
            else  mixed_var = sub_array[1];
            new_mapping[sub_array[0]] = mixed_var;
        }
    }

    if(!first_arg) first_arg = "NULL";

    found = 0;

    globalstr3 = search_str;
    unguarded( (: globalstr = remove_matching_line(read_file(first_arg),globalstr3,1) :) );
    globalstr2 = generate_tmp(file);
    if(destructive) {
        unguarded( (: write_file(globalstr2, globalstr,1) :) );
        unguarded( (: cp(globalstr2, first_arg) :) );
    }
    if(sizeof(new_mapping)) return copy(new_mapping);
    else return ([]);
}

string array eventReadLines(string source){
    if(file_exists(source) && !check_privs(this_player(),source)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return ({});
    }
    globalstr = source;
    unguarded( (: global_array = explode(globalstr,"\n") :) );
    return global_array;
}

string array eventReadFunctions(string source){
    string tmpsource, headers;
    string *ret, *types, *primitives, *beginners, *fun_arr;
    int i, element, infunc;
    mixed line;
    element = -1;
    headers = "";
    line = "";
    fun_arr =  allocate(999);
    primitives = ({"private","static","nomask","varargs"});
    types = ({"int","void","buffer","mapping","mixed","string","array","float"});
    beginners = primitives + types;

    if(grepp(source,"\n") && !file_exists(source)) {
        globalstr2 = source;
        globalstr = generate_tmp(this_player());
        unguarded( (: write_file(globalstr, globalstr2,1) :) );
        source = globalstr;
    }

    tmpsource = generate_tmp(source);

    if(file_exists(source) && !check_privs(this_player(),source)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return ({});
    }

    if(file_exists(tmpsource) && !check_privs(this_player(),tmpsource)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return ({});
    }
    globalstr3 = tmpsource;
    globalstr = source;
    unguarded( (: cp(globalstr, globalstr3) :) );
    if(!file_exists(source)) return ({"Source read failed."});
    if(!file_exists(tmpsource)) return ({"Read failed."});


    for(i=1; line; i++){
        if(!line = read_file(source, i, 1)) break;
        if(!line || !stringp(line) || line == "") break;


        if(line && !infunc && !starts_with_arr(line, beginners)) headers += line;



        else if(line && !infunc && starts_with_arr(line, beginners) ){

            element++;
            infunc = 1;
            if(!sizeof(fun_arr[element])) fun_arr[element] = line;
            else fun_arr[element] += line;
        }

        else if(line && infunc && !starts_with_arr(line, beginners) ){

            fun_arr[element] += line;
        }

        else if(line && infunc && starts_with_arr(line, beginners) && !grepp(line,"(")){
            fun_arr[element] += line;
        }


        else if(line && infunc && starts_with_arr(line, beginners) && grepp(line,"(")){
            infunc = 0;
            i--;
        }
    }

    ret = ({headers});
    foreach(string item in fun_arr){
        if(item && sizeof(item)) ret += ({newline_trim(item)});
    }
    rm(tmpsource);
    return ret;
}

int eventAddInit(string file){
    string *contents, *temparray, *temparray2, *beginners;
    string tmpfile;
    int done, add, memnum;

    globalstr = tmpfile;
    globalstr2 = file;

    if(file_exists(file) && !check_privs(this_player(),file)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return 1;
    }

    tmpfile = generate_tmp(file);
    temparray = ({});
    temparray2 = ({});
    contents = unguarded( (: eventReadFunctions(globalstr2) :) );
    beginners = ({"private","static","nomask","varargs"});
    beginners += ({"int","void","buffer","mapping","mixed","string","array","float"});

    foreach(string func in contents){
        if(member_array(func,contents) != 0 && grepp(func,"void init")) memnum = member_array(func,contents);
    }

    if(memnum && memnum != -1){
        if(!grepp(contents[memnum],"::init()")){
            temparray = explode(contents[memnum],"\n");
            foreach(string line in temparray){
                if(line && !starts_with_arr(line, beginners)) add = 1;
                if(add && !done) {
                    temparray2 += ({"::init();"});
                    temparray2 += ({line});
                    done = 1;
                }
                else {
                    temparray2 += ({line});
                }
            }
            contents[memnum] = implode(temparray2,"\n");
            global_array = contents;
            globalstr3 = tmpfile;
            unguarded( (: write_file(globalstr3,implode(global_array,"\n"),1) :) );
        }

        else {
            return 2;
        }
    }

    else {
        contents += ({ "void init(){\n::init();\n}" });
        global_array = contents;
        globalstr3 = tmpfile;
        unguarded( (: write_file(globalstr3,implode(global_array,"\n"),1) :) );
    }
    globalstr = tmpfile;
    globalstr2 = file;
    done = unguarded( (: cp(globalstr, globalstr2) :) );
    unguarded( (: rm(globalstr) :) );
    return done;
}

varargs int eventModString(string file, string param, mixed replace, string *params){
    string check_include, ret, tmpfile;
    int terrain_include = 0;
    if(file_exists(file) && !check_privs(this_player(),file)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return 1;
    }
    if(!params) where_append = ({"SetLong","SetShort"});
    if(params && !sizeof(params)) where_append = ({"SetLong","SetShort"});
    else where_append = params;

    tmpfile = generate_tmp(file);

    globalstr = file;
    globalstr2 = tmpfile;
    globalstr3 = param;
    globalmixed = replace;

    if(stringp(replace)) { 
        if(globalstr3 == "SetArmorType" || globalstr3 == "SetMealType" || 
          globalstr3 == "SetPosition" || globalstr3 == "SetTerrainType" ||
          globalstr3 == "AddTerrainType" || globalstr3 == "SetSize" ||
          globalstr3 == "SetBodyType" || globalstr3 == "SetRespiration" ||
          globalstr3 == "SetVendorType" || globalstr3 == "SetDamageType"){
            replace = upper_case(replace);
            if(globalstr3 == "SetArmorType") check_include = "/include/armor_types.h";
            if(globalstr3 == "SetVendorType") check_include = "/include/vendor_types.h";
            if(globalstr3 == "SetDamageType") check_include = "/include/damage_types.h";
            if(globalstr3 == "SetMealType") check_include = "/include/meal_types.h";
            if(globalstr3 == "SetPosition") check_include = "/include/position.h";
            if(globalstr3 == "SetTerrainType") check_include = "/include/terrain_types.h";
            if(globalstr3 == "AddTerrainType") check_include = "/include/terrain_types.h";
            if(globalstr3 == "SetSize") check_include = "/include/size_types.h";
            if(globalstr3 == "SetRespiration") check_include = "/include/respiration_types.h";
            if(globalstr3 == "SetBodyType") check_include = "/include/body_types.h";
            if(globalstr3 == "SetSize" && !grepp(replace,"S_")) replace = "S_"+replace; 
            if(globalstr3 == "SetRespiration" && !grepp(replace,"R_")) replace = "R_"+replace;
            if(globalstr3 == "SetBodyType" && !grepp(replace,"B_")) replace = "B_"+replace; 
            if(globalstr3 == "SetVendorType" && !grepp(replace,"VT_")) replace = "VT_"+replace;
            if(globalstr3 == "SetArmorType" && !grepp(replace,"A_")) replace = "A_"+replace;
            if(globalstr3 == "SetTerrainType" && !grepp(replace,"T_")) replace = "T_"+replace;
            if(globalstr3 == "AddTerrainType" && !grepp(replace,"T_")) replace = "T_"+replace;
            if(grepp(replace,"T_")) terrain_include = 1;
            if(globalstr3 == "SetMealType" && !grepp(replace,"MEAL_")) replace = "MEAL_"+replace;
            if(globalstr3 == "SetPosition" && !grepp(replace,"POSITION_")) replace = "POSITION_"+replace;
            if(!grepp(read_file(check_include),replace)) {
                write("Invalid type. Please review "+check_include+" for valid types.");
                return 1;
            }
            if(grepp(replace,"MEAL_ALCOHOL")) replace = "MEAL_DRINK | MEAL_ALCOHOL";
            if(grepp(replace,"MEAL_CAFFEINE")) replace = "MEAL_DRINK | MEAL_CAFFEINE";

            globalmixed = replace;
        }
        else globalmixed = "\""+replace+"\"";
    }
    if(unguarded( (: grepp(read_file(globalstr),globalstr3):) ))
        ret = unguarded( (: replace_matching_line(read_file(globalstr), globalstr3, globalstr3+"("+globalmixed+");") :) );
    else ret = unguarded( (: eventAppend(read_file(globalstr),where_append,"\n"+globalstr3+"("+globalmixed+");\n") :) );
    if(terrain_include && !grepp(ret,"terrain_types.h")) ret = "#include <terrain_types.h>\n" + ret;
    globalstr3 = ret;
    unguarded( (:  write_file(globalstr2, globalstr3, 1) :) );
    globalstr = file;
    unguarded( (: cp(globalstr2, globalstr) :) );
    unguarded( (: rm(globalstr2) :) );
    return 1;
}

int eventModHeader(object ob, string what, string value){
    string newcontents, newline;
    string tmpfile = generate_tmp(ob);
    globalstr = tmpfile;
    globalstr2 = base_name(ob)+".c";

    unguarded( (: cp(globalstr2, globalstr) :) );
    unguarded( (: globalstr3 = read_file(globalstr) :) );

    if(what == "include") {
        what = "#include <";
        if(!grepp(value,".h")) value += ".h>";
        else value += ">";
        newline = "\n"+what + value+"\n";
    }

    if(what == "inherit") {
        value = upper_case(value);
        if(!grepp(value,"LIB_")) value = "LIB_"+value;
        newline = "\n"+what +" "+value+";\n";
    }

    if(grepp(globalstr3,value)) {
        write("That object already contains that line.");
        return 1;
    }
    if(what == "inherit"){
        globalstr3 = this_object()->eventAppend(globalstr3,({"inherit "}),newline);
    }

    else {
        if(grepp(globalstr3,what)){
            globalstr3  =  replace_string(globalstr3,".h>\n",".h>;\n");
            globalstr3  =  replace_string(globalstr3,".h\"\n",".h\";\n");
            unguarded( (: write_file(globalstr,globalstr3,1) :) );

            globalstr3 = this_object()->eventAppend(globalstr3,({"#include "}),newline);
            globalstr3  =  replace_string(globalstr3,".h>;\n",".h>\n");
            globalstr3  =  replace_string(globalstr3,".h\";\n",".h\"\n");

        }
        else {
            globalstr3 = this_object()->eventAppend(globalstr3,({"inherit "}),newline);
        }
    }

    globalstr = generate_tmp(ob);
    unguarded( (: write_file(globalstr,globalstr3,1) :) );

    if( catch(load_object(globalstr))){
        write("This change would hose up the object. Modification aborted.");
        return 1;
    }

    unguarded( (: cp(globalstr, globalstr2) :) );
    reload(ob);
    rm(tmpfile);
    return 1;
}

int eventAddCreate(string file){
    string *contents, *temparray, *temparray2, *beginners;
    string tmpfile;
    int done, add, memnum;

    globalstr = tmpfile;
    globalstr2 = file;

    if(file_exists(file) && !check_privs(this_player(),file)){
        write("You do not appear to have write access to this file. Modification aborted.");
        return 1;
    }

    tmpfile = generate_tmp(file);
    temparray = ({});
    temparray2 = ({});
    contents = unguarded( (: eventReadFunctions(globalstr2) :) );
    beginners = ({"private","static","nomask","varargs"});
    beginners += ({"int","void","buffer","mapping","mixed","string","array","float"});

    foreach(string func in contents){
        if(member_array(func,contents) != 0 && grepp(func,"void create")) memnum = member_array(func,contents);
    }

    if(memnum && memnum != -1){
        if(!grepp(contents[memnum],"::create()")){
            temparray = explode(contents[memnum],"\n");
            foreach(string line in temparray){
                if(line && !starts_with_arr(line, beginners)) add = 1;
                if(add && !done) {
                    temparray2 += ({"::create();"});
                    temparray2 += ({line});
                    done = 1;
                }
                else {
                    temparray2 += ({line});
                }
            }
            contents[memnum] = implode(temparray2,"\n");
            global_array = contents;
            globalstr3 = tmpfile;
            unguarded( (: write_file(globalstr3,implode(global_array,"\n"),1) :) );
        }

        else {
            return 2;
        }
    }

    global_array = contents;
    globalstr3 = tmpfile;
    unguarded( (: write_file(globalstr3,implode(global_array,"\n"),1) :) );
    globalstr = tmpfile;
    globalstr2 = file;
    done = unguarded( (: cp(globalstr, globalstr2) :) );
    unguarded( (: rm(globalstr) :) );
    return done;
}