X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fgacela.c;h=66bd40a6229b32fddbd9771a611bb916d7e5cafc;hb=495f95e1619224b8ca21a209ea5b50e15b3a6c47;hp=37c8c9fb0754ff5f30142b36e96e54a1dc7e5547;hpb=faa5d238501edac61e899697a6bb88f33dff13de;p=gacela.git diff --git a/src/gacela.c b/src/gacela.c index 37c8c9f..66bd40a 100644 --- a/src/gacela.c +++ b/src/gacela.c @@ -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 (); }