Transferred dungeonbash's stlprintf functionality to libmormegil
authorMartin Read <mpread@chiark.greenend.org.uk>
Fri, 22 Oct 2010 17:41:34 +0000 (18:41 +0100)
committerMartin Read <mpread@chiark.greenend.org.uk>
Fri, 22 Oct 2010 17:41:34 +0000 (18:41 +0100)
include/libmormegil/stlprintf.hh [new file with mode: 0644]
src/stlprintf.cc [new file with mode: 0644]

diff --git a/include/libmormegil/stlprintf.hh b/include/libmormegil/stlprintf.hh
new file mode 100644 (file)
index 0000000..3378098
--- /dev/null
@@ -0,0 +1,39 @@
+/* stlprintf.hh - (v)sprintf-for-STL-strings for Martin's Dungeon Bash
+ * 
+ * Copyright 2009 Martin Read and Stefan O'Rear
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef STLPRINTF_HH
+#define STLPRINTF_HH
+#include <stdarg.h>
+#include <string>
+
+namespace libmrl
+{
+    extern std::string vstlprintf(const char *fmt, va_list args);
+    extern std::string stlprintf(const char *fmt, ...);
+}
+#endif
+
+/* stlprintf.hh */
diff --git a/src/stlprintf.cc b/src/stlprintf.cc
new file mode 100644 (file)
index 0000000..a50fb3a
--- /dev/null
@@ -0,0 +1,74 @@
+/* stlprintf.cc - (v)sprintf for STL strings
+ * 
+ * Copyright 2009, 2010 Martin Read and Stefan O'Rear
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#define STLPRINTF_CC
+
+#include <stdarg.h>
+#include <string>
+#include <libmormegil/stlprintf.hh>
+
+std::string libmormegil::vstlprintf(const char *fmt, va_list args)
+{
+    va_list ap;
+    int bsize = 80;
+
+    do
+    {
+        char* buf = new char[bsize];
+
+        va_copy(ap, args);
+        int ret = vsnprintf(buf, bsize, fmt, ap);
+        va_end(ap);
+
+        // glibc2.0 compatibility;
+        if (ret == -1)
+        {
+            ret = bsize * 2;
+        }
+
+        if (ret <= bsize)
+        {
+            std::string retv(buf, ret);
+            delete buf;
+            return retv;
+        }
+
+        delete buf;
+        bsize = ret + 1;
+    }
+    while(1);
+}
+
+std::string libmormegil::stlprintf(const char *fmt, ...)
+{
+    va_list ap;
+    va_start(ap, fmt);
+    std::string ret = vstlprintf(fmt, ap);
+    va_end(ap);
+    return ret;
+}
+
+/* stlprintf.cc */