diff options
Diffstat (limited to 'examples/addr.c')
-rw-r--r-- | examples/addr.c | 112 |
1 files changed, 78 insertions, 34 deletions
diff --git a/examples/addr.c b/examples/addr.c index d8bcdfb7b..5f495a052 100644 --- a/examples/addr.c +++ b/examples/addr.c @@ -1,48 +1,92 @@ #include <stdio.h> +#include <errno.h> #include <mailutils/address.h> +#define EPARSE ENOENT + +static const char* err_name(int e) +{ + struct { + int e; + const char* s; + } map[] = { +#define E(e) { e, #e }, + E(ENOENT) + E(EINVAL) + E(ENOMEM) +#undef E + { 0, NULL } + }; + static char s[sizeof(int) * 8 + 3]; + int i; + + for(i = 0; map[i].s; i++) { + if(map[i].e == e) + return map[i].s; + } + sprintf(s, "[%d]", e); + + return s; +} + static int parse(const char* str) { size_t no = 0; - size_t pcount; + size_t pcount = 0; + int status; char buf[BUFSIZ]; address_t address = NULL; - address_create(&address, str); + status = address_create(&address, str); address_get_count(address, &pcount); - printf("%s=> pcount %d\n", str, pcount); + if(status) { + printf("%s=> error %s\n\n", str, err_name(status)); + return 0; + } else { + printf("%s=> pcount %d\n", str, pcount); + } for(no = 1; no <= pcount; no++) { - size_t got = 0; - printf("%d ", no); + size_t got = 0; + int isgroup; + + address_is_group(address, no, &isgroup); + + printf("%d ", no); + + if(isgroup) { + address_get_personal(address, no, buf, sizeof(buf), &got); - address_get_email(address, no, buf, sizeof(buf), 0); + printf("group <%s>\n", buf); + } else { + address_get_email(address, no, buf, sizeof(buf), 0); - printf("email <%s>\n", buf); + printf("email <%s>\n", buf); + } - address_get_personal(address, no, buf, sizeof(buf), &got); + address_get_personal(address, no, buf, sizeof(buf), &got); - if(got) printf(" personal <%s>\n", buf); + if(got && !isgroup) printf(" personal <%s>\n", buf); - address_get_comments(address, no, buf, sizeof(buf), &got); + address_get_comments(address, no, buf, sizeof(buf), &got); - if(got) printf(" comments <%s>\n", buf); + if(got) printf(" comments <%s>\n", buf); - address_get_local_part(address, no, buf, sizeof(buf), &got); + address_get_local_part(address, no, buf, sizeof(buf), &got); - if(got) printf(" local-part <%s>", buf); + if(got) printf(" local-part <%s>", buf); - address_get_domain(address, no, buf, sizeof(buf), &got); + address_get_domain(address, no, buf, sizeof(buf), &got); - if(got) printf(" domain <%s>\n", buf); + if(got) printf(" domain <%s>\n", buf); - address_get_route(address, no, buf, sizeof(buf), &got); + address_get_route(address, no, buf, sizeof(buf), &got); - if(got) printf(" route <%s>\n", buf); + if(got) printf(" route <%s>\n", buf); } address_destroy(&address); @@ -53,30 +97,30 @@ static int parse(const char* str) static int parseinput(void) { - char buf[BUFSIZ]; + char buf[BUFSIZ]; - while(fgets(buf, sizeof(buf), stdin) != 0) { - buf[strlen(buf) - 1] = 0; - parse(buf); - } + while(fgets(buf, sizeof(buf), stdin) != 0) { + buf[strlen(buf) - 1] = 0; + parse(buf); + } - return 0; + return 0; } int main(int argc, const char *argv[]) { - argc = 1; + argc = 1; - if(!argv[argc]) { - return parseinput(); - } - for(; argv[argc]; argc++) { - if(strcmp(argv[argc], "-") == 0) { - parseinput(); - } else { - parse(argv[argc]); - } + if(!argv[argc]) { + return parseinput(); + } + for(; argv[argc]; argc++) { + if(strcmp(argv[argc], "-") == 0) { + parseinput(); + } else { + parse(argv[argc]); } + } - return 0; + return 0; } |