dvander@27: /* Pawn compiler dvander@27: * dvander@27: * Routines to maintain a "text file" in memory. dvander@27: * dvander@27: * Copyright (c) ITB CompuPhase, 2003-2006 dvander@27: * dvander@27: * This software is provided 'as-is', without any express or implied warranty. dvander@27: * In no event will the authors be held liable for any damages arising from the dvander@27: * use of this software. dvander@27: * dvander@27: * Permission is granted to anyone to use this software for any purpose, dvander@27: * including commercial applications, and to alter it and redistribute it dvander@27: * freely, subject to the following restrictions: dvander@27: * dvander@27: * 1. The origin of this software must not be misrepresented; you must not dvander@27: * claim that you wrote the original software. If you use this software in dvander@27: * a product, an acknowledgment in the product documentation would be dvander@27: * appreciated but is not required. dvander@27: * dvander@27: * 2. Altered source versions must be plainly marked as such, and must not be dvander@27: * misrepresented as being the original software. dvander@27: * dvander@27: * 3. This notice may not be removed or altered from any source distribution. dvander@27: * dvander@365: * Version: $Id$ dvander@27: */ dvander@27: dvander@27: #include dvander@27: #include dvander@27: #include dvander@27: #include dvander@27: #include "memfile.h" dvander@27: faluco@62: #if defined FORTIFY faluco@62: #include faluco@62: #endif dvander@27: typedef memfile_t MEMFILE; dvander@27: #define tMEMFILE 1 dvander@27: dvander@27: #include "sc.h" dvander@27: faluco@62: MEMFILE *mfcreate(const char *filename) dvander@27: { dvander@27: return memfile_creat(filename, 4096); dvander@27: } dvander@27: dvander@27: void mfclose(MEMFILE *mf) dvander@27: { dvander@27: memfile_destroy(mf); dvander@27: } dvander@27: dvander@27: int mfdump(MEMFILE *mf) dvander@27: { dvander@27: FILE *fp; dvander@27: int okay; dvander@27: dvander@27: assert(mf!=NULL); dvander@27: /* create the file */ dvander@27: fp=fopen(mf->name, "wb"); dvander@27: if (fp==NULL) dvander@27: return 0; dvander@27: dvander@27: okay=1; dvander@27: okay = okay & (fwrite(mf->base, mf->usedoffs, 1, fp)==(size_t)mf->usedoffs); dvander@27: dvander@27: fclose(fp); dvander@27: return okay; dvander@27: } dvander@27: faluco@62: long mflength(const MEMFILE *mf) dvander@27: { dvander@27: return mf->usedoffs; dvander@27: } dvander@27: dvander@27: long mfseek(MEMFILE *mf,long offset,int whence) dvander@27: { dvander@27: long length; dvander@27: dvander@27: assert(mf!=NULL); dvander@27: if (mf->usedoffs == 0) dvander@27: return 0L; /* early exit: not a single byte in the file */ dvander@27: dvander@27: /* find the size of the memory file */ dvander@27: length=mflength(mf); dvander@27: dvander@27: /* convert the offset to an absolute position */ dvander@27: switch (whence) { dvander@27: case SEEK_SET: dvander@27: break; dvander@27: case SEEK_CUR: dvander@27: offset+=mf->offs; dvander@27: break; dvander@27: case SEEK_END: dvander@27: assert(offset<=0); dvander@27: offset+=length; dvander@27: break; dvander@27: } /* switch */ dvander@27: dvander@27: /* clamp to the file length limit */ dvander@27: if (offset<0) dvander@27: offset=0; dvander@27: else if (offset>length) dvander@27: offset=length; dvander@27: dvander@27: /* set new position and return it */ dvander@27: memfile_seek(mf, offset); dvander@27: dvander@27: return offset; dvander@27: } dvander@27: faluco@62: unsigned int mfwrite(MEMFILE *mf,const unsigned char *buffer,unsigned int size) dvander@27: { dvander@27: return (memfile_write(mf, buffer, size) ? size : 0); dvander@27: } dvander@27: dvander@27: unsigned int mfread(MEMFILE *mf,unsigned char *buffer,unsigned int size) dvander@27: { dvander@27: return memfile_read(mf, buffer, size); dvander@27: } dvander@27: dvander@27: char *mfgets(MEMFILE *mf,char *string,unsigned int size) dvander@27: { dvander@27: char *ptr; dvander@27: unsigned int read; dvander@27: long seek; dvander@27: dvander@27: assert(mf!=NULL); dvander@27: dvander@27: read=mfread(mf,(unsigned char *)string,size); dvander@27: if (read==0) dvander@27: return NULL; dvander@27: seek=0L; dvander@27: dvander@27: /* make sure that the string is zero-terminated */ dvander@27: assert(read<=size); dvander@27: if (read