mirror of
https://forge.fsky.io/lda/Parsee.git
synced 2026-03-13 21:35:10 +00:00
[MOD] Be stringent about OIDs, use fmemopen
This commit is contained in:
parent
55674c369b
commit
3366fcb759
8 changed files with 76 additions and 122 deletions
|
|
@ -7,125 +7,13 @@
|
|||
|
||||
#include <string.h>
|
||||
|
||||
typedef struct ReaderCookie {
|
||||
size_t length;
|
||||
size_t offset;
|
||||
char *buffer;
|
||||
} ReaderCookie;
|
||||
|
||||
#define Remaining() (cook->length - cook->offset)
|
||||
|
||||
static ssize_t
|
||||
ReadStreamReader(void *coop, void *to, size_t n)
|
||||
{
|
||||
ReaderCookie *cook = coop;
|
||||
size_t remaining;
|
||||
if (!cook)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
remaining = Remaining();
|
||||
if (n > remaining)
|
||||
{
|
||||
memcpy(to, cook->buffer + cook->offset, remaining);
|
||||
cook->offset = cook->length;
|
||||
return remaining;
|
||||
}
|
||||
|
||||
memcpy(to, cook->buffer + cook->offset, n);
|
||||
cook->offset += n;
|
||||
return n;
|
||||
}
|
||||
static ssize_t
|
||||
WriteStreamReader(void *coop, void *from, size_t n)
|
||||
{
|
||||
/* Writing to a stream reader is silly. */
|
||||
return 0;
|
||||
}
|
||||
static off_t
|
||||
SeekStreamReader(void *coop, off_t mag, int sgn)
|
||||
{
|
||||
ReaderCookie *cook = coop;
|
||||
if (!cook)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (sgn)
|
||||
{
|
||||
case SEEK_SET:
|
||||
if (mag > cook->length)
|
||||
{
|
||||
cook->offset = cook->length;
|
||||
return 0;
|
||||
}
|
||||
else if (mag < 0)
|
||||
{
|
||||
cook->offset = 0;
|
||||
return 0;
|
||||
}
|
||||
cook->offset = mag;
|
||||
return 0;
|
||||
case SEEK_CUR:
|
||||
cook->offset += mag;
|
||||
if (cook->offset > cook->length)
|
||||
{
|
||||
cook->offset = cook->length;
|
||||
}
|
||||
else if (cook->offset < 0)
|
||||
{
|
||||
cook->offset = 0;
|
||||
}
|
||||
return 0;
|
||||
case SEEK_END:
|
||||
cook->offset += cook->length + mag;
|
||||
if (cook->offset > cook->length)
|
||||
{
|
||||
cook->offset = cook->length;
|
||||
}
|
||||
else if (cook->offset < 0)
|
||||
{
|
||||
cook->offset = 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
CloseStreamReader(void *coop)
|
||||
{
|
||||
/* Nothing to free as of now. */
|
||||
if (coop)
|
||||
{
|
||||
Free(coop);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
const static IoFunctions Functions = {
|
||||
.read = ReadStreamReader,
|
||||
.seek = SeekStreamReader,
|
||||
.write = WriteStreamReader,
|
||||
.close = CloseStreamReader,
|
||||
};
|
||||
|
||||
Stream *
|
||||
StrStreamReaderN(char *buffer, int n)
|
||||
{
|
||||
Io *raw_io;
|
||||
ReaderCookie *cookie;
|
||||
if (!buffer)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cookie = Malloc(sizeof(*cookie));
|
||||
cookie->buffer = buffer;
|
||||
cookie->length = n ? n : strlen(buffer);
|
||||
cookie->offset = 0;
|
||||
raw_io = IoCreate(cookie, Functions);
|
||||
return StreamIo(raw_io);
|
||||
return StreamFile(fmemopen(buffer, n ? n : strlen(buffer), "rb"));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue