| /****************************************************************************** |
| * 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; |
| } |
| |