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