Untitled
unknown
plain_text
2 years ago
7.8 kB
5
Indexable
int s21_sscanf(const char *str, const char *format, ...) {
va_list args;
va_start(args, format);
int count_chars = 0;
int h_length = 0;
int l_length = 0;
int L_length = 0;
for (size_t i = 0; i < strlen(format); i++) {
if (format[i] == '%') {
int width = 1000;
i++;
if (format[i] != '*') {
while (isdigit(format[i])) {
if (width == 1000) {
width = 0;
}
width = width * 10 + (format[i] - '0');
i++;
}
if (format[i] == 'd' || format[i] == 'i') {
delete_spaces(&str, &count_chars);
if (*str == '0' && (*(str + 1) == 'x' || *(str + 1) == 'X')) {
str += 2;
count_chars += 2;
if(h_length){
unsigned short int* result_hex = va_arg(args, unsigned short int*);
*result_hex = extract_unsigned_hex(&str, width, &count_chars);
} else if(l_length){
unsigned long int* result_hex = va_arg(args, unsigned long int*);
*result_hex = extract_unsigned_hex(&str, width, &count_chars);
} else{
unsigned int* result_hex = va_arg(args, unsigned int*);
*result_hex = extract_unsigned_hex(&str, width, &count_chars);
}
} else if (*str == '0') {
str++;
count_chars += 1;
if(h_length){
unsigned short int *result_int = va_arg(args, unsigned short int *);
*result_int =
extract_octal(&str, width, &count_chars);
} else if(l_length){
unsigned long int *result_int = va_arg(args, unsigned long int *);
*result_int =
extract_octal(&str, width, &count_chars);
} else{
unsigned int *result_int = va_arg(args, unsigned int *);
*result_int =
extract_octal(&str, width, &count_chars);
}
} else {
if(h_length){
short int *result_int = va_arg(args, short int *);
*result_int =
extract_decimal(&str, width, &count_chars);
} else if(l_length){
long int *result_int = va_arg(args, long int *);
*result_int =
extract_decimal(&str, width, &count_chars);
} else{
int *result_int = va_arg(args, int *);
*result_int =
extract_decimal(&str, width, &count_chars);
}
}
} else if (format[i] == 'c') {
delete_spaces(&str, &count_chars);
char *extracted_char = va_arg(args, char *);
*extracted_char = *str;
str++;
count_chars++;
} else if (format[i] == 's') {
delete_spaces(&str, &count_chars);
char **result_string = va_arg(args, char **);
*result_string = extract_string(&str, width, &count_chars);
} else if (format[i] == 'f' || format[i] == 'g' ||
format[i] == 'e' || format[i] == 'G' ||
format[i] == 'E') {
delete_spaces(&str, &count_chars);
if (L_length){
long double *result_double = va_arg(args, long double *);
*result_double = extract_float(&str, width, &count_chars);
} else {
float *result_float = va_arg(args, float *);
*result_float = extract_float(&str, width, &count_chars);
}
} else if (format[i] == 'o') {
delete_spaces(&str, &count_chars);
if(h_length){
unsigned short int *result_octal = va_arg(args, unsigned short int *);
*result_octal = extract_unsigned_octal(&str, width, &count_chars);
}
else if (l_length){
unsigned long int *result_octal = va_arg(args, unsigned long int *);
*result_octal = extract_unsigned_octal(&str, width, &count_chars);
} else{
unsigned int *result_octal = va_arg(args, unsigned int *);
*result_octal = extract_unsigned_octal(&str, width, &count_chars);
}
} else if (format[i] == 'u') {
delete_spaces(&str, &count_chars);
if(h_length){
unsigned short int *result_decimal = va_arg(args, unsigned short int *);
*result_decimal = extract_unsigned_decimal(&str, width, &count_chars);
} else if(l_length){
unsigned long int *result_decimal = va_arg(args, unsigned long int *);
*result_decimal = extract_unsigned_decimal(&str, width, &count_chars);
} else{
unsigned int *result_decimal = va_arg(args, unsigned int *);
*result_decimal = extract_unsigned_decimal(&str, width, &count_chars);
}
} else if (format[i] == 'x' || format[i] == 'X') {
delete_spaces(&str, &count_chars);
if (h_length){
unsigned short int * result_hex = va_arg(args, unsigned short int *);
*result_hex = extract_unsigned_hex(&str, width, &count_chars);
} else if (l_length){
unsigned long int * result_hex = va_arg(args, unsigned long int *);
*result_hex = extract_unsigned_hex(&str, width, &count_chars);
} else{
unsigned int * result_hex = va_arg(args, unsigned int *);
*result_hex = extract_unsigned_hex(&str, width, &count_chars);
}
} else if (format[i] == 'p') {
delete_spaces(&str, &count_chars);
void **result_ptr = va_arg(args, void **);
*result_ptr = extract_pointer(&str, width, &count_chars);
} else if (format[i] == 'n') {
delete_spaces(&str, &count_chars);
int *result_number = va_arg(args, int *);
*result_number = count_chars;
} else if (format[i] == '%') {
delete_spaces(&str, &count_chars);
str++;
count_chars++;
} else if (format[i] == 'h') {
h_length = 1;
} else if (format[i] == 'l') {
l_length = 1;
} else if (format[i] == 'L') {
L_length = 1;
}
}
i++;
}
}
va_end(args);
return 1; // 1 indicates successful completion
}
Editor is loading...
Leave a Comment