diff --git a/src/common/font.c b/src/common/font.c index 2e89f1c69..80a67144c 100644 --- a/src/common/font.c +++ b/src/common/font.c @@ -2,6 +2,7 @@ #include "common/font.h" #include +#include void ffFontInit(FFfont* font) { @@ -66,59 +67,33 @@ void ffFontInitQt(FFfont* font, const char* data) //See https://doc.qt.io/qt-5/qfont.html#toString //Family - while(*data != ',' && *data != '\0') - { - ffStrbufAppendC(&font->name, *data); - ++data; - } - if(*data != '\0') - ++data; + data = ffStrbufAppendSUntilC(&font->name, data, ','); ffStrbufTrim(&font->name, ' '); + if (!data) goto exit; + data++; //Size - while(*data != ',' && *data != '\0') - { - ffStrbufAppendC(&font->size, *data); - ++data; - } - if(*data != '\0') - ++data; + data = ffStrbufAppendSUntilC(&font->size, data, ','); ffStrbufTrim(&font->size, ' '); + if (!data) goto exit; + data++; - #define FF_FONT_QT_SKIP_VALUE \ - while(*data != ',' && *data != '\0') \ - ++data; \ - if(*data != '\0') \ - ++data; - - FF_FONT_QT_SKIP_VALUE //Pixel size - FF_FONT_QT_SKIP_VALUE //Style hint - FF_FONT_QT_SKIP_VALUE //Font weight - FF_FONT_QT_SKIP_VALUE //Font style - FF_FONT_QT_SKIP_VALUE //Underline - FF_FONT_QT_SKIP_VALUE //Strike out - FF_FONT_QT_SKIP_VALUE //Fixed pitch - FF_FONT_QT_SKIP_VALUE //Always 0 - - #undef FF_FONT_QT_SKIP_VALUE - - while(*data != '\0') + //Style + data = strrchr(data, ','); + if (!data) goto exit; + data++; + if (isalpha(*data)) { - while(*data == ' ') - ++data; - - if(*data == '\0') - break; - - FFstrbuf* style = ffListAdd(&font->styles); - ffStrbufInit(style); - while(*data != ' ' && *data != '\0') + do { - ffStrbufAppendC(style, *data); - ++data; - } + FFstrbuf* style = ffListAdd(&font->styles); + ffStrbufInit(style); + data = ffStrbufAppendSUntilC(style, data, ' '); + if (data) data++; + } while (data); } +exit: fontInitPretty(font); } diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index d3c8bb8ec..5c045c190 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -159,16 +159,17 @@ void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments) strbuf->length += (uint32_t) written; } -void ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until) +const char* ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until) { if(value == NULL) - return; + return NULL; char* end = strchr(value, until); if(end == NULL) ffStrbufAppendS(strbuf, value); else ffStrbufAppendNS(strbuf, (uint32_t) (end - value), value); + return end; } void ffStrbufSetF(FFstrbuf* strbuf, const char* format, ...) diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index d26e1fff5..bf3550594 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -44,7 +44,7 @@ void ffStrbufAppendNS(FFstrbuf* strbuf, uint32_t length, const char* value); void ffStrbufAppendTransformS(FFstrbuf* strbuf, const char* value, int(*transformFunc)(int)); FF_C_PRINTF(2, 3) void ffStrbufAppendF(FFstrbuf* strbuf, const char* format, ...); void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments); -void ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until); +const char* ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until); void ffStrbufPrependNS(FFstrbuf* strbuf, uint32_t length, const char* value);