ash: simplify "you have mail" code
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 9 Oct 2015 13:52:03 +0000 (15:52 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 9 Oct 2015 13:52:03 +0000 (15:52 +0200)
function                                             old     new   delta
mailtime_hash                                          -       4      +4
redirect                                            1282    1280      -2
mailtime                                              40       -     -40
cmdloop                                              429     378     -51
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 0/2 up/down: 4/-93)             Total: -89 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index 38ff4b62eb5182f0beaa4fd4624dce4b6d4567c7..07e7f621ab7d8e43fa9ded3c587676ab8e7dc43e 100644 (file)
@@ -10029,10 +10029,8 @@ setinputstring(char *string)
 
 #if ENABLE_ASH_MAIL
 
-#define MAXMBOXES 10
-
-/* times of mailboxes */
-static time_t mailtime[MAXMBOXES];
+/* Hash of mtimes of mailboxes */
+static unsigned mailtime_hash;
 /* Set if MAIL or MAILPATH is changed. */
 static smallint mail_var_path_changed;
 
@@ -10048,13 +10046,14 @@ chkmail(void)
        const char *mpath;
        char *p;
        char *q;
-       time_t *mtp;
+       unsigned new_hash;
        struct stackmark smark;
        struct stat statb;
 
        setstackmark(&smark);
        mpath = mpathset() ? mpathval() : mailval();
-       for (mtp = mailtime; mtp < mailtime + MAXMBOXES; mtp++) {
+       new_hash = 0;
+       for (;;) {
                p = path_advance(&mpath, nullstr);
                if (p == NULL)
                        break;
@@ -10068,16 +10067,14 @@ chkmail(void)
 #endif
                q[-1] = '\0';                   /* delete trailing '/' */
                if (stat(p, &statb) < 0) {
-                       *mtp = 0;
                        continue;
                }
-               if (!mail_var_path_changed && statb.st_mtime != *mtp) {
-                       fprintf(
-                               stderr, "%s\n",
-                               pathopt ? pathopt : "you have mail"
-                       );
-               }
-               *mtp = statb.st_mtime;
+               /* Very simplistic "hash": just a sum of all mtimes */
+               new_hash += (unsigned)statb.st_mtime;
+       }
+       if (!mail_var_path_changed && mailtime_hash != new_hash) {
+               mailtime_hash = new_hash;
+               out2str("you have mail\n");
        }
        mail_var_path_changed = 0;
        popstackmark(&smark);