mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-17 09:10:22 +02:00
* Change a couple of functions to accept either symbols or strings only.
* Get rid of remainig uses of SCM_LENGTH etc.
This commit is contained in:
parent
e9bfab50e4
commit
a6d9e5abe5
24 changed files with 418 additions and 320 deletions
121
libguile/posix.c
121
libguile/posix.c
|
@ -264,10 +264,9 @@ SCM_DEFINE (scm_getpwuid, "getpw", 0, 1, 0,
|
|||
}
|
||||
else
|
||||
{
|
||||
SCM_VALIDATE_ROSTRING (1,user);
|
||||
if (SCM_SUBSTRP (user))
|
||||
user = scm_makfromstr (SCM_ROCHARS (user), SCM_STRING_LENGTH (user), 0);
|
||||
entry = getpwnam (SCM_ROCHARS (user));
|
||||
SCM_VALIDATE_STRING (1, user);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (user);
|
||||
entry = getpwnam (SCM_STRING_CHARS (user));
|
||||
}
|
||||
if (!entry)
|
||||
SCM_MISC_ERROR ("entry not found", SCM_EOL);
|
||||
|
@ -334,9 +333,9 @@ SCM_DEFINE (scm_getgrgid, "getgr", 0, 1, 0,
|
|||
SCM_SYSCALL (entry = getgrgid (SCM_INUM (name)));
|
||||
else
|
||||
{
|
||||
SCM_VALIDATE_ROSTRING (1,name);
|
||||
SCM_COERCE_SUBSTR (name);
|
||||
SCM_SYSCALL (entry = getgrnam (SCM_ROCHARS (name)));
|
||||
SCM_VALIDATE_STRING (1, name);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (name);
|
||||
SCM_SYSCALL (entry = getgrnam (SCM_STRING_CHARS (name)));
|
||||
}
|
||||
if (!entry)
|
||||
SCM_SYSERROR;
|
||||
|
@ -802,35 +801,37 @@ SCM_DEFINE (scm_tcsetpgrp, "tcsetpgrp", 2, 0, 0,
|
|||
#undef FUNC_NAME
|
||||
#endif /* HAVE_TCSETPGRP */
|
||||
|
||||
/* Copy exec args from an SCM vector into a new C array. */
|
||||
/* Create a new C argv array from a scheme list of strings. */
|
||||
/* Dirk:FIXME:: A quite similar function is implemented in dynl.c */
|
||||
/* Dirk:FIXME:: In case of assertion errors, we get memory leaks */
|
||||
|
||||
static char **
|
||||
scm_convert_exec_args (SCM args, int pos, const char *subr)
|
||||
scm_convert_exec_args (SCM args, int argn, const char *subr)
|
||||
{
|
||||
char **execargv;
|
||||
int num_args;
|
||||
char **argv;
|
||||
int argc;
|
||||
int i;
|
||||
|
||||
num_args = scm_ilength (args);
|
||||
SCM_ASSERT (num_args >= 0, args, pos, subr);
|
||||
execargv = (char **)
|
||||
scm_must_malloc ((num_args + 1) * sizeof (char *), subr);
|
||||
argc = scm_ilength (args);
|
||||
SCM_ASSERT (argc >= 0, args, argn, subr);
|
||||
argv = (char **) scm_must_malloc ((argc + 1) * sizeof (char *), subr);
|
||||
for (i = 0; !SCM_NULLP (args); args = SCM_CDR (args), ++i)
|
||||
{
|
||||
SCM arg = SCM_CAR (args);
|
||||
scm_sizet len;
|
||||
char *dst;
|
||||
char *src;
|
||||
SCM_ASSERT (SCM_ROSTRINGP (SCM_CAR (args)),
|
||||
SCM_CAR (args), SCM_ARGn, subr);
|
||||
len = 1 + SCM_ROLENGTH (SCM_CAR (args));
|
||||
dst = (char *) scm_must_malloc ((long) len, subr);
|
||||
src = SCM_ROCHARS (SCM_CAR (args));
|
||||
while (len--)
|
||||
dst[len] = src[len];
|
||||
execargv[i] = dst;
|
||||
|
||||
SCM_ASSERT (SCM_STRINGP (arg), args, argn, subr);
|
||||
len = SCM_STRING_LENGTH (arg);
|
||||
src = SCM_ROCHARS (arg);
|
||||
dst = (char *) scm_must_malloc (len + 1, subr);
|
||||
memcpy (dst, src, len);
|
||||
dst[len] = 0;
|
||||
argv[i] = dst;
|
||||
}
|
||||
execargv[i] = 0;
|
||||
return execargv;
|
||||
argv[i] = 0;
|
||||
return argv;
|
||||
}
|
||||
|
||||
SCM_DEFINE (scm_execl, "execl", 1, 0, 1,
|
||||
|
@ -847,10 +848,10 @@ SCM_DEFINE (scm_execl, "execl", 1, 0, 1,
|
|||
#define FUNC_NAME s_scm_execl
|
||||
{
|
||||
char **execargv;
|
||||
SCM_VALIDATE_ROSTRING (1,filename);
|
||||
SCM_COERCE_SUBSTR (filename);
|
||||
SCM_VALIDATE_STRING (1, filename);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (filename);
|
||||
execargv = scm_convert_exec_args (args, SCM_ARG2, FUNC_NAME);
|
||||
execv (SCM_ROCHARS (filename), execargv);
|
||||
execv (SCM_STRING_CHARS (filename), execargv);
|
||||
SCM_SYSERROR;
|
||||
/* not reached. */
|
||||
return SCM_BOOL_F;
|
||||
|
@ -868,10 +869,10 @@ SCM_DEFINE (scm_execlp, "execlp", 1, 0, 1,
|
|||
#define FUNC_NAME s_scm_execlp
|
||||
{
|
||||
char **execargv;
|
||||
SCM_VALIDATE_ROSTRING (1,filename);
|
||||
SCM_COERCE_SUBSTR (filename);
|
||||
SCM_VALIDATE_STRING (1, filename);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (filename);
|
||||
execargv = scm_convert_exec_args (args, SCM_ARG2, FUNC_NAME);
|
||||
execvp (SCM_ROCHARS (filename), execargv);
|
||||
execvp (SCM_STRING_CHARS (filename), execargv);
|
||||
SCM_SYSERROR;
|
||||
/* not reached. */
|
||||
return SCM_BOOL_F;
|
||||
|
@ -883,30 +884,27 @@ environ_list_to_c (SCM envlist, int arg, const char *proc)
|
|||
{
|
||||
int num_strings;
|
||||
char **result;
|
||||
int i = 0;
|
||||
int i;
|
||||
|
||||
SCM_ASSERT (SCM_NULLP (envlist) || SCM_CONSP (envlist),
|
||||
envlist, arg, proc);
|
||||
num_strings = scm_ilength (envlist);
|
||||
SCM_ASSERT (num_strings >= 0, envlist, arg, proc);
|
||||
result = (char **) malloc ((num_strings + 1) * sizeof (char *));
|
||||
if (result == NULL)
|
||||
scm_memory_error (proc);
|
||||
while (SCM_NNULLP (envlist))
|
||||
for (i = 0; !SCM_NULLP (envlist); ++i, envlist = SCM_CDR (envlist))
|
||||
{
|
||||
SCM str = SCM_CAR (envlist);
|
||||
int len;
|
||||
char *src;
|
||||
|
||||
SCM_ASSERT (SCM_ROSTRINGP (SCM_CAR (envlist)),
|
||||
envlist, arg, proc);
|
||||
len = 1 + SCM_ROLENGTH (SCM_CAR (envlist));
|
||||
result[i] = malloc ((long) len);
|
||||
SCM_ASSERT (SCM_STRINGP (str), envlist, arg, proc);
|
||||
len = SCM_STRING_LENGTH (str);
|
||||
src = SCM_ROCHARS (str);
|
||||
result[i] = malloc (len + 1);
|
||||
if (result[i] == NULL)
|
||||
scm_memory_error (proc);
|
||||
src = SCM_ROCHARS (SCM_CAR (envlist));
|
||||
while (len--)
|
||||
result[i][len] = src[len];
|
||||
envlist = SCM_CDR (envlist);
|
||||
i++;
|
||||
memcpy (result[i], src, len);
|
||||
result[i][len] = 0;
|
||||
}
|
||||
result[i] = 0;
|
||||
return result;
|
||||
|
@ -924,12 +922,12 @@ SCM_DEFINE (scm_execle, "execle", 2, 0, 1,
|
|||
char **execargv;
|
||||
char **exec_env;
|
||||
|
||||
SCM_VALIDATE_ROSTRING (1,filename);
|
||||
SCM_COERCE_SUBSTR (filename);
|
||||
SCM_VALIDATE_STRING (1, filename);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (filename);
|
||||
|
||||
execargv = scm_convert_exec_args (args, SCM_ARG1, FUNC_NAME);
|
||||
exec_env = environ_list_to_c (env, SCM_ARG2, FUNC_NAME);
|
||||
execve (SCM_ROCHARS (filename), execargv, exec_env);
|
||||
execve (SCM_STRING_CHARS (filename), execargv, exec_env);
|
||||
SCM_SYSERROR;
|
||||
/* not reached. */
|
||||
return SCM_BOOL_F;
|
||||
|
@ -1052,8 +1050,8 @@ SCM_DEFINE (scm_utime, "utime", 1, 2, 0,
|
|||
int rv;
|
||||
struct utimbuf utm_tmp;
|
||||
|
||||
SCM_VALIDATE_ROSTRING (1,pathname);
|
||||
SCM_COERCE_SUBSTR (pathname);
|
||||
SCM_VALIDATE_STRING (1, pathname);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (pathname);
|
||||
if (SCM_UNBNDP (actime))
|
||||
SCM_SYSCALL (time (&utm_tmp.actime));
|
||||
else
|
||||
|
@ -1064,7 +1062,7 @@ SCM_DEFINE (scm_utime, "utime", 1, 2, 0,
|
|||
else
|
||||
utm_tmp.modtime = SCM_NUM2ULONG (3,modtime);
|
||||
|
||||
SCM_SYSCALL (rv = utime (SCM_ROCHARS (pathname), &utm_tmp));
|
||||
SCM_SYSCALL (rv = utime (SCM_STRING_CHARS (pathname), &utm_tmp));
|
||||
if (rv != 0)
|
||||
SCM_SYSERROR;
|
||||
return SCM_UNSPECIFIED;
|
||||
|
@ -1100,11 +1098,10 @@ SCM_DEFINE (scm_access, "access?", 2, 0, 0,
|
|||
{
|
||||
int rv;
|
||||
|
||||
SCM_VALIDATE_ROSTRING (1,path);
|
||||
if (SCM_SUBSTRP (path))
|
||||
path = scm_makfromstr (SCM_ROCHARS (path), SCM_ROLENGTH (path), 0);
|
||||
SCM_VALIDATE_INUM (2,how);
|
||||
rv = access (SCM_ROCHARS (path), SCM_INUM (how));
|
||||
SCM_VALIDATE_STRING (1, path);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (path);
|
||||
SCM_VALIDATE_INUM (2, how);
|
||||
rv = access (SCM_STRING_CHARS (path), SCM_INUM (how));
|
||||
return SCM_NEGATE_BOOL(rv);
|
||||
}
|
||||
#undef FUNC_NAME
|
||||
|
@ -1172,9 +1169,9 @@ SCM_DEFINE (scm_setlocale, "setlocale", 1, 1, 0,
|
|||
}
|
||||
else
|
||||
{
|
||||
SCM_VALIDATE_ROSTRING (2,locale);
|
||||
SCM_COERCE_SUBSTR (locale);
|
||||
clocale = SCM_ROCHARS (locale);
|
||||
SCM_VALIDATE_STRING (2, locale);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (locale);
|
||||
clocale = SCM_STRING_CHARS (locale);
|
||||
}
|
||||
|
||||
rv = setlocale (SCM_INUM (category), clocale);
|
||||
|
@ -1207,11 +1204,11 @@ SCM_DEFINE (scm_mknod, "mknod", 4, 0, 0,
|
|||
char *p;
|
||||
int ctype = 0;
|
||||
|
||||
SCM_VALIDATE_ROSTRING (1,path);
|
||||
SCM_VALIDATE_STRING (1, path);
|
||||
SCM_VALIDATE_SYMBOL (2,type);
|
||||
SCM_VALIDATE_INUM (3,perms);
|
||||
SCM_VALIDATE_INUM (4,dev);
|
||||
SCM_COERCE_SUBSTR (path);
|
||||
SCM_STRING_COERCE_0TERMINATION_X (path);
|
||||
|
||||
p = SCM_SYMBOL_CHARS (type);
|
||||
if (strcmp (p, "regular") == 0)
|
||||
|
@ -1233,8 +1230,8 @@ SCM_DEFINE (scm_mknod, "mknod", 4, 0, 0,
|
|||
else
|
||||
SCM_OUT_OF_RANGE (2,type);
|
||||
|
||||
SCM_SYSCALL (val = mknod(SCM_ROCHARS(path), ctype | SCM_INUM (perms),
|
||||
SCM_INUM (dev)));
|
||||
SCM_SYSCALL (val = mknod (SCM_STRING_CHARS (path), ctype | SCM_INUM (perms),
|
||||
SCM_INUM (dev)));
|
||||
if (val != 0)
|
||||
SCM_SYSERROR;
|
||||
return SCM_UNSPECIFIED;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue