From 0a1172b75f571685c264a8b9d8ee224bbf11381f Mon Sep 17 00:00:00 2001 From: xolatile Date: Wed, 6 Aug 2025 22:54:55 +0200 Subject: Please do not hate me, it makes sense... --- src/shared/stream.cpp | 489 +++++++++++++++----------------------------------- 1 file changed, 143 insertions(+), 346 deletions(-) (limited to 'src/shared/stream.cpp') 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 string homedir = ""; -struct packagedir -{ +struct packagedir { char *dir, *filter; size_t dirlen, filterlen; }; vector 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 &files) -{ +bool listdir(const char *dirname, bool rel, const char *ext, vector &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 &fil else return false; } -int listfiles(const char *dir, const char *ext, vector &files) -{ +int listfiles(const char *dir, const char *ext, vector &files) { string dirname; copystring(dirname, dir); path(dirname); @@ -500,13 +442,11 @@ int listfiles(const char *dir, const char *ext, vector &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 &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(); 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; -- cgit v1.2.3