Exemple #1
0
static void
_doprnt(register const char *fmt,
	va_list		args,
	int		radix,			/* default radix - for '%r' */
 	void		(*outc)(void *, int),	/* character output */
	void		*outc_arg)		/* argument for outc */
{
	int		length;
	int		prec;
	boolean_t	ladjust;
	char		padc;
	long		n;
	unsigned long	u;
	int		plus_sign;
	int		sign_char;
	boolean_t	altfmt;
	int		base;
	char		c;

	while (*fmt != '\0') {
	    if (*fmt != '%') {
		(*outc)(outc_arg, *fmt++);
		continue;
	    }

	    fmt++;

	    length = 0;
	    prec = -1;
	    ladjust = FALSE;
	    padc = ' ';
	    plus_sign = 0;
	    sign_char = 0;
	    altfmt = FALSE;

	    while (TRUE) {
		if (*fmt == '#') {
		    altfmt = TRUE;
		    fmt++;
		}
		else if (*fmt == '-') {
		    ladjust = TRUE;
		    fmt++;
		}
		else if (*fmt == '+') {
		    plus_sign = '+';
		    fmt++;
		}
		else if (*fmt == ' ') {
		    if (plus_sign == 0)
			plus_sign = ' ';
		    fmt++;
		}
		else
		    break;
	    }

	    if (*fmt == '0') {
		padc = '0';
		fmt++;
	    }

	    if (isdigit(*fmt)) {
		while(isdigit(*fmt))
		    length = 10 * length + Ctod(*fmt++);
	    }
	    else if (*fmt == '*') {
		length = va_arg(args, int);
		fmt++;
		if (length < 0) {
		    ladjust = !ladjust;
		    length = -length;
		}
	    }

	    if (*fmt == '.') {
		fmt++;
		if (isdigit(*fmt)) {
		    prec = 0;
		    while(isdigit(*fmt))
			prec = 10 * prec + Ctod(*fmt++);
		}
		else if (*fmt == '*') {
		    prec = va_arg(args, int);
		    fmt++;
		}
Exemple #2
0
/* -*-
 * A low level printf() function.
 */
void
lp_Print(void (*output)(void *, char *, int), 
	 void * arg,
	 char *fmt, 
	 va_list ap)
{

#define 	OUTPUT(arg, s, l)  \
  { if (((l) < 0) || ((l) > LP_MAX_BUF)) { \
       (*output)(arg, (char*)theFatalMsg, sizeof(theFatalMsg)-1); for(;;); \
    } else { \
      (*output)(arg, s, l); \
    } \
  }
    
    char buf[LP_MAX_BUF];

    char c;
    char *s;
    long int num;

    int longFlag;
    int negFlag;
    int width;
    int prec;
    int ladjust;
    char padc;

    int length;

    for(;;) {
	{ 
		/* scan for the next '%' */
		/*get the address of fmtStart*/
		char *fmtStart = fmt;		
		/*get the end of address of fmtStart*/
		while((*fmt!='%')&&(*fmt!='\0')){	 
			fmt++;
		}
	
		/* flush the string found so far */
	   
		OUTPUT(arg,fmtStart,fmt-fmtStart);

		/* are we hitting the end? */

		if(*fmt=='\0')
			break;

	}

	/* we found a '%' */
	
	fmt++;			//go to next character
	
	/* check for long */
	if(*fmt=='l'){
		longFlag = 1;	//the string is long
	}
	else{
		longFlag = 0;
	}

	/* check for other prefixes */
	
	//Initialization
	width = 0;
	prec = -1;
	ladjust = 0;
	padc = ' ';
	
	//according prefixes change the sign of string
	if(*fmt =='-'){
		ladjust = 1;
		fmt++;
	}

	if(*fmt=='0'){
		padc = '0';
	       fmt++;
	}

	if(IsDigit(*fmt)){
		while(IsDigit(*fmt)){
			width = 10*width+Ctod(*fmt++);
		}
	}

	if(*fmt == ' '){
		fmt++;
		if(IsDigit(*fmt)){
			prec = 0;
			while(IsDigit(*fmt)){
				prec= prec*10+Ctod(*fmt++);
			}
		}
	}

	/* check format flag */
	negFlag = 0;
	switch (*fmt) {
	 case 'b':
	    if (longFlag) { 
		num = va_arg(ap, long int); 
	    } else { 
		num = va_arg(ap, int);
	    }
	    length = PrintNum(buf, num, 2, 0, width, ladjust, padc, 0);
	    OUTPUT(arg, buf, length);
	    break;

	 case 'd':
	 case 'D':
	    if (longFlag) { 
		num = va_arg(ap, long int);
	    } else { 
		num = va_arg(ap, int); 
	    }
	    if (num < 0) {
		num = - num;
		negFlag = 1;
	    }
	    length = PrintNum(buf, num, 10, negFlag, width, ladjust, padc, 0);
	    OUTPUT(arg, buf, length);
	    break;

	 case 'o':
	 case 'O':
	    if (longFlag) { 
		num = va_arg(ap, long int);
	    } else { 
Exemple #3
0
static void
_doprnt_ansi(register const char *fmt, va_list args, FILE *stream)
{
	int		length;
	int		prec;
	boolean_t	ladjust;
	char		padc;
	long		n;
	unsigned long	u;
	int		plus_sign;
	int		sign_char;
	boolean_t	altfmt;
	int		base;
	int		size;
	unsigned char	char_buf[2];

	char_buf[1] = '\0';

	while (*fmt != '\0') {
	    if (*fmt != '%') {
		putc(*fmt++, stream);
		continue;
	    }

	    fmt++;

	    length = 0;
	    prec = -1;
	    ladjust = FALSE;
	    padc = ' ';
	    plus_sign = 0;
	    sign_char = 0;
	    altfmt = FALSE;

	    while (TRUE) {
		if (*fmt == '#') {
		    altfmt = TRUE;
		    fmt++;
		}
		else if (*fmt == '-') {
		    ladjust = TRUE;
		    fmt++;
		}
		else if (*fmt == '+') {
		    plus_sign = '+';
		    fmt++;
		}
		else if (*fmt == ' ') {
		    if (plus_sign == 0)
			plus_sign = ' ';
		    fmt++;
		}
		else
		    break;
	    }

	    if (*fmt == '0') {
		padc = '0';
		fmt++;
	    }

	    if (isdigit(*fmt)) {
		while(isdigit(*fmt))
		    length = 10 * length + Ctod(*fmt++);
	    }
	    else if (*fmt == '*') {
		length = va_arg(args, int);
		fmt++;
		if (length < 0) {
		    ladjust = !ladjust;
		    length = -length;
		}
	    }

	    if (*fmt == '.') {
		prec = 0;
		fmt++;
		if (isdigit(*fmt)) {
		    prec = 0;
		    while(isdigit(*fmt))
			prec = 10 * prec + Ctod(*fmt++);
		}
		else if (*fmt == '*') {
		    prec = va_arg(args, int);
		    fmt++;
		}
Exemple #4
0
int
__doprnt(
         const char	*fmt,
         va_list			argp,
         /* character output routine */
         void			(*putc)(int ch, void *arg),
         void                    *arg,
         int			radix)		/* default radix - for '%r' */
{
	int		length;
	int		prec;
	bool	ladjust;
	char		padc;
	long long		n;
	unsigned long long	u;
	int		plus_sign;
	int		sign_char;
	bool	altfmt, truncate;
	int		base;
	char	c;
	int		capitals;
	int		long_long;
	int             nprinted = 0;
    
	while ((c = *fmt) != '\0') {
	    if (c != '%') {
            if (putc) {
                (*putc)(c, arg);
            }
            nprinted++;
            fmt++;
            continue;
	    }
        
	    fmt++;
        
	    long_long = 0;
	    length = 0;
	    prec = -1;
	    ladjust = false;
	    padc = ' ';
	    plus_sign = 0;
	    sign_char = 0;
	    altfmt = false;
        
	    while (true) {
            c = *fmt;
            if (c == '#') {
                altfmt = true;
            }
            else if (c == '-') {
                ladjust = true;
            }
            else if (c == '+') {
                plus_sign = '+';
            }
            else if (c == ' ') {
                if (plus_sign == 0)
                    plus_sign = ' ';
            }
            else
                break;
            fmt++;
	    }
        
	    if (c == '0') {
            padc = '0';
            c = *++fmt;
	    }
        
	    if (isdigit(c)) {
            while(isdigit(c)) {
                length = 10 * length + Ctod(c);
                c = *++fmt;
            }
	    }
	    else if (c == '*') {
            length = va_arg(argp, int);
            c = *++fmt;
            if (length < 0) {
                ladjust = !ladjust;
                length = -length;
            }
	    }
        
	    if (c == '.') {
            c = *++fmt;
            if (isdigit(c)) {
                prec = 0;
                while(isdigit(c)) {
                    prec = 10 * prec + Ctod(c);
                    c = *++fmt;
                }
            }
            else if (c == '*') {
                prec = va_arg(argp, int);
                c = *++fmt;
            }
Exemple #5
0
void _doprnt (register const char * fmt,
              va_list args,
              int radix,
              void (*putc)(char * arg, int c),
              char * putc_arg)
{
    int		length;
    int		prec;
    bool_t	ladjust;
    char		padc;
    long long	n, m;
    unsigned long long u;
    int		plus_sign;
    int		sign_char;
    bool_t	altfmt, truncate;
    int		base;
    char		c;
    int		longopt;

    while (*fmt != '\0') {
        if (*fmt != '%') {
            (*putc)(putc_arg, *fmt++);
            continue;
        }

        fmt++;

        length = 0;
        prec = -1;
        ladjust = FALSE;
        padc = ' ';
        plus_sign = 0;
        sign_char = 0;
        altfmt = FALSE;
        longopt = 0;

        while (TRUE) {
            if (*fmt == '#') {
                altfmt = TRUE;
                fmt++;
            }
            else if (*fmt == '-') {
                ladjust = TRUE;
                fmt++;
            }
            else if (*fmt == '+') {
                plus_sign = '+';
                fmt++;
            }
            else if (*fmt == ' ') {
                if (plus_sign == 0)
                    plus_sign = ' ';
                fmt++;
            }
            else
                break;
        }

        if (*fmt == '0') {
            padc = '0';
            fmt++;
        }

        if (isdigit(*fmt)) {
            while(isdigit(*fmt))
                length = 10 * length + Ctod(*fmt++);
        }
        else if (*fmt == '*') {
            length = va_arg(args, int);
            fmt++;
            if (length < 0) {
                ladjust = !ladjust;
                length = -length;
            }
        }

        if (*fmt == '.') {
            fmt++;
            if (isdigit(*fmt)) {
                prec = 0;
                while(isdigit(*fmt))
                    prec = 10 * prec + Ctod(*fmt++);
            }
            else if (*fmt == '*') {
                prec = va_arg(args, int);
                fmt++;
            }
Exemple #6
0
void _doprnt(
	const char 	*fmt,
	va_list		argp,
					/* character output routine */
 	void		(*putc)( char, vm_offset_t),
	int		radix,		/* default radix - for '%r' */
	vm_offset_t	putc_arg)
{
	int		length;
	int		prec;
	boolean_t	ladjust;
	char		padc;
	long		n;
	unsigned long	u;
	int		plus_sign;
	int		sign_char;
	boolean_t	altfmt, truncate;
	int		base;
	char		c;

	printf_init();

#if 0
	/* Make sure that we get *some* printout, no matter what */
	simple_lock(&_doprnt_lock);
#else
	{
		int i = 0;
		while (i < 1*1024*1024) {
			if (simple_lock_try(&_doprnt_lock))
				break;
			i++;
		}
	}
#endif

	while ((c = *fmt) != '\0') {
	    if (c != '%') {
		(*putc)(c, putc_arg);
		fmt++;
		continue;
	    }

	    fmt++;

	    length = 0;
	    prec = -1;
	    ladjust = FALSE;
	    padc = ' ';
	    plus_sign = 0;
	    sign_char = 0;
	    altfmt = FALSE;

	    while (TRUE) {
		c = *fmt;
		if (c == '#') {
		    altfmt = TRUE;
		}
		else if (c == '-') {
		    ladjust = TRUE;
		}
		else if (c == '+') {
		    plus_sign = '+';
		}
		else if (c == ' ') {
		    if (plus_sign == 0)
			plus_sign = ' ';
		}
		else
		    break;
		fmt++;
	    }

	    if (c == '0') {
		padc = '0';
		c = *++fmt;
	    }

	    if (isdigit(c)) {
		while(isdigit(c)) {
		    length = 10 * length + Ctod(c);
		    c = *++fmt;
		}
	    }
	    else if (c == '*') {
		length = va_arg(argp, int);
		c = *++fmt;
		if (length < 0) {
		    ladjust = !ladjust;
		    length = -length;
		}
	    }

	    if (c == '.') {
		c = *++fmt;
		if (isdigit(c)) {
		    prec = 0;
		    while(isdigit(c)) {
			prec = 10 * prec + Ctod(c);
			c = *++fmt;
		    }
		}
		else if (c == '*') {
		    prec = va_arg(argp, int);
		    c = *++fmt;
		}
Exemple #7
0
int
__doprnt(const char	*fmt, va_list argp, void (*putc)(int), int radix, int is_log) {
    int                 length;
    int                 prec;
    bool                ladjust;
    char                padc;
    long long           n;
    unsigned long long	u;
    int                 plus_sign;
    int                 sign_char;
    bool                altfmt, truncate;
    int                 base;
    char                c;
    int                 capitals;
    int                 long_long;
    int                 nprinted = 0;
    
    while ((c = *fmt) != '\0') {
        if (c != '%') {
            (*putc)(c);
            nprinted++;
            fmt++;
            continue;
        }
        
        fmt++;
        
        long_long = 0;
        length = 0;
        prec = -1;
        ladjust = FALSE;
        padc = ' ';
        plus_sign = 0;
        sign_char = 0;
        altfmt = FALSE;
        
        while (TRUE) {
            c = *fmt;
            if (c == '#') {
                altfmt = TRUE;
            }
            else if (c == '-') {
                ladjust = TRUE;
            }
            else if (c == '+') {
                plus_sign = '+';
            }
            else if (c == ' ') {
                if (plus_sign == 0)
                    plus_sign = ' ';
            }
            else
                break;
            fmt++;
        }
        
        if (c == '0') {
            padc = '0';
            c = *++fmt;
        }
        
        if (isdigit(c)) {
            while(isdigit(c)) {
                length = 10 * length + Ctod(c);
                c = *++fmt;
            }
        }
        else if (c == '*') {
            length = va_arg(argp, int);
            c = *++fmt;
            if (length < 0) {
                ladjust = !ladjust;
                length = -length;
            }
        }
        
        if (c == '.') {
            c = *++fmt;
            if (isdigit(c)) {
                prec = 0;
                while(isdigit(c)) {
                    prec = 10 * prec + Ctod(c);
                    c = *++fmt;
                }
            }
            else if (c == '*') {
                prec = va_arg(argp, int);
                c = *++fmt;
            }