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

📄 iovfprintf.c

📁 vxworks源码源码解读是学习vxworks的最佳途径
💻 C
📖 第 1 页 / 共 2 页
字号:
/* This has been copied from the gnu source tree *//* Make all changes there, not here! */#ifdef __cplusplusextern "C" {#endif#ifndef _N_char __iovfprintf_o = 0;#elsechar _N_ = 0;#endif#ifdef __cplusplus}#endif#include "vxWorks.h"/* Copyright (C) 1993 Free Software FoundationThis file is part of the GNU IO Library.  This library is freesoftware; you can redistribute it and/or modify it under theterms of the GNU General Public License as published by theFree Software Foundation; either version 2, or (at your option)any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this library; see the file COPYING.  If not, write to the FreeSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.As a special exception, if you link this library with filescompiled with a GNU compiler to produce an executable, this does not causethe resulting executable to be covered by the GNU General Public License.This exception does not however invalidate any other reasons whythe executable file might be covered by the GNU General Public License. *//* * Copyright (c) 1990 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley.  The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */#if defined(LIBC_SCCS) && !defined(lint)static char sccsid[] = "%W% (Berkeley) %G%";#endif /* LIBC_SCCS and not lint *//* * Actual printf innards. * * This code is large and complicated... */#include <sys/types.h>#include "libioP.h"#include <string.h>#ifdef __STDC__#include <stdarg.h>#else#include <varargs.h>#endif#ifndef _IO_USE_DTOAint __cvt_double __P((double number, register int prec, int flags, int *signp, int fmtch, char *startp, char *endp));#endif/* * Define FLOATING_POINT to get floating point. */#ifndef	NO_FLOATING_POINT#define	FLOATING_POINT#endif/* end of configuration stuff *//* * Helper "class" for `fprintf to unbuffered': creates a * temporary buffer. */struct helper_file{  struct _IO_FILE_plus _f;  _IO_FILE *_put_stream;};static int_IO_helper_overflow (fp, c)     _IO_FILE *fp;     int c;{  _IO_FILE *target = ((struct helper_file*)fp)->_put_stream;  int used = fp->_IO_write_ptr - fp->_IO_write_base;  if (used)    {      _IO_sputn(target, fp->_IO_write_base, used);      fp->_IO_write_ptr -= used;    }  return _IO_putc (c, fp);}static struct _IO_jump_t _IO_helper_jumps = {  JUMP_INIT_DUMMY,  JUMP_INIT(finish, _IO_default_finish),  JUMP_INIT(overflow, _IO_helper_overflow),  JUMP_INIT(underflow, _IO_default_underflow),  JUMP_INIT(uflow, _IO_default_uflow),  JUMP_INIT(pbackfail, _IO_default_pbackfail),  JUMP_INIT(xsputn, _IO_default_xsputn),  JUMP_INIT(xsgetn, _IO_default_xsgetn),  JUMP_INIT(seekoff, _IO_default_seekoff),  JUMP_INIT(seekpos, _IO_default_seekpos),  JUMP_INIT(setbuf, _IO_default_setbuf),  JUMP_INIT(sync, _IO_default_sync),  JUMP_INIT(doallocate, _IO_default_doallocate),  JUMP_INIT(read, _IO_default_read),  JUMP_INIT(write, _IO_default_write),  JUMP_INIT(seek, _IO_default_seek),  JUMP_INIT(close, _IO_default_close),  JUMP_INIT(stat, _IO_default_stat)};static inthelper_vfprintf (fp, fmt0, ap)     _IO_FILE *fp;     char const *fmt0;     _IO_va_list ap;{  char buf[_IO_BUFSIZ];  struct helper_file helper;  register _IO_FILE *hp = (_IO_FILE*)&helper;  int result, to_flush;  /* initialize helper */  helper._put_stream = fp;  hp->_IO_write_base = buf;  hp->_IO_write_ptr = buf;  hp->_IO_write_end = buf+_IO_BUFSIZ;  hp->_IO_file_flags = _IO_MAGIC|_IO_NO_READS;  _IO_JUMPS(hp) = &_IO_helper_jumps;    /* Now print to helper instead. */  result = _IO_vfprintf(hp, fmt0, ap);  /* Now flush anything from the helper to the fp. */  if ((to_flush = hp->_IO_write_ptr - hp->_IO_write_base) > 0)    {      if (_IO_sputn(fp, hp->_IO_write_base, to_flush) != to_flush)	return EOF;    }  return result;}#ifdef FLOATING_POINT#include "floatio.h"#define	BUF		(MAXEXP+MAXFRACT+1)	/* + decimal point */#define	DEFPREC		6extern double modf __P((double, double*));#else /* no FLOATING_POINT */#define	BUF		40#endif /* FLOATING_POINT *//* * 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	LONGINT		0x01		/* long integer */#define	LONGDBL		0x02		/* long double; unimplemented */#define	SHORTINT	0x04		/* short integer */#define	ALT		0x08		/* alternate form */#define	LADJUST		0x10		/* left adjustment */#define	ZEROPAD		0x20		/* zero (as opposed to blank) pad */#define	HEXPREFIX	0x40		/* add 0x or 0X prefix */int_IO_vfprintf (fp, fmt0, ap)     _IO_FILE *fp;     char const *fmt0;     _IO_va_list ap;{	register const char *fmt; /* format string */	register int ch;	/* character from fmt */	register int n;		/* handy integer (short term usage) */	register char *cp;	/* handy char pointer (short term usage) */	const char *fmark;	/* for remembering a place in fmt */	register int flags;	/* flags as above */	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) */#ifdef FLOATING_POINT	int softsign;		/* temporary negative sign for floats */	double _double;		/* double precision arguments %[eEfgG] */#ifndef _IO_USE_DTOA	int fpprec;		/* `extra' floating precision in [eEfgG] */#endif#endif	unsigned long _ulong;	/* integer arguments %[diouxX] */	enum { OCT, DEC, HEX } base;/* base for [diouxX] conversion */	int dprec;		/* a copy of prec if [diouxX], 0 otherwise */	int dpad;		/* extra 0 padding needed for integers */	int fieldsz;		/* field size expanded by sign, dpad etc */	/* The initialization of 'size' is to suppress a warning that	   'size' might be used unitialized.  It seems gcc can't	   quite grok this spaghetti code ... */	int size = 0;		/* size of converted field or string */	char buf[BUF];		/* space for %c, %[diouxX], %[eEfgG] */	char ox[2];		/* space for 0x hex-prefix */	/*	 * BEWARE, these `goto error' on error, and PAD uses `n'.	 */#define	PRINT(ptr, len) \  do { if (_IO_sputn(fp,ptr, len) != len) goto error; } while (0)#define PAD_SP(howmany) if (_IO_padn(fp, ' ', howmany) < (howmany)) goto error;#define PAD_0(howmany) if (_IO_padn(fp, '0', howmany) < (howmany)) goto error;	/*	 * To extend shorts properly, we need both signed and unsigned	 * argument extraction methods.	 */#define	SARG() \	(flags&LONGINT ? va_arg(ap, long) : \	    flags&SHORTINT ? (long)(short)va_arg(ap, int) : \	    (long)va_arg(ap, int))#define	UARG() \	(flags&LONGINT ? va_arg(ap, unsigned long) : \	    flags&SHORTINT ? (unsigned long)(unsigned short)va_arg(ap, int) : \	    (unsigned long)va_arg(ap, unsigned int))	/* optimise stderr (and other unbuffered Unix files) */	if (fp->_IO_file_flags & _IO_UNBUFFERED)	    return helper_vfprintf(fp, fmt0, ap);	fmt = fmt0;	ret = 0;	/*	 * Scan the format for conversions (`%' character).	 */	for (;;) {		for (fmark = fmt; (ch = *fmt) != '\0' && ch != '%'; fmt++)			/* void */;		if ((n = fmt - fmark) != 0) {			PRINT(fmark, n);			ret += n;		}		if (ch == '\0')			goto done;		fmt++;		/* skip over '%' */		flags = 0;		dprec = 0;#if defined(FLOATING_POINT) && !defined (_IO_USE_DTOA)		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(ap, int)) >= 0)				goto rflag;			width = -width;			/* FALLTHROUGH */		case '-':			flags |= LADJUST;			flags &= ~ZEROPAD; /* '-' disables '0' */			goto rflag;		case '+':			sign = '+';			goto rflag;		case '.':			if ((ch = *fmt++) == '*') {				n = va_arg(ap, int);				prec = n < 0 ? -1 : n;				goto rflag;			}			n = 0;			while (is_digit(ch)) {				n = 10 * n + to_digit(ch);				ch = *fmt++;			}			prec = n < 0 ? -1 : n;			goto reswitch;		case '0':			/*			 * ``Note that 0 is taken as a flag, not as the			 * beginning of a field width.''			 *	-- ANSI X3J11			 */			if (!(flags & LADJUST))			    flags |= ZEROPAD; /* '-' disables '0' */			goto rflag;		case '1': case '2': case '3': case '4':		case '5': case '6': case '7': case '8': case '9':			n = 0;			do {				n = 10 * n + to_digit(ch);				ch = *fmt++;			} while (is_digit(ch));			width = n;			goto reswitch;#ifdef FLOATING_POINT		case 'L':			flags |= LONGDBL;			goto rflag;#endif		case 'h':			flags |= SHORTINT;			goto rflag;		case 'l':			flags |= LONGINT;			goto rflag;		case 'c':			*(cp = buf) = va_arg(ap, int);			size = 1;			sign = '\0';			break;		case 'D':			flags |= LONGINT;			/*FALLTHROUGH*/		case 'd':		case 'i':			_ulong = SARG();			if ((long)_ulong < 0) {				_ulong = -_ulong;				sign = '-';			}			base = DEC;			goto number;#ifdef FLOATING_POINT		case 'e':		case 'E':		case 'f':		case 'F':		case 'g':		case 'G':			_double = va_arg(ap, double);#ifdef _IO_USE_DTOA			{			    int fmt_flags = 0;			    int fill = ' ';			    if (flags & ALT)				fmt_flags |= _IO_SHOWPOINT;			    if (flags & LADJUST)				fmt_flags |= _IO_LEFT;			    else if (flags & ZEROPAD)				fmt_flags |= _IO_INTERNAL, fill = '0';			    n = _IO_outfloat(_double, fp, ch, width,					     prec < 0 ? DEFPREC : prec,					     fmt_flags, sign, fill);			    if (n < 0)				goto error;			    ret += n;			}			/* CHECK ERROR! */			continue;#else			/*			 * don't do unrealistic precision; just pad it with			 * zeroes later, so buffer size stays rational.			 */			if (prec > MAXFRACT) {				if ((ch != 'g' && ch != 'G') || (flags&ALT))					fpprec = prec - MAXFRACT;				prec = MAXFRACT;			} else if (prec == -1)				prec = DEFPREC;			/* __cvt_double may have to round up before the			   "start" of its buffer, i.e.			   ``intf("%.2f", (double)9.999);'';			   if the first character is still NUL, it did.			   softsign avoids negative 0 if _double < 0 but			   no significant digits will be shown. */			cp = buf;			*cp = '\0';			size = __cvt_double(_double, prec, flags, &softsign,					    ch, cp, buf + sizeof(buf));			if (softsign)				sign = '-';			if (*cp == '\0')				cp++;			break;#endif#endif /* FLOATING_POINT */		case 'n':			if (flags & LONGINT)				*va_arg(ap, long *) = ret;			else if (flags & SHORTINT)				*va_arg(ap, short *) = ret;			else				*va_arg(ap, int *) = ret;			continue;	/* no output */		case 'O':			flags |= LONGINT;			/*FALLTHROUGH*/		case 'o':			_ulong = UARG();			base = OCT;			goto nosign;		case 'p':			/*			 * ``The argument shall be a pointer to void.  The			 * value of the pointer is converted to a sequence			 * of printable characters, in an implementation-			 * defined manner.''			 *	-- ANSI X3J11			 */

⌨️ 快捷键说明

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