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