]> git.jsancho.org Git - gacela.git/blobdiff - src/gacela.c
(no commit message)
[gacela.git] / src / gacela.c
index 37c8c9fb0754ff5f30142b36e96e54a1dc7e5547..66bd40a6229b32fddbd9771a611bb916d7e5cafc 100644 (file)
@@ -23,8 +23,9 @@
 #include "gacela_GL.h"
 #include "gacela_FTGL.h"
 
+
 static int
-find_matching_paren(int k)
+find_matching_paren (int k)
 {
   register int i;
   register char c = 0;
@@ -35,7 +36,7 @@ find_matching_paren(int k)
   else if (k == ']') c = '[';
   else if (k == '}') c = '{';
 
-  for (i=rl_point-2; i>=0; i--)
+  for (i = rl_point-2; i >= 0; i--)
     {
       /* Is the current character part of a character literal?  */
       if (i - 2 >= 0
@@ -62,43 +63,52 @@ find_matching_paren(int k)
   return -1;
 }
 
-static void
-match_paren(int x, int k)
+static int
+match_paren (int x, int k)
 {
   int tmp;
-  fd_set readset;
+  int fno;
+  SELECT_TYPE readset;
   struct timeval timeout;
 
-  rl_insert(x, k);
+  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);
+    return 0;
+
+  tmp = 500000;
+  timeout.tv_sec = tmp / 1000000;
+  timeout.tv_usec = tmp % 1000000;
+  FD_ZERO (&readset);
+  fno = fileno (rl_instream);
+  FD_SET (fno, &readset);
+
+  if (rl_point > 1)
+    {
+      tmp = rl_point;
+      rl_point = find_matching_paren (k);
+      if (rl_point > -1)
+        {
+          rl_redisplay ();
+          scm_std_select (fno + 1, &readset, NULL, NULL, &timeout);
+        }
+      rl_point = tmp;
     }
-    rl_point = tmp;
-  }
+  return 0;
 }
 
 static void
 init_gacela_client ()
 {
   /* init bouncing parens */
-  rl_bind_key(')', match_paren);
-  rl_bind_key(']', match_paren);
-  rl_bind_key('}', match_paren);
+  rl_bind_key (')', match_paren);
+  rl_bind_key (']', match_paren);
+  rl_bind_key ('}', match_paren);
+
+  /* SIGINT */
+  scm_c_eval_string ("(sigaction SIGINT (lambda (sig) (format #t \"ERROR: User interrupt~%ABORT: (signal)~%\")))");
 }
 
 void
@@ -113,6 +123,8 @@ gacela_client (void)
     printf ("%s\n", line);
     if (line && *line)
       add_history (line);
+    if (strcmp(line, "fuera") == 0)
+      break;
     free (line);
   }
 }
@@ -126,7 +138,6 @@ 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)");
 
   // Bindings for C functions and structs
@@ -155,5 +166,6 @@ main (int argc, char *argv[])
   load_scheme_files (dirname (argv[0]));
   scm_shell (argc, argv);
   */
+  scm_init_guile ();
   gacela_client ();
 }