From 485a26f6e3e2e84d7f9b8279fa6d7f440ea50a8b Mon Sep 17 00:00:00 2001 From: reinelt Date: Fri, 27 Feb 2004 07:06:26 +0000 Subject: [lcd4linux @ 2004-02-27 07:06:24 by reinelt] new function 'qprintf()' (simple but quick snprintf() replacement) git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@379 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- qprintf.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 qprintf.c (limited to 'qprintf.c') 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 + * Copyright 2004 The LCD4Linux Team + * + * 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 +#include +#include +#include + +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; +} + -- cgit v1.2.3