home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume11 / mush5.7 / part02 / sort.c < prev   
Encoding:
C/C++ Source or Header  |  1987-09-16  |  5.0 KB  |  199 lines

  1. /* signals.c 1.1    (c) copyright 1986 (Dan Heller) */
  2.  
  3. #include "mush.h"
  4. /* #define MYQSORT */
  5.  
  6. static int order;
  7. static jmp_buf sortbuf;
  8.  
  9. sort(argc, argv, list)
  10. register int argc;
  11. register char *argv[], list[];
  12. {
  13.     int status_cmp(), author_cmp(), date_cmp(), subject_cmp(), subj_with_re();
  14.     int (*oldint)(), (*oldquit)();
  15.     int (*how)() = status_cmp;
  16.     int n, offset = -1, range = 0;
  17.  
  18.     order = 1;
  19.  
  20.     while (argc && *++argv) {
  21.     n = 0;
  22.     while (argv[0][n])
  23.         switch(argv[0][n++]) {
  24.         case '-': order = -1;
  25.         when 'd': how = date_cmp;
  26.         when 'a': how = author_cmp;
  27.         when 's': how = subject_cmp;
  28.         when 'R': how = subj_with_re;
  29.         when 'S': how = status_cmp;
  30.         otherwise: return help(0, "sort_help", cmd_help);
  31.         }
  32.     }
  33.     if (msg_cnt <= 1) {
  34.     print("Not enough messages to sort.\n");
  35.     return -1;
  36.     }
  37.     on_intr();
  38.  
  39.     if (list && ison(glob_flags, IS_PIPE)) {
  40.     for (n = 0; n < msg_cnt; n++)
  41.         if (msg_bit(list, n)) {
  42.         if (offset < 0)
  43.             offset = n;
  44.         range++;
  45.         } else if (offset >= 0)
  46.         break;
  47.     } else
  48.     offset = 0, range = msg_cnt;
  49.  
  50.     if (range < 2)
  51.     print("Range not broad enough to sort anything\n");
  52.     else {
  53.     Debug("Sorting %d messages starting at message %d\n", range, offset+1);
  54.  
  55.     if (setjmp(sortbuf) == 0)
  56.         qsort((char *)&msg[offset], range, sizeof (struct msg), how);
  57.     else
  58.         print("WARNING: Sorting interrupted: unpredictable order.\n");
  59.     turnon(glob_flags, DO_UPDATE);
  60.     }
  61.     off_intr();
  62.     return -1;
  63. }
  64.  
  65. #ifdef MYQSORT
  66. qsort(base, len, siz, compar)
  67. register struct msg *base;
  68. int (*compar)();
  69. {
  70.      register int i, swapping;
  71.      struct msg temp;
  72.  
  73.      do  {
  74.      swapping = 0;
  75.      for (i = 0; i < len-1; ++i) {
  76.          if (compar(base+i, base+i+1) > 0) {
  77.          temp = base[i];
  78.          base[i] = base[i+1];
  79.          base[i+1] = temp;
  80.          swapping = 1;
  81.          }
  82.      }
  83.      } while (swapping);
  84. }
  85. #endif MYSORT
  86.  
  87. status_cmp(msg1, msg2)
  88. register struct msg *msg1, *msg2;
  89. {
  90.     if (ison(glob_flags, WAS_INTR))
  91.     longjmp(sortbuf, 1);
  92.     if (msg1 < msg || msg2 < msg) {
  93.     wprint("sort botch trying to sort %d and %d\n", msg1-msg, msg2-msg);
  94.     return 0;
  95.     }
  96.     if (msg1->m_flags == msg2->m_flags)
  97.         return 0;
  98.     if (ison(msg1->m_flags, DELETE) && isoff(msg2->m_flags, DELETE))
  99.     return order;
  100.     if (isoff(msg1->m_flags, DELETE) && ison(msg2->m_flags, DELETE))
  101.     return -order;
  102.     if (isoff(msg1->m_flags, OLD) && ison(msg2->m_flags, OLD))
  103.     return -order;
  104.     if (ison(msg1->m_flags, OLD) && isoff(msg2->m_flags, OLD))
  105.     return order;
  106.     if (ison(msg1->m_flags, UNREAD) && isoff(msg2->m_flags, UNREAD))
  107.     return -order;
  108.     if (isoff(msg1->m_flags, UNREAD) && ison(msg2->m_flags, UNREAD))
  109.     return order;
  110.     if (ison(msg1->m_flags,PRESERVE) && isoff(msg2->m_flags,PRESERVE))
  111.     return -order;
  112.     if (isoff(msg1->m_flags,PRESERVE) && ison(msg2->m_flags,PRESERVE))
  113.     return order;
  114.  
  115.     return order;
  116. }
  117.  
  118. author_cmp(msg1, msg2)
  119. register struct msg *msg1, *msg2;
  120. {
  121.     char buf1[BUFSIZ], buf2[BUFSIZ];
  122.  
  123.     if (ison(glob_flags, WAS_INTR))
  124.     longjmp(sortbuf, 1);
  125.     if (msg1 < msg || msg2 < msg) {
  126.     wprint("sort botch trying to sort %d and %d\n", msg1-msg, msg2-msg);
  127.     return 0;
  128.     }
  129.     (void) reply_to(msg1 - msg, 0, buf1); /* "0" for "author only" */
  130.     (void) reply_to(msg2 - msg, 0, buf2);
  131.     Debug("author: msg %d: %s, msg %d: %s\n", msg1-msg, buf1, msg2-msg, buf2);
  132.     return strcmp(buf1, buf2) * order;
  133. }
  134.  
  135. /*
  136.  * compare subject strings from two messages.
  137.  * If Re is appended, so be it -- if user wants to ignore Re: use 'R' flag.
  138.  */
  139. subj_with_re(msg1, msg2)
  140. register struct msg *msg1, *msg2;
  141. {
  142.     char buf1[256], buf2[256];
  143.  
  144.     if (ison(glob_flags, WAS_INTR))
  145.     longjmp(sortbuf, 1);
  146.     if (msg1 < msg || msg2 < msg) {
  147.     wprint("sort botch trying to sort %d and %d\n", msg1-msg, msg2-msg);
  148.     return 0;
  149.     }
  150.     (void) subject_to(msg1 - msg, buf1);
  151.     (void) subject_to(msg2 - msg, buf2);
  152.     Debug("subjects: (%d): \"%s\" (%d): \"%s\"\n", msg1-msg,buf1,msg2-msg,buf2);
  153.     return strcmp(buf1, buf2) * order;
  154. }
  155.  
  156. /*
  157.  * Subject comparison ignoring Re:  subject_to() appends an Re: if there is
  158.  * any subject whatsoever.  If so, skip 4 chars.  If not, set to ""
  159.  */
  160. subject_cmp(msg1, msg2)
  161. register struct msg *msg1, *msg2;
  162. {
  163.     char buf1[256], buf2[256], *p1, *p2;
  164.  
  165.     if (ison(glob_flags, WAS_INTR))
  166.     longjmp(sortbuf, 1);
  167.     if (msg1 < msg || msg2 < msg) {
  168.     wprint("sort botch trying to sort %d and %d\n", msg1-msg, msg2-msg);
  169.     return 0;
  170.     }
  171.     if (p1 = subject_to(msg1 - msg, buf1))
  172.     p1 += 4;
  173.     else
  174.     p1 = "";
  175.     if (p2 = subject_to(msg2 - msg, buf2))
  176.     p2 += 4;
  177.     else
  178.     p2 = "";
  179.     Debug("subjects: (%d): \"%s\" (%d): \"%s\"\n", msg1-msg, p1, msg2-msg, p2);
  180.     return strcmp(p1, p2) * order;
  181. }
  182.  
  183. date_cmp(msg1, msg2)
  184. register struct msg *msg1, *msg2;
  185. {
  186.     char buf1[11], buf2[11];
  187.  
  188.     if (ison(glob_flags, WAS_INTR))
  189.     longjmp(sortbuf, 1);
  190.     if (msg1 < msg || msg2 < msg) {
  191.     wprint("sort botch trying to sort %d and %d\n", msg1-msg, msg2-msg);
  192.     return 0;
  193.     }
  194.     (void) strcpy(buf1, msg_date(msg1-msg));
  195.     (void) strcpy(buf2, msg_date(msg2-msg));
  196.     Debug("dates: msg %d: %s, msg %d: %s\n", msg1-msg, buf1, msg2-msg, buf2);
  197.     return strcmp(buf1, buf2) * order;
  198. }
  199.