// xxx cmt this assumes new_key doesn't need freeing. // Before: // "x" => "3" // "y" => "4" <-- pold // "z" => "5" <-- pnew // // Rename y to z // // After: // "x" => "3" // "z" => "4" // void lrec_rename(lrec_t* prec, char* old_key, char* new_key) { lrece_t* pold = lrec_find_entry(prec, old_key); if (pold != NULL) { lrece_t* pnew = lrec_find_entry(prec, new_key); if (pnew == NULL) { // E.g. rename "x" to "y" when "y" is not present if (pold->free_flags & LREC_FREE_ENTRY_KEY) { free(pold->key); pold->key = new_key; pold->free_flags &= ~LREC_FREE_ENTRY_KEY; } else { pold->key = new_key; } } else { // E.g. rename "x" to "y" when "y" is already present if (pnew->free_flags & LREC_FREE_ENTRY_VALUE) { free(pnew->value); } if (pold->free_flags & LREC_FREE_ENTRY_KEY) { free(pold->key); pold->free_flags &= ~LREC_FREE_ENTRY_KEY; } pold->key = new_key; lrec_unlink(prec, pnew); free(pnew); } } }
void lrec_put(lrec_t* prec, char* key, char* value, char free_flags) { lrece_t* pe = lrec_find_entry(prec, key); if (pe != NULL) { if (pe->free_flags & LREC_FREE_ENTRY_VALUE) { free(pe->value); } pe->value = strdup(value); pe->free_flags |= LREC_FREE_ENTRY_VALUE; } else { pe = mlr_malloc_or_die(sizeof(lrece_t)); pe->key = strdup(key); pe->value = strdup(value); pe->free_flags = LREC_FREE_ENTRY_KEY | LREC_FREE_ENTRY_VALUE; if (prec->phead == NULL) { pe->pprev = NULL; pe->pnext = NULL; prec->phead = pe; prec->ptail = pe; } else { pe->pprev = prec->ptail; pe->pnext = NULL; prec->ptail->pnext = pe; prec->ptail = pe; } prec->field_count++; } }
// ---------------------------------------------------------------- void lrec_put(lrec_t* prec, char* key, char* value, char free_flags) { lrece_t* pe = lrec_find_entry(prec, key); if (pe != NULL) { if (pe->free_flags & FREE_ENTRY_VALUE) { free(pe->value); } if (free_flags & FREE_ENTRY_KEY) free(key); pe->value = value; if (free_flags & FREE_ENTRY_VALUE) pe->free_flags |= FREE_ENTRY_VALUE; else pe->free_flags &= ~FREE_ENTRY_VALUE; } else { pe = mlr_malloc_or_die(sizeof(lrece_t)); pe->key = key; pe->value = value; pe->free_flags = free_flags; if (prec->phead == NULL) { pe->pprev = NULL; pe->pnext = NULL; prec->phead = pe; prec->ptail = pe; } else { pe->pprev = prec->ptail; pe->pnext = NULL; prec->ptail->pnext = pe; prec->ptail = pe; } prec->field_count++; } }
void lrec_move_to_tail(lrec_t* prec, char* key) { lrece_t* pe = lrec_find_entry(prec, key); if (pe == NULL) return; lrec_unlink(prec, pe); lrec_link_at_tail(prec, pe); }
// ---------------------------------------------------------------- char* lrec_get(lrec_t* prec, char* key) { lrece_t* pe = lrec_find_entry(prec, key); if (pe != NULL) { return pe->value; } else { return NULL; } }
char* lrec_get_ext(lrec_t* prec, char* key, char** ppfree_flags) { lrece_t* pe = lrec_find_entry(prec, key); if (pe != NULL) { *ppfree_flags = &pe->free_flags; return pe->value; } else { *ppfree_flags = NULL; return NULL; } }
// ---------------------------------------------------------------- void lrec_remove(lrec_t* prec, char* key) { lrece_t* pe = lrec_find_entry(prec, key); if (pe == NULL) return; lrec_unlink(prec, pe); if (pe->free_flags & LREC_FREE_ENTRY_KEY) { free(pe->key); } if (pe->free_flags & LREC_FREE_ENTRY_VALUE) { free(pe->value); } free(pe); }