home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 341b.lha / uucp1_v1.03d / src / dmail / range.c < prev    next >
C/C++ Source or Header  |  1990-01-28  |  3KB  |  169 lines

  1.  
  2. /*
  3.  * RANGE.C
  4.  *
  5.  *  (C) Copyright 1985-1990 by Matthew Dillon,  All Rights Reserved.
  6.  *
  7.  *  Global Routines:    REWIND_RANGE()
  8.  *            GET_RANGE()
  9.  *            SINGLE_POSITION()
  10.  *
  11.  *  Static Routines:    None.
  12.  *
  13.  *
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include "dmail.h"
  18.  
  19.  
  20. static int range_ac;
  21. static int in, start, end;
  22.  
  23. struct RANOP {
  24.     char *name;
  25.     int status, kstatus;
  26. };
  27.  
  28. static struct RANOP Ranop[] = {
  29.     "all",  0,              0,
  30.     "tag",  ST_TAG,         ST_DELETED,
  31.     "wri",  ST_STORED,      ST_DELETED,
  32.     "del",  ST_DELETED,     0,
  33.     "mar",  ST_READ,        ST_DELETED,
  34.     "unt",  0,              ST_DELETED | ST_TAG,
  35.     "unw",  0,              ST_DELETED | ST_STORED,
  36.     "und",  0,              ST_DELETED,
  37.     "unm",  0,              ST_DELETED | ST_READ,
  38.     NULL ,  0,            0 };
  39.  
  40. void
  41. rewind_range(beg)
  42. {
  43.     Silence = 0;
  44.     range_ac = beg;
  45.  
  46.     if (range_ac >= ac) {
  47.     start = (Current >= 0) ? Entry[Current].no : 0;
  48.     end   = start;
  49.     in    = 1;
  50.     } else {
  51.     in    = 0;
  52.     }
  53. }
  54.  
  55.  
  56. get_range()
  57. {
  58.     register char *ptr;
  59.     register int i;
  60.     static int status;        /* Status items required            */
  61.     static int kstatus;     /* Status items which cannot be present */
  62.  
  63. again:
  64.     if (in  &&  start <= end) {
  65.     i = indexof(start++);
  66.     if (i < 0  || (Entry[i].status & status) != status ||
  67.         (Entry[i].status & kstatus))
  68.         goto again;
  69.     return (start - 1);
  70.     }
  71.     in = status = kstatus = 0;
  72.     if (range_ac >= ac)
  73.     return (0);
  74.     ptr = av[range_ac++];
  75.     if (*ptr == '-') {
  76.     if (xstrncmp (ptr, "-s", 2) == 0) {
  77.         Silence = 1;
  78.         goto again;
  79.     }
  80.     start = 1;
  81.     ++ptr;
  82.     goto dash;
  83.     }
  84.     if (*ptr < '0'  ||  *ptr > '9') {
  85.     start = 1;
  86.     end = 0;
  87.     for (i = 0; Ranop[i].name; ++i) {
  88.         if (xstrncmp (ptr, Ranop[i].name, 3) == 0) {
  89.         status = Ranop[i].status;
  90.         kstatus = Ranop[i].kstatus;
  91.         goto imprange;
  92.         }
  93.     }
  94.     goto again;
  95.     }
  96.     start = atoi(ptr);
  97.     while (*(++ptr)) {
  98.     if (*ptr == '-') {
  99.         ++ptr;
  100.         goto dash;
  101.     }
  102.     }
  103.     if (range_ac >= ac)
  104.     return (start);
  105.     if (*av[range_ac] == '-') {
  106.     ptr = av[range_ac++] + 1;
  107.     goto dash;
  108.     }
  109.     return (start);
  110. dash:
  111.     if (*ptr) {
  112.     end = atoi(ptr);
  113.     goto imprange;
  114.     }
  115.     if (range_ac >= ac) {
  116.     end = 0;
  117.     goto imprange;
  118.     }
  119.     end = atoi(av[range_ac++]);
  120. imprange:
  121.     if (end == 0) {
  122.     end = indexof (0);
  123.     if (end < 0)
  124.         return (0);
  125.     end = Entry[end].no;
  126.     }
  127.     if (start > end) {
  128.     printf ("Bad Range: %s\n", av[range_ac - 1]);
  129.     return (0);
  130.     }
  131.     in = 1;
  132.     goto again;
  133. }
  134.  
  135.  
  136. single_position()
  137. {
  138.     int old = Current;
  139.  
  140.     switch (ac) {
  141.     case 1:
  142.     break;
  143.     case 2:
  144.     if (*av[1] == '\0' || (*av[1] == ' ' && strlen(av[1]) == 1))
  145.         break;
  146.     Current = indexof (atoi(av[1]));
  147.     if (Current < 0) {
  148.         Current = old;
  149.         puts ("Out of Range, 0 will take you to the last entry");
  150.         return (-1);
  151.     }
  152.     break;
  153.     default:
  154.     puts ("Range not implemented (yet?)");
  155.     return (-1);
  156.     }
  157.     while (Current < Entries  &&  Entry[Current].no == 0)
  158.     ++Current;
  159.     if (Current >= Entries) {
  160.     Current = old;
  161.     puts ("No More Messages");
  162.     return (-1);
  163.     }
  164.     position_current();
  165.     return (1);
  166. }
  167.  
  168.  
  169.