From 16319186f2cffc7e87ff01e43dff6c4d4dc90e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morel=20B=C3=A9renger?= Date: Tue, 9 Jun 2020 21:36:51 +0200 Subject: [PATCH 1/5] std::vector based explodelist * new explodelist that can emit std::vector> * use it when it does not imply API change --- src/engine/command.cpp | 10 ++++++ src/engine/rendertext.cpp | 16 +++++----- src/engine/skelmodel.h | 11 ++++--- src/engine/world.cpp | 9 +++--- src/game/client.cpp | 39 ++++++++++++----------- src/game/game.cpp | 28 +++++++++++------ src/game/server.cpp | 65 ++++++++++++++++++++++----------------- src/game/weapons.cpp | 9 +++--- src/shared/command.h | 3 ++ 9 files changed, 114 insertions(+), 76 deletions(-) diff --git a/src/engine/command.cpp b/src/engine/command.cpp index a28e6f813..1d374880f 100644 --- a/src/engine/command.cpp +++ b/src/engine/command.cpp @@ -2,8 +2,11 @@ // is largely backwards compatible with the quake console language. #include +#include +#include using std::swap; #include "engine.h" + bool interactive = false; hashnameset idents; // contains ALL vars/commands/aliases @@ -2731,6 +2734,13 @@ void explodelist(const char *s, vector &elems, int limit) elems.add(newstring(start, end-start)); } +void explodelist(const char *s, std::vector &elems, int limit) +{ + const char *start, *end; + while((limit < 0 || elems.size() < limit) && parselist(s, start, end)) + elems.emplace_back(std::string(start, end-start)); +} + char *indexlist(const char *s, int pos) { loopi(pos) if(!parselist(s)) return newstring(""); diff --git a/src/engine/rendertext.cpp b/src/engine/rendertext.cpp index 4ff434abf..e1aa8ea3c 100644 --- a/src/engine/rendertext.cpp +++ b/src/engine/rendertext.cpp @@ -1,3 +1,5 @@ +#include +#include #include using std::swap; #include "engine.h" @@ -712,7 +714,7 @@ float key_widthf(const char *str) { const char *keyn = str; if(*str == '=') keyn = gettklp(++str); - vector list; + std::vector list; explodelist(keyn, list); float width = 0, scale = curfont->maxh*curfont->scale/float(curfont->defaulth)*curtextscale*textkeyimagescale; loopv(list) @@ -720,7 +722,7 @@ float key_widthf(const char *str) if(i && textkeyseps) width += text_widthf("|"); if(textkeyimages) { - textkey *t = findtextkey(list[i]); + textkey *t = findtextkey(list[i].data()); if(t && t->tex) { width += (t->tex->w*scale)/float(t->tex->h); @@ -728,10 +730,9 @@ float key_widthf(const char *str) } // fallback if not found } - defformatkey(keystr, list[i]); + defformatkey(keystr, list[i].data()); width += text_widthf(keystr); } - list.deletearrays(); return width; } @@ -740,14 +741,14 @@ static int draw_key(Texture *&tex, const char *str, float sx, float sy) Texture *oldtex = tex; const char *keyn = str; if(*str == '=') keyn = gettklp(++str); - vector list; + std::vector list; explodelist(keyn, list); float width = 0, sh = curfont->maxh*curfont->scale/float(curfont->defaulth)*curtextscale, h = sh*textkeyimagescale; loopv(list) { if(textkeyimages) { - textkey *t = findtextkey(list[i]); + textkey *t = findtextkey(list[i].data()); if(t && t->tex) { if(tex != t->tex) @@ -772,11 +773,10 @@ static int draw_key(Texture *&tex, const char *str, float sx, float sy) tex = oldtex; glBindTexture(GL_TEXTURE_2D, tex->id); } - defformatkey(keystr, list[i]); + defformatkey(keystr, list[i].data()); draw_text(keystr, sx + width, sy, 255, 255, 255, 255, 0, -1, -1, 1, -1); width += text_widthf(keystr); } - list.deletearrays(); return width; } diff --git a/src/engine/skelmodel.h b/src/engine/skelmodel.h index 715e07077..a30a665a1 100644 --- a/src/engine/skelmodel.h +++ b/src/engine/skelmodel.h @@ -1810,17 +1810,20 @@ template struct skelcommands : modelcommandsparts.last(); - vector bonestrs; + std::vector bonestrs; explodelist(maskstr, bonestrs); vector bonemask; loopv(bonestrs) { - char *bonestr = bonestrs[i]; + char const *bonestr = bonestrs[i].data(); int bone = p->meshes ? ((meshgroup *)p->meshes)->skel->findbone(bonestr[0]=='!' ? bonestr+1 : bonestr) : -1; - if(bone<0) { conoutf("\frcould not find bone %s for anim part mask [%s]", bonestr, maskstr); bonestrs.deletearrays(); return; } + if(bone<0) + { + conoutf("\frcould not find bone %s for anim part mask [%s]", bonestr, maskstr); + return; + } bonemask.add(bone | (bonestr[0]=='!' ? BONEMASK_NOT : 0)); } - bonestrs.deletearrays(); bonemask.sort(); if(bonemask.length()) bonemask.add(BONEMASK_END); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index d5bcd6acd..d07123619 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -1,5 +1,6 @@ // world.cpp: core map management stuff #include +#include using std::swap; #include "engine.h" @@ -776,12 +777,12 @@ int newentity(int type, const attrvector &attrs) void entattrs(const char *str, attrvector &attrs) { - static vector buf; + static std::vector buf; explodelist(str, buf, MAXENTATTRS); attrs.setsize(0); - attrs.add(0, buf.length()); - loopv(buf) attrs[i] = parseint(buf[i]); - buf.deletearrays(); + attrs.add(0, buf.size()); + loopv(buf) attrs[i] = parseint(buf[i].data()); + buf.clear(); } void newent(char *what, char *attr) diff --git a/src/game/client.cpp b/src/game/client.cpp index 95f82a5a0..1d9493c4b 100644 --- a/src/game/client.cpp +++ b/src/game/client.cpp @@ -1,3 +1,5 @@ +#include +#include #include using std::swap; #include "game.h" @@ -398,11 +400,10 @@ namespace client void updateserversort() { - vector styles; + std::vector styles; explodelist(serversort, styles, SINFO_MAX); - serversortstyles.setsize(0); - loopv(styles) serversortstyles.add(parseint(styles[i])); - styles.deletearrays(); + serversortstyles.clear(); + for( size_t i = 0; i < styles.size(); ++i ) serversortstyles.emplace_back(parseint(styles[i].data())); } void getvitem(gameent *d, int n, int v) @@ -471,15 +472,16 @@ namespace client vector items; if(list && *list) { - vector chunk; - explodelist(list, chunk); - loopv(chunk) + std::vector chunks; + explodelist(list, chunks); + for( std::string const& chunk : chunks ) { - if(!chunk[i] || !*chunk[i] || !isnumeric(*chunk[i])) continue; - int v = parseint(chunk[i]); - items.add(v >= W_OFFSET && v < W_ITEM ? v : 0); + if( isnumeric( chunk.front() ) ) + { + int v = parseint( chunk.data() ); + items.emplace_back( v >= W_OFFSET && v < W_ITEM ? v : 0 ); + } } - chunk.deletearrays(); } game::player1.loadweap.shrink(0); loopv(items) if(game::player1.loadweap.find(items[i]) < 0) @@ -496,15 +498,16 @@ namespace client vector items; if(list && *list) { - vector chunk; - explodelist(list, chunk); - loopv(chunk) + std::vector chunks; + explodelist(list, chunks); + for( std::string const& chunk : chunks ) { - if(!chunk[i] || !*chunk[i] || !isnumeric(*chunk[i])) continue; - int v = parseint(chunk[i]); - items.add(v ? 1 : 0); + if( isnumeric( chunk.front() ) ) + { + int v = parseint( chunk.data() ); + items.emplace_back( v >= W_OFFSET && v < W_ITEM ? v : 0 ); + } } - chunk.deletearrays(); } game::player1.randweap.shrink(0); loopv(items) diff --git a/src/game/game.cpp b/src/game/game.cpp index 8da36cd26..47f077364 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -1,4 +1,6 @@ #include +#include +#include using std::swap; #include #define GAMEWORLD 1 @@ -409,12 +411,21 @@ namespace game void vanitybuild(gameent *d) { if(!*d->vanity) return; // not needed - vector vanitylist; + std::vector vanitylist; explodelist(d->vanity, vanitylist); - loopv(vanitylist) if(vanitylist[i] && *vanitylist[i]) - loopvk(vanities) if(!strcmp(vanities[k].ref, vanitylist[i])) - d->vitems.add(k); - vanitylist.deletearrays(); + for( std::string const& vanity : vanitylist ) + { + if( !vanity.empty() ) + { + for( size_t k = 0; k < vanities.size(); ++k ) + { + if(!strcmp(vanities[k].ref, vanity.data() )) + { + d->vitems.emplace_back( k ); + } + } + } + } } const char *vanitymodel(gameent *d) @@ -3388,12 +3399,11 @@ namespace game int idx = third == 1 && (d->state == CS_DEAD || d->state == CS_WAITING) && d->headless && !nogore && headlessmodels ? 3 : third; if(d->vitems.empty()) { - vector vanitylist; + std::vector vanitylist; explodelist(d->vanity, vanitylist); - loopv(vanitylist) if(vanitylist[i] && *vanitylist[i]) - loopvk(vanities) if(!strcmp(vanities[k].ref, vanitylist[i])) + loopv(vanitylist) if(!vanitylist[i].empty()) + loopvk(vanities) if(vanitylist[i] == vanities[k].ref) d->vitems.add(k); - vanitylist.deletearrays(); } int found[VANITYMAX] = {0}; loopvk(d->vitems) if(vanities.inrange(d->vitems[k])) diff --git a/src/game/server.cpp b/src/game/server.cpp index 1e3c9352c..124deaeb8 100644 --- a/src/game/server.cpp +++ b/src/game/server.cpp @@ -24,6 +24,8 @@ // each modification must be approved and will be done on a case-by-case basis. #include +#include +#include using std::swap; #define GAMESERVER 1 @@ -1058,29 +1060,33 @@ namespace server if(!map || !*map) map = choosemap(suggest, mode, muts, G(rotatemaps), true); else if(strchr(map, ' ')) { - static string defaultmap; - defaultmap[0] = '\0'; - vector maps; + static std::string defaultmap; + std::vector maps; explodelist(map, maps); if(*sv_previousmaps) { - vector prev; + std::vector prev; explodelist(sv_previousmaps, prev); - loopvj(prev) loopvrev(maps) if(strcmp(prev[j], maps[i])) + for( size_t j = 0; j < prev.size(); ++j ) { - delete[] maps[i]; - maps.remove(i); - if(maps.length() <= 1) break; + for( ssize_t i = maps.size() - 1; i >= 0; --i ) + { + if( strcmp( prev[j].data(), maps[i].data() ) ) + { + maps.erase( maps.begin() + i ); + if(maps.size() <= 1) break; + } + } } - prev.deletearrays(); + prev.clear(); } if(!maps.empty()) { - int r = rnd(maps.length()); - copystring(defaultmap, maps[r]); + int r = rnd(maps.size()); + defaultmap = maps[r]; } - maps.deletearrays(); - map = *defaultmap ? defaultmap : choosemap(suggest, mode, muts, G(rotatemaps), true); + maps.clear(); + map = !defaultmap.empty() ? defaultmap.data() : choosemap(suggest, mode, muts, G(rotatemaps), true); } } return map && *map ? map : "maps/untitled"; @@ -3373,32 +3379,33 @@ namespace server if(!demoplayback && m_play(gamemode) && numclients()) { - vector buf; - buf.put(smapname, strlen(smapname)); + std::vector buf; + buf.insert( buf.end(), smapname, smapname + strlen(smapname)); if(*sv_previousmaps && G(maphistory)) { - vector prev; + std::vector prev; explodelist(sv_previousmaps, prev); - loopvrev(prev) if(!strcmp(prev[i], smapname)) + for( ssize_t i = prev.size() - 1; i >= 0; --i ) { - delete[] prev[i]; - prev.remove(i); + if(!strcmp(prev[i].data(), smapname)) + { + prev.erase( prev.begin() + i ); + } } - while(prev.length() >= G(maphistory)) + while(prev.size() >= G(maphistory)) { - int last = prev.length()-1; - delete[] prev[last]; - prev.remove(last); + int last = prev.size()-1; + prev.erase( prev.begin() + last ); } - loopv(prev) + for( auto const& prev_str : prev ) { - buf.add(' '); - buf.put(prev[i], strlen(prev[i])); + buf.emplace_back( ' ' ); + buf.insert( buf.end(), std::begin( prev_str ), std::end( prev_str ) ); } - prev.deletearrays(); + prev.clear(); } - buf.add(0); - const char *str = buf.getbuf(); + buf.emplace_back( 0 ); + const char *str = buf.data(); if(*str) setmods(sv_previousmaps, str); } else setmods(sv_previousmaps, ""); diff --git a/src/game/weapons.cpp b/src/game/weapons.cpp index e6231aa7b..ec813f7f0 100644 --- a/src/game/weapons.cpp +++ b/src/game/weapons.cpp @@ -1,3 +1,5 @@ +#include +#include #include using std::swap; #include "game.h" @@ -21,14 +23,14 @@ namespace weapons vector weaplist; void buildweaplist(const char *str) { - vector list; + std::vector list; explodelist(str, list); weaplist.shrink(0); loopv(list) { int weap = -1; - if(isnumeric(list[i][0])) weap = atoi(list[i]); - else loopj(W_ALL) if(!strcasecmp(weaptype[j].name, list[i])) + if(isnumeric(list[i][0])) weap = atoi(list[i].data()); + else loopj(W_ALL) if(!strcasecmp(weaptype[j].name, list[i].data())) { weap = j; break; @@ -36,7 +38,6 @@ namespace weapons if(isweap(weap) && weaplist.find(weap) < 0) weaplist.add(weap); } - list.deletearrays(); loopi(W_ALL) if(weaplist.find(i) < 0) weaplist.add(i); // make sure all weapons have a slot changedkeys = lastmillis; } diff --git a/src/shared/command.h b/src/shared/command.h index 4636c55c9..d1931c47f 100644 --- a/src/shared/command.h +++ b/src/shared/command.h @@ -2,6 +2,8 @@ #define COMMAND_H // script binding functionality +#include +#include enum { VAL_NULL = 0, VAL_INT, VAL_FLOAT, VAL_STR, VAL_ANY, VAL_CODE, VAL_MACRO, VAL_IDENT }; enum @@ -349,6 +351,7 @@ static inline const char *escapeid(ident &id) { return escapeid(id.name); } extern bool validateblock(const char *s); extern char *parsetext(const char *&p); extern void explodelist(const char *s, vector &elems, int limit = -1); +extern void explodelist(const char *s, std::vector &elems, int limit = -1); extern int listlen(const char *s); extern char *indexlist(const char *s, int pos); extern const char *indexlist(const char *s, int pos, int &len); From 3d14a81c53db049c558dfbb418602c06f67b7792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morel=20B=C3=A9renger?= Date: Tue, 21 Jul 2020 23:59:10 +0200 Subject: [PATCH 2/5] make the changes the arguably least intrusive as possible --- src/engine/rendertext.cpp | 8 ++++---- src/engine/skelmodel.h | 8 ++------ src/engine/world.cpp | 2 +- src/game/client.cpp | 30 +++++++++++++----------------- src/game/game.cpp | 16 +++------------- src/game/server.cpp | 37 ++++++++++++------------------------- src/game/weapons.cpp | 7 +++++-- 7 files changed, 40 insertions(+), 68 deletions(-) diff --git a/src/engine/rendertext.cpp b/src/engine/rendertext.cpp index e1aa8ea3c..ca7541187 100644 --- a/src/engine/rendertext.cpp +++ b/src/engine/rendertext.cpp @@ -722,7 +722,7 @@ float key_widthf(const char *str) if(i && textkeyseps) width += text_widthf("|"); if(textkeyimages) { - textkey *t = findtextkey(list[i].data()); + textkey *t = findtextkey(list[i].c_str()); if(t && t->tex) { width += (t->tex->w*scale)/float(t->tex->h); @@ -730,7 +730,7 @@ float key_widthf(const char *str) } // fallback if not found } - defformatkey(keystr, list[i].data()); + defformatkey(keystr, list[i].c_str()); width += text_widthf(keystr); } return width; @@ -748,7 +748,7 @@ static int draw_key(Texture *&tex, const char *str, float sx, float sy) { if(textkeyimages) { - textkey *t = findtextkey(list[i].data()); + textkey *t = findtextkey(list[i].c_str()); if(t && t->tex) { if(tex != t->tex) @@ -773,7 +773,7 @@ static int draw_key(Texture *&tex, const char *str, float sx, float sy) tex = oldtex; glBindTexture(GL_TEXTURE_2D, tex->id); } - defformatkey(keystr, list[i].data()); + defformatkey(keystr, list[i].c_str()); draw_text(keystr, sx + width, sy, 255, 255, 255, 255, 0, -1, -1, 1, -1); width += text_widthf(keystr); } diff --git a/src/engine/skelmodel.h b/src/engine/skelmodel.h index a30a665a1..2d27535fa 100644 --- a/src/engine/skelmodel.h +++ b/src/engine/skelmodel.h @@ -1815,13 +1815,9 @@ template struct skelcommands : modelcommands bonemask; loopv(bonestrs) { - char const *bonestr = bonestrs[i].data(); + char const *bonestr = bonestrs[i].c_str(); int bone = p->meshes ? ((meshgroup *)p->meshes)->skel->findbone(bonestr[0]=='!' ? bonestr+1 : bonestr) : -1; - if(bone<0) - { - conoutf("\frcould not find bone %s for anim part mask [%s]", bonestr, maskstr); - return; - } + if(bone<0) { conoutf("\frcould not find bone %s for anim part mask [%s]", bonestr, maskstr); return; } bonemask.add(bone | (bonestr[0]=='!' ? BONEMASK_NOT : 0)); } bonemask.sort(); diff --git a/src/engine/world.cpp b/src/engine/world.cpp index d07123619..40f4c2d6e 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -781,7 +781,7 @@ void entattrs(const char *str, attrvector &attrs) explodelist(str, buf, MAXENTATTRS); attrs.setsize(0); attrs.add(0, buf.size()); - loopv(buf) attrs[i] = parseint(buf[i].data()); + loopv(buf) attrs[i] = parseint(buf[i].c_str()); buf.clear(); } diff --git a/src/game/client.cpp b/src/game/client.cpp index 1d9493c4b..b6c250a9e 100644 --- a/src/game/client.cpp +++ b/src/game/client.cpp @@ -403,7 +403,7 @@ namespace client std::vector styles; explodelist(serversort, styles, SINFO_MAX); serversortstyles.clear(); - for( size_t i = 0; i < styles.size(); ++i ) serversortstyles.emplace_back(parseint(styles[i].data())); + loopv(styles) serversortstyles.emplace_back(parseint(styles[i].c_str())); } void getvitem(gameent *d, int n, int v) @@ -472,15 +472,13 @@ namespace client vector items; if(list && *list) { - std::vector chunks; - explodelist(list, chunks); - for( std::string const& chunk : chunks ) + std::vector chunk; + explodelist(list, chunk); + loopv(chunk) { - if( isnumeric( chunk.front() ) ) - { - int v = parseint( chunk.data() ); - items.emplace_back( v >= W_OFFSET && v < W_ITEM ? v : 0 ); - } + if(chunk[i].empty() || !isnumeric(chunk[i][0])) continue; + int v = parseint(chunk[i].c_str()); + items.emplace_back(v >= W_OFFSET && v < W_ITEM ? v : 0); } } game::player1.loadweap.shrink(0); @@ -498,15 +496,13 @@ namespace client vector items; if(list && *list) { - std::vector chunks; - explodelist(list, chunks); - for( std::string const& chunk : chunks ) + std::vector chunk; + explodelist(list, chunk); + loopv(chunk) { - if( isnumeric( chunk.front() ) ) - { - int v = parseint( chunk.data() ); - items.emplace_back( v >= W_OFFSET && v < W_ITEM ? v : 0 ); - } + if(chunk[i].empty() || !isnumeric(chunk[i][0])) continue; + int v = parseint(chunk[i].c_str()); + items.emplace_back(v >= W_OFFSET && v < W_ITEM ? v : 0); } } game::player1.randweap.shrink(0); diff --git a/src/game/game.cpp b/src/game/game.cpp index 47f077364..588b99e68 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -413,19 +413,9 @@ namespace game if(!*d->vanity) return; // not needed std::vector vanitylist; explodelist(d->vanity, vanitylist); - for( std::string const& vanity : vanitylist ) - { - if( !vanity.empty() ) - { - for( size_t k = 0; k < vanities.size(); ++k ) - { - if(!strcmp(vanities[k].ref, vanity.data() )) - { - d->vitems.emplace_back( k ); - } - } - } - } + loopv(vanitylist) if(!vanitylist[i].empty()) + loopvk(vanities) if(!strcmp(vanities[k].ref, vanitylist[i].c_str())) + d->vitems.add(k); } const char *vanitymodel(gameent *d) diff --git a/src/game/server.cpp b/src/game/server.cpp index 124deaeb8..2506a8051 100644 --- a/src/game/server.cpp +++ b/src/game/server.cpp @@ -1067,16 +1067,10 @@ namespace server { std::vector prev; explodelist(sv_previousmaps, prev); - for( size_t j = 0; j < prev.size(); ++j ) + loopvj(prev) loopvrev(maps) if(prev[j] != maps[i]) { - for( ssize_t i = maps.size() - 1; i >= 0; --i ) - { - if( strcmp( prev[j].data(), maps[i].data() ) ) - { - maps.erase( maps.begin() + i ); - if(maps.size() <= 1) break; - } - } + maps.erase( maps.begin() + i ); + if(maps.size() <= 1) break; } prev.clear(); } @@ -1086,7 +1080,7 @@ namespace server defaultmap = maps[r]; } maps.clear(); - map = !defaultmap.empty() ? defaultmap.data() : choosemap(suggest, mode, muts, G(rotatemaps), true); + map = !defaultmap.empty() ? defaultmap.c_str() : choosemap(suggest, mode, muts, G(rotatemaps), true); } } return map && *map ? map : "maps/untitled"; @@ -3379,34 +3373,27 @@ namespace server if(!demoplayback && m_play(gamemode) && numclients()) { - std::vector buf; - buf.insert( buf.end(), smapname, smapname + strlen(smapname)); + std::string buf = smapname; if(*sv_previousmaps && G(maphistory)) { std::vector prev; explodelist(sv_previousmaps, prev); - for( ssize_t i = prev.size() - 1; i >= 0; --i ) + loopvrev(prev) if(prev[i] == smapname) { - if(!strcmp(prev[i].data(), smapname)) - { - prev.erase( prev.begin() + i ); - } + prev.erase( prev.begin() + i ); } while(prev.size() >= G(maphistory)) { - int last = prev.size()-1; - prev.erase( prev.begin() + last ); + prev.pop_back(); } - for( auto const& prev_str : prev ) + loopv(prev) { - buf.emplace_back( ' ' ); - buf.insert( buf.end(), std::begin( prev_str ), std::end( prev_str ) ); + buf += ' '; + buf += prev[i]; } prev.clear(); } - buf.emplace_back( 0 ); - const char *str = buf.data(); - if(*str) setmods(sv_previousmaps, str); + if(!buf.empty()) setmods(sv_previousmaps, buf.c_str()); } else setmods(sv_previousmaps, ""); diff --git a/src/game/weapons.cpp b/src/game/weapons.cpp index ec813f7f0..e9f8db82d 100644 --- a/src/game/weapons.cpp +++ b/src/game/weapons.cpp @@ -29,8 +29,11 @@ namespace weapons loopv(list) { int weap = -1; - if(isnumeric(list[i][0])) weap = atoi(list[i].data()); - else loopj(W_ALL) if(!strcasecmp(weaptype[j].name, list[i].data())) + if(isnumeric(list[i][0])) + { + weap = atoi(list[i].c_str()); + } + else loopj(W_ALL) if(!strcasecmp(weaptype[j].name, list[i].c_str())) { weap = j; break; From 534d568c218dfe568a7e41b3574e58fb674263c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morel=20B=C3=A9renger?= Date: Fri, 24 Jul 2020 16:14:02 +0200 Subject: [PATCH 3/5] improve doc for explodelist --- src/shared/command.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/shared/command.h b/src/shared/command.h index d1931c47f..0121dba0c 100644 --- a/src/shared/command.h +++ b/src/shared/command.h @@ -350,8 +350,16 @@ extern const char *escapeid(const char *s); static inline const char *escapeid(ident &id) { return escapeid(id.name); } extern bool validateblock(const char *s); extern char *parsetext(const char *&p); + +/// \brief explodes a string according to some unclear syntax rules +/// this *may* be used as a tokenizer, somehow +/// \s[in] C string to explode. +/// \elems[in,out] result. Is *not* cleared before filling. +/// \limit[in] is the maximum number of elements to add. +[[deprecated("explodelist provides a safer interface using STL containers")]] extern void explodelist(const char *s, vector &elems, int limit = -1); extern void explodelist(const char *s, std::vector &elems, int limit = -1); + extern int listlen(const char *s); extern char *indexlist(const char *s, int pos); extern const char *indexlist(const char *s, int pos, int &len); From d7f3124224ae38205960d0ef06db470f4cb7c5a2 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 25 Jul 2020 14:33:37 +0200 Subject: [PATCH 4/5] Fix docstring --- src/shared/command.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/shared/command.h b/src/shared/command.h index 0121dba0c..5dc7fb99c 100644 --- a/src/shared/command.h +++ b/src/shared/command.h @@ -351,12 +351,16 @@ static inline const char *escapeid(ident &id) { return escapeid(id.name); } extern bool validateblock(const char *s); extern char *parsetext(const char *&p); -/// \brief explodes a string according to some unclear syntax rules -/// this *may* be used as a tokenizer, somehow -/// \s[in] C string to explode. -/// \elems[in,out] result. Is *not* cleared before filling. -/// \limit[in] is the maximum number of elements to add. -[[deprecated("explodelist provides a safer interface using STL containers")]] +/** + * \brief explodes a string according to some unclear syntax rules + * + * this *may* be used as a tokenizer, somehow + * + * \s[in] C string to explode. + * \elems[in,out] result. Is *not* cleared before filling. + * \limit[in] is the maximum number of elements to add. + * \deprecated use the new, safer std::vector implementation for new and modified code + */ extern void explodelist(const char *s, vector &elems, int limit = -1); extern void explodelist(const char *s, std::vector &elems, int limit = -1); From 96e6f83fa793a8d08e2dbda3ccf6615ad1070c75 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sat, 25 Jul 2020 18:49:19 +0200 Subject: [PATCH 5/5] Fix comparison Was changed accidentally, likely a result of a copy-paste mistake. --- src/game/client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/client.cpp b/src/game/client.cpp index b6c250a9e..92d7000bf 100644 --- a/src/game/client.cpp +++ b/src/game/client.cpp @@ -502,7 +502,7 @@ namespace client { if(chunk[i].empty() || !isnumeric(chunk[i][0])) continue; int v = parseint(chunk[i].c_str()); - items.emplace_back(v >= W_OFFSET && v < W_ITEM ? v : 0); + items.emplace_back(v != 0 ? 1 : 0); } } game::player1.randweap.shrink(0);