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