diff options
author | Andrew Hannam <Andrew Hannam> | 2016-07-10 10:42:21 +1000 |
---|---|---|
committer | Andrew Hannam <Andrew Hannam> | 2016-07-10 10:42:21 +1000 |
commit | 9ac3c368b4de8e2f38bad56262c75d3310c8814b (patch) | |
tree | 973fb9bf591398e6826a25f64e9975cc5f06a51b /src | |
parent | ed9b268d5bce5fe6d703bc785034191312782db0 (diff) | |
download | uGFX-9ac3c368b4de8e2f38bad56262c75d3310c8814b.tar.gz uGFX-9ac3c368b4de8e2f38bad56262c75d3310c8814b.tar.bz2 uGFX-9ac3c368b4de8e2f38bad56262c75d3310c8814b.zip |
Add gwinPrintg() and fix null pointer handling in sprintg()
Diffstat (limited to 'src')
-rw-r--r-- | src/gfile/gfile_fs_strings.c | 10 | ||||
-rw-r--r-- | src/gwin/gwin_widget.c | 38 | ||||
-rw-r--r-- | src/gwin/gwin_widget.h | 18 |
3 files changed, 64 insertions, 2 deletions
diff --git a/src/gfile/gfile_fs_strings.c b/src/gfile/gfile_fs_strings.c index 86c536d7..fcc118ec 100644 --- a/src/gfile/gfile_fs_strings.c +++ b/src/gfile/gfile_fs_strings.c @@ -22,12 +22,18 @@ static int StringRead(GFILE *f, void *buf, int size) { int res; char *p; + if (!f->obj) + return 0; + p = ((char *)f->obj) + f->pos; for(res = 0; res < size && *p; res++, p++, buf = ((char *)buf)+1) ((char *)buf)[0] = *p; return res; } static int StringWrite(GFILE *f, const void *buf, int size) { + if (!f->obj) + return 0; + if ((f->flags & GFILEFLG_APPEND)) { while(((char *)f->obj)[f->pos]) f->pos++; @@ -50,7 +56,7 @@ static const GFILEVMT StringVMT = { }; static void gfileOpenStringFromStaticGFILE(GFILE *f, char *str) { - if ((f->flags & GFILEFLG_TRUNC)) + if ((f->flags & GFILEFLG_TRUNC) && str) str[0] = 0; f->vmt = &StringVMT; f->obj = str; @@ -62,7 +68,7 @@ GFILE *gfileOpenString(char *str, const char *mode) { GFILE *f; // Get an empty file and set the flags - if (!(f = _gfileFindSlot(mode))) + if (!str || !(f = _gfileFindSlot(mode))) return 0; // File is open - fill in all the details diff --git a/src/gwin/gwin_widget.c b/src/gwin/gwin_widget.c index 2965e7c6..483a63b3 100644 --- a/src/gwin/gwin_widget.c +++ b/src/gwin/gwin_widget.c @@ -530,6 +530,44 @@ void gwinSetText(GHandle gh, const char *text, bool_t useAlloc) { _gwinUpdate(gh); } +#if GFX_USE_GFILE && GFILE_NEED_PRINTG && GFILE_NEED_STRINGS + #include <stdarg.h> + + void gwinPrintg(GHandle gh, const char * fmt, ...) { + char *str; + va_list va; + int size; + + if (!(gh->flags & GWIN_FLG_WIDGET)) + return; + + // Dispose of the old string + if ((gh->flags & GWIN_FLG_ALLOCTXT)) { + gh->flags &= ~GWIN_FLG_ALLOCTXT; + if (gw->text) { + gfxFree((void *)gw->text); + gw->text = ""; + } + } + + // Alloc the new text + va_start (va, fmt); + + size = vsnprintg(0, 0, fmt, va) + 1; //determine the buffer size required + + if ((str = gfxAlloc(size))) { + gh->flags |= GWIN_FLG_ALLOCTXT; + vsnprintg(str, size, fmt, va); + gw->text = (const char *)str; + } else + gw->text = ""; + + va_end (va); + + _gwinUpdate(gh); + } +#endif + const char *gwinGetText(GHandle gh) { if (!(gh->flags & GWIN_FLG_WIDGET)) return 0; diff --git a/src/gwin/gwin_widget.h b/src/gwin/gwin_widget.h index ceba235b..ece98a06 100644 --- a/src/gwin/gwin_widget.h +++ b/src/gwin/gwin_widget.h @@ -231,6 +231,24 @@ void gwinSetText(GHandle gh, const char *text, bool_t useAlloc); */ const char *gwinGetText(GHandle gh); +#if (GFX_USE_GFILE && GFILE_NEED_PRINTG && GFILE_NEED_STRINGS) || defined(__DOXYGEN__) + /** + * @brief Set the text of a widget using a printf style format. + * @pre GFX_USE_GFILE, GFILE_NEED_PRINTG and GFILE_NEED_STRINGS must all be TRUE + * + * @param[in] gh The widget handle + * @param[in] fmt The format string using a printf/g syntax. See @p vsnprintg() + * @param[in] ... The printg paramters. + * + * @note The widget is automatically redrawn + * @note Non-widgets will ignore this call. + * @note The memory for the text is always allocated by this function. + * + * @api + */ + void gwinPrintg(GHandle gh, const char * fmt,...); +#endif + /** * @brief Check whether a handles is a widget handle or not * |