aboutsummaryrefslogtreecommitdiffstats
path: root/qprintf.c
diff options
context:
space:
mode:
authorreinelt <>2004-02-27 07:06:26 +0000
committerreinelt <>2004-02-27 07:06:26 +0000
commit8659e71bd29eac3eb42ff1c711b2d9f11d777099 (patch)
tree01b27139b7878ca0b0256e2ff149e28b464715cf /qprintf.c
parent3a49b990ddeac3a91caa1b52d4f911bf3413fcad (diff)
downloadlcd4linux-8659e71bd29eac3eb42ff1c711b2d9f11d777099.tar.gz
[lcd4linux @ 2004-02-27 07:06:24 by reinelt]
new function 'qprintf()' (simple but quick snprintf() replacement)
Diffstat (limited to 'qprintf.c')
-rw-r--r--qprintf.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/qprintf.c b/qprintf.c
new file mode 100644
index 0000000..2a51782
--- /dev/null
+++ b/qprintf.c
@@ -0,0 +1,143 @@
+/* $Id: qprintf.c,v 1.1 2004/02/27 07:06:26 reinelt Exp $
+ *
+ * simple but quick snprintf() replacement
+ *
+ * Copyright 2004 Michael Reinelt <reinelt@eunet.at>
+ * Copyright 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
+ *
+ * derived from a patch from Martin Hejl which is
+ * Copyright 2003 Martin Hejl (martin@hejl.de)
+ *
+ * This file is part of LCD4Linux.
+ *
+ * LCD4Linux is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * LCD4Linux is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * $Log: qprintf.c,v $
+ * Revision 1.1 2004/02/27 07:06:26 reinelt
+ * new function 'qprintf()' (simple but quick snprintf() replacement)
+ *
+ */
+
+/*
+ * exported functions:
+ *
+ * int qprintf(char *str, size_t size, const char *format, ...)
+ * works like snprintf(), but format only knows about %d and %s
+ */
+
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+
+static char *itoa(char* buffer, size_t size, int value)
+{
+ char *p;
+ int sign;
+
+ // sanity checks
+ if (buffer==NULL || size<2) return (NULL);
+
+ // remember sign of value
+ sign = 0;
+ if (value < 0) {
+ sign = 1;
+ value = -value;
+ }
+
+ // p points to last char
+ p = buffer+size-1;
+
+ // set terminating zero
+ *p='\0';
+
+ do {
+ *--p = value%10 + '0';
+ value = value/10;
+ } while (value!=0 && p>buffer);
+
+ if (sign && p>buffer)
+ *--p = '-';
+
+ return p;
+}
+
+
+int qprintf(char *str, size_t size, const char *format, ...) {
+
+ va_list ap;
+ const char *src;
+ char *dst;
+ int len;
+
+ src = format;
+ dst = str;
+ len = 0;
+
+ // leave room for terminating zero
+ size--;
+
+ va_start(ap, format);
+
+ while (len < size) {
+
+ if (*src=='%') {
+ char buf[12], *s;
+ int d;
+ switch (*++src) {
+ case 's':
+ src++;
+ s = va_arg(ap, char *);
+ while (len < size && *s != '\0') {
+ len++;
+ *dst++ = *s++;
+ }
+ break;
+ case 'd':
+ src++;
+ d = va_arg(ap, int);
+ s = itoa (buf, sizeof(buf), d);
+ while (len < size && *s != '\0') {
+ len++;
+ *dst++ = *s++;
+ }
+ break;
+ default:
+ len++;
+ *dst++ = '%';
+ }
+ } else {
+ len++;
+ *dst++ = *src;
+ if (*src++ == '\0') break;
+ }
+ }
+
+ va_end(ap);
+
+ // enforce terminating zero
+ if (len>=size && *(dst-1)!='\0') {
+ len++;
+ *dst='\0';
+ }
+
+ // do not count terminating zero
+ return len-1;
+}
+