[2016-09-09 19:45] Philipp Takacs <phil...@bureaucracy.de>
> 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

Reply via email to