/* This is where all the recycling functions are */
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "include.h"
#include "channel.h"
extern char str_empty[1];
/* The free list declarations */
ACCOUNT * acnt_free;
ACNT_CMD * acnt_cmd_free;
DESCRIPTOR_DATA *copyover_desc(void)
{
static DESCRIPTOR_DATA d_zero;
DESCRIPTOR_DATA *d;
if (descriptor_free == NULL)
d = (DESCRIPTOR_DATA *) alloc_perm(sizeof(*d));
else
{
d = descriptor_free;
descriptor_free = descriptor_free->next;
}
*d = d_zero;
d->connected = CON_GET_ACCOUNT_NAME;
free_string(d->showstr_head);
free_string(d->showstr_point);
d->outsize = 2000;
d->outbuf = (char *) alloc_mem( d->outsize );
d->fcommand = true;
d->incomm[0] = '\0';
d->pagelen = 20;
d->pEdit = NULL;
d->pString = NULL;
return d;
}
/* Account recycling */
ACCOUNT *account_new()
{ ACCOUNT *pAcnt;
if(!acnt_free )
pAcnt = new account_data();
else
{ pAcnt = acnt_free;
acnt_free = pAcnt->next;
}
pAcnt->name = &str_empty[0];
pAcnt->password = &str_empty[0];
pAcnt->lastfun = 0;
pAcnt->next = account_list;
account_list = pAcnt;
pAcnt->struct_id = ACNTID;
clear_bits(pAcnt->common_flags, COMMON_MAX );
clear_bits(pAcnt->channel, CHANNEL_MAX);
pAcnt->afk_string = &str_empty[0];
pAcnt->mud = &str_empty[0];
pAcnt->url = &str_empty[0];
pAcnt->read = str_dup("<0>");
pAcnt->editing = false;
pAcnt->buffer = NULL;
pAcnt->initLogin = 0;
pAcnt->buffer = NULL;
pAcnt->reply = NULL;
pAcnt->bufPos = 0;
pAcnt->custPost = &str_empty[0];
pAcnt->custReply = &str_empty[0];
pAcnt->custTopic = &str_empty[0];
pAcnt->custPost = str_dup(CUSTPOST);
pAcnt->custTopic = str_dup(CUSTTOPIC);
pAcnt->custReply = str_dup(CUSTREPLY);
for(int i = 0; i < CHANNEL_MAX ; ++i)
pAcnt->lastTID[i] = 0;
return pAcnt;
}
void free_account(ACCOUNT *pAcnt )
{ ACCOUNT *tmp;
if(pAcnt == account_list)
account_list = pAcnt->next;
else
for(tmp = account_list ; tmp ; tmp = tmp->next )
{ if(tmp->next == pAcnt )
tmp->next = pAcnt->next;
}
free_string(pAcnt->name);
free_string(pAcnt->password);
pAcnt->next = acnt_free;
acnt_free = pAcnt;
pAcnt->reply = NULL;
free_string(pAcnt->mud);
free_string(pAcnt->url);
free_string(pAcnt->read);
free_string(pAcnt->custPost);
free_string(pAcnt->custReply);
free_string(pAcnt->custTopic);
if(pAcnt->buffer && !pAcnt->buffer->isBlob)
{ pAcnt->buffer->Empty();
delete pAcnt->buffer;
}
return;
}
/* Account Command Recycling */
ACNT_CMD *acnt_cmd_new()
{ ACNT_CMD *cmd;
if(acnt_cmd_free == NULL )
cmd = (ACNT_CMD *) alloc_perm(sizeof(*cmd) );
else
{ cmd = acnt_cmd_free;
acnt_cmd_free = acnt_cmd_free->next;
}
free_string(cmd->name);
cmd->name = str_dup("New Command");
cmd->do_fun = NULL;
cmd->level = 0;
return cmd;
}
void free_acnt_cmd(ACNT_CMD *cmd)
{ ACNT_CMD *tmp;
for(tmp = acnt_cmd_list; tmp; tmp = tmp->next )
{ if (tmp->next == cmd)
tmp->next = cmd->next;
}
if(acnt_cmd_list == cmd )
acnt_cmd_list = acnt_cmd_list->next;
free_string(cmd->name);
cmd->next = acnt_cmd_free;
acnt_cmd_free = cmd;
return;
}