From 9dff5ec70ce3c82483b51d23f675cb10217e58c8 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Sat, 15 Mar 2025 23:42:51 +0000 Subject: [PATCH] Migrate last strings FossilOrigin-Name: b81e2948d74e606b374ad69956719d748340eb128dc5e4c732781a2de71c2ba2 --- src/console.mm | 94 +++++++++++++++++++++++++++++--------------- src/cube.h | 2 + src/savegamedemo.mm | 14 +++---- src/serverbrowser.mm | 6 +-- src/serverutil.mm | 4 +- src/tools.h | 25 ------------ 6 files changed, 76 insertions(+), 69 deletions(-) diff --git a/src/console.mm b/src/console.mm index 8c233b7..f992964 100644 --- a/src/console.mm +++ b/src/console.mm @@ -7,11 +7,31 @@ #import "KeyMapping.h" #import "OFString+Cube.h" -struct cline { - char *cref; - int outtime; -}; -vector conlines; +@interface ConsoleLine: OFObject +@property (readonly, copy) OFString *text; +@property (readonly) int outtime; + +- (instancetype)initWithText:(OFString *)text outtime:(int)outtime; +@end + +static OFMutableArray *conlines; + +@implementation ConsoleLine +- (instancetype)initWithText:(OFString *)text outtime:(int)outtime +{ + self = [super init]; + + _text = [text copy]; + _outtime = outtime; + + return self; +} + +- (OFString *)description +{ + return _text; +} +@end const int ndraw = 5; const int WORDWRAP = 80; @@ -32,22 +52,29 @@ COMMANDN(conskip, setconskip, ARG_1INT) static void conline(OFString *sf, bool highlight) // add a line to the console buffer { - cline cl; + OFMutableString *text; + // constrain the buffer size - cl.cref = conlines.length() > 100 ? conlines.pop().cref - : (char *)calloc(_MAXDEFSTR, 1); - // for how long to keep line on screen - cl.outtime = lastmillis; - conlines.insert(0, cl); - if (highlight) { + if (conlines.count > 100) { + text = [conlines.lastObject.text mutableCopy]; + [conlines removeLastObject]; + } else + text = [[OFMutableString alloc] init]; + + if (highlight) // show line in a different colour, for chat etc. - cl.cref[0] = '\f'; - cl.cref[1] = 0; - strcat_s(cl.cref, sf.UTF8String); - } else { - strcpy_s(cl.cref, sf.UTF8String); - } - puts(cl.cref); + [text appendString:@"\f"]; + + [text appendString:sf]; + + if (conlines == nil) + conlines = [[OFMutableArray alloc] init]; + + [conlines insertObject:[[ConsoleLine alloc] initWithText:text + outtime:lastmillis] + atIndex:0]; + + puts(text.UTF8String); #ifndef OF_WINDOWS fflush(stdout); #endif @@ -74,26 +101,29 @@ conoutf(OFConstantString *format, ...) } } +// render buffer taking into account time & scrolling void -renderconsole() // render buffer taking into account time & scrolling +renderconsole() { int nd = 0; - char *refs[ndraw]; - loopv(conlines) - { - if (conskip ? i >= conskip - 1 || i >= conlines.length() - ndraw - : lastmillis - conlines[i].outtime < 20000) { - refs[nd++] = conlines[i].cref; + OFString *refs[ndraw]; + + size_t i = 0; + for (ConsoleLine *conline in conlines) { + if (conskip ? i >= conskip - 1 || i >= conlines.count - ndraw + : lastmillis - conline.outtime < 20000) { + refs[nd++] = conline.text; if (nd == ndraw) break; } + + i++; } - @autoreleasepool { - loopj(nd) - { - draw_text(@(refs[j]), FONTH / 3, - (FONTH / 4 * 5) * (nd - j - 1) + FONTH / 3, 2); - } + + loopj(nd) + { + draw_text(refs[j], FONTH / 3, + (FONTH / 4 * 5) * (nd - j - 1) + FONTH / 3, 2); } } diff --git a/src/cube.h b/src/cube.h index 44ad0b3..34e8cf1 100644 --- a/src/cube.h +++ b/src/cube.h @@ -8,6 +8,8 @@ #include "tools.h" +#define _MAXDEFSTR 260 + @class DynamicEntity; @interface Cube: OFObject diff --git a/src/savegamedemo.mm b/src/savegamedemo.mm index 4f1c093..7b29b34 100644 --- a/src/savegamedemo.mm +++ b/src/savegamedemo.mm @@ -105,9 +105,9 @@ savestate(OFIRI *IRI) gzputi(SAVEGAMEVERSION); OFData *data = [player1 dataBySerializing]; gzputi(data.count); - char map[260] = { 0 }; + char map[_MAXDEFSTR] = { 0 }; memcpy(map, getclientmap().UTF8String, - min(getclientmap().UTF8StringLength, 259)); + min(getclientmap().UTF8StringLength, _MAXDEFSTR - 1)); gzwrite(f, map, _MAXDEFSTR); gzputi(gamemode); gzputi(ents.length()); @@ -163,7 +163,8 @@ loadstate(OFIRI *IRI) return; } - string buf; + char mapname[_MAXDEFSTR] = { 0 }; + char buf[8]; gzread(f, buf, 8); if (strncmp(buf, "CUBESAVE", 8)) goto out; @@ -174,7 +175,6 @@ loadstate(OFIRI *IRI) if (gzgeti() != SAVEGAMEVERSION || gzgeti() != DynamicEntity.serializedSize) goto out; - string mapname; gzread(f, mapname, _MAXDEFSTR); nextmode = gzgeti(); @autoreleasepool { @@ -453,7 +453,7 @@ demoplaybackstep() int extras; // read additional client side state not present in normal // network stream - if (extras = gzget()) { + if ((extras = gzget())) { target.gunselect = gzget(); target.lastattackgun = gzget(); target.lastaction = scaletime(gzgeti()); @@ -464,9 +464,9 @@ demoplaybackstep() loopi(NUMGUNS) target.ammo[i] = gzget(); target.state = gzget(); target.lastmove = playbacktime; - if (bdamage = gzgeti()) + if ((bdamage = gzgeti())) damageblend(bdamage); - if (ddamage = gzgeti()) { + if ((ddamage = gzgeti())) { gzgetv(dorig); particle_splash(3, ddamage, 1000, dorig); } diff --git a/src/serverbrowser.mm b/src/serverbrowser.mm index d9502da..a991b03 100644 --- a/src/serverbrowser.mm +++ b/src/serverbrowser.mm @@ -40,8 +40,7 @@ static int resolverlimit = 1000; continue; _query = resolverqueries.lastObject; - [resolverqueries - removeObjectAtIndex:resolverqueries.count - 1]; + [resolverqueries removeLastObject]; _starttime = lastmillis; } @@ -148,8 +147,7 @@ resolvercheck(OFString **name, ENetAddress *address) ResolverResult *rr = resolverresults.lastObject; *name = rr.query; *address = rr.address; - [resolverresults - removeObjectAtIndex:resolverresults.count - 1]; + [resolverresults removeLastObject]; return true; } diff --git a/src/serverutil.mm b/src/serverutil.mm index 716da5a..7206228 100644 --- a/src/serverutil.mm +++ b/src/serverutil.mm @@ -47,8 +47,10 @@ sendstring(OFString *t_, uchar *&p) { @autoreleasepool { const char *t = t_.UTF8String; - while (*t) + + for (size_t i = 0; i < _MAXDEFSTR && *t != '\0'; i++) putint(p, *t++); + putint(p, 0); } } diff --git a/src/tools.h b/src/tools.h index e61f200..bf6aa1f 100644 --- a/src/tools.h +++ b/src/tools.h @@ -55,31 +55,6 @@ typedef unsigned int uint; # define _vsnprintf vsnprintf #endif -// easy safe strings - -#define _MAXDEFSTR 260 -typedef char string[_MAXDEFSTR]; - -inline void -strn0cpy(char *d, const char *s, size_t m) -{ - strncpy(d, s, m); - d[(m)-1] = 0; -} - -inline void -strcpy_s(char *d, const char *s) -{ - strn0cpy(d, s, _MAXDEFSTR); -} - -inline void -strcat_s(char *d, const char *s) -{ - size_t n = strlen(d); - strn0cpy(d + n, s, _MAXDEFSTR - n); -} - #define fast_f2nat(val) ((int)(val)) extern void endianswap(void *, int, int);