jnand_printf.c
来自「QUALCOMM JNAND DRIVER」· C语言 代码 · 共 803 行 · 第 1/2 页
C
803 行
if (any)
(*putc)(',', putc_arg);
else {
(*putc)('<', putc_arg);
any = TRUE;
}
j = *p++;
for (; (c = *p) > 32; p++)
(*putc)(c, putc_arg);
printnum((unsigned)( (u>>(j-1)) & ((2<<(i-j))-1)),
base, putc, putc_arg);
}
else if (u & (1<<(i-1))) {
if (any)
(*putc)(',', putc_arg);
else {
(*putc)('<', putc_arg);
any = TRUE;
}
for (; (c = *p) > 32; p++)
(*putc)(c, putc_arg);
}
else {
for (; *p > 32; p++)
continue;
}
}
if (any)
(*putc)('>', putc_arg);
break;
}
case 'c':
c = va_arg(*argp, int);
(*putc)(c, putc_arg);
break;
case 's':
{
register char *p;
register char *p2;
if (prec == -1)
prec = 0x7fffffff; /* MAXINT */
p = va_arg(*argp, char *);
if (p == (char *)0)
p = "";
if (length > 0 && !ladjust) {
n = 0;
p2 = p;
for (; *p != '\0' && n < prec; p++)
n++;
p = p2;
while (n < length) {
(*putc)(' ', putc_arg);
n++;
}
}
n = 0;
while (*p != '\0') {
if (++n > prec)
break;
(*putc)(*p++, putc_arg);
}
if (n < length && ladjust) {
while (n < length) {
(*putc)(' ', putc_arg);
n++;
}
}
break;
}
case 'o':
truncate = _doprnt_truncates;
case 'O':
base = 8;
goto print_unsigned;
case 'd':
truncate = _doprnt_truncates;
case 'D':
base = 10;
goto print_signed;
case 'u':
truncate = _doprnt_truncates;
case 'U':
base = 10;
goto print_unsigned;
case 'x':
truncate = _doprnt_truncates;
case 'X':
base = 16;
goto print_unsigned;
case 'z':
truncate = _doprnt_truncates;
case 'Z':
base = 16;
goto print_signed;
case 'r':
truncate = _doprnt_truncates;
case 'R':
base = radix;
goto print_signed;
case 'n':
truncate = _doprnt_truncates;
case 'N':
base = radix;
goto print_unsigned;
print_signed:
n = va_arg(*argp, long);
if (n >= 0) {
u = n;
sign_char = plus_sign;
}
else {
u = -n;
sign_char = '-';
}
goto print_num;
print_unsigned:
u = va_arg(*argp, unsigned long);
goto print_num;
print_num:
{
char buf[MAXBUF]; /* build number here */
register char * p = &buf[MAXBUF-1];
static char digits[] = "0123456789abcdef";
char *prefix = 0;
if (truncate) u = (long)((int)(u));
if (u != 0 && altfmt) {
if (base == 8)
prefix = "0";
else if (base == 16)
prefix = "0x";
}
do {
*p-- = digits[u % base];
u /= base;
} while (u != 0);
length -= (&buf[MAXBUF-1] - p);
if (sign_char)
length--;
if (prefix)
length -= strlen(prefix);
if (padc == ' ' && !ladjust) {
/* blank padding goes before prefix */
while (--length >= 0)
(*putc)(' ', putc_arg);
}
if (sign_char)
(*putc)(sign_char, putc_arg);
if (prefix)
while (*prefix)
(*putc)(*prefix++, putc_arg);
if (padc == '0') {
/* zero padding goes after sign and prefix */
while (--length >= 0)
(*putc)('0', putc_arg);
}
while (++p != &buf[MAXBUF])
(*putc)(*p, putc_arg);
if (ladjust) {
while (--length >= 0)
(*putc)(' ', putc_arg);
}
break;
}
case '\0':
fmt--;
break;
default:
(*putc)(c, putc_arg);
}
fmt++;
}
#if 0
simple_unlock(&_doprnt_lock);
#endif
}
/*
* Printing (to console)
*/
#if 0
extern void cnputc( char, /*not really*/vm_offset_t);
#endif
extern void uart_transmit_byte (char ch);
volatile char input_port, output_port;
void char_out (char c)
{
#if 0
#ifndef DISABLE_TERM
while (output_port != 0)
;
output_port = c;
#endif
#else
// uart_transmit_byte (c);
term_put (c);
#endif
}
int
getchar (void)
{
int ch;
while (input_port == 0)
;
ch = input_port;
input_port = 0;
return ch;
}
static void
cnputc (char ch, vm_offset_t bogus)
{
if (ch == '\n')
char_out ('\r');
char_out (ch);
}
void putchar (int ch)
{
cnputc (ch, 0);
}
void
puts (const char *data)
{
while (*data != 0) {
cnputc (*data, 0);
data++;
}
cnputc ('\n', 0);
}
/*VARARGS1*/
int printf(const char *fmt, ...)
// char * fmt;
// va_dcl
{
va_list listp;
va_start(listp, fmt);
_doprnt((char *) fmt, &listp, cnputc, 16, 0);
va_end(listp);
return 0;
}
#if 0
int indent = 0;
/*
* Printing (to console) with indentation.
*/
/*VARARGS1*/
void iprintf(fmt, va_alist)
char * fmt;
va_dcl
{
va_list listp;
register int i;
for (i = indent; i > 0; ){
if (i >= 8) {
printf("\t");
i -= 8;
}
else {
printf(" ");
i--;
}
}
va_start(listp);
_doprnt(fmt, &listp, cnputc, 16, 0);
va_end(listp);
}
#endif
#if 0
/*
* Printing to generic buffer
* Returns #bytes printed.
* Strings are zero-terminated.
*/
static void
sputc(
char c,
vm_offset_t arg)
{
register char **bufp = (char **) arg;
register char *p = *bufp;
*p++ = c;
*bufp = p;
}
int
sprintf( buf, fmt, va_alist)
char *buf;
char *fmt;
va_dcl
{
va_list listp;
char *start = buf;
va_start(listp);
_doprnt(fmt, &listp, sputc, 16, (vm_offset_t)&buf);
va_end(listp);
*buf = 0;
return (buf - start);
}
#endif
#if 0
void safe_gets(str, maxlen)
char *str;
int maxlen;
{
register char *lp;
register int c;
char *strmax = str + maxlen - 1; /* allow space for trailing 0 */
lp = str;
for (;;) {
c = cngetc();
switch (c) {
case '\n':
case '\r':
printf("\n");
*lp++ = 0;
return;
case '\b':
case '#':
case '\177':
if (lp > str) {
printf("\b \b");
lp--;
}
continue;
case '@':
case 'u'&037:
lp = str;
printf("\n\r");
continue;
default:
if (c >= ' ' && c < '\177') {
if (lp < strmax) {
*lp++ = c;
printf("%c", c);
}
else {
printf("%c", '\007'); /* beep */
}
}
}
}
}
#endif
#else
/* Just to shut up the compiler warning when COMPILE_PRINTF is not on */
int printf_foo;
#endif /* COMPILE_PRINTF */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?