diff options
Diffstat (limited to 'fw/fe310/eos/eve/eve_font.c')
-rw-r--r-- | fw/fe310/eos/eve/eve_font.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/fw/fe310/eos/eve/eve_font.c b/fw/fe310/eos/eve/eve_font.c index 8f272bc..803c0d2 100644 --- a/fw/fe310/eos/eve/eve_font.c +++ b/fw/fe310/eos/eve/eve_font.c @@ -1,4 +1,5 @@ #include <stdlib.h> +#include <string.h> #include "eve.h" #include "eve_font.h" @@ -19,57 +20,62 @@ int eve_font_ch_w(EVEFont *font, ucp_t ch) { return EVE_ERR; } -static int font_str_w(EVEFont *font, utf8_t *str, int *_str_w, size_t *_str_len) { - uint16_t r = 0; - size_t len = 0; +static int font_str_w(EVEFont *font, utf8_t *str, int *_str_w, size_t *_str_l) { + uint16_t w = 0; + size_t l = 0; ucp_t ch; int ch_w; int ch_l; - while (str[len]) { - ch_l = utf8_dec(str + len, &ch); + while (str[l]) { + ch_l = utf8_dec(str + l, &ch); ch_w = eve_font_ch_w(font, ch); if (ch_w < 0) { - if (_str_w) *_str_w = r; - if (_str_len) *_str_len = len; + if (_str_w) *_str_w = w; + if (_str_l) *_str_l = l; return EVE_ERR; } - r += ch_w; - len += ch_l; + w += ch_w; + l += ch_l; } - if (_str_w) *_str_w = r; - if (_str_len) *_str_len = len; + if (_str_w) *_str_w = w; + if (_str_l) *_str_l = l; return EVE_OK; } -static int font_buf_w(EVEFont *font, utf8_t *buf, size_t buf_len, int *_buf_w, size_t *_buf_len) { - uint16_t r = 0; - size_t len = 0; +static int font_buf_w(EVEFont *font, utf8_t *buf, size_t buf_len, int *_buf_w, size_t *_buf_l) { + uint16_t w = 0; + size_t l = 0; ucp_t ch; int ch_w; int ch_l; - while (len < buf_len) { - ch_l = utf8_dec(buf + len, &ch); + while (l < buf_len) { + ch_l = utf8_dec(buf + l, &ch); ch_w = eve_font_ch_w(font, ch); if (ch_w < 0) { - if (_buf_w) *_buf_w = r; - if (_buf_len) *_buf_len = len; + if (_buf_w) *_buf_w = w; + if (_buf_l) *_buf_l = l; return EVE_ERR; } - r += ch_w; - len += ch_l; + w += ch_w; + l += ch_l; } - if (_buf_w) *_buf_w = r; - if (_buf_len) *_buf_len = len; + if (_buf_w) *_buf_w = w; + if (_buf_l) *_buf_l = l; return EVE_OK; } -int eve_font_verify(EVEFont *font, utf8_t *str, int *str_w, size_t *str_len) { +int eve_font_verify(EVEFont *font, utf8_t *str, size_t str_size, int *str_w, size_t *str_len) { int rv; + if (str_size == 0) str_size = strlen(str) + 1; + + rv = utf8_verify(str, str_size, str_len); + if (rv) return EVE_ERR; + rv = font_str_w(font, str, str_w, str_len); return rv; } |