Untitled
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 }
Leave a Comment