ref: 5379327ffc8239978258eacff93188200d055d4f
parent: 08f307994bcfc1e6df93db072d621f570a757514
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Nov 10 09:55:43 EST 2020
Remove custom expansion: plumb instead
--- a/comp.c
+++ b/comp.c
@@ -94,7 +94,7 @@
static void
compmain(void *cp)
{
- char *a, *f[32];
+ char *f[32];
int nf;
Event ev;
Comp *c, **pc;
@@ -114,13 +114,10 @@
switch(ev.type){
case 'l':
case 'L':
- if((a = matchaddr(&mbox, &ev)) != nil)
- compose(a, nil, 0, 0);
- else if(matchmesg(&mbox, ev.text))
+ if(matchmesg(&mbox, ev.text))
mesgopen(ev.text, nil);
- else if(!(ev.flags & 0x2))
+ else
winreturn(c, &ev);
- free(a);
break;
case 'x':
case 'X':
--- a/mail.h
+++ b/mail.h
@@ -30,8 +30,9 @@
struct Event {
char action;
char type;
- int q0;
- int q1;
+ int p0; /* click point */
+ int q0; /* expand lo */
+ int q1; /* expand hi */
int flags;
int ntext;
char text[Eventsz + 1];
@@ -160,7 +161,6 @@
void winreturn(Win*, Event*);
int wineval(Win*, char*, ...);
int winread(Win*, int, int, char*, int);
-char *matchaddr(Win*, Event*);
int matchmesg(Win*, char*);
char *winreadsel(Win*);
void wingetsel(Win*, int*, int*);
--- a/mbox.c
+++ b/mbox.c
@@ -32,6 +32,8 @@
Reprog *mesgpat;
int threadsort = 1;
+int sender;
+
int plumbsendfd;
int plumbseemailfd;
int plumbshowmailfd;
@@ -451,7 +453,7 @@
dots = "...";
}
- Bprint(bfd, "%-6s\t%s %s%*.*s%s\t«%s»\n",
+ Bprint(bfd, "%-6s\t%s %s%*.*s%s\t<%s>\n",
m->name,
flag, sep, -width, width,
m->subject,
@@ -733,7 +735,7 @@
static void
doevent(Event *ev)
{
- char *a, *f[32];
+ char *f[32];
int nf;
Fn *p;
@@ -742,13 +744,10 @@
switch(ev->type){
case 'l':
case 'L':
- if((a = matchaddr(&mbox, ev)) != nil)
- compose(a, nil, 0, 0);
- else if(matchmesg(&mbox, ev->text))
+ if(matchmesg(&mbox, ev->text))
mesgopen(ev->text, nil);
- else if((ev->flags & 0x2) == 0)
+ else
winreturn(&mbox, ev);
- free(a);
break;
case 'x':
case 'X':
@@ -802,7 +801,6 @@
plumbfree(pshow);
break;
case Csendmail:
- print("got plumb: %s\n", psend->data);
compose(psend->data, nil, 0, 0);
plumbfree(psend);
break;
@@ -829,36 +827,45 @@
case 'T':
mbox.view = Vflat;
break;
+ case 's':
+ sender++;
+ break;
+
default:
usage();
break;
}ARGEND;
+ if(argc > 1)
+ usage();
+ if(argc == 1)
+ mailbox = argv[0];
+
doquote = needsrcquote;
quotefmtinstall();
tmfmtinstall();
- /* open these early so we won't miss notification of new mail messages while we read mbox */
- plumbsendfd = plumbopen("send", OWRITE|OCEXEC);
- plumbseemailfd = plumbopen("seemail", OREAD|OCEXEC);
- plumbshowmailfd = plumbopen("showmail", OREAD|OCEXEC);
- plumbsendmailfd = plumbopen("sendmail", OREAD|OCEXEC);
+
+ addrpat = regcomp("[^ \t]*@[^ \t]*\\.[^ \t]*");
+ mesgpat = regcomp("[0-9]+(/.*)?");
+ cwait = threadwaitchan();
+
+ /* open these early so we won't miss messages while loading */
mbox.event = chancreate(sizeof(Event*), 0);
mbox.see = chancreate(sizeof(Plumbmsg*), 0);
mbox.show = chancreate(sizeof(Plumbmsg*), 0);
mbox.send = chancreate(sizeof(Plumbmsg*), 0);
- addrpat = regcomp("[^ \t]*@[^ \t]*\\.[^ \t]*");
- mesgpat = regcomp("[0-9]+(/.*)?");
- cwait = threadwaitchan();
+ plumbsendfd = plumbopen("send", OWRITE|OCEXEC);
+ plumbseemailfd = plumbopen("seemail", OREAD|OCEXEC);
+ plumbshowmailfd = plumbopen("showmail", OREAD|OCEXEC);
- if(argc > 1)
- usage();
- if(argc == 1)
- mailbox = argv[0];
mbload();
proccreate(plumbseemail, nil, Stack);
proccreate(plumbshowmail, nil, Stack);
- proccreate(plumbsendmail, nil, Stack);
+ if(sender || strcmp(mailbox, "mbox") == 0){
+ plumbsendmailfd = plumbopen("sendmail", OREAD|OCEXEC);
+ proccreate(plumbsendmail, nil, Stack);
+ }
threadcreate(mbmain, nil, Stack);
threadexits(nil);
}
--- a/mesg.c
+++ b/mesg.c
@@ -379,7 +379,7 @@
static void
mesgmain(void *mp)
{
- char *a, *path, *f[32];
+ char *path, *f[32];
Event ev;
Mesg *m, **pm;
Fn *p;
@@ -406,13 +406,10 @@
switch(ev.type){
case 'l':
case 'L':
- if((a = matchaddr(m, &ev)) != nil)
- compose(a, nil, 0, 0);
- else if(matchmesg(m, ev.text))
+ if(matchmesg(m, ev.text))
mesgopen(ev.text, nil);
- else if((ev.flags & 0x2) == 0)
+ else
winreturn(m, &ev);
- free(a);
break;
case 'x':
case 'X':
--- a/win.c
+++ b/win.c
@@ -59,6 +59,10 @@
int
winevent(Win *w, Event *e)
{
+ int flags;
+
+ flags = 0;
+Again:
e->action = Bgetc(w->event);
e->type = Bgetc(w->event);
e->q0 = evgetnum(w->event);
@@ -69,6 +73,13 @@
werrstr("unterminated message");
return -1;
}
+//fprint(2, "event: %c%c %d %d %x %.*s\n", e->action, e->type, e->q0, e->q1, e->flags, e->ntext, e->text);
+ if(e->flags & 0x2){
+ e->p0 = e->q0;
+ flags = e->flags;
+ goto Again;
+ }
+ e->flags |= flags;
return e->action;
}
@@ -75,7 +86,10 @@
void
winreturn(Win *w, Event *e)
{
- fprint(w->revent, "%c%c%d %d\n", e->action, e->type, e->q0, e->q1);
+ if(e->flags & 0x2)
+ fprint(w->revent, "%c%c%d %d\n", e->action, e->type, e->p0, e->p0);
+ else
+ fprint(w->revent, "%c%c%d %d\n", e->action, e->type, e->q0, e->q1);
}
int
@@ -259,47 +273,6 @@
{
fprint(w->addr, "#%d,#%d", q0, q1);
fprint(w->ctl, "dot=addr");
-}
-
-static char*
-expandaddr(Win *w, Event *e)
-{
- static char *delim = "/[ \t\\n<>«»()\\[\\]]/";
- char *s;
- int q0, q1, ns;
-
- if(e->type != 'L' || e->q0 != e->q1)
- return nil;
-
- q0 = wineval(w, "#%d-%s", e->q0, delim);
- if(q0 == -1) /* bad char not found */
- q0 = 0;
- else /* increment past bad char */
- q0++;
-
- q1 = wineval(w, "#%d+%s", e->q0, delim);
- if(q1 < 0){
- q1 = wineval(w, "$");
- if(q1 < 0)
- return nil;
- }
- if(q0 >= q1)
- return nil;
- ns = (q1-q0)*UTFmax+1;
- s = emalloc(ns);
- winread(w, q0, q1, s, ns);
- return s;
-}
-
-char*
-matchaddr(Win *w, Event *e)
-{
- char *s;
-
- if((s = expandaddr(w, e)) != nil)
- if(regexec(addrpat, s, nil, 0))
- return s;
- return nil;
}
int