diff --git a/libguile/backtrace.c b/libguile/backtrace.c index d47375771..eb12df4db 100644 --- a/libguile/backtrace.c +++ b/libguile/backtrace.c @@ -99,7 +99,7 @@ scm_display_error_message (message, args, port) char *start; char *p; - if (SCM_IMP (message) || !SCM_STRINGP (message) || SCM_IMP (args) + if (SCM_IMP (message) || !SCM_ROSTRINGP (message) || SCM_IMP (args) || !scm_list_p (args)) { scm_prin1 (message, port, 0); @@ -107,7 +107,8 @@ scm_display_error_message (message, args, port) return; } - start = SCM_CHARS (message); + SCM_COERCE_SUBSTR (message); + start = SCM_ROCHARS (message); for (p = start; *p != '\0'; ++p) if (*p == '%') { diff --git a/libguile/error.c b/libguile/error.c index 910ad5c19..5d8a36247 100644 --- a/libguile/error.c +++ b/libguile/error.c @@ -84,7 +84,8 @@ scm_error (key, subr, message, args, rest) /* No return, but just in case: */ - write (2, "unhandled system error", sizeof ("unhandled system error") - 1); + write (2, "unhandled system error\n", + sizeof ("unhandled system error\n") - 1); exit (1); } @@ -105,6 +106,8 @@ scm_error_scm (key, subr, message, args, rest) || (SCM_NIMP (message) && SCM_ROSTRINGP (message)), message, SCM_ARG3, s_error_scm); + SCM_COERCE_SUBSTR (message); + scm_error (key, (SCM_FALSEP (subr)) ? NULL : SCM_ROCHARS (subr), (SCM_FALSEP (message)) ? NULL : SCM_ROCHARS (message), diff --git a/libguile/filesys.c b/libguile/filesys.c index 58011f609..750d5a2d3 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -139,10 +139,10 @@ scm_chown (path, owner, group) int val; SCM_ASSERT (SCM_NIMP (path) && SCM_ROSTRINGP (path), path, SCM_ARG1, s_chown); - if (SCM_SUBSTRP (path)) - path = scm_makfromstr (SCM_ROCHARS (path), SCM_ROLENGTH (path), 0); SCM_ASSERT (SCM_INUMP (owner), owner, SCM_ARG2, s_chown); SCM_ASSERT (SCM_INUMP (group), group, SCM_ARG3, s_chown); + + SCM_COERCE_SUBSTR (path); SCM_SYSCALL (val = chown (SCM_ROCHARS (path), SCM_INUM (owner), SCM_INUM (group))); if (val != 0) @@ -161,8 +161,11 @@ scm_chmod (port_or_path, mode) int rv; SCM_ASSERT (SCM_INUMP (mode), mode, SCM_ARG2, s_chmod); SCM_ASSERT (SCM_NIMP (port_or_path), port_or_path, SCM_ARG1, s_chmod); - if (SCM_STRINGP (port_or_path)) - SCM_SYSCALL (rv = chmod (SCM_CHARS (port_or_path), SCM_INUM (mode))); + if (SCM_ROSTRINGP (port_or_path)) + { + SCM_COERCE_SUBSTR (port_or_path); + SCM_SYSCALL (rv = chmod (SCM_ROCHARS (port_or_path), SCM_INUM (mode))); + } else { SCM_ASSERT (SCM_OPFPORTP (port_or_path), port_or_path, SCM_ARG1, s_chmod); @@ -438,22 +441,26 @@ scm_rename (oldname, newname) SCM newname; { int rv; - SCM_ASSERT (SCM_NIMP (oldname) && SCM_STRINGP (oldname), oldname, SCM_ARG1, s_rename); - SCM_ASSERT (SCM_NIMP (newname) && SCM_STRINGP (newname), newname, SCM_ARG2, s_rename); + SCM_ASSERT (SCM_NIMP (oldname) && SCM_ROSTRINGP (oldname), oldname, SCM_ARG1, + s_rename); + SCM_ASSERT (SCM_NIMP (newname) && SCM_ROSTRINGP (newname), newname, SCM_ARG2, + s_rename); + SCM_COERCE_SUBSTR (oldname); + SCM_COERCE_SUBSTR (newname); #ifdef HAVE_RENAME - SCM_SYSCALL (rv = rename (SCM_CHARS (oldname), SCM_CHARS (newname))); + SCM_SYSCALL (rv = rename (SCM_ROCHARS (oldname), SCM_ROCHARS (newname))); if (rv != 0) scm_syserror (s_rename); return SCM_UNSPECIFIED; #else SCM_DEFER_INTS; - SCM_SYSCALL (rv = link (SCM_CHARS (oldname), SCM_CHARS (newname))); + SCM_SYSCALL (rv = link (SCM_ROCHARS (oldname), SCM_ROCHARS (newname))); if (rv == 0) { - SCM_SYSCALL (rv = unlink (SCM_CHARS (oldname)));; + SCM_SYSCALL (rv = unlink (SCM_ROCHARS (oldname)));; if (rv != 0) /* unlink failed. remove new name */ - SCM_SYSCALL (unlink (SCM_CHARS (newname))); + SCM_SYSCALL (unlink (SCM_ROCHARS (newname))); } SCM_ALLOW_INTS; if (rv != 0) @@ -470,8 +477,9 @@ scm_delete_file (str) SCM str; { int ans; - SCM_ASSERT (SCM_NIMP (str) && SCM_STRINGP (str), str, SCM_ARG1, s_delete_file); - SCM_SYSCALL (ans = unlink (SCM_CHARS (str))); + SCM_ASSERT (SCM_NIMP (str) && SCM_ROSTRINGP (str), str, SCM_ARG1, s_delete_file); + SCM_COERCE_SUBSTR (str); + SCM_SYSCALL (ans = unlink (SCM_ROCHARS (str))); if (ans != 0) scm_syserror (s_delete_file); return SCM_UNSPECIFIED; @@ -488,17 +496,19 @@ scm_mkdir (path, mode) #ifdef HAVE_MKDIR int rv; mode_t mask; - SCM_ASSERT (SCM_NIMP (path) && SCM_STRINGP (path), path, SCM_ARG1, s_mkdir); + SCM_ASSERT (SCM_NIMP (path) && SCM_ROSTRINGP (path), path, SCM_ARG1, + s_mkdir); + SCM_COERCE_SUBSTR (path); if (SCM_UNBNDP (mode)) { mask = umask (0); umask (mask); - SCM_SYSCALL (rv = mkdir (SCM_CHARS (path), 0777 ^ mask)); + SCM_SYSCALL (rv = mkdir (SCM_ROCHARS (path), 0777 ^ mask)); } else { SCM_ASSERT (SCM_INUMP (mode), mode, SCM_ARG2, s_mkdir); - SCM_SYSCALL (rv = mkdir (SCM_CHARS (path), SCM_INUM (mode))); + SCM_SYSCALL (rv = mkdir (SCM_ROCHARS (path), SCM_INUM (mode))); } if (rv != 0) scm_syserror (s_mkdir); @@ -520,8 +530,10 @@ scm_rmdir (path) #ifdef HAVE_RMDIR int val; - SCM_ASSERT (SCM_NIMP (path) && SCM_STRINGP (path), path, SCM_ARG1, s_rmdir); - SCM_SYSCALL (val = rmdir (SCM_CHARS (path))); + SCM_ASSERT (SCM_NIMP (path) && SCM_ROSTRINGP (path), path, SCM_ARG1, + s_rmdir); + SCM_COERCE_SUBSTR (path); + SCM_SYSCALL (val = rmdir (SCM_ROCHARS (path))); if (val != 0) scm_syserror (s_rmdir); return SCM_UNSPECIFIED; @@ -546,10 +558,12 @@ scm_opendir (dirname) { DIR *ds; SCM dir; - SCM_ASSERT (SCM_NIMP (dirname) && SCM_STRINGP (dirname), dirname, SCM_ARG1, s_opendir); + SCM_ASSERT (SCM_NIMP (dirname) && SCM_ROSTRINGP (dirname), dirname, SCM_ARG1, + s_opendir); + SCM_COERCE_SUBSTR (dirname); SCM_NEWCELL (dir); SCM_DEFER_INTS; - SCM_SYSCALL (ds = opendir (SCM_CHARS (dirname))); + SCM_SYSCALL (ds = opendir (SCM_ROCHARS (dirname))); if (ds == NULL) scm_syserror (s_opendir); SCM_SETCAR (dir, scm_tc16_dir | SCM_OPN); @@ -657,8 +671,9 @@ scm_chdir (str) { int ans; - SCM_ASSERT (SCM_NIMP (str) && SCM_STRINGP (str), str, SCM_ARG1, s_chdir); - SCM_SYSCALL (ans = chdir (SCM_CHARS (str))); + SCM_ASSERT (SCM_NIMP (str) && SCM_ROSTRINGP (str), str, SCM_ARG1, s_chdir); + SCM_COERCE_SUBSTR (str); + SCM_SYSCALL (ans = chdir (SCM_ROCHARS (str))); if (ans != 0) scm_syserror (s_chdir); return SCM_UNSPECIFIED; @@ -965,9 +980,13 @@ scm_symlink(oldpath, newpath) #ifdef HAVE_SYMLINK int val; - SCM_ASSERT(SCM_NIMP(oldpath) && SCM_STRINGP(oldpath), oldpath, SCM_ARG1, s_symlink); - SCM_ASSERT(SCM_NIMP(newpath) && SCM_STRINGP(newpath), newpath, SCM_ARG2, s_symlink); - SCM_SYSCALL (val = symlink(SCM_CHARS(oldpath), SCM_CHARS(newpath))); + SCM_ASSERT (SCM_NIMP (oldpath) && SCM_ROSTRINGP (oldpath), oldpath, SCM_ARG1, + s_symlink); + SCM_ASSERT (SCM_NIMP (newpath) && SCM_ROSTRINGP (newpath), newpath, SCM_ARG2, + s_symlink); + SCM_COERCE_SUBSTR (oldpath); + SCM_COERCE_SUBSTR (newpath); + SCM_SYSCALL (val = symlink(SCM_ROCHARS(oldpath), SCM_ROCHARS(newpath))); if (val != 0) scm_syserror (s_symlink); return SCM_UNSPECIFIED; @@ -990,10 +1009,12 @@ scm_readlink(path) scm_sizet size = 100; char *buf; SCM result; - SCM_ASSERT (SCM_NIMP (path) && SCM_STRINGP (path), path, (char *) SCM_ARG1, s_readlink); + SCM_ASSERT (SCM_NIMP (path) && SCM_ROSTRINGP (path), path, (char *) SCM_ARG1, + s_readlink); + SCM_COERCE_SUBSTR (path); SCM_DEFER_INTS; buf = scm_must_malloc (size, s_readlink); - while ((rv = readlink (SCM_CHARS (path), buf, (scm_sizet) size)) == size) + while ((rv = readlink (SCM_ROCHARS (path), buf, (scm_sizet) size)) == size) { scm_must_free (buf); size *= 2; @@ -1023,8 +1044,10 @@ scm_lstat(str) int rv; struct stat stat_temp; - SCM_ASSERT(SCM_NIMP(str) && SCM_STRINGP(str), str, (char *)SCM_ARG1, s_lstat); - SCM_SYSCALL(rv = lstat(SCM_CHARS(str), &stat_temp)); + SCM_ASSERT (SCM_NIMP (str) && SCM_ROSTRINGP (str), str, (char *) SCM_ARG1, + s_lstat); + SCM_COERCE_SUBSTR (str); + SCM_SYSCALL(rv = lstat(SCM_ROCHARS(str), &stat_temp)); if (rv != 0) { int en = errno; diff --git a/libguile/ioext.c b/libguile/ioext.c index 255393a7d..a18654097 100644 --- a/libguile/ioext.c +++ b/libguile/ioext.c @@ -206,6 +206,9 @@ scm_freopen (filename, modes, port) SCM_ARG1, s_freopen); SCM_ASSERT (SCM_NIMP (modes) && SCM_ROSTRINGP (modes), modes, SCM_ARG2, s_freopen); + + SCM_COERCE_SUBSTR (filename); + SCM_COERCE_SUBSTR (modes); SCM_DEFER_INTS; SCM_ASSERT (SCM_NIMP (port) && SCM_FPORTP (port), port, SCM_ARG3, s_freopen); SCM_SYSCALL (f = freopen (SCM_ROCHARS (filename), SCM_ROCHARS (modes), @@ -247,6 +250,8 @@ scm_duplicate_port (oldpt, modes) s_duplicate_port); SCM_ASSERT (SCM_NIMP (modes) && SCM_ROSTRINGP (modes), modes, SCM_ARG2, s_duplicate_port); + + SCM_COERCE_SUBSTR (modes); SCM_NEWCELL (newpt); SCM_DEFER_INTS; oldfd = fileno ((FILE *)SCM_STREAM (oldpt)); @@ -346,6 +351,7 @@ scm_fdopen (fdes, modes) SCM_ASSERT (SCM_INUMP (fdes), fdes, SCM_ARG1, s_fdopen); SCM_ASSERT (SCM_NIMP (modes) && SCM_ROSTRINGP (modes), modes, SCM_ARG2, s_fdopen); + SCM_COERCE_SUBSTR (modes); SCM_NEWCELL (port); SCM_DEFER_INTS; f = fdopen (SCM_INUM (fdes), SCM_ROCHARS (modes)); diff --git a/libguile/net_db.c b/libguile/net_db.c index bb73295fd..c89a1f1ee 100644 --- a/libguile/net_db.c +++ b/libguile/net_db.c @@ -174,6 +174,7 @@ scm_gethost (name) } else if (SCM_NIMP (name) && SCM_ROSTRINGP (name)) { + SCM_COERCE_SUBSTR (name); SCM_DEFER_INTS; entry = gethostbyname (SCM_ROCHARS (name)); } @@ -225,6 +226,7 @@ scm_getnet (name) } else if (SCM_NIMP (name) && SCM_ROSTRINGP (name)) { + SCM_COERCE_SUBSTR (name); SCM_DEFER_INTS; entry = getnetbyname (SCM_ROCHARS (name)); } @@ -264,6 +266,7 @@ scm_getproto (name) } else if (SCM_NIMP (name) && SCM_ROSTRINGP (name)) { + SCM_COERCE_SUBSTR (name); SCM_DEFER_INTS; entry = getprotobyname (SCM_ROCHARS (name)); } @@ -321,8 +324,10 @@ scm_getserv (name, proto) return scm_return_entry (entry); } SCM_ASSERT (SCM_NIMP (proto) && SCM_ROSTRINGP (proto), proto, SCM_ARG2, s_getserv); + SCM_COERCE_SUBSTR (proto); if (SCM_NIMP (name) && SCM_ROSTRINGP (name)) { + SCM_COERCE_SUBSTR (name); SCM_DEFER_INTS; entry = getservbyname (SCM_ROCHARS (name), SCM_ROCHARS (proto)); } diff --git a/libguile/ports.c b/libguile/ports.c index 0126c2f25..6a474900c 100644 --- a/libguile/ports.c +++ b/libguile/ports.c @@ -815,9 +815,10 @@ SCM scm_sys_make_void_port (mode) SCM mode; { - SCM_ASSERT (SCM_NIMP (mode) && SCM_STRINGP (mode), mode, + SCM_ASSERT (SCM_NIMP (mode) && SCM_ROSTRINGP (mode), mode, SCM_ARG1, s_sys_make_void_port); + SCM_COERCE_SUBSTR (mode); return scm_void_port (SCM_ROCHARS (mode)); } diff --git a/libguile/posix.c b/libguile/posix.c index b511179c1..f0edefa6a 100644 --- a/libguile/posix.c +++ b/libguile/posix.c @@ -352,6 +352,7 @@ scm_getgrgid (name) { SCM_ASSERT (SCM_NIMP (name) && SCM_ROSTRINGP (name), name, SCM_ARG1, s_getgrgid); + SCM_COERCE_SUBSTR (name); SCM_SYSCALL (entry = getgrnam (SCM_ROCHARS (name))); } if (!entry) @@ -972,9 +973,10 @@ scm_utime (pathname, actime, modtime) int rv; struct utimbuf utm_tmp; - SCM_ASSERT (SCM_NIMP (pathname) && SCM_STRINGP (pathname), pathname, + SCM_ASSERT (SCM_NIMP (pathname) && SCM_ROSTRINGP (pathname), pathname, SCM_ARG1, s_utime); + SCM_COERCE_SUBSTR (pathname); if (SCM_UNBNDP (actime)) SCM_SYSCALL (time (&utm_tmp.actime)); else @@ -985,7 +987,7 @@ scm_utime (pathname, actime, modtime) else utm_tmp.modtime = scm_num2ulong (modtime, (char *) SCM_ARG3, s_utime); - SCM_SYSCALL (rv = utime (SCM_CHARS (pathname), &utm_tmp)); + SCM_SYSCALL (rv = utime (SCM_ROCHARS (pathname), &utm_tmp)); if (rv != 0) scm_syserror (s_utime); return SCM_UNSPECIFIED; @@ -1026,12 +1028,13 @@ scm_putenv (str) int rv; char *ptr; - SCM_ASSERT (SCM_NIMP (str) && SCM_STRINGP (str), str, SCM_ARG1, s_putenv); + SCM_ASSERT (SCM_NIMP (str) && SCM_ROSTRINGP (str), str, SCM_ARG1, s_putenv); /* must make a new copy to be left in the environment, safe from gc. */ ptr = malloc (SCM_LENGTH (str) + 1); if (ptr == NULL) scm_memory_error (s_putenv); - strcpy (ptr, SCM_CHARS (str)); + strncpy (ptr, SCM_ROCHARS (str), SCM_LENGTH (str)); + ptr[SCM_LENGTH(str)] = 0; rv = putenv (ptr); if (rv < 0) scm_syserror (s_putenv); @@ -1056,9 +1059,10 @@ scm_setlocale (category, locale) } else { - SCM_ASSERT (SCM_NIMP (locale) && SCM_STRINGP (locale), locale, + SCM_ASSERT (SCM_NIMP (locale) && SCM_ROSTRINGP (locale), locale, SCM_ARG2, s_setlocale); - clocale = SCM_CHARS (locale); + SCM_COERCE_SUBSTR (locale); + clocale = SCM_ROCHARS (locale); } rv = setlocale (SCM_INUM (category), clocale); @@ -1090,6 +1094,7 @@ scm_mknod(path, type, perms, dev) SCM_ASSERT (SCM_NIMP(type) && SCM_SYMBOLP (type), type, SCM_ARG2, s_mknod); SCM_ASSERT (SCM_INUMP (perms), perms, SCM_ARG3, s_mknod); SCM_ASSERT (SCM_INUMP(dev), dev, SCM_ARG4, s_mknod); + SCM_COERCE_SUBSTR (path); p = SCM_CHARS (type); if (strcmp (p, "regular") == 0) diff --git a/libguile/stime.c b/libguile/stime.c index 47e8cae03..897b08ac8 100644 --- a/libguile/stime.c +++ b/libguile/stime.c @@ -245,14 +245,15 @@ setzone (SCM zone, int pos, char *subr) char *buf; /* if zone was supplied, set the environment variable TZ temporarily. */ - SCM_ASSERT (SCM_NIMP (zone) && SCM_STRINGP (zone), zone, pos, subr); + SCM_ASSERT (SCM_NIMP (zone) && SCM_ROSTRINGP (zone), zone, pos, subr); + SCM_COERCE_SUBSTR (zone); buf = malloc (SCM_LENGTH (zone) + 4); if (buf == 0) scm_memory_error (subr); oldtz = getenv ("TZ"); if (oldtz != NULL) oldtz = oldtz - 3; - sprintf (buf, "TZ=%s", SCM_CHARS (zone)); + sprintf (buf, "TZ=%s", SCM_ROCHARS (zone)); if (putenv (buf) < 0) scm_syserror (subr); tzset(); @@ -474,10 +475,11 @@ scm_strftime (format, stime) char *fmt; int len; - SCM_ASSERT (SCM_NIMP (format) && SCM_STRINGP (format), format, SCM_ARG1, + SCM_ASSERT (SCM_NIMP (format) && SCM_ROSTRINGP (format), format, SCM_ARG1, s_strftime); bdtime2c (stime, &t, SCM_ARG2, s_strftime); + SCM_COERCE_SUBSTR (format); fmt = SCM_ROCHARS (format); len = SCM_ROLENGTH (format); @@ -507,6 +509,8 @@ scm_strptime (format, string) SCM_ASSERT (SCM_NIMP (string) && SCM_ROSTRINGP (string), string, SCM_ARG2, s_strptime); + SCM_COERCE_SUBSTR (format); + SCM_COERCE_SUBSTR (string); fmt = SCM_ROCHARS (format); str = SCM_ROCHARS (string); diff --git a/libguile/symbols.h b/libguile/symbols.h index d4808dc8b..ced3dda10 100644 --- a/libguile/symbols.h +++ b/libguile/symbols.h @@ -100,6 +100,9 @@ extern int scm_symhash_dim; #define SCM_SUBSTR_STR(x) (SCM_CDDR (x)) #define SCM_SUBSTR_OFFSET(x) (SCM_CADR (x)) +#define SCM_COERCE_SUBSTR(x) { if (SCM_SUBSTRP (x)) \ + x = scm_makfromstr (SCM_ROCHARS (x), \ + SCM_ROLENGTH (x), 0); } diff --git a/libguile/vports.c b/libguile/vports.c index 89e398e98..b737455af 100644 --- a/libguile/vports.c +++ b/libguile/vports.c @@ -180,11 +180,12 @@ scm_make_soft_port (pv, modes) struct scm_port_table * pt; SCM z; SCM_ASSERT (SCM_NIMP (pv) && SCM_VECTORP (pv) && 5 == SCM_LENGTH (pv), pv, SCM_ARG1, s_make_soft_port); - SCM_ASSERT (SCM_NIMP (modes) && SCM_STRINGP (modes), modes, SCM_ARG2, s_make_soft_port); + SCM_ASSERT (SCM_NIMP (modes) && SCM_ROSTRINGP (modes), modes, SCM_ARG2, s_make_soft_port); + SCM_COERCE_SUBSTR (modes); SCM_NEWCELL (z); SCM_DEFER_INTS; pt = scm_add_to_port_table (z); - SCM_SETCAR (z, scm_tc16_sfport | scm_mode_bits (SCM_CHARS (modes))); + SCM_SETCAR (z, scm_tc16_sfport | scm_mode_bits (SCM_ROCHARS (modes))); SCM_SETPTAB_ENTRY (z, pt); SCM_SETSTREAM (z, pv); SCM_ALLOW_INTS;