nhtml/src/attribute.c

67 lines
1.4 KiB
C

/*
* attribute.c
*
* Created on: 08.08.2017
* Author: julian
*/
#include "attribute.h"
#include <string.h> // needs: strcmp
#include <stdlib.h> // needs: realloc
// linear search in set
// returns NULL on failure to find entry
attr_t * attr_set_find(attr_set_t *set, const char * name) {
size_t current = 0;
for (; current != set->len; ++current) {
if (strcmp(set->arr[current].name.c_str, name) == 0) {
return set->arr + current;
}
}
return NULL;
}
// Append new Attribute to set
int attr_set_append(attr_set_t * set, attr_t *new_entry) {
if (new_entry->name.c_str== NULL) return -1; // reject empty entries
// search first
attr_t * new_ptr = attr_set_find(set, new_entry->name.c_str);
if (new_ptr != NULL) {
// already contained in set
// concatenate values
//new_ptr->value = string_copy(new_entry->value);
string_append(&new_ptr->value, ' ');
string_concat(&new_ptr->value, &new_entry->value);
return 0;
}
new_ptr = realloc(set->arr, (set->len+1)*sizeof(attr_t));
if (new_ptr == NULL) {
return -1;
}
// append and quit
set->arr = new_ptr;
set->arr[set->len] = attr_copy(new_entry);
set->len++;
return 0;
}
attr_t attr_copy(attr_t * attr) {
attr_t temp;
temp.name = string_copy(attr->name);
temp.value = string_copy(attr->value);
return temp;
}
void attr_destroy(attr_t * attr) {
// clear memory
string_destroy(&attr->name);
string_destroy(&attr->value);
}