stream interface for uchar vectors

* read- and write-access through regular stream functions
* automatic cleanup
This commit is contained in:
ac-stef
2015-09-07 14:53:55 +02:00
parent ff523df873
commit da426c93cf
2 changed files with 74 additions and 0 deletions
+73
View File
@@ -750,6 +750,79 @@ struct gzstream : stream
}
};
struct vecstream : stream
{
vector<uchar> *data;
int pointer;
vecstream(vector<uchar> *s) : data(s), pointer(0) {}
~vecstream() { DELETEP(data); }
void close() { DELETEP(data); }
bool end() { return data ? pointer >= data->length() : true; }
long tell() { return data ? pointer : -1; }
long size() { return data ? data->length() : -1; }
bool seek(long offset, int whence)
{
int newpointer = -1;
if(data) switch(whence)
{
case SEEK_SET: newpointer = 0; break;
case SEEK_CUR: newpointer = pointer; break;
case SEEK_END: newpointer = data->length(); break;
}
if(newpointer >= 0) newpointer += offset;
if(newpointer >= 0 && data && newpointer <= data->length())
{
pointer = newpointer;
return true;
}
return false;
}
int read(void *buf, int len)
{
int got = 0;
if(data && data->inrange(pointer))
{
got = min(len, data->length() - pointer);
memcpy(buf, data->getbuf() + pointer, got);
pointer += got;
}
return got;
}
int write(const void *buf, int len)
{
if(data)
{
while(data->length() < pointer + len) data->add(0);
memcpy(data->getbuf() + pointer, buf, len);
pointer += len;
}
else len = 0;
return len;
}
int printf(const char *fmt, ...) // limited to MAXSTRLEN
{
int len = 0;
if(data)
{
defvformatstring(temp, fmt, fmt);
len = strlen(temp);
if(len) data->put((uchar *)temp, len);
}
return len;
}
};
stream *openvecfile(vector<uchar> *s)
{
return new vecstream(s ? s : new vector<uchar>);
}
stream *openrawfile(const char *filename, const char *mode)
{
+1
View File
@@ -947,6 +947,7 @@ extern int findfilelocation;
enum { FFL_WORKDIR = -1, FFL_HOME = 0 };
extern const char *findfile(const char *filename, const char *mode);
extern int getfilesize(const char *filename);
extern stream *openvecfile(vector<uchar> *s = NULL);
extern stream *openrawfile(const char *filename, const char *mode);
extern stream *openzipfile(const char *filename, const char *mode);
extern stream *openfile(const char *filename, const char *mode);