diff options
Diffstat (limited to 'set-contact-numbers.c')
-rw-r--r-- | set-contact-numbers.c | 146 |
1 files changed, 9 insertions, 137 deletions
diff --git a/set-contact-numbers.c b/set-contact-numbers.c index b3ecfb2..5b81d7e 100644 --- a/set-contact-numbers.c +++ b/set-contact-numbers.c @@ -1,141 +1,13 @@ /* See LICENSE file for copyright and license details. */ -#include "common.h" - -USAGE("[-C old-context] [-N old-number] [-F | -f] [-M | -m] ([-c new-context] [-n new-number] | -u) contact-id"); - - -int -main(int argc, char *argv[]) -{ - int set_facsimile = -1, set_mobile = -1, add = 1, edit = 0, remove = 0; - char *context = NULL, *number = NULL; - char *lookup_context = NULL, *lookup_number = NULL; - char *old_context = NULL, *old_number = NULL; - struct passwd *user; - struct libcontacts_contact contact; - struct libcontacts_number **r, **w; - size_t i; - - ARGBEGIN { - case 'C': - add = 0; - if (lookup_context) - usage(); - lookup_context = ARG(); - break; - case 'c': - edit = 1; - if (context) - usage(); - context = ARG(); - break; - case 'N': - add = 0; - if (lookup_number) - usage(); - lookup_number = ARG(); - break; - case 'n': - edit = 1; - if (number) - usage(); - number = ARG(); - break; - case 'F': - if (set_facsimile >= 0) - return 0; - set_facsimile = 0; - break; - case 'f': - if (set_facsimile >= 0) - return 0; - set_facsimile = 1; - break; - case 'M': - if (set_mobile >= 0) - return 0; - set_mobile = 0; - break; - case 'm': - if (set_mobile >= 0) - return 0; - set_mobile = 1; - break; - case 'u': - remove = 1; - break; - default: - usage(); - } ARGEND; - - if (remove == edit) { - if (edit) - usage(); - eprintf("at least one of -cnu is required\n"); - } +#define CATEGORY numbers - if (add) - edit = 0; +#define LIST_PARAMS(X)\ + X('C', "C", 'c', "c", context, "context")\ + X('N', "N", 'n', "n", number, "number") - if (argc != 0 || !*argv[0] || strchr(argv[0], '/')) - usage(); +#define LIST_BOOL_PARAMS(X)\ + X('F', "F", 'f', "f", facsimile, "facsimile")\ + X('M', "M", 'm', "m", mobile, "mobile") - 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.numbers) { - for (r = contact.numbers; *r; r++) { - if (lookup_context && strcmpnul((*r)->context, lookup_context)) - continue; - if (lookup_number && strcmpnul((*r)->context, lookup_number)) - continue; - break; - } - if (!edit) { - libcontacts_number_destroy(*r); - free(*r); - for (w = r++; (*w++ = *r++);); - } else if (*r) { - if (context) { - old_context = contact.numbers[i]->context; - contact.numbers[i]->context = context; - } - if (number) { - old_number = contact.numbers[i]->number; - contact.numbers[i]->number = number; - } - if (set_mobile >= 0) - contact.numbers[i]->is_mobile = set_mobile; - if (set_facsimile >= 0) - contact.numbers[i]->is_facsimile = set_facsimile; - } else { - libcontacts_contact_destroy(&contact); - return 0; - } - } else if (!edit && !remove) { - if (contact.numbers) - for (i = 0; contact.numbers[i]; i++); - contact.numbers = erealloc(contact.numbers, (i + 2) * sizeof(*contact.numbers)); - contact.numbers[i + 1] = NULL; - contact.numbers[i] = ecalloc(1, sizeof(**contact.numbers)); - contact.numbers[i]->context = context; - contact.numbers[i]->number = number; - contact.numbers[i]->is_mobile = set_mobile > 0; - contact.numbers[i]->is_facsimile = set_facsimile > 0; - } - - if (libcontacts_save_contact(&contact, user)) - eprintf("libcontacts_save_contact %s:", argv[0]); - - contact.numbers[i]->context = old_context; - contact.numbers[i]->number = old_number; - libcontacts_contact_destroy(&contact); - - return 0; -} +#include "common.h" +IMPLEMENT_SET_ON_LIST(number) |