ttyio.c
来自「在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LE」· C语言 代码 · 共 771 行 · 第 1/2 页
C
771 行
/*
* FILENAME: ttyio.c
*
* Copyright 1995- 2000 By InterNiche Technologies Inc. All rights reserved
*
* This printf was
* originally designed to work on large model C on Intel 80x86 CPUs
* even if the stack segment != data segment. It assumes a "putchar"
* that does \n expansions and puts chars to stdout. An sprintf cound
* be built by redirecting putchar() to a buffer. (ie "#define
* putchar(c) bufchar(c, buf)").
*
* It currently understands: %d, %x, %u, %ld, %lx, %s, %c, %p.
* %lu is treated as %ld; This only works for values up to 2147483647.
*
* This code is is NOT reentrant or sharable. It
* is designed for DOS TSRs, device drivers, etc. not for a system
* library. If you are working on an embedded system which already
* supports a printf, you should try to use that. Field width support
* is switchable via FIELDWIDTH below. This files routines take about
* 928 bytes with FIELDWIDTH switched out and about 720 bytes more
* with it switched in. (Compiled without stack probes on Microsoft c
* 5.1 small model ). Numerics are not trucated to fit field widths.
*
* MODULE: MISCLIB
*
* ROUTINES: dprintf(), printf(), sprintf(), doprint(), declong(),
*
* PORTABLE: yes
*/
/* Additional Copyrights: */
/* Portions Copyright 1990-1994 by NetPort Software */
#define _IN_TTYIO_ 1 /* switch to help out ipport.h */
#include "ipport.h"
#ifdef PRINTF_STDARG
#include <stdarg.h>
#endif
#include "zprint.h"
#include "errtask.h"
/* if target should not use target build environment's printf */
#ifndef NATIVE_PRINTF
#define FIELDWIDTH 1 /* flag to switch in Field Width code */
#define LINESIZE 144 /* max # chars per field */
int maxfieldlen = LINESIZE; /* this can be set to control precision */
#ifdef FIELDWIDTH
int setnum(char **); /* fetch fieldwidth value from string */
int fplen(char *, void *); /* get field length of var */
#endif /* FIELDWIDTH */
char digits[] = {"0123456789ABCDEF"};
/* local doprint helper routines. All take target as in doprint() */
static void hexbyte(char ** target, unsigned x);
static void hexword(char ** target, unsigned x);
static void declong(char ** target, long lg);
#ifdef PRINTF_STDARG
void doprint(char * target, char * sp, va_list va);
#else
void doprint(char * target, char * sp, int * vp);
#endif
/* (yaxon del) */
/*void dputchar(int chr); port-defined putchar substitue */
#ifdef dprintf
#undef dprintf
#endif
#ifdef printf
#undef printf
#endif
#define doputchar(c) { if(target) * target++ = c; else dputchar(c); }
#ifdef PRINTF_STDARG
/* FUNCTION: dprintf()
*
* PARAM1: char * fmt
* PARAM2: ...
*
* RETURNS:
*/
void
dprintf(char * fmt, ...)
{
/*va_list a;
va_start(a, fmt);
doprint(NULL, fmt, a);
va_end(a);*/
Printu(fmt);
}
/* FUNCTION: printf()
*
* PARAM1: char * fmt
* PARAM2: ...
*
* RETURNS:
*/
void
printf(char * fmt, ...)
{
/* va_list a;
va_start(a, fmt);
doprint(NULL, fmt, a);
va_end(a);*/
Printu(fmt);
}
#ifndef NATIVE_SPRINTF
/* FUNCTION: sprintf()
*
* PARAM1: char * buf
* PARAM2: char * fmt
* PARAM3: ...
*
* RETURNS:
*/
/* (yaxon modify) */
/*
void
sprintf(char * buf, char * fmt, ...)
{
va_list a;
va_start(a, fmt);
doprint(buf, fmt, a);
va_end(a);
} */
int
sprintf_t(char * buf, const char * fmt, ...)
{
va_list a;
va_start(a, fmt);
doprint(buf, (char *)fmt, a);
va_end(a);
return 0;
}
#endif /* NATIVE_SPRINTF */
#else /* PRINTF_STDARG */
/* FUNCTION: dprintf()
*
* PARAM1: char *sp
* PARAM2: int var
*
* RETURNS:
*/
void
dprintf(char * sp, /* pointer to format string */
int var) /* 1st of n variables on stack */
{
doprint(NULL, sp, &var); /* printf to stdio */
}
/* FUNCTION: printf()
*
* PARAM1: char *sp
* PARAM2: int var
*
* RETURNS:
*/
void
printf(char * sp, /* pointer to format string */
int var) /* 1st of n variables on stack */
{
doprint(NULL, sp, &var); /* printf to stdio */
}
#ifndef NATIVE_SPRINTF
/* FUNCTION: sprintf()
*
* PARAM1: char * buf
* PARAM2: char * fmt
* PARAM3: int arg1
*
* RETURNS:
*/
void
sprintf_t(char * buf, char * fmt, int arg1)
{
doprint(buf, fmt, &arg1);
}
#endif /* NATIVE_SPRINTF */
#endif /* PRINTF_STDARG */
/* FUNCTION: doprint()
*
* PARAM1: char * target
* PARAM2: NULL for output to stdio
* PARAM3: char * sp
* PARAM4: va_list va
*
* RETURNS:
*/
void
doprint(char * target, /* NULL for output to stdio, else buffer pointer */
char * sp, /* printf format string */
#ifdef PRINTF_STDARG
va_list va) /* pointer to variables */
#else
int * vp) /* pointer to variables */
#endif /* PRINTF_STDARG */
{
char * cp;
unsigned prefill, postfill, fieldlen; /* varibles for field len padding */
int swap; /* flag and temp holder for prefill-postfill swap */
unsigned char fillchar;
unsigned minfieldlen;
int i = 0;
unsigned tmp = 0;
unsigned long lng = 0;
#ifdef PRINTF_STDARG
unsigned w0 = 0;
#ifdef SEG16_16
unsigned w1;
#endif
int i0 = 0;
unsigned char c = 0;
char * cap = 0;
void * varp;
#endif /* PRINTF_STDARG */
while (*sp)
{
if (*sp != '%')
{
doputchar(*sp++);
continue;
}
/* fall to here if sp ==> '%' */
sp++; /* point past '%' */
/* see if any field width control stuff is present */
cp = sp; /* save pointer to filed width data in cp */
while (*sp == '-' || (*sp >= '0' && *sp <= '9') || *sp == '.')
sp++; /* scan past field control goodies */
#ifdef PRINTF_STDARG
switch (*sp)
{
case 'p': /* '%p' - pointer */
#ifdef SEG16_16 /* do seg:offset variety */
w0 = va_arg(va, unsigned);
w1 = va_arg(va, unsigned);
#else /* 32 bit flat */
lng = va_arg(va, unsigned long);
#endif /* SEG16_16 */ /* else fall to 32 bit code */
break;
case 'x': /* '%x' - this always does 0 prefill */
tmp = va_arg(va, unsigned);
break;
case 'd': /* '%d' */
i0 = va_arg(va, int);
break;
case 'u': /* '%u' */
w0 = va_arg(va, unsigned);
break;
case 'c': /* '%c' */
c = (unsigned char)va_arg(va, unsigned);
break;
case 's': /* '%s' */
cap = va_arg(va, char *);
break;
case 'l':
if (sp[1] == 'x' || sp[1] == 'd' || sp[1] == 'u') /* '%lx', '%ld', or '%lu' */
{
lng = va_arg(va, unsigned long);
}
/* else '%l?', ignore it */
break;
default: /* %?, ignore it */
break;
} /* end switch *sp */
#endif /* PRINTF_STDARG */
#ifdef FIELDWIDTH
prefill = postfill = 0; /* default to no filling */
fillchar = ' '; /* ...but fill with spaces, if filling */
swap = TRUE; /* ...and swap prefill & postfill */
if (sp != cp) /* if there's field control stuff... */
{
if (*cp == '-') /* field is to be left adjusted */
{
swap = FALSE; /* leave pXXfill unswaped */
cp++;
}
else swap = TRUE; /* we will swap prefill & postfill later */
/* set prefill, postfill for left adjustment */
if (*cp == '0') /* fill char is '0', not space default */
{
cp++;
fillchar = '0';
}
else fillchar = ' ';
minfieldlen = setnum(&cp); /* get number, advance cp */
#ifdef PRINTF_STDARG
switch (*sp)
{
case 's':
varp = (void *)∩
break;
case 'd':
varp = (void *)&i0;
break;
case 'u':
varp = (void *)&w0;
break;
case 'l':
varp = (void *)&lng;
break;
default:
varp = NULL;
break;
}
fieldlen = fplen(sp, varp);
#else
fieldlen = fplen(sp, vp); /* figger display size of this var */
#endif /* PRINTF_STDARG */
if (*cp == '.') /* do we have a max field size? */
{
cp++; /* point to number past '.' */
maxfieldlen = setnum(&cp);
}
else
{
maxfieldlen = LINESIZE;
}
if (maxfieldlen < (int)fieldlen)
{
fieldlen = maxfieldlen;
}
if (minfieldlen > fieldlen)
{
postfill = minfieldlen - fieldlen;
}
else
{
postfill = 0;
}
if ((postfill + fieldlen) > LINESIZE)
{
postfill = 0; /* sanity check*/
}
}
if (swap) /* caller wanted right adjustment, swap prefill/postfill */
{
swap = (int)prefill;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?