diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-06-12 00:18:30 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-06-12 00:18:30 +0000 |
commit | 2e0e39c6dd28d584dfd3814d2bda021119f32602 (patch) | |
tree | a19db9cc24e2103e07d5cc2f58a781108c7bc204 /win32 | |
parent | 56cecc6025c468c66c12e4a1172060c36f695df5 (diff) | |
download | ruby-2e0e39c6dd28d584dfd3814d2bda021119f32602.tar.gz |
win32.c: rb_dir_getwd_ospath
* win32/win32.c (rb_dir_getwd_ospath): Windows implementation
moved from dir.c. get rid of freeing malloced memory by xfree.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59061 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32')
-rw-r--r-- | win32/win32.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/win32/win32.c b/win32/win32.c index d10081b4ce..a997cb39e4 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -4656,7 +4656,7 @@ clock_getres(clockid_t clock_id, struct timespec *sp) /* License: Ruby's */ static char * -w32_getcwd(char *buffer, int size, UINT cp) +w32_getcwd(char *buffer, int size, UINT cp, void *alloc(int, void *), void *arg) { WCHAR *p; int wlen, len; @@ -4687,7 +4687,7 @@ w32_getcwd(char *buffer, int size, UINT cp) } } else { - buffer = malloc(len); + buffer = (*alloc)(len, arg); if (!buffer) { errno = ENOMEM; return NULL; @@ -4699,17 +4699,42 @@ w32_getcwd(char *buffer, int size, UINT cp) } /* License: Ruby's */ +static void * +getcwd_alloc(int size, void *dummy) +{ + return malloc(size); +} + +/* License: Ruby's */ char * rb_w32_getcwd(char *buffer, int size) { - return w32_getcwd(buffer, size, filecp()); + return w32_getcwd(buffer, size, filecp(), getcwd_alloc, NULL); } /* License: Ruby's */ char * rb_w32_ugetcwd(char *buffer, int size) { - return w32_getcwd(buffer, size, CP_UTF8); + return w32_getcwd(buffer, size, CP_UTF8, getcwd_alloc, NULL); +} + +/* License: Ruby's */ +static void * +getcwd_value(int size, void *arg) +{ + VALUE str = *(VALUE *)arg = rb_utf8_str_new(0, size - 1); + OBJ_TAINT(str); + return RSTRING_PTR(str); +} + +/* License: Ruby's */ +VALUE +rb_dir_getwd_ospath(void) +{ + VALUE cwd = Qnil; + w32_getcwd(NULL, 0, CP_UTF8, getcwd_value, &cwd); + return cwd; } /* License: Artistic or GPL */ |