+ str_size += strlen(to->term_names) + 1;
+ for_each_string(i, from) {
+ if (VALID_STRING(from->Strings[i]))
+ str_size += strlen(from->Strings[i]) + 1;
+ }
+ for_each_string(i, to) {
+ if (VALID_STRING(to->Strings[i]))
+ str_size += strlen(to->Strings[i]) + 1;
+ }
+ /* allocate a string-table large enough for both source/target, and
+ * copy all of the strings into that table. In the merge, we will
+ * select from the original source/target lists to construct a new
+ * target list.
+ */
+ if (str_size != 0) {
+ char *str_copied;
+ if ((str_table = malloc(str_size)) == NULL)
+ _nc_err_abort(MSG_NO_MEMORY);
+ str_copied = str_table;
+ strcpy(str_copied, to->term_names);
+ to->term_names = str_copied;
+ str_copied += strlen(str_copied) + 1;
+ for_each_string(i, from) {
+ if (VALID_STRING(from->Strings[i])) {
+ strcpy(str_copied, from->Strings[i]);
+ from->Strings[i] = str_copied;
+ str_copied += strlen(str_copied) + 1;
+ }
+ }
+ for_each_string(i, to) {
+ if (VALID_STRING(to->Strings[i])) {
+ strcpy(str_copied, to->Strings[i]);
+ to->Strings[i] = str_copied;
+ str_copied += strlen(str_copied) + 1;
+ }
+ }
+ free(to->str_table);
+ to->str_table = str_table;
+ free(from->str_table);
+ }