Ejemplo n.º 1
0
ERROR_CODE free_type(struct type_t *type) {
    /* allocats space for the current type in iteration
    for the iterator and for the possible hash map element */
    struct type_t *current;
    struct iterator_t *iterator;
    struct hash_map_element_t *element;

    /* switches over the type's type in order to
    execute the proper free operation */
    switch(type->type) {
        case INTEGER_TYPE:
            /* breaks the switch */
            break;

        case FLOAT_TYPE:
            /* breaks the switch */
            break;

        case STRING_TYPE:
            FREE(type->value.value_string);

            /* breaks the switch */
            break;

        case LIST_TYPE:
            create_iterator_linked_list(type->value.value_list, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &current);
                if(current == NULL) { break; }
                free_type(current);
            }

            delete_iterator_linked_list(type->value.value_list, iterator);
            delete_linked_list(type->value.value_list);

            /* breaks the switch */
            break;

        case MAP_TYPE:
            create_element_iterator_hash_map(type->value.value_map, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &element);
                if(element == NULL) { break; }
                free_type((struct type_t *) element->value);
            }

            delete_iterator_hash_map(type->value.value_map, iterator);
            delete_hash_map(type->value.value_map);

            /* breaks the switch */
            break;

        case SORT_MAP_TYPE:
            create_element_iterator_sort_map(type->value.value_sort_map, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &element);
                if(element == NULL) { break; }
                free_type((struct type_t *) element->value);
            }

            delete_iterator_sort_map(type->value.value_sort_map, iterator);
            delete_sort_map(type->value.value_sort_map);

            /* breaks the switch */
            break;

        default:
            /* breaks the switch */
            break;
    }

    /* deltes the base type structure for the
    current type, this applies to all the types */
    delete_type(type);

    /* raises no error */
    RAISE_NO_ERROR;
}
Ejemplo n.º 2
0
ERROR_CODE _encode_type(struct type_t *type, struct string_buffer_t *string_buffer) {
    char *buffer;
    struct type_t key;
    struct type_t *current;
    struct iterator_t *iterator;
    struct hash_map_element_t *element;

    switch(type->type) {
        case INTEGER_TYPE:
            buffer = MALLOC(16);
            SPRINTF(buffer, 16, "%d", type->value.value_int);

            append_string_buffer(string_buffer, (unsigned char *) "i");
            _append_string_buffer(string_buffer, (unsigned char *) buffer);
            append_string_buffer(string_buffer, (unsigned char *) "e");

            break;

        case STRING_TYPE:
            buffer = MALLOC(16);
            SPRINTF(buffer, 16, "%lu", (long unsigned int) type->size);

            _append_string_buffer(string_buffer, (unsigned char *) buffer);
            append_string_buffer(string_buffer, (unsigned char *) ":");
            append_string_l_buffer(
                string_buffer,
                (unsigned char *) type->value.value_string,
                type->size
            );

            break;

        case LIST_TYPE:
            append_string_buffer(string_buffer, (unsigned char *) "l");

            create_iterator_linked_list(type->value.value_list, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &current);
                if(current == NULL) { break; }
                _encode_type(current, string_buffer);
            }

            delete_iterator_linked_list(type->value.value_list, iterator);

            append_string_buffer(string_buffer, (unsigned char *) "e");

            break;

        case MAP_TYPE:
            append_string_buffer(string_buffer, (unsigned char *) "d");

            create_element_iterator_hash_map(type->value.value_map, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &element);
                if(element == NULL) { break; }
                key = string_type((char *) element->key_string);
                _encode_type(&key, string_buffer);
                _encode_type((struct type_t *) element->value, string_buffer);
            }

            delete_iterator_hash_map(type->value.value_map, iterator);

            append_string_buffer(string_buffer, (unsigned char *) "e");

            break;

        case SORT_MAP_TYPE:
            append_string_buffer(string_buffer, (unsigned char *) "d");

            create_element_iterator_sort_map(type->value.value_sort_map, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &element);
                if(element == NULL) { break; }
                key = string_type((char *) element->key_string);
                _encode_type(&key, string_buffer);
                _encode_type((struct type_t *) element->value, string_buffer);
            }

            delete_iterator_sort_map(type->value.value_sort_map, iterator);

            append_string_buffer(string_buffer, (unsigned char *) "e");

            break;

        default:
            break;
    }

    /* raises no error */
    RAISE_NO_ERROR;
}
Ejemplo n.º 3
0
ERROR_CODE print_type(struct type_t *type) {
    /* allocates space for the current type for the
    type to handler the key values for map for the
    possible iterator, for the hash map element and
    for the is first (loop) flag */
    struct type_t *current;
    struct type_t key;
    struct iterator_t *iterator;
    struct hash_map_element_t *element;
    unsigned char is_first = 1;

    /* switches over the type's type in order to
    execute the proper print operation */
    switch(type->type) {
        case INTEGER_TYPE:
            PRINTF_F("%d", type->value.value_int);

            /* breaks the switch */
            break;

        case FLOAT_TYPE:
            PRINTF_F("%f", type->value.value_float);

            /* breaks the switch */
            break;

        case STRING_TYPE:
            PRINTF_F("'%s'", type->value.value_string);

            /* breaks the switch */
            break;

        case LIST_TYPE:
            PRINTF("[");

            create_iterator_linked_list(type->value.value_list, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &current);
                if(current == NULL) { break; }
                if(is_first == 0) { PRINTF(", "); };
                print_type(current);
                is_first = 0;
            }

            delete_iterator_linked_list(type->value.value_list, iterator);

            PRINTF("]");

            /* breaks the switch */
            break;

        case MAP_TYPE:
            PRINTF("{");

            create_element_iterator_hash_map(type->value.value_map, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &element);
                if(element == NULL) { break; }
                if(is_first == 0) { PRINTF(", "); };
                key = string_type((char *) element->key_string);
                print_type(&key);
                PRINTF(" : ");
                print_type((struct type_t *) element->value);
                is_first = 0;
            }

            delete_iterator_hash_map(type->value.value_map, iterator);

            PRINTF("}");

            /* breaks the switch */
            break;

        case SORT_MAP_TYPE:
            PRINTF("{");

            create_element_iterator_sort_map(type->value.value_sort_map, &iterator);

            while(TRUE) {
                get_next_iterator(iterator, (void **) &element);
                if(element == NULL) { break; }
                if(is_first == 0) { PRINTF(", "); };
                key = string_type((char *) element->key_string);
                print_type(&key);
                PRINTF(" : ");
                print_type((struct type_t *) element->value);
                is_first = 0;
            }

            delete_iterator_sort_map(type->value.value_sort_map, iterator);

            PRINTF("}");

            /* breaks the switch */
            break;

        default:
            PRINTF("undefined");

            /* breaks the switch */
            break;
    }

    /* raises no error */
    RAISE_NO_ERROR;
}