NXStream *NXOpenMemory(const char *addr, int size, int mode) { NXStream *s; int newMode = mode; if ((int)addr % vm_page_size && (mode != NX_READONLY)) return 0; s = NXStreamCreate(newMode, FALSE); s->functions = &memory_functions; s->buf_base = (unsigned char *)addr; s->buf_size = size; s->buf_left = size; s->buf_ptr = (unsigned char *)addr; s->eof = size; s->flags |= NX_CANSEEK; if (addr) s->flags |= NX_USER_OWNS_BUF; else switch(mode) { case NX_READONLY: break; case NX_WRITEONLY: memory_flush(s); /* get initial buffer */ break; case NX_READWRITE: if (s->flags & NX_READFLAG) { NXChangeBuffer(s); memory_flush(s); /* get initial buffer */ } break; } return (s); }
extern int _NXStreamChangeBuffer(NXStream *s, unsigned char ch) { int wasReading; _NXVerifyStream(s); wasReading = (s->flags & NX_READFLAG); NXChangeBuffer(s); if (wasReading) NXPutc(s, ch); else ch = NXGetc(s); return ((int)(ch)); }
__private_extern__ int NXDefaultWrite(NXStream *s, const void *buf, int count) { register int n; int total = count; int curPos; const char * volatile bufPtr = buf; NXHandler exception; _NXVerifyStream(s); /* * Loop until copying complete. */ exception.code = 0; if (s->flags & NX_READFLAG) NXChangeBuffer(s); while (count > 0) { /* * Flush buffer if necessary. */ if (s->buf_left == 0) { NX_DURING { (void)NXFlush(s); } NX_HANDLER { exception = NXLocalHandler; break; } NX_ENDHANDLER } /* * Figure out how much to copy this time. */ n = count; if (n > s->buf_left) n = s->buf_left; bcopy((const char *)bufPtr, s->buf_ptr, n); /* * Update all pointers. */ s->buf_ptr += n; s->buf_left -= n; bufPtr += n; count -= n; }
NXStream *NXOpenSmallMemory(int mode){ NXStream *s; int newMode = mode; char *addr; if (mode != NX_WRITEONLY && mode != NX_READWRITE) return NULL; addr = malloc(INITIAL_SIZE); s = NXStreamCreate(newMode, FALSE); s->functions = &cheap_functions; s->buf_base = (unsigned char *)addr; s->buf_size = INITIAL_SIZE; s->buf_left = INITIAL_SIZE; s->buf_ptr = (unsigned char *)addr; s->eof = 0; s->flags |= NX_CANSEEK; switch(mode) { case NX_READWRITE: if (s->flags & NX_READFLAG) { NXChangeBuffer(s); } break; } return (s); }