⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printk.c

📁 printk 从linux核心裁剪出来,可单独编译运行, 对于移植到不支持C运行库的平台增加打印功能有借鉴意义
💻 C
📖 第 1 页 / 共 2 页
字号:
			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':				/* FIXME:				* What does C99 say about the overflow case here? */				if (qualifier == 'l') {					long * ip = va_arg(args, long *);					*ip = (str - buf);				} else if (qualifier == 'Z' || 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);		else if (qualifier == 'l') {			num = va_arg(args, unsigned long);			if (flags & SIGN)				num = (signed long) num;		} else if (qualifier == 'Z' || 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;			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':			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 *l = (long*) va_arg(args,long *);				*l = simple_strtoll(str,&next,base);			} else {				unsigned long *l = (unsigned long*) va_arg(args,unsigned 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;}int printk(const char *fmt, ...){	va_list args;	unsigned long flags;	int printed_len;	char *p;	static char printk_buf[1024];	static int log_level_unknown = 1;	/* Emit the output into the temporary buffer */	va_start(args, fmt);	printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);	va_end(args);		printf("%s",printk_buf);
out:	return printed_len;}void main(){        int i = 2;        printk("i=%d\n",i);}

⌨️ 快捷键说明

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