576 lines
21 KiB
C
576 lines
21 KiB
C
/******************************************************************************
|
|
Copyright (c) 1992, 1995, 1996 Xerox Corporation. All rights reserved.
|
|
Portions of this code were written by Stephen White, aka ghond.
|
|
Use and copying of this software and preparation of derivative works based
|
|
upon this software are permitted. Any distribution of this software or
|
|
derivative works must comply with all applicable United States export
|
|
control laws. This software is made available AS IS, and Xerox Corporation
|
|
makes no warranty about the software, its performance or its conformity to
|
|
any specification. Any person obtaining a copy of this software is requested
|
|
to send their name and post office or electronic mail address to:
|
|
Pavel Curtis
|
|
Xerox PARC
|
|
3333 Coyote Hill Rd.
|
|
Palo Alto, CA 94304
|
|
Pavel@Xerox.Com
|
|
*****************************************************************************/
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include "pconfig.h"
|
|
#include "functions.h"
|
|
#include "list.h"
|
|
#include "storage.h"
|
|
#include "streams.h"
|
|
#include "structures.h"
|
|
#include "utils.h"
|
|
|
|
/*****************************************************************************
|
|
* This is the table of procedures that register MOO built-in functions. To
|
|
* add new built-in functions to the server, add to the list below the name of
|
|
* a C function that will register your new MOO built-ins; your C function will
|
|
* be called exactly once, during server initialization. Also add a
|
|
* declaration of that C function to `bf_register.h' and add the necessary .c
|
|
* files to the `CSRCS' line in the Makefile.
|
|
****************************************************************************/
|
|
|
|
typedef void (*registry) ();
|
|
|
|
void register_disassemble();
|
|
void register_execute();
|
|
void register_functions();
|
|
void register_list();
|
|
void register_log();
|
|
void register_numbers();
|
|
void register_objects();
|
|
void register_property();
|
|
void register_server();
|
|
void register_tasks();
|
|
void register_verbs();
|
|
/* Added functions */
|
|
void register_ansi();
|
|
void register_martian();
|
|
void register_files();
|
|
|
|
static registry bi_function_registries[] =
|
|
{
|
|
register_disassemble,
|
|
register_execute,
|
|
register_functions,
|
|
register_list,
|
|
register_log,
|
|
register_numbers,
|
|
register_objects,
|
|
register_property,
|
|
register_server,
|
|
register_tasks,
|
|
register_verbs,
|
|
/* Added functions */
|
|
register_ansi,
|
|
register_martian,
|
|
register_files
|
|
};
|
|
|
|
struct bft_entry {
|
|
const char *name;
|
|
const char *protect_str;
|
|
const char *verb_str;
|
|
int minargs;
|
|
int maxargs;
|
|
var_type *prototype;
|
|
bf_type func;
|
|
bf_read_type read;
|
|
bf_write_type write;
|
|
int protected;
|
|
};
|
|
|
|
static struct bft_entry bf_table[MAX_FUNC];
|
|
static unsigned top_bf_table = 0;
|
|
|
|
void
|
|
register_bi_functions()
|
|
{
|
|
int loop, num_registries =
|
|
sizeof(bi_function_registries) / sizeof(bi_function_registries[0]);
|
|
|
|
if (top_bf_table != 0)
|
|
return;
|
|
|
|
for (loop = 0; loop < num_registries; loop++)
|
|
(void) (*(bi_function_registries[loop])) ();
|
|
}
|
|
|
|
/*** register ***/
|
|
|
|
static unsigned
|
|
register_common(const char *name, int minargs, int maxargs, bf_type func,
|
|
bf_read_type read, bf_write_type write, va_list args)
|
|
{
|
|
int va_index;
|
|
int num_arg_types = maxargs == -1 ? minargs : maxargs;
|
|
static Stream *s = 0;
|
|
|
|
if (!s)
|
|
s = new_stream(30);
|
|
|
|
if (top_bf_table == MAX_FUNC) {
|
|
return 0;
|
|
}
|
|
bf_table[top_bf_table].name = str_dup(name);
|
|
stream_printf(s, "protect_%s", name);
|
|
bf_table[top_bf_table].protect_str = str_dup(reset_stream(s));
|
|
stream_printf(s, "bf_%s", name);
|
|
bf_table[top_bf_table].verb_str = str_dup(reset_stream(s));
|
|
bf_table[top_bf_table].minargs = minargs;
|
|
bf_table[top_bf_table].maxargs = maxargs;
|
|
bf_table[top_bf_table].func = func;
|
|
bf_table[top_bf_table].read = read;
|
|
bf_table[top_bf_table].write = write;
|
|
bf_table[top_bf_table].protected = 0;
|
|
|
|
if (num_arg_types > 0)
|
|
bf_table[top_bf_table].prototype =
|
|
mymalloc(num_arg_types * sizeof(var_type), M_PROTOTYPE);
|
|
else
|
|
bf_table[top_bf_table].prototype = 0;
|
|
for (va_index = 0; va_index < num_arg_types; va_index++)
|
|
bf_table[top_bf_table].prototype[va_index] = va_arg(args, var_type);
|
|
|
|
return top_bf_table++;
|
|
}
|
|
|
|
unsigned
|
|
register_function(const char *name, int minargs, int maxargs,
|
|
bf_type func,...)
|
|
{
|
|
va_list args;
|
|
unsigned ans;
|
|
|
|
va_start(args, func);
|
|
ans = register_common(name, minargs, maxargs, func, 0, 0, args);
|
|
va_end(args);
|
|
return ans;
|
|
}
|
|
|
|
unsigned
|
|
register_function_with_read_write(const char *name, int minargs, int maxargs,
|
|
bf_type func, bf_read_type read,
|
|
bf_write_type write,...)
|
|
{
|
|
va_list args;
|
|
unsigned ans;
|
|
|
|
va_start(args, write);
|
|
ans = register_common(name, minargs, maxargs, func, read, write, args);
|
|
va_end(args);
|
|
return ans;
|
|
}
|
|
|
|
/*** looking up functions -- by name or num ***/
|
|
|
|
static const char *func_not_found_msg = "no such function";
|
|
|
|
unsigned
|
|
number_func_by_name(const char *name)
|
|
{ /* used by parser only */
|
|
unsigned i;
|
|
|
|
for (i = 0; i < top_bf_table; i++)
|
|
if (!mystrcasecmp(name, bf_table[i].name))
|
|
return i;
|
|
|
|
return FUNC_NOT_FOUND;
|
|
}
|
|
|
|
/*** calling built-in functions ***/
|
|
|
|
void
|
|
register_functions(void)
|
|
{
|
|
register_function("function_info", 0, 1, NULL, TYPE_STR);
|
|
register_function("load_server_options", 0, 0, NULL);
|
|
}
|
|
|
|
void
|
|
register_disassemble(void)
|
|
{
|
|
register_function("disassemble", 2, 2, NULL, TYPE_OBJ, TYPE_ANY);
|
|
}
|
|
|
|
void
|
|
register_execute(void)
|
|
{
|
|
register_function_with_read_write("call_function", 1, -1, NULL,
|
|
NULL, NULL, TYPE_STR);
|
|
register_function("raise", 1, 3, NULL, TYPE_ANY, TYPE_STR, TYPE_ANY);
|
|
register_function("suspend", 0, 1, NULL, TYPE_INT);
|
|
register_function("read", 0, 2, NULL, TYPE_OBJ, TYPE_ANY);
|
|
|
|
register_function("seconds_left", 0, 0, NULL);
|
|
register_function("ticks_left", 0, 0, NULL);
|
|
register_function("pass", 0, -1, NULL);
|
|
register_function("set_task_perms", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("caller_perms", 0, 0, NULL);
|
|
register_function("callers", 0, 1, NULL, TYPE_ANY);
|
|
register_function("task_stack", 1, 2, NULL, TYPE_INT, TYPE_ANY);
|
|
}
|
|
|
|
void
|
|
register_log(void)
|
|
{
|
|
register_function("server_log", 1, 2, NULL, TYPE_STR, TYPE_ANY);
|
|
}
|
|
|
|
void
|
|
register_objects(void)
|
|
{
|
|
register_function("toobj", 1, 1, NULL, TYPE_ANY);
|
|
register_function("typeof", 1, 1, NULL, TYPE_ANY);
|
|
register_function_with_read_write("create", 1, 2, NULL,
|
|
NULL, NULL, TYPE_OBJ, TYPE_OBJ);
|
|
register_function_with_read_write("recycle", 1, 1, NULL,
|
|
NULL, NULL, TYPE_OBJ);
|
|
register_function("object_bytes", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("valid", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("parent", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("children", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("chparent", 2, 2, NULL, TYPE_OBJ, TYPE_OBJ);
|
|
register_function("max_object", 0, 0, NULL);
|
|
register_function("players", 0, 0, NULL);
|
|
register_function("is_player", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("set_player_flag", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_ANY);
|
|
register_function_with_read_write("move", 2, 2, NULL,
|
|
NULL, NULL,
|
|
TYPE_OBJ, TYPE_OBJ);
|
|
register_function("is_group", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("is_groupmember", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_OBJ);
|
|
register_function("set_group_flag", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_ANY);
|
|
register_function("groupwise_equiv", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_OBJ);
|
|
}
|
|
|
|
void
|
|
register_property(void)
|
|
{
|
|
register_function("properties", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("property_info", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_STR);
|
|
register_function("set_property_info", 3, 3, NULL,
|
|
TYPE_OBJ, TYPE_STR, TYPE_LIST);
|
|
register_function("add_property", 4, 4, NULL,
|
|
TYPE_OBJ, TYPE_STR, TYPE_ANY, TYPE_LIST);
|
|
register_function("delete_property", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_STR);
|
|
register_function("clear_property", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_STR);
|
|
register_function("is_clear_property", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_STR);
|
|
register_function("prop_bytes", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_STR);
|
|
}
|
|
|
|
void
|
|
register_server(void)
|
|
{
|
|
register_function("server_version", 0, 0, NULL);
|
|
register_function("renumber", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("reset_max_object", 0, 0, NULL);
|
|
register_function("memory_usage", 0, 0, NULL);
|
|
register_function("shutdown", 0, 1, NULL, TYPE_STR);
|
|
register_function("dump_database", 0, 0, NULL);
|
|
register_function("db_disk_size", 0, 0, NULL);
|
|
register_function("open_network_connection", 0, -1,
|
|
NULL);
|
|
register_function("connected_players", 0, 1, NULL,
|
|
TYPE_ANY);
|
|
register_function("connected_seconds", 1, 1, NULL,
|
|
TYPE_OBJ);
|
|
register_function("idle_seconds", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("connection_name", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("notify", 2, 3, NULL, TYPE_OBJ, TYPE_STR, TYPE_ANY);
|
|
register_function("notify_ansi", 2, 3, NULL, TYPE_OBJ, TYPE_STR,
|
|
TYPE_ANY);
|
|
register_function("boot_player", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("set_connection_option", 3, 3, NULL,
|
|
TYPE_OBJ, TYPE_STR, TYPE_ANY);
|
|
register_function("connection_option", 2, 2, NULL,
|
|
TYPE_OBJ, TYPE_STR);
|
|
register_function("connection_options", 1, 1, NULL,
|
|
TYPE_OBJ);
|
|
register_function("listen", 2, 3, NULL, TYPE_OBJ, TYPE_ANY, TYPE_ANY);
|
|
register_function("unlisten", 1, 1, NULL, TYPE_ANY);
|
|
register_function("listeners", 0, 0, NULL);
|
|
register_function("buffered_output_length", 0, 1,
|
|
NULL, TYPE_OBJ);
|
|
}
|
|
|
|
void
|
|
register_tasks(void)
|
|
{
|
|
register_function("task_id", 0, 0, NULL);
|
|
register_function("queued_tasks", 0, 0, NULL);
|
|
register_function("kill_task", 1, 1, NULL, TYPE_INT);
|
|
register_function("output_delimiters", 1, 1, NULL,
|
|
TYPE_OBJ);
|
|
register_function("queue_info", 0, 1, NULL, TYPE_OBJ);
|
|
register_function("resume", 1, 2, NULL, TYPE_INT, TYPE_ANY);
|
|
register_function("force_input", 2, 3, NULL,
|
|
TYPE_OBJ, TYPE_STR, TYPE_ANY);
|
|
register_function("flush_input", 1, 2, NULL, TYPE_OBJ, TYPE_ANY);
|
|
}
|
|
|
|
void
|
|
register_verbs(void)
|
|
{
|
|
register_function("verbs", 1, 1, NULL, TYPE_OBJ);
|
|
register_function("verb_info", 2, 2, NULL, TYPE_OBJ, TYPE_ANY);
|
|
register_function("set_verb_info", 3, 3, NULL,
|
|
TYPE_OBJ, TYPE_ANY, TYPE_LIST);
|
|
register_function("verb_args", 2, 2, NULL, TYPE_OBJ, TYPE_ANY);
|
|
register_function("set_verb_args", 3, 3, NULL,
|
|
TYPE_OBJ, TYPE_ANY, TYPE_LIST);
|
|
register_function("add_verb", 3, 3, NULL,
|
|
TYPE_OBJ, TYPE_LIST, TYPE_LIST);
|
|
register_function("delete_verb", 2, 2, NULL, TYPE_OBJ, TYPE_ANY);
|
|
register_function("verb_code", 2, 4, NULL,
|
|
TYPE_OBJ, TYPE_ANY, TYPE_ANY, TYPE_ANY);
|
|
register_function("set_verb_code", 3, 3, NULL,
|
|
TYPE_OBJ, TYPE_ANY, TYPE_LIST);
|
|
register_function("eval", 1, 1, NULL, TYPE_STR);
|
|
register_function("verb_bytes", 2, 2, NULL, TYPE_OBJ, TYPE_STR);
|
|
}
|
|
|
|
void
|
|
register_ansi(void)
|
|
{
|
|
register_function("ansi_delete", 1, 1, NULL, TYPE_STR);
|
|
register_function("ansi_escape", 1, 1, NULL, TYPE_STR);
|
|
register_function("ansi_cutoff", 3, 3, NULL, TYPE_STR, TYPE_INT, TYPE_INT);
|
|
}
|
|
|
|
void
|
|
register_martian()
|
|
{
|
|
register_function("xor", 2, 2, NULL, TYPE_ANY, TYPE_ANY);
|
|
register_function("us_time", 0, 0, NULL);
|
|
register_function("nprogs", 0, 0, NULL);
|
|
register_function("random_of", 1, 1, NULL, TYPE_LIST);
|
|
register_function("enlist", 1, 1, NULL, TYPE_ANY);
|
|
register_function("explode", 1, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("panic", 0, 1, NULL, TYPE_STR);
|
|
register_function("isa", 2, 2, NULL, TYPE_OBJ, TYPE_OBJ);
|
|
}
|
|
|
|
void
|
|
register_files(void)
|
|
{
|
|
register_function("fileappend", 3, 3, NULL, TYPE_STR, TYPE_STR, TYPE_LIST);
|
|
register_function("filechmod", 3, 3, NULL, TYPE_STR, TYPE_STR, TYPE_STR);
|
|
register_function("filedelete", 2, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("fileerror", 0, 0, NULL);
|
|
register_function("fileexists", 2, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("fileextract", 4, 5, NULL, TYPE_STR, TYPE_STR, TYPE_STR, TYPE_STR, TYPE_STR);
|
|
register_function("filegrep", 3, 4, NULL, TYPE_STR, TYPE_STR, TYPE_STR, TYPE_STR);
|
|
register_function("fileinfo", 2, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("filelength", 2, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("filelist", 1, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("filemkdir", 2, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("fileread", 2, 4, NULL, TYPE_STR, TYPE_STR, TYPE_INT, TYPE_INT);
|
|
register_function("filerename", 3, 3, NULL, TYPE_STR, TYPE_STR, TYPE_STR);
|
|
register_function("filermdir", 2, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("filerun", 1, -1, NULL, TYPE_STR, TYPE_LIST, TYPE_LIST);
|
|
register_function("filesize", 2, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("fileversion", 0, 0, NULL);
|
|
register_function("filewrite", 3, 5, NULL, TYPE_STR, TYPE_STR, TYPE_LIST, TYPE_INT, TYPE_INT);
|
|
}
|
|
|
|
void
|
|
register_numbers(void)
|
|
{
|
|
register_function("toint", 1, 1, NULL, TYPE_ANY);
|
|
register_function("tonum", 1, 1, NULL, TYPE_ANY);
|
|
register_function("tofloat", 1, 1, NULL, TYPE_ANY);
|
|
register_function("min", 1, -1, NULL, TYPE_NUMERIC);
|
|
register_function("max", 1, -1, NULL, TYPE_NUMERIC);
|
|
register_function("abs", 1, 1, NULL, TYPE_NUMERIC);
|
|
register_function("random", 0, 1, NULL, TYPE_INT);
|
|
register_function("time", 0, 0, NULL);
|
|
register_function("ctime", 0, 1, NULL, TYPE_INT);
|
|
register_function("floatstr", 2, 3, NULL,
|
|
TYPE_FLOAT, TYPE_INT, TYPE_ANY);
|
|
|
|
register_function("sqrt", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("sin", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("cos", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("tan", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("asin", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("acos", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("atan", 1, 2, NULL, TYPE_FLOAT, TYPE_FLOAT);
|
|
register_function("sinh", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("cosh", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("tanh", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("exp", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("log", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("log10", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("ceil", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("floor", 1, 1, NULL, TYPE_FLOAT);
|
|
register_function("trunc", 1, 1, NULL, TYPE_FLOAT);
|
|
}
|
|
|
|
void
|
|
register_list(void)
|
|
{
|
|
register_function("value_bytes", 1, 1, NULL, TYPE_ANY);
|
|
register_function("value_hash", 1, 1, NULL, TYPE_ANY);
|
|
register_function("string_hash", 1, 1, NULL, TYPE_STR);
|
|
register_function("binary_hash", 1, 1, NULL, TYPE_STR);
|
|
register_function("decode_binary", 1, 2, NULL,
|
|
TYPE_STR, TYPE_ANY);
|
|
register_function("encode_binary", 0, -1, NULL);
|
|
/* list */
|
|
register_function("length", 1, 1, NULL, TYPE_ANY);
|
|
register_function("setadd", 2, 2, NULL, TYPE_LIST, TYPE_ANY);
|
|
register_function("setremove", 2, 2, NULL, TYPE_LIST, TYPE_ANY);
|
|
register_function("listappend", 2, 3, NULL,
|
|
TYPE_LIST, TYPE_ANY, TYPE_INT);
|
|
register_function("listinsert", 2, 3, NULL,
|
|
TYPE_LIST, TYPE_ANY, TYPE_INT);
|
|
register_function("listdelete", 2, 2, NULL, TYPE_LIST, TYPE_INT);
|
|
register_function("listset", 3, 3, NULL,
|
|
TYPE_LIST, TYPE_ANY, TYPE_INT);
|
|
register_function("equal", 2, 2, NULL, TYPE_ANY, TYPE_ANY);
|
|
register_function("is_member", 2, 2, NULL, TYPE_ANY, TYPE_LIST);
|
|
|
|
/* string */
|
|
register_function("tostr", 0, -1, NULL);
|
|
register_function("toliteral", 1, 1, NULL, TYPE_ANY);
|
|
|
|
register_function("match", 2, 3, NULL, TYPE_STR, TYPE_STR, TYPE_ANY);
|
|
register_function("rmatch", 2, 3, NULL, TYPE_STR, TYPE_STR, TYPE_ANY);
|
|
register_function("substitute", 2, 2, NULL, TYPE_STR, TYPE_LIST);
|
|
register_function("crypt", 1, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("index", 2, 3, NULL, TYPE_STR, TYPE_STR, TYPE_ANY);
|
|
register_function("rindex", 2, 3, NULL, TYPE_STR, TYPE_STR, TYPE_ANY);
|
|
register_function("strcmp", 2, 2, NULL, TYPE_STR, TYPE_STR);
|
|
register_function("strsub", 3, 4, NULL,
|
|
TYPE_STR, TYPE_STR, TYPE_STR, TYPE_ANY);
|
|
}
|
|
|
|
char rcsid_functions[] = "$Id: functions.c,v 1.3 2005/01/21 12:07:31 jesse Exp $";
|
|
|
|
/*
|
|
* $Log: functions.c,v $
|
|
* Revision 1.3 2005/01/21 12:07:31 jesse
|
|
* Added FUP
|
|
*
|
|
* Revision 1.2 2004/02/26 14:16:02 jesse
|
|
* added martian functions
|
|
*
|
|
* Revision 1.1.1.1 2004/02/26 13:13:55 jesse
|
|
* Initial import into CVS
|
|
*
|
|
* Revision 1.5 1998/12/14 13:17:53 nop
|
|
* Merge UNSAFE_OPTS (ref fixups); fix Log tag placement to fit CVS whims
|
|
*
|
|
* Revision 1.4 1997/07/07 03:24:54 nop
|
|
* Merge UNSAFE_OPTS (r5) after extensive testing.
|
|
*
|
|
* Revision 1.3.2.2 1997/05/12 04:03:21 bjj
|
|
* This time for sure!
|
|
*
|
|
* Revision 1.3.2.1 1997/05/11 04:31:54 bjj
|
|
* Missed the place in bf_function_info where TYPE_* constants make it into
|
|
* the database. Masked off the complex flag in the obvious place.
|
|
*
|
|
* Revision 1.3 1997/03/03 05:03:50 nop
|
|
* steak2: move protectedness into builtin struct, load_server_options()
|
|
* now required for $server_options updates.
|
|
*
|
|
* Revision 1.2 1997/03/03 04:18:42 nop
|
|
* GNU Indent normalization
|
|
*
|
|
* Revision 1.1.1.1 1997/03/03 03:45:00 nop
|
|
* LambdaMOO 1.8.0p5
|
|
*
|
|
* Revision 2.6 1996/04/19 01:20:49 pavel
|
|
* Fixed bug in how $bf_FOO() verbs are called to override built-in functions.
|
|
* Added code to screen out the worst of the problems this bug could
|
|
* potentially cause. Added a way for built-in functions to tail-call a MOO
|
|
* verb (i.e., to do so without having to handle the verb's returned value).
|
|
* Release 1.8.0p4.
|
|
*
|
|
* Revision 2.5 1996/04/08 01:03:59 pavel
|
|
* Moved `protected' verb test to before arg-count and -type checks.
|
|
* Release 1.8.0p3.
|
|
*
|
|
* Revision 2.4 1996/03/19 07:13:04 pavel
|
|
* Fixed $bf_FOO() calling to work even for wizards. Release 1.8.0p2.
|
|
*
|
|
* Revision 2.3 1996/03/10 01:19:49 pavel
|
|
* Added support for calling $bf_FOO() when FOO() is wiz-only. Made
|
|
* verbs on #0 exempt from the wiz-only check. Release 1.8.0.
|
|
*
|
|
* Revision 2.2 1996/02/08 07:03:21 pavel
|
|
* Renamed err/logf() to errlog/oklog() and TYPE_NUM to TYPE_INT. Added
|
|
* support for TYPE_NUMERIC wildcard. Updated copyright notice for 1996.
|
|
* Release 1.8.0beta1.
|
|
*
|
|
* Revision 2.1 1996/01/16 07:27:37 pavel
|
|
* Added `function_info()' built-in function. Release 1.8.0alpha6.
|
|
*
|
|
* Revision 2.0 1995/11/30 04:23:49 pavel
|
|
* New baseline version, corresponding to release 1.8.0alpha1.
|
|
*
|
|
* Revision 1.14 1992/10/23 23:03:47 pavel
|
|
* Added copyright notice.
|
|
*
|
|
* Revision 1.13 1992/10/23 19:25:30 pavel
|
|
* Eliminated all uses of the useless macro NULL.
|
|
*
|
|
* Revision 1.12 1992/10/21 03:02:35 pavel
|
|
* Converted to use new automatic configuration system.
|
|
*
|
|
* Revision 1.11 1992/10/17 20:31:03 pavel
|
|
* Changed return-type of read_bi_func_data() from char to int, for systems
|
|
* that use unsigned chars.
|
|
* Global rename of strdup->str_dup, strref->str_ref, vardup->var_dup, and
|
|
* varref->var_ref.
|
|
* Fixed bug in register_common() that sometimes read the wrong number of
|
|
* argument-types from the argument list.
|
|
*
|
|
* Revision 1.10 1992/09/08 22:02:46 pjames
|
|
* Updated register_* list to call functions by their new names.
|
|
*
|
|
* Revision 1.9 1992/08/28 16:01:31 pjames
|
|
* Changed myfree(*, M_STRING) to free_str(*).
|
|
*
|
|
* Revision 1.8 1992/08/14 01:20:25 pavel
|
|
* Made it entirely clear how to add new MOO built-in functions to the server.
|
|
*
|
|
* Revision 1.7 1992/08/14 00:40:31 pavel
|
|
* Added missing #include "my-stdarg.h"...
|
|
*
|
|
* Revision 1.6 1992/08/14 00:01:03 pavel
|
|
* Converted to a typedef of `var_type' = `enum var_type'.
|
|
*
|
|
* Revision 1.5 1992/08/13 21:27:11 pjames
|
|
* Added register_bi_functions() which calls all procedures which
|
|
* register built in functions. To add another such procedure, just add
|
|
* it to the static list and to functions.h
|
|
*
|
|
* Revision 1.4 1992/08/12 01:48:42 pjames
|
|
* Builtin functions may now have as many arguments as desired.
|
|
*
|
|
* Revision 1.3 1992/08/10 17:39:46 pjames
|
|
* Changed registration method to use var_args. Changed 'next' field to
|
|
* be func_pc.
|
|
*
|
|
* Revision 1.2 1992/07/21 00:02:29 pavel
|
|
* Added rcsid_<filename-root> declaration to hold the RCS ident. string.
|
|
*
|
|
* Revision 1.1 1992/07/20 23:23:12 pavel
|
|
* Initial RCS-controlled version.
|
|
*/
|