2011-08-08 06:41:05 +00:00
|
|
|
#include "mphlr.h"
|
|
|
|
|
|
|
|
|
|
|
|
overlay_buffer *ob_new(int size)
|
|
|
|
{
|
|
|
|
overlay_buffer *ret=calloc(sizeof(overlay_buffer),1);
|
|
|
|
if (!ret) return NULL;
|
|
|
|
|
|
|
|
ob_unlimitsize(ret);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_free(overlay_buffer *b)
|
|
|
|
{
|
|
|
|
if (!b) return WHY("Asked to free NULL");
|
|
|
|
if (b->bytes) free(b->bytes);
|
|
|
|
b->bytes=NULL;
|
|
|
|
b->allocSize=0;
|
|
|
|
b->sizeLimit=0;
|
|
|
|
free(b);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_checkpoint(overlay_buffer *b)
|
|
|
|
{
|
|
|
|
if (!b) return WHY("Asked to checkpoint NULL");
|
|
|
|
b->checkpointLength=b->length;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_rewind(overlay_buffer *b)
|
|
|
|
{
|
|
|
|
if (!b) return WHY("Asked to rewind NULL");
|
|
|
|
b->length=b->checkpointLength;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_limitsize(overlay_buffer *b,int bytes)
|
|
|
|
{
|
|
|
|
if (!b) return WHY("Asked to limit size of NULL");
|
|
|
|
if (b->length>bytes) return WHY("Length of data in buffer already exceeds size limit");
|
|
|
|
if (b->checkpointLength>bytes) return WHY("Checkpointed length of data in buffer already exceeds size limit");
|
|
|
|
if (bytes<0) return WHY("Cant limit buffer to a negative size");
|
|
|
|
b->sizeLimit=bytes;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_unlimitsize(overlay_buffer *b)
|
|
|
|
{
|
|
|
|
if (!b) return WHY("b is NULL");
|
|
|
|
b->sizeLimit=-1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_makespace(overlay_buffer *b,int bytes)
|
|
|
|
{
|
|
|
|
if (b->sizeLimit!=-1) {
|
|
|
|
if (b->length+bytes>b->sizeLimit) return WHY("Asked to make space beyond size limit");
|
|
|
|
}
|
2011-08-09 04:45:24 +00:00
|
|
|
if (b->length+bytes>=b->allocSize)
|
2011-08-08 06:41:05 +00:00
|
|
|
{
|
|
|
|
int newSize=b->length+bytes;
|
|
|
|
if (newSize<64) newSize=64;
|
|
|
|
if (newSize&63) newSize+=64-(newSize&63);
|
|
|
|
if (newSize>1024) {
|
|
|
|
if (newSize&1023) newSize+=1024-(newSize&1023);
|
|
|
|
}
|
|
|
|
if (newSize>65536) {
|
|
|
|
if (newSize&65535) newSize+=65536-(newSize&65535);
|
|
|
|
}
|
|
|
|
unsigned char *r=realloc(b->bytes,newSize);
|
|
|
|
if (!r) return WHY("realloc() failed");
|
|
|
|
b->bytes=r;
|
|
|
|
b->allocSize=newSize;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_append_bytes(overlay_buffer *b,unsigned char *bytes,int count)
|
|
|
|
{
|
|
|
|
if (ob_makespace(b,count)) return WHY("ob_makespace() failed");
|
|
|
|
|
|
|
|
bcopy(bytes,&b->bytes[b->length],count);
|
|
|
|
b->length+=count;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_append_short(overlay_buffer *b,unsigned short v)
|
|
|
|
{
|
|
|
|
unsigned short s=htons(v);
|
|
|
|
return ob_append_bytes(b,(unsigned char *)&s,sizeof(unsigned short));
|
|
|
|
}
|
|
|
|
|
|
|
|
int ob_append_int(overlay_buffer *b,unsigned int v)
|
|
|
|
{
|
|
|
|
unsigned int s=htonl(v);
|
|
|
|
return ob_append_bytes(b,(unsigned char *)&s,sizeof(unsigned int));
|
|
|
|
}
|