[Mew-dist 13604] accelarate mewls (on Windows98)
Kyotaro HORIGUCHI
horiguchi.kyotaro at example.com
2000年 7月 11日 (火) 18:24:37 JST
堀口です.
主に mewls での部分表示の高速化です.
1. Cygwin の私の環境では getpwuid が NULL を返すので,
そこをちょっといじっています. 私の環境がおかしい可能性が大な
んですが^^;
2. 部分表示でも時間がかかってつらいのでそこを直してみました.
オリジナルではフォルダ中のすべてのファイルに対して stat して
いますが, 修正後はファイル名で選ばれたファイルにだけ stat して
います. これで私の環境では mewls +ml/Mew 9000 (表示されるのは
16 メッセージ)の所要時間が数分から3秒に縮みました.
添付のパッチは [Mew-dist 13565]は含んでいますが, [Mew-dist
13588]は含んでいません.
--
堀口恭太郎
-------------- next part --------------
--- mewls.c.org Sat Jul 08 13:49:18 2000
+++ mewls.c Tue Jul 11 17:58:34 2000
@@ -1,5 +1,5 @@
#include "config.h"
-#if HAVE_UNISTD_H
+#ifdef HAVE_UNISTD_H
#include <sys/types.h>
#include <unistd.h>
@@ -12,5 +12,5 @@
#include <sys/stat.h>
-#if HAVE_DIRENT_H
+#ifdef HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
@@ -49,13 +49,24 @@
char *
expandfolder(char *fld) {
+ char *home = getenv("HOME");
struct passwd *pw = getpwuid(getuid()); /* xxx */
- int slen = strlen(pw->pw_dir) + strlen(MAILHOME) + strlen(fld) + 3;
- char *p = (char *)malloc(slen);
- char *f = fld;
+ int slen;
+ char *p, *f;
+ if(home == NULL || home[0] == 0) {
+ if(pw == NULL) {
+ perror("failed in getting home directory");
+ exit(EXIT_FAILURE);
+ }
+ home = pw->pw_dir;
+ }
+ slen = strlen(home) + strlen(MAILHOME) + strlen(fld) + 3;
+ p = (char *)malloc(slen);
+ f = fld;
+
if (*f == '+') f++;
-
+
/* xxx */
- sprintf(p, "%s/%s/%s", pw->pw_dir, MAILHOME, f);
+ sprintf(p, "%s/%s/%s", home, MAILHOME, f);
return p;
}
@@ -212,7 +223,4 @@
while ((dp = readdir(dirp)) != NULL) {
fname = dp->d_name;
- stat(fname, &st);
- if (!(st.st_mode & S_IFREG))
- continue;
if (numfile(fname)) {
@@ -231,4 +239,7 @@
for (i = 0; i < n; i++) {
sprintf(fnbuf, "%d", *(list + i));
+ stat(fnbuf, &st);
+ if (!(st.st_mode & S_IFREG))
+ continue;
fp = fopen(fnbuf, "r");
if (fp == NULL) continue;
Mew-dist メーリングリストの案内