UsingCStream.c
#include "main.h"
#include "support.h"
#include "lt_ioCStream.h"
typedef struct StreamData
{
FILE* fp;
char* name;
char* mode;
} StreamData;
static StreamData*
createStreamData(const char* name, const char* mode)
{
StreamData *streamData = (StreamData *)calloc(1, sizeof(StreamData));
streamData->fp = NULL;
streamData->name = strdup(name);
streamData->mode = strdup(mode);
return streamData;
}
static void
deleteStreamData(StreamData *streamData)
{
free(streamData->name);
free(streamData->mode);
free(streamData);
}
static LT_STATUS myOpen(void *user)
{
StreamData *streamData = (StreamData *)user;
streamData->fp = fopen(streamData->name, streamData->mode);
return streamData->fp ? LT_STS_Success : LT_STS_Failure;
}
static LT_STATUS myClose(void *user)
{
StreamData *streamData = (StreamData *)user;
fclose(streamData->fp);
streamData->fp = NULL;
return LT_STS_Success;
}
static lt_uint32 myRead(void *user, lt_uint8* buf, lt_uint32 len)
{
StreamData *streamData = (StreamData *)user;
return (lt_uint32)fread(buf, 1, len, streamData->fp);
}
static lt_uint32 myWrite(void *user, const lt_uint8* buf, lt_uint32 len)
{
StreamData *streamData = (StreamData *)user;
return (lt_uint32)fwrite(buf, 1, len, streamData->fp);
}
static LT_STATUS mySeek(void *user, lt_int64 pos, LTIOSeekDir dir)
{
StreamData *streamData = (StreamData *)user;
int mydir = 0;
switch (dir)
{
case LTIO_SEEK_DIR_BEG: mydir = SEEK_SET; break;
case LTIO_SEEK_DIR_CUR: mydir = SEEK_CUR; break;
case LTIO_SEEK_DIR_END: mydir = SEEK_END; break;
default: return LT_STS_BadParam;
};
return fseek(streamData->fp, (long)pos, mydir) ?
LT_STS_Failure : LT_STS_Success;
}
static lt_int64 myTell(void *user)
{
StreamData *streamData = (StreamData *)user;
return ftell(streamData->fp);
}
static lt_uint8 myIsEOF(void *user)
{
StreamData *streamData = (StreamData *)user;
return feof(streamData->fp) != 0;
}
static lt_uint8 myIsOpen(void *user)
{
StreamData *streamData = (StreamData *)user;
return streamData->fp != NULL;
}
static void *myDuplicate(void *user)
{
StreamData *streamData = (StreamData *)user;
return createStreamData(streamData->name, streamData->mode);
}
LT_STATUS UsingCStream(void)
{
LT_STATUS sts = LT_STS_Uninit;
lt_uint8 buf[5];
StreamData *streamData = createStreamData(INPUT_PATH("meg.hdr"), "r");
LTIOStreamH stream = lt_ioCallbackStreamCreate(myOpen, myClose,
myRead, myWrite,
mySeek, myTell,
myIsEOF, myIsOpen,
myDuplicate,
streamData);
TEST_BOOL(stream != NULL);
TEST_SUCCESS(lt_ioCStreamOpen(stream));
TEST_BOOL(streamData->fp!=NULL);
TEST_BOOL(lt_ioCStreamRead(stream,buf, 5) == 5);
TEST_BOOL(strncmp((char*)buf, "NROWS", 5) == 0);
TEST_SUCCESS(lt_ioCStreamSeek(stream, 2, LTIO_SEEK_DIR_CUR));
TEST_BOOL(lt_ioCStreamTell(stream) == 7);
TEST_BOOL(lt_ioCStreamRead(stream,buf, 2) == 2);
TEST_BOOL(strncmp((char*)buf, "80", 2)==0);
{
LTIOStreamH stream2 = lt_ioCStreamDuplicate(stream);
TEST_SUCCESS(lt_ioCStreamOpen(stream2));
TEST_BOOL(lt_ioCStreamRead(stream2,buf, 5) == 5);
TEST_BOOL(strncmp((char*)buf, "NROWS", 5)==0);
}
TEST_SUCCESS(lt_ioCStreamClose(stream));
deleteStreamData(streamData);
return LT_STS_Success;
}