Index: trunk/src/attrib.c =================================================================== --- trunk/src/attrib.c (revision 10797) +++ trunk/src/attrib.c (revision 10798) @@ -76,6 +76,7 @@ i = list->Number; list->List[i].name = pcb_strdup_null(name); list->List[i].value = pcb_strdup_null(value); + list->List[i].cpb_written = 1; NOTIFY(list, list->List[i].name, list->List[i].value); list->Number++; return 0; @@ -128,3 +129,36 @@ pcb_attribute_put(dest, src->List[i].name, src->List[i].value, replace); } + +void pcb_attribute_copyback_begin(pcb_attribute_list_t *dst) +{ + int i; + + for (i = 0; i < dst->Number; i++) + dst->List[i].cpb_written = 0; +} + +void pcb_attribute_copyback(pcb_attribute_list_t *dst, const char *name, const char *value) +{ + int i; + for (i = 0; i < dst->Number; i++) { + if (strcmp(name, dst->List[i].name) == 0) { + dst->List[i].cpb_written = 1; + if (strcmp(value, dst->List[i].value) != 0) { + free(dst->List[i].value); + dst->List[i].value = pcb_strdup(value); + NOTIFY(dst, dst->List[i].name, dst->List[i].value); + } + return; + } + } +} + +void pcb_attribute_copyback_end(pcb_attribute_list_t *dst) +{ + int i; + for (i = 0; i < dst->Number; i++) + if (!dst->List[i].cpb_written) + pcb_attribute_remove_idx(dst, i); +} + Index: trunk/src/attrib.h =================================================================== --- trunk/src/attrib.h (revision 10797) +++ trunk/src/attrib.h (revision 10798) @@ -34,6 +34,7 @@ typedef struct pcb_attribute_s { char *name; char *value; + unsigned cpb_written:1; /* copyback: written */ } pcb_attribute_t; struct pcb_attribute_list_s { @@ -45,6 +46,8 @@ /* Returns NULL if the name isn't found, else the value for that named attribute. */ char *pcb_attribute_get(pcb_attribute_list_t * list, const char *name); +pcb_attribute_t *pcb_attribute_get_attr(pcb_attribute_list_t * list, const char *name); + /* Adds an attribute to the list. If the attribute already exists, whether it's replaced or a second copy added depends on REPLACE. Returns non-zero if an existing attribute was replaced. */ @@ -67,4 +70,9 @@ /* Copy eacg attribute from src to dest */ void pcb_attribute_copy_all(pcb_attribute_list_t *dest, const pcb_attribute_list_t *src, int replace); +/* Copy back a mirrored attribute list, minimizing the changes */ +void pcb_attribute_copyback_begin(pcb_attribute_list_t *dst); +void pcb_attribute_copyback(pcb_attribute_list_t *dst, const char *name, const char *value); +void pcb_attribute_copyback_end(pcb_attribute_list_t *dst); + #endif