From aeeb6acb1bb304020e7245b24c89d9cf0a0d14bd Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Thu, 26 Nov 2009 08:05:44 +0330 Subject: [PATCH] add reply cmd --- mailx.c | 31 ++++++++++++++++++-------- mbox.c | 5 ++--- send.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ send.h | 1 + 4 files changed, 103 insertions(+), 12 deletions(-) diff --git a/mailx.c b/mailx.c index fc26751..ba0f6fd 100644 --- a/mailx.c +++ b/mailx.c @@ -445,13 +445,11 @@ static void cmd_copy(char *args, int del) close(fd); } -static void compose(char **to, int n, char *subj) +static void compose(struct draft *draft) { - struct draft draft; char record[MAXPATHLEN] = ""; char line[MAXLINE]; char cmd[MAXLINE]; - draft_init(&draft, to, n, subj); if (RECORD) mbox_path(record, RECORD); else if (mbox) @@ -459,15 +457,15 @@ static void compose(char **to, int n, char *subj) while (read_line(line, sizeof(line)) > 0) { cut_word(cmd, line); if (!strcmp("~e", cmd)) - draft_edit(&draft); + draft_edit(draft); if (!strcmp("~.", cmd)) { if (*record) - draft_save(&draft, record); - draft_send(&draft); + draft_save(draft, record); + draft_send(draft); break; } if (!strcmp("~p", cmd)) - write(STDOUT_FILENO, draft.mail, draft.len); + write(STDOUT_FILENO, draft->mail, draft->len); if (!strcmp("~q", cmd) || !strcmp("~x", cmd)) break; } @@ -475,9 +473,20 @@ static void compose(char **to, int n, char *subj) static void cmd_mail(char *args) { + struct draft draft; while (isspace(*args)) args++; - compose(*args ? &args : NULL, *args ? 1 : 0, NULL); + draft_init(&draft, *args ? &args : NULL, *args ? 1 : 0, NULL); + compose(&draft); +} + +static void cmd_reply(char *args) +{ + struct draft draft; + if (!sel_msgs(args, 0)) + return; + draft_reply(&draft, sort->mails[cur]); + compose(&draft); } static void prompt(void) @@ -516,6 +525,8 @@ static void loop(void) else if (!strncmp("move", cmd, len) || !strncmp("mv", cmd, len)) cmd_copy(args, 1); + else if (!strncmp("reply", cmd, len)) + cmd_reply(args); else if (!strncmp("Page", cmd, len)) cmd_page(args, 0); else if (!strncmp("delete", cmd, len) || @@ -557,7 +568,9 @@ int main(int argc, char *argv[]) close_mbox(); } } else { - compose(argv + i, argc - i, subj); + struct draft draft; + draft_init(&draft, argv + i, argc - i, subj); + compose(&draft); } return 0; } diff --git a/mbox.c b/mbox.c index d485b82..b63f3c4 100644 --- a/mbox.c +++ b/mbox.c @@ -74,10 +74,9 @@ int hdr_len(char *hdr) char *r = strchr(s, '\n'); if (!r) return strchr(s, '\0') - hdr; - s = r; - if (!isspace(*(s + 1))) + s = r + 1; + if (!isspace(*s)) return s - hdr; - s++; } return 0; } diff --git a/send.c b/send.c index 24b984f..54af4f7 100644 --- a/send.c +++ b/send.c @@ -125,6 +125,84 @@ void draft_init(struct draft *draft, char **to, int nto, char *subj) draft->len = s - draft->mail; } +static char *hdr_val(char *hdr) +{ + hdr = strchr(hdr, ':') + 1; + while (isspace(*hdr)) + hdr++; + return hdr; +} + +static char *put_replysubj(char *s, char *subj) +{ + subj = hdr_val(subj); + s = put_str(s, "Subject: "); + if (tolower(subj[0]) != 'r' || tolower(subj[1]) != 'e') + s = put_str(s, "Re: "); + s = put_mem(s, subj, hdr_len(subj)); + return s; +} + +static char *put_replyto(char *s, char *id, char *ref) +{ + s = put_str(s, "In-Reply-To: "); + id = hdr_val(id); + s = put_mem(s, id, hdr_len(id)); + s = put_str(s, "References: "); + s = put_mem(s, id, hdr_len(id)); + if (ref) { + ref = hdr_val(ref); + s = put_str(s, "\t"); + s = put_mem(s, ref, hdr_len(ref)); + } + return s; +} + +static char *put_reply(char *s, char *from, char *to, char *cc) +{ + if (from) { + from = hdr_val(from); + s = put_str(s, "To: "); + s = put_mem(s, from, hdr_len(from)); + } + if (to || cc) { + s = put_str(s, "Cc: "); + if (to) { + to = hdr_val(to); + s = put_mem(s, to, hdr_len(to)); + } + if (cc) { + cc = hdr_val(cc); + if (to) + s = put_str(s, "\t"); + s = put_mem(s, cc, hdr_len(cc)); + } + } + return s; +} + +void draft_reply(struct draft *draft, struct mail *mail) +{ + char *s = draft->mail; + char *id_hdr = mail_hdr(mail, "Message-ID:"); + char *ref_hdr = mail_hdr(mail, "References:"); + char *from_hdr = mail_hdr(mail, "From:"); + char *subj_hdr = mail_hdr(mail, "Subject:"); + char *to_hdr = mail_hdr(mail, "To:"); + char *cc_hdr = mail_hdr(mail, "CC:"); + + s = put_from_(s); + s = put_date(s); + s = put_id(s); + s = put_from(s); + if (subj_hdr) + s = put_replysubj(s, subj_hdr); + if (id_hdr) + s = put_replyto(s, id_hdr, ref_hdr); + s = put_reply(s, from_hdr, to_hdr, cc_hdr); + draft->len = s - draft->mail; +} + void draft_edit(struct draft *draft) { char *edit_argv[] = {EDITOR, DRAFT, NULL}; diff --git a/send.h b/send.h index 155f047..35f92c7 100644 --- a/send.h +++ b/send.h @@ -12,3 +12,4 @@ void draft_init(struct draft *draft, char **to, int nto, char *subj); void draft_send(struct draft *draft); void draft_edit(struct draft *draft); void draft_save(struct draft *draft, char *path); +void draft_reply(struct draft *draft, struct mail *mail); -- 2.11.4.GIT