From: "H.Yamamoto" Date: 2003-12-01T16:56:25+09:00 Subject: [ruby-dev:22104] Re: Dir.glob と Shjift_JIS について This is a multi-part message in MIME format. ------=_NextPart_000_009C_01C3B82B.DF44ABF0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit 山本です。 CSV Stable Snapshot をコンパイルしようとしたのですが、 parse.c がないため BCB5 ではコンパイルできませんでした。 添付してもらえるとありがたいです。 (今、ruby1.8.0release + dir.c(csv stable) でテストしています) あと、なかむら(う)さんのパッチと、[ruby-dev:22098] の修正と、あと CompareImpl の strncmp を memcmp に変更したのをまとめて 添付ファイルとして送ります。 mblen のほうも Win2000(BCB5)では動作しました。(Windowsもこっちでいいかも) ------=_NextPart_000_009C_01C3B82B.DF44ABF0 Content-Type: application/octet-stream; name="dir.c.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="dir.c.diff" --- dir.c Sat Nov 22 12:59:18 2003=0A= +++ ruby-1.8.0\dir.c Mon Dec 1 16:34:52 2003=0A= @@ -77,11 +77,78 @@ char *strchr _((char*,char));=0A= =0A= -#define downcase(c) (nocase && ISUPPER(c) ? tolower(c) : (c))=0A= +#define downcase(c) (nocase && ISUPPER(c) ? tolower(c) : (c)) /* use = for single byte */=0A= =0A= -#ifndef CharNext /* defined as CharNext[AW] on Windows. */=0A= -# if defined(DJGPP)=0A= -# define CharNext(p) ((p) + mblen(p, MB_CUR_MAX))=0A= -# else=0A= -# define CharNext(p) ((p) + 1)=0A= -# endif=0A= -#endif=0A= +#if defined(_WIN32)=0A= +# define Next(p) (*(p) ? CharNext(p) : (p) + 1)=0A= +#elif defined(DJGPP) || defined(__EMX__)=0A= +# define Next(p) (*(p) ? (p) + mblen(p, INT_MAX) : (p) + 1)=0A= +#endif=0A= +=0A= +#ifndef Next /* single byte environment */=0A= +# define Next(p) ((p) + 1)=0A= +# define Inc(p) (++(p))=0A= +# define IncLater(p) ((p)++)=0A= +# define CopyAndInc(dst, src) (*(dst)++ =3D *(src)++)=0A= +# define Compare(p1, p2) (((int)downcase(*(p1))) - = ((int)downcase(*(p2))))=0A= +# define find_char(s, c) strchr(s, c)=0A= +#else /* multi byte environment */=0A= +# define Inc(p) (p =3D Next(p))=0A= +# define IncLater(p) (IncLaterImpl(&(p)))=0A= +# define CopyAndInc(dst, src) (CopyAndIncImpl(&(dst), &(src)))=0A= +# define Compare(p1, p2) (CompareImpl(p1, p2, nocase))=0A= +static char *=0A= +IncLaterImpl(pp)=0A= + char **pp;=0A= +{=0A= + char *t =3D *pp;=0A= + Inc(*pp);=0A= + return t;=0A= +}=0A= +=0A= +static void=0A= +CopyAndIncImpl(pdst, psrc)=0A= + char **pdst;=0A= + const char **psrc;=0A= +{=0A= + const int len =3D Next(*psrc) - *psrc;=0A= + memcpy(*pdst, *psrc, len);=0A= + (*pdst) +=3D len;=0A= + (*psrc) +=3D len;=0A= +}=0A= +=0A= +static int=0A= +CompareImpl(p1, p2, nocase)=0A= + const char *p1;=0A= + const char *p2;=0A= + int nocase;=0A= +{=0A= + const int len1 =3D Next(p1) - p1;=0A= + const int len2 =3D Next(p2) - p2;=0A= +=0A= + if (len1 < len2) {=0A= + return -1;=0A= + }=0A= + else if (len1 > len2) {=0A= + return 1;=0A= + }=0A= + else if (len1 =3D=3D 1) {=0A= + return ((int)downcase(*p1)) - ((int)downcase(*p2));=0A= + }=0A= + else {=0A= + return memcmp(p1, p2, len1);=0A= + }=0A= +}=0A= +=0A= +static char *=0A= +find_char(s, c)=0A= + const char *s;=0A= + char c;=0A= +{=0A= + while (*s) {=0A= + if (*s =3D=3D c)=0A= + return (char *)s;=0A= + Inc(s);=0A= + }=0A= + return 0;=0A= +}=0A= +#endif /* environment */=0A= =0A= @@ -96,3 +163,3 @@ find_dirsep(s)=0A= return s;=0A= - s =3D CharNext(s);=0A= + s =3D Next(s);=0A= }=0A= @@ -108,3 +175,3 @@ range(pat, test, flags)=0A= char *pat;=0A= - char test;=0A= + char *test;=0A= int flags;=0A= @@ -117,22 +184,20 @@ range(pat, test, flags)=0A= if (not)=0A= - pat++;=0A= -=0A= - test =3D downcase(test);=0A= + Inc(pat);=0A= =0A= while (*pat) {=0A= - int cstart, cend;=0A= - cstart =3D cend =3D *pat++;=0A= - if (cstart =3D=3D ']')=0A= + char *pstart, *pend;=0A= + pstart =3D pend =3D IncLater(pat);=0A= + if (*pstart =3D=3D ']')=0A= return ok =3D=3D not ? 0 : pat;=0A= - else if (escape && cstart =3D=3D '\\')=0A= - cstart =3D cend =3D *pat++;=0A= - if (*pat =3D=3D '-' && pat[1] !=3D ']') {=0A= - if (escape && pat[1] =3D=3D '\\')=0A= - pat++;=0A= - cend =3D pat[1];=0A= - if (!cend)=0A= + else if (escape && *pstart =3D=3D '\\')=0A= + pstart =3D pend =3D IncLater(pat);=0A= + if (*pat =3D=3D '-' && *Next(pat) !=3D ']') {=0A= + if (escape && *Next(pat) =3D=3D '\\')=0A= + Inc(pat);=0A= + pend =3D Next(pat);=0A= + if (!*pend)=0A= return 0;=0A= - pat +=3D 2;=0A= + Inc(pat); Inc(pat);=0A= }=0A= - if (downcase(cstart) <=3D test && test <=3D downcase(cend))=0A= + if (Compare(pstart, test) <=3D 0 && Compare(test, pend) <=3D 0)=0A= ok =3D 1;=0A= @@ -143,4 +208,5 @@ range(pat, test, flags)=0A= #define ISDIRSEP(c) (pathname && isdirsep(c))=0A= -#define PERIOD(s) (period && *(s) =3D=3D '.' && \=0A= - ((s) =3D=3D string || ISDIRSEP((s)[-1])))=0A= +#define PERIOD_S() (period && *s =3D=3D '.' && \=0A= + (s =3D=3D string || ISDIRSEP(*s_prev)))=0A= +#define INC_S() (s =3D Next(s_prev =3D s))=0A= static int=0A= @@ -151,5 +217,5 @@ fnmatch(pat, string, flags)=0A= {=0A= - int c;=0A= - int test;=0A= - const char *s =3D string;=0A= + const char *p;=0A= + const char *test;=0A= + const char *s =3D string, *s_prev;=0A= int escape =3D !(flags & FNM_NOESCAPE);=0A= @@ -159,17 +225,17 @@ fnmatch(pat, string, flags)=0A= =0A= - while (c =3D *pat++) {=0A= - switch (c) {=0A= + while (*(p =3D IncLater(pat))) {=0A= + switch (*p) {=0A= case '?':=0A= - if (!*s || ISDIRSEP(*s) || PERIOD(s))=0A= + if (!*s || ISDIRSEP(*s) || PERIOD_S())=0A= return FNM_NOMATCH;=0A= - s++;=0A= + INC_S();=0A= break;=0A= case '*':=0A= - while ((c =3D *pat++) =3D=3D '*')=0A= + while (*(p =3D IncLater(pat)) =3D=3D '*')=0A= ;=0A= =0A= - if (PERIOD(s))=0A= + if (PERIOD_S())=0A= return FNM_NOMATCH;=0A= =0A= - if (!c) {=0A= + if (!*p) {=0A= if (pathname && find_dirsep(s))=0A= @@ -179,6 +245,6 @@ fnmatch(pat, string, flags)=0A= }=0A= - else if (ISDIRSEP(c)) {=0A= + else if (ISDIRSEP(*p)) {=0A= s =3D find_dirsep(s);=0A= if (s) {=0A= - s++;=0A= + INC_S();=0A= break;=0A= @@ -188,7 +254,6 @@ fnmatch(pat, string, flags)=0A= =0A= - test =3D escape && c =3D=3D '\\' ? *pat : c;=0A= - test =3D downcase(test);=0A= - pat--;=0A= + test =3D escape && *p =3D=3D '\\' ? pat : p;=0A= + pat =3D p;=0A= while (*s) {=0A= - if ((c =3D=3D '[' || downcase(*s) =3D=3D test) &&=0A= + if ((*p =3D=3D '[' || Compare(s, test) =3D=3D 0) &&=0A= !fnmatch(pat, s, flags | FNM_DOTMATCH))=0A= @@ -197,3 +262,3 @@ fnmatch(pat, string, flags)=0A= break;=0A= - s++;=0A= + INC_S();=0A= }=0A= @@ -202,8 +267,8 @@ fnmatch(pat, string, flags)=0A= case '[':=0A= - if (!*s || ISDIRSEP(*s) || PERIOD(s))=0A= + if (!*s || ISDIRSEP(*s) || PERIOD_S())=0A= return FNM_NOMATCH;=0A= - pat =3D range(pat, *s, flags);=0A= + pat =3D range(pat, s, flags);=0A= if (!pat)=0A= return FNM_NOMATCH;=0A= - s++;=0A= + INC_S();=0A= break;=0A= @@ -216,7 +281,7 @@ fnmatch(pat, string, flags)=0A= ) {=0A= - c =3D *pat;=0A= - if (!c)=0A= - c =3D '\\';=0A= + p =3D pat;=0A= + if (!*p)=0A= + p =3D "\\"; /* point to embeded string */=0A= else=0A= - pat++;=0A= + Inc(pat);=0A= }=0A= @@ -226,3 +291,3 @@ fnmatch(pat, string, flags)=0A= #if defined DOSISH=0A= - if (ISDIRSEP(c) && isdirsep(*s))=0A= + if (ISDIRSEP(*p) && isdirsep(*s))=0A= ;=0A= @@ -230,5 +295,5 @@ fnmatch(pat, string, flags)=0A= #endif=0A= - if(downcase(c) !=3D downcase(*s))=0A= + if(Compare(p, s) !=3D 0)=0A= return FNM_NOMATCH;=0A= - s++;=0A= + INC_S();=0A= break;=0A= @@ -576,4 +641,3 @@ has_magic(s, send, flags)=0A= {=0A= - register char *p =3D s;=0A= - register char c;=0A= + char *p;=0A= int open =3D 0;=0A= @@ -581,4 +645,4 @@ has_magic(s, send, flags)=0A= =0A= - while ((c =3D *p++) !=3D '\0') {=0A= - switch (c) {=0A= + while (*(p =3D IncLater(s)) !=3D '\0') {=0A= + switch (*p) {=0A= case '?':=0A= @@ -596,3 +660,3 @@ has_magic(s, send, flags)=0A= case '\\':=0A= - if (escape && *p++ =3D=3D '\0')=0A= + if (escape && *IncLater(s) =3D=3D '\0')=0A= return Qfalse;=0A= @@ -600,3 +664,3 @@ has_magic(s, send, flags)=0A= =0A= - if (send && p >=3D send) break;=0A= + if (send && s >=3D send) break;=0A= }=0A= @@ -612,2 +676,6 @@ extract_path(p, pend)=0A= =0A= + char *prev2 =3D 0;=0A= + char *prev1 =3D 0;=0A= + char *cur;=0A= +=0A= len =3D pend - p;=0A= @@ -615,11 +683,15 @@ extract_path(p, pend)=0A= memcpy(alloc, p, len);=0A= - if (len > 1 && pend[-1] =3D=3D '/'=0A= + alloc[len] =3D 0;=0A= +=0A= + for (cur =3D alloc; cur !=3D alloc + len; Inc(cur)) {=0A= + prev2 =3D prev1;=0A= + prev1 =3D cur;=0A= + }=0A= +=0A= + if (prev2 && *prev1 =3D=3D '/'=0A= #if defined DOSISH_DRIVE_LETTER=0A= - && pend[-2] !=3D ':'=0A= + && *prev2 !=3D ':'=0A= #endif=0A= ) {=0A= - alloc[len-1] =3D 0;=0A= - }=0A= - else {=0A= - alloc[len] =3D 0;=0A= + *prev1 =3D 0;=0A= }=0A= @@ -635,3 +707,3 @@ extract_elem(path)=0A= =0A= - pend =3D strchr(path, '/');=0A= + pend =3D find_char(path, '/');=0A= if (!pend) pend =3D path + strlen(path);=0A= @@ -650,5 +722,5 @@ remove_backslashes(p)=0A= if (*p =3D=3D '\\') {=0A= - if (++p =3D=3D pend) break;=0A= + if (Inc(p) =3D=3D pend) break;=0A= }=0A= - *t++ =3D *p++;=0A= + CopyAndInc(t, p);=0A= }=0A= @@ -657,2 +729,3 @@ remove_backslashes(p)=0A= =0A= +=0A= #ifndef S_ISDIR=0A= @@ -727,4 +800,4 @@ glob_helper(path, sub, flags, func, arg)=0A= while (p && !status) {=0A= - if (*p =3D=3D '/') p++;=0A= - m =3D strchr(p, '/');=0A= + if (*p =3D=3D '/') Inc(p);=0A= + m =3D find_char(p, '/');=0A= if (has_magic(p, m, flags)) {=0A= @@ -776,3 +849,3 @@ glob_helper(path, sub, flags, func, arg)=0A= #if defined DOSISH_DRIVE_LETTER=0A= -#define BASE (*base && !((isdirsep(*base) && !base[1]) || (base[1] = =3D=3D ':' && isdirsep(base[2]) && !base[3])))=0A= +#define BASE (*base && !((isdirsep(*base) && !base[1]) || = (ISALPHA(*base) && base[1] =3D=3D ':' && isdirsep(base[2]) && !base[3])))=0A= #else=0A= @@ -926,3 +999,3 @@ push_braces(ary, s, flags)=0A= }=0A= - p++;=0A= + Inc(p);=0A= }=0A= @@ -934,3 +1007,3 @@ push_braces(ary, s, flags)=0A= }=0A= - p++;=0A= + Inc(p);=0A= }=0A= @@ -944,9 +1017,9 @@ push_braces(ary, s, flags)=0A= while (*p !=3D '}') {=0A= - t =3D p + 1;=0A= - for (p =3D t; *p!=3D'}' && *p!=3D','; p++) {=0A= + t =3D Next(p);=0A= + for (p =3D t; *p!=3D'}' && *p!=3D','; Inc(p)) {=0A= /* skip inner braces */=0A= - if (*p =3D=3D '{') while (*p!=3D'}') p++;=0A= + if (*p =3D=3D '{') while (*p!=3D'}') Inc(p);=0A= }=0A= memcpy(b, t, p-t);=0A= - strcpy(b+(p-t), rbrace+1);=0A= + strcpy(b+(p-t), Next(rbrace));=0A= push_braces(ary, buf, flags);=0A= @@ -988,3 +1061,3 @@ rb_push_glob(str, flags)=0A= nest =3D maxnest =3D 0;=0A= - while (p < pend && isdelim(*p)) p++;=0A= + while (p < pend && isdelim(*p)) Inc(p);=0A= while (p < pend && !isdelim(*p)) {=0A= @@ -993,6 +1066,6 @@ rb_push_glob(str, flags)=0A= if (!noescape && *p =3D=3D '\\') {=0A= - *t++ =3D *p++;=0A= + CopyAndInc(t, p);=0A= if (p =3D=3D pend) break;=0A= }=0A= - *t++ =3D *p++;=0A= + CopyAndInc(t, p);=0A= }=0A= ------=_NextPart_000_009C_01C3B82B.DF44ABF0--