mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-25 05:41:42 +00:00
Rewrite aligned string drawing, using a modified version of strtok
This commit is contained in:
parent
444cfc180f
commit
31e58f1156
3 changed files with 30 additions and 32 deletions
|
@ -108,6 +108,7 @@ char *nongnu_strcasestr(const char *in, const char *what);
|
|||
|
||||
int startswith (const char *base, const char *tag);
|
||||
int endswith (const char *base, const char *tag);
|
||||
char *xstrtok(char *line, const char *delims);
|
||||
|
||||
#if defined (_WIN32) || defined (__HAIKU__)
|
||||
#define HAVE_DOSSTR_FUNCS
|
||||
|
|
24
src/string.c
24
src/string.c
|
@ -68,3 +68,27 @@ int endswith(const char *base, const char *tag)
|
|||
|
||||
return !memcmp(&base[base_length - tag_length], tag, tag_length);
|
||||
}
|
||||
|
||||
// strtok version that only skips over one delimiter at a time
|
||||
char *xstrtok(char *line, const char *delims)
|
||||
{
|
||||
static char *saveline = NULL;
|
||||
char *p;
|
||||
|
||||
if(line != NULL)
|
||||
saveline = line;
|
||||
|
||||
// see if we have reached the end of the line
|
||||
if(saveline == NULL || *saveline == '\0')
|
||||
return NULL;
|
||||
|
||||
p = saveline; // save start of this token
|
||||
|
||||
saveline += strcspn(saveline, delims); // get the number of non-delims characters, go past delimiter
|
||||
|
||||
if(*saveline != '\0') // trash the delim if necessary
|
||||
*saveline++ = '\0';
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
|
|
@ -2112,41 +2112,12 @@ void V_DrawFontStringAtFixed(fixed_t x, fixed_t y, INT32 option, fixed_t pscale,
|
|||
|
||||
void V_DrawAlignedFontStringAtFixed(fixed_t x, fixed_t y, INT32 option, fixed_t pscale, fixed_t vscale, const char *string, fontdef_t font, enum string_align align)
|
||||
{
|
||||
char line[MAXLINELEN];
|
||||
size_t i, start = 0;
|
||||
char *text = strdup(string);
|
||||
char* line = xstrtok(text, "\n");
|
||||
fixed_t lx = x, ly = y;
|
||||
|
||||
while (*(string+start))
|
||||
while (line)
|
||||
{
|
||||
for (i = 0; i < strlen(string+start); i++)
|
||||
{
|
||||
if (*(string+start+i) == '\n')
|
||||
{
|
||||
memset(line, 0, MAXLINELEN);
|
||||
if (i >= MAXLINELEN)
|
||||
{
|
||||
CONS_Printf("V_DrawAlignedFontStringAtFixed: a line exceeds max. length %d (string: %s)\n", MAXLINELEN, string);
|
||||
return;
|
||||
}
|
||||
strncpy(line,string + start, i);
|
||||
line[i] = '\0';
|
||||
start += i + 1;
|
||||
i = (size_t)-1; //added : 07-02-98 : damned!
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == strlen(string + start))
|
||||
{
|
||||
if (i >= MAXLINELEN)
|
||||
{
|
||||
CONS_Printf("V_DrawAlignedFontStringAtFixed: a line exceeds max. length %d (string: %s)\n", MAXLINELEN, string);
|
||||
return;
|
||||
}
|
||||
strcpy(line, string + start);
|
||||
start += i;
|
||||
}
|
||||
|
||||
switch(align)
|
||||
{
|
||||
case alignleft:
|
||||
|
@ -2163,6 +2134,8 @@ void V_DrawAlignedFontStringAtFixed(fixed_t x, fixed_t y, INT32 option, fixed_t
|
|||
V_DrawFontStringAtFixed(lx, ly, option, pscale, vscale, line, font);
|
||||
|
||||
ly += FixedMul(((option & V_RETURN8) ? 8 : font.linespacing)<<FRACBITS, vscale);
|
||||
|
||||
line = xstrtok(NULL, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue