diff options
author | Mattias Andrée <maandree@kth.se> | 2021-04-12 00:07:26 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@kth.se> | 2021-04-12 00:07:26 +0200 |
commit | 1a21982ebc2747a694558c6e82cea54bd5dbead9 (patch) | |
tree | 42a145211772e876d85dfcc65655fa3130016313 /set-contact-emails.c | |
parent | Improve set-contact- utils (diff) | |
download | contacts-1a21982ebc2747a694558c6e82cea54bd5dbead9.tar.gz contacts-1a21982ebc2747a694558c6e82cea54bd5dbead9.tar.bz2 contacts-1a21982ebc2747a694558c6e82cea54bd5dbead9.tar.xz |
Deduplicate code and make some minor improvements
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'set-contact-emails.c')
-rw-r--r-- | set-contact-emails.c | 118 |
1 files changed, 6 insertions, 112 deletions
diff --git a/set-contact-emails.c b/set-contact-emails.c index d1cece5..31efe8c 100644 --- a/set-contact-emails.c +++ b/set-contact-emails.c @@ -1,115 +1,9 @@ /* See LICENSE file for copyright and license details. */ -#include "common.h" - -USAGE("[-A old-address] [-C old-context] ([-a new-adress] [-c new-context] | -u) contact-id"); - - -int -main(int argc, char *argv[]) -{ - int add = 1, edit = 0, remove = 0; - char *address = NULL, *context = NULL; - char *lookup_address = NULL, *lookup_context = NULL; - char *old_address = NULL, *old_context = NULL; - struct passwd *user; - struct libcontacts_contact contact; - struct libcontacts_email **r, **w; - size_t i; - - ARGBEGIN { - case 'A': - add = 0; - if (lookup_address) - usage(); - lookup_address = ARG(); - break; - case 'a': - edit = 1; - if (address) - usage(); - address = ARG(); - break; - case 'C': - add = 0; - if (lookup_context) - usage(); - lookup_context = ARG(); - break; - case 'c': - edit = 1; - if (context) - usage(); - context = ARG(); - break; - case 'u': - remove = 1; - break; - default: - usage(); - } ARGEND; - - if (remove == edit) { - if (edit) - usage(); - eprintf("at least one of -acu is required\n"); - } - - if (add) - edit = 0; +#define CATEGORY emails - if (argc != 1 || !*argv[0] || strchr(argv[0], '/')) - usage(); +#define LIST_PARAMS(X)\ + X('A', "A", 'a', "a", address, "address")\ + X('C', "C", 'c', "c", context, "context") - errno = 0; - user = getpwuid(getuid()); - if (!user) - eprintf("getpwuid: %s\n", errno ? strerror(errno) : "user does not exist"); - - if (libcontacts_load_contact(argv[0], &contact, user)) - eprintf("libcontacts_load_contact %s: %s\n", argv[0], errno ? strerror(errno) : "contact file is malformatted"); - - i = 0; - if ((edit || remove) && contact.emails) { - for (r = contact.emails; *r; r++) { - if (lookup_context && strcmpnul((*r)->context, lookup_context)) - continue; - if (lookup_address && strcmpnul((*r)->context, lookup_address)) - continue; - break; - } - if (!edit) { - libcontacts_email_destroy(*r); - free(*r); - for (w = r++; (*w++ = *r++);); - } else if (*r) { - if (context) { - old_context = contact.emails[i]->context; - contact.emails[i]->context = context; - } - if (address) { - old_address = contact.emails[i]->address; - contact.emails[i]->address = address; - } - } else { - libcontacts_contact_destroy(&contact); - return 0; - } - } else if (!edit && !remove) { - if (contact.emails) - for (i = 0; contact.emails[i]; i++); - contact.emails = erealloc(contact.emails, (i + 2) * sizeof(*contact.emails)); - contact.emails[i + 1] = NULL; - contact.emails[i] = ecalloc(1, sizeof(**contact.emails)); - contact.emails[i]->context = context; - contact.emails[i]->address = address; - } - - if (libcontacts_save_contact(&contact, user)) - eprintf("libcontacts_save_contact %s:", argv[0]); - - contact.emails[i]->context = old_context; - contact.emails[i]->address = old_address; - libcontacts_contact_destroy(&contact); - - return 0; -} +#include "common.h" +IMPLEMENT_SET_ON_LIST(email) |