12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1995-1999 Kungliga Tekniska H�gskolan 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * (Royal Institute of Technology, Stockholm, Sweden). 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved. 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met: 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * notice, this list of conditions and the following disclaimer. 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * documentation and/or other materials provided with the distribution. 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. Neither the name of the Institute nor the names of its contributors 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * may be used to endorse or promote products derived from this software 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * without specific prior written permission. 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SUCH DAMAGE. 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3453f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* $Id: snprintf.c,v 1.8 2003-11-16 09:36:51 guy Exp $ */ 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <config.h> 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/missing/snprintf.c,v 1.8 2003-11-16 09:36:51 guy Exp $"; 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdarg.h> 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h> 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <ctype.h> 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <sys/types.h> 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <interface.h> 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectenum format_flags { 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project minus_flag = 1, 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project plus_flag = 2, 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project space_flag = 4, 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project alternate_flag = 8, 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project zero_flag = 16 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Common state 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct state { 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char *str; 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char *s; 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char *theend; 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project size_t sz; 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project size_t max_sz; 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int (*append_char)(struct state *, unsigned char); 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int (*reserve)(struct state *, size_t); 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* XXX - methods */ 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_VSNPRINTF 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsn_reserve (struct state *state, size_t n) 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return state->s + n > state->theend; 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsn_append_char (struct state *state, unsigned char c) 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (sn_reserve (state, 1)) { 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *state->s++ = c; 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectas_reserve (struct state *state, size_t n) 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (state->s + n > state->theend) { 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int off = state->s - state->str; 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char *tmp; 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (state->max_sz && state->sz >= state->max_sz) 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->sz = max(state->sz * 2, state->sz + n); 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (state->max_sz) 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->sz = min(state->sz, state->max_sz); 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tmp = realloc (state->str, state->sz); 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tmp == NULL) 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->str = tmp; 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->s = state->str + off; 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->theend = state->str + state->sz - 1; 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectas_append_char (struct state *state, unsigned char c) 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(as_reserve (state, 1)) 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else { 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *state->s++ = c; 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectappend_number(struct state *state, 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned long num, unsigned base, char *rep, 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int width, int prec, int flags, int minusp) 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int len = 0; 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int i; 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* given precision, ignore zero flag */ 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(prec != -1) 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags &= ~zero_flag; 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prec = 1; 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* zero value with zero precision -> "" */ 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(prec == 0 && num == 0) 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project do{ 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, rep[num % base])) 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len++; 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project num /= base; 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }while(num); 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prec -= len; 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* pad with prec zeros */ 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(prec-- > 0){ 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, '0')) 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len++; 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* add length of alternate prefix (added later) to len */ 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(flags & alternate_flag && (base == 16 || base == 8)) 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len += base / 8; 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* pad with zeros */ 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(flags & zero_flag){ 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width -= len; 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(minusp || (flags & space_flag) || (flags & plus_flag)) 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width--; 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(width-- > 0){ 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, '0')) 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len++; 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* add alternate prefix */ 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(flags & alternate_flag && (base == 16 || base == 8)){ 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(base == 16) 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, rep[10] + 23)) /* XXX */ 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, '0')) 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* add sign */ 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(minusp){ 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, '-')) 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len++; 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if(flags & plus_flag) { 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, '+')) 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len++; 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if(flags & space_flag) { 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, ' ')) 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len++; 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(flags & minus_flag) 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* swap before padding with spaces */ 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for(i = 0; i < len / 2; i++){ 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char c = state->s[-i-1]; 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->s[-i-1] = state->s[-len+i]; 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->s[-len+i] = c; 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width -= len; 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(width-- > 0){ 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char)(state, ' ')) 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len++; 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(!(flags & minus_flag)) 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* swap after padding with spaces */ 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for(i = 0; i < len / 2; i++){ 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char c = state->s[-i-1]; 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->s[-i-1] = state->s[-len+i]; 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state->s[-len+i] = c; 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectappend_string (struct state *state, 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char *arg, 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int width, 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int prec, 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int flags) 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(prec != -1) 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width -= prec; 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width -= strlen((char *)arg); 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(!(flags & minus_flag)) 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(width-- > 0) 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char) (state, ' ')) 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (prec != -1) { 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (*arg && prec--) 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((*state->append_char) (state, *arg++)) 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (*arg) 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((*state->append_char) (state, *arg++)) 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(flags & minus_flag) 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(width-- > 0) 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char) (state, ' ')) 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectappend_char(struct state *state, 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char arg, 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int width, 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int flags) 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(!(flags & minus_flag) && --width > 0) 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char) (state, ' ')) 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char) (state, arg)) 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while((flags & minus_flag) && --width > 0) 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((*state->append_char) (state, ' ')) 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 1; 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This can't be made into a function... 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define PARSE_INT_FORMAT(res, arg, unsig) \ 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectif (long_flag) \ 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project res = (unsig long)va_arg(arg, unsig long); \ 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectelse if (short_flag) \ 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project res = (unsig short)va_arg(arg, unsig int); \ 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectelse \ 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project res = (unsig int)va_arg(arg, unsig int) 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * zyxprintf - return 0 or -1 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectxyzprintf (struct state *state, const char *char_format, va_list ap) 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const unsigned char *format = (const unsigned char *)char_format; 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char c; 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while((c = *format++)) { 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (c == '%') { 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int flags = 0; 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int width = 0; 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int prec = -1; 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int long_flag = 0; 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int short_flag = 0; 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* flags */ 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while((c = *format++)){ 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(c == '-') 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags |= minus_flag; 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if(c == '+') 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags |= plus_flag; 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if(c == ' ') 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags |= space_flag; 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if(c == '#') 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags |= alternate_flag; 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if(c == '0') 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags |= zero_flag; 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((flags & space_flag) && (flags & plus_flag)) 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags ^= space_flag; 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if((flags & minus_flag) && (flags & zero_flag)) 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags ^= zero_flag; 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* width */ 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (isdigit(c)) 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project do { 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width = width * 10 + c - '0'; 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *format++; 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } while(isdigit(c)); 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if(c == '*') { 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width = va_arg(ap, int); 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *format++; 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* precision */ 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (c == '.') { 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prec = 0; 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *format++; 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (isdigit(c)) 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project do { 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prec = prec * 10 + c - '0'; 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *format++; 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } while(isdigit(c)); 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else if (c == '*') { 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prec = va_arg(ap, int); 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *format++; 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* size */ 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (c == 'h') { 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project short_flag = 1; 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *format++; 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (c == 'l') { 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project long_flag = 1; 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project c = *format++; 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (c) { 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'c' : 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if(append_char(state, va_arg(ap, int), width, flags)) 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 's' : 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (append_string(state, 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_arg(ap, unsigned char*), 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width, 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prec, 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags)) 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'd' : 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'i' : { 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project long arg; 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned long num; 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int minusp = 0; 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PARSE_INT_FORMAT(arg, ap, signed); 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (arg < 0) { 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project minusp = 1; 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project num = -arg; 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project num = arg; 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (append_number (state, num, 10, "0123456789", 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width, prec, flags, minusp)) 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'u' : { 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned long arg; 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PARSE_INT_FORMAT(arg, ap, unsigned); 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (append_number (state, arg, 10, "0123456789", 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width, prec, flags, 0)) 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'o' : { 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned long arg; 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PARSE_INT_FORMAT(arg, ap, unsigned); 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (append_number (state, arg, 010, "01234567", 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width, prec, flags, 0)) 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'x' : { 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned long arg; 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PARSE_INT_FORMAT(arg, ap, unsigned); 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (append_number (state, arg, 0x10, "0123456789abcdef", 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width, prec, flags, 0)) 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'X' :{ 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned long arg; 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PARSE_INT_FORMAT(arg, ap, unsigned); 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (append_number (state, arg, 0x10, "0123456789ABCDEF", 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width, prec, flags, 0)) 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'p' : { 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned long arg = (unsigned long)va_arg(ap, void*); 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (append_number (state, arg, 0x10, "0123456789ABCDEF", 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project width, prec, flags, 0)) 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 'n' : { 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int *arg = va_arg(ap, int*); 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *arg = state->s - state->str; 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case '\0' : 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project --format; 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* FALLTHROUGH */ 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case '%' : 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((*state->append_char)(state, c)) 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default : 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ( (*state->append_char)(state, '%') 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project || (*state->append_char)(state, c)) 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((*state->append_char) (state, c)) 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return 0; 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_SNPRINTF 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsnprintf (char *str, size_t sz, const char *format, ...) 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_list args; 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int ret; 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_start(args, format); 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret = vsnprintf (str, sz, format, args); 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef PARANOIA 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int ret2; 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *tmp; 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tmp = malloc (sz); 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tmp == NULL) 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project abort (); 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret2 = vsprintf (tmp, format, args); 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ret != ret2 || strcmp(str, tmp)) 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project abort (); 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project free (tmp); 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_end(args); 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return ret; 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_ASPRINTF 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectasprintf (char **ret, const char *format, ...) 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_list args; 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int val; 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_start(args, format); 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project val = vasprintf (ret, format, args); 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef PARANOIA 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int ret2; 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *tmp; 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tmp = malloc (val + 1); 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tmp == NULL) 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project abort (); 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret2 = vsprintf (tmp, format, args); 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (val != ret2 || strcmp(*ret, tmp)) 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project abort (); 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project free (tmp); 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_end(args); 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return val; 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_ASNPRINTF 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectasnprintf (char **ret, size_t max_sz, const char *format, ...) 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_list args; 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int val; 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_start(args, format); 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project val = vasnprintf (ret, max_sz, format, args); 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef PARANOIA 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int ret2; 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *tmp; 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tmp = malloc (val + 1); 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tmp == NULL) 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project abort (); 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret2 = vsprintf (tmp, format, args); 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (val != ret2 || strcmp(*ret, tmp)) 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project abort (); 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project free (tmp); 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project va_end(args); 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return val; 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_VASPRINTF 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvasprintf (char **ret, const char *format, va_list args) 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return vasnprintf (ret, 0, format, args); 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_VASNPRINTF 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvasnprintf (char **ret, size_t max_sz, const char *format, va_list args) 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int st; 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project size_t len; 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct state state; 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.max_sz = max_sz; 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.sz = 1; 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.str = malloc(state.sz); 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (state.str == NULL) { 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *ret = NULL; 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.s = state.str; 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.theend = state.s + state.sz - 1; 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.append_char = as_append_char; 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.reserve = as_reserve; 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project st = xyzprintf (&state, format, args); 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (st) { 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project free (state.str); 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *ret = NULL; 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char *tmp; 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *state.s = '\0'; 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project len = state.s - state.str; 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tmp = realloc (state.str, len+1); 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (tmp == NULL) { 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project free (state.str); 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *ret = NULL; 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return -1; 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *ret = tmp; 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return len; 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_VSNPRINTF 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvsnprintf (char *str, size_t sz, const char *format, va_list args) 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct state state; 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int ret; 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned char *ustr = (unsigned char *)str; 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.max_sz = 0; 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.sz = sz; 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.str = ustr; 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.s = ustr; 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.theend = ustr + sz - 1; 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.append_char = sn_append_char; 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project state.reserve = sn_reserve; 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ret = xyzprintf (&state, format, args); 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *state.s = '\0'; 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ret) 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return sz; 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return state.s - state.str; 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 633