]>
git.ipfire.org Git - thirdparty/cups.git/blob - cups/snprintf.c
2 * snprintf functions for CUPS.
4 * Copyright 2007-2013 by Apple Inc.
5 * Copyright 1997-2007 by Easy Software Products.
7 * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
11 * Include necessary headers...
14 #include "string-private.h"
17 #ifndef HAVE_VSNPRINTF
19 * '_cups_vsnprintf()' - Format a string into a fixed size buffer.
22 int /* O - Number of bytes formatted */
23 _cups_vsnprintf(char *buffer
, /* O - Output buffer */
24 size_t bufsize
, /* O - Size of output buffer */
25 const char *format
, /* I - printf-style format string */
26 va_list ap
) /* I - Pointer to additional arguments */
28 char *bufptr
, /* Pointer to position in buffer */
29 *bufend
, /* Pointer to end of buffer */
30 sign
, /* Sign of format width */
31 size
, /* Size character (h, l, L) */
32 type
; /* Format type character */
33 int width
, /* Width of field */
34 prec
; /* Number of characters of precision */
35 char tformat
[100], /* Temporary format string for sprintf() */
36 *tptr
, /* Pointer into temporary format */
37 temp
[1024]; /* Buffer for formatted numbers */
38 size_t templen
; /* Length of "temp" */
39 char *s
; /* Pointer to string */
40 int slen
; /* Length of string */
41 int bytes
; /* Total number of bytes needed */
45 * Loop through the format string, formatting as needed...
49 bufend
= buffer
+ bufsize
- 1;
61 if (bufptr
&& bufptr
< bufend
) *bufptr
++ = *format
;
66 else if (strchr(" -+#\'", *format
))
77 * Get width from argument...
81 width
= va_arg(ap
, int);
83 snprintf(tptr
, sizeof(tformat
) - (tptr
- tformat
), "%d", width
);
90 while (isdigit(*format
& 255))
92 if (tptr
< (tformat
+ sizeof(tformat
) - 1))
95 width
= width
* 10 + *format
++ - '0';
101 if (tptr
< (tformat
+ sizeof(tformat
) - 1))
109 * Get precision from argument...
113 prec
= va_arg(ap
, int);
115 snprintf(tptr
, sizeof(tformat
) - (tptr
- tformat
), "%d", prec
);
116 tptr
+= strlen(tptr
);
122 while (isdigit(*format
& 255))
124 if (tptr
< (tformat
+ sizeof(tformat
) - 1))
127 prec
= prec
* 10 + *format
++ - '0';
134 if (*format
== 'l' && format
[1] == 'l')
138 if (tptr
< (tformat
+ sizeof(tformat
) - 2))
146 else if (*format
== 'h' || *format
== 'l' || *format
== 'L')
148 if (tptr
< (tformat
+ sizeof(tformat
) - 1))
157 if (tptr
< (tformat
+ sizeof(tformat
) - 1))
165 case 'E' : /* Floating point formats */
170 if ((width
+ 2) > sizeof(temp
))
173 sprintf(temp
, tformat
, va_arg(ap
, double));
174 templen
= strlen(temp
):
176 bytes
+= (int)templen
;
180 if ((bufptr
+ templen
) > bufend
)
182 strlcpy(bufptr
, temp
, (size_t)(bufend
- bufptr
));
187 memcpy(bufptr
, temp
, templen
+ 1);
193 case 'B' : /* Integer formats */
201 if ((width
+ 2) > sizeof(temp
))
204 sprintf(temp
, tformat
, va_arg(ap
, int));
205 templen
= strlen(temp
):
207 bytes
+= (int)templen
;
211 if ((bufptr
+ templen
) > bufend
)
213 strlcpy(bufptr
, temp
, (size_t)(bufend
- bufptr
));
218 memcpy(bufptr
, temp
, templen
+ 1);
224 case 'p' : /* Pointer value */
225 if ((width
+ 2) > sizeof(temp
))
228 sprintf(temp
, tformat
, va_arg(ap
, void *));
229 templen
= strlen(temp
):
231 bytes
+= (int)templen
;
235 if ((bufptr
+ templen
) > bufend
)
237 strlcpy(bufptr
, temp
, (size_t)(bufend
- bufptr
));
242 memcpy(bufptr
, temp
, templen
+ 1);
248 case 'c' : /* Character or character array */
254 *bufptr
++ = va_arg(ap
, int);
257 if ((bufptr
+ width
) > bufend
)
258 width
= (int)(bufend
- bufptr
);
260 memcpy(bufptr
, va_arg(ap
, char *), (size_t)width
);
266 case 's' : /* String */
267 if ((s
= va_arg(ap
, char *)) == NULL
)
270 slen
= (int)strlen(s
);
271 if (slen
> width
&& prec
!= width
)
278 if ((bufptr
+ width
) > bufend
)
279 width
= (int)(bufend
- bufptr
);
286 memcpy(bufptr
, s
, (size_t)slen
);
287 memset(bufptr
+ slen
, ' ', (size_t)(width
- slen
));
291 memset(bufptr
, ' ', (size_t)(width
- slen
));
292 memcpy(bufptr
+ width
- slen
, s
, (size_t)slen
);
299 case 'n' : /* Output number of chars so far */
300 *(va_arg(ap
, int *)) = bytes
;
308 if (bufptr
&& bufptr
< bufend
)
316 * Nul-terminate the string and return the number of characters needed.
323 #endif /* !HAVE_VSNPRINT */
326 #ifndef HAVE_SNPRINTF
328 * '_cups_snprintf()' - Format a string into a fixed size buffer.
331 int /* O - Number of bytes formatted */
332 _cups_snprintf(char *buffer
, /* O - Output buffer */
333 size_t bufsize
, /* O - Size of output buffer */
334 const char *format
, /* I - printf-style format string */
335 ...) /* I - Additional arguments as needed */
337 int bytes
; /* Number of bytes formatted */
338 va_list ap
; /* Pointer to additional arguments */
341 va_start(ap
, format
);
342 bytes
= vsnprintf(buffer
, bufsize
, format
, ap
);
347 #endif /* !HAVE_SNPRINTF */