⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfnprintf.cxx

📁 ecos实时嵌入式操作系统
💻 CXX
📖 第 1 页 / 共 3 页
字号:
//===========================================================================////      vfnprintf.c////      I/O routines for vfnprintf() for use with ANSI C library////===========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//===========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):    jlarmour// Contributors: // Date:         2000-04-20// Purpose:     // Description: // Usage:       ////####DESCRIPTIONEND####////===========================================================================//// This code is based on original code with the following copyright:///*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Chris Torek. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */// CONFIGURATION#include <pkgconf/libc_stdio.h>   // Configuration header#include <pkgconf/libc_i18n.h>    // Configuration header for mb support// INCLUDES#include <cyg/infra/cyg_type.h>   // Common type definitions and support#include <stdarg.h>               // Variable argument definitions#include <stdio.h>                // Standard header for all stdio files#include <string.h>               // memchr() and strlen() functions#include <cyg/libc/stdio/stream.hxx> // C library streams#ifdef CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT# include <float.h>      // for DBL_DIG etc. below# include <math.h>       // for modf()# include <sys/ieeefp.h> // Cyg_libm_ieee_double_shape_type# define MAXFRACT  DBL_DIG# define MAXEXP    DBL_MAX_10_EXP# define BUF             (MAXEXP+MAXFRACT+1)     /* + decimal point */# define DEFPREC         6static intcvt( double, int, int, char *, int, char *, char * );#else // ifdef CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT# define BUF            40#endif // ifdef CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT/* * Actual printf innards. * * This code is large and complicated... */#ifdef CYGINT_LIBC_I18N_MB_REQUIREDtypedef int (*mbtowc_fn_type)(wchar_t *, const char *, size_t, int *);externC mbtowc_fn_type __get_current_locale_mbtowc_fn();#endif/* * Macros for converting digits to letters and vice versa */#define to_digit(c)     ((c) - '0')#define is_digit(c)     ((unsigned)to_digit(c) <= 9)#define to_char(n)      ((n) + '0')/* * Flags used during conversion. */#define ALT             0x001           /* alternate form */#define HEXPREFIX       0x002           /* add 0x or 0X prefix */#define LADJUST         0x004           /* left adjustment */#define LONGDBL         0x008           /* long double; unimplemented */#define LONGINT         0x010           /* long integer */#define QUADINT         0x020           /* quad integer */#define SHORTINT        0x040           /* short integer */#define ZEROPAD         0x080           /* zero (as opposed to blank) pad */#define FPT             0x100           /* Floating point number */#define SIZET           0x200           /* size_t */externC int vfnprintf ( FILE *stream, size_t n, const char *format, va_list arg){        char *fmt;     /* format string */        int ch;        /* character from fmt */        int x, y;      /* handy integers (short term usage) */        char *cp;      /* handy char pointer (short term usage) */        int flags;     /* flags as above */#ifdef CYGINT_LIBC_I18N_MB_REQUIRED	int state = 0; /* state for mbtowc conversion */	mbtowc_fn_type mbtowc_fn;#endif        int ret;                /* return value accumulator */        int width;              /* width from format (%8d), or 0 */        int prec;               /* precision from format (%.3d), or -1 */        char sign;              /* sign prefix (' ', '+', '-', or \0) */        wchar_t wc;#define quad_t    long long#define u_quad_t  unsigned long long        u_quad_t _uquad;        /* integer arguments %[diouxX] */        enum { OCT, DEC, HEX } base;/* base for [diouxX] conversion */        int dprec;              /* a copy of prec if [diouxX], 0 otherwise */        int fieldsz;            /* field size expanded by sign, etc */        int realsz;             /* field size expanded by dprec */        int size;               /* size of converted field or string */        char *xdigs;            /* digits for [xX] conversion */#define NIOV 8        char buf[BUF];          /* space for %c, %[diouxX], %[eEfgG] */        char ox[2];             /* space for 0x hex-prefix */#ifdef CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT        char softsign;          /* temporary negative sign for floats */        double _double;         /* double precision arguments %[eEfgG] */        int fpprec;             /* `extra' floating precision in [eEfgG] */#endif        /*         * Choose PADSIZE to trade efficiency vs. size.  If larger printf         * fields occur frequently, increase PADSIZE and make the initialisers         * below longer.         */#define PADSIZE 16              /* pad chunk size */        static char blanks[PADSIZE] =         {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};        static char zeroes[PADSIZE] =         {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};#define MIN(a, b) ((a) < (b) ? (a) : (b))        /*         * BEWARE, these `goto error' on error, and PAD uses `n'.         */#define PRINT(ptr, len)                                                      \CYG_MACRO_START                                                              \    cyg_ucount32 length = MIN( (cyg_ucount32) len, n - ret - 1);             \    if (((Cyg_StdioStream *)stream)->write( (const cyg_uint8 *)ptr,          \                                            length, &length ))               \        goto error;                                                          \    if (length < (cyg_ucount32)len) {                                        \        ret += length;                                                       \        goto done;                                                           \    }                                                                        \CYG_MACRO_END#define PAD(howmany, with)                                                   \CYG_MACRO_START                                                              \    if ((x = (howmany)) > 0) {                                               \        while (x > PADSIZE) {                                                \            PRINT(with, PADSIZE);                                            \            x -= PADSIZE;                                                    \        }                                                                    \        PRINT(with, x);                                                      \    }                                                                        \CYG_MACRO_END        /*         * To extend shorts properly, we need both signed and unsigned         * argument extraction methods.         */#define SARG() \        (flags&QUADINT ? va_arg(arg, cyg_int64) : \            flags&LONGINT ? va_arg(arg, long) : \            flags&SHORTINT ? (long)(short)va_arg(arg, int) : \            flags&SIZET ? va_arg(arg, size_t) : \            (long)va_arg(arg, int))#define UARG() \        (flags&QUADINT ? va_arg(arg, cyg_uint64) : \            flags&LONGINT ? va_arg(arg, unsigned long) : \            flags&SHORTINT ? (unsigned long)(unsigned short)va_arg(arg, int) : \            flags&SIZET ? va_arg(arg, size_t) : \            (unsigned long)va_arg(arg, unsigned int))        xdigs = NULL;  // stop compiler whinging        fmt = (char *)format;        ret = 0;#ifdef CYGINT_LIBC_I18N_MB_REQUIRED	mbtowc_fn = __get_current_locale_mbtowc_fn();#endif        /*         * Scan the format for conversions (`%' character).         */        for (;;) {                cp = (char *)fmt;#ifndef CYGINT_LIBC_I18N_MB_REQUIRED		while ((x = ((wc = *fmt) != 0))) {#else                while ((x = mbtowc_fn (&wc, fmt, MB_CUR_MAX, &state)) > 0) {#endif                        fmt += x;                        if (wc == '%') {                                fmt--;                                break;                        }                }                if ((y = fmt - cp) != 0) {                        PRINT(cp, y);                        ret += y;                }                if ((x <= 0) || (ret >= (int)n))  // @@@ this check with n isn't good enough                        goto done;                fmt++;          /* skip over '%' */                flags = 0;                dprec = 0;#ifdef CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT                fpprec = 0;#endif                width = 0;                prec = -1;                sign = '\0';rflag:          ch = *fmt++;reswitch:       switch (ch) {                case ' ':                        /*                         * ``If the space and + flags both appear, the space                         * flag will be ignored.''                         *      -- ANSI X3J11                         */                        if (!sign)                                sign = ' ';                        goto rflag;                case '#':                        flags |= ALT;                        goto rflag;                case '*':                        /*                         * ``A negative field width argument is taken as a                         * - flag followed by a positive field width.''                         *      -- ANSI X3J11                         * They don't exclude field widths read from args.                         */                        if ((width = va_arg(arg, int)) >= 0)                                goto rflag;                        width = -width;                        /* FALLTHROUGH */                case '-':                        flags |= LADJUST;                        goto rflag;                case '+':                        sign = '+';                        goto rflag;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -