[2016-09-09 19:45] Philipp Takacs <[email protected]>
> It wouldn't be that complicate. We would to replace the
>
> > printf("%s\n", m_name(msgnum));
>
> with a call to scan() and add the ``-format'' switch.
>
> In other words pick supports only the format '=%(msg)' at
> the moment. If we have a format switch in pick we could replace
> scan by a symlink to pick.
I have implemented this to have a code example we can discouse
not only an idea. The patch is attached.
Philipp
diff --git a/uip/Makefile.in b/uip/Makefile.in
index e7e7b46..cd43aaa 100644
--- a/uip/Makefile.in
+++ b/uip/Makefile.in
@@ -172,8 +172,8 @@ new: new.o $(LOCALLIBS)
packf: packf.o dropsbr.o $(LOCALLIBS)
$(LINK) packf.o dropsbr.o $(LINKLIBS)
-pick: pick.o $(LOCALLIBS)
- $(LINK) pick.o $(LINKLIBS)
+pick: pick.o scansbr.o termsbr.o $(LOCALLIBS)
+ $(LINK) pick.o scansbr.o termsbr.o $(LINKLIBS) $(TERMLIB)
print-mimetype: print-mimetype.sh
cp $(srcdir)/print-mimetype.sh print-mimetype
diff --git a/uip/pick.c b/uip/pick.c
index 4cb33fb..10f79ef 100644
--- a/uip/pick.c
+++ b/uip/pick.c
@@ -12,6 +12,8 @@
#include <unistd.h>
#include <locale.h>
#include <sysexits.h>
+#include <h/scansbr.h>
+#include <h/fmt_scan.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
@@ -63,9 +65,13 @@ static struct swit switches[] = {
{ "list", 0 },
#define NLISTSW 21
{ "nolist", 2 },
-#define VERSIONSW 22
+#define FORMATSW 22
+ { "format format", 0 },
+#define WIDTHSW 23
+ { "width columns", 0 },
+#define VERSIONSW 24
{ "Version", 0 },
-#define HELPSW 23
+#define HELPSW 25
{ "help", 0 },
{ NULL, 0 }
};
@@ -83,10 +89,12 @@ static int listsw = -1;
void putzero_done();
+void printmsg(FILE *f, struct msgs *mp, int msgnum, char *fmtstr, int width);
+
int
main(int argc, char **argv)
{
- int publicsw = -1, zerosw = 1, vecp = 0;
+ int publicsw = -1, zerosw = 1, vecp = 0, width = 0;
unsigned int seqp = 0;
int lo, hi, msgnum;
char *maildir, *folder = NULL, buf[100];
@@ -94,9 +102,11 @@ main(int argc, char **argv)
char *seqs[NUMATTRS + 1], *vec[MAXARGS];
struct msgs_array msgs = { 0, 0, NULL };
struct msgs *mp;
+ char *form = NULL;
+ char *fmtstr;
FILE *fp;
- if (atexit(putzero_done) != 0) {
+ if (atexit(putzero_done) != 0) {
adios(EX_OSERR, NULL, "atexit failed");
}
@@ -109,6 +119,10 @@ main(int argc, char **argv)
arguments = getarguments(invo_name, argc, argv, 1);
argp = arguments;
+ if (strcmp(invo_name,"scan")==0) {
+ form = scanformat;
+ }
+
while ((cp = *argp++)) {
if (*cp == '-') {
if (*++cp == '-') {
@@ -193,6 +207,18 @@ main(int argc, char **argv)
case NLISTSW:
listsw = 0;
continue;
+ case FORMATSW:
+ if (!(form = *argp++) || *form == '-') {
+ adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]);
+ }
+ continue;
+ case WIDTHSW:
+ if (!(cp = *argp++) || *cp == '-') {
+ adios(EX_USAGE, NULL, "missing argument to %s",
+ argp[-2]);
+ }
+ width = atoi(cp);
+ continue;
}
}
if (*cp == '+' || *cp == '@') {
@@ -205,6 +231,8 @@ main(int argc, char **argv)
}
vec[vecp] = NULL;
+ fmtstr = new_fs(form, "pick.default");
+
/*
** If we didn't specify which messages to search,
** then search the whole folder.
@@ -271,8 +299,10 @@ main(int argc, char **argv)
if (msgnum > hi)
hi = msgnum;
- if (listsw)
- printf("%s\n", m_name(msgnum));
+ if (listsw) {
+ printmsg(fp, mp, msgnum, fmtstr, width);
+ /* printf("%s\n", m_name(msgnum)); */
+ }
} else {
/* if it doesn't match, then unselect it */
unset_selected(mp, msgnum);
@@ -320,6 +350,30 @@ putzero_done()
printf("0\n");
}
+void printmsg(FILE *f, struct msgs *mp, int msgnum, char *fmtstr, int width)
+{
+ int seqnum;
+ int state;
+ boolean unseen = FALSE;
+
+ fseek(f, 0L, SEEK_SET);
+
+ seqnum = seq_getnum(mp, seq_unseen);
+ unseen = in_sequence(mp, seqnum, msgnum);
+
+ switch (state = scan(f, msgnum, SCN_FOLD, fmtstr,
+ width, msgnum==mp->curmsg, unseen)) {
+ case SCNMSG:
+ case SCNERR:
+ break;
+ case SCNEOF:
+ advise(NULL, "message %d: empty", msgnum);
+ break;
+ default:
+ adios(EX_SOFTWARE, NULL, "scan() botch(%d)", state);
+ }
+}
+
static struct swit parswit[] = {
#define PRAND 0