From 3f2546b2ef55b661fd8dd69682b38992225e86f6 Mon Sep 17 00:00:00 2001
From: fishsoupisgood <github@madingley.org>
Date: Mon, 29 Apr 2019 01:17:54 +0100
Subject: Initial import of qemu-2.4.1

---
 roms/SLOF/lib/libc/stdio/vsscanf.c | 131 +++++++++++++++++++++++++++++++++++++
 1 file changed, 131 insertions(+)
 create mode 100644 roms/SLOF/lib/libc/stdio/vsscanf.c

(limited to 'roms/SLOF/lib/libc/stdio/vsscanf.c')

diff --git a/roms/SLOF/lib/libc/stdio/vsscanf.c b/roms/SLOF/lib/libc/stdio/vsscanf.c
new file mode 100644
index 00000000..b9603e98
--- /dev/null
+++ b/roms/SLOF/lib/libc/stdio/vsscanf.c
@@ -0,0 +1,131 @@
+/******************************************************************************
+ * Copyright (c) 2004, 2008 IBM Corporation
+ * All rights reserved.
+ * This program and the accompanying materials
+ * are made available under the terms of the BSD License
+ * which accompanies this distribution, and is available at
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ *     IBM Corporation - initial implementation
+ *****************************************************************************/
+
+#include "stdio.h"
+#include "stdlib.h"
+#include "string.h"
+
+
+static void
+_scanf(const char **buffer, const char *fmt, va_list *ap)
+{
+	int i;
+	int length = 0;
+
+	fmt++;	
+
+	while(*fmt != '\0') {
+		
+		char tbuf[256];
+
+		switch(*fmt) {
+			case 'd':
+			case 'i':
+				if(length == 0) length = 256;
+				
+				for(i = 0; **buffer != ' ' && **buffer != '\t' && **buffer != '\n' && i < length; i++) {
+					tbuf[i] = **buffer;
+					*buffer += 1;
+				}
+				tbuf[i] = '\0';
+
+				*(va_arg(*ap, int *)) = strtol(tbuf, NULL, 10);
+				break;
+			case 'X':
+			case 'x':
+				if(length == 0) length = 256;
+				
+				for(i = 0; **buffer != ' ' && **buffer != '\t' && **buffer != '\n' && i < length; i++) {
+					tbuf[i] = **buffer;
+					*buffer += 1;
+				}
+				tbuf[i] = '\0';
+					
+				*(va_arg(*ap, int *)) = strtol(tbuf, NULL, 16);
+				break;
+			case 'O':
+			case 'o':
+				if(length == 0) length = 256;
+				
+				for(i = 0; **buffer != ' ' && **buffer != '\t' && **buffer != '\n' && i < length; i++) {
+					tbuf[i] = **buffer;
+					*buffer += 1;
+				}
+				tbuf[i] = '\0';
+
+				*(va_arg(*ap, int *)) = strtol(tbuf, NULL, 8);
+				break;
+			case 'c':
+				*(va_arg(*ap, char *)) = **buffer;
+				*buffer += 1;
+				if(length > 1)
+					for(i = 1; i < length; i++)
+						*buffer += 1;
+				break;
+			case 's':
+				if(length == 0) length = 256;
+				
+				for(i = 0; **buffer != ' ' && **buffer != '\t' && **buffer != '\n' && i < length; i++) {
+					tbuf[i] = **buffer;
+					*buffer += 1;
+				}
+
+				tbuf[i] = '\0';
+
+				strcpy(va_arg(*ap, char *), tbuf);
+				break;
+			default:
+				if(*fmt >= '0' && *fmt <= '9') 
+					length += *fmt - '0';
+				break;
+		}
+		fmt++;
+	}
+
+}
+
+
+int
+vsscanf(const char *buffer, const char *fmt, va_list ap)
+{
+
+	while(*fmt != '\0') {
+		
+		if(*fmt == '%') {
+			
+			char formstr[20];
+			int i=0;
+			
+			do {
+				formstr[i] = *fmt;
+				fmt++;
+				i++;
+			} while(!(*fmt == 'd' || *fmt == 'i' || *fmt == 'x' || *fmt == 'X'
+						|| *fmt == 'p' || *fmt == 'c' || *fmt == 's' || *fmt == '%'
+						|| *fmt == 'O' || *fmt == 'o' )); 
+			formstr[i++] = *fmt;
+			formstr[i] = '\0';
+			if(*fmt != '%') {
+				while(*buffer == ' ' || *buffer == '\t' || *buffer == '\n')
+					buffer++;
+				_scanf(&buffer, formstr, &ap);
+			}
+
+		} 
+
+		fmt++;
+
+	}
+
+	return 0;
+}
+
-- 
cgit v1.2.3