Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/secure/simul_efun/spare/comm.c b/secure/simul_efun/spare/comm.c
new file mode 100644
index 0000000..595b852
--- /dev/null
+++ b/secure/simul_efun/spare/comm.c
@@ -0,0 +1,124 @@
+#include <living/comm.h>
+
+// Sendet an alle Objekte in room und room selber durch Aufruf von
+// ReceiveMsg().
+varargs void send_room(object|string room, string msg, int msg_type,
+ string msg_action, string msg_prefix, object *exclude,
+ object origin)
+{
+ if (stringp(room))
+ room=load_object(room);
+
+ origin ||= previous_object();
+ object *dest = exclude ? all_inventory(room) - exclude :
+ all_inventory(room);
+
+ dest->ReceiveMsg(msg, msg_type, msg_action, msg_prefix, origin);
+}
+
+static int _shout_filter( object ob, string pat )
+{
+ string *ignore;
+
+ if ( !environment(ob) )
+ return 0;
+
+ return sizeof( regexp( ({ object_name( environment(ob) ) }), pat ) );
+}
+
+varargs void shout( string s, mixed where ){
+ object *u;
+ string *pfade;
+
+ if ( !sizeof( u = users() - ({ this_player() }) ) )
+ return;
+
+ if ( !where )
+ pfade = ({ "/" });
+ else if ( intp(where) )
+ pfade =
+ ({ implode( efun::explode( object_name( environment(this_player()) ),
+ "/" )[0..2], "/" ) + "/" });
+ else if ( stringp(where) )
+ pfade = ({ where });
+ else
+ pfade = where;
+
+ u = filter( u, "_shout_filter", ME, implode( pfade, "|" ) );
+ u->ReceiveMsg(s, MT_COMM|MT_FAR|MSG_DONT_WRAP|MSG_DONT_STORE,
+ MA_SHOUT_SEFUN, 0, previous_object());
+}
+
+
+#if __VERSION__ > "3.3.718"
+// This sefun replaces the deprecated efun cat().
+#define CAT_MAX_LINES 50
+varargs int cat(string file, int start, int num)
+{
+ if (extern_call())
+ set_this_object(previous_object());
+
+ int more;
+
+ if (num < 0 || !this_player())
+ return 0;
+
+ if (!start)
+ start = 1;
+
+ if (!num || num > CAT_MAX_LINES) {
+ num = CAT_MAX_LINES;
+ more = sizeof(read_file(file, start+num, 1));
+ }
+
+ string txt = read_file(file, start, num);
+ if (!txt)
+ return 0;
+
+ efun::tell_object(this_player(), txt);
+
+ if (more)
+ efun::tell_object(this_player(), "*****TRUNCATED****\n");
+
+ return sizeof(txt & "\n");
+}
+#undef CAT_MAX_LINES
+#endif // __VERSION__ > "3.3.718"
+
+#if __VERSION__ > "3.3.719"
+// This sefun replaces the deprecated efun tail().
+#define TAIL_MAX_BYTES 1000
+varargs int tail(string file)
+{
+ if (extern_call())
+ set_this_object(previous_object());
+
+ if (!stringp(file) || !this_player())
+ return 0;
+
+ string txt = read_bytes(file, -(TAIL_MAX_BYTES + 80), (TAIL_MAX_BYTES + 80));
+ // read_bytes() returns 0 if the start of the section given by
+ // parameter #2 lies beyond the beginning of the file.
+ // In this case we simply try and read the entire file.
+ if (!stringp(txt) && file_size(file) < TAIL_MAX_BYTES+80)
+ txt = read_file(file);
+ // Exit if still nothing could be read.
+ if (!stringp(txt))
+ return 0;
+
+ // cut off first (incomplete) line
+ int index = strstr(txt, "\n");
+ if (index > -1) {
+ if (index + 1 < sizeof(txt))
+ txt = txt[index+1..];
+ else
+ txt = "";
+ }
+
+ efun::tell_object(this_player(), txt);
+
+ return 1;
+}
+#undef TAIL_MAX_BYTES
+#endif // __VERSION__ > "3.3.719"
+