diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-26 09:24:56 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-26 09:24:56 +0000 |
commit | c3b10e7fcbc4bc49f5efc30ec4813bf6b586f65a (patch) | |
tree | 430f3189183c373e8666b2fc0d189493c11bf4d5 /file.c | |
parent | 71b059e0703db9406a04d2f7c04a4823a1013ccf (diff) | |
download | ruby-c3b10e7fcbc4bc49f5efc30ec4813bf6b586f65a.tar.gz |
* file.c (BUFCHECK): no resize if enough room.
* file.c (file_expand_path): use BUFCHECK.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16615 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 22 |
1 files changed, 10 insertions, 12 deletions
@@ -2578,13 +2578,13 @@ ntfs_tail(const char *path) #define BUFCHECK(cond) do {\ long bdiff = p - buf;\ - while (cond) {\ - buflen *= 2;\ + if (!(cond)) {\ + do {buflen *= 2;} while (cond);\ + rb_str_resize(result, buflen);\ + buf = RSTRING_PTR(result);\ + p = buf + bdiff;\ + pend = buf + buflen;\ }\ - rb_str_resize(result, buflen);\ - buf = RSTRING_PTR(result);\ - p = buf + bdiff;\ - pend = buf + buflen;\ } while (0) #define BUFINIT() (\ @@ -2731,7 +2731,8 @@ file_expand_path(VALUE fname, VALUE dname, VALUE result) if (p > buf && p[-1] == '/') --p; else { - BUFCHECK(bdiff >= ++buflen); + ++buflen; + BUFCHECK(bdiff >= buflen); *p = '/'; } @@ -2866,7 +2867,6 @@ file_expand_path(VALUE fname, VALUE dname, VALUE result) #endif HANDLE h = FindFirstFile(b, &wfd); if (h != INVALID_HANDLE_VALUE) { - long bdiff; FindClose(h); p = strrdirsep(buf); len = strlen(wfd.cFileName); @@ -2877,10 +2877,8 @@ file_expand_path(VALUE fname, VALUE dname, VALUE result) } #endif if (!p) p = buf; - buflen = ++p - buf + len; - bdiff = p - buf; - rb_str_resize(result, buflen); - p = RSTRING_PTR(result) + bdiff; + ++p; + BUFCHECK(bdiff + len >= buflen); memcpy(p, wfd.cFileName, len + 1); } } |