version 1.8, 2000/12/03 14:32:40 |
version 1.9, 2000/12/14 01:35:58 |
|
|
/* -*- mode: C; coding: euc-japan -*- */ |
/* -*- mode: C; coding: euc-japan -*- */ |
/* $OpenXM: OpenXM/src/oxc/sm_ext.c,v 1.7 2000/12/01 01:53:34 ohara Exp $ */ |
/* $OpenXM: OpenXM/src/oxc/sm_ext.c,v 1.8 2000/12/03 14:32:40 ohara Exp $ */ |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
Line 196 cmo_error2 *type_checker(cmo *ob, int type) |
|
Line 196 cmo_error2 *type_checker(cmo *ob, int type) |
|
return NULL; |
return NULL; |
} |
} |
|
|
static int sm_control_spawn_main(int argc, cmo *argv[]) |
int lf_oxc_open() |
{ |
{ |
char *cmd = ((cmo_string *)argv[0])->s; |
cmo_int32 *argc = pop(); |
int port = ((cmo_int32 *)argv[1])->i; |
if (argc->tag == CMO_INT32 && argc->i == 1) { |
pid_t pid = lf_oxc_open_main(cmd, port); |
return sm_control_spawn(); |
if (pid > 0) { |
} |
push(new_cmo_int32(pid)); |
push_error(-1, argc); |
pid_regist(pid); |
return -1; |
} |
|
return pid; |
|
} |
} |
|
|
int lf_oxc_open() |
int sm_control_spawn_typecheck(cmo_list *args, cmo_list *ports, cmo_int32 *port, cmo_string *sname) |
{ |
{ |
cmo **argv; |
char *cmd = sname->s; |
if (getargs(&argv) != 2 || |
|
type_checker(argv[0], CMO_STRING) != NULL |
return args->tag == CMO_LIST |
|| type_checker(argv[0], CMO_INT32) != NULL) { |
&& list_length(args) > 1 |
fprintf(stderr, "oxc: invalid arguments\n"); |
&& ports->tag == CMO_LIST |
return -1; |
&& list_length(ports) > 0 |
} |
&& port->tag == CMO_INT32 |
return sm_control_spawn_main(2, argv); |
&& sname->tag == CMO_STRING |
|
&& cmd != NULL |
|
&& which(cmd, getenv("PATH")) != NULL; |
} |
} |
|
|
static int sm_control_spawn() |
static int sm_control_spawn() |
{ |
{ |
cmo *argv[2]; |
cmo_list *args = pop(); |
argv[0] = pop(); |
cmo_list *ports = list_first_cmo(args); |
argv[1] = pop(); |
cmo_int32 *port = list_first_cmo(ports); |
|
cmo_string *sname = list_nth(args, 1); |
|
pid_t pid; |
|
|
if (type_checker(argv[0], CMO_STRING) != NULL |
if (sm_control_spawn_typecheck(args, ports, port, sname)) { |
|| type_checker(argv[0], CMO_INT32) != NULL) { |
pid = lf_oxc_open_main(sname->s, port->i); |
fprintf(stderr, "oxc: invalid arguments\n"); |
if (pid > 0) { |
return -1; |
push(new_cmo_int32(pid)); |
} |
pid_regist(pid); |
return sm_control_spawn_main(2, argv); |
fprintf(stderr, "oxc: spawns %s\n", sname->s); |
|
return pid; |
|
} |
|
} |
|
push_error(-1, args); |
|
return 0; |
|
|
} |
} |
|
|
void sm_mathcap() |
void sm_mathcap() |