home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / uucp / duucp-1.17 / AU-117b4-src.lha / src / dmail / sub.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-24  |  5.1 KB  |  292 lines

  1. /*
  2.  * SUB.C
  3.  *
  4.  *  (C) Copyright 1985-1990 by Matthew Dillon,    All Rights Reserved.
  5.  *
  6.  *  Global Routines:    INDEXOF()
  7.  *            SIG()
  8.  *            POSITION_CURRENT()
  9.  *            SKIP_TO_DATE()
  10.  *            GET_FIELD()
  11.  *            COMPILE_FIELD()
  12.  *            ISFROM()
  13.  *            XSTRNCMP()
  14.  *            NEXT_WORD()
  15.  *            DONE()
  16.  *
  17.  */
  18.  
  19. #include <signal.h>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include "dmail.h"
  23. #include "config.h"
  24.  
  25. #ifdef UNIX
  26. extern FILE *popen();
  27. #endif
  28.  
  29. Prototype int  xfree (void *ptr);
  30. Prototype int  indexof (register int num);
  31. Prototype void null (void);
  32. Prototype int  position_current (void);
  33. Prototype int  skip_to_data (FILE *fi);
  34. Prototype char *get_field (char *str);
  35. Prototype int  compile_field (char *buf, FILE *fi);
  36. Prototype int  xstrncmp (register char *src, register char *dest, register int len);
  37. Prototype char *next_word (register char *str);
  38. Prototype void done (int n);
  39. Prototype void fix_globals (void);
  40. Prototype int  _pager (char *str, int nl);
  41.  
  42. int
  43. xfree (void *ptr)
  44. {
  45.     static void
  46.         *sptr;
  47.  
  48.     if (sptr)
  49.         free (sptr);
  50.     sptr = ptr;
  51.  
  52.     return 1;
  53. }
  54.  
  55. int
  56. indexof (register int num)
  57. {
  58.     register int i, last;
  59.  
  60.     if (num < 1)
  61.     num = -1;
  62.     for (last = -1, i = 0; i < Entries; ++i) {
  63.     if (Entry[i].no) {
  64.         last = i;
  65.         if (Entry[i].no == num)
  66.         return (i);
  67.     }
  68.     }
  69.     if (num == -1  &&  last >= 0)
  70.     return (last);
  71.     return (-1);
  72. }
  73.  
  74. void
  75. null (void)
  76. {
  77. }
  78.  
  79. int
  80. position_current (void)
  81. {
  82.     int pos;
  83.  
  84.     if (!m_fi)
  85.     return(0);
  86.     if (Current >= 0) {
  87.     pos = Entry[Current].fpos;
  88.     if (fseek (m_fi, pos, 0) < 0 || ftell(m_fi) != pos)
  89.         puts ("ERROR: Cannot position file to message");
  90.     } else {
  91.     fseek (m_fi, 0, 0);
  92.     }
  93. }
  94.  
  95. int
  96. skip_to_data (FILE *fi)
  97. {
  98.     static char buf[MAXFIELDSIZE];
  99.  
  100.     while (fgets (buf, MAXFIELDSIZE, fi) != NULL) {
  101.     if (*buf == '\n')
  102.         return (1);
  103.     }
  104.     return (-1);
  105. }
  106.  
  107. char *
  108. get_field (char *str)
  109. {
  110.     int i, entry = Current;
  111.     int len = strlen(str);
  112.  
  113.     if (Current < 0)
  114.     return("");
  115.     i = get_extra (str);
  116.     if (i >= 0)
  117.     return (Entry[entry].fields[i]);
  118.     if (m_fi == NULL)
  119.     return ("");
  120.     fseek (m_fi, Entry[entry].fpos, 0);
  121.     while (fgets (Buf, MAXFIELDSIZE, m_fi) != NULL) {
  122.     if (isfrom (Buf))
  123.         break;
  124.     if (strncmp (Buf, str, len) == 0) {
  125.         Buf[strlen(Buf) - 1] = '\0';
  126.         compile_field(Buf, m_fi);
  127.         return (next_word (Buf));
  128.     }
  129.     }
  130.     return ("");
  131. }
  132.  
  133. int
  134. compile_field (char *buf, FILE *fi)
  135. {
  136.     int len, acc, pos;
  137.  
  138.     acc = 0;
  139.     buf += strlen (buf) + 1;
  140.     pos = ftell (fi);
  141.     while (fgets (buf, MAXFIELDSIZE - acc, fi) != NULL) {
  142.     if (*buf == ' ' || *buf == 9) {
  143.         *(buf - 1) = '\n';
  144.         len = strlen (buf) - 1;
  145.         *(buf + len) = '\0';
  146.         buf += len;
  147.         acc += len + 2;
  148.         if (acc > MAXFIELDSIZE - 10) {
  149.         printf ("Warning: Field size beyond %d bytes\n", MAXFIELDSIZE);
  150.         sleep (2);
  151.         return (1);
  152.         }
  153.     } else {
  154.         *buf = '\0';
  155.         fseek (fi, pos, 0);
  156.         return (1);
  157.     }
  158.     pos = ftell (fi);
  159.     }
  160.     fseek (fi, pos, 0);
  161. }
  162.  
  163. int
  164. xstrncmp (register char *src, register char *dest, register int len)
  165. {
  166.     while (--len >= 0) {
  167.     if ((*src & 0x1f) != (*dest & 0x1f)) {
  168.         if ((*src & 0x1f) < (*dest & 0x1f))
  169.         return (-1);
  170.         return (1);
  171.     }
  172.     ++src; ++dest;
  173.     }
  174.     return (0);
  175. }
  176.  
  177. char *
  178. next_word (register char *str)
  179. {
  180.     while (*str  &&  *str != ' '  && *str != 9)
  181.     ++str;
  182.     while (*str  &&  (*str == ' ' || *str == 9))
  183.     ++str;
  184.     return (str);
  185. }
  186.  
  187. void
  188. done (int n)
  189. {
  190.     char scr[64];
  191.  
  192.     push_break();
  193.     sprintf (scr, "t:dmail%d", getpid());
  194.     unlink (scr);
  195.     sprintf (scr, "t:dmt%d", getpid());
  196.     unlink (scr);
  197.     unlink ("#");
  198.     exit (n);
  199. }
  200.  
  201. void
  202. fix_globals (void)
  203. {
  204.     char *ptr;
  205.  
  206.     push_break();
  207.     S_page = (ptr = get_var (LEVEL_SET, "page")) ?
  208.         ((*ptr) ? atoi (ptr) : 24) : -1;
  209.     if (S_page > 0  && (S_page -= 4) < 0)
  210.     S_page = 1;
  211.  
  212.     S_sendmail = (ptr = get_var (LEVEL_SET, "sendmail")) ? ptr : GetConfigProgram(SENDMAIL);
  213.     S_novibreak= (ptr = get_var (LEVEL_SET, "vibreak")) ? 0 : 1;
  214.     S_verbose  = (ptr = get_var (LEVEL_SET, "verbose")) ? 1 : 0;
  215.     S_ask      = (ptr = get_var (LEVEL_SET, "ask")) ? 1 : 0;
  216.     S_archive  = (ptr = get_var (LEVEL_SET, "archive")) ? 1 : 0;
  217.     if (S_archive && *ptr == '\0')
  218.     S_archive = 0;
  219.     pop_break();
  220. }
  221.  
  222. int
  223. _pager (char *str, int nl)
  224. {
  225.     static int count;
  226.     static FILE *fi;
  227.     static char buf[1024];
  228. #ifdef UNIX
  229.     char *ptr;
  230. #endif
  231.  
  232.     if (str == 0) {
  233.     switch (S_page) {
  234.     case -1:
  235.         count = 0;
  236.         return (1);
  237.     case 0:
  238. #ifdef UNIX
  239.         ptr = get_var (LEVEL_SET, "page");
  240.         fi = popen (ptr, "w");
  241.         if (fi == NULL) {
  242.         count = 0;
  243.         printf ("CANNOT RUN PAGER PROGRAM: %s\n", ptr);
  244.         } else {
  245.         count = -1;
  246.         }
  247. #else
  248.         count = 0;
  249.         fi = stdout;
  250. #endif
  251.         return (1);
  252.     default:
  253.         count = 0;
  254.         return (1);
  255.     }
  256.     }
  257.     if ((long)str == -1) {
  258. #ifdef UNIX
  259.     if (fi != NULL) {
  260.         pclose (fi);
  261.         fi = NULL;
  262.     }
  263. #else
  264.     fi = NULL;
  265. #endif
  266.     return (1);
  267.     }
  268.     if (count < 0) {
  269.     fputs (str, fi);
  270.     while (nl--)
  271.         fputs ("\n", fi);
  272.     } else {
  273.     fputs (str, stdout);
  274.     while (nl--) {
  275.         fputs ("\n", stdout);
  276.         ++count;
  277.     }
  278. #ifdef AMIGA
  279.     fflush(stdout);
  280. #endif
  281.     while (*str) {
  282.         if (*str++ == '\n')
  283.         ++count;
  284.     }
  285.     if (S_page > 0    &&  S_page <= count) {
  286.         count = 0;
  287.         puts ("\n-- more --");
  288.         gets(buf);
  289.     }
  290.     }
  291. }
  292.