home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume9 / zmac / part01 / mio.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-03-11  |  2.3 KB  |  131 lines

  1. /*
  2.  * mio.c - Colin Kelley  1-18-87
  3.  *   routines to emulate temporary file handling with memory instead
  4.  *
  5.  */
  6.  
  7. #include <stdio.h>
  8. #define MALLOC_SIZE 10000
  9.  
  10. unsigned char *malloc(), *realloc();
  11.  
  12. static unsigned char *mhead;        /* pointer to start of malloc()d area */
  13. static unsigned char *mend;            /* pointer to current (just beyond) EOF*/
  14. static unsigned char *mptr;            /* pointer to current position */
  15. static unsigned int msize;            /* size of chunk mhead points to */
  16.  
  17. FILE *
  18. mfopen(filename,mode)
  19. char *filename,*mode;
  20. {
  21.     if ((mhead = malloc(MALLOC_SIZE)) == 0) {
  22.         msize = 0;
  23.         return (0);
  24.     }
  25.     msize = MALLOC_SIZE;
  26.     mend = mptr = mhead;
  27.     return ((FILE *)1);                /* not used */
  28. }
  29.  
  30. mfclose(f)
  31. FILE *f;
  32. {
  33.     if (mhead) {
  34.         free(mhead);
  35.         return (0);
  36.     }
  37.     else
  38.         return (-1);
  39. }
  40.  
  41. unsigned int
  42. mfputc(c,f)
  43. unsigned int c;
  44. FILE *f;
  45. {
  46. register unsigned char *p;
  47.     while (mptr >= mhead + msize) {
  48.         if ((p = realloc(mhead,msize+MALLOC_SIZE)) == (unsigned char *)-1) {
  49.             fputs("mio: out of memory\n",stderr);
  50.             return (-1);
  51.         }
  52.         else {
  53.             msize += MALLOC_SIZE;
  54.             mptr = (unsigned char *) (p + (unsigned int)(mptr - mhead));
  55.             mhead = p;
  56.         }
  57.     }
  58.     *mptr = c & 255;
  59.     mend = ++mptr;
  60.     return c;
  61. }
  62.  
  63. unsigned int
  64. mfgetc(f)
  65. FILE *f;
  66. {
  67.     if (mptr >= mend)        /* no characters left */
  68.         return (-1);
  69.     else
  70.         return (*mptr++);
  71. }
  72.  
  73. mfseek(f,loc,origin)
  74. FILE *f;
  75. long loc;
  76. int origin;
  77. {
  78.     if (origin != 0) {
  79.         fputs("mseek() only implemented with 0 origin",stderr);
  80.         return (-1);
  81.     }
  82.     mptr = mhead + loc;
  83.     return (0);
  84. }
  85.  
  86. mfread(ptr, size, nitems,f)
  87. char *ptr;
  88. unsigned int size, nitems;
  89. FILE *f;
  90. {
  91. register unsigned int i = 0;
  92.     while (i < nitems) {
  93.         if ((mptr + size) > mend)
  94.             break;
  95.         bcopy(mptr,ptr,size);
  96.         ptr += size;
  97.         mptr += size;
  98.         i++;
  99.     }
  100.     return (i);
  101. }
  102.  
  103. mfwrite(ptr, size, nitems, f)
  104. char *ptr;
  105. int size, nitems;
  106. FILE *f;
  107. {
  108. register unsigned int i = 0;
  109. register unsigned char *p;
  110.     while (i < nitems) {
  111.         while (mptr + size >= mhead + msize) {
  112.             if ((p = realloc(mhead,msize+MALLOC_SIZE)) == (unsigned char *)-1){
  113.                 fputs("mio: out of memory\n",stderr);
  114.                 return (-1);
  115.             }
  116.             else {
  117.                 msize += MALLOC_SIZE;
  118.                 mptr = (unsigned char *) (p + (unsigned int)(mptr - mhead));
  119.                 mhead = p;
  120.             }
  121.         }
  122.         if ((mptr + size) > mhead + msize)
  123.             break;
  124.         bcopy(ptr,mend,size);
  125.         ptr += size;
  126.         mend += size;
  127.         mptr = mend;
  128.     }
  129.     return (i);
  130. }
  131.