X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/4a693cfc5c3ee0e639bbee0215345e921715ab04..HEAD:/conf.c diff --git a/conf.c b/conf.c index 89bf5c3b..e80f5853 100644 --- a/conf.c +++ b/conf.c @@ -43,8 +43,8 @@ struct value { union { int intval; char *stringval; - Filename fileval; - FontSpec fontval; + Filename *fileval; + FontSpec *fontval; } u; }; @@ -125,6 +125,10 @@ static void free_value(struct value *val, int type) { if (type == TYPE_STR) sfree(val->u.stringval); + else if (type == TYPE_FILENAME) + filename_free(val->u.fileval); + else if (type == TYPE_FONT) + fontspec_free(val->u.fontval); } /* @@ -141,10 +145,10 @@ static void copy_value(struct value *to, struct value *from, int type) to->u.stringval = dupstr(from->u.stringval); break; case TYPE_FILENAME: - to->u.fileval = from->u.fileval; + to->u.fileval = filename_copy(from->u.fileval); break; case TYPE_FONT: - to->u.fontval = from->u.fontval; + to->u.fontval = fontspec_copy(from->u.fontval); break; } } @@ -199,6 +203,8 @@ void conf_copy_into(Conf *newconf, Conf *oldconf) struct conf_entry *entry, *entry2; int i; + conf_clear(newconf); + for (i = 0; (entry = index234(oldconf->tree, i)) != NULL; i++) { entry2 = snew(struct conf_entry); copy_key(&entry2->key, &entry->key); @@ -328,7 +334,7 @@ Filename *conf_get_filename(Conf *conf, int primary) key.primary = primary; entry = find234(conf->tree, &key, NULL); assert(entry); - return &entry->value.u.fileval; + return entry->value.u.fileval; } FontSpec *conf_get_fontspec(Conf *conf, int primary) @@ -341,7 +347,7 @@ FontSpec *conf_get_fontspec(Conf *conf, int primary) key.primary = primary; entry = find234(conf->tree, &key, NULL); assert(entry); - return &entry->value.u.fontval; + return entry->value.u.fontval; } void conf_set_int(Conf *conf, int primary, int value) @@ -414,7 +420,7 @@ void conf_set_filename(Conf *conf, int primary, const Filename *value) assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_FILENAME); entry->key.primary = primary; - entry->value.u.fileval = *value; /* structure copy */ + entry->value.u.fileval = filename_copy(value); conf_insert(conf, entry); } @@ -425,7 +431,7 @@ void conf_set_fontspec(Conf *conf, int primary, const FontSpec *value) assert(subkeytypes[primary] == TYPE_NONE); assert(valuetypes[primary] == TYPE_FONT); entry->key.primary = primary; - entry->value.u.fontval = *value; /* structure copy */ + entry->value.u.fontval = fontspec_copy(value); conf_insert(conf, entry); } @@ -453,10 +459,10 @@ int conf_serialised_size(Conf *conf) size += 1 + strlen(entry->value.u.stringval); break; case TYPE_FILENAME: - size += sizeof(entry->value.u.fileval); + size += filename_serialise(entry->value.u.fileval, NULL); break; case TYPE_FONT: - size += sizeof(entry->value.u.fontval); + size += fontspec_serialise(entry->value.u.fontval, NULL); break; } } @@ -500,14 +506,10 @@ void conf_serialise(Conf *conf, void *vdata) *data++ = 0; break; case TYPE_FILENAME: - memcpy(data, &entry->value.u.fileval, - sizeof(entry->value.u.fileval)); - data += sizeof(entry->value.u.fileval); + data += filename_serialise(entry->value.u.fileval, data); break; case TYPE_FONT: - memcpy(data, &entry->value.u.fontval, - sizeof(entry->value.u.fontval)); - data += sizeof(entry->value.u.fontval); + data += fontspec_serialise(entry->value.u.fontval, data); break; } } @@ -520,14 +522,15 @@ int conf_deserialise(Conf *conf, void *vdata, int maxsize) unsigned char *data = (unsigned char *)vdata; unsigned char *start = data; struct conf_entry *entry; - int primary; + unsigned primary; + int used; unsigned char *zero; while (maxsize >= 4) { primary = GET_32BIT_MSB_FIRST(data); data += 4, maxsize -= 4; - if ((unsigned)primary >= N_CONFIG_OPTIONS) + if (primary >= N_CONFIG_OPTIONS) break; entry = snew(struct conf_entry); @@ -539,7 +542,7 @@ int conf_deserialise(Conf *conf, void *vdata, int maxsize) sfree(entry); goto done; } - entry->key.secondary.i = GET_32BIT_MSB_FIRST(data); + entry->key.secondary.i = toint(GET_32BIT_MSB_FIRST(data)); data += 4, maxsize -= 4; break; case TYPE_STR: @@ -562,7 +565,7 @@ int conf_deserialise(Conf *conf, void *vdata, int maxsize) sfree(entry); goto done; } - entry->value.u.intval = GET_32BIT_MSB_FIRST(data); + entry->value.u.intval = toint(GET_32BIT_MSB_FIRST(data)); data += 4, maxsize -= 4; break; case TYPE_STR: @@ -578,28 +581,28 @@ int conf_deserialise(Conf *conf, void *vdata, int maxsize) data = zero + 1; break; case TYPE_FILENAME: - if (maxsize < sizeof(entry->value.u.fileval)) { + entry->value.u.fileval = + filename_deserialise(data, maxsize, &used); + if (!entry->value.u.fileval) { if (subkeytypes[entry->key.primary] == TYPE_STR) sfree(entry->key.secondary.s); sfree(entry); goto done; } - memcpy(&entry->value.u.fileval, data, - sizeof(entry->value.u.fileval)); - data += sizeof(entry->value.u.fileval); - maxsize -= sizeof(entry->value.u.fileval); + data += used; + maxsize -= used; break; case TYPE_FONT: - if (maxsize < sizeof(entry->value.u.fontval)) { + entry->value.u.fontval = + fontspec_deserialise(data, maxsize, &used); + if (!entry->value.u.fontval) { if (subkeytypes[entry->key.primary] == TYPE_STR) sfree(entry->key.secondary.s); sfree(entry); goto done; } - memcpy(&entry->value.u.fontval, data, - sizeof(entry->value.u.fontval)); - data += sizeof(entry->value.u.fontval); - maxsize -= sizeof(entry->value.u.fontval); + data += used; + maxsize -= used; break; } conf_insert(conf, entry);