[#21809] lib/test/unit/ui/tk/testrunner.rb — Kazuhiro NISHIYAMA <zn@...>
西山和広です。
永井@知能.九工大です.
なかだです。
永井@知能.九工大です.
なかだです。
永井@知能.九工大です.
なかだです。
こんにちは、なかむら(う)です。
永井@知能.九工大です.
なかだです。
永井@知能.九工大です.
[#21830] pty on FreeBSD — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#21846] StringIO#path — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#21876] get_last_error or getLastError by DL::Importable — Take_tk <ggb03124@...>
たけ(tk)です。
[#21883] right hand Regexp — Koji Arai <JCA02266@...>
新井です。
[#21899] core dump in rb_hash_aset — Tanaka Akira <akr@...17n.org>
% ruby -e 'h = {}
まつもと ゆきひろです
In article <1068753744.644627.6908.nullmailer@picachu.netlab.jp>,
[#21932] rough / tabs.rb — Minero Aoki <aamine@...>
青木です。
[#21939] StringIO.new("").read — Tanaka Akira <akr@...17n.org>
ふと気がついたのですが、
[#21942] Zlib::GzipReader#read — Tanaka Akira <akr@...17n.org>
ふと気がついたのですが、
[#21943] IO#read — Tanaka Akira <akr@...17n.org>
ふと。
In article <87u1523sjj.fsf@serein.a02.aist.go.jp>,
なかだです。
In article <200311250059.hAP0xSYw004490@sharui.nakada.kanuma.tochigi.jp>,
[#21946] Re: [ruby-cvs] ruby, ruby/lib, ruby/test/fileutils: * lib/fileutils.rb (fu_same?): check by inode instead of path name, to detect two hard links pointing to the same content. — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
Siena. です。
青木です。それにしても凄い Subject だ。
[#22000] purge pthread at configure — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#22013] HTTP_PROXY — Tanaka Akira <akr@...17n.org>
ふと
[#22025] --enable-pthread on FreeBSD — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#22042] ENV["path"].tainted? — Tanaka Akira <akr@...17n.org>
ENV["path"] の値が
まつもと ゆきひろです
In article <1069748137.095435.3356.nullmailer@picachu.netlab.jp>,
斜め読みですが、
まつもと ゆきひろです
In message <1070234162.951847.24883.nullmailer@picachu.netlab.jp>
[#22057] drb/drb.rb document — Minero Aoki <aamine@...>
青木です。
[#22071] Dir.glob と Shjift_JIS について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
はじめまして。山本といいます。
Siena. です。
> 山本さんのパッチがうまく当たらず手パッチしたので、念のため何度か
Siena. です。
こんにちは、山本です。
山本です。
山本です。
山本です。
山本です。glob_helperをリファクタリングしてみました。
なかだです。
山本です。
なかだです。
山本です。
Siena. です。
山本です。
山本です。
まつもと ゆきひろです
山本です。
山本です。パッチを送ります。
山本です。
山本です。
山本です。
山本です。
まつもと ゆきひろです
>すいません。パッチを出す時にはいつもどの時点のソースに対する
まつもと ゆきひろです
>|すみません、1.8.1に対してです。
まつもと ゆきひろです
こんにちは、山本です。
まつもと ゆきひろです
山本です。
山本です。
山本です。[ruby-dev:22470]にバグがあったので修正しました。
>山本です。[ruby-dev:22470]にバグがあったので修正しました。
まつもと ゆきひろです
山本です。
山本です。
In message <20040102230135.027CDAF8.ocean@m2.ccsnet.ne.jp>
山本です。
まつもと ゆきひろです
山本です。
山本です。
山本です。
なかだです。
山本です。
なかだです。
山本です。
[ruby-dev:22087] Re: Dir.glob と Shjift_JIS について
こんにちは、山本です。
前のパッチはポインタ加算しか考えてなかった上に、後で見ると見落としがありました。
今度のパッチは、ポインタ加算、文字比較、代入でマルチバイトを考慮しました。
ソース中の char* は、常に SingleByte か LeadByte を指しているはずなので、
SingleByte 集合と LeadByte 集合は排他なので(ANSI文字はそうですよね?間違ってるかも)
*p == '/' とか SingleByte との比較はそのままで問題ないと思います。
Siena さんのスクリプトは期待どうりに動作してるようです。うまく動いて
興奮してますが、またとんでもない見落としがあるかもしれません。
--- e:\dir.c Mon Jun 23 17:49:48 2003
+++ dir.c Sun Nov 30 17:03:22 2003
@@ -70,16 +70,92 @@
#define FNM_NOMATCH 1
#define FNM_ERROR 2
-#define downcase(c) (nocase && ISUPPER(c) ? tolower(c) : (c))
+#define downcase(c) (nocase && ISUPPER(c) ? tolower(c) : (c)) /* use for single byte */
-#ifndef CharNext /* defined as CharNext[AW] on Windows. */
-# if defined(DJGPP)
+#ifdef CharNext /* defined as CharNext[AW] on Windows. */
+# define DIR_C_USE_MULTI_BYTE
+#else
+# if defined(DJGPP) || defined(__EMX__)
# define CharNext(p) ((p) + mblen(p, MB_CUR_MAX))
+# define DIR_C_USE_MULTI_BYTE
# else
# define CharNext(p) ((p) + 1)
# endif
#endif
+#ifndef DIR_C_USE_MULTI_BYTE
+# define Next(p) ((p) + 1)
+# define Inc(p) (++(p))
+# define IncLater(p) ((p)++)
+# define Assign(dst, src) (*(dst) = *(src))
+# define Compare(p1, p2) (downcase(*(p1)) < downcase(*(p2)) ? -1 : downcase(*(p1)) > downcase(*(p2)) ? 1 : 0)
+# define find_char(s, c) strchr(s, c)
+#else /* DIR_C_USE_MULTI_BYTE */
+# define Next(p)(CharNext(p))
+# define Inc(p) (p = CharNext(p))
+
+static const char*
+IncLaterImpl(p)
+ const char **p;
+{
+ const char *t = *p;
+ *p = CharNext(*p);
+ return t;
+}
+
+# define IncLater(p) (IncLaterImpl(&(p)))
+# define Assign(dst, src) (memcpy(dst, src, CharNext(src) - src))
+
+static int
+CompareImpl(p1, p2, nocase)
+ const char* p1;
+ const char* p2;
+ int nocase;
+{
+ const int len1 = CharNext(p1) - p1;
+ const int len2 = CharNext(p2) - p2;
+
+ if (len1 < len2)
+ {
+ return -1;
+ }
+ else if (len1 > len2)
+ {
+ return 1;
+ }
+ else if (len1 == 1)
+ {
+ const char c1 = downcase(*p1);
+ const char c2 = downcase(*p2);
+
+ return c1 < c2 ? -1 : c1 > c2 ? 1 : 0;
+ }
+ else
+ {
+ return strncmp(p1, p2, len1);
+ }
+}
+
+# define Compare(p1, p2) (CompareImpl(p1, p2, nocase))
+
+static const char*
+find_char(s, c)
+ const char* s;
+ char c;
+{
+ while (*s) {
+ if (*s == c)
+ return s;
+ s = CharNext(s);
+ }
+ return 0;
+}
+
+#endif /* DIR_C_USE_MULTI_BYTE */
+
+///////////////
+
+
#if defined DOSISH
#define isdirsep(c) ((c) == '/' || (c) == '\\')
static const char *
@@ -101,7 +177,7 @@
static char *
range(pat, test, flags)
char *pat;
- char test;
+ char *test;
int flags;
{
int not, ok = 0;
@@ -110,97 +186,95 @@
not = *pat == '!' || *pat == '^';
if (not)
- pat++;
-
- test = downcase(test);
+ Inc(pat);
while (*pat) {
- int cstart, cend;
- cstart = cend = *pat++;
- if (cstart == ']')
+ char *pstart, *pend;
+ pstart = pend = IncLater(pat);
+ if (*pstart == ']')
return ok == not ? 0 : pat;
- else if (escape && cstart == '\\')
- cstart = cend = *pat++;
- if (*pat == '-' && pat[1] != ']') {
- if (escape && pat[1] == '\\')
- pat++;
- cend = pat[1];
- if (!cend)
+ else if (escape && *pstart == '\\')
+ pstart = pend = IncLater(pat);
+ if (*pat == '-' && *Next(pat) != ']') {
+ if (escape && *Next(pat) == '\\')
+ Inc(pat);
+ pend = Next(pat);
+ if (!*pend)
return 0;
- pat += 2;
+ Inc(pat); Inc(pat);
}
- if (downcase(cstart) <= test && test <= downcase(cend))
+ if (Compare(pstart, test) <= 0 && Compare(test, pend) <= 0)
ok = 1;
}
return 0;
}
#define ISDIRSEP(c) (pathname && isdirsep(c))
-#define PERIOD(s) (period && *(s) == '.' && \
- ((s) == string || ISDIRSEP((s)[-1])))
+#define PERIOD_S() (period && *s == '.' && \
+ (s == string || ISDIRSEP(s_prev)))
+#define INC_S() (s = Next(s_prev = s))
static int
fnmatch(pat, string, flags)
const char *pat;
const char *string;
int flags;
{
- int c;
- int test;
- const char *s = string;
+ const char *p;
+ const char *test;
+ const char *s = string, *s_prev;
int escape = !(flags & FNM_NOESCAPE);
int pathname = flags & FNM_PATHNAME;
int period = !(flags & FNM_DOTMATCH);
int nocase = flags & FNM_CASEFOLD;
- while (c = *pat++) {
- switch (c) {
+ while (*(p = IncLater(pat))) {
+ switch (*p) {
case '?':
- if (!*s || ISDIRSEP(*s) || PERIOD(s))
+ if (!*s || ISDIRSEP(*s) || PERIOD_S())
return FNM_NOMATCH;
- s++;
+ INC_S();
break;
case '*':
- while ((c = *pat++) == '*')
+ while (*(p = IncLater(pat)) == '*')
;
- if (PERIOD(s))
+ if (PERIOD_S())
return FNM_NOMATCH;
- if (!c) {
+ if (!*p) {
if (pathname && find_dirsep(s))
return FNM_NOMATCH;
else
return 0;
}
- else if (ISDIRSEP(c)) {
+ else if (ISDIRSEP(*p)) {
s = find_dirsep(s);
if (s) {
- s++;
+ INC_S();
break;
}
return FNM_NOMATCH;
}
- test = escape && c == '\\' ? *pat : c;
- test = downcase(test);
- pat--;
+ test = escape && *p == '\\' ? pat : p;
+ pat = p;
while (*s) {
- if ((c == '[' || downcase(*s) == test) &&
+ if ((*p == '[' || Compare(s, test) == 0) &&
!fnmatch(pat, s, flags | FNM_DOTMATCH))
return 0;
else if (ISDIRSEP(*s))
break;
- s++;
+ INC_S();
}
return FNM_NOMATCH;
case '[':
- if (!*s || ISDIRSEP(*s) || PERIOD(s))
+ if (!*s || ISDIRSEP(*s) || PERIOD_S())
return FNM_NOMATCH;
- pat = range(pat, *s, flags);
+ pat = range(pat, s, flags);
if (!pat)
return FNM_NOMATCH;
- s++;
+ INC_S();
break;
case '\\':
@@ -209,23 +283,23 @@
&& *pat && strchr("*?[\\", *pat)
#endif
) {
- c = *pat;
- if (!c)
- c = '\\';
+ p = pat;
+ if (!*p)
+ p = "\\"; /* point to embeded string */
else
- pat++;
+ Inc(pat);
}
/* FALLTHROUGH */
default:
#if defined DOSISH
- if (ISDIRSEP(c) && isdirsep(*s))
+ if (ISDIRSEP(*p) && isdirsep(*s))
;
else
#endif
- if(downcase(c) != downcase(*s))
+ if(Compare(p, s) != 0)
return FNM_NOMATCH;
- s++;
+ INC_S();
break;
}
}
@@ -569,13 +643,12 @@
char *s, *send;
int flags;
{
- register char *p = s;
- register char c;
+ char *p;
int open = 0;
int escape = !(flags & FNM_NOESCAPE);
- while ((c = *p++) != '\0') {
- switch (c) {
+ while (*(p = IncLater(s)) != '\0') {
+ switch (*p) {
case '?':
case '*':
return Qtrue;
@@ -589,11 +662,11 @@
continue;
case '\\':
- if (escape && *p++ == '\0')
+ if (escape && *IncLater(s) == '\0')
return Qfalse;
}
- if (send && p >= send) break;
+ if (send && s >= send) break;
}
return Qfalse;
}
@@ -605,18 +678,26 @@
char *alloc;
int len;
+ char *prev2 = 0;
+ char *prev1 = 0;
+ char *cur;
+
len = pend - p;
alloc = ALLOC_N(char, len+1);
memcpy(alloc, p, len);
- if (len > 1 && pend[-1] == '/'
+ alloc[len] = 0;
+
+ for (cur = alloc; cur != alloc + len; Inc(cur)) {
+ prev2 = prev1;
+ prev1 = cur;
+ }
+
+ if (prev2 && *prev1 == '/'
#if defined DOSISH_DRIVE_LETTER
- && pend[-2] != ':'
+ && *prev2 != ':'
#endif
) {
- alloc[len-1] = 0;
- }
- else {
- alloc[len] = 0;
+ *prev1 = 0;
}
return alloc;
@@ -628,7 +709,7 @@
{
char *pend;
- pend = strchr(path, '/');
+ pend = find_char(path, '/');
if (!pend) pend = path + strlen(path);
return extract_path(path, pend);
@@ -643,13 +724,14 @@
while (p < pend) {
if (*p == '\\') {
- if (++p == pend) break;
+ if (Inc(p) == pend) break;
}
- *t++ = *p++;
+ Assign(t, p); Inc(t); Inc(p);
}
*t = '\0';
}
+
#ifndef S_ISDIR
# define S_ISDIR(m) ((m & S_IFMT) == S_IFDIR)
#endif
@@ -720,8 +802,8 @@
}
while (p && !status) {
- if (*p == '/') p++;
- m = strchr(p, '/');
+ if (*p == '/') Inc(p);
+ m = find_char(p, '/');
if (has_magic(p, m, flags)) {
char *dir, *base, *magic, *buf;
DIR *dirp;
@@ -769,7 +851,7 @@
}
#if defined DOSISH_DRIVE_LETTER
-#define BASE (*base && !((isdirsep(*base) && !base[1]) || (base[1] == ':' && isdirsep(base[2]) && !base[3])))
+#define BASE (*base && !((isdirsep(*base) && !base[1]) || (ISALPHA(*base) && base[1] == ':' && isdirsep(base[2]) && !base[3])))
#else
#define BASE (*base && !(isdirsep(*base) && !base[1]))
#endif
@@ -918,7 +1000,7 @@
lbrace = p;
break;
}
- p++;
+ Inc(p);
}
while (*p) {
if (*p == '{') nest++;
@@ -926,7 +1008,7 @@
rbrace = p;
break;
}
- p++;
+ Inc(p);
}
if (lbrace && rbrace) {
@@ -936,13 +1018,13 @@
b = buf + (lbrace-s);
p = lbrace;
while (*p != '}') {
- t = p + 1;
- for (p = t; *p!='}' && *p!=','; p++) {
+ t = Next(p);
+ for (p = t; *p!='}' && *p!=','; Inc(p)) {
/* skip inner braces */
- if (*p == '{') while (*p!='}') p++;
+ if (*p == '{') while (*p!='}') Inc(p);
}
memcpy(b, t, p-t);
- strcpy(b+(p-t), rbrace+1);
+ strcpy(b+(p-t), Next(rbrace));
push_braces(ary, buf, flags);
}
free(buf);
@@ -980,15 +1062,15 @@
while (p < pend) {
t = buf;
nest = maxnest = 0;
- while (p < pend && isdelim(*p)) p++;
+ while (p < pend && isdelim(*p)) Inc(p);
while (p < pend && !isdelim(*p)) {
if (*p == '{') nest++, maxnest++;
if (*p == '}') nest--;
if (!noescape && *p == '\\') {
- *t++ = *p++;
+ Assign(t, p); Inc(t); Inc(p);
if (p == pend) break;
}
- *t++ = *p++;
+ Assign(t, p); Inc(t); Inc(p);
}
*t = '\0';
if (maxnest == 0) {