#include "config.h" #include #include #include struct aServer { struct aServer *next; struct aServer *down; char *name; }; struct aServData { int count; int list; }; struct aServer *MYuplink=NULL; struct aServData ServerData; int LinkServer(char *server, char *uplink) { struct aServer *ServerID; ServerID=newserver(); ServerID->name=strdup(server); if(MYuplink==NULL) { MYuplink=ServerID; ServerData.list=1; return 1; } return (AddServer(ServerID,uplink,&MYuplink)); } struct aServer *newserver() { struct aServer *newserver; newserver= (struct aServer *) calloc(1,sizeof(struct aServer)); ServerData.count++; return newserver; } int AddServer(struct aServer *newserver,char *uplink,struct aServer **Startid) { struct aServer **UplinkID; struct aServer *ServerID; Uplinkid=FindServer(uplink,Startid); if(Uplinkid == NULL) return 0; /* ERROR HERE */ ServerID= *Uplinkid; /* This is a DOWNLINK of the said server.. ** Downlinks go DOWN ->next -> next -> next ... */ if( ServerID->down == NULL) { ServerID->down = newserver; ServerData.list++; return 1; } ServerID=Serverid->down; while(ServerID->next !=NULL) ServerID=ServerID->next; ServerID->next=newserver; ServerData.list++; return 1; } struct aServer **FindServer(char *name,struct aServer **Startid) { struct aServer *SearchID; struct aServer **ServerID; if(!StartID ) return NULL; SearchID= *Startid; if(!strcasecmp(name,StartID->name)) return Startid; /* This is not the server we are looking for */ ** First scan NEXT as far as we can... Then try Down ** We are not modifying the information in the structures ** in this calls */ if( (ServerID=FindServer(name,&(SearchID->next))) != NULL) return ServerID; if( (ServerID=FindServer(name,&(SearchID->down))) != NULL) return ServerID; return NULL; } void dumpsubmap(struct aServer *server) { static char prefix[80]=""; static int offset=0; char localbuf[512]; if(server==NULL) return; if(server->next==NULL) { sprintf(localbuf,"PRIVMSG WildThang :%s`-%s",prefix,server->name); } else { sprintf(localbuf,"PRIVMSG WildThang :%s|-%s",prefix,server->name); } writeln(botsck,localbuf); if(server->next!=NULL) strcpy(prefix+offset,"| "); else strcpy(prefix+offset," "); offset+=2; dumpsubmap(server->down); offset-=2; prefix[offset]='\0'; dumpsubmap(server->next); }