From: "H.Yamamoto" Date: 2003-12-13T21:05:26+09:00 Subject: [ruby-dev:22270] Re: Dir.glob とShjift_JIS について 山本です。 remove_backslashes(p)が動いていなかったので修正しました。 あとはMBLEN("")==0に統一したので、CompareImplでその場合に対処。 find_magicが前の'/'から検索しなおしていて非効率になっていたので、 修正しました。 [ruby-dev:22263]に対する差分です。 --- dir.c-22263 Sat Dec 13 16:14:14 2003 +++ dir.c Sat Dec 13 20:59:46 2003 @@ -80,10 +80,8 @@ char *strchr _((char*,char)); +/* caution: MBLEN('\0')==0 and MBLEN(other SB)==1 */ #if defined(CharNext) -# define Next(p) CharNext(p) /* faster */ # define MBLEN(p) (CharNext(p)-(p)) #elif defined(DJGPP) -# define Next(p) ((p) + MBLEN(p)) # define MBLEN(p) mblen(p, MB_CUR_MAX) #elif defined(__EMX__) -# define Next(p) ((p) + MBLEN(p)) static inline int @@ -93,4 +91,3 @@ MBLEN(p) int n = mblen(p, INT_MAX); - if (n <= 0) n = 1; - return n; + return (n < 0) ? 1 : n; } @@ -98,3 +95,4 @@ MBLEN(p) -#ifndef Next /* single byte environment */ +/* caution: between these environments, Next(Inc) has difference in behavior for '\0' */ +#ifndef MBLEN /* single byte environment */ # define Next(p) ((p) + 1) @@ -103,2 +101,3 @@ MBLEN(p) #else /* multi byte environment */ +# define Next(p) ((p) + MBLEN(p)) # define Inc(p) ((p) = Next(p)) @@ -114,4 +113,4 @@ CompareImpl(p1, p2, nocase) - if (len1 == 1) - if (len2 == 1) { + if (len1 <= 1) + if (len2 <= 1) { return compare(downcase(*p1), downcase(*p2)); @@ -123,3 +122,3 @@ CompareImpl(p1, p2, nocase) else - if (len2 == 1) { + if (len2 <= 1) { const int ret = compare(*p1, downcase(*p2)); @@ -615,4 +614,4 @@ dir_s_rmdir(obj, dir) static void -find_magic(s, flags, pbeg, pend) - char *s; +find_magic(p, flags, pbeg, pend) + register char *p; int flags; @@ -621,3 +620,2 @@ find_magic(s, flags, pbeg, pend) { - register char *p = s; register char c; @@ -626,3 +624,3 @@ find_magic(s, flags, pbeg, pend) - *pbeg = s; + *pbeg = p; @@ -631,3 +629,3 @@ find_magic(s, flags, pbeg, pend) case '/': - *pbeg = s = p; + *pbeg = p; continue; @@ -656,3 +654,3 @@ find_magic(s, flags, pbeg, pend) miss: - *pbeg = *pend = --p; + *pbeg = *pend = p-1; return; @@ -660,5 +658,5 @@ find_magic(s, flags, pbeg, pend) found: - while (*s && *s != '/') - Inc(s); - *pend = s; + while (*p && *p != '/') + Inc(p); + *pend = p; } @@ -686,3 +684,2 @@ remove_backslashes(p) { - char *pend = p + strlen(p); char *t = p; @@ -690,18 +687,17 @@ remove_backslashes(p) - while (p < pend) { + while (*p) { if (*p == '\\') { - if (p > s) { - if (s > t) memcpy(t, s, p - s); - t += p - s; - s = p; + if (t != s) { + memmove(t, s, p - s); } - if (++p == pend) break; + t += (p - s); + s = ++p; + if (!*p) break; } - p = Next(p); + Inc(p); } - if (p > s) { - if (s > t) memcpy(t, s, p - s); - t += p - s; + + if (t != s) { + memmove(t, s, p - s + 1); /* move '\0' too */ } - *t = '\0'; }