home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / telecom / uucp_442 / src / dmail / sub.c < prev    next >
C/C++ Source or Header  |  1990-10-25  |  5KB  |  310 lines

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