Ver Fonte

Timers now also work, but but need some mruby support

Beoran há 9 anos atrás
pai
commit
c1dcff3a95
9 ficheiros alterados com 332 adições e 117 exclusões
  1. 20 0
      data/script/main.rb
  2. 9 6
      include/server.h
  3. 8 3
      include/timer.h
  4. 9 24
      src/client.c
  5. 13 5
      src/main.c
  6. 124 8
      src/server.c
  7. 66 39
      src/timer.c
  8. 42 0
      src/toruby.c
  9. 41 32
      woe.geany

+ 20 - 0
data/script/main.rb

@@ -22,6 +22,18 @@ def signal_syms(value)
 end
 
 
+def start_timers
+  @started_timers ||= false
+  if @started_timers
+    log "Timers already started."
+  else
+    log "Staring timer(s)..."
+    @timer_id = Woe::Server.new_timer()
+    Woe::Server.set_timer(@timer_id, 1.0, 1.0);
+  end
+  @started_timers = true
+end
+
 def woe_on_connect(client_id)
   p "Client #{client_id} connected"
   Client.add(client_id)
@@ -117,3 +129,11 @@ def woe_on_signal(signal)
 end
 
 
+def woe_on_timer(timer, value, interval)
+  log "Timer #{timer} #{value} #{interval} passed."
+end
+
+
+start_timers
+
+

+ 9 - 6
include/server.h

@@ -1,8 +1,8 @@
 #ifndef WOE_SERVER_H
 #define WOE_SERVER_H
 
-#ifndef WOE_SERVER_MAX_TIMERS
-#define WOE_SERVER_MAX_TIMERS 128
+#ifndef WOE_TIMERS_MAX
+#define WOE_TIMERS_MAX 32
 #endif
 
 #include <stdarg.h>
@@ -25,9 +25,6 @@ enum woe_timer_type {
 };
 
 
-int woe_server_start_timer(struct woe_server * srv,
-                           int sec, int ns, enum woe_timer_type type);
-                           
 
 int woe_server_send_to_client(struct woe_server * srv, int client, char * data, size_t size);                           
 
@@ -59,6 +56,12 @@ int woe_server_begin_zmp(struct woe_server * srv, int client, const char * cmd);
 int woe_server_zmp_arg(struct woe_server * srv, int client, const char * arg);
 int woe_server_finish_zmp(struct woe_server * srv, int client, const char * cmd);
 
-
+int woe_server_make_new_timer_id(struct woe_server * srv);
+struct woe_client * woe_server_remove_client(struct woe_server * srv, int index);
+struct woe_timer * woe_server_remove_timer(struct woe_server * srv, int index);
+int woe_server_set_timer_value(struct woe_server * srv, int index, double value, double interval);
+int woe_server_get_timer_value(struct woe_server * srv, int index, double * value, double * interval);
+                           
+ 
 
 #endif

+ 8 - 3
include/timer.h

@@ -28,12 +28,17 @@ struct woe_timer {
   struct woe_server * server;
   int                 index;
   timer_t             timer;
+  int                 set;
+  struct sigaction    sa;
 };
 
 
-struct woe_timer * woe_timer_new(struct woe_server * srv,  int index);
-struct woe_timer * woe_timer_free(struct woe_timer * tim);
-
 
+struct woe_timer * woe_timer_new(struct woe_server * server, int index);
+struct woe_timer * woe_timer_free(struct woe_timer * me);
+int woe_timer_get(struct woe_timer * me, double * value, double * interval);
+int woe_timer_set(struct woe_timer * me, double value, double interval);
+int woe_timer_passed(struct woe_timer * me);
+int woe_timer_callback(struct woe_timer * me);
 
 #endif

+ 9 - 24
src/client.c

@@ -2,30 +2,15 @@
  * This file client.c, handles clients of the WOE server.
  */
 
-#if !defined(_WIN32)
-# if !defined(_POSIX_SOURCE)
-#   define _POSIX_SOURCE
-# endif
-# if !defined(_BSD_SOURCE)
-#   define _BSD_SOURCE
-# endif
-
-# include <sys/socket.h>
-# include <netinet/in.h>
-# include <arpa/inet.h>
-# include <netdb.h>
-# include <poll.h>
-# include <unistd.h>
-#else
-# include <winsock2.h>
-# include <ws2tcpip.h>
-
-# define snprintf _snprintf
-# define poll WSAPoll
-# define close closesocket
-# define strdup _strdup
-# define ECONNRESET WSAECONNRESET
-#endif
+#define _POSIX_C_SOURCE 200801L
+#define _POSIX_SOURCE 200801L
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <poll.h>
+#include <unistd.h>
 
 #include <errno.h>
 #include <stdio.h>

+ 13 - 5
src/main.c

@@ -14,6 +14,7 @@
 #include "state.h"
 #include "rh.h"
 #include "toruby.h"
+#include "timer.h"
 
 
 
@@ -93,13 +94,20 @@ int main(int argc, char * argv[]) {
     rh_run_toplevel(state.mrb, "woe_on_start", "");
     while (woe_server_busy(state.server)) {
       int caught = 0;
-      
+      siginfo_t info;
+      struct woe_timer * timer;
+      info.si_value.sival_ptr = NULL;
       woe_server_update(state.server, 1);
-      caught = sigtimedwait(&signal_set, NULL, &signal_time);
+      caught = sigtimedwait(&signal_set, &info, &signal_time);
       if (caught > 0) {
-        LOG_NOTE("Received signal %d\n", caught);
-        rh_run_toplevel(state.mrb, "woe_on_signal", "i", caught);
-        /* woe_server_request_shutdown(state.server); */
+        timer = info.si_value.sival_ptr; 
+        if (timer) { 
+          LOG_DEBUG("Received timer signal %d, %d\n", caught, timer->index);
+          woe_timer_callback(timer);
+        } else {
+          LOG_NOTE("Received signal %d\n", caught);
+          rh_run_toplevel(state.mrb, "woe_on_signal", "i", caught);
+        }
       }
     }
   }

+ 124 - 8
src/server.c

@@ -20,6 +20,7 @@
 #include <ctype.h>
 
 #include "client.h"
+#include "timer.h"
 #include "server.h"
 #include "monolog.h"
 
@@ -40,6 +41,7 @@ static const telnet_telopt_t woe_telnet_opts[] = {
 #define WOE_SERVER_BUFFER_SIZE      10000
 #define WOE_SERVER_LISTEN_BACKLOG   8
 
+
 struct woe_server {
   char                buffer[WOE_SERVER_BUFFER_SIZE];
   short               listen_port;
@@ -51,6 +53,8 @@ struct woe_server {
   
   struct pollfd       pfd[WOE_CLIENTS_MAX + 1];
   struct woe_client * clients[WOE_CLIENTS_MAX];  
+  struct woe_timer  * timers[WOE_TIMERS_MAX]; 
+  
   void (*event_handler)      (telnet_t *telnet, telnet_event_t *ev, void *user_data);
   void (*disconnect_handler) (struct woe_server * srv, struct woe_client * cli, void *user_data);
 };
@@ -184,7 +188,18 @@ int woe_server_busy(struct woe_server * srv) {
 
 
 struct woe_server * woe_server_free(struct woe_server * srv) {
+  int index;
+  
   close(srv->listen_sock);
+ 
+  for (index = 0; index < WOE_CLIENTS_MAX; ++index) {
+     woe_server_remove_client(srv, index);
+  }
+
+  for (index = 0; index < WOE_TIMERS_MAX; ++index) {
+     woe_server_remove_timer(srv, index);
+  }
+
   free(srv);
   return NULL;
 }
@@ -205,6 +220,10 @@ struct woe_server * woe_server_init(struct woe_server * srv, int port) {
   for (index = 0; index < WOE_CLIENTS_MAX; ++index) {
      srv->clients[index] = NULL;
   }
+
+  for (index = 0; index < WOE_TIMERS_MAX; ++index) {
+     srv->timers[index] = NULL;
+  }
   
    srv->event_handler = woe_event_handler;
   return srv;
@@ -311,6 +330,75 @@ struct woe_client * woe_server_remove_client(struct woe_server * srv, int index)
 }
 
 
+/** Returns one of the timers of the server or NULL if not in use or out of 
+ * range */
+struct woe_timer * woe_server_get_timer(struct woe_server * srv, int index) {
+  if (!srv)                           return NULL;
+  if (index < 0)                      return NULL;
+  if (index >= WOE_CLIENTS_MAX)       return NULL;
+  return srv->timers[index];
+}
+
+/** Stores a timer of the server at the given index*/
+struct woe_timer * woe_server_put_timer(struct woe_server * srv, int index, struct woe_timer * tim) {
+  if (!srv)                           return NULL;
+  if (!tim)                           return NULL;
+  if (index < 0)                      return NULL;
+  if (index >= WOE_TIMERS_MAX)        return NULL;
+  if (srv->timers[index]) {
+    woe_timer_free(srv->timers[index]);
+  }  
+  srv->timers[index] = tim;
+  return tim; 
+}
+
+/** Removes a timer of the server at the given index*/
+struct woe_timer * woe_server_remove_timer(struct woe_server * srv, int index) {
+  if (!srv)                           return NULL;
+  if (index < 0)                      return NULL;
+  if (index >= WOE_TIMERS_MAX)        return NULL;
+  if (srv->timers[index])  {
+    woe_timer_free(srv->timers[index]);
+  }  
+  srv->timers[index] = NULL;
+  return NULL; 
+}
+
+
+/** Find an index to put a newtimerr and returns a pointer to it. 
+ *  Returns -1 if no free space is available. 
+ **/
+int woe_server_get_available_timer_index(struct woe_server * srv) {
+   int i;
+   for (i = 0; i < WOE_TIMERS_MAX; ++i) {
+     struct woe_timer * timer = woe_server_get_timer(srv, i);
+     if (!timer) {
+       return i;
+     } 
+   }
+   return -1;
+}
+
+/** Creates a new timer for this server. Return null if no memory or no space 
+ * for a new timer. */
+struct woe_timer * woe_server_make_new_timer(struct woe_server * srv) {
+   struct woe_timer * new;
+   int index = woe_server_get_available_timer_index(srv);
+   if (index < 0) return NULL;
+   new = woe_timer_new(srv, index);
+   return woe_server_put_timer(srv, index, new);
+} 
+
+
+/** Creates a new timr and returns it's id. */
+int woe_server_make_new_timer_id(struct woe_server * srv) {
+   struct woe_timer * new = woe_server_make_new_timer(srv);
+   if (!new) return -1;
+   return new->index;
+}
+
+
+
 /** Find an index to put a new user and returns a pointer to it. 
  *  Returns -1 if no free space is available. 
  **/
@@ -338,6 +426,23 @@ struct woe_client * woe_server_make_new_client(struct woe_server * srv,
 
 
 
+/** Sets a timer's values by id */
+int woe_server_set_timer_value(struct woe_server * srv, int index, double value, double interval) {
+  struct woe_timer * tim;
+  tim = woe_server_get_timer(srv, index);
+  if (!tim) return -1;
+  return woe_timer_set(tim, value, interval);
+}
+
+/** Gets a timer's values by id */
+int woe_server_get_timer_value(struct woe_server * srv, int index, double * value, double * interval) {
+  struct woe_timer * tim;
+  tim = woe_server_get_timer(srv, index);
+  if (!tim) return -1;
+  return woe_timer_get(tim, value, interval);
+}
+
+
 /* Handles a new connection to this server. */
 int woe_server_handle_connect(struct woe_server * srv) {
   struct woe_client * client;
@@ -647,6 +752,24 @@ int woe_server_disconnect_id(struct woe_server * srv, int id) {
 int woe_server_update(struct woe_server * srv, int timeout) {
   int i, res;
 
+  /* Check timers for readiness. */
+  for (i = 0; i < WOE_TIMERS_MAX; ++i) {
+    struct woe_timer * timer = woe_server_get_timer(srv, i);
+    if (woe_timer_passed(timer)) {
+      woe_timer_callback(timer);
+    }
+  }
+
+  
+  /* Disconnect clients that should quit */
+  for (i = 0; i < WOE_CLIENTS_MAX; ++i) {
+    struct woe_client * client = woe_server_get_client(srv, i);
+    if (!client) continue;
+    if (!client->busy) {
+      woe_server_disconnect(srv, client);
+    }  
+  }
+
   /* prepare for poll */
   memset(srv->pfd     , 0     , sizeof(srv->pfd));
   
@@ -710,15 +833,8 @@ int woe_server_update(struct woe_server * srv, int timeout) {
     }
   }
   
-  /* Disconnect clients that should quit */
-  for (i = 0; i < WOE_CLIENTS_MAX; ++i) {
-    struct woe_client * client = woe_server_get_client(srv, i);
-    if (!client) continue;
-    if (!client->busy) {
-      woe_server_disconnect(srv, client);
-    }  
-  }
   
+    
   return 0;
 }
 

+ 66 - 39
src/timer.c

@@ -2,30 +2,11 @@
  * This file client.c, handles clients of the WOE server.
  */
 
-#if !defined(_WIN32)
-# if !defined(_POSIX_SOURCE)
-#   define _POSIX_SOURCE
-# endif
-# if !defined(_BSD_SOURCE)
-#   define _BSD_SOURCE
-# endif
-
-# include <sys/socket.h>
-# include <netinet/in.h>
-# include <arpa/inet.h>
-# include <netdb.h>
-# include <poll.h>
-# include <unistd.h>
-#else
-# include <winsock2.h>
-# include <ws2tcpip.h>
-
-# define snprintf _snprintf
-# define poll WSAPoll
-# define close closesocket
-# define strdup _strdup
-# define ECONNRESET WSAECONNRESET
-#endif
+#define _POSIX_C_SOURCE 200801L
+#define _POSIX_SOURCE 200801L
+
+#include <signal.h>
+#include <time.h>
 
 #include <errno.h>
 #include <stdio.h>
@@ -46,18 +27,25 @@ struct woe_timer * woe_timer_alloc() {
   return calloc(sizeof(struct woe_timer), 1);
 }
 
-struct woe_client * woe_timer_init(struct woe_timer * me,
+struct woe_timer * woe_timer_init(struct woe_timer * me,
   struct woe_server * server, int index) {
   sigevent_t sev;
   if (!me) return NULL;
   me->server  = server;
   me->index   = index;
+  me->set     = 0;
   sev.sigev_notify= SIGEV_NONE;
+  
+  sev.sigev_notify = SIGEV_SIGNAL;
+  sev.sigev_signo  = SIGRTMIN + (index % (SIGRTMAX - SIGRTMIN - 1));
+  sev.sigev_value.sival_ptr = me;
+  
+  
   if (timer_create(CLOCK_MONOTONIC, &sev, &me->timer) < 0) { 
-    LOG_ERROR("Could not create timer %d.", index)
+    LOG_ERROR("Could not create timer %d.", index);
     return NULL;
   }
-  LOG_NOTE("Timer %d initialized: %d.\n", client->index, client->timer);
+  LOG_NOTE("Timer %d initialized: %d.\n", me->index, me->timer);
 
   return me;
 }
@@ -65,7 +53,7 @@ struct woe_client * woe_timer_init(struct woe_timer * me,
 struct woe_timer * woe_timer_new(struct woe_server * server, int index) {
   struct woe_timer * me = woe_timer_alloc();
   if (!me) return NULL;  
-  if (!woe_timer_init(me, index)) { 
+  if (!woe_timer_init(me, server, index)) { 
     free(me);
     return NULL;
   }
@@ -74,21 +62,21 @@ struct woe_timer * woe_timer_new(struct woe_server * server, int index) {
 
 struct woe_timer * woe_timer_done(struct woe_timer * me) {
   if (!me) return NULL;
-  if (me->timer > -1)  timer_delete(me->timer);
-  me->timer     = -1;
-  LOG_NOTE("Timer %d destroyed.\n", client->index);
+  if (me->timer)  timer_delete(me->timer);
+  me->timer     = NULL;
+  LOG_NOTE("Timer %d destroyed.\n", me->index);
   me->index     = -1;
   return me;
 }
 
 struct woe_timer * woe_timer_free(struct woe_timer * me) {
-  woe_client_done(client);
-  free(client);  
+  woe_timer_done(me);
+  free(me);  
   return NULL;
 }
 
 struct timespec * timespec_init(struct timespec * tv, double sec) {
-  if !tv) return NULL;
+  if (!tv) return NULL;
   if (sec <= 0.0) {
     tv->tv_sec  = 0;
     tv->tv_nsec = 0;
@@ -99,14 +87,53 @@ struct timespec * timespec_init(struct timespec * tv, double sec) {
   return tv;
 } 
 
-int woe_timer_set(struct woe_timer * me, double value, double interval) {
+double timespec_to_s(struct timespec * tv) {
+  return tv->tv_sec + ( tv->tv_nsec / 1000000000.0 );
+}
+
+int woe_timer_get(struct woe_timer * me, double * value, double * interval) {
+  int res;
   if (!me) return -1;
-  itimerspec nv, ov;
-  timespec_init(&nv.it_value, value);
-  timespec_init(&nv.it_interval, interval);
-  return timer_settime(me->timer, 0, &nv, &ov);
+  struct itimerspec get;
+  /* timespec_init(&nv.it_value, value); */ 
+  res = timer_gettime(me->timer, &get);
+  if (res == 0) {
+    if (value)    (*value)    = timespec_to_s(&get.it_value);
+    if (interval) (*interval) = timespec_to_s(&get.it_interval);
+  }
+  return res;  
+}
+
+int woe_timer_set(struct woe_timer * me, double value, double interval) {
+   if (!me) return -1;
+   me->set = 1;
+   struct itimerspec nv, ov;
+   timespec_init(&nv.it_value, value);
+   timespec_init(&nv.it_interval, interval);
+   return timer_settime(me->timer, 0, &nv, &ov);
 }
 
+int woe_timer_passed(struct woe_timer * me) {
+  double value, interval;
+  if (!me) return 0;
+  if (!me->set) return 0;
+  if (woe_timer_get(me, &value, &interval) != 0) { 
+    LOG_ERROR("Trouble getting timer %d\n", me->index);
+    return 0;
+  }
+  return value <= 0;
+}
 
+int woe_timer_callback(struct woe_timer * me) {
+  mrb_state * mrb;
+  LOG_DEBUG("Timer passed: %d\n", me->index);
+  mrb = woe_server_get_mrb(me->server);  
+  if (mrb) {  
+    double value = 0.0, interval = 0.0;
+    woe_timer_get(me, &value, &interval); 
+    rh_run_toplevel(mrb, "woe_on_timer", "iff", me->index, value, interval);
+  }
+  return 0;
+}
 
 

+ 42 - 0
src/toruby.c

@@ -17,6 +17,7 @@
 #include <mruby/class.h>
 #include <mruby/data.h>
 #include <mruby/array.h>
+
 /*
 #include "tr_macro.h"
 #include "tr_audio.h"
@@ -174,6 +175,14 @@ static mrb_value NAME(mrb_state * mrb, mrb_value self) {          \
   struct woe_server * srv = MRB_WOE_SERVER(mrb);                  \
   (void) self;                                                    \
   
+
+#define WRAP_SERVER_TIMER_BEGIN(NAME) \
+static mrb_value NAME(mrb_state * mrb, mrb_value self) {          \
+  int res;                                                        \
+  mrb_int timer = -1;                                             \
+  struct woe_server * srv = MRB_WOE_SERVER(mrb);                  \
+  (void) self;                                                    \
+
   
 #define WRAP_SERVER_END() \
   return mrb_fixnum_value(res); \
@@ -281,6 +290,35 @@ WRAP_SERVER_BEGIN(tr_server_finish_zmp) {
   res = woe_server_finish_zmp(srv, client, command);
 } WRAP_SERVER_END()
 
+
+WRAP_SERVER_TIMER_BEGIN(tr_server_new_timer) { 
+  (void) timer; 
+  res = woe_server_make_new_timer_id(srv);
+} WRAP_SERVER_END()
+
+
+WRAP_SERVER_TIMER_BEGIN(tr_server_set_timer) { 
+  mrb_float value = 0.0, interval = 0.0;
+  mrb_get_args(mrb, "iff", &timer, &value, &interval);
+  res = woe_server_set_timer_value(srv, timer, value, interval);
+} WRAP_SERVER_END()
+
+static mrb_value tr_server_get_timer(mrb_state * mrb, mrb_value self) {
+  int res;                                                        
+  mrb_int timer = -1;                                             
+  struct woe_server * srv = MRB_WOE_SERVER(mrb);                  
+  (void) self;
+  double value = 0.0, interval = 0.0;
+  mrb_get_args(mrb, "i", &timer);
+  res = woe_server_get_timer_value(srv, timer, &value, &interval);
+  { 
+    mrb_value vals[3] = { mrb_fixnum_value(res), mrb_float_value(mrb, value), mrb_float_value(mrb, interval) };
+    return mrb_ary_new_from_values(mrb, 3, vals);
+  }
+}
+
+
+
 /* Initializes the functionality that Eruta exposes to Ruby. */
 int tr_init(mrb_state * mrb) {
   // luaL_dostring(lua, "print 'Hello!' ");
@@ -320,6 +358,10 @@ int tr_init(mrb_state * mrb) {
   TR_CLASS_METHOD_ARGC(mrb, srv, "zmp_arg"  , tr_server_finish_zmp, 2);
   TR_CLASS_METHOD_ARGC(mrb, srv, "finish_zmp"  , tr_server_finish_zmp, 2);
 
+  TR_CLASS_METHOD_NOARG(mrb, srv, "new_timer"  , tr_server_new_timer);
+  TR_CLASS_METHOD_ARGC(mrb, srv, "set_timer"  , tr_server_set_timer, 3);
+  TR_CLASS_METHOD_ARGC(mrb, srv, "get_timer"  , tr_server_get_timer, 1);
+  
   /* Telnet constants, commands, etc. */
   
   TR_CONST_INT_VALUE(mrb, tel, TELNET_IAC);

+ 41 - 32
woe.geany

@@ -23,47 +23,56 @@ long_line_behaviour=1
 long_line_column=80
 
 [files]
-current_page=16
-FILE_NAME_0=1078;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fmain.c;0;2
-FILE_NAME_1=1675;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fcallrb.c;0;2
-FILE_NAME_2=2828;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Ftoruby.c;0;2
+current_page=2
+FILE_NAME_0=32;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fmain.c;0;2
+FILE_NAME_1=1652;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fcallrb.c;0;2
+FILE_NAME_2=9463;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Ftoruby.c;0;2
 FILE_NAME_3=94;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fekq%2Ftest%2Ftest_monolog.c;0;2
 FILE_NAME_4=0;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fwork%2Fsrc%2Fsplix%2Fsrc%2Fbarg.c;0;2
 FILE_NAME_5=16838;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fwork%2Fsrc%2Fsplix%2Fsrc%2Fsplix.c;0;2
-FILE_NAME_6=1696;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fserver.c;0;2
+FILE_NAME_6=12135;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fserver.c;0;2
 FILE_NAME_7=4816;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Flibtelnet.c;0;2
-FILE_NAME_8=1491;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fclient.c;0;2
+FILE_NAME_8=2640;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fclient.c;0;2
 FILE_NAME_9=158;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fconfig.c;0;2
-FILE_NAME_10=464;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fclient.h;0;2
+FILE_NAME_10=1302;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fclient.h;0;2
 FILE_NAME_11=240;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fconfig.h;0;2
 FILE_NAME_12=3599;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fesh.h;0;2
 FILE_NAME_13=3217;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fesh.c;0;2
-FILE_NAME_14=641;None;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2FTupfile;0;2
+FILE_NAME_14=264;None;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2FTupfile;0;2
 FILE_NAME_15=1810;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Frh.h;0;2
-FILE_NAME_16=3505;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Frh.c;0;2
-FILE_NAME_17=294;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fdata%2Fscript%2Fmain.rb;0;2
-FILE_NAME_18=17639;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby.h;0;2
-FILE_NAME_19=4107;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Fvalue.h;0;2
-FILE_NAME_20=2;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Firep.h;0;2
-FILE_NAME_21=4903;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fekq%2Fsrc%2Frh.c;0;2
-FILE_NAME_22=1167;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Fobject.h;0;2
-FILE_NAME_23=0;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Fvariable.h;0;2
-FILE_NAME_24=2341;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Fclass.h;0;2
-FILE_NAME_25=60;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fmem.h;0;2
-FILE_NAME_26=426;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fstate.h;0;2
-FILE_NAME_27=9297;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Fsrc%2Fvariable.c;0;2
-FILE_NAME_28=4154;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Fmrbgems%2Fmruby-time%2Fsrc%2Ftime.c;0;2
-FILE_NAME_29=0;Markdown;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Ftest%2FREADME.md;0;2
-FILE_NAME_30=0;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Ftest%2Ft%2Fobject.rb;0;2
-FILE_NAME_31=0;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Ftest%2Ft%2Fbasicobject.rb;0;2
-FILE_NAME_32=2520;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Ftest%2Ft%2Fsyntax.rb;0;2
-FILE_NAME_33=61;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fmonolog.c;0;2
-FILE_NAME_34=15684;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Flibtelnet.h;0;2
-FILE_NAME_35=95;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fmonolog.h;0;2
-FILE_NAME_36=235;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fdynar.h;0;2
-FILE_NAME_37=103;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fmem.c;0;2
-FILE_NAME_38=5343;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fdynar.c;0;2
-FILE_NAME_39=685;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fserver.h;0;2
+FILE_NAME_16=7445;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Ftr_macro.h;0;2
+FILE_NAME_17=1250;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Frh.c;0;2
+FILE_NAME_18=2107;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fdata%2Fscript%2Fmain.rb;0;2
+FILE_NAME_19=137;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fdata%2Fscript%2Flog.rb;0;2
+FILE_NAME_20=578;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fdata%2Fscript%2Fclient.rb;0;2
+FILE_NAME_21=867;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Ftimer.h;0;2
+FILE_NAME_22=2864;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Ftimer.c;0;2
+FILE_NAME_23=11192;C;0;EUTF-8;0;1;0;%2Fusr%2Finclude%2Ftime.h;0;2
+FILE_NAME_24=17639;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby.h;0;2
+FILE_NAME_25=4107;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Fvalue.h;0;2
+FILE_NAME_26=0;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Firep.h;0;2
+FILE_NAME_27=4903;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fekq%2Fsrc%2Frh.c;0;2
+FILE_NAME_28=1167;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Fobject.h;0;2
+FILE_NAME_29=0;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Fvariable.h;0;2
+FILE_NAME_30=2341;C;0;EUTF-8;0;1;0;%2Fusr%2Flocal%2Finclude%2Fmruby%2Fclass.h;0;2
+FILE_NAME_31=60;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fmem.h;0;2
+FILE_NAME_32=426;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fstate.h;0;2
+FILE_NAME_33=9297;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Fsrc%2Fvariable.c;0;2
+FILE_NAME_34=17613;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Fsrc%2Fclass.c;0;2
+FILE_NAME_35=4785;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Fmrbgems%2Fmruby-sprintf%2Fsrc%2Fsprintf.c;0;2
+FILE_NAME_36=49330;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Fsrc%2Fstring.c;0;2
+FILE_NAME_37=4154;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Fmrbgems%2Fmruby-time%2Fsrc%2Ftime.c;0;2
+FILE_NAME_38=0;Markdown;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Ftest%2FREADME.md;0;2
+FILE_NAME_39=0;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Ftest%2Ft%2Fobject.rb;0;2
+FILE_NAME_40=0;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Ftest%2Ft%2Fbasicobject.rb;0;2
+FILE_NAME_41=2520;Ruby;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fmruby-matz%2Ftest%2Ft%2Fsyntax.rb;0;2
+FILE_NAME_42=61;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fmonolog.c;0;2
+FILE_NAME_43=2307;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Flibtelnet.h;0;2
+FILE_NAME_44=1774;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fmonolog.h;0;2
+FILE_NAME_45=235;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fdynar.h;0;2
+FILE_NAME_46=103;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fmem.c;0;2
+FILE_NAME_47=5343;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Fsrc%2Fdynar.c;0;2
+FILE_NAME_48=2919;C;0;EUTF-8;0;1;0;%2Fhome%2Fbjorn%2Fsrc%2Fwoe%2Finclude%2Fserver.h;0;2
 
 [VTE]
 last_dir=/home/bjorn/src/woe