summaryrefslogtreecommitdiff
path: root/src/shared/stream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/stream.cpp')
-rw-r--r--src/shared/stream.cpp489
1 files changed, 143 insertions, 346 deletions
diff --git a/src/shared/stream.cpp b/src/shared/stream.cpp
index 8f218ad..1878801 100644
--- a/src/shared/stream.cpp
+++ b/src/shared/stream.cpp
@@ -2,24 +2,21 @@
///////////////////////////// console ////////////////////////
-void conoutf(const char *fmt, ...)
-{
+void conoutf(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
conoutfv(CON_INFO, fmt, args);
va_end(args);
}
-void conoutf(int type, const char *fmt, ...)
-{
+void conoutf(int type, const char *fmt, ...) {
va_list args;
va_start(args, fmt);
conoutfv(type, fmt, args);
va_end(args);
}
-void conoutf(int type, int tag, const char *fmt, ...)
-{
+void conoutf(int type, int tag, const char *fmt, ...) {
va_list args;
va_start(args, fmt);
conoutfv(type | ((tag << CON_TAG_SHIFT) & CON_TAG_MASK), fmt, args);
@@ -46,8 +43,7 @@ void conoutf(int type, int tag, const char *fmt, ...)
U, U, U, U, u, u, u, u, u, u, u, u, u, u, u, u, \
u, u, u, u, u, u, u, u, u, u, u, u, u, u, U, u
-extern const uchar cubectype[256] =
-{
+extern const uchar cubectype[256] = {
CUBECTYPE(CT_SPACE,
CT_PRINT,
CT_PRINT|CT_DIGIT,
@@ -56,8 +52,7 @@ extern const uchar cubectype[256] =
CT_PRINT|CT_UNICODE|CT_ALPHA|CT_LOWER,
CT_PRINT|CT_UNICODE|CT_ALPHA|CT_UPPER)
};
-extern const int cube2unichars[256] =
-{
+extern const int cube2unichars[256] = {
0, 192, 193, 194, 195, 196, 197, 198, 199, 9, 10, 11, 12, 13, 200, 201,
202, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
@@ -75,12 +70,10 @@ extern const int cube2unichars[256] =
0x42C, 0x42D, 0x42E, 0x42F, 0x431, 0x432, 0x433, 0x434, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D,
0x43F, 0x442, 0x444, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x454, 0x490, 0x491
};
-extern const int uni2cubeoffsets[8] =
-{
+extern const int uni2cubeoffsets[8] = {
0, 256, 658, 658, 512, 658, 658, 658
};
-extern const uchar uni2cubechars[878] =
-{
+extern const uchar uni2cubechars[878] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
@@ -110,8 +103,7 @@ extern const uchar uni2cubechars[878] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
-extern const uchar cubelowerchars[256] =
-{
+extern const uchar cubelowerchars[256] = {
0, 130, 131, 132, 133, 134, 135, 136, 137, 9, 10, 11, 12, 13, 138, 139,
140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
@@ -129,8 +121,7 @@ extern const uchar cubelowerchars[256] =
224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255
};
-extern const uchar cubeupperchars[256] =
-{
+extern const uchar cubeupperchars[256] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
@@ -149,12 +140,10 @@ extern const uchar cubeupperchars[256] =
240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255
};
-size_t decodeutf8(uchar *dstbuf, size_t dstlen, const uchar *srcbuf, size_t srclen, size_t *carry)
-{
+size_t decodeutf8(uchar *dstbuf, size_t dstlen, const uchar *srcbuf, size_t srclen, size_t *carry) {
uchar *dst = dstbuf, *dstend = &dstbuf[dstlen];
const uchar *src = srcbuf, *srcend = &srcbuf[srclen];
- if(dstbuf == srcbuf)
- {
+ if(dstbuf == srcbuf) {
int len = min(dstlen, srclen);
for(const uchar *end4 = &srcbuf[len&~3]; src < end4; src += 4) if(*(const int *)src & 0x80808080) goto decode;
for(const uchar *end = &srcbuf[len]; src < end; src++) if(*src & 0x80) goto decode;
@@ -164,21 +153,15 @@ size_t decodeutf8(uchar *dstbuf, size_t dstlen, const uchar *srcbuf, size_t srcl
decode:
dst += src - srcbuf;
- while(src < srcend && dst < dstend)
- {
+ while(src < srcend && dst < dstend) {
int c = *src++;
if(c < 0x80) *dst++ = c;
- else if(c >= 0xC0)
- {
+ else if(c >= 0xC0) {
int uni;
- if(c >= 0xE0)
- {
- if(c >= 0xF0)
- {
- if(c >= 0xF8)
- {
- if(c >= 0xFC)
- {
+ if(c >= 0xE0) {
+ if(c >= 0xF0) {
+ if(c >= 0xF8) {
+ if(c >= 0xFC) {
if(c >= 0xFE) continue;
uni = c&1; if(srcend - src < 5) break;
c = *src; if((c&0xC0) != 0x80) continue; src++; uni = (uni<<6) | (c&0x3F);
@@ -203,21 +186,16 @@ decode:
return dst - dstbuf;
}
-size_t encodeutf8(uchar *dstbuf, size_t dstlen, const uchar *srcbuf, size_t srclen, size_t *carry)
-{
+size_t encodeutf8(uchar *dstbuf, size_t dstlen, const uchar *srcbuf, size_t srclen, size_t *carry) {
uchar *dst = dstbuf, *dstend = &dstbuf[dstlen];
const uchar *src = srcbuf, *srcend = &srcbuf[srclen];
- if(src < srcend && dst < dstend) do
- {
+ if(src < srcend && dst < dstend) do {
int uni = cube2uni(*src);
- if(uni <= 0x7F)
- {
+ if(uni <= 0x7F) {
if(dst >= dstend) goto done;
const uchar *end = min(srcend, &src[dstend-dst]);
- do
- {
- if(uni == '\f')
- {
+ do {
+ if(uni == '\f') {
if(++src >= srcend) goto done;
goto uni1;
}
@@ -255,31 +233,26 @@ done:
#include <dirent.h>
string homedir = "";
-struct packagedir
-{
+struct packagedir {
char *dir, *filter;
size_t dirlen, filterlen;
};
vector<packagedir> packagedirs;
-char *makerelpath(const char *dir, const char *file, const char *prefix, const char *cmd)
-{
+char *makerelpath(const char *dir, const char *file, const char *prefix, const char *cmd) {
static string tmp;
if(prefix) copystring(tmp, prefix);
else tmp[0] = '\0';
- if(file[0]=='<')
- {
+ if(file[0]=='<') {
const char *end = strrchr(file, '>');
- if(end)
- {
+ if(end) {
size_t len = strlen(tmp);
copystring(&tmp[len], file, min(sizeof(tmp)-len, size_t(end+2-file)));
file = end+1;
}
}
if(cmd) concatstring(tmp, cmd);
- if(dir)
- {
+ if(dir) {
defformatstring(pname, "%s/%s", dir, file);
concatstring(tmp, pname);
}
@@ -288,43 +261,35 @@ char *makerelpath(const char *dir, const char *file, const char *prefix, const c
}
-char *path(char *s)
-{
- for(char *curpart = s;;)
- {
+char *path(char *s) {
+ for(char *curpart = s;;) {
char *endpart = strchr(curpart, '&');
if(endpart) *endpart = '\0';
- if(curpart[0]=='<')
- {
+ if(curpart[0]=='<') {
char *file = strrchr(curpart, '>');
if(!file) return s;
curpart = file+1;
}
for(char *t = curpart; (t = strpbrk(t, "/\\")); *t++ = PATHDIV);
- for(char *prevdir = NULL, *curdir = curpart;;)
- {
+ for(char *prevdir = NULL, *curdir = curpart;;) {
prevdir = curdir[0]==PATHDIV ? curdir+1 : curdir;
curdir = strchr(prevdir, PATHDIV);
if(!curdir) break;
- if(prevdir+1==curdir && prevdir[0]=='.')
- {
+ if(prevdir+1==curdir && prevdir[0]=='.') {
memmove(prevdir, curdir+1, strlen(curdir+1)+1);
curdir = prevdir;
}
- else if(curdir[1]=='.' && curdir[2]=='.' && curdir[3]==PATHDIV)
- {
+ else if(curdir[1]=='.' && curdir[2]=='.' && curdir[3]==PATHDIV) {
if(prevdir+2==curdir && prevdir[0]=='.' && prevdir[1]=='.') continue;
memmove(prevdir, curdir+4, strlen(curdir+4)+1);
- if(prevdir-2 >= curpart && prevdir[-1]==PATHDIV)
- {
+ if(prevdir-2 >= curpart && prevdir[-1]==PATHDIV) {
prevdir -= 2;
while(prevdir-1 >= curpart && prevdir[-1] != PATHDIV) --prevdir;
}
curdir = prevdir;
}
}
- if(endpart)
- {
+ if(endpart) {
*endpart = '&';
curpart = endpart+1;
}
@@ -333,16 +298,14 @@ char *path(char *s)
return s;
}
-char *path(const char *s, bool copy)
-{
+char *path(const char *s, bool copy) {
static string tmp;
copystring(tmp, s);
path(tmp);
return tmp;
}
-const char *parentdir(const char *directory)
-{
+const char *parentdir(const char *directory) {
const char *p = directory + strlen(directory);
while(p > directory && *p != '/' && *p != '\\') p--;
static string parent;
@@ -351,43 +314,36 @@ const char *parentdir(const char *directory)
return parent;
}
-bool fileexists(const char *path, const char *mode)
-{
+bool fileexists(const char *path, const char *mode) {
bool exists = true;
if(mode[0]=='w' || mode[0]=='a') path = parentdir(path);
if(access(path[0] ? path : ".", mode[0]=='w' || mode[0]=='a' ? W_OK : (mode[0]=='d' ? X_OK : R_OK)) == -1) exists = false;
return exists;
}
-bool createdir(const char *path)
-{
+bool createdir(const char *path) {
size_t len = strlen(path);
- if(path[len-1]==PATHDIV)
- {
+ if(path[len-1]==PATHDIV) {
static string strip;
path = copystring(strip, path, len);
}
return mkdir(path, 0777)==0;
}
-size_t fixpackagedir(char *dir)
-{
+size_t fixpackagedir(char *dir) {
path(dir);
size_t len = strlen(dir);
- if(len > 0 && dir[len-1] != PATHDIV)
- {
+ if(len > 0 && dir[len-1] != PATHDIV) {
dir[len] = PATHDIV;
dir[len+1] = '\0';
}
return len;
}
-bool subhomedir(char *dst, int len, const char *src)
-{
+bool subhomedir(char *dst, int len, const char *src) {
const char *sub = strstr(src, "$HOME");
if(!sub) sub = strchr(src, '~');
- if(sub && sub-src < len)
- {
+ if(sub && sub-src < len) {
const char *home = getenv("HOME");
if(!home || !home[0]) return false;
dst[sub-src] = '\0';
@@ -397,8 +353,7 @@ bool subhomedir(char *dst, int len, const char *src)
return true;
}
-const char *sethomedir(const char *dir)
-{
+const char *sethomedir(const char *dir) {
string pdir;
copystring(pdir, dir);
if(!subhomedir(pdir, sizeof(pdir), dir) || !fixpackagedir(pdir)) return NULL;
@@ -406,14 +361,12 @@ const char *sethomedir(const char *dir)
return homedir;
}
-const char *addpackagedir(const char *dir)
-{
+const char *addpackagedir(const char *dir) {
string pdir;
copystring(pdir, dir);
if(!subhomedir(pdir, sizeof(pdir), dir) || !fixpackagedir(pdir)) return NULL;
char *filter = pdir;
- for(;;)
- {
+ for(;;) {
static int len = strlen("packages");
filter = strstr(filter, "packages");
if(!filter) break;
@@ -428,20 +381,16 @@ const char *addpackagedir(const char *dir)
return pf.dir;
}
-const char *findfile(const char *filename, const char *mode)
-{
+const char *findfile(const char *filename, const char *mode) {
static string s;
- if(homedir[0])
- {
+ if(homedir[0]) {
formatstring(s, "%s%s", homedir, filename);
if(fileexists(s, mode)) return s;
- if(mode[0]=='w' || mode[0]=='a')
- {
+ if(mode[0]=='w' || mode[0]=='a') {
string dirs;
copystring(dirs, s);
char *dir = strchr(dirs[0]==PATHDIV ? dirs+1 : dirs, PATHDIV);
- while(dir)
- {
+ while(dir) {
*dir = '\0';
if(!fileexists(dirs, "d") && !createdir(dirs)) return s;
*dir = PATHDIV;
@@ -451,8 +400,7 @@ const char *findfile(const char *filename, const char *mode)
}
}
if(mode[0]=='w' || mode[0]=='a') return filename;
- loopv(packagedirs)
- {
+ loopv(packagedirs) {
packagedir &pf = packagedirs[i];
if(pf.filter && strncmp(filename, pf.filter, pf.filterlen)) continue;
formatstring(s, "%s%s", pf.dir, filename);
@@ -462,22 +410,17 @@ const char *findfile(const char *filename, const char *mode)
return filename;
}
-bool listdir(const char *dirname, bool rel, const char *ext, vector<char *> &files)
-{
+bool listdir(const char *dirname, bool rel, const char *ext, vector<char *> &files) {
size_t extsize = ext ? strlen(ext)+1 : 0;
defformatstring(pathname, rel ? "./%s" : "%s", dirname);
DIR *d = opendir(pathname);
- if(d)
- {
+ if(d) {
struct dirent *de;
- while((de = readdir(d)) != NULL)
- {
+ while((de = readdir(d)) != NULL) {
if(!ext) files.add(newstring(de->d_name));
- else
- {
+ else {
size_t namelen = strlen(de->d_name);
- if(namelen > extsize)
- {
+ if(namelen > extsize) {
namelen -= extsize;
if(de->d_name[namelen] == '.' && strncmp(de->d_name+namelen+1, ext, extsize-1)==0)
files.add(newstring(de->d_name, namelen));
@@ -490,8 +433,7 @@ bool listdir(const char *dirname, bool rel, const char *ext, vector<char *> &fil
else return false;
}
-int listfiles(const char *dir, const char *ext, vector<char *> &files)
-{
+int listfiles(const char *dir, const char *ext, vector<char *> &files) {
string dirname;
copystring(dirname, dir);
path(dirname);
@@ -500,13 +442,11 @@ int listfiles(const char *dir, const char *ext, vector<char *> &files)
int dirs = 0;
if(listdir(dirname, true, ext, files)) dirs++;
string s;
- if(homedir[0])
- {
+ if(homedir[0]) {
formatstring(s, "%s%s", homedir, dirname);
if(listdir(s, false, ext, files)) dirs++;
}
- loopv(packagedirs)
- {
+ loopv(packagedirs) {
packagedir &pf = packagedirs[i];
if(pf.filter && strncmp(dirname, pf.filter, dirlen == pf.filterlen-1 ? dirlen : pf.filterlen))
continue;
@@ -520,32 +460,27 @@ int listfiles(const char *dir, const char *ext, vector<char *> &files)
}
#ifndef STANDALONE
-static Sint64 rwopsseek(SDL_RWops *rw, Sint64 pos, int whence)
-{
+static Sint64 rwopsseek(SDL_RWops *rw, Sint64 pos, int whence) {
stream *f = (stream *)rw->hidden.unknown.data1;
if((!pos && whence==SEEK_CUR) || f->seek(pos, whence)) return (int)f->tell();
return -1;
}
-static size_t rwopsread(SDL_RWops *rw, void *buf, size_t size, size_t nmemb)
-{
+static size_t rwopsread(SDL_RWops *rw, void *buf, size_t size, size_t nmemb) {
stream *f = (stream *)rw->hidden.unknown.data1;
return f->read(buf, size*nmemb)/size;
}
-static size_t rwopswrite(SDL_RWops *rw, const void *buf, size_t size, size_t nmemb)
-{
+static size_t rwopswrite(SDL_RWops *rw, const void *buf, size_t size, size_t nmemb) {
stream *f = (stream *)rw->hidden.unknown.data1;
return f->write(buf, size*nmemb)/size;
}
-static int rwopsclose(SDL_RWops *rw)
-{
+static int rwopsclose(SDL_RWops *rw) {
return 0;
}
-SDL_RWops *stream::rwops()
-{
+SDL_RWops *stream::rwops() {
SDL_RWops *rw = SDL_AllocRW();
if(!rw) return NULL;
rw->hidden.unknown.data1 = this;
@@ -557,18 +492,15 @@ SDL_RWops *stream::rwops()
}
#endif
-stream::offset stream::size()
-{
+stream::offset stream::size() {
offset pos = tell(), endpos;
if(pos < 0 || !seek(0, SEEK_END)) return -1;
endpos = tell();
return pos == endpos || seek(pos, SEEK_SET) ? endpos : -1;
}
-bool stream::getline(char *str, size_t len)
-{
- loopi(len-1)
- {
+bool stream::getline(char *str, size_t len) {
+ loopi(len-1) {
if(read(&str[i], 1) != 1) { str[i] = '\0'; return i > 0; }
else if(str[i] == '\n') { str[i+1] = '\0'; return true; }
}
@@ -576,8 +508,7 @@ bool stream::getline(char *str, size_t len)
return true;
}
-size_t stream::printf(const char *fmt, ...)
-{
+size_t stream::printf(const char *fmt, ...) {
char buf[512];
char *str = buf;
va_list args;
@@ -585,8 +516,7 @@ size_t stream::printf(const char *fmt, ...)
int len = vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
if(len <= 0) return 0;
- if(len >= (int)sizeof(buf))
- {
+ if(len >= (int)sizeof(buf)) {
str = new char[len+1];
va_start(args, fmt);
vsnprintf(str, len+1, fmt, args);
@@ -597,43 +527,31 @@ size_t stream::printf(const char *fmt, ...)
return n;
}
-struct filestream : stream
-{
+struct filestream : stream {
FILE *file;
-
filestream() : file(NULL) {}
~filestream() { close(); }
-
- bool open(const char *name, const char *mode)
- {
+ bool open(const char *name, const char *mode) {
if(file) return false;
file = fopen(name, mode);
return file!=NULL;
}
-
- bool opentemp(const char *name, const char *mode)
- {
+ bool opentemp(const char *name, const char *mode) {
if(file) return false;
file = tmpfile();
return file!=NULL;
}
-
- void close()
- {
+ void close() {
if(file) { fclose(file); file = NULL; }
}
-
bool end() { return feof(file)!=0; }
- offset tell()
- {
+ offset tell() {
offset off = ftello(file);
return off + 1 >= 0 ? off : -1;
}
- bool seek(offset pos, int whence = SEEK_SET)
- {
+ bool seek(offset pos, int whence = SEEK_SET) {
return fseeko(file, pos, whence) >= 0;
}
-
size_t read(void *buf, size_t len) { return fread(buf, 1, len, file); }
size_t write(const void *buf, size_t len) { return fwrite(buf, 1, len, file); }
bool flush() { return !fflush(file); }
@@ -641,9 +559,7 @@ struct filestream : stream
bool putchar(int c) { return fputc(c, file)!=EOF; }
bool getline(char *str, size_t len) { return fgets(str, len, file)!=NULL; }
bool putstring(const char *str) { return fputs(str, file)!=EOF; }
-
- size_t printf(const char *fmt, ...)
- {
+ size_t printf(const char *fmt, ...) {
va_list v;
va_start(v, fmt);
int result = vfprintf(file, fmt, v);
@@ -652,18 +568,14 @@ struct filestream : stream
}
};
-struct gzstream : stream
-{
- enum
- {
+struct gzstream : stream {
+ enum {
MAGIC1 = 0x1F,
MAGIC2 = 0x8B,
BUFSIZE = 16384,
OS_UNIX = 0x03
};
-
- enum
- {
+ enum {
F_ASCII = 0x01,
F_CRC = 0x02,
F_EXTRA = 0x04,
@@ -671,54 +583,40 @@ struct gzstream : stream
F_COMMENT = 0x10,
F_RESERVED = 0xE0
};
-
stream *file;
z_stream zfile;
uchar *buf;
bool reading, writing, autoclose;
uint crc;
size_t headersize;
-
- gzstream() : file(NULL), buf(NULL), reading(false), writing(false), autoclose(false), crc(0), headersize(0)
- {
+ gzstream() : file(NULL), buf(NULL), reading(false), writing(false), autoclose(false), crc(0), headersize(0) {
zfile.zalloc = NULL;
zfile.zfree = NULL;
zfile.opaque = NULL;
zfile.next_in = zfile.next_out = NULL;
zfile.avail_in = zfile.avail_out = 0;
}
-
- ~gzstream()
- {
+ ~gzstream() {
close();
}
-
- void writeheader()
- {
+ void writeheader() {
uchar header[] = { MAGIC1, MAGIC2, Z_DEFLATED, 0, 0, 0, 0, 0, 0, OS_UNIX };
file->write(header, sizeof(header));
}
-
- void readbuf(size_t size = BUFSIZE)
- {
+ void readbuf(size_t size = BUFSIZE) {
if(!zfile.avail_in) zfile.next_in = (Bytef *)buf;
size = min(size, size_t(&buf[BUFSIZE] - &zfile.next_in[zfile.avail_in]));
size_t n = file->read(zfile.next_in + zfile.avail_in, size);
if(n > 0) zfile.avail_in += n;
}
-
- uchar readbyte(size_t size = BUFSIZE)
- {
+ uchar readbyte(size_t size = BUFSIZE) {
if(!zfile.avail_in) readbuf(size);
if(!zfile.avail_in) return 0;
zfile.avail_in--;
return *(uchar *)zfile.next_in++;
}
-
- void skipbytes(size_t n)
- {
- while(n > 0 && zfile.avail_in > 0)
- {
+ void skipbytes(size_t n) {
+ while(n > 0 && zfile.avail_in > 0) {
size_t skipped = min(n, size_t(zfile.avail_in));
zfile.avail_in -= skipped;
zfile.next_in += skipped;
@@ -727,16 +625,13 @@ struct gzstream : stream
if(n <= 0) return;
file->seek(n, SEEK_CUR);
}
-
- bool checkheader()
- {
+ bool checkheader() {
readbuf(10);
if(readbyte() != MAGIC1 || readbyte() != MAGIC2 || readbyte() != Z_DEFLATED) return false;
uchar flags = readbyte();
if(flags & F_RESERVED) return false;
skipbytes(6);
- if(flags & F_EXTRA)
- {
+ if(flags & F_EXTRA) {
size_t len = readbyte(512);
len |= size_t(readbyte(512))<<8;
skipbytes(len);
@@ -747,77 +642,56 @@ struct gzstream : stream
headersize = size_t(file->tell() - zfile.avail_in);
return zfile.avail_in > 0 || !file->end();
}
-
- bool open(stream *f, const char *mode, bool needclose, int level)
- {
+ bool open(stream *f, const char *mode, bool needclose, int level) {
if(file) return false;
- for(; *mode; mode++)
- {
+ for(; *mode; mode++) {
if(*mode=='r') { reading = true; break; }
else if(*mode=='w') { writing = true; break; }
}
- if(reading)
- {
+ if(reading) {
if(inflateInit2(&zfile, -MAX_WBITS) != Z_OK) reading = false;
}
else if(writing && deflateInit2(&zfile, level, Z_DEFLATED, -MAX_WBITS, min(MAX_MEM_LEVEL, 8), Z_DEFAULT_STRATEGY) != Z_OK) writing = false;
if(!reading && !writing) return false;
-
file = f;
crc = crc32(0, NULL, 0);
buf = new uchar[BUFSIZE];
-
- if(reading)
- {
+ if(reading) {
if(!checkheader()) { stopreading(); return false; }
}
else if(writing) writeheader();
-
autoclose = needclose;
return true;
}
-
uint getcrc() { return crc; }
-
- void finishreading()
- {
+ void finishreading() {
if(!reading) return;
}
-
- void stopreading()
- {
+ void stopreading() {
if(!reading) return;
inflateEnd(&zfile);
reading = false;
}
-
- void finishwriting()
- {
+ void finishwriting() {
if(!writing) return;
- for(;;)
- {
+ for(;;) {
int err = zfile.avail_out > 0 ? deflate(&zfile, Z_FINISH) : Z_OK;
if(err != Z_OK && err != Z_STREAM_END) break;
flushbuf();
if(err == Z_STREAM_END) break;
}
- uchar trailer[8] =
- {
+ uchar trailer[8] = {
uchar(crc&0xFF), uchar((crc>>8)&0xFF), uchar((crc>>16)&0xFF), uchar((crc>>24)&0xFF),
uchar(zfile.total_in&0xFF), uchar((zfile.total_in>>8)&0xFF), uchar((zfile.total_in>>16)&0xFF), uchar((zfile.total_in>>24)&0xFF)
};
file->write(trailer, sizeof(trailer));
}
-
- void stopwriting()
- {
+ void stopwriting() {
if(!writing) return;
deflateEnd(&zfile);
writing = false;
}
-
- void close()
- {
+ void close() {
if(reading) finishreading();
stopreading();
if(writing) finishwriting();
@@ -825,72 +699,53 @@ struct gzstream : stream
DELETEA(buf);
if(autoclose) DELETEP(file);
}
-
bool end() { return !reading && !writing; }
offset tell() { return reading ? zfile.total_out : (writing ? zfile.total_in : offset(-1)); }
offset rawtell() { return file ? file->tell() : offset(-1); }
-
- offset size()
- {
+ offset size() {
if(!file) return -1;
offset pos = tell();
if(!file->seek(-4, SEEK_END)) return -1;
uint isize = file->getlil<uint>();
return file->seek(pos, SEEK_SET) ? isize : offset(-1);
}
-
offset rawsize() { return file ? file->size() : offset(-1); }
-
- bool seek(offset pos, int whence)
- {
+ bool seek(offset pos, int whence) {
if(writing || !reading) return false;
-
- if(whence == SEEK_END)
- {
+ if(whence == SEEK_END) {
uchar skip[512];
while(read(skip, sizeof(skip)) == sizeof(skip));
return !pos;
}
else if(whence == SEEK_CUR) pos += zfile.total_out;
-
if(pos >= (offset)zfile.total_out) pos -= zfile.total_out;
else if(pos < 0 || !file->seek(headersize, SEEK_SET)) return false;
- else
- {
- if(zfile.next_in && zfile.total_in <= uint(zfile.next_in - buf))
- {
+ else {
+ if(zfile.next_in && zfile.total_in <= uint(zfile.next_in - buf)) {
zfile.avail_in += zfile.total_in;
zfile.next_in -= zfile.total_in;
}
- else
- {
+ else {
zfile.avail_in = 0;
zfile.next_in = NULL;
}
inflateReset(&zfile);
crc = crc32(0, NULL, 0);
}
-
uchar skip[512];
- while(pos > 0)
- {
+ while(pos > 0) {
size_t skipped = (size_t)min(pos, (offset)sizeof(skip));
if(read(skip, skipped) != skipped) { stopreading(); return false; }
pos -= skipped;
}
-
return true;
}
-
- size_t read(void *buf, size_t len)
- {
+ size_t read(void *buf, size_t len) {
if(!reading || !buf || !len) return 0;
zfile.next_out = (Bytef *)buf;
zfile.avail_out = len;
- while(zfile.avail_out > 0)
- {
- if(!zfile.avail_in)
- {
+ while(zfile.avail_out > 0) {
+ if(!zfile.avail_in) {
readbuf(BUFSIZE);
if(!zfile.avail_in) { stopreading(); break; }
}
@@ -901,12 +756,9 @@ struct gzstream : stream
crc = crc32(crc, (Bytef *)buf, len - zfile.avail_out);
return len - zfile.avail_out;
}
-
- bool flushbuf(bool full = false)
- {
+ bool flushbuf(bool full = false) {
if(full) deflate(&zfile, Z_SYNC_FLUSH);
- if(zfile.next_out && zfile.avail_out < BUFSIZE)
- {
+ if(zfile.next_out && zfile.avail_out < BUFSIZE) {
if(file->write(buf, BUFSIZE - zfile.avail_out) != BUFSIZE - zfile.avail_out || (full && !file->flush()))
return false;
}
@@ -914,16 +766,12 @@ struct gzstream : stream
zfile.avail_out = BUFSIZE;
return true;
}
-
bool flush() { return flushbuf(true); }
-
- size_t write(const void *buf, size_t len)
- {
+ size_t write(const void *buf, size_t len) {
if(!writing || !buf || !len) return 0;
zfile.next_in = (Bytef *)buf;
zfile.avail_in = len;
- while(zfile.avail_in > 0)
- {
+ while(zfile.avail_in > 0) {
if(!zfile.avail_out && !flushbuf()) { stopwriting(); break; }
int err = deflate(&zfile, Z_NO_FLUSH);
if(err != Z_OK) { stopwriting(); break; }
@@ -933,10 +781,8 @@ struct gzstream : stream
}
};
-struct utf8stream : stream
-{
- enum
- {
+struct utf8stream : stream {
+ enum {
BUFSIZE = 4096
};
stream *file;
@@ -944,18 +790,12 @@ struct utf8stream : stream
size_t bufread, bufcarry, buflen;
bool reading, writing, autoclose;
uchar buf[BUFSIZE];
-
- utf8stream() : file(NULL), pos(0), bufread(0), bufcarry(0), buflen(0), reading(false), writing(false), autoclose(false)
- {
+ utf8stream() : file(NULL), pos(0), bufread(0), bufcarry(0), buflen(0), reading(false), writing(false), autoclose(false) {
}
-
- ~utf8stream()
- {
+ ~utf8stream() {
close();
}
-
- bool readbuf(size_t size = BUFSIZE)
- {
+ bool readbuf(size_t size = BUFSIZE) {
if(bufread >= bufcarry) { if(bufcarry > 0 && bufcarry < buflen) memmove(buf, &buf[bufcarry], buflen - bufcarry); buflen -= bufcarry; bufread = bufcarry = 0; }
size_t n = file->read(&buf[buflen], min(size, BUFSIZE - buflen));
if(n <= 0) return false;
@@ -965,98 +805,69 @@ struct utf8stream : stream
if(carry > bufcarry && carry < buflen) { memmove(&buf[bufcarry], &buf[carry], buflen - carry); buflen -= carry - bufcarry; }
return true;
}
-
- bool checkheader()
- {
+ bool checkheader() {
size_t n = file->read(buf, 3);
if(n == 3 && buf[0] == 0xEF && buf[1] == 0xBB && buf[2] == 0xBF) return true;
buflen = n;
return false;
}
-
- bool open(stream *f, const char *mode, bool needclose)
- {
+ bool open(stream *f, const char *mode, bool needclose) {
if(file) return false;
- for(; *mode; mode++)
- {
+ for(; *mode; mode++) {
if(*mode=='r') { reading = true; break; }
else if(*mode=='w') { writing = true; break; }
}
if(!reading && !writing) return false;
-
file = f;
-
if(reading) checkheader();
-
autoclose = needclose;
return true;
}
-
- void finishreading()
- {
+ void finishreading() {
if(!reading) return;
}
-
- void stopreading()
- {
+ void stopreading() {
if(!reading) return;
reading = false;
}
-
- void stopwriting()
- {
+ void stopwriting() {
if(!writing) return;
writing = false;
}
-
- void close()
- {
+ void close() {
stopreading();
stopwriting();
if(autoclose) DELETEP(file);
}
-
bool end() { return !reading && !writing; }
offset tell() { return reading || writing ? pos : offset(-1); }
-
- bool seek(offset off, int whence)
- {
+ bool seek(offset off, int whence) {
if(writing || !reading) return false;
-
- if(whence == SEEK_END)
- {
+ if(whence == SEEK_END) {
uchar skip[512];
while(read(skip, sizeof(skip)) == sizeof(skip));
return !off;
}
else if(whence == SEEK_CUR) off += pos;
-
if(off >= pos) off -= pos;
else if(off < 0 || !file->seek(0, SEEK_SET)) return false;
- else
- {
+ else {
bufread = bufcarry = buflen = 0;
pos = 0;
checkheader();
}
-
uchar skip[512];
- while(off > 0)
- {
+ while(off > 0) {
size_t skipped = (size_t)min(off, (offset)sizeof(skip));
if(read(skip, skipped) != skipped) { stopreading(); return false; }
off -= skipped;
}
-
return true;
}
-
- size_t read(void *dst, size_t len)
- {
+ size_t read(void *dst, size_t len) {
if(!reading || !dst || !len) return 0;
size_t next = 0;
- while(next < len)
- {
+ while(next < len) {
if(bufread >= bufcarry) { if(readbuf(BUFSIZE)) continue; stopreading(); break; }
size_t n = min(len - next, bufcarry - bufread);
memcpy(&((uchar *)dst)[next], &buf[bufread], n);
@@ -1066,14 +877,11 @@ struct utf8stream : stream
pos += next;
return next;
}
-
- bool getline(char *dst, size_t len)
- {
+ bool getline(char *dst, size_t len) {
if(!reading || !dst || !len) return false;
--len;
size_t next = 0;
- while(next < len)
- {
+ while(next < len) {
if(bufread >= bufcarry) { if(readbuf(BUFSIZE)) continue; stopreading(); if(!next) return false; break; }
size_t n = min(len - next, bufcarry - bufread);
uchar *endline = (uchar *)memchr(&buf[bufread], '\n', n);
@@ -1086,14 +894,11 @@ struct utf8stream : stream
pos += next;
return true;
}
-
- size_t write(const void *src, size_t len)
- {
+ size_t write(const void *src, size_t len) {
if(!writing || !src || !len) return 0;
uchar dst[512];
size_t next = 0;
- while(next < len)
- {
+ while(next < len) {
size_t carry = 0, n = encodeutf8(dst, sizeof(dst), &((uchar *)src)[next], len - next, &carry);
if(n > 0 && file->write(dst, n) != n) { stopwriting(); break; }
next += carry;
@@ -1101,12 +906,10 @@ struct utf8stream : stream
pos += next;
return next;
}
-
bool flush() { return file->flush(); }
};
-stream *openrawfile(const char *filename, const char *mode)
-{
+stream *openrawfile(const char *filename, const char *mode) {
const char *found = findfile(filename, mode);
if(!found) return NULL;
filestream *file = new filestream;
@@ -1114,8 +917,7 @@ stream *openrawfile(const char *filename, const char *mode)
return file;
}
-stream *openfile(const char *filename, const char *mode)
-{
+stream *openfile(const char *filename, const char *mode) {
#ifndef STANDALONE
stream *s = openzipfile(filename, mode);
if(s) return s;
@@ -1123,16 +925,14 @@ stream *openfile(const char *filename, const char *mode)
return openrawfile(filename, mode);
}
-stream *opentempfile(const char *name, const char *mode)
-{
+stream *opentempfile(const char *name, const char *mode) {
const char *found = findfile(name, mode);
filestream *file = new filestream;
if(!file->opentemp(found ? found : name, mode)) { delete file; return NULL; }
return file;
}
-stream *opengzfile(const char *filename, const char *mode, stream *file, int level)
-{
+stream *opengzfile(const char *filename, const char *mode, stream *file, int level) {
stream *source = file ? file : openfile(filename, mode);
if(!source) return NULL;
gzstream *gz = new gzstream;
@@ -1140,8 +940,7 @@ stream *opengzfile(const char *filename, const char *mode, stream *file, int lev
return gz;
}
-stream *openutf8file(const char *filename, const char *mode, stream *file)
-{
+stream *openutf8file(const char *filename, const char *mode, stream *file) {
stream *source = file ? file : openfile(filename, mode);
if(!source) return NULL;
utf8stream *utf8 = new utf8stream;
@@ -1149,8 +948,7 @@ stream *openutf8file(const char *filename, const char *mode, stream *file)
return utf8;
}
-char *loadfile(const char *fn, size_t *size, bool utf8)
-{
+char *loadfile(const char *fn, size_t *size, bool utf8) {
stream *f = openfile(fn, "rb");
if(!f) return NULL;
stream::offset fsize = f->size();
@@ -1159,8 +957,7 @@ char *loadfile(const char *fn, size_t *size, bool utf8)
char *buf = new (false) char[len+1];
if(!buf) { delete f; return NULL; }
size_t offset = 0;
- if(utf8 && len >= 3)
- {
+ if(utf8 && len >= 3) {
if(f->read(buf, 3) != 3) { delete f; delete[] buf; return NULL; }
if(((uchar *)buf)[0] == 0xEF && ((uchar *)buf)[1] == 0xBB && ((uchar *)buf)[2] == 0xBF) len -= 3;
else offset += 3;