/* Do not remove the headers from this file! see /USAGE for more info. */
/*
** input.c -- modules to aid in working with the input system
**
** All functions in the interface are "protected" so that only the object
** inheriting this module can call them.
**
** modal_push()
** modal_push_char()
** modal_pop()
** modal_func()
** modal_simple()
** modal_pass()
** modal_stack_size()
**
** input_one_arg()
** input_two_args()
** input_three_args()
**
** 961209, Deathblade: moved the input_*_args() functions here from admtool.
** 950501, Deathblade: Created.
*/
private nosave object input_user;
protected varargs nomask void modal_push(
function input_func,
mixed prompt_func,
function secure,
function return_to_func
)
{
if ( input_user && this_user() != input_user )
error("user mismatch -- already assigned to a user\n");
input_user = this_user();
input_user->modal_push(input_func, prompt_func, secure, return_to_func);
}
protected nomask void modal_push_char(function callback)
{
input_user->modal_push_char(callback);
}
protected nomask void modal_pop()
{
input_user->modal_pop();
input_user = 0;
}
protected varargs nomask void modal_func(
function input_func,
mixed prompt_func,
int secure
)
{
input_user->modal_func(input_func, prompt_func, secure);
}
protected varargs nomask void modal_simple(
function input_func,
mixed prompt,
int secure
)
{
this_user()->modal_simple(input_func, prompt, secure);
}
protected nomask void modal_pass(string str)
{
input_user->modal_pass(str);
}
protected nomask int modal_stack_size()
{
return input_user->modal_stack_size();
}
//:FUNCTION input_one_arg
//Get a single argument and call a given function pointer with it. If the
//argument isn't present (arg == 0), then the prompt is used to ask for
//the value.
protected varargs nomask void input_one_arg(
string arg_prompt,
function fp,
string arg
)
{
ZBUG( ({ arg_prompt, fp, arg }) );
if ( !arg )
{
modal_simple(fp, arg_prompt);
return;
}
evaluate(fp, arg);
}
private nomask void rcv_first_of_two(string arg2_prompt,
function fp,
string arg1)
{
string arg2;
if ( arg1 == "" )
{
write("Aborted.\n");
return;
}
if ( sscanf(arg1, "%s %s", arg1, arg2) == 2 )
{
evaluate(fp, arg1, arg2);
}
else
{
modal_simple((: evaluate, fp, arg1 :), sprintf(arg2_prompt, arg1));
}
}
//:FUNCTION input_two_args
//Get two one-word arguments and call a given function pointer with them.
//Some or all of the arguments may be passed in initially; if they are not
//all present, then the prompts are used to ask for the values.
protected varargs nomask void input_two_args(
string arg1_prompt,
string arg2_prompt,
function fp,
string arg
)
{
if ( arg )
{
string arg2;
if ( sscanf(arg, "%s %s", arg, arg2) == 2 )
{
evaluate(fp, arg, arg2);
}
else
{
rcv_first_of_two(arg2_prompt, fp, arg);
}
}
else
{
modal_simple((: rcv_first_of_two, arg2_prompt, fp :), arg1_prompt);
}
}
private nomask void rcv_last_of_three(string arg3_prompt,
function fp,
string arg1,
string arg2)
{
string arg3;
if ( arg1 == "" )
{
write("Aborted.\n");
return;
}
if ( sscanf(arg2, "%s %s", arg2, arg3) == 2 )
{
evaluate(fp, arg1, arg2, arg3);
}
else
{
modal_simple((: evaluate, fp, arg1, arg2 :),
sprintf(arg3_prompt, arg2));
}
}
private nomask void rcv_second_of_three(string arg2_prompt,
string arg3_prompt,
function fp,
string arg)
{
string arg1, arg2, arg3;
if ( sscanf(arg, "%s %s %s", arg1, arg2, arg3) == 3 )
{
evaluate(fp, arg1, arg2, arg3);
}
else if ( sscanf(arg, "%s %s", arg1, arg2) == 2 )
{
rcv_last_of_three(arg3_prompt, fp, arg1, arg2);
}
else
{
modal_simple((: rcv_last_of_three, arg3_prompt, fp, arg :),
sprintf(arg2_prompt, arg1));
}
}
//:FUNCTION input_three_args
//Get three one-word arguments and call a given function pointer with them.
//Some or all of the arguments may be passed in initially; if they are not
//all present, then the prompts are used to ask for the values.
protected varargs nomask void input_three_args(
string arg1_prompt,
string arg2_prompt,
string arg3_prompt,
function fp,
string arg
)
{
string arg1, arg2, arg3;
if ( arg )
{
if ( sscanf(arg, "%s %s %s", arg1, arg2, arg3) == 3 )
{
evaluate(fp, arg1, arg2, arg3);
}
else if ( sscanf(arg, "%s %s", arg1, arg2) == 2 )
{
rcv_last_of_three(arg3_prompt, fp, arg1, arg2);
}
else
{
rcv_second_of_three(arg2_prompt, arg3_prompt, fp, arg);
}
}
else
{
/* 0 Args */
modal_simple((: rcv_second_of_three, arg2_prompt, arg3_prompt, fp :),
arg1_prompt);
}
}