less allocs!

SVN revision: 18666
This commit is contained in:
Carsten Haitzler 2005-11-27 14:32:44 +00:00
parent 46518fa24f
commit f42422b558
1 changed files with 36 additions and 9 deletions

View File

@ -97,6 +97,8 @@ struct _Eet_Data_Descriptor
Eet_Data_Descriptor_Hash *buckets;
} hash;
} elements;
char *strings;
int strings_len;
};
struct _Eet_Data_Element
@ -723,14 +725,8 @@ eet_data_descriptor_new(char *name,
void
eet_data_descriptor_free(Eet_Data_Descriptor *edd)
{
int i;
_eet_descriptor_hash_free(edd);
for (i = 0; i < edd->elements.num; i++)
{
if (edd->elements.set[i].name) free(edd->elements.set[i].name);
if (edd->elements.set[i].counter_name) free(edd->elements.set[i].counter_name);
}
if (edd->strings) free(edd->strings);
if (edd->elements.set) free(edd->elements.set);
free(edd);
}
@ -743,18 +739,49 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, char *name, int type,
Eet_Data_Descriptor *subtype)
{
Eet_Data_Element *ede;
int l1, l2, p1, p2, i;
char *ps;
edd->elements.num++;
edd->elements.set = realloc(edd->elements.set, edd->elements.num * sizeof(Eet_Data_Element));
if (!edd->elements.set) return;
ede = &(edd->elements.set[edd->elements.num - 1]);
ede->name = strdup(name);
l1 = strlen(name);
p1 = edd->strings_len;
if (counter_name)
{
l2 = strlen(counter_name);
p2 = p1 + l1 + 1;
}
else l2 = -1;
ps = edd->strings;
edd->strings_len += l1 + 1 + l2 + 1;
edd->strings = realloc(edd->strings, edd->strings_len);
if (!edd->strings)
{
edd->strings = ps;
return;
}
for (i = 0; i < edd->elements.num; i++)
{
edd->elements.set[i].name =
edd->strings + (edd->elements.set[i].name - ps);
if (edd->elements.set[i].counter_name)
edd->elements.set[i].counter_name =
edd->strings + (edd->elements.set[i].counter_name - ps);
}
ede->name = edd->strings + p1;
strcpy(ede->name, name);
ede->type = type;
ede->group_type = group_type;
ede->offset = offset;
ede->count = count;
if (counter_name)
ede->counter_name = strdup(counter_name);
{
ede->counter_name = edd->strings + p2;
strcpy(ede->counter_name, counter_name);
}
else ede->counter_name = NULL;
ede->subtype = subtype;
}