]> git.jsancho.org Git - gacela.git/blobdiff - src/gacela.c
(no commit message)
[gacela.git] / src / gacela.c
index d30ec0de4ad82cb598bb65eb7f68cb37134cfb20..f6c970b56d8d5a643520232ff62594a92e610148 100644 (file)
 #include <libgen.h>
 #include <readline/readline.h>
 #include <readline/history.h>
+#include <signal.h>
 #include "gacela_SDL.h"
 #include "gacela_GL.h"
 #include "gacela_FTGL.h"
 
+
 static int
 find_matching_paren (int k)
 {
@@ -62,36 +64,6 @@ find_matching_paren (int k)
   return -1;
 }
 
-static void
-match_paren2 (int x, int k)
-{
-  int tmp;
-  fd_set readset;
-  struct timeval timeout;
-
-  rl_insert (x, k);
-  /* Did we just insert a quoted paren?  If so, then don't bounce.  */
-  if (rl_point - 1 >= 1
-      && rl_line_buffer[rl_point - 2] == '\\')
-    return;
-
-  timeout.tv_sec = 0;
-  timeout.tv_usec = 500000;
-  FD_ZERO (&readset);
-  FD_SET (fileno(rl_instream), &readset);
-
-  if (rl_point > 1) {
-    tmp = rl_point;
-    rl_point = find_matching_paren(k);
-    if (rl_point > -1) {
-      rl_redisplay();
-      //scm_internal_select(1, &readset, NULL, NULL, &timeout);
-    }
-    //rl_point = tmp;
-  }
-}
-
 static int
 match_paren (int x, int k)
 {
@@ -107,7 +79,7 @@ match_paren (int x, int k)
       && rl_line_buffer[rl_point - 2] == '\\')
     return 0;
 
-  tmp = 1000 * 1000;
+  tmp = 500000;
   timeout.tv_sec = tmp / 1000000;
   timeout.tv_usec = tmp % 1000000;
   FD_ZERO (&readset);
@@ -128,29 +100,54 @@ match_paren (int x, int k)
   return 0;
 }
 
+void
+ctrl_c_handler (int signum)
+{
+  printf ("ERROR: User interrupt\nABORT: (signal)\n");
+}
+     
 static void
 init_gacela_client ()
 {
+  struct sigaction new_action;
+
   /* init bouncing parens */
   rl_bind_key (')', match_paren);
   rl_bind_key (']', match_paren);
   rl_bind_key ('}', match_paren);
+
+  /* SIGINT */
+  new_action.sa_handler = ctrl_c_handler;
+  sigemptyset (&new_action.sa_mask);
+  new_action.sa_flags = 0;
+
+  sigaction (SIGINT, &new_action, NULL);
 }
 
 void
 gacela_client (void)
 {
   char *line;
+  char *history_path;
+
+  asprintf (&history_path, "%s/.gacela_history", getenv("HOME"));
 
   init_gacela_client ();
+  read_history (history_path);
 
   while (1) {
-    line = readline ("gacela>");
-    printf ("%s\n", line);
+    line = readline ("gacela> ");
+    if (!line) break;
     if (line && *line)
-      add_history (line);
+      {
+       printf ("%s\n", line);
+       add_history (line);
+      }
     free (line);
   }
+
+  write_history (history_path);
+  free (history_path);
 }
 
 static void*
@@ -162,8 +159,7 @@ init_gacela (void *data, int argc, char **argv)
   scm_c_eval_string ("(activate-readline)");
   scm_c_eval_string ("(use-modules (ice-9 optargs))");
   scm_c_eval_string ("(use-modules (ice-9 receive))");
-  scm_c_eval_string ("(use-modules (ice-9 threads))");
-  scm_c_eval_string ("(read-enable 'case-insensitive)");
+  //  scm_c_eval_string ("(read-enable 'case-insensitive)");
 
   // Bindings for C functions and structs
   SDL_register_functions (NULL);
@@ -183,13 +179,38 @@ load_scheme_files (char *path)
   scm_primitive_load_path (scm_from_locale_string ("gacela_loader.scm"));
 }
 
-int
-main (int argc, char *argv[])
+void
+start_single (int argc, char *argv[])
 {
-  /*
   scm_with_guile (&init_gacela, NULL);
   load_scheme_files (dirname (argv[0]));
   scm_shell (argc, argv);
-  */
+}
+
+void
+start_server (int argc, char *argv[])
+{
+  scm_with_guile (&init_gacela, NULL);
+  load_scheme_files (dirname (argv[0]));
+  scm_c_eval_string ("(start-server 1234)");
+  scm_c_eval_string ("(game-loop)");
+}
+
+void
+start_client (void)
+{
+  scm_init_guile ();
   gacela_client ();
 }
+
+int
+main (int argc, char *argv[])
+{
+  start_single (argc, argv);
+  /*
+  if (fork () == 0)
+    start_server ();
+  else
+    start_client ();
+  */
+}