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

📄 _scanf.c

📁 从iccavr7中破解得到的lib库源代码
💻 C
字号:
/* For AVR, do not compile this file standalone in libsrc.common\stdio
 */
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
#include "_stdio.h"

#ifndef _SCANF
#define _SCANF _scanf
#define XCONST const
#endif

#define MAX	10

static int converted;

static void ReadString(char *s, char (*get)(void), void (*unget)(char))
	{
	int c;
	int seen = 0;

	while (c = get())
		{
		if (isspace(c))
			{
			unget(c);
			break;
			}
		*s++ = c;
		seen = 1;
		}
	*s = 0;
	converted += seen;
	}

static void ReadInteger(char *s, char (*get)(void), void (*unget)(char), 
		int base)
	{
	int c;
	int seen = 0;

	while (c = get())
		{
		if (base == 16)
			{
			if (!isxdigit(c))
				{
				unget(c);
				break;
				}
			}
		else if (base == 8)
			{
			if (!isdigit(c) || c >= '8')
				{
				unget(c);
				break;
				}
			}
		else 
			{
			if (!isdigit(c) && c != '-')
				{
				unget(c);
				break;
				}
			}
		*s++ = c;
        seen = 1;
		}
	*s = 0;
	converted += seen;
	}

int 
_SCANF(char (*get)(void), void (*unget)(char), XCONST char *fmt, va_list va)
	{
	int is_long, c, base;
	char *vp;
	char s[MAX+1];

    converted = 0;
	while (c = *fmt++)
		{
		if (c == '%')
			{
			if (*fmt == 'l')
				{
				is_long = 1;
				fmt++;
				}
			else
				is_long = 0;

			vp = va_arg(va, void *);

			switch (*fmt)
				{
			case 'c':
				*(char *)vp = get();
				converted++;
				break;

			case 'o': base = 8;		goto read_strtoul;
			case 'u': base = 10;	goto read_strtoul;
            case 'p':
			case 'X':
			case 'x': base = 16;
			  read_strtoul:

				ReadInteger(s, get, unget, base);
				if (is_long)
					*(unsigned long *)vp = strtoul(s, 0, base);
				else
					*(unsigned *)vp = strtoul(s, 0, base);
				break;

			case 'd':
				ReadInteger(s, get, unget, 10);
				if (is_long)
					*(long *)vp = strtol(s, 0, 10);
				else
					*(int *)vp = strtol(s, 0, 10);
				break;
			case 's':
				ReadString(vp, get, unget);
				break;
			default: {
				static FLASH char err[] = { "unsupported format" };
              #if defined(_AVR)
				cputs(err);
			  #else
				puts(err);
			  #endif
				}
				break;
				}
			fmt++;
			}
		else if (isspace(c))
			{
			while ((c = get()) && isspace(c))
				;
			unget(c);
			}
		else if (get() != c)
			break;
		}
	return converted;
	}

⌨️ 快捷键说明

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