/* mem-writer.c
*
* COPYRIGHT (c) 1995 AT&T Bell Laboratories.
*
* An implementation of the abstract writers on top of memory regions.
*/
#include "ml-base.h"
#include "writer.h"
#ifndef BUFSIZ
#define BUFSIZ 4096
#endif
typedef struct buffer {
Byte_t *base;
Byte_t *next;
Byte_t *top;
} wr_buffer_t;
PVT void Put (writer_t *wr, Word_t w);
PVT void Write (writer_t *wr, const void *data, Addr_t nbytes);
PVT void Flush (writer_t *wr);
PVT long Tell (writer_t *wr);
PVT void Seek (writer_t *wr, long offset);
PVT void Free (writer_t *wr);
#define BufOf(wr) ((wr_buffer_t *)((wr)->data))
/* WR_OpenMem:
*
* Open a file for writing, and make a writer for it.
*/
writer_t *WR_OpenMem (Byte_t *data, Addr_t len)
{
wr_buffer_t *bp;
writer_t *wr;
bp = NEW_OBJ(wr_buffer_t);
bp->base = data;
bp->next = data;
bp->top = (Byte_t *)(((Addr_t)data) + len);
wr = NEW_OBJ(writer_t);
wr->errFlg = FALSE;
wr->data = (void *)bp;
wr->putWord = Put;
wr->write = Write;
wr->flush = Flush;
wr->tell = Tell;
wr->seek = Seek;
wr->free = Free;
return wr;
} /* end of WR_OpenMem */
/* Put:
*/
PVT void Put (writer_t *wr, Word_t w)
{
wr_buffer_t *bp = BufOf(wr);
ASSERT(bp->next+WORD_SZB <= bp->top);
*((Word_t *)(bp->next)) = w;
bp->next += WORD_SZB;
} /* end of Put */
/* Write:
*/
PVT void Write (writer_t *wr, const void *data, Addr_t nbytes)
{
wr_buffer_t *bp = BufOf(wr);
if (wr->errFlg)
return;
ASSERT(bp->next+nbytes <= bp->top);
memcpy (bp->next, data, nbytes);
bp->next += nbytes;
} /* end of Write */
/* Flush:
*/
PVT void Flush (writer_t *wr)
{
wr_buffer_t *bp = BufOf(wr);
ASSERT(bp->next <= bp->top);
} /* end of Flush */
/* Tell:
*/
PVT long Tell (writer_t *wr)
{
Die ("Tell not supported on memory writers");
} /* end of Tell */
/* Seek:
*/
PVT void Seek (writer_t *wr, long offset)
{
Die ("Tell not supported on memory writers");
} /* end of Seek */
/* Free:
*/
PVT void Free (writer_t *wr)
{
wr_buffer_t *bp = BufOf(wr);
ASSERT(bp->next == bp->top);
FREE (BufOf(wr));
FREE (wr);
} /* end of Free */
syntax highlighted by Code2HTML, v. 0.9.1