~siretart/lcd4linux/debian

« back to all changes in this revision

Viewing changes to qprintf.c

  • Committer: Reinhard Tartler
  • Date: 2011-04-27 17:28:49 UTC
  • mfrom: (0.1.1 upstream)
  • Revision ID: siretart@tauware.de-20110427172849-mj5cj5a0igpcc9fn
New upstream snapshot

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: qprintf.c 728 2007-01-14 11:14:38Z michael $
2
 
 * $URL: https://ssl.bulix.org/svn/lcd4linux/branches/0.10.1/qprintf.c $
 
1
/* $Id: qprintf.c 918 2008-12-31 06:07:29Z michael $
 
2
 * $URL: https://ssl.bulix.org/svn/lcd4linux/trunk/qprintf.c $
3
3
 *
4
4
 * simple but quick snprintf() replacement
5
5
 *
6
 
 * Copyright (C) 2004 Michael Reinelt <reinelt@eunet.at>
 
6
 * Copyright (C) 2004 Michael Reinelt <michael@reinelt.co.at>
7
7
 * Copyright (C) 2004 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
8
8
 *
9
9
 * derived from a patch from Martin Hejl which is
31
31
 * exported functions:
32
32
 * 
33
33
 * int qprintf(char *str, size_t size, const char *format, ...)
34
 
 *   works like snprintf(), but format only knows about %d and %s
 
34
 *   works like snprintf(), but format only knows about %d, %x, %u and %s
 
35
 *     and for the numbers an optional length like %<len>d. If <len> beginns
 
36
 *     with '0' the free space is filled with '0's, otherwise with ' '
35
37
 */
36
38
 
37
39
 
42
44
#include <stdarg.h>
43
45
#include <string.h>
44
46
 
45
 
static char *itoa(char *buffer, const size_t size, int value)
 
47
static char *itoa(char *buffer, const size_t size, int value, unsigned int fixedlen, unsigned int fill0)
46
48
{
47
49
    char *p;
48
50
    int sign;
55
57
    sign = 0;
56
58
    if (value < 0) {
57
59
        sign = 1;
 
60
        if (fill0)
 
61
            fixedlen -= 1;
58
62
        value = -value;
59
63
    }
60
64
 
69
73
        value = value / 10;
70
74
    } while (value != 0 && p > buffer);
71
75
 
72
 
    if (sign && p > buffer)
 
76
    if (sign && !fill0 && p > buffer)
 
77
        *--p = '-';
 
78
 
 
79
    /* fill fixed length */
 
80
    while (p > buffer && strlen(p) < fixedlen) {
 
81
        if (fill0) {
 
82
            *--p = '0';
 
83
        } else {
 
84
            *--p = ' ';
 
85
        }
 
86
    }
 
87
 
 
88
    if (sign && fill0 && p > buffer)
73
89
        *--p = '-';
74
90
 
75
91
    return p;
76
92
}
77
93
 
78
94
 
79
 
static char *utoa(char *buffer, const size_t size, unsigned int value)
 
95
static char *utoa(char *buffer, const size_t size, unsigned int value, unsigned int fixedlen, unsigned int fill0)
80
96
{
81
97
    char *p;
82
98
 
95
111
        value = value / 10;
96
112
    } while (value != 0 && p > buffer);
97
113
 
 
114
    /* fill fixed length */
 
115
    while (p > buffer && strlen(p) < fixedlen) {
 
116
        if (fill0) {
 
117
            *--p = '0';
 
118
        } else {
 
119
            *--p = ' ';
 
120
        }
 
121
    }
 
122
 
98
123
    return p;
99
124
}
100
125
 
101
126
 
102
 
static char *utox(char *buffer, const size_t size, unsigned int value)
 
127
static char *utox(char *buffer, const size_t size, unsigned int value, unsigned int fixedlen, unsigned int fill0)
103
128
{
104
129
    char *p;
105
130
    int digit;
120
145
        *--p = (digit < 10 ? '0' : 'a' - 10) + digit;
121
146
    } while (value != 0 && p > buffer);
122
147
 
 
148
    /* fill fixed length */
 
149
    while (p > buffer && strlen(p) < fixedlen) {
 
150
        if (fill0) {
 
151
            *--p = '0';
 
152
        } else {
 
153
            *--p = ' ';
 
154
        }
 
155
    }
 
156
 
123
157
    return p;
124
158
}
125
159
 
126
160
 
 
161
/*!
 
162
    @function   qprintf
 
163
    @abstract   quick print values into string
 
164
    @discussion similar to snprintf(), but only support for "%s", "%d", "%u", "%x" with optional length for the numbers
 
165
                like "%5d" (filled with ' ') or "%05x" (filled with '0')
 
166
    @param      str  destination
 
167
    @param      size  maximum length of destination string
 
168
    @param      format  (like printf() with reduced number of formats)
 
169
    @result     length of produced string
 
170
*/
127
171
int qprintf(char *str, const size_t size, const char *format, ...)
128
172
{
129
173
 
145
189
            char buf[12], *s;
146
190
            int d;
147
191
            unsigned int u;
148
 
            switch (*++src) {
 
192
            unsigned int fixedlen = 0;
 
193
            unsigned int fill0 = 0;
 
194
 
 
195
            if (*++src == '0')
 
196
                fill0 = 1;
 
197
            while (*src >= '0' && *src <= '9') {
 
198
                fixedlen = fixedlen * 10 + (*src - '0');
 
199
                src++;
 
200
            }
 
201
 
 
202
            switch (*src) {
149
203
            case 's':
150
204
                src++;
151
205
                s = va_arg(ap, char *);
157
211
            case 'd':
158
212
                src++;
159
213
                d = va_arg(ap, int);
160
 
                s = itoa(buf, sizeof(buf), d);
 
214
                s = itoa(buf, sizeof(buf), d, fixedlen, fill0);
161
215
                while (len < size && *s != '\0') {
162
216
                    len++;
163
217
                    *dst++ = *s++;
166
220
            case 'u':
167
221
                src++;
168
222
                u = va_arg(ap, unsigned int);
169
 
                s = utoa(buf, sizeof(buf), u);
 
223
                s = utoa(buf, sizeof(buf), u, fixedlen, fill0);
170
224
                while (len < size - 1 && *s != '\0') {
171
225
                    len++;
172
226
                    *dst++ = *s++;
175
229
            case 'x':
176
230
                src++;
177
231
                u = va_arg(ap, unsigned int);
178
 
                s = utox(buf, sizeof(buf), u);
 
232
                s = utox(buf, sizeof(buf), u, fixedlen, fill0);
179
233
                while (len < size - 1 && *s != '\0') {
180
234
                    len++;
181
235
                    *dst++ = *s++;