127 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * mio.c - Colin Kelley  1-18-87
 | |
|  *   routines to emulate temporary file handling with memory instead
 | |
|  *
 | |
|  * rjm 980212 - changed to use memcpy rather than bcopy
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #define UNUSED(var) ((void) var)
 | |
| 
 | |
| #define MALLOC_SIZE	10000
 | |
| #define JUNK_FPTR	stdin	/* junk ptr to return (unused) */
 | |
| 
 | |
| static unsigned char *mhead;	/* pointer to start of malloc()d area */
 | |
| static unsigned char *mend;	/* pointer to current (just beyond) EOF*/
 | |
| static unsigned char *mptr;	/* pointer to current position */
 | |
| static unsigned int msize;	/* size of chunk mhead points to */
 | |
| 
 | |
| FILE *mfopen(char *filename,char *mode)
 | |
| {
 | |
| 	UNUSED (filename);
 | |
| 	UNUSED (mode);
 | |
| 	if ((mhead = malloc(MALLOC_SIZE)) == NULL) {
 | |
| 		msize = 0;
 | |
| 		return (NULL);
 | |
| 	}
 | |
| 	msize = MALLOC_SIZE;
 | |
| 	mend = mptr = mhead;
 | |
| 	return (JUNK_FPTR);				/* not used */
 | |
| }
 | |
| 
 | |
| int mfclose(FILE *f)
 | |
| {
 | |
| 	UNUSED (f);
 | |
| 	if (mhead) {
 | |
| 		free(mhead);
 | |
| 		return (0);
 | |
| 	}
 | |
| 	else
 | |
| 		return (-1);
 | |
| }
 | |
| 
 | |
| int mfputc(unsigned int c,FILE *f)
 | |
| {
 | |
| 	unsigned char *p;
 | |
| 	UNUSED (f);
 | |
| 	while (mptr >= mhead + msize) {
 | |
| 		if ((p = realloc(mhead,msize+MALLOC_SIZE)) == (unsigned char *)-1) {
 | |
| 			fputs("mio: out of memory\n",stderr);
 | |
| 			return (-1);
 | |
| 		}
 | |
| 		else {
 | |
| 			msize += MALLOC_SIZE;
 | |
| 			mptr = (unsigned char *) (p + (unsigned int)(mptr - mhead));
 | |
| 			mhead = p;
 | |
| 		}
 | |
| 	}
 | |
| 	*mptr = c & 255;
 | |
| 	mend = ++mptr;
 | |
| 	return c;
 | |
| }
 | |
| 
 | |
| int mfgetc(FILE *f)
 | |
| {
 | |
| 	UNUSED (f);
 | |
| 	if (mptr >= mend)		/* no characters left */
 | |
| 		return (-1);
 | |
| 	else
 | |
| 		return (*mptr++);
 | |
| }
 | |
| 
 | |
| int mfseek(FILE *f,long loc,int origin)
 | |
| {
 | |
| 	UNUSED (f);
 | |
| 	if (origin != 0) {
 | |
| 		fputs("mseek() only implemented with 0 origin",stderr);
 | |
| 		return (-1);
 | |
| 	}
 | |
| 	mptr = mhead + loc;
 | |
| 	return (0);
 | |
| }
 | |
| 
 | |
| int mfread(char *ptr, unsigned int size, unsigned int nitems, FILE *f)
 | |
| {
 | |
| 	unsigned int i = 0;
 | |
| 	UNUSED (f);
 | |
| 	while (i < nitems) {
 | |
| 		if ((mptr + size) > mend)
 | |
| 			break;
 | |
| 		memcpy(ptr,mptr,size);
 | |
| 		ptr += size;
 | |
| 		mptr += size;
 | |
| 		i++;
 | |
| 	}
 | |
| 	return (i);
 | |
| }
 | |
| 
 | |
| int mfwrite(char *ptr, int size, int nitems, FILE *f)
 | |
| {
 | |
| 	int i = 0;
 | |
| 	unsigned char *p;
 | |
| 	UNUSED (f);
 | |
| 	while (i < nitems) {
 | |
| 		while (mptr + size >= mhead + msize) {
 | |
| 			if ((p = realloc(mhead,msize+MALLOC_SIZE)) == (unsigned char *)-1){
 | |
| 				fputs("mio: out of memory\n",stderr);
 | |
| 				return (-1);
 | |
| 			}
 | |
| 			else {
 | |
| 				msize += MALLOC_SIZE;
 | |
| 				mptr = (unsigned char *) (p + (unsigned int)(mptr - mhead));
 | |
| 				mhead = p;
 | |
| 			}
 | |
| 		}
 | |
| 		if ((mptr + size) > mhead + msize)
 | |
| 			break;
 | |
| 		memcpy(mend,ptr,size);
 | |
| 		ptr += size;
 | |
| 		mend += size;
 | |
| 		mptr = mend;
 | |
| 	}
 | |
| 	return (i);
 | |
| }
 | 
