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 + -
显示快捷键?