blob: b9603e98ba8e054400cbef137d87aaf5b56e7cf9 [file] [log] [blame]
/******************************************************************************
* 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;
}