static void hw_set_property (struct hw *me, const char *property, hw_property_type type, const void *array, int sizeof_array) { /* find the property */ struct hw_property_data *entry = find_property_data (me, property); if (entry != NULL) { /* existing property - update it */ void *new_array = 0; struct hw_property *value = entry->property; /* check the type matches */ if (value->type != type) hw_abort (me, "conflict between type of new and old value for property %s", property); /* replace its value */ if (value->array != NULL) hw_free (me, (void*)value->array); new_array = (sizeof_array > 0 ? hw_zalloc (me, sizeof_array) : (void*)0); value->array = new_array; value->sizeof_array = sizeof_array; if (sizeof_array > 0) memcpy (new_array, array, sizeof_array); return; } else { /* new property - create it */ hw_add_property (me, property, type, NULL, 0, array, sizeof_array, NULL, temporary_object); } }
void hw_add_string_array_property (struct hw *me, const char *property, const string_property_spec *strings, unsigned nr_strings) { int sizeof_array; int string_nr; char *array; char *chp; if (nr_strings == 0) hw_abort (me, "property \"%s\" must be non-null", property); /* total up the size of the needed array */ for (sizeof_array = 0, string_nr = 0; string_nr < nr_strings; string_nr ++) { sizeof_array += strlen (strings[string_nr]) + 1; } /* create the array */ array = (char*) hw_zalloc (me, sizeof_array); chp = array; for (string_nr = 0; string_nr < nr_strings; string_nr++) { strcpy (chp, strings[string_nr]); chp += strlen (chp) + 1; } ASSERT (chp == array + sizeof_array); /* now enter it */ hw_add_property (me, property, string_array_property, array, sizeof_array, array, sizeof_array, NULL, permenant_object); }