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