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

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