/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************/
#if defined(WIN32)
#include <windows.h>
#include <time.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
#include "recycle.h"
/* stuff for recycling ban structures */
BAN_DATA *ban_free;
BAN_DATA *new_ban( void )
{
static BAN_DATA ban_zero;
BAN_DATA *ban;
if ( ban_free == NULL )
ban = alloc_perm( sizeof( *ban ) );
else
{
ban = ban_free;
ban_free = ban_free->next;
}
*ban = ban_zero;
VALIDATE( ban );
ban->name = &str_empty[0];
return ban;
}
void free_ban( BAN_DATA * ban )
{
if ( !IS_VALID( ban ) )
return;
free_string( &ban->name );
INVALIDATE( ban );
ban->next = ban_free;
ban_free = ban;
}
BUFFER *buf_free;
/* buffer sizes */
const int buf_size[MAX_BUF_LIST] = {
16, 32, 64, 128, 256, 1024, 2048, 4096, 8192, 16384
};
/* local procedure for finding the next acceptable size */
/* -1 indicates out-of-boundary error */
int get_size( int val )
{
int i;
for ( i = 0; i < MAX_BUF_LIST; i++ )
if ( buf_size[i] >= val )
{
return buf_size[i];
}
return -1;
}
BUFFER *new_buf( )
{
BUFFER *buffer;
if ( buf_free == NULL )
buffer = alloc_perm( sizeof( *buffer ) );
else
{
buffer = buf_free;
buf_free = buf_free->next;
}
buffer->next = NULL;
buffer->state = BUFFER_SAFE;
buffer->size = get_size( BASE_BUF );
buffer->string = alloc_mem( buffer->size );
buffer->string[0] = '\0';
VALIDATE( buffer );
return buffer;
}
BUFFER *new_buf_size( int size )
{
BUFFER *buffer;
if ( buf_free == NULL )
buffer = alloc_perm( sizeof( *buffer ) );
else
{
buffer = buf_free;
buf_free = buf_free->next;
}
buffer->next = NULL;
buffer->state = BUFFER_SAFE;
buffer->size = get_size( size );
if ( buffer->size == -1 )
{
bug( "new_buf: buffer size %d too large.", size );
exit( 1 );
}
buffer->string = alloc_mem( buffer->size );
buffer->string[0] = '\0';
VALIDATE( buffer );
return buffer;
}
void free_buf( BUFFER * buffer )
{
if ( !IS_VALID( buffer ) )
return;
free_mem( &buffer->string );
buffer->size = 0;
buffer->state = BUFFER_FREED;
INVALIDATE( buffer );
buffer->next = buf_free;
buf_free = buffer;
}
bool add_buf( BUFFER * buffer, char *string )
{
int len;
char *oldstr;
int oldsize;
oldstr = buffer->string;
oldsize = buffer->size;
if ( buffer->state == BUFFER_OVERFLOW ) /* don't waste time on bad strings! */
return FALSE;
len = strlen( buffer->string ) + strlen( string ) + 1;
while ( len >= buffer->size ) /* increase the buffer size */
{
buffer->size = get_size( buffer->size + 1 );
{
if ( buffer->size == -1 ) /* overflow */
{
buffer->size = oldsize;
buffer->state = BUFFER_OVERFLOW;
bug( "buffer overflow past size %d", buffer->size );
return FALSE;
}
}
}
if ( buffer->size != oldsize )
{
buffer->string = alloc_mem( buffer->size );
strcpy( buffer->string, oldstr );
free_mem( &oldstr );
}
strcat( buffer->string, string );
return TRUE;
}
void clear_buf( BUFFER * buffer )
{
buffer->string[0] = '\0';
buffer->state = BUFFER_SAFE;
}
char *buf_string( BUFFER * buffer )
{
return buffer->string;
}