    // Rowley C Compiler, runtime support.
    //
    // Copyright (c) 2001, 2002 Rowley Associates Limited.
    //
    // This file may be distributed under the terms of the License Agreement
    // provided with this software.
    //
    // THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE
    // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

    #ifndef __vfprintf_H
    #define __vfprintf_H

    #if defined(__CROSSWORKS) || defined(__CROSSWORKS_ARM)
    #include "__argtype.h"
    #else
    #include "../../lib/hosted__argtype.h"
    #endif

    #ifndef __MEMSPACE
    #define __MEMSPACE
    #endif

    #ifndef __CODE
    #define __CODE
    #endif

    #ifdef __cplusplus
    extern "C" {
    #endif

    typedef struct
    {
      int is_string;
      size_t charcount;
      size_t maxchars;
      union
      {
        char *string;
        int (*output_fn)(int);
      } u;
    } __printf_t;

    typedef struct
    {
      char is_string;
    } __scanf_t;

    typedef struct
    {
      char is_string;
      char *string;
    }  __string_scanf_t;

    typedef struct
    {
      char is_string;
      int (*getc_fn)(void);
      int (*ungetc_fn)(int);
    } __stream_scanf_t;

    // Printer formatting flags.
    #define FORMAT_LONG                 (1<<0)
    #define FORMAT_LONG_LONG            (1<<1)
    #define FORMAT_SHORT                (1<<2)
    #define FORMAT_CHAR                 (1<<3)
    #define FORMAT_LEFT_JUSTIFY         (1<<4)
    #define FORMAT_SIGNED               (1<<5)
    #define FORMAT_SPACE                (1<<6)
    #define FORMAT_ALTERNATIVE          (1<<7)
    #define FORMAT_HAVE_PRECISION       (1<<8)
    #define FORMAT_ZERO_FILL            (1<<9)
    #define FORMAT_FLOAT_E              (1<<10)
    #define FORMAT_FLOAT_F              (1<<11)
    #define FORMAT_FLOAT_A              (1<<12)
    #define FORMAT_CAPITALS             (1<<13)
    #define FORMAT_INPUT_SIGNED         (1<<14)

    // Combinations of flags used internally...
    #define FORMAT_NEGATIVE             (FORMAT_SIGNED | FORMAT_SPACE)
    #define FORMAT_FLOAT_G              (FORMAT_FLOAT_E | FORMAT_FLOAT_F)

    // Helper variables.
    extern __CODE const char __hex_uc[16];
    extern __CODE const char __hex_lc[16];

    // Create _c versions of the functions
    #ifdef __VFxxxxx_C
    #define __vfprintf __vfprintf_c
    #define __vfscanf  __vfscanf_c
    #endif

    // Standard formatting routine.
    int __vfprintf(__printf_t *p, __MEMSPACE const char *fmt, ARGTYPE args);
    int __vfscanf(__scanf_t *p, __MEMSPACE const unsigned char *fmt, ARGTYPE argv);

    #ifdef __cplusplus
    }
    #endif

    #endif