Untitled

 avatar
unknown
plain_text
a year ago
7.8 kB
1
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
}
Leave a Comment