/* pformat.c
 *
 * $Id: pformat.c,v 1.9 2011/01/07 22:57:00 keithmarshall Exp $
 *
 * Provides a core implementation of the formatting capabilities
 * common to the entire `printf()' family of functions; it conforms
 * generally to C99 and SUSv3/POSIX specifications, with extensions
 * to support Microsoft's non-standard format specifications.
 *
 * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
 *
 * This is free software.  You may redistribute and/or modify it as you
 * see fit, without restriction of copyright.
 *
 * This software is provided "as is", in the hope that it may be useful,
 * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
 * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE.  At no
 * time will the author accept any form of liability for any damages,
 * however caused, resulting from the use of this software.
 *
 * The elements of this implementation which deal with the formatting
 * of floating point numbers, (i.e. the `%e', `%E', `%f', `%F', `%g'
 * and `%G' format specifiers, but excluding the hexadecimal floating
 * point `%a' and `%A' specifiers), make use of the `__gdtoa' function
 * written by David M. Gay, and are modelled on his sample code, which
 * has been deployed under its accompanying terms of use:--
 *
 ******************************************************************
 * Copyright (C) 1997, 1999, 2001 Lucent Technologies
 * All Rights Reserved
 *
 * Permission to use, copy, modify, and distribute this software and
 * its documentation for any purpose and without fee is hereby
 * granted, provided that the above copyright notice appear in all
 * copies and that both that the copyright notice and this
 * permission notice and warranty disclaimer appear in supporting
 * documentation, and that the name of Lucent or any of its entities
 * not be used in advertising or publicity pertaining to
 * distribution of the software without specific, written prior
 * permission.
 *
 * LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
 * IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 * THIS SOFTWARE.
 ******************************************************************
 *
 */

#define __LARGE_MBSTATE_T

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <locale.h>
#include <wchar.h>

#ifdef __ENABLE_DFP
#ifndef __STDC_WANT_DEC_FP__
#define __STDC_WANT_DEC_FP__ 1
#endif

#include "../math/DFP/dfp_internal.h"
#endif /* __ENABLE_DFP */

#include <math.h>

/* FIXME: The following belongs in values.h, but current MinGW
 * has nothing useful there!  OTOH, values.h is not a standard
 * header, and its use may be considered obsolete; perhaps it
 * is better to just keep these definitions here.
 */

#include <pshpack1.h>
/* workaround gcc bug */
#if defined(__GNUC__) && !defined(__clang__)
#define ATTRIB_GCC_STRUCT __attribute__((gcc_struct))
#else
#define ATTRIB_GCC_STRUCT
#endif
typedef struct ATTRIB_GCC_STRUCT __tI128 {
  int64_t digits[2];
} __tI128;

typedef struct ATTRIB_GCC_STRUCT __tI128_2 {
  uint32_t digits32[4];
} __tI128_2;

typedef union ATTRIB_GCC_STRUCT __uI128 {
  __tI128 t128;
  __tI128_2 t128_2;
} __uI128;
#include <poppack.h>

#ifndef _VALUES_H
/*
 * values.h
 *
 */
#define _VALUES_H

#include <limits.h>

#define _TYPEBITS(type)     (sizeof(type) * CHAR_BIT)

#if defined(__ENABLE_PRINTF128) || defined(__ENABLE_DFP)
#define LLONGBITS           _TYPEBITS(__tI128)
#else
#define LLONGBITS           _TYPEBITS(long long)
#endif

#endif /* !defined _VALUES_H -- end of file */

#include "mingw_pformat.h"

/* Bit-map constants, defining the internal format control
 * states, which propagate through the flags.
 */
#define PFORMAT_GROUPED     0x00001000
#define PFORMAT_HASHED      0x00000800
#define PFORMAT_LJUSTIFY    0x00000400
#define PFORMAT_ZEROFILL    0x00000200

#define PFORMAT_JUSTIFY    (PFORMAT_LJUSTIFY | PFORMAT_ZEROFILL)
#define PFORMAT_IGNORE      -1

#define PFORMAT_SIGNED      0x000001C0
#define PFORMAT_POSITIVE    0x00000100
#define PFORMAT_NEGATIVE    0x00000080
#define PFORMAT_ADDSPACE    0x00000040

#define PFORMAT_XCASE       0x00000020

#define PFORMAT_LDOUBLE     0x00000004

#ifdef __ENABLE_DFP
#define PFORMAT_DECIM32     0x00020000
#define PFORMAT_DECIM64     0x00040000
#define PFORMAT_DECIM128    0x00080000
#endif

/* `%o' format digit extraction mask, and shift count...
 * (These are constant, and do not propagate through the flags).
 */
#define PFORMAT_OMASK       0x00000007
#define PFORMAT_OSHIFT      0x00000003

/* `%x' and `%X' format digit extraction mask, and shift count...
 * (These are constant, and do not propagate through the flags).
 */
#define PFORMAT_XMASK       0x0000000F
#define PFORMAT_XSHIFT      0x00000004

/* The radix point character, used in floating point formats, is
 * localised on the basis of the active LC_NUMERIC locale category.
 * It is stored locally, as a `wchar_t' entity, which is converted
 * to a (possibly multibyte) character on output.  Initialisation
 * of the stored `wchar_t' entity, together with a record of its
 * effective multibyte character length, is required each time
 * `__pformat()' is entered, (static storage would not be thread
 * safe), but this initialisation is deferred until it is actually
 * needed; on entry, the effective character length is first set to
 * the following value, (and the `wchar_t' entity is zeroed), to
 * indicate that a call of `localeconv()' is needed, to complete
 * the initialisation.
 */
#define PFORMAT_RPINIT      -3

/* The floating point format handlers return the following value
 * for the radix point position index, when the argument value is
 * infinite, or not a number.
 */
#define PFORMAT_INFNAN      -32768

typedef union
{
  /* A data type agnostic representation,
   * for printf arguments of any integral data type...
   */
  signed long             __pformat_long_t;
  signed long long        __pformat_llong_t;
  unsigned long           __pformat_ulong_t;
  unsigned long long      __pformat_ullong_t;
  unsigned short          __pformat_ushort_t;
  unsigned char           __pformat_uchar_t;
  signed short            __pformat_short_t;
  signed char             __pformat_char_t;
  void *                  __pformat_ptr_t;
  __uI128                 __pformat_u128_t;
} __pformat_intarg_t;

typedef enum
{
  /* Format interpreter state indices...
   * (used to identify the active phase of format string parsing).
   */
  PFORMAT_INIT = 0,
  PFORMAT_SET_WIDTH,
  PFORMAT_GET_PRECISION,
  PFORMAT_SET_PRECISION,
  PFORMAT_END
} __pformat_state_t;

typedef enum
{
  /* Argument length classification indices...
   * (used for arguments representing integer data types).
   */
  PFORMAT_LENGTH_INT = 0,
  PFORMAT_LENGTH_SHORT,
  PFORMAT_LENGTH_LONG,
  PFORMAT_LENGTH_LLONG,
  PFORMAT_LENGTH_LLONG128,
  PFORMAT_LENGTH_CHAR
} __pformat_length_t;
/*
 * And a macro to map any arbitrary data type to an appropriate
 * matching index, selected from those above; the compiler should
 * collapse this to a simple assignment.
 */

#ifdef __GNUC__
/* provides for some deadcode elimination via compile time eval */
#define __pformat_arg_length(x) \
__builtin_choose_expr (                                         \
  __builtin_types_compatible_p (typeof (x), __tI128),           \
   PFORMAT_LENGTH_LLONG128,                                     \
    __builtin_choose_expr (                                     \
      __builtin_types_compatible_p (typeof (x), long long),     \
        PFORMAT_LENGTH_LLONG,                                   \
    __builtin_choose_expr (                                     \
      __builtin_types_compatible_p (typeof (x), long),          \
        PFORMAT_LENGTH_LONG,                                    \
    __builtin_choose_expr (                                     \
      __builtin_types_compatible_p (typeof (x), short),         \
        PFORMAT_LENGTH_SHORT,                                   \
    __builtin_choose_expr (                                     \
      __builtin_types_compatible_p (typeof (x), char),          \
        PFORMAT_LENGTH_CHAR,                                    \
    __builtin_choose_expr (                                     \
      __builtin_types_compatible_p (typeof (x), __uI128),       \
        PFORMAT_LENGTH_LLONG128,                                \
    __builtin_choose_expr (                                              \
      __builtin_types_compatible_p (typeof (x), unsigned long),          \
        PFORMAT_LENGTH_LONG,                                             \
    __builtin_choose_expr (                                              \
      __builtin_types_compatible_p (typeof (x), unsigned long long),     \
        PFORMAT_LENGTH_LLONG,                                            \
    __builtin_choose_expr (                                              \
      __builtin_types_compatible_p (typeof (x), unsigned short),         \
        PFORMAT_LENGTH_SHORT,                                            \
    __builtin_choose_expr (                                              \
      __builtin_types_compatible_p (typeof (x), unsigned char),          \
        PFORMAT_LENGTH_CHAR,                                             \
  PFORMAT_LENGTH_INT))))))))))

#else
#define __pformat_arg_length( type )    \
  sizeof( type ) == sizeof( __tI128 )   ? PFORMAT_LENGTH_LLONG128 : \
  sizeof( type ) == sizeof( long long ) ? PFORMAT_LENGTH_LLONG : \
  sizeof( type ) == sizeof( long )      ? PFORMAT_LENGTH_LONG  : \
  sizeof( type ) == sizeof( short )     ? PFORMAT_LENGTH_SHORT : \
  sizeof( type ) == sizeof( char )      ? PFORMAT_LENGTH_CHAR  : \
  /* should never need this default */    PFORMAT_LENGTH_INT
#endif

typedef struct
{
  /* Formatting and output control data...
   * An instance of this control block is created, (on the stack),
   * for each call to `__pformat()', and is passed by reference to
   * each of the output handlers, as required.
   */
  void *         dest;
  int            flags;
  int            width;
  int            precision;
  int            rplen;
  wchar_t        rpchr;
  int            thousands_chr_len;
  wchar_t        thousands_chr;
  int            count;
  int            quota;
  int            expmin;
} __pformat_t;

#if defined(__ENABLE_PRINTF128) || defined(__ENABLE_DFP)
/* trim leading, leave at least n characters */
static char * __bigint_trim_leading_zeroes(char *in, int n){
  char *src = in;
  int len = strlen(in);
  while( len > n && *++src == '0') len--;

  /* we want to null terminator too */
  memmove(in, src, strlen(src) + 1);
  return in;
}

/* LSB first */
static
void __bigint_to_string(const uint32_t *digits, const uint32_t digitlen, char *buff, const uint32_t bufflen){
  int64_t digitsize = sizeof(*digits) * 8;
  int64_t shiftpos = digitlen * digitsize - 1;
  memset(buff, 0, bufflen);

  while(shiftpos >= 0) {
    /* increment */
    for(uint32_t i = 0; i < bufflen - 1; i++){
      buff[i] += (buff[i] > 4) ? 3 : 0;
    }

    /* shift left */
    for(uint32_t i = 0; i < bufflen - 1; i++)
      buff[i] <<= 1;

    /* shift in */
    buff[bufflen - 2] |= digits[shiftpos / digitsize] & (0x1 << (shiftpos % digitsize)) ? 1 : 0;

    /* overflow check */
    for(uint32_t i = bufflen - 1; i > 0; i--){
      buff[i - 1] |= (buff[i] > 0xf);
      buff[i] &= 0x0f;
    }
    shiftpos--;
  }

  for(uint32_t i = 0; i < bufflen - 1; i++){
    buff[i] += '0';
  }
  buff[bufflen - 1] = '\0';
}

#if defined(__ENABLE_PRINTF128)
/* LSB first, hex version */
static
void __bigint_to_stringx(const uint32_t *digits, const uint32_t digitlen, char *buff, const uint32_t bufflen, int upper){
  int32_t stride = sizeof(*digits) * 2;
  uint32_t lastpos = 0;

  for(uint32_t i = 0; i < digitlen * stride; i++){
    int32_t buffpos = bufflen - i - 2;
    buff[buffpos] = (digits[ i / stride ] & (0xf << 4 * (i % stride))) >> ( 4 * (i % stride));
    buff[buffpos] += (buff[buffpos] > 9) ? ((upper) ? 0x7 : 0x27) : 0;
    buff[buffpos] += '0';
    lastpos = buffpos;
    if(buffpos == 0) break; /* sanity check */
  }
  memset(buff, '0', lastpos);
  buff[bufflen - 1] = '\0';
}

/* LSB first, octet version */
static
void __bigint_to_stringo(const uint32_t *digits, const uint32_t digitlen, char *buff, const uint32_t bufflen){
  const uint32_t digitsize = sizeof(*digits) * 8;
  const uint64_t bits = digitsize * digitlen;
  uint32_t pos = bufflen - 2;
  uint32_t reg = 0;
  for(uint32_t i = 0; i <= bits; i++){
    reg |= (digits[ i / digitsize] & (0x1 << (i % digitsize))) ? 1 << (i % 3) : 0;
    if( (i && ( i + 1) % 3 == 0) || (i + 1) == bits){ /* make sure all is committed after last bit */
      buff[pos] = '0' + reg;
      reg = 0;
      if(!pos) break; /* sanity check */
      pos--;
    }
  }
  if(pos < bufflen - 1)
    memset(buff,'0', pos + 1);
  buff[bufflen - 1] = '\0';
}
#endif /* defined(__ENABLE_PRINTF128) */
#endif /* defined(__ENABLE_PRINTF128) || defined(__ENABLE_DFP) */

static
void __pformat_putc( int c, __pformat_t *stream )
{
  /* Place a single character into the `__pformat()' output queue,
   * provided any specified output quota has not been exceeded.
   */
  if( (stream->flags & PFORMAT_NOLIMIT) || (stream->quota > stream->count) )
  {
    /* Either there was no quota specified,
     * or the active quota has not yet been reached.
     */
    if( stream->flags & PFORMAT_TO_FILE )
      /*
       * This is single character output to a FILE stream...
       */
      __fputc(c, (FILE *)(stream->dest));

    else
      /* Whereas, this is to an internal memory buffer...
       */
      ((APICHAR *)(stream->dest))[stream->count] = c;
  }
  ++stream->count;
}

static
void __pformat_putchars( const char *s, int count, __pformat_t *stream )
{
#ifndef __BUILD_WIDEAPI
  /* Handler for `%c' and (indirectly) `%s' conversion specifications.
   *
   * Transfer characters from the string buffer at `s', character by
   * character, up to the number of characters specified by `count', or
   * if `precision' has been explicitly set to a value less than `count',
   * stopping after the number of characters specified for `precision',
   * to the `__pformat()' output stream.
   *
   * Characters to be emitted are passed through `__pformat_putc()', to
   * ensure that any specified output quota is honoured.
   */
  if( (stream->precision >= 0) && (count > stream->precision) )
    /*
     * Ensure that the maximum number of characters transferred doesn't
     * exceed any explicitly set `precision' specification.
     */
    count = stream->precision;

  /* Establish the width of any field padding required...
   */
  if( stream->width > count )
    /*
     * as the number of spaces equivalent to the number of characters
     * by which those to be emitted is fewer than the field width...
     */
    stream->width -= count;

  else
    /* ignoring any width specification which is insufficient.
     */
    stream->width = PFORMAT_IGNORE;

  if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
    /*
     * When not doing flush left justification, (i.e. the `-' flag
     * is not set), any residual unreserved field width must appear
     * as blank padding, to the left of the output string.
     */
    while( stream->width-- )
      __pformat_putc( '\x20', stream );

  /* Emit the data...
   */
  while( count-- )
    /*
     * copying the requisite number of characters from the input.
     */
    __pformat_putc( *s++, stream );

  /* If we still haven't consumed the entire specified field width,
   * we must be doing flush left justification; any residual width
   * must be filled with blanks, to the right of the output value.
   */
  while( stream->width-- > 0 )
    __pformat_putc( '\x20', stream );

#else  /* __BUILD_WIDEAPI */

  int len;

  if( (stream->precision >= 0) && (count > stream->precision) )
    count = stream->precision;

  if( (stream->flags & PFORMAT_TO_FILE) && (stream->flags & PFORMAT_NOLIMIT) )
  {
    int __cdecl __ms_fwprintf(FILE *, const wchar_t *, ...);

    if( stream->width > count )
    {
      if( (stream->flags & PFORMAT_LJUSTIFY) == 0 )
        len = __ms_fwprintf( (FILE *)(stream->dest), L"%*.*S", stream->width, count, s );
      else
        len = __ms_fwprintf( (FILE *)(stream->dest), L"%-*.*S", stream->width, count, s );
    }
    else
    {
      len = __ms_fwprintf( (FILE *)(stream->dest), L"%.*S", count, s );
    }
    if( len > 0 )
      stream->count += len;
    stream->width = PFORMAT_IGNORE;
    return;
  }

  if( stream->width > count )
    stream->width -= count;
  else
    stream->width = PFORMAT_IGNORE;

  if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
    while( stream->width-- )
      __pformat_putc( '\x20', stream );

  {
    /* mbrtowc */
    size_t l;
    wchar_t w[12], *p;
    while( count > 0 )
    {
      mbstate_t ps = {0};
      --count;
      p = &w[0];
      l = mbrtowc (p, s, strlen (s), &ps);
      if (!l)
        break;
      if ((ssize_t)l < 0)
      {
        l = 1;
        w[0] = (wchar_t) *s;
      }
      s += l;
      __pformat_putc((int)w[0], stream);
    }
  }

  while( stream->width-- > 0 )
    __pformat_putc( '\x20', stream );

#endif  /* __BUILD_WIDEAPI */
}

static
void __pformat_puts( const char *s, __pformat_t *stream )
{
  /* Handler for `%s' conversion specifications.
   *
   * Transfer a NUL terminated character string, character by character,
   * stopping when the end of the string is encountered, or if `precision'
   * has been explicitly set, when the specified number of characters has
   * been emitted, if that is less than the length of the input string,
   * to the `__pformat()' output stream.
   *
   * This is implemented as a trivial call to `__pformat_putchars()',
   * passing the length of the input string as the character count,
   * (after first verifying that the input pointer is not NULL).
   */
  if( s == NULL ) s = "(null)";

  if( stream->precision >= 0 )
    __pformat_putchars( s, strnlen( s, stream->precision ), stream );
  else
    __pformat_putchars( s, strlen( s ), stream );
}

static
void __pformat_wputchars( const wchar_t *s, int count, __pformat_t *stream )
{
#ifndef __BUILD_WIDEAPI
  /* Handler for `%C'(`%lc') and `%S'(`%ls') conversion specifications;
   * (this is a wide character variant of `__pformat_putchars()').
   *
   * Each multibyte character sequence to be emitted is passed, byte
   * by byte, through `__pformat_putc()', to ensure that any specified
   * output quota is honoured.
   */
  char buf[16];
  mbstate_t state;
  int len = wcrtomb(buf, L'\0', &state);

  if( (stream->precision >= 0) && (count > stream->precision) )
    /*
     * Ensure that the maximum number of characters transferred doesn't
     * exceed any explicitly set `precision' specification.
     */
    count = stream->precision;

  /* Establish the width of any field padding required...
   */
  if( stream->width > count )
    /*
     * as the number of spaces equivalent to the number of characters
     * by which those to be emitted is fewer than the field width...
     */
    stream->width -= count;

  else
    /* ignoring any width specification which is insufficient.
     */
    stream->width = PFORMAT_IGNORE;

  if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
    /*
     * When not doing flush left justification, (i.e. the `-' flag
     * is not set), any residual unreserved field width must appear
     * as blank padding, to the left of the output string.
     */
    while( stream->width-- )
      __pformat_putc( '\x20', stream );

  /* Emit the data, converting each character from the wide
   * to the multibyte domain as we go...
   */
  while( (count-- > 0) && ((len = wcrtomb( buf, *s++, &state )) > 0) )
  {
    char *p = buf;
    while( len-- > 0 )
      __pformat_putc( *p++, stream );
  }

  /* If we still haven't consumed the entire specified field width,
   * we must be doing flush left justification; any residual width
   * must be filled with blanks, to the right of the output value.
   */
  while( stream->width-- > 0 )
    __pformat_putc( '\x20', stream );

#else  /* __BUILD_WIDEAPI */

  int len;

  if( (stream->precision >= 0) && (count > stream->precision) )
    count = stream->precision;

  if( (stream->flags & PFORMAT_TO_FILE) && (stream->flags & PFORMAT_NOLIMIT) )
  {
    int __cdecl __ms_fwprintf(FILE *, const wchar_t *, ...);

    if( stream->width > count )
    {
      if( (stream->flags & PFORMAT_LJUSTIFY) == 0 )
        len = __ms_fwprintf( (FILE *)(stream->dest), L"%*.*s", stream->width, count, s );
      else
        len = __ms_fwprintf( (FILE *)(stream->dest), L"%-*.*s", stream->width, count, s );
    }
    else
    {
      len = __ms_fwprintf( (FILE *)(stream->dest), L"%.*s", count, s );
    }
    if( len > 0 )
      stream->count += len;
    stream->width = PFORMAT_IGNORE;
    return;
  }

  if( stream->width > count )
    stream->width -= count;
  else
    stream->width = PFORMAT_IGNORE;

  if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
    while( stream->width-- )
      __pformat_putc( '\x20', stream );

  len = count;
  while(len-- > 0 && *s != 0)
  {
      __pformat_putc(*s++, stream);
  }

  while( stream->width-- > 0 )
    __pformat_putc( '\x20', stream );

#endif  /* __BUILD_WIDEAPI */
}

static
void __pformat_wcputs( const wchar_t *s, __pformat_t *stream )
{
  /* Handler for `%S' (`%ls') conversion specifications.
   *
   * Transfer a NUL terminated wide character string, character by
   * character, converting to its equivalent multibyte representation
   * on output, and stopping when the end of the string is encountered,
   * or if `precision' has been explicitly set, when the specified number
   * of characters has been emitted, if that is less than the length of
   * the input string, to the `__pformat()' output stream.
   *
   * This is implemented as a trivial call to `__pformat_wputchars()',
   * passing the length of the input string as the character count,
   * (after first verifying that the input pointer is not NULL).
   */
  if( s == NULL ) s = L"(null)";

  if( stream->precision >= 0 )
    __pformat_wputchars( s, wcsnlen( s, stream->precision ), stream );
  else
    __pformat_wputchars( s, wcslen( s ), stream );
}

static
int __pformat_int_bufsiz( int bias, int size, __pformat_t *stream )
{
  /* Helper to establish the size of the internal buffer, which
   * is required to queue the ASCII decomposition of an integral
   * data value, prior to transfer to the output stream.
   */
  size = ((size - 1 + LLONGBITS) / size) + bias;
  size += (stream->precision > 0) ? stream->precision : 0;
  if ((stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0)
    size += (size / 3);
  return (size > stream->width) ? size : stream->width;
}

static
void __pformat_int( __pformat_intarg_t value, __pformat_t *stream )
{
  /* Handler for `%d', `%i' and `%u' conversion specifications.
   *
   * Transfer the ASCII representation of an integer value parameter,
   * formatted as a decimal number, to the `__pformat()' output queue;
   * output will be truncated, if any specified quota is exceeded.
   */
  int32_t bufflen = __pformat_int_bufsiz(1, PFORMAT_OSHIFT, stream);
#ifdef __ENABLE_PRINTF128
  char *tmp_buff = NULL;
#endif
  char *buf = NULL;
  char *p;
  int precision;

  buf = alloca(bufflen);
  p = buf;
  if( stream->flags & PFORMAT_NEGATIVE )
#ifdef __ENABLE_PRINTF128
  {
    /* The input value might be negative, (i.e. it is a signed value)...
     */
    if( value.__pformat_u128_t.t128.digits[1] < 0) {
      /*
       * It IS negative, but we want to encode it as unsigned,
       * displayed with a leading minus sign, so convert it...
       */
      /* two's complement */
      value.__pformat_u128_t.t128.digits[0] = ~value.__pformat_u128_t.t128.digits[0];
      value.__pformat_u128_t.t128.digits[1] = ~value.__pformat_u128_t.t128.digits[1];
      value.__pformat_u128_t.t128.digits[0] += 1;
      value.__pformat_u128_t.t128.digits[1] += (!value.__pformat_u128_t.t128.digits[0]) ? 1 : 0;
    } else
      /* It is unequivocally a POSITIVE value, so turn off the
       * request to prefix it with a minus sign...
       */
      stream->flags &= ~PFORMAT_NEGATIVE;
  }

  tmp_buff = alloca(bufflen);
  /* Encode the input value for display...
   */
  __bigint_to_string(value.__pformat_u128_t.t128_2.digits32,
    4, tmp_buff, bufflen);
  __bigint_trim_leading_zeroes(tmp_buff,1);

  memset(p,0,bufflen);
  for(int32_t i = strlen(tmp_buff) - 1; i >= 0; i--){
  if ( i && (stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0
        && (i % 4) == 3)
      {
        *p++ = ',';
      }
      *p++ = tmp_buff[i];
    if( i > bufflen - 1) break; /* sanity chec */
    if(  tmp_buff[i] == '\0' ) break; /* end */
  }
#else
  {
    /* The input value might be negative, (i.e. it is a signed value)...
     */
    if( value.__pformat_llong_t < 0LL )
      /*
       * It IS negative, but we want to encode it as unsigned,
       * displayed with a leading minus sign, so convert it...
       */
      value.__pformat_llong_t = -value.__pformat_llong_t;

    else
      /* It is unequivocally a POSITIVE value, so turn off the
       * request to prefix it with a minus sign...
       */
      stream->flags &= ~PFORMAT_NEGATIVE;
  }
while( value.__pformat_ullong_t )
  {
    /* decomposing it into its constituent decimal digits,
     * in order from least significant to most significant, using
     * the local buffer as a LIFO queue in which to store them.
     */
    if (p != buf && (stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0
        && ((p - buf) % 4) == 3)
      {
        *p++ = ',';
      }
    *p++ = '0' + (unsigned char)(value.__pformat_ullong_t % 10LL);
    value.__pformat_ullong_t /= 10LL;
  }
#endif

  if(  (stream->precision > 0)
  &&  ((precision = stream->precision - (p - buf)) > 0)  )
    /*
     * We have not yet queued sufficient digits to fill the field width
     * specified for minimum `precision'; pad with zeros to achieve this.
     */
    while( precision-- > 0 )
      *p++ = '0';

  if( (p == buf) && (stream->precision != 0) )
    /*
     * Input value was zero; make sure we print at least one digit,
     * unless the precision is also explicitly zero.
     */
    *p++ = '0';

  if( (stream->width > 0) && ((stream->width -= p - buf) > 0) )
  {
    /* We have now queued sufficient characters to display the input value,
     * at the desired precision, but this will not fill the output field...
     */
    if( stream->flags & PFORMAT_SIGNED )
      /*
       * We will fill one additional space with a sign...
       */
      stream->width--;

    if(  (stream->precision < 0)
    &&  ((stream->flags & PFORMAT_JUSTIFY) == PFORMAT_ZEROFILL)  )
      /*
       * and the `0' flag is in effect, so we pad the remaining spaces,
       * to the left of the displayed value, with zeros.
       */
      while( stream->width-- > 0 )
        *p++ = '0';

    else if( (stream->flags & PFORMAT_LJUSTIFY) == 0 )
      /*
       * the `0' flag is not in effect, and neither is the `-' flag,
       * so we pad to the left of the displayed value with spaces, so that
       * the value appears right justified within the output field.
       */
      while( stream->width-- > 0 )
        __pformat_putc( '\x20', stream );
  }

  if( stream->flags & PFORMAT_NEGATIVE )
    /*
     * A negative value needs a sign...
     */
    *p++ = '-';

  else if( stream->flags & PFORMAT_POSITIVE )
    /*
     * A positive value may have an optionally displayed sign...
     */
    *p++ = '+';

  else if( stream->flags & PFORMAT_ADDSPACE )
    /*
     * Space was reserved for displaying a sign, but none was emitted...
     */
    *p++ = '\x20';

  while( p > buf )
    /*
     * Emit the accumulated constituent digits,
     * in order from most significant to least significant...
     */
    __pformat_putc( *--p, stream );

  while( stream->width-- > 0 )
    /*
     * The specified output field has not yet been completely filled;
     * the `-' flag must be in effect, resulting in a displayed value which
     * appears left justified within the output field; we must pad the field
     * to the right of the displayed value, by emitting additional spaces,
     * until we reach the rightmost field boundary.
     */
    __pformat_putc( '\x20', stream );
}

static
void __pformat_xint( int fmt, __pformat_intarg_t value, __pformat_t *stream )
{
  /* Handler for `%o', `%p', `%x' and `%X' conversions.
   *
   * These can be implemented using a simple `mask and shift' strategy;
   * set up the mask and shift values appropriate to the conversion format,
   * and allocate a suitably sized local buffer, in which to queue encoded
   * digits of the formatted value, in preparation for output.
   */
  int width;
  int shift = (fmt == 'o') ? PFORMAT_OSHIFT : PFORMAT_XSHIFT;
  int bufflen = __pformat_int_bufsiz(2, shift, stream);
  char *buf = NULL;
#ifdef __ENABLE_PRINTF128
  char *tmp_buf = NULL;
#endif
  char *p;
  buf = alloca(bufflen);
  p = buf;
#ifdef __ENABLE_PRINTF128
  tmp_buf = alloca(bufflen);
  if(fmt == 'o'){
    __bigint_to_stringo(value.__pformat_u128_t.t128_2.digits32,4,tmp_buf,bufflen);
  } else {
    __bigint_to_stringx(value.__pformat_u128_t.t128_2.digits32,4,tmp_buf,bufflen, !(fmt & PFORMAT_XCASE));
  }
  __bigint_trim_leading_zeroes(tmp_buf,0);

  memset(buf,0,bufflen);
  for(int32_t i = strlen(tmp_buf); i >= 0; i--)
    *p++ = tmp_buf[i];
#else
  int mask = (fmt == 'o') ? PFORMAT_OMASK : PFORMAT_XMASK;
  while( value.__pformat_ullong_t )
  {
    /* Encode the specified non-zero input value as a sequence of digits,
     * in the appropriate `base' encoding and in reverse digit order, each
     * encoded in its printable ASCII form, with no leading zeros, using
     * the local buffer as a LIFO queue in which to store them.
     */
    char *q;
    if( (*(q = p++) = '0' + (value.__pformat_ullong_t & mask)) > '9' )
      *q = (*q + 'A' - '9' - 1) | (fmt & PFORMAT_XCASE);
    value.__pformat_ullong_t >>= shift;
  }
#endif

  if( p == buf )
    /*
     * Nothing was queued; input value must be zero, which should never be
     * emitted in the `alternative' PFORMAT_HASHED style.
     */
    stream->flags &= ~PFORMAT_HASHED;

  if( ((width = stream->precision) > 0) && ((width -= p - buf) > 0) )
    /*
     * We have not yet queued sufficient digits to fill the field width
     * specified for minimum `precision'; pad with zeros to achieve this.
     */
    while( width-- > 0 )
      *p++ = '0';

  else if( (fmt == 'o') && (stream->flags & PFORMAT_HASHED) )
    /*
     * The field width specified for minimum `precision' has already
     * been filled, but the `alternative' PFORMAT_HASHED style for octal
     * output requires at least one initial zero; that will not have
     * been queued, so add it now.
     */
    *p++ = '0';

  if( (p == buf) && (stream->precision != 0) )
    /*
     * Still nothing queued for output, but the `precision' has not been
     * explicitly specified as zero, (which is necessary if no output for
     * an input value of zero is desired); queue exactly one zero digit.
     */
    *p++ = '0';

  if( stream->width > (width = p - buf) )
    /*
     * Specified field width exceeds the minimum required...
     * Adjust so that we retain only the additional padding width.
     */
    stream->width -= width;

  else
    /* Ignore any width specification which is insufficient.
     */
    stream->width = PFORMAT_IGNORE;

  if( ((width = stream->width) > 0)
  &&  (fmt != 'o') && (stream->flags & PFORMAT_HASHED)  )
    /*
     * For `%#x' or `%#X' formats, (which have the `#' flag set),
     * further reduce the padding width to accommodate the radix
     * indicating prefix.
     */
    width -= 2;

  if(  (width > 0) && (stream->precision < 0)
  &&  ((stream->flags & PFORMAT_JUSTIFY) == PFORMAT_ZEROFILL)  )
    /*
     * When the `0' flag is set, and not overridden by the `-' flag,
     * or by a specified precision, add sufficient leading zeros to
     * consume the remaining field width.
     */
    while( width-- > 0 )
      *p++ = '0';

  if( (fmt != 'o') && (stream->flags & PFORMAT_HASHED) )
  {
    /* For formats other than octal, the PFORMAT_HASHED output style
     * requires the addition of a two character radix indicator, as a
     * prefix to the actual encoded numeric value.
     */
    *p++ = fmt;
    *p++ = '0';
  }

  if( (width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
    /*
     * When not doing flush left justification, (i.e. the `-' flag
     * is not set), any residual unreserved field width must appear
     * as blank padding, to the left of the output value.
     */
    while( width-- > 0 )
      __pformat_putc( '\x20', stream );

  while( p > buf )
    /*
     * Move the queued output from the local buffer to the ultimate
     * destination, in LIFO order.
     */
    __pformat_putc( *--p, stream );

  /* If we still haven't consumed the entire specified field width,
   * we must be doing flush left justification; any residual width
   * must be filled with blanks, to the right of the output value.
   */
  while( width-- > 0 )
    __pformat_putc( '\x20', stream );
}

#include "../gdtoa/gdtoa.h"

typedef union
{
  /* A multifaceted representation of an IEEE extended precision,
   * (80-bit), floating point number, facilitating access to its
   * component parts.
   */
  double                 __pformat_fpreg_double_t;
  long double            __pformat_fpreg_ldouble_t;
  struct
  { unsigned long long   __pformat_fpreg_mantissa;
    signed short         __pformat_fpreg_exponent;
  };
  unsigned short         __pformat_fpreg_bitmap[5];
  ULong                  __pformat_fpreg_bits;
} __pformat_fpreg_t;

static __pformat_fpreg_t init_fpreg_ldouble( long double val )
{
  __pformat_fpreg_t x;
  x.__pformat_fpreg_ldouble_t = val;

  if( sizeof( double ) == sizeof( long double ) )
  {
    /* Here, __pformat_fpreg_t expects to be initialized with a 80 bit long
     * double, but this platform doesn't have long doubles that differ from
     * regular 64 bit doubles. Therefore manually convert the 64 bit float
     * value to an 80 bit float value.
     */
    int exp = (x.__pformat_fpreg_mantissa >> 52) & 0x7ff;
    unsigned long long mant = x.__pformat_fpreg_mantissa & 0x000fffffffffffffULL;
    int topbit = exp ? 1 : 0;
    int signbit = x.__pformat_fpreg_mantissa >> 63;

    if (exp == 0x7ff)
      exp = 0x7fff;
    else if (exp != 0)
      exp = exp - 1023 + 16383;
    else if (mant != 0) {
      /* Denormal when stored as a 64 bit double, but becomes a normal when
       * converted to 80 bit long double form. */
      exp = 1 - 1023 + 16383;
      while (!(mant & 0x0010000000000000ULL)) {
        /* Normalize the mantissa. */
        mant <<= 1;
        exp--;
      }
      topbit = 1; /* The top bit, which is implicit in the 64 bit form. */
    }
    x.__pformat_fpreg_mantissa = (mant << 11) | ((unsigned long long)topbit << 63);
    x.__pformat_fpreg_exponent = exp | (signbit << 15);
  }

  return x;
}

static
char *__pformat_cvt( int mode, long double val, int nd, int *dp, int *sign )
{
  /* Helper function, derived from David M. Gay's `g_xfmt()', calling
   * his `__gdtoa()' function in a manner to provide extended precision
   * replacements for `ecvt()' and `fcvt()'.
   */
  int k; unsigned int e = 0; char *ep;
  static FPI fpi = { 64, 1-16383-64+1, 32766-16383-64+1, FPI_Round_near, 0, 14 /* Int_max */ };
  __pformat_fpreg_t x = init_fpreg_ldouble( val );

  k = __fpclassifyl( val );

  /* Classify the argument into an appropriate `__gdtoa()' category...
   */
  if( k & FP_NAN )
    /*
     * identifying infinities or not-a-number...
     */
    k = (k & FP_NORMAL) ? STRTOG_Infinite : STRTOG_NaN;

  else if( k & FP_NORMAL )
  {
    /* normal and near-zero `denormals'...
     */
    if( k & FP_ZERO )
    {
      /* with appropriate exponent adjustment for a `denormal'...
       */
      k = STRTOG_Denormal;
      e = 1 - 0x3FFF - 63;
    }
    else
    {
      /* or with `normal' exponent adjustment...
       */
      k = STRTOG_Normal;
      e = (x.__pformat_fpreg_exponent & 0x7FFF) - 0x3FFF - 63;
    }
  }

  else
    /* or, if none of the above, it's a zero, (positive or negative).
     */
    k = STRTOG_Zero;

  /* Check for negative values, always treating NaN as unsigned...
   * (return value is zero for positive/unsigned; non-zero for negative).
   */
  *sign = (k == STRTOG_NaN) ? 0 : x.__pformat_fpreg_exponent & 0x8000;

  /* Finally, get the raw digit string, and radix point position index.
   */
  return __gdtoa( &fpi, e, &x.__pformat_fpreg_bits, &k, mode, nd, dp, &ep );
}

static
char *__pformat_ecvt( long double x, int precision, int *dp, int *sign )
{
  /* A convenience wrapper for the above...
   * it emulates `ecvt()', but takes a `long double' argument.
   */
  return __pformat_cvt( 2, x, precision, dp, sign );
}

static
char *__pformat_fcvt( long double x, int precision, int *dp, int *sign )
{
  /* A convenience wrapper for the above...
   * it emulates `fcvt()', but takes a `long double' argument.
   */
  return __pformat_cvt( 3, x, precision, dp, sign );
}

/* The following are required, to clean up the `__gdtoa()' memory pool,
 * after processing the data returned by the above.
 */
#define __pformat_ecvt_release( value ) __freedtoa( value )
#define __pformat_fcvt_release( value ) __freedtoa( value )

static
void __pformat_emit_radix_point( __pformat_t *stream )
{
  /* Helper to place a localised representation of the radix point
   * character at the ultimate destination, when formatting fixed or
   * floating point numbers.
   */
  if( stream->rplen == PFORMAT_RPINIT )
  {
    /* Radix point initialisation not yet completed;
     * establish a multibyte to `wchar_t' converter...
     */
    int len; wchar_t rpchr;
    mbstate_t state = {0};

    /* Fetch and convert the localised radix point representation...
     */
    if( (len = mbrtowc( &rpchr, localeconv()->decimal_point, 16, &state )) > 0 )
      /*
       * and store it, if valid.
       */
      stream->rpchr = rpchr;

    /* In any case, store the reported effective multibyte length,
     * (or the error flag), marking initialisation as `done'.
     */
    stream->rplen = len;
  }

  if( stream->rpchr != (wchar_t)(0) )
  {
    /* We have a localised radix point mark;
     * establish a converter to make it a multibyte character...
     */
#ifdef __BUILD_WIDEAPI
   __pformat_putc (stream->rpchr, stream);
#else
    int len; char buf[len = stream->rplen];
    mbstate_t state = {0};

    /* Convert the `wchar_t' representation to multibyte...
     */
    if( (len = wcrtomb( buf, stream->rpchr, &state )) > 0 )
    {
      /* and copy to the output destination, when valid...
       */
      char *p = buf;
      while( len-- > 0 )
        __pformat_putc( *p++, stream );
    }

    else
      /* otherwise fall back to plain ASCII '.'...
       */
      __pformat_putc( '.', stream );
#endif
  }
  else
    /* No localisation: just use ASCII '.'...
     */
    __pformat_putc( '.', stream );
}

static
void __pformat_emit_numeric_value( int c, __pformat_t *stream )
{
  /* Convenience helper to transfer numeric data from an internal
   * formatting buffer to the ultimate destination...
   */
  if( c == '.' )
    /*
     * converting this internal representation of the the radix
     * point to the appropriately localised representation...
     */
    __pformat_emit_radix_point( stream );
  else if (c == ',')
    {
      wchar_t wcs;
      if ((wcs = stream->thousands_chr) != 0)
        __pformat_wputchars (&wcs, 1, stream);
    }
  else
    /* and passing all other characters through, unmodified.
     */
    __pformat_putc( c, stream );
}

static
void __pformat_emit_inf_or_nan( int sign, char *value, __pformat_t *stream )
{
  /* Helper to emit INF or NAN where a floating point value
   * resolves to one of these special states.
   */
  int i;
  char buf[4];
  char *p = buf;

  /* We use the string formatting helper to display INF/NAN,
   * but we don't want truncation if the precision set for the
   * original floating point output request was insufficient;
   * ignore it!
   */
  stream->precision = PFORMAT_IGNORE;

  if( sign )
    /*
     * Negative infinity: emit the sign...
     */
    *p++ = '-';

  else if( stream->flags & PFORMAT_POSITIVE )
    /*
     * Not negative infinity, but '+' flag is in effect;
     * thus, we emit a positive sign...
     */
    *p++ = '+';

  else if( stream->flags & PFORMAT_ADDSPACE )
    /*
     * No sign required, but space was reserved for it...
     */
    *p++ = '\x20';

  /* Copy the appropriate status indicator, up to a maximum of
   * three characters, transforming to the case corresponding to
   * the format specification...
   */
  for( i = 3; i > 0; --i )
    *p++ = (*value++ & ~PFORMAT_XCASE) | (stream->flags & PFORMAT_XCASE);

  /* and emit the result.
   */
  __pformat_putchars( buf, p - buf, stream );
}

static
void __pformat_emit_float( int sign, char *value, int len, __pformat_t *stream )
{
  /* Helper to emit a fixed point representation of numeric data,
   * as encoded by a prior call to `ecvt()' or `fcvt()'; (this does
   * NOT include the exponent, for floating point format).
   */
  if( len > 0 )
  {
    /* The magnitude of `x' is greater than or equal to 1.0...
     * reserve space in the output field, for the required number of
     * decimal digits to be placed before the decimal point...
     */
    if( stream->width >= len)
      /*
       * adjusting as appropriate, when width is sufficient...
       */
      stream->width -= len;

    else
      /* or simply ignoring the width specification, if not.
       */
      stream->width = PFORMAT_IGNORE;
  }

  else if( stream->width > 0 )
    /*
     * The magnitude of `x' is less than 1.0...
     * reserve space for exactly one zero before the decimal point.
     */
    stream->width--;

  /* Reserve additional space for the digits which will follow the
   * decimal point...
   */
  if( (stream->width >= 0) && (stream->width > stream->precision) )
    /*
     * adjusting appropriately, when sufficient width remains...
     * (note that we must check both of these conditions, because
     * precision may be more negative than width, as a result of
     * adjustment to provide extra padding when trailing zeros
     * are to be discarded from "%g" format conversion with a
     * specified field width, but if width itself is negative,
     * then there is explicitly to be no padding anyway).
     */
    stream->width -= stream->precision;

  else
    /* or again, ignoring the width specification, if not.
     */
    stream->width = PFORMAT_IGNORE;

  /* Reserve space in the output field, for display of the decimal point,
   * unless the precision is explicity zero, with the `#' flag not set.
   */
  if ((stream->width > 0)
      && ((stream->precision > 0) || (stream->flags & PFORMAT_HASHED)))
    stream->width--;

  if (len > 0 && (stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0)
    {
      int cths = ((len + 2) / 3) - 1;
      while (cths > 0 && stream->width > 0)
        {
          --cths; stream->width--;
        }
    }

  /* Reserve space in the output field, for display of the sign of the
   * formatted value, if required; (i.e. if the value is negative, or if
   * either the `space' or `+' formatting flags are set).
   */
  if( (stream->width > 0) && (sign || (stream->flags & PFORMAT_SIGNED)) )
    stream->width--;

  /* Emit any padding space, as required to correctly right justify
   * the output within the alloted field width.
   */
  if( (stream->width > 0) && ((stream->flags & PFORMAT_JUSTIFY) == 0) )
    while( stream->width-- > 0 )
      __pformat_putc( '\x20', stream );

  /* Emit the sign indicator, as appropriate...
   */
  if( sign )
    /*
     * mandatory, for negative values...
     */
    __pformat_putc( '-', stream );

  else if( stream->flags & PFORMAT_POSITIVE )
    /*
     * optional, for positive values...
     */
    __pformat_putc( '+', stream );

  else if( stream->flags & PFORMAT_ADDSPACE )
    /*
     * or just fill reserved space, when the space flag is in effect.
     */
    __pformat_putc( '\x20', stream );

  /* If the `0' flag is in effect, and not overridden by the `-' flag,
   * then zero padding, to fill out the field, goes here...
   */
  if(  (stream->width > 0)
  &&  ((stream->flags & PFORMAT_JUSTIFY) == PFORMAT_ZEROFILL)  )
    while( stream->width-- > 0 )
      __pformat_putc( '0', stream );

  /* Emit the digits of the encoded numeric value...
   */
  if( len > 0 )
  {
    /*
     * ...beginning with those which precede the radix point,
     * and appending any necessary significant trailing zeros.
     */
    do {
      __pformat_putc( *value ? *value++ : '0', stream);
      --len;
      if (len != 0 && (stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0
          && (len % 3) == 0)
        __pformat_wputchars (&stream->thousands_chr, 1, stream);
    }
    while (len > 0);
  }
  else
    /* The magnitude of the encoded value is less than 1.0, so no
     * digits precede the radix point; we emit a mandatory initial
     * zero, followed immediately by the radix point.
     */
    __pformat_putc( '0', stream );

  /* Unless the encoded value is integral, AND the radix point
   * is not expressly demanded by the `#' flag, we must insert
   * the appropriately localised radix point mark here...
   */
  if( (stream->precision > 0) || (stream->flags & PFORMAT_HASHED) )
    __pformat_emit_radix_point( stream );

  /* When the radix point offset, `len', is negative, this implies
   * that additional zeros must appear, following the radix point,
   * and preceding the first significant digit...
   */
  if( len < 0 )
  {
    /* To accommodate these, we adjust the precision, (reducing it
     * by adding a negative value), and then we emit as many zeros
     * as are required.
     */
    stream->precision += len;
    do __pformat_putc( '0', stream );
       while( ++len < 0 );
  }

  /* Now we emit any remaining significant digits, or trailing zeros,
   * until the required precision has been achieved.
   */
  while( stream->precision-- > 0 )
    __pformat_putc( *value ? *value++ : '0', stream );
}

static
void __pformat_emit_efloat( int sign, char *value, int e, __pformat_t *stream )
{
  /* Helper to emit a floating point representation of numeric data,
   * as encoded by a prior call to `ecvt()' or `fcvt()'; (this DOES
   * include the following exponent).
   */
  int exp_width = 1;
  __pformat_intarg_t exponent; exponent.__pformat_llong_t = e -= 1;

  /* Determine how many digit positions are required for the exponent.
   */
  while( (e /= 10) != 0 )
    exp_width++;

  /* Ensure that this is at least as many as the standard requirement.
   * The C99 standard requires the expenent to contain at least two
   * digits, unless specified explicitly otherwise.
   */
  if (stream->expmin == -1)
    stream->expmin = 2;
  if( exp_width < stream->expmin )
    exp_width = stream->expmin;

  /* Adjust the residual field width allocation, to allow for the
   * number of exponent digits to be emitted, together with a sign
   * and exponent separator...
   */
  if( stream->width > (exp_width += 2) )
    stream->width -= exp_width;

  else
    /* ignoring the field width specification, if insufficient.
     */
    stream->width = PFORMAT_IGNORE;

  /* Emit the significand, as a fixed point value with one digit
   * preceding the radix point.
   */
  __pformat_emit_float( sign, value, 1, stream );

  /* Reset precision, to ensure the mandatory minimum number of
   * exponent digits will be emitted, and set the flags to ensure
   * the sign is displayed.
   */
  stream->precision = stream->expmin;
  stream->flags |= PFORMAT_SIGNED;

  /* Emit the exponent separator.
   */
  __pformat_putc( ('E' | (stream->flags & PFORMAT_XCASE)), stream );

  /* Readjust the field width setting, such that it again allows
   * for the digits of the exponent, (which had been discounted when
   * computing any left side padding requirement), so that they are
   * correctly included in the computation of any right side padding
   * requirement, (but here we exclude the exponent separator, which
   * has been emitted, and so counted already).
   */
  stream->width += exp_width - 1;

  /* And finally, emit the exponent itself, as a signed integer,
   * with any padding required to achieve flush left justification,
   * (which will be added automatically, by `__pformat_int()').
   */
  __pformat_int( exponent, stream );
}

static
void __pformat_float( long double x, __pformat_t *stream )
{
  /* Handler for `%f' and `%F' format specifiers.
   *
   * This wraps calls to `__pformat_cvt()', `__pformat_emit_float()'
   * and `__pformat_emit_inf_or_nan()', as appropriate, to achieve
   * output in fixed point format.
   */
  int sign, intlen; char *value;

  /* Establish the precision for the displayed value, defaulting to six
   * digits following the decimal point, if not explicitly specified.
   */
  if( stream->precision < 0 )
    stream->precision = 6;

  /* Encode the input value as ASCII, for display...
   */
  value = __pformat_fcvt( x, stream->precision, &intlen, &sign );

  if( intlen == PFORMAT_INFNAN )
    /*
     * handle cases of `infinity' or `not-a-number'...
     */
    __pformat_emit_inf_or_nan( sign, value, stream );

  else
  { /* or otherwise, emit the formatted result.
     */
    __pformat_emit_float( sign, value, intlen, stream );

    /* and, if there is any residual field width as yet unfilled,
     * then we must be doing flush left justification, so pad out to
     * the right hand field boundary.
     */
    while( stream->width-- > 0 )
      __pformat_putc( '\x20', stream );
  }

  /* Clean up `__pformat_fcvt()' memory allocation for `value'...
   */
  __pformat_fcvt_release( value );
}

#ifdef __ENABLE_DFP

typedef struct decimal128_decode {
  int64_t significand[2];
  int32_t exponent;
  int sig_neg;
  int exp_neg;
} decimal128_decode;

static uint32_t dec128_decode(decimal128_decode *result, const _Decimal128 deci){
  int64_t significand2;
  int64_t significand1;
  int32_t exp_part;
  int8_t sig_sign;
  ud128 in;
  in.d = deci;

  if(in.t0.bits == 0x3){ /*case 11 */
    /* should not enter here */
    sig_sign = in.t2.sign;
    exp_part = in.t2.exponent;
    significand1 = in.t2.mantissaL;
    significand2 = (in.t2.mantissaH | (0x1ULL << 49));
  } else {
    sig_sign = in.t1.sign;
    exp_part = in.t1.exponent;
    significand1 = in.t1.mantissaL;
    significand2 = in.t1.mantissaH;
  }
  exp_part -= 6176; /* exp bias */

  result->significand[0] = significand1;
  result->significand[1] = significand2; /* higher */
  result->exponent = exp_part;
  result->exp_neg = (exp_part < 0 )? 1 : 0;
  result->sig_neg = sig_sign;

  return 0;
}

static
void  __pformat_efloat_decimal(_Decimal128 x, __pformat_t *stream ){
  decimal128_decode in;
  char str_exp[8];
  char str_sig[40];
  int floatclass = __fpclassifyd128(x);

  /* precision control */
  int32_t prec = ( (stream->precision < 0) || (stream->precision > 38) ) ?
    6 : stream->precision;
  int32_t max_prec;
  int32_t exp_strlen;

  dec128_decode(&in,x);

  if((floatclass & FP_INFINITE) == FP_INFINITE){
    stream->precision = 3;
    if(stream->flags & PFORMAT_SIGNED)
      __pformat_putc( in.sig_neg ? '-' : '+', stream );
    __pformat_puts( (stream->flags & PFORMAT_XCASE) ? "inf" : "INF", stream);
    return;
  } else if(floatclass & FP_NAN){
    stream->precision = 3;
    if(stream->flags & PFORMAT_SIGNED)
      __pformat_putc( in.sig_neg ? '-' : '+', stream );
    __pformat_puts( (stream->flags & PFORMAT_XCASE) ? "nan" : "NAN", stream);
    return;
  }

  /* Stringify significand */
  __bigint_to_string(
    (uint32_t[4]){in.significand[0] & 0x0ffffffff, in.significand[0] >> 32, in.significand[1] & 0x0ffffffff, in.significand[1] >> 32 },
    4, str_sig, sizeof(str_sig));
  __bigint_trim_leading_zeroes(str_sig,1);
  max_prec = strlen(str_sig+1);

  /* Try to canonize exponent */
  in.exponent += max_prec;
  in.exp_neg = (in.exponent < 0 ) ? 1 : 0;

  /* stringify exponent */
  __bigint_to_string(
    (uint32_t[1]) { in.exp_neg ? -in.exponent : in.exponent},
    1, str_exp, sizeof(str_exp));
  exp_strlen = strlen(__bigint_trim_leading_zeroes(str_exp,3));

  /* account for dot, +-e */
  for(int32_t spacers = 0; spacers < stream->width - max_prec - exp_strlen - 4; spacers++)
    __pformat_putc( ' ', stream );

  /* optional sign */
  if (in.sig_neg || (stream->flags & PFORMAT_SIGNED)) {
    __pformat_putc( in.sig_neg ? '-' : '+', stream );
  } else if( stream->width - max_prec - exp_strlen - 4 > 0 ) {
    __pformat_putc( ' ', stream );
  }
  stream->width = 0;
  /* s.sss form */
  __pformat_putc(str_sig[0], stream);
  if(prec) {
    /* str_sig[prec+1] = '\0';*/
    __pformat_emit_radix_point(stream);
    __pformat_putchars(str_sig+1, prec, stream);

    /* Pad with 0s */
    for(int i = max_prec; i < prec; i++)
      __pformat_putc('0', stream);
  }

  stream->precision = exp_strlen; /* force puts to emit */

  __pformat_putc( ('E' | (stream->flags & PFORMAT_XCASE)), stream );
  __pformat_putc( in.exp_neg ? '-' : '+', stream );

  for(int32_t trailing = 0; trailing < 3 - exp_strlen; trailing++)
    __pformat_putc('0', stream);
  __pformat_putchars(str_exp, exp_strlen,stream);
}

static
void  __pformat_float_decimal(_Decimal128 x, __pformat_t *stream ){
  decimal128_decode in;
  char str_exp[8];
  char str_sig[40];
  int floatclass = __fpclassifyd128(x);

  /* precision control */
  int prec = ( (stream->precision < 0) || (stream->precision > 38) ) ?
    6 : stream->precision;
  int max_prec;

  dec128_decode(&in,x);

  if((floatclass & FP_INFINITE) == FP_INFINITE){
    stream->precision = 3;
    if(stream->flags & PFORMAT_SIGNED)
      __pformat_putc( in.sig_neg ? '-' : '+', stream );
    __pformat_puts( (stream->flags & PFORMAT_XCASE) ? "inf" : "INF", stream);
    return;
  } else if(floatclass & FP_NAN){
    stream->precision = 3;
    if(stream->flags & PFORMAT_SIGNED)
      __pformat_putc( in.sig_neg ? '-' : '+', stream );
    __pformat_puts( (stream->flags & PFORMAT_XCASE) ? "nan" : "NAN", stream);
    return;
  }

  /* Stringify significand */
  __bigint_to_string(
    (uint32_t[4]){in.significand[0] & 0x0ffffffff, in.significand[0] >> 32, in.significand[1] & 0x0ffffffff, in.significand[1] >> 32 },
    4, str_sig, sizeof(str_sig));
  __bigint_trim_leading_zeroes(str_sig,0);
  max_prec = strlen(str_sig);

  /* stringify exponent */
  __bigint_to_string(
    (uint32_t[1]) { in.exp_neg ? -in.exponent : in.exponent},
    1, str_exp, sizeof(str_exp));
  __bigint_trim_leading_zeroes(str_exp,0);

  int32_t decimal_place = max_prec + in.exponent;
  int32_t sig_written = 0;

  /*account for . +- */
  for(int32_t spacers = 0; spacers < stream->width - decimal_place - prec - 2; spacers++)
    __pformat_putc( ' ', stream );

  if (in.sig_neg || (stream->flags & PFORMAT_SIGNED)) {
    __pformat_putc( in.sig_neg ? '-' : '+', stream );
  } else if(stream->width - decimal_place - prec - 1 > 0){
    __pformat_putc( ' ', stream );
  }

  if(decimal_place <= 0){ /* easy mode */
    __pformat_putc( '0', stream );
    points:
    __pformat_emit_radix_point(stream);
    for(int32_t written = 0; written < prec; written++){
      if(decimal_place < 0){ /* leading 0s */
        decimal_place++;
        __pformat_putc( '0', stream );
      /* significand */
      } else if ( sig_written < max_prec ){
        __pformat_putc( str_sig[sig_written], stream );
        sig_written++;
      } else { /* trailing 0s */
        __pformat_putc( '0', stream );
      }
    }
  } else { /* hard mode */
    for(; sig_written < decimal_place; sig_written++){
      __pformat_putc( str_sig[sig_written], stream );
      if(sig_written == max_prec - 1) break;
    }
    decimal_place -= sig_written;
    for(; decimal_place > 0; decimal_place--)
      __pformat_putc( '0', stream );
      goto points;
  }

  return;
}

static
void  __pformat_gfloat_decimal(_Decimal128 x, __pformat_t *stream ){
  int prec = ( (stream->precision < 0)) ?
    6 : stream->precision;
  decimal128_decode in;
  dec128_decode(&in,x);
  if(in.exponent > prec) __pformat_efloat_decimal(x,stream);
  else __pformat_float_decimal(x,stream);
}

#endif /* __ENABLE_DFP */

static
void __pformat_efloat( long double x, __pformat_t *stream )
{
  /* Handler for `%e' and `%E' format specifiers.
   *
   * This wraps calls to `__pformat_cvt()', `__pformat_emit_efloat()'
   * and `__pformat_emit_inf_or_nan()', as appropriate, to achieve
   * output in floating point format.
   */
  int sign, intlen; char *value;

  /* Establish the precision for the displayed value, defaulting to six
   * digits following the decimal point, if not explicitly specified.
   */
  if( stream->precision < 0 )
    stream->precision = 6;

  /* Encode the input value as ASCII, for display...
   */
  value = __pformat_ecvt( x, stream->precision + 1, &intlen, &sign );

  if( intlen == PFORMAT_INFNAN )
    /*
     * handle cases of `infinity' or `not-a-number'...
     */
    __pformat_emit_inf_or_nan( sign, value, stream );

  else
    /* or otherwise, emit the formatted result.
     */
    __pformat_emit_efloat( sign, value, intlen, stream );

  /* Clean up `__pformat_ecvt()' memory allocation for `value'...
   */
  __pformat_ecvt_release( value );
}

static
void __pformat_gfloat( long double x, __pformat_t *stream )
{
  /* Handler for `%g' and `%G' format specifiers.
   *
   * This wraps calls to `__pformat_cvt()', `__pformat_emit_float()',
   * `__pformat_emit_efloat()' and `__pformat_emit_inf_or_nan()', as
   * appropriate, to achieve output in the more suitable of either
   * fixed or floating point format.
   */
  int sign, intlen; char *value;

  /* Establish the precision for the displayed value, defaulting to
   * six significant digits, if not explicitly specified...
   */
  if( stream->precision < 0 )
    stream->precision = 6;

  /* or to a minimum of one digit, otherwise...
   */
  else if( stream->precision == 0 )
    stream->precision = 1;

  /* Encode the input value as ASCII, for display.
   */
  value = __pformat_ecvt( x, stream->precision, &intlen, &sign );

  if( intlen == PFORMAT_INFNAN )
    /*
     * Handle cases of `infinity' or `not-a-number'.
     */
    __pformat_emit_inf_or_nan( sign, value, stream );

  else if( (-4 < intlen) && (intlen <= stream->precision) )
  {
    /* Value lies in the acceptable range for fixed point output,
     * (i.e. the exponent is no less than minus four, and the number
     * of significant digits which precede the radix point is fewer
     * than the least number which would overflow the field width,
     * specified or implied by the established precision).
     */
    if( (stream->flags & PFORMAT_HASHED) == PFORMAT_HASHED )
      /*
       * The `#' flag is in effect...
       * Adjust precision to retain the specified number of significant
       * digits, with the proper number preceding the radix point, and
       * the balance following it...
       */
      stream->precision -= intlen;

    else
      /* The `#' flag is not in effect...
       * Here we adjust the precision to accommodate all digits which
       * precede the radix point, but we truncate any balance following
       * it, to suppress output of non-significant trailing zeros...
       */
      if( ((stream->precision = strlen( value ) - intlen) < 0)
        /*
         * This may require a compensating adjustment to the field
         * width, to accommodate significant trailing zeros, which
         * precede the radix point...
         */
      && (stream->width > 0)  )
        stream->width += stream->precision;

    /* Now, we format the result as any other fixed point value.
     */
    __pformat_emit_float( sign, value, intlen, stream );

    /* If there is any residual field width as yet unfilled, then
     * we must be doing flush left justification, so pad out to the
     * right hand field boundary.
     */
    while( stream->width-- > 0 )
      __pformat_putc( '\x20', stream );
  }

  else
  { /* Value lies outside the acceptable range for fixed point;
     * one significant digit will precede the radix point, so we
     * decrement the precision to retain only the appropriate number
     * of additional digits following it, when we emit the result
     * in floating point format.
     */
    if( (stream->flags & PFORMAT_HASHED) == PFORMAT_HASHED )
      /*
       * The `#' flag is in effect...
       * Adjust precision to emit the specified number of significant
       * digits, with one preceding the radix point, and the balance
       * following it, retaining any non-significant trailing zeros
       * which are required to exactly match the requested precision...
       */
      stream->precision--;

    else
      /* The `#' flag is not in effect...
       * Adjust precision to emit only significant digits, with one
       * preceding the radix point, and any others following it, but
       * suppressing non-significant trailing zeros...
       */
      stream->precision = strlen( value ) - 1;

    /* Now, we format the result as any other floating point value.
     */
    __pformat_emit_efloat( sign, value, intlen, stream );
  }

  /* Clean up `__pformat_ecvt()' memory allocation for `value'.
   */
  __pformat_ecvt_release( value );
}

static
void __pformat_emit_xfloat( __pformat_fpreg_t value, __pformat_t *stream )
{
  /* Helper for emitting floating point data, originating as
   * either `double' or `long double' type, as a hexadecimal
   * representation of the argument value.
   */
  char buf[18 + 6], *p = buf;
  __pformat_intarg_t exponent; short exp_width = 2;

  if (value.__pformat_fpreg_mantissa != 0 ||
     value.__pformat_fpreg_exponent != 0)
  {
    /* Reduce the exponent since the leading digit emited will start at
     * the 4th bit from the highest order bit instead, the later being
     * the leading digit of the floating point. Don't do this adjustment
     * if the value is an actual zero.
     */
    value.__pformat_fpreg_exponent -= 3;
  }

  /* The mantissa field of the argument value representation can
   * accommodate at most 16 hexadecimal digits, of which one will
   * be placed before the radix point, leaving at most 15 digits
   * to satisfy any requested precision; thus...
   */
  if( (stream->precision >= 0) && (stream->precision < 15) )
  {
    /* When the user specifies a precision within this range,
     * we want to adjust the mantissa, to retain just the number
     * of digits required, rounding up when the high bit of the
     * leftmost discarded digit is set; (mask of 0x08 accounts
     * for exactly one digit discarded, shifting 4 bits per
     * digit, with up to 14 additional digits, to consume the
     * full availability of 15 precision digits).
     */

    /* We then shift the mantissa one bit position back to the
     * right, to guard against possible overflow when the rounding
     * adjustment is added.
     */
    value.__pformat_fpreg_mantissa >>= 1;

    /* We now add the rounding adjustment, noting that to keep the
     * 0x08 mask aligned with the shifted mantissa, we also need to
     * shift it right by one bit initially, changing its starting
     * value to 0x04...
     */
    value.__pformat_fpreg_mantissa += 0x04LL << (4 * (14 - stream->precision));
    if( (value.__pformat_fpreg_mantissa & (LLONG_MAX + 1ULL)) == 0ULL )
      /*
       * When the rounding adjustment would not have overflowed,
       * then we shift back to the left again, to fill the vacated
       * bit we reserved to accommodate the carry.
       */
      value.__pformat_fpreg_mantissa <<= 1;

    else
    {
      /* Otherwise the rounding adjustment would have overflowed,
       * so the carry has already filled the vacated bit; the effect
       * of this is equivalent to an increment of the exponent. We will
       * discard a whole digit to match glibc's behavior.
       */
      value.__pformat_fpreg_exponent += 4;
      value.__pformat_fpreg_mantissa >>= 3;
    }

    /* We now complete the rounding to the required precision, by
     * shifting the unwanted digits out, from the right hand end of
     * the mantissa.
     */
    value.__pformat_fpreg_mantissa >>= 4 * (15 - stream->precision);
  }

  /* Don't print anything if mantissa is zero unless we have to satisfy
   * desired precision.
   */
  if( value.__pformat_fpreg_mantissa || stream->precision > 0 )
  {
    /* Encode the significant digits of the mantissa in hexadecimal
     * ASCII notation, ready for transfer to the output stream...
     */
    for( int i=stream->precision >= 15 || stream->precision < 0 ? 16 : stream->precision + 1; i>0; --i )
    {
      /* taking the rightmost digit in each pass...
       */
      unsigned c = value.__pformat_fpreg_mantissa & 0xF;
      if( i == 1 )
      {
        /* inserting the radix point, when we reach the last,
         * (i.e. the most significant digit), unless we found no
         * less significant digits, with no mandatory radix point
         * inclusion, and no additional required precision...
         */
        if( (p > buf)
        ||  (stream->flags & PFORMAT_HASHED) || (stream->precision > 0)  )
        {
          /*
           * Internally, we represent the radix point as an ASCII '.';
           * we will replace it with any locale specific alternative,
           * at the time of transfer to the ultimate destination.
           */
          *p++ = '.';
        }
      }

      else if( stream->precision > 0 )
        /*
        * we have not yet fulfilled the desired precision,
        * and we have not yet found the most significant digit,
        * so account for the current digit, within the field
        * width required to meet the specified precision.
        */
        stream->precision--;

      if( (c > 0) || (p > buf) || (stream->precision >= 0) )
      {
        /*
         * Ignoring insignificant trailing zeros, (unless required to
         * satisfy specified precision), store the current encoded digit
         * into the pending output buffer, in LIFO order, and using the
         * appropriate case for digits in the `A'..`F' range.
         */
        *p++ = c > 9 ? (c - 10 + 'A') | (stream->flags & PFORMAT_XCASE) : c + '0';
      }
      /* Shift out the current digit, (4-bit logical shift right),
       * to align the next more significant digit to be extracted,
       * and encoded in the next pass.
       */
      value.__pformat_fpreg_mantissa >>= 4;
    }
  }

  if( p == buf )
  {
    /* Nothing has been queued for output...
     * We need at least one zero, and possibly a radix point.
     */
    if( (stream->precision > 0) || (stream->flags & PFORMAT_HASHED) )
      *p++ = '.';

    *p++ = '0';
  }

  if( stream->width > 0 )
  {
  /* Adjust the user specified field width, to account for the
   * number of digits minimally required, to display the encoded
   * value, at the requested precision.
   *
   * FIXME: this uses the minimum number of digits possible for
   * representation of the binary exponent, in strict conformance
   * with C99 and POSIX specifications.  Although there appears to
   * be no Microsoft precedent for doing otherwise, we may wish to
   * relate this to the `_get_output_format()' result, to maintain
   * consistency with `%e', `%f' and `%g' styles.
   */
    int min_width = p - buf;
    int exponent2 = value.__pformat_fpreg_exponent;

    /* If we have not yet queued sufficient digits to fulfil the
     * requested precision, then we must adjust the minimum width
     * specification, to accommodate the additional digits which
     * are required to do so.
     */
    if( stream->precision > 0 )
      min_width += stream->precision;

    /* Adjust the minimum width requirement, to accomodate the
     * sign, radix indicator and at least one exponent digit...
     */
    min_width += stream->flags & PFORMAT_SIGNED ? 6 : 5;
    while( (exponent2 = exponent2 / 10) != 0 )
    {
      /* and increase as required, if additional exponent digits
       * are needed, also saving the exponent field width adjustment,
       * for later use when that is emitted.
       */
      min_width++;
      exp_width++;
    }

    if( stream->width > min_width )
    {
      /* When specified field width exceeds the minimum required,
       * adjust to retain only the excess...
       */
      stream->width -= min_width;

      /* and then emit any required left side padding spaces.
       */
      if( (stream->flags & PFORMAT_JUSTIFY) == 0 )
        while( stream->width-- > 0 )
          __pformat_putc( '\x20', stream );
    }

    else
      /* Specified field width is insufficient; just ignore it!
       */
      stream->width = PFORMAT_IGNORE;
  }

  /* Emit the sign of the encoded value, as required...
   */
  if( stream->flags & PFORMAT_NEGATIVE )
    /*
     * this is mandatory, to indicate a negative value...
     */
    __pformat_putc( '-', stream );

  else if( stream->flags & PFORMAT_POSITIVE )
    /*
     * but this is optional, for a positive value...
     */
    __pformat_putc( '+', stream );

  else if( stream->flags & PFORMAT_ADDSPACE )
    /*
     * with this optional alternative.
     */
    __pformat_putc( '\x20', stream );

  /* Prefix a `0x' or `0X' radix indicator to the encoded value,
   * with case appropriate to the format specification.
   */
  __pformat_putc( '0', stream );
  __pformat_putc( 'X' | (stream->flags & PFORMAT_XCASE), stream );

  /* If the `0' flag is in effect...
   * Zero padding, to fill out the field, goes here...
   */
  if( (stream->width > 0) && (stream->flags & PFORMAT_ZEROFILL) )
    while( stream->width-- > 0 )
      __pformat_putc( '0', stream );

  /* Next, we emit the encoded value, without its exponent...
   */
  while( p > buf )
    __pformat_emit_numeric_value( *--p, stream );

  /* followed by any additional zeros needed to satisfy the
   * precision specification...
   */
  while( stream->precision-- > 0 )
    __pformat_putc( '0', stream );

  /* then the exponent prefix, (C99 and POSIX specify `p'),
   * in the case appropriate to the format specification...
   */
  __pformat_putc( 'P' | (stream->flags & PFORMAT_XCASE), stream );

  /* and finally, the decimal representation of the binary exponent,
   * as a signed value with mandatory sign displayed, in a field width
   * adjusted to accommodate it, LEFT justified, with any additional
   * right side padding remaining from the original field width.
   */
  stream->width += exp_width;
  stream->flags |= PFORMAT_SIGNED;
  /* sign extend */
  exponent.__pformat_u128_t.t128.digits[1] = (value.__pformat_fpreg_exponent < 0) ? -1 : 0;
  exponent.__pformat_u128_t.t128.digits[0] = value.__pformat_fpreg_exponent;
  __pformat_int( exponent, stream );
}

static
void __pformat_xldouble( long double x, __pformat_t *stream )
{
  /* Handler for `%La' and `%LA' format specifiers, (with argument
   * value specified as `long double' type).
   */
  unsigned sign_bit = 0;
  __pformat_fpreg_t z = init_fpreg_ldouble( x );

  /* First check for NaN; it is emitted unsigned...
   */
  if( isnan( x ) )
    __pformat_emit_inf_or_nan( sign_bit, "NaN", stream );

  else
  { /* Capture the sign bit up-front, so we can show it correctly
     * even when the argument value is zero or infinite.
     */
    if( (sign_bit = (z.__pformat_fpreg_exponent & 0x8000)) != 0 )
      stream->flags |= PFORMAT_NEGATIVE;

    /* Check for infinity, (positive or negative)...
     */
    if( isinf( x ) )
      /*
       * displaying the appropriately signed indicator,
       * when appropriate.
       */
      __pformat_emit_inf_or_nan( sign_bit, "Inf", stream );

    else
    { /* The argument value is a representable number...
       * extract the effective value of the biased exponent...
       */
      z.__pformat_fpreg_exponent &= 0x7FFF;
      if( z.__pformat_fpreg_exponent == 0 )
      {
        /* A biased exponent value of zero means either a
         * true zero value, if the mantissa field also has
         * a zero value, otherwise...
         */
        if( z.__pformat_fpreg_mantissa != 0 )
        {
          /* ...this mantissa represents a subnormal value.
           */
          z.__pformat_fpreg_exponent = 1 - 0x3FFF;
        }
      }
      else
        /* This argument represents a non-zero normal number;
         * eliminate the bias from the exponent...
         */
        z.__pformat_fpreg_exponent -= 0x3FFF;

      /* Finally, hand the adjusted representation off to the
       * generalised hexadecimal floating point format handler...
       */
      __pformat_emit_xfloat( z, stream );
    }
  }
}

static
void __pformat_xdouble( double x, __pformat_t *stream )
{
  /* Handler for `%la' and `%lA' format specifiers, (with argument
   * value specified as `double' type).
   */
  unsigned sign_bit = 0;
  __pformat_fpreg_t z = init_fpreg_ldouble( (long double)x );

  /* First check for NaN; it is emitted unsigned...
   */
  if( isnan( x ) )
    __pformat_emit_inf_or_nan( sign_bit, "NaN", stream );

  else
  { /* Capture the sign bit up-front, so we can show it correctly
     * even when the argument value is zero or infinite.
     */
    if( (sign_bit = (z.__pformat_fpreg_exponent & 0x8000)) != 0 )
      stream->flags |= PFORMAT_NEGATIVE;

    /* Check for infinity, (positive or negative)...
     */
    if( isinf( x ) )
      /*
       * displaying the appropriately signed indicator,
       * when appropriate.
       */
      __pformat_emit_inf_or_nan( sign_bit, "Inf", stream );

    else
    { /* The argument value is a representable number...
       * extract the effective value of the biased exponent...
       */
      z.__pformat_fpreg_exponent &= 0x7FFF;

      /* If the double value was a denormalized number, it might have been renormalized by
       * the conversion to long double. We will redenormalize it.
       */
      if( z.__pformat_fpreg_exponent != 0 && z.__pformat_fpreg_exponent <= (0x3FFF - 0x3FF) )
      {
        int shifted = (0x3FFF - 0x3FF) - z.__pformat_fpreg_exponent + 1;
        z.__pformat_fpreg_mantissa >>= shifted;
        z.__pformat_fpreg_exponent += shifted;
      }

      if( z.__pformat_fpreg_exponent == 0 )
      {
        /* A biased exponent value of zero means either a
         * true zero value, if the mantissa field also has
         * a zero value, otherwise...
         */
        if( z.__pformat_fpreg_mantissa != 0 )
        {
          /* ...this mantissa represents a subnormal value.
           */
          z.__pformat_fpreg_exponent = 1 - 0x3FF + 3;
        }
      }
      else
        /* This argument represents a non-zero normal number;
         * eliminate the bias from the exponent...
         */
        z.__pformat_fpreg_exponent -= 0x3FFF - 3;

      /* Shift the mantissa so the leading 4 bits digit is 0 or 1.
       * The exponent was also adjusted by 3 previously.
       */
      z.__pformat_fpreg_mantissa >>= 3;

      /* Finally, hand the adjusted representation off to the
       * generalised hexadecimal floating point format handler...
       */
      __pformat_emit_xfloat( z, stream );
    }
  }
}

int
__pformat (int flags, void *dest, int max, const APICHAR *fmt, va_list argv)
{
  int c;
  int saved_errno = errno;

  __pformat_t stream =
  {
    /* Create and initialise a format control block
     * for this output request.
     */
    dest,                                       /* output goes to here        */
    flags &= PFORMAT_TO_FILE | PFORMAT_NOLIMIT, /* only these valid initially */
    PFORMAT_IGNORE,                             /* no field width yet         */
    PFORMAT_IGNORE,                             /* nor any precision spec     */
    PFORMAT_RPINIT,                             /* radix point uninitialised  */
    (wchar_t)(0),                               /* leave it unspecified       */
    0,
    (wchar_t)(0),                               /* leave it unspecified       */
    0,                                          /* zero output char count     */
    max,                                        /* establish output limit     */
    -1                                          /* exponent chars preferred;
                                                   -1 means to be determined. */
  };

#ifdef __BUILD_WIDEAPI
  const APICHAR *literal_string_start = NULL;
#endif

  format_scan: while( (c = *fmt++) != 0 )
  {
    /* Format string parsing loop...
     * The entry point is labelled, so that we can return to the start state
     * from within the inner `conversion specification' interpretation loop,
     * as soon as a conversion specification has been resolved.
     */
    if( c == '%' )
    {
      /* Initiate parsing of a `conversion specification'...
       */
      __pformat_intarg_t argval;
      __pformat_state_t  state = PFORMAT_INIT;
      __pformat_length_t length = PFORMAT_LENGTH_INT;

      /* Save the current format scan position, so that we can backtrack
       * in the event of encountering an invalid format specification...
       */
      const APICHAR *backtrack = fmt;

      /* Restart capture for dynamic field width and precision specs...
       */
      int *width_spec = &stream.width;

  #ifdef __BUILD_WIDEAPI
      if (literal_string_start)
      {
        stream.width = stream.precision = PFORMAT_IGNORE;
        __pformat_wputchars( literal_string_start, fmt - literal_string_start - 1, &stream );
        literal_string_start = NULL;
      }
  #endif

      /* Reset initial state for flags, width and precision specs...
       */
      stream.flags = flags;
      stream.width = stream.precision = PFORMAT_IGNORE;

      while( *fmt )
      {
        switch( c = *fmt++ )
        {
          /* Data type specifiers...
           * All are terminal, so exit the conversion spec parsing loop
           * with a `goto format_scan', thus resuming at the outer level
           * in the regular format string parser.
           */
          case '%':
            /*
             * Not strictly a data type specifier...
             * it simply converts as a literal `%' character.
             *
             * FIXME: should we require this to IMMEDIATELY follow the
             * initial `%' of the "conversion spec"?  (glibc `printf()'
             * on GNU/Linux does NOT appear to require this, but POSIX
             * and SUSv3 do seem to demand it).
             */
    #ifndef __BUILD_WIDEAPI
            __pformat_putc( c, &stream );
    #else
        stream.width = stream.precision = PFORMAT_IGNORE;
        __pformat_wputchars( L"%", 1, &stream );
    #endif
            goto format_scan;

          case 'C':
            /*
             * Equivalent to `%lc'; set `length' accordingly,
             * and simply fall through.
             */
            length = PFORMAT_LENGTH_LONG;

            /* fallthrough */

          case 'c':
            /*
             * Single, (or single multibyte), character output...
             *
             * We handle these by copying the argument into our local
             * `argval' buffer, and then we pass the address of that to
             * either `__pformat_putchars()' or `__pformat_wputchars()',
             * as appropriate, effectively formatting it as a string of
             * the appropriate type, with a length of one.
             *
             * A side effect of this method of handling character data
             * is that, if the user sets a precision of zero, then no
             * character is actually emitted; we don't want that, so we
             * forcibly override any user specified precision.
             */
            stream.precision = PFORMAT_IGNORE;

            /* Now we invoke the appropriate format handler...
             */
            if( (length == PFORMAT_LENGTH_LONG)
            ||  (length == PFORMAT_LENGTH_LLONG)  )
            {
              /* considering any `long' type modifier as a reference to
               * `wchar_t' data, (which is promoted to an `int' argument)...
               */
              wchar_t iargval = (wchar_t)(va_arg( argv, int ));
              __pformat_wputchars( &iargval, 1, &stream );
            }
            else
            { /* while anything else is simply taken as `char', (which
               * is also promoted to an `int' argument)...
               */
              argval.__pformat_uchar_t = (unsigned char)(va_arg( argv, int ));
              __pformat_putchars( (char *)(&argval), 1, &stream );
            }
            goto format_scan;

          case 'S':
            /*
             * Equivalent to `%ls'; set `length' accordingly,
             * and simply fall through.
             */
            length = PFORMAT_LENGTH_LONG;

            /* fallthrough */

          case 's':
            if( (length == PFORMAT_LENGTH_LONG)
                 || (length == PFORMAT_LENGTH_LLONG))
            {
              /* considering any `long' type modifier as a reference to
               * a `wchar_t' string...
               */
              __pformat_wcputs( va_arg( argv, wchar_t * ), &stream );
            }
            else
              /* This is normal string output;
               * we simply invoke the appropriate handler...
               */
              __pformat_puts( va_arg( argv, char * ), &stream );
            goto format_scan;
          case 'm': /* strerror (errno)  */
            __pformat_puts (strerror (saved_errno), &stream);
            goto format_scan;

          case 'o':
          case 'u':
          case 'x':
          case 'X':
            /*
             * Unsigned integer values; octal, decimal or hexadecimal format...
             */
            stream.flags &= ~PFORMAT_POSITIVE;
#if __ENABLE_PRINTF128
        argval.__pformat_u128_t.t128.digits[1] = 0LL; /* no sign extend needed */
            if( length == PFORMAT_LENGTH_LLONG128 )
              argval.__pformat_u128_t.t128 = va_arg( argv, __tI128 );
            else
#endif
        if( length == PFORMAT_LENGTH_LLONG ) {
              /*
               * with an `unsigned long long' argument, which we
               * process `as is'...
               */
              argval.__pformat_ullong_t = va_arg( argv, unsigned long long );

            } else if( length == PFORMAT_LENGTH_LONG ) {
              /*
               * or with an `unsigned long', which we promote to
               * `unsigned long long'...
               */
              argval.__pformat_ullong_t = va_arg( argv, unsigned long );

            } else
            { /* or for any other size, which will have been promoted
               * to `unsigned int', we select only the appropriately sized
               * least significant segment, and again promote to the same
               * size as `unsigned long long'...
               */
              argval.__pformat_ullong_t = va_arg( argv, unsigned int );
              if( length == PFORMAT_LENGTH_SHORT )
                /*
                 * from `unsigned short'...
                 */
                argval.__pformat_ullong_t = argval.__pformat_ushort_t;

              else if( length == PFORMAT_LENGTH_CHAR )
                /*
                 * or even from `unsigned char'...
                 */
                argval.__pformat_ullong_t = argval.__pformat_uchar_t;
            }

            /* so we can pass any size of argument to either of two
             * common format handlers...
             */
            if( c == 'u' )
              /*
               * depending on whether output is to be encoded in
               * decimal format...
               */
              __pformat_int( argval, &stream );

            else
              /* or in octal or hexadecimal format...
               */
              __pformat_xint( c, argval, &stream );

            goto format_scan;

          case 'd':
          case 'i':
            /*
             * Signed integer values; decimal format...
             * This is similar to `u', but must process `argval' as signed,
             * and be prepared to handle negative numbers.
             */
            stream.flags |= PFORMAT_NEGATIVE;
#if __ENABLE_PRINTF128
            if( length == PFORMAT_LENGTH_LLONG128 ) {
              argval.__pformat_u128_t.t128 = va_arg( argv, __tI128 );
          goto skip_sign; /* skip sign extend */
            } else
#endif
            if( length == PFORMAT_LENGTH_LLONG ){
              /*
               * The argument is a `long long' type...
               */
              argval.__pformat_u128_t.t128.digits[0] = va_arg( argv, long long );
            } else if( length == PFORMAT_LENGTH_LONG ) {
              /*
               * or here, a `long' type...
               */
              argval.__pformat_u128_t.t128.digits[0] = va_arg( argv, long );
            } else
            { /* otherwise, it's an `int' type...
               */
              argval.__pformat_u128_t.t128.digits[0] = va_arg( argv, int );
              if( length == PFORMAT_LENGTH_SHORT )
                /*
                 * but it was promoted from a `short' type...
                 */
                argval.__pformat_u128_t.t128.digits[0] = argval.__pformat_short_t;
              else if( length == PFORMAT_LENGTH_CHAR )
                /*
                 * or even from a `char' type...
                 */
                argval.__pformat_u128_t.t128.digits[0] = argval.__pformat_char_t;
            }

            /* In any case, all share a common handler...
             */
        argval.__pformat_u128_t.t128.digits[1] = (argval.__pformat_llong_t < 0) ? -1LL : 0LL;
#if __ENABLE_PRINTF128
        skip_sign:
#endif
            __pformat_int( argval, &stream );
            goto format_scan;

          case 'p':
            /*
             * Pointer argument; format as hexadecimal, subject to...
             */
            if( (state == PFORMAT_INIT) && (stream.flags == flags) )
            {
              /* Here, the user didn't specify any particular
               * formatting attributes.  We must choose a default
               * which will be compatible with Microsoft's (broken)
               * scanf() implementation, (i.e. matching the default
               * used by MSVCRT's printf(), which appears to resemble
               * "%0.8X" for 32-bit pointers); in particular, we MUST
               * NOT adopt a GNU-like format resembling "%#x", because
               * Microsoft's scanf() will choke on the "0x" prefix.
               */
              stream.flags |= PFORMAT_ZEROFILL;
              stream.precision = 2 * sizeof( uintptr_t );
            }
            argval.__pformat_u128_t.t128.digits[0] = va_arg( argv, uintptr_t );
            argval.__pformat_u128_t.t128.digits[1] = 0;
            __pformat_xint( 'x', argval, &stream );
            goto format_scan;

          case 'e':
            /*
             * Floating point format, with lower case exponent indicator
             * and lower case `inf' or `nan' representation when required;
             * select lower case mode, and simply fall through...
             */
            stream.flags |= PFORMAT_XCASE;

            /* fallthrough */

          case 'E':
            /*
             * Floating point format, with upper case exponent indicator
             * and upper case `INF' or `NAN' representation when required,
             * (or lower case for all of these, on fall through from above);
             * select lower case mode, and simply fall through...
             */
#ifdef __ENABLE_DFP
            if( stream.flags & PFORMAT_DECIM32 )
              /* Is a 32bit decimal float */
              __pformat_efloat_decimal((_Decimal128)va_arg( argv, _Decimal32 ), &stream );
            else if( stream.flags & PFORMAT_DECIM64 )
              /*
               * Is a 64bit decimal float
               */
              __pformat_efloat_decimal((_Decimal128)va_arg( argv, _Decimal64 ), &stream );
            else if( stream.flags & PFORMAT_DECIM128 )
              /*
               * Is a 128bit decimal float
               */
              __pformat_efloat_decimal(va_arg( argv, _Decimal128 ), &stream );
            else
#endif /* __ENABLE_DFP */
            if( stream.flags & PFORMAT_LDOUBLE )
              /*
               * for a `long double' argument...
               */
              __pformat_efloat( va_arg( argv, long double ), &stream );

            else
              /* or just a `double', which we promote to `long double',
               * so the two may share a common format handler.
               */
              __pformat_efloat( (long double)(va_arg( argv, double )), &stream );

            goto format_scan;

          case 'f':
            /*
             * Fixed point format, using lower case for `inf' and
             * `nan', when appropriate; select lower case mode, and
             * simply fall through...
             */
            stream.flags |= PFORMAT_XCASE;

            /* fallthrough */

          case 'F':
            /*
             * Fixed case format using upper case, or lower case on
             * fall through from above, for `INF' and `NAN'...
             */
#ifdef __ENABLE_DFP
            if( stream.flags & PFORMAT_DECIM32 )
              /* Is a 32bit decimal float */
              __pformat_float_decimal((_Decimal128)va_arg( argv, _Decimal32 ), &stream );
            else if( stream.flags & PFORMAT_DECIM64 )
              /*
               * Is a 64bit decimal float
               */
              __pformat_float_decimal((_Decimal128)va_arg( argv, _Decimal64 ), &stream );
            else if( stream.flags & PFORMAT_DECIM128 )
              /*
               * Is a 128bit decimal float
               */
              __pformat_float_decimal(va_arg( argv, _Decimal128 ), &stream );
            else
#endif /* __ENABLE_DFP */
            if( stream.flags & PFORMAT_LDOUBLE )
              /*
               * for a `long double' argument...
               */
              __pformat_float( va_arg( argv, long double ), &stream );

            else
              /* or just a `double', which we promote to `long double',
               * so the two may share a common format handler.
               */
              __pformat_float( (long double)(va_arg( argv, double )), &stream );

            goto format_scan;

          case 'g':
            /*
             * Generalised floating point format, with lower case
             * exponent indicator when required; select lower case
             * mode, and simply fall through...
             */
            stream.flags |= PFORMAT_XCASE;

            /* fallthrough */

          case 'G':
            /*
             * Generalised floating point format, with upper case,
             * or on fall through from above, with lower case exponent
             * indicator when required...
             */
#ifdef __ENABLE_DFP
            if( stream.flags & PFORMAT_DECIM32 )
              /* Is a 32bit decimal float */
              __pformat_gfloat_decimal((_Decimal128)va_arg( argv, _Decimal32 ), &stream );
            else if( stream.flags & PFORMAT_DECIM64 )
              /*
               * Is a 64bit decimal float
               */
              __pformat_gfloat_decimal((_Decimal128)va_arg( argv, _Decimal64 ), &stream );
            else if( stream.flags & PFORMAT_DECIM128 )
              /*
               * Is a 128bit decimal float
               */
              __pformat_gfloat_decimal(va_arg( argv, _Decimal128 ), &stream );
            else
#endif /* __ENABLE_DFP */
           if( stream.flags & PFORMAT_LDOUBLE )
              /*
               * for a `long double' argument...
               */
              __pformat_gfloat( va_arg( argv, long double ), &stream );

            else
              /* or just a `double', which we promote to `long double',
               * so the two may share a common format handler.
               */
              __pformat_gfloat( (long double)(va_arg( argv, double )), &stream );

            goto format_scan;

          case 'a':
            /*
             * Hexadecimal floating point format, with lower case radix
             * and exponent indicators; select the lower case mode, and
             * fall through...
             */
            stream.flags |= PFORMAT_XCASE;

            /* fallthrough */

          case 'A':
            /*
             * Hexadecimal floating point format; handles radix and
             * exponent indicators in either upper or lower case...
             */
            if( sizeof( double ) != sizeof( long double ) && stream.flags & PFORMAT_LDOUBLE )
              /*
               * with a `long double' argument...
               */
              __pformat_xldouble( va_arg( argv, long double ), &stream );

            else
              /* or just a `double'.
               */
              __pformat_xdouble( va_arg( argv, double ), &stream );

            goto format_scan;

          case 'n':
            /*
             * Save current output character count...
             */
            if( length == PFORMAT_LENGTH_CHAR )
              /*
               * to a signed `char' destination...
               */
              *va_arg( argv, char * ) = stream.count;

            else if( length == PFORMAT_LENGTH_SHORT )
              /*
               * or to a signed `short'...
               */
              *va_arg( argv, short * ) = stream.count;

            else if( length == PFORMAT_LENGTH_LONG )
              /*
               * or to a signed `long'...
               */
              *va_arg( argv, long * ) = stream.count;

            else if( length == PFORMAT_LENGTH_LLONG )
              /*
               * or to a signed `long long'...
               */
              *va_arg( argv, long long * ) = stream.count;

            else
              /*
               * or, by default, to a signed `int'.
               */
              *va_arg( argv, int * ) = stream.count;

            goto format_scan;

          /* Argument length modifiers...
           * These are non-terminal; each sets the format parser
           * into the PFORMAT_END state, and ends with a `break'.
           */
          case 'h':
            /*
             * Interpret the argument as explicitly of a `short'
             * or `char' data type, truncated from the standard
             * length defined for integer promotion.
             */
            if( *fmt == 'h' )
            {
              /* Modifier is `hh'; data type is `char' sized...
               * Skip the second `h', and set length accordingly.
               */
              ++fmt;
              length = PFORMAT_LENGTH_CHAR;
            }

            else
              /* Modifier is `h'; data type is `short' sized...
               */
              length = PFORMAT_LENGTH_SHORT;

            state = PFORMAT_END;
            break;

          case 'j':
            /*
             * Interpret the argument as being of the same size as
             * a `intmax_t' entity...
             */
            length = __pformat_arg_length( intmax_t );
            state = PFORMAT_END;
            break;

#         ifdef _WIN32

            case 'I':
              /*
               * The MSVCRT implementation of the printf() family of
               * functions explicitly uses...
               */
#ifdef __ENABLE_PRINTF128
              if( (fmt[0] == '1') && (fmt[1] == '2') && (fmt[2] == '8')){
                length = PFORMAT_LENGTH_LLONG128;
                fmt += 3;
              } else
#endif
              if( (fmt[0] == '6') && (fmt[1] == '4') )
              {
                /* I64' instead of `ll',
                 * when referring to `long long' integer types...
                 */
                length = PFORMAT_LENGTH_LLONG;
                fmt += 2;
              } else
              if( (fmt[0] == '3') && (fmt[1] == '2') )
              {
                /* and `I32' instead of `l',
                 * when referring to `long' integer types...
                 */
                length = PFORMAT_LENGTH_LONG;
                fmt += 2;
              }

              else
                /* or unqualified `I' instead of `t' or `z',
                 * when referring to `ptrdiff_t' or `size_t' entities;
                 * (we will choose to map it to `ptrdiff_t').
                 */
                length = __pformat_arg_length( ptrdiff_t );

              state = PFORMAT_END;
              break;

#         endif

#ifdef __ENABLE_DFP
          case 'H':
              stream.flags |= PFORMAT_DECIM32;
              state = PFORMAT_END;
              break;

          case 'D':
            /*
             * Interpret the argument as explicitly of a
             * `_Decimal64' or `_Decimal128' data type.
             */
            if( *fmt == 'D' )
            {
              /* Modifier is `DD'; data type is `_Decimal128' sized...
               * Skip the second `D', and set length accordingly.
               */
              ++fmt;
              stream.flags |= PFORMAT_DECIM128;
            }

            else
              /* Modifier is `D'; data type is `_Decimal64' sized...
               */
              stream.flags |= PFORMAT_DECIM64;

              state = PFORMAT_END;
              break;
#endif /* __ENABLE_DFP */
          case 'l':
            /*
             * Interpret the argument as explicitly of a
             * `long' or `long long' data type.
             */
            if( *fmt == 'l' )
            {
              /* Modifier is `ll'; data type is `long long' sized...
               * Skip the second `l', and set length accordingly.
               */
              ++fmt;
              length = PFORMAT_LENGTH_LLONG;
            }

            else
              /* Modifier is `l'; data type is `long' sized...
               */
              length = PFORMAT_LENGTH_LONG;

            state = PFORMAT_END;
            break;

          case 'L':
            /*
             * Identify the appropriate argument as a `long double',
             * when associated with `%a', `%A', `%e', `%E', `%f', `%F',
             * `%g' or `%G' format specifications.
             */
            stream.flags |= PFORMAT_LDOUBLE;
            state = PFORMAT_END;
            break;

          case 't':
            /*
             * Interpret the argument as being of the same size as
             * a `ptrdiff_t' entity...
             */
            length = __pformat_arg_length( ptrdiff_t );
            state = PFORMAT_END;
            break;

          case 'z':
            /*
             * Interpret the argument as being of the same size as
             * a `size_t' entity...
             */
            length = __pformat_arg_length( size_t );
            state = PFORMAT_END;
            break;

          /* Precision indicator...
           * May appear once only; it must precede any modifier
           * for argument length, or any data type specifier.
           */
          case '.':
            if( state < PFORMAT_GET_PRECISION )
            {
              /* We haven't seen a precision specification yet,
               * so initialise it to zero, (in case no digits follow),
               * and accept any following digits as the precision.
               */
              stream.precision = 0;
              width_spec = &stream.precision;
              state = PFORMAT_GET_PRECISION;
            }

            else
              /* We've already seen a precision specification,
               * so this is just junk; proceed to end game.
               */
              state = PFORMAT_END;

            /* Either way, we must not fall through here.
             */
            break;

          /* Variable field width, or precision specification,
           * derived from the argument list...
           */
          case '*':
            /*
             * When this appears...
             */
            if(   width_spec
            &&  ((state == PFORMAT_INIT) || (state == PFORMAT_GET_PRECISION)) )
            {
              /* in proper context; assign to field width
               * or precision, as appropriate.
               */
              if( (*width_spec = va_arg( argv, int )) < 0 )
              {
                /* Assigned value was negative...
                 */
                if( state == PFORMAT_INIT )
                {
                  /* For field width, this is equivalent to
                   * a positive value with the `-' flag...
                   */
                  stream.flags |= PFORMAT_LJUSTIFY;
                  stream.width = -stream.width;
                }

                else
                  /* while as a precision specification,
                   * it should simply be ignored.
                   */
                  stream.precision = PFORMAT_IGNORE;
              }
            }

            else
              /* out of context; give up on width and precision
               * specifications for this conversion.
               */
              state = PFORMAT_END;

            /* Mark as processed...
             * we must not see `*' again, in this context.
             */
            width_spec = NULL;
            break;

          /* Formatting flags...
           * Must appear while in the PFORMAT_INIT state,
           * and are non-terminal, so again, end with `break'.
           */
          case '#':
            /*
             * Select alternate PFORMAT_HASHED output style.
             */
            if( state == PFORMAT_INIT )
              stream.flags |= PFORMAT_HASHED;
            break;

          case '+':
            /*
             * Print a leading sign with numeric output,
             * for both positive and negative values.
             */
            if( state == PFORMAT_INIT )
              stream.flags |= PFORMAT_POSITIVE;
            break;

          case '-':
            /*
             * Select left justification of displayed output
             * data, within the output field width, instead of
             * the default flush right justification.
             */
            if( state == PFORMAT_INIT )
              stream.flags |= PFORMAT_LJUSTIFY;
            break;

            case '\'':
              /*
               * This is an XSI extension to the POSIX standard,
               * which we do not support, at present.
               */
              if (state == PFORMAT_INIT)
              {
                stream.flags |= PFORMAT_GROUPED; /* $$$$ */
                int len; wchar_t rpchr;
                mbstate_t cstate = {0};
                if ((len = mbrtowc( &rpchr, localeconv()->thousands_sep, 16, &cstate)) > 0)
                    stream.thousands_chr = rpchr;
                stream.thousands_chr_len = len;
              }
              break;

          case '\x20':
            /*
             * Reserve a single space, within the output field,
             * for display of the sign of signed data; this will
             * be occupied by the minus sign, if the data value
             * is negative, or by a plus sign if the data value
             * is positive AND the `+' flag is also present, or
             * by a space otherwise.  (Technically, this flag
             * is redundant, if the `+' flag is present).
             */
            if( state == PFORMAT_INIT )
              stream.flags |= PFORMAT_ADDSPACE;
            break;

          case '0':
            /*
             * May represent a flag, to activate the `pad with zeros'
             * option, or it may simply be a digit in a width or in a
             * precision specification...
             */
            if( state == PFORMAT_INIT )
            {
              /* This is the flag usage...
               */
              stream.flags |= PFORMAT_ZEROFILL;
              break;
            }

            /* fallthrough */

          default:
            /*
             * If we didn't match anything above, then we will check
             * for digits, which we may accumulate to generate field
             * width or precision specifications...
             */
            if( (state < PFORMAT_END) && ('9' >= c) && (c >= '0') )
            {
              if( state == PFORMAT_INIT )
                /*
                 * Initial digits explicitly relate to field width...
                 */
                state = PFORMAT_SET_WIDTH;

              else if( state == PFORMAT_GET_PRECISION )
                /*
                 * while those following a precision indicator
                 * explicitly relate to precision.
                 */
                state = PFORMAT_SET_PRECISION;

              if( width_spec )
              {
                /* We are accepting a width or precision specification...
                 */
                if( *width_spec < 0 )
                  /*
                   * and accumulation hasn't started yet; we simply
                   * initialise the accumulator with the current digit
                   * value, converting from ASCII to decimal.
                   */
                  *width_spec = c - '0';

                else
                  /* Accumulation has already started; we perform a
                   * `leftwise decimal digit shift' on the accumulator,
                   * (i.e. multiply it by ten), then add the decimal
                   * equivalent value of the current digit.
                   */
                  *width_spec = *width_spec * 10 + c - '0';
              }
            }

            else
            {
              /* We found a digit out of context, or some other character
               * with no designated meaning; reject this format specification,
               * backtrack, and emit it as literal text...
               */
              fmt = backtrack;
      #ifndef __BUILD_WIDEAPI
              __pformat_putc( '%', &stream );
      #else
          stream.width = stream.precision = PFORMAT_IGNORE;
          __pformat_wputchars( L"%", 1, &stream );
      #endif
              goto format_scan;
            }
        }
      }
    }

    else
      /* We just parsed a character which is not included within any format
       * specification; we simply emit it as a literal.
       */
  #ifndef __BUILD_WIDEAPI
      __pformat_putc( c, &stream );
  #else
      if (literal_string_start == NULL)
        literal_string_start = fmt - 1;
  #endif
  }

  /* When we have fully dispatched the format string, the return value is the
   * total number of bytes we transferred to the output destination.
   */
#ifdef __BUILD_WIDEAPI
  if (literal_string_start)
  {
    stream.width = stream.precision = PFORMAT_IGNORE;
    __pformat_wputchars( literal_string_start, fmt - literal_string_start - 1, &stream );
  }
#endif

  return stream.count;
}

/* $RCSfile: pformat.c,v $Revision: 1.9 $: end of file */

