From cefb84c2dbec914dc2733f776bb39d9055034c92 Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Fri, 28 Apr 2017 19:48:36 -0400 Subject: [PATCH] Work around non-compliant sprintf(). Rockbox's sprintf() lacks the ability to left-justify a string. Fixed by adding a copy_left_justfied() function to misc.c. This is a new version of this commit, as the previous version broke saving! --- midend.c | 4 +++- misc.c | 13 +++++++++++++ puzzles.h | 5 +++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/midend.c b/midend.c index c8250ab..2eb5ee9 100644 --- a/midend.c +++ b/midend.c @@ -1610,7 +1610,9 @@ void midend_serialise(midend *me, #define wr(h,s) do { \ char hbuf[80]; \ char *str = (s); \ - sprintf(hbuf, "%-8.8s:%d:", (h), (int)strlen(str)); \ + char lbuf[9]; \ + copy_left_justified(lbuf, sizeof(lbuf), h); \ + sprintf(hbuf, "%s:%d:", lbuf, (int)strlen(str)); \ write(wctx, hbuf, strlen(hbuf)); \ write(wctx, str, strlen(str)); \ write(wctx, "\n", 1); \ diff --git a/misc.c b/misc.c index fe41332..c721016 100644 --- a/misc.c +++ b/misc.c @@ -358,6 +358,19 @@ void draw_text_outline(drawing *dr, int x, int y, int fonttype, draw_text(dr, x, y+1, fonttype, fontsize, align, outline_colour, text); } draw_text(dr, x, y, fonttype, fontsize, align, text_colour, text); + +} + +/* kludge for non-compliant sprintf() */ +void copy_left_justified(char *buf, size_t sz, const char *str) +{ + memset(buf, ' ', sz - 1); + int len = strlen(str); + if(len <= sz - 1) + memcpy(buf, str, len); + else + fatal("overrun"); + buf[sz - 1] = 0; } /* vim: set shiftwidth=4 tabstop=8: */ diff --git a/puzzles.h b/puzzles.h index ace6690..03af2ca 100644 --- a/puzzles.h +++ b/puzzles.h @@ -376,6 +376,11 @@ void pos2c(int w, int h, int pos, int *cx, int *cy); void draw_text_outline(drawing *dr, int x, int y, int fonttype, int fontsize, int align, int text_colour, int outline_colour, char *text); + +/* Copies text left-justified with spaces. Length of string must be + * less than buffer size. */ +void copy_left_justified(char *buf, size_t sz, const char *str); + /* * dsf.c */