summaryrefslogtreecommitdiffstats
path: root/lib/qstring.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/qstring.h')
-rw-r--r--lib/qstring.h20
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/qstring.h b/lib/qstring.h
index 536105d0..b9813bc7 100644
--- a/lib/qstring.h
+++ b/lib/qstring.h
@@ -518,16 +518,16 @@ qs_make_string(qstring qs)
/*------------------------------------------------------------------------------
* Return pointer to string value.
*
- * If possible, writes '\0' at 'len' in order to return a terminated string.
+ * Writes '\0' at 'len' in order to return a terminated string, if required.
*
* If qs == NULL or body == NULL, or 'len' == 0 returns pointer to constant
* empty '\0' terminated string (ie "").
*
* NB: if 'len' is beyond the current 'size' of the of the qstring, then
- * does NOT write '\0' (does NOT extend the string).
+ * will extend the string.
*
- * NB: if string is an alias, this returns its address, whether it is
- * terminated or not.
+ * NB: if string is an alias, and that is not '\0' terminated, will make a
+ * copy, before writing '\0' at end.
*
* NB: In any event, the string should not be changed or reset until this
* pointer has been discarded !
@@ -542,8 +542,16 @@ qs_string(qstring qs)
|| ((p = qs_char_nn(qs)) == NULL) )
return "" ;
- if (len < qs->size) /* for alias, qs_size == 0 */
- *(p + len) = '\0' ;
+ if (len >= qs->size) /* for alias, qs_size == 0 */
+ {
+ if (qs->alias && (*(p + len) == '\0'))
+ return p ;
+
+ qs_make_to_size(qs, len, len) ; /* extend and/or copy alias */
+ p = qs_char_nn(qs) ;
+ } ;
+
+ *(p + len) = '\0' ;
return p ;
} ;