sourcepawn/compiler/memfile.c
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
permissions -rw-r--r--
Spring Cleaning, Part Ichi (1)
Various minor things done to project files
Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way)
Updated regex project file and makefile
     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 }