X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fgacela.c;h=6891d4b9f1180e661f256703cd07fde8b68c1c18;hb=e82142f2231e5aacf47e3f0cf5e82679d4291af2;hp=10aee8d38a58c38ac485c2a015357c46c588a874;hpb=5529af7c3a48a6231247ae8d472f359b6c75e938;p=gacela.git diff --git a/src/gacela.c b/src/gacela.c index 10aee8d..6891d4b 100644 --- a/src/gacela.c +++ b/src/gacela.c @@ -154,19 +154,19 @@ gacela_client (SCM rec_channel, SCM send_channel) if (line && *line) { add_history (line); - scm_write (scm_from_locale_string ("("), send_channel); scm_write (scm_from_locale_string (line), send_channel); - scm_write (scm_from_locale_string (")"), send_channel); + scm_force_output (send_channel); while (scm_char_ready_p (rec_channel) == SCM_BOOL_F) { if (ctrl_c) break; - sleep (1); + sleep (0.5); } if (ctrl_c) ctrl_c = 0; else { - buffer = scm_read_line (rec_channel); - printf ("%s\n", scm_to_locale_string (buffer)); + buffer = scm_read (rec_channel); + if (strlen (scm_to_locale_string (buffer)) > 0) + printf ("%s\n", scm_to_locale_string (buffer)); } } free (line); @@ -177,10 +177,10 @@ gacela_client (SCM rec_channel, SCM send_channel) } static void* -init_gacela (void *data, int argc, char **argv) +init_scheme (void *data, int argc, char **argv) { // Guile configuration - scm_c_eval_string ("(set-repl-prompt! \"gacela>\")"); + scm_c_eval_string ("(set-repl-prompt! \"gacela> \")"); scm_c_eval_string ("(use-modules (ice-9 readline))"); scm_c_eval_string ("(activate-readline)"); scm_c_eval_string ("(use-modules (ice-9 optargs))"); @@ -205,78 +205,56 @@ load_scheme_files (char *path) } void -start_single (char *working_path) +init_gacela (char *path) { - char *argv = "guile"; - - scm_with_guile (&init_gacela, NULL); - load_scheme_files (working_path); - scm_shell (1, &argv); + scm_with_guile (&init_scheme, NULL); + load_scheme_files (path); + scm_c_eval_string ("(init-video-mode)"); } void -start_server (char *working_path, int port) +start_server (int port) { - char start_server[100]; + char *start_server; - scm_with_guile (&init_gacela, NULL); - load_scheme_files (working_path); - sprintf (start_server, "(start-server %d)", port); + asprintf (&start_server, "(start-server #:port %d)", port); scm_c_eval_string (start_server); } void -start_local_server (char *working_path, SCM pipes) +start_local_server (SCM pipes) { char start_server[100]; - scm_with_guile (&init_gacela, NULL); - load_scheme_files (working_path); scm_c_define ("pipes", pipes); - scm_c_eval_string ("(start-server pipes)"); + scm_c_eval_string ("(start-server #:pipes pipes)"); } -/* + void start_remote_client (char *hostname, int port) { - int sockfd; - struct hostent *server; - struct sockaddr_in serv_addr; - - // Connect to the server - sockfd = socket (AF_INET, SOCK_STREAM, 0); - server = gethostbyname (hostname); - bzero ((char *) &serv_addr, sizeof (serv_addr)); - serv_addr.sin_family = AF_INET; - bcopy ((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); - serv_addr.sin_port = htons (port); - if (connect (sockfd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) == -1) { - printf ("%s [%d.%d.%d.%d] %d: Connection refused\n", hostname, server->h_addr[0], server->h_addr[1], server->h_addr[2], server->h_addr[3], port); - } - else { - gacela_client (sockfd, sockfd); - close (sockfd); - } + SCM client_socket; + char *connect_to_server; + + asprintf (&connect_to_server, "(let ((s (socket PF_INET SOCK_STREAM 0))) (connect s AF_INET (car (hostent:addr-list (gethost \"%s\"))) %d) s)", hostname, port); + client_socket = scm_c_eval_string (connect_to_server); + gacela_client (client_socket, client_socket); } -*/ + int main (int argc, char *argv[]) { char *arg; - int mode = 0; // shell: 1, server: 2, client: 3 + int mode = 0; // dev: 1, server: 2, client: 3 char *host; int port = 0; int i; - SCM pipes; + SCM fd1, fd2; int pid; - char *string = "prueba\n"; - int p[2]; - char buffer[150]; - // Checking arguments for (i = 1; i < argc; i++) { - if (strcmp (argv[i], "--shell-mode") == 0) + if (strcmp (argv[i], "--dev") == 0) mode = 1; else if (strncmp (argv[i], "--server", 8) == 0) { mode = 2; @@ -300,54 +278,33 @@ main (int argc, char *argv[]) scm_init_guile (); - if (mode == 1) - start_single (dirname (argv[0])); - else if (mode == 2 && port != 0) - start_server (dirname (argv[0]), port); - else if (mode == 3 && port != 0) - //start_remote_client (host, port); - return; - else { - /* - pipes = scm_pipe (); + if (mode == 1) { + fd1 = scm_pipe (); + fd2 = scm_pipe (); pid = fork (); - if (pid == 0) - start_local_server (dirname (argv[0]), pipes); - else - gacela_client (SCM_CAR (pipes), SCM_CDR (pipes)); - */ - /* - if (pid == 0) { - scm_write (scm_from_locale_string ("prueba"), SCM_CDR (pipes)); - sleep (10); - } - else { - while (scm_char_ready_p (SCM_CAR (pipes)) == SCM_BOOL_F) { - sleep (1); - printf ("1\n"); - } - SCM buffer; - buffer = scm_read_line (SCM_CAR (pipes)); - printf ("%s\n", scm_to_locale_string (buffer)); - } - */ - FILE *stream; - pipe (p); if (pid == 0) { - close (p[1]); - stream = fdopen (p[0], "w"); - fprintf (stream, "prueba\n"); - fclose (stream); - printf ("1\n"); - sleep (10); + scm_close (SCM_CAR (fd1)); + scm_close (SCM_CDR (fd2)); + init_gacela (dirname (argv[0])); + start_local_server (scm_cons (SCM_CAR (fd2), SCM_CDR (fd1))); } else { - int c; - close (p[0]); - stream = fdopen (p[1], "r"); - while ((c = fgetc (stream)) != EOF) - putchar (c); + scm_close (SCM_CDR (fd1)); + scm_close (SCM_CAR (fd2)); + gacela_client (SCM_CAR (fd1), SCM_CDR (fd2)); + kill (pid, SIGKILL); } } + else if (mode == 2 && port != 0) { + init_gacela (dirname (argv[0])); + start_server (port); + } + else if (mode == 3 && port != 0) + start_remote_client (host, port); + else { + init_gacela (dirname (argv[0])); + scm_shell (argc, argv); + SDL_Quit (); + } }