home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 2 BBS
/
02-BBS.zip
/
XGRP_000.SZH
/
SEENBY.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-21
|
7KB
|
310 lines
#include "xgroup.h"
/* external var references */
extern GROUP *group;
extern CONTROLS control;
extern ADDR *myaddr;
extern ECHOREC *echos;
extern char *groupin;
extern char *groupout;
extern char *grouphold;
extern char *msgdir;
extern char *outbound;
extern char *inbound;
extern char *archive;
extern char *unarchive;
extern word packsize;
extern word netarea;
extern char buffer[1024];
/* functions local to this module */
static int _cdecl compare_nodes (SB *n1,SB *n2);
static int _cdecl compare_nets (SB *n1,SB *n2);
#define BUBBLE_SORT
#define MAXSEENBY 12480
SB * _fastcall parse_seenbys (char *sbs,ECHOREC *echos,
ADDR *pktaddr) {
/* returns an array of net/node pairs (ending in 0/0) for use
in building SEEN-BY string for forwarded message */
SB *s;
char *p,endofline;
word lastnet = 0;
int x = 0;
s = (SB *)calloc(MAXSEENBY + 1,sizeof(SB));
if(!s) return NULL;
if(control.tinysbs || !sbs || !*sbs) goto SkipSeen; /* just tiny seenbys */
do {
while(*sbs == '\r') {
sbs++;
}
if(!strncmp(sbs,"SEEN-BY",7)) {
sbs += 7;
if(*sbs == ':') sbs++;
sbs = skip_white(sbs);
endofline = 0;
while(*sbs && *sbs != '\r' && !endofline) {
while(*sbs && *sbs == ' ' || *sbs == '\t') sbs++;
p = sbs;
while(*p && *p != ' ' && *p != '\t' && *p != '\r') p++;
if(*p == '\r') {
endofline = 1;
}
if(*p) {
*p = 0;
p++;
}
if(lastnet == 0) lastnet = atoi(sbs);
if(!strstr(sbs,"/")) s[x].net = lastnet;
else {
s[x].net = atoi(sbs);
lastnet = s[x].net;
while(*sbs != '/' && *sbs) sbs++;
if(*sbs == '/') sbs++;
}
s[x++].node = atoi(sbs);
if(x > MAXSEENBY) { /* this has GOT to be a grunged msg */
my_free(s);
return NULL;
}
sbs = p;
}
}
else break;
} while(*sbs && lastnet != 0);
SkipSeen:
if(!add_tiny_seenbys(s,x,echos,pktaddr,(int)(control.tinysbs))) {
my_free(s);
return NULL;
}
sort_sb(s);
return s;
}
SB * _fastcall sort_sb (SB *s) {
/* sort seenby array. */
#ifdef BUBBLE_SORT
word tempnet,tempnode;
int swapped;
#endif
int x;
if(!s) return NULL;
#ifndef BUBBLE_SORT
for(x = 0;x < MAXSEENBY + 1;x++) if(!s[x].net) break;
if(!x) return s;
qsort((void *)s,(size_t)x,sizeof(SB),compare_nodes);
qsort((void *)s,(size_t)x,sizeof(SB),compare_nets);
#else
do {
swapped = 0;
x = 1;
while(s[x].net != 0) { /* first sort nodes */
if(s[x].node < s[x-1].node) {
tempnet = s[x].net;
tempnode = s[x].node;
s[x].net = s[x-1].net;
s[x].node = s[x-1].node;
s[x-1].net = tempnet;
s[x-1].node = tempnode;
swapped = 1;
}
x++;
}
} while(swapped);
do {
swapped = 0;
x = 1;
while(s[x].net != 0) { /* then sort nets */
if(s[x].net < s[x-1].net) {
tempnet = s[x].net;
tempnode = s[x].node;
s[x].net = s[x-1].net;
s[x].node = s[x-1].node;
s[x-1].net = tempnet;
s[x-1].node = tempnode;
swapped = 1;
}
x++;
}
} while(swapped);
#endif
return s;
}
#ifndef BUBBLESORT
static int _cdecl compare_nodes (SB *one,SB *two) {
if(one->node < two->node) return -1;
if(one->node > two->node) return 1;
return 0;
}
static int _cdecl compare_nets (SB *one,SB *two) {
if(one->net < two->net) return -1;
if(one->net > two->net) return 1;
return 0;
}
#endif
SB * _fastcall make_tinysbs (ECHOREC *echo,ADDR *pktaddr) {
ADDR *info;
int x = 0;
SB *sb;
info = echo->addr;
while(info) {
x++;
info = info->next;
}
sb = calloc(x + 2,sizeof(SB));
if(!sb) return NULL;
add_tiny_seenbys(sb,0,echo,pktaddr,1);
sort_sb(sb);
return sb;
}
int _fastcall add_tiny_seenbys (SB *s,int x,ECHOREC *echo,
ADDR *pktaddr,int tsb) {
/* if pktaddr != NULL omits interzone addresses. always eliminates
points */
ADDR *info,*me;
info = echo->addr;
while(info) {
/* avoid pktaddr (unless tiny seenbys) and points */
if(!info->point && (tsb || (!pktaddr || (info->zone != pktaddr->zone ||
info->net != pktaddr->net || info->node != pktaddr->node ||
info->point != pktaddr->point ||
strnicmp(pktaddr->domain,info->domain,8))))) {
/* avoid inter-zone unless tiny seenbys */
if(tsb || !pktaddr || info->zone == pktaddr->zone) {
s[x].net = info->net;
s[x++].node = info->node;
}
}
if (x > 8189) { /* got to be grunged */
printf("\nToo many forward nodes\n");
return 0;
}
info = info->next;
}
if(tsb) {
if(pktaddr) me = best_guess(pktaddr,myaddr); /* oh, wow, who am I again? */
else me = best_guess(echo->addr,myaddr);
s[x].net = me->net; /* add ourself */
s[x++].node = me->node;
}
return x;
}
long _fastcall spit_seenbys (SB *s,int handle) {
/* puke seen-by array out to file, formatted */
int len = 0,x = 0;
word lastnet = 0;
char temp[32];
long totallen = 0L;
ffprintf(handle,"\r"); /* assure cr between origin & seenbys */
while(s[x].net != 0) {
if(len > 65) {
totallen += (long)ffprintf(handle,"%s\r",buffer);
len = 0;
}
if(!len) {
len += sprintf(buffer,"SEEN-BY: ");
strcat(buffer,ltoa((long)s[x].net,temp,10));
len += strlen(temp);
strcat(buffer,"/");
len ++;
strcat(buffer,ltoa((long)s[x].node,temp,10));
len += strlen(temp);
lastnet = s[x++].net;
}
else {
if(lastnet != s[x].net) {
strcat(buffer," ");
len++;
strcat(buffer,ltoa((long)s[x].net,temp,10));
lastnet = s[x].net;
len += strlen(temp);
strcat(buffer,"/");
len++;
strcat(buffer,ltoa((long)s[x].node,temp,10));
len += strlen(temp);
}
else {
strcat(buffer," ");
len++;
strcat(buffer,ltoa((long)s[x].node,temp,10));
len += strlen(temp);
}
x++;
}
}
if(len) {
totallen += (long)ffprintf(handle,"%s\r",buffer);
}
return totallen;
}