1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/bio/b_print.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* disable assert() unless BIO_DEBUG has been defined */
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef BIO_DEBUG
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ifndef NDEBUG
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  define NDEBUG
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Stolen from tjh's ssl/ssl_trc.c stuff.
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h>
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <ctype.h>
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <assert.h>
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <limits.h>
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef NO_SYS_TYPES_H
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/types.h>
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bn.h>         /* To get BN_LLONG properly defined */
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h>
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if defined(BN_LLONG) || defined(SIXTY_FOUR_BIT)
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# ifndef HAVE_LONG_LONG
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#  define HAVE_LONG_LONG 1
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/***************************************************************************/
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright Patrick Powell 1995
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This code is based on code written by Patrick Powell <papowell@astart.com>
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * It may be used for any purpose as long as this notice remains intact
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * on all source code distributions.
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This code contains numerious changes and enhancements which were
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * made by lots of contributors over the last years to Patrick Powell's
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * original code:
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * o Patrick Powell <papowell@astart.com>      (1995)
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * o Brandon Long <blong@fiction.net>          (1996, for Mutt)
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * o Thomas Roessler <roessler@guug.de>        (1998, for Mutt)
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * o Michael Elkins <me@cs.hmc.edu>            (1998, for Mutt)
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * o Andrew Tridgell <tridge@samba.org>        (1998, for Samba)
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * o Luke Mewburn <lukem@netbsd.org>           (1999, for LukemFTP)
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * o Ralf S. Engelschall <rse@engelschall.com> (1999, for Pth)
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * o ...                                       (for OpenSSL)
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef HAVE_LONG_DOUBLE
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define LDOUBLE long double
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define LDOUBLE double
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifdef HAVE_LONG_LONG
119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom# if defined(_WIN32) && !defined(__GNUC__)
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define LLONG __int64
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# else
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# define LLONG long long
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# endif
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define LLONG long
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void fmtstr     (char **, char **, size_t *, size_t *,
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			const char *, int, int, int);
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void fmtint     (char **, char **, size_t *, size_t *,
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			LLONG, int, int, int, int);
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void fmtfp      (char **, char **, size_t *, size_t *,
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			LDOUBLE, int, int, int);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void doapr_outch (char **, char **, size_t *, size_t *, int);
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void _dopr(char **sbuffer, char **buffer,
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		  size_t *maxlen, size_t *retlen, int *truncated,
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		  const char *format, va_list args);
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* format read states */
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_S_DEFAULT    0
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_S_FLAGS      1
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_S_MIN        2
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_S_DOT        3
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_S_MAX        4
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_S_MOD        5
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_S_CONV       6
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_S_DONE       7
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* format flags - Bits */
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_F_MINUS      (1 << 0)
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_F_PLUS       (1 << 1)
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_F_SPACE      (1 << 2)
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_F_NUM        (1 << 3)
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_F_ZERO       (1 << 4)
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_F_UP         (1 << 5)
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_F_UNSIGNED   (1 << 6)
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* conversion flags */
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_C_SHORT      1
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_C_LONG       2
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_C_LDOUBLE    3
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define DP_C_LLONG      4
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* some handy macros */
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define char_to_int(p) (p - '0')
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define OSSL_MAX(p,q) ((p >= q) ? p : q)
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project_dopr(
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **sbuffer,
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **buffer,
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *maxlen,
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *retlen,
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int *truncated,
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const char *format,
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    va_list args)
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char ch;
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LLONG value;
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LDOUBLE fvalue;
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char *strvalue;
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int min;
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int max;
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int state;
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int flags;
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int cflags;
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t currlen;
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    state = DP_S_DEFAULT;
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    flags = currlen = cflags = min = 0;
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    max = -1;
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ch = *format++;
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (state != DP_S_DONE) {
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (ch == '\0' || (buffer == NULL && currlen >= *maxlen))
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            state = DP_S_DONE;
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        switch (state) {
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        case DP_S_DEFAULT:
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            if (ch == '%')
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                state = DP_S_FLAGS;
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            else
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                doapr_outch(sbuffer,buffer, &currlen, maxlen, ch);
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            ch = *format++;
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        case DP_S_FLAGS:
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            switch (ch) {
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case '-':
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_MINUS;
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case '+':
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_PLUS;
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case ' ':
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_SPACE;
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case '#':
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_NUM;
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case '0':
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_ZERO;
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            default:
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                state = DP_S_MIN;
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            }
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        case DP_S_MIN:
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            if (isdigit((unsigned char)ch)) {
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                min = 10 * min + char_to_int(ch);
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            } else if (ch == '*') {
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                min = va_arg(args, int);
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                state = DP_S_DOT;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            } else
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                state = DP_S_DOT;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        case DP_S_DOT:
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            if (ch == '.') {
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                state = DP_S_MAX;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            } else
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                state = DP_S_MOD;
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        case DP_S_MAX:
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            if (isdigit((unsigned char)ch)) {
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (max < 0)
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    max = 0;
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                max = 10 * max + char_to_int(ch);
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            } else if (ch == '*') {
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                max = va_arg(args, int);
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                state = DP_S_MOD;
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            } else
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                state = DP_S_MOD;
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        case DP_S_MOD:
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            switch (ch) {
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'h':
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                cflags = DP_C_SHORT;
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'l':
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (*format == 'l') {
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    cflags = DP_C_LLONG;
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    format++;
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                } else
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    cflags = DP_C_LONG;
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'q':
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                cflags = DP_C_LLONG;
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'L':
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                cflags = DP_C_LDOUBLE;
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            default:
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            }
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            state = DP_S_CONV;
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        case DP_S_CONV:
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            switch (ch) {
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'd':
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'i':
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                switch (cflags) {
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                case DP_C_SHORT:
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value = (short int)va_arg(args, int);
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    break;
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                case DP_C_LONG:
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value = va_arg(args, long int);
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    break;
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                case DP_C_LLONG:
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value = va_arg(args, LLONG);
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    break;
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                default:
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value = va_arg(args, int);
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    break;
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                }
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                fmtint(sbuffer, buffer, &currlen, maxlen,
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       value, 10, min, max, flags);
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'X':
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_UP;
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                /* FALLTHROUGH */
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'x':
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'o':
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'u':
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_UNSIGNED;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                switch (cflags) {
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                case DP_C_SHORT:
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value = (unsigned short int)va_arg(args, unsigned int);
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    break;
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                case DP_C_LONG:
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value = (LLONG) va_arg(args,
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        unsigned long int);
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    break;
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                case DP_C_LLONG:
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value = va_arg(args, unsigned LLONG);
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    break;
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                default:
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value = (LLONG) va_arg(args,
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                        unsigned int);
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    break;
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                }
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                fmtint(sbuffer, buffer, &currlen, maxlen, value,
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       ch == 'o' ? 8 : (ch == 'u' ? 10 : 16),
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       min, max, flags);
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'f':
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (cflags == DP_C_LDOUBLE)
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    fvalue = va_arg(args, LDOUBLE);
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                else
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    fvalue = va_arg(args, double);
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                fmtfp(sbuffer, buffer, &currlen, maxlen,
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                      fvalue, min, max, flags);
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'E':
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_UP;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'e':
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (cflags == DP_C_LDOUBLE)
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    fvalue = va_arg(args, LDOUBLE);
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                else
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    fvalue = va_arg(args, double);
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'G':
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                flags |= DP_F_UP;
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'g':
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (cflags == DP_C_LDOUBLE)
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    fvalue = va_arg(args, LDOUBLE);
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                else
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    fvalue = va_arg(args, double);
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'c':
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                doapr_outch(sbuffer, buffer, &currlen, maxlen,
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    va_arg(args, int));
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 's':
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                strvalue = va_arg(args, char *);
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (max < 0) {
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    if (buffer)
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			max = INT_MAX;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    else
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			max = *maxlen;
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                fmtstr(sbuffer, buffer, &currlen, maxlen, strvalue,
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       flags, min, max);
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'p':
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                value = (long)va_arg(args, void *);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                fmtint(sbuffer, buffer, &currlen, maxlen,
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    value, 16, min, max, flags|DP_F_NUM);
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'n': /* XXX */
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                if (cflags == DP_C_SHORT) {
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    short int *num;
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    num = va_arg(args, short int *);
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    *num = currlen;
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                } else if (cflags == DP_C_LONG) { /* XXX */
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    long int *num;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    num = va_arg(args, long int *);
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    *num = (long int) currlen;
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                } else if (cflags == DP_C_LLONG) { /* XXX */
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    LLONG *num;
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    num = va_arg(args, LLONG *);
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    *num = (LLONG) currlen;
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                } else {
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    int    *num;
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    num = va_arg(args, int *);
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                    *num = currlen;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                }
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case '%':
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                doapr_outch(sbuffer, buffer, &currlen, maxlen, ch);
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            case 'w':
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                /* not supported yet, treat as next char */
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                ch = *format++;
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            default:
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                /* unknown, skip */
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                break;
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            }
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            ch = *format++;
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            state = DP_S_DEFAULT;
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            flags = cflags = min = 0;
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            max = -1;
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        case DP_S_DONE:
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        default:
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            break;
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    *truncated = (currlen > *maxlen - 1);
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (*truncated)
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        currlen = *maxlen - 1;
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0');
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    *retlen = currlen - 1;
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return;
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfmtstr(
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **sbuffer,
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **buffer,
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *currlen,
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *maxlen,
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const char *value,
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int flags,
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int min,
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int max)
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int padlen, strln;
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int cnt = 0;
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (value == 0)
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        value = "<NULL>";
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    for (strln = 0; value[strln]; ++strln)
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ;
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    padlen = min - strln;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (padlen < 0)
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        padlen = 0;
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (flags & DP_F_MINUS)
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        padlen = -padlen;
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while ((padlen > 0) && (cnt < max)) {
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        --padlen;
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ++cnt;
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (*value && (cnt < max)) {
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, *value++);
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ++cnt;
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while ((padlen < 0) && (cnt < max)) {
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ++padlen;
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ++cnt;
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfmtint(
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **sbuffer,
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **buffer,
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *currlen,
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *maxlen,
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LLONG value,
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int base,
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int min,
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int max,
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int flags)
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int signvalue = 0;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const char *prefix = "";
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned LLONG uvalue;
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char convert[DECIMAL_SIZE(value)+3];
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int place = 0;
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int spadlen = 0;
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int zpadlen = 0;
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int caps = 0;
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (max < 0)
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        max = 0;
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    uvalue = value;
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (!(flags & DP_F_UNSIGNED)) {
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (value < 0) {
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            signvalue = '-';
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            uvalue = -value;
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        } else if (flags & DP_F_PLUS)
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            signvalue = '+';
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        else if (flags & DP_F_SPACE)
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            signvalue = ' ';
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (flags & DP_F_NUM) {
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (base == 8) prefix = "0";
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (base == 16) prefix = "0x";
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (flags & DP_F_UP)
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        caps = 1;
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    do {
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        convert[place++] =
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            (caps ? "0123456789ABCDEF" : "0123456789abcdef")
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            [uvalue % (unsigned) base];
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        uvalue = (uvalue / (unsigned) base);
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    } while (uvalue && (place < (int)sizeof(convert)));
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (place == sizeof(convert))
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        place--;
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    convert[place] = 0;
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    zpadlen = max - place;
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - strlen(prefix);
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (zpadlen < 0)
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        zpadlen = 0;
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (spadlen < 0)
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        spadlen = 0;
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (flags & DP_F_ZERO) {
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        zpadlen = OSSL_MAX(zpadlen, spadlen);
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        spadlen = 0;
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (flags & DP_F_MINUS)
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        spadlen = -spadlen;
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* spaces */
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (spadlen > 0) {
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        --spadlen;
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* sign */
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (signvalue)
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* prefix */
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (*prefix) {
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix);
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	prefix++;
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* zeros */
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (zpadlen > 0) {
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        while (zpadlen > 0) {
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            --zpadlen;
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* digits */
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (place > 0)
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]);
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* left justified spaces */
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (spadlen < 0) {
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ++spadlen;
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return;
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic LDOUBLE
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectabs_val(LDOUBLE value)
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LDOUBLE result = value;
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (value < 0)
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        result = -value;
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return result;
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic LDOUBLE
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectpow_10(int in_exp)
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LDOUBLE result = 1;
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (in_exp) {
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        result *= 10;
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        in_exp--;
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return result;
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic long
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectroundv(LDOUBLE value)
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    long intpart;
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    intpart = (long) value;
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    value = value - intpart;
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (value >= 0.5)
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        intpart++;
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return intpart;
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectfmtfp(
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **sbuffer,
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **buffer,
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *currlen,
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *maxlen,
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LDOUBLE fvalue,
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int min,
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int max,
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int flags)
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int signvalue = 0;
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    LDOUBLE ufvalue;
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char iconvert[20];
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char fconvert[20];
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int iplace = 0;
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int fplace = 0;
617656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int padlen = 0;
618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int zpadlen = 0;
619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int caps = 0;
620656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    long intpart;
621656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    long fracpart;
622656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    long max10;
623656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
624656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (max < 0)
625656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        max = 6;
626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ufvalue = abs_val(fvalue);
627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (fvalue < 0)
628656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        signvalue = '-';
629656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    else if (flags & DP_F_PLUS)
630656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        signvalue = '+';
631656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    else if (flags & DP_F_SPACE)
632656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        signvalue = ' ';
633656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    intpart = (long)ufvalue;
635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* sorry, we only support 9 digits past the decimal because of our
637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project       conversion method */
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (max > 9)
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        max = 9;
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* we "cheat" by converting the fractional part to integer by
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project       multiplying by a factor of 10 */
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    max10 = roundv(pow_10(max));
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    fracpart = roundv(pow_10(max) * (ufvalue - intpart));
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (fracpart >= max10) {
647656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        intpart++;
648656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        fracpart -= max10;
649656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
650656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
651656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* convert integer part */
652656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    do {
653656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        iconvert[iplace++] =
654656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            (caps ? "0123456789ABCDEF"
655656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project              : "0123456789abcdef")[intpart % 10];
656656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        intpart = (intpart / 10);
657656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    } while (intpart && (iplace < (int)sizeof(iconvert)));
658656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (iplace == sizeof iconvert)
659656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        iplace--;
660656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    iconvert[iplace] = 0;
661656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
662656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* convert fractional part */
663656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    do {
664656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        fconvert[fplace++] =
665656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            (caps ? "0123456789ABCDEF"
666656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project              : "0123456789abcdef")[fracpart % 10];
667656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        fracpart = (fracpart / 10);
668656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    } while (fplace < max);
669656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (fplace == sizeof fconvert)
670656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        fplace--;
671656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    fconvert[fplace] = 0;
672656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
673656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* -1 for decimal point, another -1 if we are printing a sign */
674656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0);
675656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    zpadlen = max - fplace;
676656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (zpadlen < 0)
677656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        zpadlen = 0;
678656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (padlen < 0)
679656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        padlen = 0;
680656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (flags & DP_F_MINUS)
681656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        padlen = -padlen;
682656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
683656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if ((flags & DP_F_ZERO) && (padlen > 0)) {
684656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (signvalue) {
685656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
686656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            --padlen;
687656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            signvalue = 0;
688656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
689656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        while (padlen > 0) {
690656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
691656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            --padlen;
692656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        }
693656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
694656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (padlen > 0) {
695656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
696656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        --padlen;
697656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
698656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (signvalue)
699656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
700656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
701656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (iplace > 0)
702656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]);
703656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
704656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /*
705656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project     * Decimal point. This should probably use locale to find the correct
706656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project     * char to print out.
707656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project     */
708656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (max > 0 || (flags & DP_F_NUM)) {
709656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, '.');
710656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
711656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        while (fplace > 0)
712656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project            doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]);
713656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
714656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (zpadlen > 0) {
715656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, '0');
716656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        --zpadlen;
717656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
718656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
719656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    while (padlen < 0) {
720656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');
721656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        ++padlen;
722656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
723656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
724656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
725656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void
726656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdoapr_outch(
727656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **sbuffer,
728656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char **buffer,
729656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *currlen,
730656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    size_t *maxlen,
731656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int c)
732656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
733656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* If we haven't at least one buffer, someone has doe a big booboo */
734656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    assert(*sbuffer != NULL || buffer != NULL);
735656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
736656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (buffer) {
737656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (*currlen >= *maxlen) {
738656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    if (*buffer == NULL) {
739656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*maxlen == 0)
740656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    *maxlen = 1024;
741656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*buffer = OPENSSL_malloc(*maxlen);
742656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (*currlen > 0) {
743656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    assert(*sbuffer != NULL);
744656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		    memcpy(*buffer, *sbuffer, *currlen);
745656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
746656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*sbuffer = NULL;
747656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    } else {
748656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*maxlen += 1024;
749656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*buffer = OPENSSL_realloc(*buffer, *maxlen);
750656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    }
751656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
752656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* What to do if *buffer is NULL? */
753656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	assert(*sbuffer != NULL || *buffer != NULL);
754656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
755656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
756656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (*currlen < *maxlen) {
757656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (*sbuffer)
758656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    (*sbuffer)[(*currlen)++] = (char)c;
759656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
760656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    (*buffer)[(*currlen)++] = (char)c;
761656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
762656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
763656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return;
764656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
765656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
766656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/***************************************************************************/
767656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
768656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_printf (BIO *bio, const char *format, ...)
769656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
770656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	va_list args;
771656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
772656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
773656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	va_start(args, format);
774656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
775656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = BIO_vprintf(bio, format, args);
776656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
777656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	va_end(args);
778656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
779656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
780656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
781656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_vprintf (BIO *bio, const char *format, va_list args)
782656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
783656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
784656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	size_t retlen;
785656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char hugebuf[1024*2];	/* Was previously 10k, which is unreasonable
786656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   in small-stack environments, like threads
787656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				   or DOS programs. */
788656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *hugebufp = hugebuf;
789656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	size_t hugebufsize = sizeof(hugebuf);
790656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *dynbuf = NULL;
791656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ignored;
792656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
793656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	dynbuf = NULL;
794656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_push_info("doapr()");
795656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_dopr(&hugebufp, &dynbuf, &hugebufsize,
796656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		&retlen, &ignored, format, args);
797656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (dynbuf)
798656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
799656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=BIO_write(bio, dynbuf, (int)retlen);
800656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(dynbuf);
801656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
802656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
803656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
804656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret=BIO_write(bio, hugebuf, (int)retlen);
805656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
806656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	CRYPTO_pop_info();
807656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
808656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
809656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
810656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* As snprintf is not available everywhere, we provide our own implementation.
811656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This function has nothing to do with BIOs, but it's closely related
812656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * to BIO_printf, and we need *some* name prefix ...
813656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (XXX  the function should be renamed, but to what?) */
814656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_snprintf(char *buf, size_t n, const char *format, ...)
815656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
816656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	va_list args;
817656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
818656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
819656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	va_start(args, format);
820656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
821656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = BIO_vsnprintf(buf, n, format, args);
822656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
823656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	va_end(args);
824656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
825656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
826656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
827656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
828656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
829656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	size_t retlen;
830656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int truncated;
831656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
832656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	_dopr(&buf, NULL, &n, &retlen, &truncated, format, args);
833656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
834656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (truncated)
835656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* In case of truncation, return -1 like traditional snprintf.
836656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * (Current drafts for ISO/IEC 9899 say snprintf should return
837656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * the number of characters that would have been written,
838656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * had the buffer been large enough.) */
839656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return -1;
840656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
841656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return (retlen <= INT_MAX) ? (int)retlen : -1;
842656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
843