89 |
(Dirk: IMO strings.c is not the right place.) */ |
(Dirk: IMO strings.c is not the right place.) */ |
90 |
|
|
91 |
static char ** |
static char ** |
92 |
scm_make_argv_from_stringlist (SCM args,int *argcp,const char *subr,int argn) |
scm_make_argv_from_stringlist (SCM args, int *argcp, const char *subr, |
93 |
|
int argn) |
94 |
{ |
{ |
95 |
char **argv; |
char **argv; |
96 |
int argc; |
int argc; |
98 |
|
|
99 |
argc = scm_ilength (args); |
argc = scm_ilength (args); |
100 |
SCM_ASSERT (argc >= 0, args, argn, subr); |
SCM_ASSERT (argc >= 0, args, argn, subr); |
101 |
argv = (char **) scm_must_malloc ((argc + 1) * sizeof (char *), subr); |
argv = (char **) scm_malloc ((argc + 1) * sizeof (char *)); |
102 |
for (i = 0; !SCM_NULL_OR_NIL_P (args); args = SCM_CDR (args), ++i) { |
for (i = 0; !SCM_NULL_OR_NIL_P (args); args = SCM_CDR (args), ++i) { |
103 |
SCM arg = SCM_CAR (args); |
SCM arg = SCM_CAR (args); |
104 |
size_t len; |
size_t len; |
108 |
SCM_ASSERT (SCM_STRINGP (arg), args, argn, subr); |
SCM_ASSERT (SCM_STRINGP (arg), args, argn, subr); |
109 |
len = SCM_STRING_LENGTH (arg); |
len = SCM_STRING_LENGTH (arg); |
110 |
src = SCM_STRING_CHARS (arg); |
src = SCM_STRING_CHARS (arg); |
111 |
dst = (char *) scm_must_malloc (len + 1, subr); |
dst = (char *) scm_malloc (len + 1); |
112 |
memcpy (dst, src, len); |
memcpy (dst, src, len); |
113 |
dst[len] = 0; |
dst[len] = 0; |
114 |
argv[i] = dst; |
argv[i] = dst; |
121 |
} |
} |
122 |
|
|
123 |
static void |
static void |
124 |
scm_must_free_argv(char **argv) |
scm_free_argv (char **argv) |
125 |
{ |
{ |
126 |
char **av = argv; |
char **av = argv; |
127 |
while (*av) |
while (*av) |
399 |
SCM_DEFER_INTS; |
SCM_DEFER_INTS; |
400 |
argv = scm_make_argv_from_stringlist (args, &argc, FUNC_NAME, SCM_ARG3); |
argv = scm_make_argv_from_stringlist (args, &argc, FUNC_NAME, SCM_ARG3); |
401 |
result = (*fptr) (argc, argv); |
result = (*fptr) (argc, argv); |
402 |
scm_must_free_argv (argv); |
scm_free_argv (argv); |
403 |
SCM_ALLOW_INTS; |
SCM_ALLOW_INTS; |
404 |
|
|
405 |
return SCM_MAKINUM (0L + result); |
return SCM_MAKINUM (0L + result); |