forked from cotillion/cd-gamedriver
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CHANGELOG
697 lines (519 loc) · 26.9 KB
/
CHANGELOG
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
Changelog:
===============================================================================
README CD.06.06
- A number of memory leaks have been fixed
- A number of efun related crashes have been fixed
- New efun query_remote_port() (thanks Bithir)
- ctime() now has a default argument (thanks Lucius)
- parse_command %d will now properly handle 0-<x>
===============================================================================
README CD.06.05
- MSSP Protcol support
http://tintin.sourceforge.net/mssp/
- GMCP Protocol Support
- Fixed 64 bit random numbers
- A number of GD crarshers fixed
===============================================================================
README CD.06.04
- IPv6 support has been added to all services except udp.
The UDP service is not secure and should be disabled in active muds.
This also requires a new version of the hname binary to be installed.
- Bibopmalloc has been disabled as it appears Linux system malloc is alot faster
and not much different in memory consumption.
- Refcounters changed to unsigned int as short could be overflowed fairly easily
crashing the GD.
- Fixed an issue where self referencing arrays would crash the GD.
===============================================================================
README CD.06.03
- Octal Syntax has been changed from 01111 to 0o1111.
The old syntax will be obsolete in a future release.
- Using TCP_NODELAY for telnet connections.
- Sprintf Efun can now print 65535 bytes.
- Allow negative indexes to arrays to reference from the end. arr[-1] == arr[sizeof(arr) - 1]
===============================================================================
README CD.06.02
- Compiles and runs on on GCC 4.4
- Fixed numerous buffer overflows
- 'Could not load descr' is now 'File not found'
- Add MD5 support for crypt()
===============================================================================
README CD.06.01
- Strip .c from inherit names
- Fixed a crash when a connection is closed right away.
- Adds query_living_name
===============================================================================
README CD.06.00
?
===============================================================================
README CD.05.00
Increaed precision of float to double.
Increased int from 32 bits to 64 bits.
Added foreach statement to simplify looping over arrays and mappings.
Allow declaration on variables anywhere you can have a statement.
Added modulo for floats.
Allow delaration of vatiables in the first expression of a for statement.
Fixed an error in the accounting of mstrings.
===============================================================================
README CD.04.07
Communications subsystem mostly rewritten; from Cygnus
Stop using periodic signals to update current time and trigger alarms
Add calloc() entry point to allocators that did not previously have this,
also add cfree() for compatibility with some older, broken systems. Noticed
by Plarry.
Document all efuns in the driver source tree to make sure they are kept up to
date
Only try to swap if we haven't already done so within the last second
Add path-matching efun::match_path; from Cygnus
Add efun::nrnd() for natural distribution random numbers; from Cygnus
Added lots of casts to silence overly picky and noisy compilers
Removed assertions, pre- and post-conditions from the grammar, no-one uses
them and they impose extra overhead; from Cygnus
Added check for trying to write a NULL string with efun::write_bytes; pointed
out by Plarry@Muddy_Waters
Fixed a problem with %O output format and large integers in efun::sprintf,
pointed out by Mercade
Fix efun::parse_command so that 0 will no longer match all objects, pointed
out by Skywise
Make efun::break_string be consistant on first vs. rest of lines, from Mercade
Allow efun::unique_array to take a closure argument; from Shiva
===============================================================================
README CD.04.06
Fixed small things that were pointed out by GCC 2.8.x
Fixed one more memory leak, pointed out by Cygnus
Changed how sockets are made non-blocking to not repeat common code many times.
Make "array - ({ 0 })" and "-= ({ 0 })" expressions actually remove all
destructed objects in arrays too; from Cygnus
Added statistics for cleanup performance; from Cygnus
Made ?: expressions with an empty second part legal, if empty it will take on
the value from the first part; from Azid@Kingdoms.
If we are doing cleanups, try to do a single object every time the swapper is
called; from Cygnus
Add a call to master to verify that an object has the right to get IP address
or name for another object
===============================================================================
README CD.04.05
Made functionp() return 0 when passed a pointer to a function in a destructed
object.
Added function_object() to extract the object from a function pointer.
After a catch of evaluation cost overflow the evaluation cost is reset to
slightly below maximum if this was in the outermost catch(). The reserve
is defined by EXTRA_COST in config.h.
Allow using parentisized constant strings in inherit; from Plarry@Muddy_Waters.
Put back code to call clean_up() in objects before swapping them out, to give
them a chance to remove themselves.
Added an auto-inherited object "/secure/auto". This object is automatically
inherited into _all_ objects, including "/secure/master". Most of the code
by Azid@Kingdoms
Added efun::min() and efun::max(); from Azid
Added efun::function_name() to get a string representation of a function
pointer.
Made the not-operator "!" understand about destructed objects and function
pointers pointing at functions in destructed objects.
Removed efun::cindent() and util/indent; it was both sorely out of date and
did not make much sense to keep.
Removed efun::query_inherit_list(); it is available as efun::debug("inherit_list")
Removed the reserved word and attribute "protected"; it was not used.
Told the indenter in ed about some preprocessor directives; from Skywise
Moved function composition into the driver; from Cygnus@Synergy.
operator(!) and operator(~) now works; from Skywise
Get better textual function pointer representations; from Skywise
Allow master to insert lines at the start of new files; from Skywise
Optimized jumps in loops and switch statements; from Skywise
Optimized jumps to jumps; from Cygnus
Use snprintf() many places to prevent overflowing buffers; add a small version
of snprintf() for systems that might not have it. Add regression test for the
problem this fixes.
Only enable efun::break_point() when the driver is compiled with DEBUG
Added floating point formats to efun::speintf(); from Pippin@Synergy
Corrected a seldom-occuring condition where we would loop forever.
Don't print last line twice in "ed" when doing substitution if both the
general print flag is set and the "p" flag is given on the substitute
command.
Define DEBUG_DRIVER preprocessor symbol if driver has been compiled with
DEBUG enabled.
Make efun::min() and efun::max() take a variable number of arguments, at least
two, and return the minimum/maximum of all values passed. From Cygnus@Synergy.
Make the | operator do array unions; from Cygnus@Synergy.
Check for stack overflow in macro version of push_svalue().
Don't die if a function is redeclared with different number of arguments when
running in DEBUG mode.
Don't special-case shadowing of catch_tell() in the driver; that should be done
in the mudlib if at all.
efun::call_self and efun::call_selfv no longer cause the stack to be mangled,
restore them and add a regression test to verify that they work properly
Add implementation of strerror() for systems that do not provide it
===============================================================================
README CD.04.04
Fixed a problem where the driver would crash when getting the command list for
a living object if any of the verbs had an efun connected to them (and thus no
object defined)
Optimized SUPER_SNOOP code; from Azid.
Allow "void" as an argument, indicating no arguments are allowed like ANSI.
From Azid.
Made sprintf() generate runtime errors when buffer overflows.
Add limits to number of concurrent alarms per object; default to 128.
Generate runtime error and remove all alarms from an object if it exceeds the
per-object limit of alarms.
Add access checking on calls to query_ip_ident().
Don't crash on redifinition of local variables where the second definition also
has an assignment of a mismatched type.
Allow compilation without SERVICE_PORT defined.
Correct new super-snoop code.
Allow compilation without ALLOWED_SERVICE defined.
Change many abort() calls to fatal().
Correct reference count handling for progs (code in objects).
Allow tracebacks through the VBFC object to complete.
Replaced indent code in "ed"; it would sometimes mangle the indented code.
Allow negative indices to splice_array; makes it possible to use code that
says "array[2 .. -1]" to get everything from the 3rd element to the last
element.
===============================================================================
README CD.04.03
This release has two new features, one of which is commands with no trailing
whitespace. The can be used to implement eg. commands like : and ' with
simple add_action() calls. To use this feature, give add_action() a third
argument of 2. Note that with this change the handling of add_action() with
a third argument of 1 has been changed to require a space between the verb
and its arguments. The latter is disabled by default for compatibility
reasons. This can be changed by editing config.h.
The other new feature is a query_trigverb() efun which for abbreviated verbs
like those added with a third argument of 1 to add_action() will return the
whole verb, while query_verb() still returns only the portion that the player
actually entered.
Some bugs in handling of destructed objects.
Getting the intersection of arrays ("array & array") and subtracting ("array -
array") now works, as does subtracting 0-elements from arrays of objects to
remove destructed objects ("obarray -= ({ 0 })").
If various access check routines does not exist in the master object, they are
now assumed to have been present and returned 1, allowing the operation.
A problem where a '#pragma resident' statement in one object would cause all
objects compiled after that object to appear to have set it has been fixed.
'#pragma resident' should also work better now. Parts of this from Alcides.
The break_string() efun will now wrap the first line correctly; it used to have
problems with that if a space between words was on the exact column the wrap
was to be done on. It will also work correctly with indentation now.
The built-in wrapping of text sent to uses has been changed to also do word-
wrapping on hyphens.
The rename() efun has had its return values inverted so that it is consistent
with return values for success and failure used by other efuns.
If passed an array of object where an element were 0, parse_command() would
try dereferencing an illegal pointer.
The sprintf() efun could write into freed (and potentially reused) memory in
certain instances.
Alarms would be attached to the object holding the function to be called, and
not the object creating the alarm.
The driver will now give warnings if it encounters unknown #pragma statements.
A destructor is now called with errors catched and ignored, allowing an object
with a buggy destructor to actually be destructed.
Line number information on runtime errors should be correct now. From Alcides.
Proper block-scoping of variables has been implemented. Patches by Alcides.
Protect against FP exceptions, flagging an error if one is caught.
Protect against overflow when converting from float to integer in ftoi().
Enforce limit on line length in ed to prevent internal buffers from being
overrun when a file is later listed.
Optional second argument to notify_fail(); if set to 0 a message will not
be set if one has already been set.
Put in a limit on depth of inherit chain.
Avoid copying a struct twice every time an LPC function returns; don't
do any copying at all if there are no local variables in the LPC function.
Make object-level profiling optional dependant on PROFILE_OBJS.
Error handling redone to reduce copying of structures when error recovery
contexts are needed; code is more intuitive and more effective.
No longer require user to ensure that F_OFFSET is set up correctly for the
yacc generator being used
Better support for profiling the driver.
cfun implementation of sort_array() added.
restart_mud now processes any gprof output if the driver exited normally.
We could sometimes call recvfrom() with invalid parameters.
efun::restore_mapping failed on strings.
efun::parse_command no longer fetch values from /secure/master on every call,
only when /secure/master has been (re)loaded.
efun::call_out removed.
Many other minor performance improvements.
Fixed some memory leaks.
Fixed support for compiling with RANDOM
Made it possible to link with the dmalloc debug allocator; do a much better job
at freeing allocated memory if DEALLOCATE_MEMORY_AT_SHUTDOWN is defined.
Inlined a few more functions for performance.
Major cleanup of interpreter stack usage.
Make a start on a regression test suite. Run by doing "make check".
Fixed some swap leaks and cleaned up swap code. Changed swap code to use stdio;
also keep an in-memory bitmap of free blocks in swap. By Cygnus@Synergy.
Add error checking on writes of precompiled binaries in save_binary().
Add FreeBSD as a supported platform for compilation.
New string handling; by Cygnus@Synergy.
Added '#pragma no_shadow' support. If any object on the inherit chain has
'#pragma no_shadow', shadowing the object will be denied.
Push a return value on efun::break_point() so that the game won't crash if it
is called.
Add an option to decide wether or not using host names when sending UDP data-
grams is allowed; disabled by default
Redo handling of normal exit from a catch() statement so that throw(0)
cannot be used to kill the driver
===============================================================================
README CD.04.00beta1
This release contains several new things, of which some are not yet documented.
The most important change is the addition of function references as data type.
How they work is explained in various files in doc/function_references.
An other addition is a new set of regexps. I don't have any docs yet, so you'll
have to read the code to see how they work.
An other important change is that the gamedriver has been further
ANSI-fied. There should be very few warnings left when the driver is
compiled with -Wall. Also, the varargs functions have been changed to be
ANSI-C compliant.
A manifest has been written, explaining the aims of development work in the
near future. Please read it.
===============================================================================
README CD.03.31beta1
The call_out system has changed again.
get_all_call_outs() nad delete_call_out() are gone.
call_out() still remains for compatibility purposes, but negative
arguments are not legal.
The new efuns set_alarm(), get_alarm(), remove_alarm() and get_all_alarms()
implement the new call_out system.
The driver calls the function runtime_error() in the master object when
a runtime error is encountered. It is then up to the master object to
send the information to the player/to the responsible wizard etc.
The faulty memmove->bcopy macro from the previous release has been changed.
===============================================================================
README CD.03.27beta2
The makefiles have been improved, with better macro handling.
You need to install a new Makefile, or patch the old one.
make_func.c no longer uses the 'make' program.
A small error in line number information processing in make_func.c has been
fixed.
===============================================================================
README CD.03.27beta1
The Makefile has been split to make life easier.
The file dependencies are in the file Makefile.distrib. The stuff that you
may want to change, should be in a file called Makefile, that you have to
create. The first time you create the Makefile, you should do this by moving
the file Makefile.default to Makefile and then editing paths, compilation
flags etc as required. After that, you should be able to take your old
Makefile whenever you get a new version of the driver. If you need to make
modifications, the README file will say so.
Resets and heartbeat are no longer implemented by the driver. You should use
the call_out mechanism instead. If you want to you can simulate resets and
heartbeats in lpc.
Explode works differently.
If the start of the string matches the matching pattern, the first element
in the resulting array will be an empty string. This was not previously the
case.
An example
==========
Old type explode:
arr = explode("aabcaade", "aa")
arr gets the value ({ "bc", "de" })
New type explode:
arr = explode("aabcaade", "aa")
arr gets the value ({ "", "bc", "de" })
You can no longer have prototypes for functions that don't exist.
The driver checks the number and types of function parameters in a
better way.
There are some new and nifty things that can be done with call_outs.
Call_out overhead is smaller, and they are now stored in a per-object way.
remove_call_out() is no longer an efun. You should simulate it in the mudlib.
find_call_out() is no longer an efun. You should simulate it in the mudlib.
call_out() now returns a number which is the id of the callout.
void delete_call_out(int id) is used to remove a call_out.
mixed *get_all_call_outs() returns an array of call_out info. One element
per callout in the object.
mixed *calls = get_all_call_outs();
int i;
for (i = 0; i < sizeof(calls); ++i) {
int id_of_callout = calls[i][0];
string function = calls[i][1]; // name of the callout function
float time_left = calls[i][2]; // how soon until it gets called?
float delay = calls[i][3]; // the original delay asked for
// (might be negative)
mixed arg = calls[i][4]; // Argument 3 to call_out().
}
You can set the swapping parameters from within the game.
You have to use debug("set_swap") to enable swapping.
E.g.
debug("set_swap", ({ 0, // Don't swap anything unless this much
// memory is used. (bytes)
16777216, // Swap as much as possible if this much
// memory is used. (bytes)
60, // Don't swap out an object/program
// unless it is atleast this old. (seconds)
900, // Allways swap out an object/program if
// it is older than this. (seconds)
}));
also
debug("query_swap"); /* or */ debug("query_swap", 0);
// Returns the current swapping parameters.
debug("query_swap", 1);
// Returns swapin/swapout statistics as an (int ret[4][3])
// ({ // Objects in.
// ({ /* last second */, /* last minute */, /* last hour */ }),
// Programs in.
// ({ /* last second */, /* last minute */, /* last hour */ }),
// Objects out.
// ({ /* last second */, /* last minute */, /* last hour */ }),
// Programs out.
// ({ /* last second */, /* last minute */, /* last hour */ }),
// })
debug("query_swap", 2);
// Returns age of oldest object/program not swapped out.
debug("query_swap", 3);
// Returns amount of used memory.
Assertions (ordinary assertions pre/postconditions and invariants) are
expressions that should evaluate to true, if they don't they will
cause a runtime error when executed.
Ordinary assertion:
@ : expr; // Is executed when control reaches it.
// This is valid wherever a statement is.
Precondition:
>> : expr; // Is executed after all arguments have got their
// values and before control reaches the function block.
Postcondition:
<< : expr; // Is executed after a return statement but before
// control reaches the calling function.
// These are valid between the function head and the
// function block. E.g.
void reset()
// Pre/post-conditions here.
{
....
}
Invariant:
<> : expr; // Is executed after a return statement but before
// control reaches the calling function.
// This is valid where global declarations are.
Which assertions are to be executed are controlled with a 16 bit bitmask
where assertions are bit 0 (0x1) preconditions are bit 8 (0x100)
postconditions are bit 9 (0x200) and invatiants bit 10 (0x400).
debug("set_debug_prog", prog, bitmask);
// Sets which assertions to execute in the program prog.
debug("query_debug_prog", prog);
// Returns which assertions are being executed in program prog.
debug("set_debug_obj", ob, bitmask);
// Controles which assertions to execute in the object ob.
debug("query_debug_obj", ob);
// Returns which assertions are being executed in object ob.
An alternate form of ordinary assertions exists.
@ constant_bitmask : expr;
// The bitmask controles for what assertions it should be executed.
// E.g.
@ 0 : expr; // Will never be executed since no bits are selected.
@ 1 : expr; // Same as @ : expr;
@ 0x100 : expr; // Will only be executed when preconditions are turned on.
@ 0x701 : expr; // Will be executed when any of pre/post-conditions,
// invariants or ordinary assertions are turned on.
@ 0xffff : expr; // Will be executed when any assertions are turned on.
Constructors/destructors functions that are called when an object is
created/destructed.
A constructor is called before create() is called and after all constructors
in inherited classes have been called.
A destructor is called before the object is destructed and before any
destructors in inherited classes have been called.
The constructors and destructors are functions declared in a special way.
they should have no return type and no arguments and must have a special name.
constructor:
>>()
{
/* construct object here */
}
destructor:
<<()
{
/* destruct the object here */
}
The efuns string val2str(mixed) and mixed str2val(string).
val2str() converts the argument to its string represetation (the same
as used with save/restore_object()).
str2val() converts a value in string representation back to a value.
The efuns mapping m_save_object() and void m_restore_object(mapping)
m_save_object() saves its variables like save_object but returnes it
in a mapping instead of writing it to a file.
m_restore_object() restores an object but does it from its argument
instead of from reading from a file.
The efuns void save_map(mapping, string) and mapping restrore_map(string).
Write and read files like save/restore_object but take/return values
in a mapping instead of the variables in this_object().
This means that save/restore_object can be simulated with
save_map(m_save_object(), "file_name");
and
m_restore_object(restore_map("file_name"));
Efuns call_self() and call_selfv(). Like call_other() and call_otherv()
but makes a local call instead of a call_other.
===============================================================================
README from CD.02.05
This is the official release of the CD.02.05 driver. It is the final CD.02
version. We will make extensive changes to the LPC language, to the reset,
heart_beat and call_out systems in the next version, so we will be upping
the version numbers to CD.03.XX. (Don't worry, the changes will require
very minor muldib changes.)
A version of the CD mudlib that should work with this driver version is
released together with this driver version.
Changes since the previous release:
There are now working cfuns for a number of heavily used functions. They work
with the CDLIB mudlib. The original lfuns are left intact in the mudlib
release, so if you have problems with the cfuns, you can revert to the lfuns
at any time.
The rusage calls have been fixed, so now you can use top_ten_cpu and
getprofile options to the debug() efun. (If you have enabled the options in
the config file)
There is now documentation for all the efuns (I hope). The documentation is
distributed with the mudlib. In the future I plan to distribute the efundocs
separately.
The error logs look neater.
Hname now supports the user identification protocol.
A bunch of minor bugs have been fixed. Among them some obscure bugs in
parse_command. There are a few known bugs remaining. The most important
ones are that very long lines sent to write_socket hang the driver and that
virtual inheritance doesn't work properly under some circumstances.
Current compatibility status:
Sparc SunOS 4 gcc OK
Sparc SunOS 5 (SOLARIS) gcc OK
Alpha OSF/1 cc OK
?? Sequent ?? Probably OK
386 Linux gcc OK
386 NetBSD gcc Crashes
MIPS Ultrix 4.2 gcc OK
In addition to this the driver will probably work well on a lot of
Unixes, but we haven't made any recent tests.
===============================================================================
README from the first beta release of the CD.02.03 driver.
Changes since the previous release:
Some bug fixes.
Speedup of mappings.
interpret.c has been rewritten to get rid of the huge switch(). It started
to cause compiler problems.
Compat changes for Solaris 2.x and Sequent.
A bunch of cfuns for use with the CDLIB have been added. They are untested.
New malloc called bibopmalloc. This malloc uses less memory than smalloc, but
is slightly slower. It needs some more tuning before it's prefect on
32 bit machines, it works very well on 64 bit machines.
Process_string and process_value will now accept an extra argument. If this
argument is non-zero, the call will set previous_object to the object
returned by a call to the function get_vbfc_object in the master object.
This is a way to provide vbfc security without the overhead of changing
uids and euids. It also avoids the problems with errors during vbfc calls.
===============================================================================
README from the third beta release of the CD.02.02 driver.
The differences from the previous beta versions are that I fixed the little
makefile problem, and that cfuns now should work properly. The ones that I have
tested with cdlib are write, check_call and query_prop. The others were
used with the kingdoms mudlib, and are probably not working they way
you want them to.
There is a new release of byacc out. (Berkely Yacc) It is faster than both
yacc and bison. (Compiles faster and creates faster code.) You can get
a bit better speed by installing it and changing the makefile to use it instead
of bison.
If you want to try your hands at coding cfuns the following functions are
strong candidates:
In /secure/simul_efun:
cat
sort_array
tell_room
say (expand the tell_rooms inside the say)
In /std/object:
add_prop
change_prop
add_list
del_list
query_list
item_id
cmditem_action