sourcepawn/compiler/memfile.c
author David Anderson <dvander@alliedmods.net>
Sun Nov 25 18:50:13 2007 +0000 (2007-11-25)
changeset 1725 ea875bcbc286
parent 31 071b73cfcc65
permissions -rw-r--r--
small clarification to param2 in MenuAction_End
dvander@27
     1
#include "memfile.h"
dvander@27
     2
#include <string.h>
dvander@27
     3
#include "osdefs.h"
dvander@27
     4
dvander@27
     5
memfile_t *memfile_creat(const char *name, size_t init)
dvander@27
     6
{
dvander@27
     7
	memfile_t mf;
dvander@27
     8
	memfile_t *pmf;
dvander@27
     9
dvander@27
    10
	mf.size = init;
dvander@27
    11
	mf.base = (char *)malloc(init);
dvander@27
    12
	mf.usedoffs = 0;
dvander@27
    13
	if (!mf.base)
dvander@27
    14
	{
dvander@27
    15
		return NULL;
dvander@27
    16
	}
dvander@27
    17
dvander@27
    18
	mf.offs = 0;
dvander@27
    19
	mf._static = 0;
dvander@27
    20
dvander@27
    21
	pmf = (memfile_t *)malloc(sizeof(memfile_t));
dvander@27
    22
	memcpy(pmf, &mf, sizeof(memfile_t));
dvander@27
    23
dvander@27
    24
	pmf->name = strdup(name);
dvander@27
    25
dvander@27
    26
	return pmf;
dvander@27
    27
}
dvander@27
    28
dvander@27
    29
void memfile_destroy(memfile_t *mf)
dvander@27
    30
{
dvander@31
    31
	if (!mf)
dvander@31
    32
	{
dvander@31
    33
		return;
dvander@31
    34
	}
dvander@31
    35
dvander@27
    36
	if (!mf->_static)
dvander@27
    37
	{
dvander@27
    38
		free(mf->name);
dvander@27
    39
		free(mf->base);
dvander@27
    40
		free(mf);
dvander@27
    41
	}
dvander@27
    42
}
dvander@27
    43
dvander@27
    44
void memfile_seek(memfile_t *mf, long seek)
dvander@27
    45
{
dvander@27
    46
	mf->offs = seek;
dvander@27
    47
}
dvander@27
    48
dvander@27
    49
long memfile_tell(memfile_t *mf)
dvander@27
    50
{
dvander@27
    51
	return mf->offs;
dvander@27
    52
}
dvander@27
    53
dvander@27
    54
size_t memfile_read(memfile_t *mf, void *buffer, size_t maxsize)
dvander@27
    55
{
dvander@27
    56
	if (!maxsize || mf->offs >= mf->usedoffs)
dvander@27
    57
	{
dvander@27
    58
		return 0;
dvander@27
    59
	}
dvander@27
    60
dvander@27
    61
	if (mf->usedoffs - mf->offs < (long)maxsize)
dvander@27
    62
	{
dvander@27
    63
		maxsize = mf->usedoffs - mf->offs;
dvander@27
    64
		if (!maxsize)
dvander@27
    65
		{
dvander@27
    66
			return 0;
dvander@27
    67
		}
dvander@27
    68
	}
dvander@27
    69
dvander@27
    70
	memcpy(buffer, mf->base + mf->offs, maxsize);
dvander@27
    71
dvander@27
    72
	mf->offs += maxsize;
dvander@27
    73
dvander@27
    74
	return maxsize;
dvander@27
    75
}
dvander@27
    76
dvander@31
    77
int memfile_write(memfile_t *mf, const void *buffer, size_t size)
dvander@27
    78
{
dvander@27
    79
	if (mf->offs + size > mf->size)
dvander@27
    80
	{
dvander@27
    81
		size_t newsize = (mf->size + size) * 2;
dvander@27
    82
		if (mf->_static)
dvander@27
    83
		{
dvander@27
    84
			char *oldbase = mf->base;
dvander@27
    85
			mf->base = (char *)malloc(newsize);
dvander@27
    86
			if (!mf->base)
dvander@27
    87
			{
dvander@27
    88
				return 0;
dvander@27
    89
			}
dvander@27
    90
			memcpy(mf->base, oldbase, mf->size);
dvander@27
    91
		} else {
dvander@27
    92
			mf->base = (char *)realloc(mf->base, newsize);
dvander@27
    93
			if (!mf->base)
dvander@27
    94
			{
dvander@27
    95
				return 0;
dvander@27
    96
			}
dvander@27
    97
		}
dvander@27
    98
		mf->_static = 0;
dvander@27
    99
		mf->size = newsize;
dvander@27
   100
	}
dvander@27
   101
	memcpy(mf->base + mf->offs, buffer, size);
dvander@27
   102
	mf->offs += size;
dvander@27
   103
dvander@27
   104
	if (mf->offs > mf->usedoffs)
dvander@27
   105
	{
dvander@27
   106
		mf->usedoffs = mf->offs;
dvander@27
   107
	}
dvander@27
   108
dvander@27
   109
	return 1;
dvander@27
   110
}
dvander@31
   111
dvander@31
   112
void memfile_reset(memfile_t *mf)
dvander@31
   113
{
dvander@31
   114
	mf->usedoffs = 0;
dvander@31
   115
	mf->offs = 0;
dvander@31
   116
}