Add _buf() functions to bypass static string buffers

We have a number of static buffers in use in libosmo*.  This means
the related functions are not usable in a thread-safe way.  While
we so far don't have many multi-threaded programs in the osmocom
universe, the static buffers also prevent us from calling the same
e.g. string-ify function twice within a single printf() call.

Let's make sure there's an alternative function in all those cases,
where the user can pass in a caller-allocated buffer + size, and make
the 'classic' function with the static buffer a wrapper around that
_buf() variant.

Change-Id: Ibf85f79e93244f53b2684ff6f1095c5b41203e05
diff --git a/src/sim/core.c b/src/sim/core.c
index a78cecc..998e836 100644
--- a/src/sim/core.c
+++ b/src/sim/core.c
@@ -267,10 +267,8 @@
 	return msg;
 }
 
-/* FIXME: do we want to mark this as __thread? */
-static char sw_print_buf[256];
 
-char *osim_print_sw(const struct osim_card_hdl *ch, uint16_t sw_in)
+char *osim_print_sw_buf(char *buf, size_t buf_len, const struct osim_card_hdl *ch, uint16_t sw_in)
 {
 	const struct osim_card_sw *csw;
 
@@ -283,25 +281,29 @@
 
 	switch (csw->type) {
 	case SW_TYPE_STR:
-		snprintf(sw_print_buf, sizeof(sw_print_buf),
-			 "%04x (%s)", sw_in, csw->u.str);
+		snprintf(buf, buf_len, "%04x (%s)", sw_in, csw->u.str);
 		break;
 	default:
 		goto ret_def;
 	}
 
-	sw_print_buf[sizeof(sw_print_buf)-1] = '\0';
+	buf[buf_len-1] = '\0';
 
-	return sw_print_buf;
+	return buf;
 
 ret_def:
-	snprintf(sw_print_buf, sizeof(sw_print_buf),
-		 "%04x (Unknown)", sw_in);
-	sw_print_buf[sizeof(sw_print_buf)-1] = '\0';
+	snprintf(buf, buf_len, "%04x (Unknown)", sw_in);
+	buf[buf_len-1] = '\0';
 
-	return sw_print_buf;
+	return buf;
 }
 
+char *osim_print_sw(const struct osim_card_hdl *ch, uint16_t sw_in)
+{
+	/* FIXME: do we want to mark this as __thread? */
+	static char sw_print_buf[256];
+	return osim_print_sw_buf(sw_print_buf, sizeof(sw_print_buf), ch, sw_in);
+}
 
 const struct osim_card_sw *osim_find_sw(const struct osim_card_profile *cp,
 					uint16_t sw_in)