diff options
author | Michael Gran <spk121@yahoo.com> | 2009-08-20 22:40:15 -0700 |
---|---|---|
committer | Michael Gran <spk121@yahoo.com> | 2009-08-20 22:40:15 -0700 |
commit | 832bbc95a239bdd1f07133be2377d485c3f43034 (patch) | |
tree | 8f0c6bb2fd7340a76b589193c73f367150a4c5ec /libguile/filesys.c | |
parent | 43d5626ce7b51c6f9c06b3a5fe513003778402c8 (diff) | |
download | guile-832bbc95a239bdd1f07133be2377d485c3f43034.tar.gz |
Use string accessors in scm_basename and scm_dirname
* libguile/filesys.c (basename, dirname): don't unpack strings.
Use string accessor functions.
Diffstat (limited to 'libguile/filesys.c')
-rw-r--r-- | libguile/filesys.c | 60 |
1 files changed, 39 insertions, 21 deletions
diff --git a/libguile/filesys.c b/libguile/filesys.c index a2db6996f..c602f6735 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -1573,31 +1573,39 @@ SCM_DEFINE (scm_dirname, "dirname", 1, 0, 0, "component, @code{.} is returned.") #define FUNC_NAME s_scm_dirname { - const char *s; long int i; unsigned long int len; SCM_VALIDATE_STRING (1, filename); - s = scm_i_string_chars (filename); len = scm_i_string_length (filename); i = len - 1; #ifdef __MINGW32__ - while (i >= 0 && (s[i] == '/' || s[i] == '\\')) --i; - while (i >= 0 && (s[i] != '/' && s[i] != '\\')) --i; - while (i >= 0 && (s[i] == '/' || s[i] == '\\')) --i; + while (i >= 0 && (scm_i_string_ref (filename, i) == '/' + || scm_i_string_ref (filename, i) == '\\')) + --i; + while (i >= 0 && (scm_i_string_ref (filename, i) != '/' + && scm_i_string_ref (filename, i) != '\\')) + --i; + while (i >= 0 && (scm_i_string_ref (filename, i) == '/' + || scm_i_string_ref (filename, i) == '\\')) + --i; #else - while (i >= 0 && s[i] == '/') --i; - while (i >= 0 && s[i] != '/') --i; - while (i >= 0 && s[i] == '/') --i; + while (i >= 0 && scm_i_string_ref (filename, i) == '/') + --i; + while (i >= 0 && scm_i_string_ref (filename, i) != '/') + --i; + while (i >= 0 && scm_i_string_ref (filename, i) == '/') + --i; #endif /* ndef __MINGW32__ */ if (i < 0) { #ifdef __MINGW32__ - if (len > 0 && (s[0] == '/' || s[0] == '\\')) + if (len > 0 && (scm_i_string_ref (filename, 0) == '/' + || scm_i_string_ref (filename, 0) == '\\')) #else - if (len > 0 && s[0] == '/') + if (len > 0 && scm_i_string_ref (filename, 0) == '/') #endif /* ndef __MINGW32__ */ return scm_c_substring (filename, 0, 1); else @@ -1616,11 +1624,9 @@ SCM_DEFINE (scm_basename, "basename", 1, 1, 0, "@var{basename}, it is removed also.") #define FUNC_NAME s_scm_basename { - const char *f, *s = 0; int i, j, len, end; SCM_VALIDATE_STRING (1, filename); - f = scm_i_string_chars (filename); len = scm_i_string_length (filename); if (SCM_UNBNDP (suffix)) @@ -1628,32 +1634,44 @@ SCM_DEFINE (scm_basename, "basename", 1, 1, 0, else { SCM_VALIDATE_STRING (2, suffix); - s = scm_i_string_chars (suffix); j = scm_i_string_length (suffix) - 1; } i = len - 1; #ifdef __MINGW32__ - while (i >= 0 && (f[i] == '/' || f[i] == '\\')) --i; + while (i >= 0 && (scm_i_string_ref (filename, i) == '/' + || scm_i_string_ref (filename, i) == '\\')) + --i; #else - while (i >= 0 && f[i] == '/') --i; + while (i >= 0 && scm_i_string_ref (filename, i) == '/') + --i; #endif /* ndef __MINGW32__ */ end = i; - while (i >= 0 && j >= 0 && f[i] == s[j]) --i, --j; + while (i >= 0 && j >= 0 + && (scm_i_string_ref (filename, i) + == scm_i_string_ref (suffix, j))) + { + --i; + --j; + } if (j == -1) end = i; #ifdef __MINGW32__ - while (i >= 0 && f[i] != '/' && f[i] != '\\') --i; + while (i >= 0 && (scm_i_string_ref (filename, i) != '/' + && scm_i_string_ref (filename, i) != '\\')) + --i; #else - while (i >= 0 && f[i] != '/') --i; + while (i >= 0 && scm_i_string_ref (filename, i) != '/') + --i; #endif /* ndef __MINGW32__ */ if (i == end) { #ifdef __MINGW32__ - if (len > 0 && (f[0] == '/' || f[0] == '\\')) + if (len > 0 && (scm_i_string_ref (filename, 0) == '/' + || scm_i_string_ref (filename, 0) == '\\')) #else - if (len > 0 && f[0] == '/') + if (len > 0 && scm_i_string_ref (filename, 0) == '/') #endif /* ndef __MINGW32__ */ - return scm_c_substring (filename, 0, 1); + return scm_c_substring (filename, 0, 1); else return scm_dot_string; } |