diff options
author | reinelt <> | 2004-02-27 07:06:26 +0000 |
---|---|---|
committer | reinelt <> | 2004-02-27 07:06:26 +0000 |
commit | 8659e71bd29eac3eb42ff1c711b2d9f11d777099 (patch) | |
tree | 01b27139b7878ca0b0256e2ff149e28b464715cf /qprintf.c | |
parent | 3a49b990ddeac3a91caa1b52d4f911bf3413fcad (diff) | |
download | lcd4linux-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.c | 143 |
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; +} + |