[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 メーリングリストの案内