このソリューションでは、NULLで終了するルックアップテーブル(LUT)を使用して、適切なサイズを見つけます。次に、そのサイズでメモリを割り当てます。次に、入力データを新しいオブジェクトにコピーします。オブジェクトのタイプの数が十分に多い場合は、LUTを事前に並べ替えることができ、線形検索の代わりにバイナリ検索が実行されます。
#include<stdlib.h>
#include<string.h>
struct nameToSize_s {
const char *name;
size_t size;
};
struct foo1_name_s {
};
struct foo2_name_s {
};
const struct nameToSize_s nameToSizeLUT[] = {
{ "foo1_name", sizeof(struct foo1_name_s) },
{ "foo2_name", sizeof(struct foo2_name_s) },
// NULL terminator
{ NULL, 0}
};
void * update(char* name, void *data) {
const struct nameToSize_s *entry = nameToSizeLUT;
while(entry->name) {
if( strcmp(entry->name, name) == 0) break;
entry++;
}
if( entry->name == NULL) abort();
void *newObj = malloc(entry->size);
if( newObj == NULL) abort();
return memcpy( newObj, data, entry->size);
}