printf.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 794 行 · 第 1/2 页

C
794
字号
            if (!(flags & LEFT)) {                while (len < field_width--) {                    if (str <= end)                        *str = ' ';                    ++str;                }            }            for (i = 0; i < len; ++i) {                if (str <= end)                    *str = *s;                ++str; ++s;            }            while (len < field_width--) {                if (str <= end)                    *str = ' ';                ++str;            }            continue;        case 'p':            if (field_width == -1) {                field_width = 2*sizeof(void *);                flags |= ZEROPAD;            }            str = number(str, end,                         (unsigned long) va_arg(args, void *),                         16, field_width, precision, flags);            continue;        case 'n':            if (qualifier == 'l') {                long * ip = va_arg(args, long *);                *ip = (str - buf);            } else if (qualifier == 'Z') {                size_t * ip = va_arg(args, size_t *);                *ip = (str - buf);            } else {                int * ip = va_arg(args, int *);                *ip = (str - buf);            }            continue;        case '%':            if (str <= end)                *str = '%';            ++str;            continue;            /* integer number formats - set up the flags and "break" */        case 'o':            base = 8;            break;        case 'X':            flags |= LARGE;        case 'x':            base = 16;            break;        case 'd':        case 'i':            flags |= SIGN;        case 'u':            break;        default:            if (str <= end)                *str = '%';            ++str;            if (*fmt) {                if (str <= end)                    *str = *fmt;                ++str;            } else {                --fmt;            }            continue;        }        if (qualifier == 'L')            num = va_arg(args, long long);        else if (qualifier == 'l') {            num = va_arg(args, unsigned long);            if (flags & SIGN)                num = (signed long) num;        } else if (qualifier == 'Z') {            num = va_arg(args, size_t);        } else if (qualifier == 'h') {            num = (unsigned short) va_arg(args, int);            if (flags & SIGN)                num = (signed short) num;        } else {            num = va_arg(args, unsigned int);            if (flags & SIGN)                num = (signed int) num;        }        str = number(str, end, num, base,                     field_width, precision, flags);    }    if (str <= end)        *str = '\0';    else if (size > 0)        /* don't write out a null byte if the buf size is zero */        *end = '\0';    /* the trailing null byte doesn't count towards the total     * ++str;     */    return str-buf;}/** * snprintf - Format a string and place it in a buffer * @buf: The buffer to place the result into * @size: The size of the buffer, including the trailing null space * @fmt: The format string to use * @...: Arguments for the format string */int snprintf(char * buf, size_t size, const char *fmt, ...){    va_list args;    int i;    va_start(args, fmt);    i=vsnprintf(buf,size,fmt,args);    va_end(args);    return i;}/** * vsprintf - Format a string and place it in a buffer * @buf: The buffer to place the result into * @fmt: The format string to use * @args: Arguments for the format string * * Call this function if you are already dealing with a va_list. * You probably want sprintf instead. */int vsprintf(char *buf, const char *fmt, va_list args){    return vsnprintf(buf, 0xFFFFFFFFUL, fmt, args);}/** * sprintf - Format a string and place it in a buffer * @buf: The buffer to place the result into * @fmt: The format string to use * @...: Arguments for the format string */int sprintf(char * buf, const char *fmt, ...){    va_list args;    int i;    va_start(args, fmt);    i=vsprintf(buf,fmt,args);    va_end(args);    return i;}/** * vsscanf - Unformat a buffer into a list of arguments * @buf:	input buffer * @fmt:	format of buffer * @args:	arguments */int vsscanf(const char * buf, const char * fmt, va_list args){	const char *str = buf;	char *next;	char digit;	int num = 0;	int qualifier;	int base;	int field_width;	int is_sign = 0;	while(*fmt && *str) {		/* skip any white space in format */		/* white space in format matchs any amount of		 * white space, including none, in the input.		 */		if (isspace(*fmt)) {			while (isspace(*fmt))				++fmt;			while (isspace(*str))				++str;		}		/* anything that is not a conversion must match exactly */		if (*fmt != '%' && *fmt) {			if (*fmt++ != *str++)				break;			continue;		}		if (!*fmt)			break;		++fmt;				/* skip this conversion.		 * advance both strings to next white space		 */		if (*fmt == '*') {			while (!isspace(*fmt) && *fmt)				fmt++;			while (!isspace(*str) && *str)				str++;			continue;		}		/* get field width */		field_width = -1;		if (isdigit(*fmt))			field_width = skip_atoi(&fmt);		/* get conversion qualifier */		qualifier = -1;		if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' ||		    *fmt == 'Z' || *fmt == 'z') {			qualifier = *fmt++;			if (unlikely(qualifier == *fmt)) {				if (qualifier == 'h') {					qualifier = 'H';					fmt++;				} else if (qualifier == 'l') {					qualifier = 'L';					fmt++;				}			}		}		base = 10;		is_sign = 0;		if (!*fmt || !*str)			break;		switch(*fmt++) {		case 'c':		{			char *s = (char *) va_arg(args,char*);			if (field_width == -1)				field_width = 1;			do {				*s++ = *str++;			} while (--field_width > 0 && *str);			num++;		}		continue;		case 's':		{			char *s = (char *) va_arg(args, char *);			if(field_width == -1)				field_width = INT_MAX;			/* first, skip leading white space in buffer */			while (isspace(*str))				str++;			/* now copy until next white space */			while (*str && !isspace(*str) && field_width--) {				*s++ = *str++;			}			*s = '\0';			num++;		}		continue;		case 'n':			/* return number of characters read so far */		{			int *i = (int *)va_arg(args,int*);			*i = str - buf;		}		continue;		case 'o':			base = 8;			break;		case 'x':		case 'X':			base = 16;			break;		case 'i':                        base = 0;		case 'd':			is_sign = 1;		case 'u':			break;		case '%':			/* looking for '%' in str */			if (*str++ != '%') 				return num;			continue;		default:			/* invalid format; stop here */			return num;		}		/* have some sort of integer conversion.		 * first, skip white space in buffer.		 */		while (isspace(*str))			str++;		digit = *str;		if (is_sign && digit == '-')			digit = *(str + 1);		if (!digit                    || (base == 16 && !isxdigit(digit))                    || (base == 10 && !isdigit(digit))                    || (base == 8 && (!isdigit(digit) || digit > '7'))                    || (base == 0 && !isdigit(digit)))				break;		switch(qualifier) {		case 'H':	/* that's 'hh' in format */			if (is_sign) {				signed char *s = (signed char *) va_arg(args,signed char *);				*s = (signed char) simple_strtol(str,&next,base);			} else {				unsigned char *s = (unsigned char *) va_arg(args, unsigned char *);				*s = (unsigned char) simple_strtoul(str, &next, base);			}			break;		case 'h':			if (is_sign) {				short *s = (short *) va_arg(args,short *);				*s = (short) simple_strtol(str,&next,base);			} else {				unsigned short *s = (unsigned short *) va_arg(args, unsigned short *);				*s = (unsigned short) simple_strtoul(str, &next, base);			}			break;		case 'l':			if (is_sign) {				long *l = (long *) va_arg(args,long *);				*l = simple_strtol(str,&next,base);			} else {				unsigned long *l = (unsigned long*) va_arg(args,unsigned long*);				*l = simple_strtoul(str,&next,base);			}			break;		case 'L':			if (is_sign) {				long long *l = (long long*) va_arg(args,long long *);				*l = simple_strtoll(str,&next,base);			} else {				unsigned long long *l = (unsigned long long*) va_arg(args,unsigned long long*);				*l = simple_strtoull(str,&next,base);			}			break;		case 'Z':		case 'z':		{			size_t *s = (size_t*) va_arg(args,size_t*);			*s = (size_t) simple_strtoul(str,&next,base);		}		break;		default:			if (is_sign) {				int *i = (int *) va_arg(args, int*);				*i = (int) simple_strtol(str,&next,base);			} else {				unsigned int *i = (unsigned int*) va_arg(args, unsigned int*);				*i = (unsigned int) simple_strtoul(str,&next,base);			}			break;		}		num++;		if (!next)			break;		str = next;	}	return num;}/** * sscanf - Unformat a buffer into a list of arguments * @buf:	input buffer * @fmt:	formatting of buffer * @...:	resulting arguments */int sscanf(const char * buf, const char * fmt, ...){	va_list args;	int i;	va_start(args,fmt);	i = vsscanf(buf,fmt,args);	va_end(args);	return i;}#endif

⌨️ 快捷键说明

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