131 lines
2.7 KiB
C
131 lines
2.7 KiB
C
/******************************************************************************
|
|
* 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;
|
|
}
|
|
|