コード例 #1
0
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);
}
コード例 #2
0
ファイル: streams_internal.c プロジェクト: vmlemon/pistachio
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));
}
コード例 #3
0
ファイル: streams_internal.c プロジェクト: aosm/Libstreams
__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;
    }
コード例 #4
0
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);
}