diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | dir.c | 34 | ||||
-rw-r--r-- | misc/ruby-mode.el | 5 | ||||
-rw-r--r-- | pack.c | 14 | ||||
-rw-r--r-- | win32/dir.h | 4 | ||||
-rw-r--r-- | win32/win32.c | 52 |
6 files changed, 90 insertions, 29 deletions
@@ -1,3 +1,13 @@ +Mon Jan 5 18:58:47 2004 Yukihiro Matsumoto <matz@ruby-lang.org> + + * dir.c: merge tuning from H.Yamamoto <ocean@m2.ccsnet.ne.jp>. + [ruby-dev:22486] + + * pack.c (pack_unpack): unpack requires big endian offet (OFF16B + and OFF32B). The patch is from Minero Aoki in [ruby-dev:22489] + + * pack.c (OFF16B): add big-endian offset again. + Mon Jan 5 03:00:53 2004 Minero Aoki <aamine@loveruby.net> * test/ruby/test_pack.rb: new test test_unpack_N. @@ -235,7 +235,7 @@ fnmatch(pat, string, flags) INC_S(); } return FNM_NOMATCH; - + case '[': if (!*s || ISDIRSEP(*s) || PERIOD_S()) return FNM_NOMATCH; @@ -1041,7 +1041,7 @@ glob_helper(path, sub, separator, flags, func, arg) /* if separator p[-1] is rem } if (p[0] == '*' && p[1] == '*' && p[2] == '/') { - char *t = p+3; + char *t = p + 3; while (t[0] == '*' && t[1] == '*' && t[2] == '/') t += 3; memmove(p, t, strlen(t)+1); /* move '\0' too */ magical = has_magic(p, &m, flags); /* next element */ @@ -1053,7 +1053,7 @@ glob_helper(path, sub, separator, flags, func, arg) /* if separator p[-1] is rem if (dirp == NULL) return 0; } else { - char *t = separator ? p-1 : p; + char *t = separator ? p - 1 : p; char c = *t; *t = '\0'; dirp = do_opendir(path); @@ -1065,23 +1065,29 @@ glob_helper(path, sub, separator, flags, func, arg) /* if separator p[-1] is rem const int n1 = p - path; const int n2 = n1 + NAMLEN(dp); const int ok = 0; - const int no = 1; + const int ln = 1; + const int no = 2; int is_dir = -1; /* not checked yet */ +#ifdef _WIN32 + is_dir = dp->d_isdir ? (dp->d_isrep ? ln : ok) : no; +#endif if (recursive && strcmp(".", dp->d_name) != 0 && strcmp("..", dp->d_name) != 0) { buf = ALLOC_N(char, n2+4+strlen(p)+1); memcpy(buf, path, n1); strcpy(buf+n1, dp->d_name); +#ifndef _WIN32 is_dir = no; if (do_lstat(buf, &st) == 0) { - if (S_ISDIR(st.st_mode)) { - strcpy(buf+n2, "/**/"); - strcpy(buf+n2+4, p); - status = glob_helper(buf, buf+n2+1, 1, flags, func, arg); - is_dir = ok; - } - else if (S_ISLNK(st.st_mode) && do_stat(buf, &st) == 0 && S_ISDIR(st.st_mode)) { - is_dir = ok; - } + if (S_ISDIR(st.st_mode)) + is_dir = ok; + else if (S_ISLNK(st.st_mode) && do_stat(buf, &st) == 0 && S_ISDIR(st.st_mode)) + is_dir = ln; + } +#endif + if (is_dir == ok) { + strcpy(buf+n2, "/**/"); + strcpy(buf+n2+4, p); + status = glob_helper(buf, buf+n2+1, 1, flags, func, arg); } free(buf); if (status) break; @@ -1096,7 +1102,7 @@ glob_helper(path, sub, separator, flags, func, arg) /* if separator p[-1] is rem if (*m == '\0') { status = glob_call_func(func, buf, arg); } - else if (m[1] == '\0' && is_dir == ok) { /* *m == '/' */ + else if (m[1] == '\0' && (is_dir == ok || is_dir == ln)) { /* *m == '/' */ strcpy(buf+n2, "/"); status = glob_call_func(func, buf, arg); } diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el index 631f78f78a..081218c408 100644 --- a/misc/ruby-mode.el +++ b/misc/ruby-mode.el @@ -964,7 +964,10 @@ balanced expression is found." ;; get current method (or class/module) (if (re-search-backward (concat "^[ \t]*\\(def\\|class\\|module\\)[ \t]+" - "\\(" ruby-symbol-re "+\\)") + "\\(" + ;; \\. for class method + "\\(" ruby-symbol-re "\\|\\." "\\)" + "+\\)") nil t) (progn (setq mlist (list (match-string 2))) @@ -22,12 +22,14 @@ #endif #ifdef NATINT_PACK +# define OFF16B(p) ((char*)(p) + (natint?0:(sizeof(short) - SIZE16))) +# define OFF32B(p) ((char*)(p) + (natint?0:(sizeof(long) - SIZE32))) # define NATINT_I32(x) (natint?NUM2LONG(x):(NUM2I32(x))) # define NATINT_U32(x) (natint?NUM2ULONG(x):(NUM2U32(x))) # define NATINT_LEN(type,len) (natint?sizeof(type):(len)) # ifdef WORDS_BIGENDIAN -# define OFF16(p) ((char*)(p) + (natint?0:(sizeof(short) - SIZE16))) -# define OFF32(p) ((char*)(p) + (natint?0:(sizeof(long) - SIZE32))) +# define OFF16(p) OFF16B(p) +# define OFF32(p) OFF32B(p) # endif # define NATINT_HTOVS(x) (natint?htovs(x):htov16(x)) # define NATINT_HTOVL(x) (natint?htovl(x):htov32(x)) @@ -47,6 +49,10 @@ # define OFF16(p) (char*)(p) # define OFF32(p) (char*)(p) #endif +#ifndef OFF16B +# define OFF16B(p) (char*)(p) +# define OFF32B(p) (char*)(p) +#endif #define define_swapx(x, xtype) \ static xtype \ @@ -1648,7 +1654,7 @@ pack_unpack(str, fmt) PACK_LENGTH_ADJUST(unsigned short,2); while (len-- > 0) { unsigned short tmp = 0; - memcpy(OFF16(&tmp), s, NATINT_LEN(unsigned short,2)); + memcpy(OFF16B(&tmp), s, NATINT_LEN(unsigned short,2)); s += NATINT_LEN(unsigned short,2); rb_ary_push(ary, UINT2NUM(ntohs(tmp))); } @@ -1659,7 +1665,7 @@ pack_unpack(str, fmt) PACK_LENGTH_ADJUST(unsigned long,4); while (len-- > 0) { unsigned long tmp = 0; - memcpy(OFF32(&tmp), s, NATINT_LEN(unsigned long,4)); + memcpy(OFF32B(&tmp), s, NATINT_LEN(unsigned long,4)); s += NATINT_LEN(unsigned long,4); rb_ary_push(ary, ULONG2NUM(ntohl(tmp))); } diff --git a/win32/dir.h b/win32/dir.h index fdea6393c8..8345e346b3 100644 --- a/win32/dir.h +++ b/win32/dir.h @@ -10,6 +10,8 @@ struct direct long d_namlen; ino_t d_ino; char d_name[256]; + char d_isdir; /* directory */ + char d_isrep; /* reparse point */ char d_isdir; }; typedef struct { @@ -17,6 +19,8 @@ typedef struct { char *curr; long size; long nfiles; + char *bits; /* used for d_isdir and d_isrep */ + long bitpos; /* used for d_isdir and d_isrep */ struct direct dirstr; char *bits; long bitpos; diff --git a/win32/win32.c b/win32/win32.c index 5ea7eccb1a..d592ba6b8b 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -1323,6 +1323,9 @@ make_cmdvector(const char *cmd, char ***vec) // return the pointer to the current file name. // +#define GetBit(bits, i) ((bits)[(i) / 8] & (1 << (i) % 8)) +#define SetBit(bits, i) ((bits)[(i) / 8] |= (1 << (i) % 8)) + DIR * rb_w32_opendir(const char *filename) { @@ -1332,8 +1335,8 @@ rb_w32_opendir(const char *filename) char scannamespc[PATHLEN]; char *scanname = scannamespc; struct stat sbuf; - struct _finddata_t fd; - long fh; + WIN32_FIND_DATA fd; + HANDLE fh; // // check to see if we've got a directory @@ -1371,8 +1374,8 @@ rb_w32_opendir(const char *filename) // do the FindFirstFile call // - fh = _findfirst(scanname, &fd); - if (fh == -1) { + fh = FindFirstFile(scanname, &fd); + if (fh == INVALID_HANDLE_VALUE) { return NULL; } @@ -1381,9 +1384,15 @@ rb_w32_opendir(const char *filename) // filenames that we find. // - idx = strlen(fd.name)+1; + idx = strlen(fd.cFileName)+1; p->start = ALLOC_N(char, idx); - strcpy(p->start, fd.name); + strcpy(p->start, fd.cFileName); + p->bits = ALLOC_N(char, 1); + p->bits[0] = 0; + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + SetBit(p->bits, 0); + if (fd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + SetBit(p->bits, 1); p->bits = ALLOC_N(char, 1); p->bits[0] = fd.attrib & _A_SUBDIR ? 1 : 0; p->nfiles++; @@ -1394,8 +1403,8 @@ rb_w32_opendir(const char *filename) // the variable idx should point one past the null terminator // of the previous string found. // - while (_findnext(fh, &fd) == 0) { - len = strlen(fd.name); + while (FindNextFile(fh, &fd)) { + len = strlen(fd.cFileName); // // bump the string table size by enough for the @@ -1408,7 +1417,20 @@ rb_w32_opendir(const char *filename) if (p->start == NULL) { rb_fatal ("opendir: malloc failed!\n"); } - strcpy(&p->start[idx], fd.name); + strcpy(&p->start[idx], fd.cFileName); + + if (p->nfiles % 4 == 0) { + Renew (p->bits, p->nfiles / 4 + 1, char); + if (p->bits == NULL) { + rb_fatal ("opendir: malloc failed!\n"); + } + p->bits[p->nfiles / 4] = 0; + } + if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + SetBit(p->bits, p->nfiles * 2); + if (fd.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + SetBit(p->bits, p->nfiles * 2 + 1); + if (p->nfiles % 8 == 0) { Renew (p->bits, p->nfiles / 8 + 1, char); @@ -1424,7 +1446,7 @@ rb_w32_opendir(const char *filename) p->nfiles++; idx += len+1; } - _findclose(fh); + FindClose(fh); p->size = idx; p->curr = p->start; return p; @@ -1464,6 +1486,14 @@ rb_w32_readdir(DIR *dirp) dirp->bitpos++; // + // Attributes + // + dirp->dirstr.d_isdir = GetBit(dirp->bits, dirp->bitpos); + dirp->bitpos++; + dirp->dirstr.d_isrep = GetBit(dirp->bits, dirp->bitpos); + dirp->bitpos++; + + // // Now set up for the next call to readdir // @@ -1507,6 +1537,7 @@ rb_w32_rewinddir(DIR *dirp) { dirp->curr = dirp->start; dirp->bitpos = 0; + dirp->bitpos = 0; } // @@ -1516,6 +1547,7 @@ rb_w32_rewinddir(DIR *dirp) void rb_w32_closedir(DIR *dirp) { + free(dirp->bits); free(dirp->start); free(dirp->bits); free(dirp); |