home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / XGRP_000.SZH / SEENBY.C < prev    next >
C/C++ Source or Header  |  1991-08-21  |  7KB  |  310 lines

  1. #include "xgroup.h"
  2.  
  3. /* external var references */
  4.  
  5. extern GROUP    *group;
  6. extern CONTROLS control;
  7. extern ADDR     *myaddr;
  8. extern ECHOREC  *echos;
  9. extern char     *groupin;
  10. extern char     *groupout;
  11. extern char     *grouphold;
  12. extern char     *msgdir;
  13. extern char     *outbound;
  14. extern char     *inbound;
  15. extern char     *archive;
  16. extern char     *unarchive;
  17. extern word     packsize;
  18. extern word     netarea;
  19. extern char     buffer[1024];
  20.  
  21. /* functions local to this module */
  22.  
  23. static int _cdecl compare_nodes (SB *n1,SB *n2);
  24. static int _cdecl compare_nets (SB *n1,SB *n2);
  25.  
  26. #define BUBBLE_SORT
  27.  
  28. #define MAXSEENBY 12480
  29.  
  30.  
  31.  
  32. SB * _fastcall parse_seenbys (char *sbs,ECHOREC *echos,
  33.                               ADDR *pktaddr) {
  34.  
  35.     /* returns an array of net/node pairs (ending in 0/0) for use
  36.        in building SEEN-BY string for forwarded message */
  37.  
  38.     SB     *s;
  39.     char *p,endofline;
  40.     word lastnet = 0;
  41.     int  x = 0;
  42.  
  43.  
  44.     s = (SB *)calloc(MAXSEENBY + 1,sizeof(SB));
  45.     if(!s) return NULL;
  46.  
  47.     if(control.tinysbs || !sbs || !*sbs) goto SkipSeen; /* just tiny seenbys */
  48.  
  49.     do {
  50.         while(*sbs == '\r') {
  51.             sbs++;
  52.         }
  53.         if(!strncmp(sbs,"SEEN-BY",7)) {
  54.             sbs += 7;
  55.             if(*sbs == ':') sbs++;
  56.             sbs = skip_white(sbs);
  57.             endofline = 0;
  58.             while(*sbs && *sbs != '\r' && !endofline) {
  59.                 while(*sbs && *sbs == ' ' || *sbs == '\t') sbs++;
  60.                 p = sbs;
  61.                 while(*p && *p != ' ' && *p != '\t' && *p != '\r') p++;
  62.                 if(*p == '\r') {
  63.                     endofline = 1;
  64.                 }
  65.                 if(*p) {
  66.                     *p = 0;
  67.                     p++;
  68.                 }
  69.                 if(lastnet == 0) lastnet = atoi(sbs);
  70.                 if(!strstr(sbs,"/")) s[x].net = lastnet;
  71.                 else {
  72.                     s[x].net = atoi(sbs);
  73.                     lastnet = s[x].net;
  74.                     while(*sbs != '/' && *sbs) sbs++;
  75.                     if(*sbs == '/') sbs++;
  76.                 }
  77.                 s[x++].node = atoi(sbs);
  78.                 if(x > MAXSEENBY) { /* this has GOT to be a grunged msg */
  79.                     my_free(s);
  80.                     return NULL;
  81.                 }
  82.                 sbs = p;
  83.             }
  84.         }
  85.         else break;
  86.     } while(*sbs && lastnet != 0);
  87.  
  88. SkipSeen:
  89.  
  90.     if(!add_tiny_seenbys(s,x,echos,pktaddr,(int)(control.tinysbs))) {
  91.         my_free(s);
  92.         return NULL;
  93.     }
  94.  
  95.     sort_sb(s);
  96.  
  97.     return s;
  98. }
  99.  
  100.  
  101.  
  102. SB * _fastcall sort_sb (SB *s) {
  103.  
  104.     /* sort seenby array. */
  105.  
  106. #ifdef BUBBLE_SORT
  107.     word tempnet,tempnode;
  108.     int swapped;
  109. #endif
  110.     int x;
  111.  
  112.  
  113.     if(!s) return NULL;
  114.  
  115. #ifndef BUBBLE_SORT
  116.  
  117.     for(x = 0;x < MAXSEENBY + 1;x++) if(!s[x].net) break;
  118.     if(!x) return s;
  119.     qsort((void *)s,(size_t)x,sizeof(SB),compare_nodes);
  120.     qsort((void *)s,(size_t)x,sizeof(SB),compare_nets);
  121.  
  122. #else
  123.  
  124.     do {
  125.         swapped = 0;
  126.         x = 1;
  127.         while(s[x].net != 0) {  /* first sort nodes */
  128.             if(s[x].node < s[x-1].node) {
  129.                 tempnet = s[x].net;
  130.                 tempnode = s[x].node;
  131.                 s[x].net = s[x-1].net;
  132.                 s[x].node = s[x-1].node;
  133.                 s[x-1].net = tempnet;
  134.                 s[x-1].node = tempnode;
  135.                 swapped = 1;
  136.             }
  137.             x++;
  138.         }
  139.     } while(swapped);
  140.  
  141.     do {
  142.         swapped = 0;
  143.         x = 1;
  144.         while(s[x].net != 0) {  /* then sort nets */
  145.             if(s[x].net < s[x-1].net) {
  146.                 tempnet = s[x].net;
  147.                 tempnode = s[x].node;
  148.                 s[x].net = s[x-1].net;
  149.                 s[x].node = s[x-1].node;
  150.                 s[x-1].net = tempnet;
  151.                 s[x-1].node = tempnode;
  152.                 swapped = 1;
  153.             }
  154.             x++;
  155.         }
  156.     } while(swapped);
  157.  
  158. #endif
  159.  
  160.     return s;
  161. }
  162.  
  163.  
  164.  
  165. #ifndef BUBBLESORT
  166.  
  167. static int _cdecl compare_nodes (SB *one,SB *two) {
  168.  
  169.     if(one->node < two->node) return -1;
  170.     if(one->node > two->node) return 1;
  171.     return 0;
  172. }
  173.  
  174.  
  175. static int _cdecl compare_nets (SB *one,SB *two) {
  176.  
  177.     if(one->net < two->net) return -1;
  178.     if(one->net > two->net) return 1;
  179.     return 0;
  180. }
  181.  
  182. #endif
  183.  
  184.  
  185.  
  186. SB * _fastcall make_tinysbs (ECHOREC *echo,ADDR *pktaddr) {
  187.  
  188.     ADDR *info;
  189.     int  x = 0;
  190.     SB   *sb;
  191.  
  192.  
  193.     info = echo->addr;
  194.     while(info) {
  195.         x++;
  196.         info = info->next;
  197.     }
  198.     sb = calloc(x + 2,sizeof(SB));
  199.     if(!sb) return NULL;
  200.  
  201.     add_tiny_seenbys(sb,0,echo,pktaddr,1);
  202.     sort_sb(sb);
  203.  
  204.     return sb;
  205. }
  206.  
  207.  
  208.  
  209.  
  210. int _fastcall add_tiny_seenbys (SB *s,int x,ECHOREC *echo,
  211.                                 ADDR *pktaddr,int tsb) {
  212.  
  213.     /* if pktaddr != NULL omits interzone addresses.  always eliminates
  214.        points */
  215.  
  216.     ADDR *info,*me;
  217.  
  218.  
  219.     info = echo->addr;
  220.     while(info) {
  221.  
  222.         /* avoid pktaddr (unless tiny seenbys) and points */
  223.  
  224.         if(!info->point && (tsb || (!pktaddr || (info->zone != pktaddr->zone ||
  225.             info->net != pktaddr->net || info->node != pktaddr->node ||
  226.             info->point != pktaddr->point ||
  227.             strnicmp(pktaddr->domain,info->domain,8))))) {
  228.  
  229.                 /* avoid inter-zone unless tiny seenbys */
  230.  
  231.                 if(tsb || !pktaddr || info->zone == pktaddr->zone) {
  232.                     s[x].net = info->net;
  233.                     s[x++].node = info->node;
  234.                 }
  235.         }
  236.         if (x > 8189) {    /* got to be grunged */
  237.             printf("\nToo many forward nodes\n");
  238.             return 0;
  239.         }
  240.         info = info->next;
  241.     }
  242.  
  243.     if(tsb) {
  244.         if(pktaddr) me = best_guess(pktaddr,myaddr);    /* oh, wow, who am I again? */
  245.         else me = best_guess(echo->addr,myaddr);
  246.         s[x].net = me->net;                 /* add ourself */
  247.         s[x++].node = me->node;
  248.     }
  249.  
  250.     return x;
  251. }
  252.  
  253.  
  254.  
  255. long _fastcall spit_seenbys (SB *s,int handle) {
  256.  
  257.     /* puke seen-by array out to file, formatted */
  258.  
  259.     int  len = 0,x = 0;
  260.     word lastnet = 0;
  261.     char temp[32];
  262.     long totallen = 0L;
  263.  
  264.  
  265.     ffprintf(handle,"\r");   /* assure cr between origin & seenbys */
  266.  
  267.     while(s[x].net != 0) {
  268.         if(len > 65) {
  269.             totallen += (long)ffprintf(handle,"%s\r",buffer);
  270.             len = 0;
  271.         }
  272.         if(!len) {
  273.             len += sprintf(buffer,"SEEN-BY: ");
  274.             strcat(buffer,ltoa((long)s[x].net,temp,10));
  275.             len += strlen(temp);
  276.             strcat(buffer,"/");
  277.             len ++;
  278.             strcat(buffer,ltoa((long)s[x].node,temp,10));
  279.             len += strlen(temp);
  280.             lastnet = s[x++].net;
  281.         }
  282.         else {
  283.             if(lastnet != s[x].net) {
  284.                 strcat(buffer," ");
  285.                 len++;
  286.                 strcat(buffer,ltoa((long)s[x].net,temp,10));
  287.                 lastnet = s[x].net;
  288.                 len += strlen(temp);
  289.                 strcat(buffer,"/");
  290.                 len++;
  291.                 strcat(buffer,ltoa((long)s[x].node,temp,10));
  292.                 len += strlen(temp);
  293.             }
  294.             else {
  295.                 strcat(buffer," ");
  296.                 len++;
  297.                 strcat(buffer,ltoa((long)s[x].node,temp,10));
  298.                 len += strlen(temp);
  299.             }
  300.             x++;
  301.         }
  302.     }
  303.  
  304.     if(len) {
  305.         totallen += (long)ffprintf(handle,"%s\r",buffer);
  306.     }
  307.  
  308.     return totallen;
  309. }
  310.