set_limits

deprecated
/* This sefun is to provide a replacement for the efun set_limits().
 * Feel free to add it to your mudlibs, if you have much code relying on that.
 */

#if ! __EFUN_DEFINED__(set_limits)

#include <driver_info.h>
#include <rtlimits.h>

void set_limits(varargs mixed* args)
{
    int * limits;
    int * def;

    if(!sizeof(args))
        raise_error("No arguments given.\n");

    if(sizeof(args) == 1 && pointerp(args[0]))
        limits = args[0];
    else if(sizeof(args) % 2)
        raise_error("set_limits(): Invalid limit specification.\n");
    else
    {
        // Extract the limits...
        limits = ({ LIMIT_KEEP }) * LIMIT_MAX;
        for(int i = 0; i < sizeof(args); i+= 2)
        {
            if(!intp(args[i]))
                raise_error("Illegal limit tag: expected a number\n");

            if(!intp(args[i+1]))
                raise_error("Illegal limit value: expected a number\n");

            if(args[i] < 0 || args[i] >= LIMIT_MAX)
                raise_error(sprintf("Unimplemented limit #%d\n", args[i]));

            limits[args[i]] = args[i+1];
        }
    }

    def = efun::driver_info(DC_DEFAULT_RUNTIME_LIMITS);
    for(int i = 0; i < sizeof(limits); i++)
    {
        if(limits[i] == LIMIT_KEEP || limits[i] == LIMIT_DEFAULT)
            limits[i] = def[i];
    }

    int result;

    if(!efun::call_direct_resolved(&result, __MASTER_OBJECT__, "privilege_violation",
            "set_limits", previous_object(), limits))
        result = -1;

    if(result < 0)
        raise_error("privilege violation: set_limits\n");
    else if (result > 0)
        efun::configure_driver(DC_DEFAULT_RUNTIME_LIMITS, limits);
}

#endif