X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fgacela.c;h=f6c970b56d8d5a643520232ff62594a92e610148;hb=c4dbd17a165312f189ec5211069dab4d039d5471;hp=d30ec0de4ad82cb598bb65eb7f68cb37134cfb20;hpb=9382649bb4f29fd789c7acaf7185b2a50ad1613c;p=gacela.git diff --git a/src/gacela.c b/src/gacela.c index d30ec0d..f6c970b 100644 --- a/src/gacela.c +++ b/src/gacela.c @@ -19,10 +19,12 @@ #include #include #include +#include #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 (); + */ +}