Subject: [alpine-aports] [PATCH] testing/mmh: new aport

From: Sören Tempel <[email-masked]>
Date: Sat, 5 Sep 2015 04:42:06 +0200

---
 testing/mmh/APKBUILD         |  45 ++++
 testing/mmh/musl-fixes.patch | 537 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 582 insertions(+)
 create mode 100644 testing/mmh/APKBUILD
 create mode 100644 testing/mmh/musl-fixes.patch

diff --git a/testing/mmh/APKBUILD b/testing/mmh/APKBUILD
new file mode 100644
index 0000000..5c76241
--- /dev/null
+++ b/testing/mmh/APKBUILD
@@ -0,0 +1,45 @@
+# Contributor: Sören Tempel <[email-masked]>
+# Maintainer: Sören Tempel <[email-masked]>
+pkgname=mmh
+pkgver=0.1
+pkgrel=0
+pkgdesc="MUA for users who like the unix philosophy"
+url="http://marmaro.de/prog/mmh/"
+arch="all"
+license="BSD"
+depends=""
+depends_dev="ncurses-dev"
+makedepends="$depends_dev flex"
+install=""
+subpackages="$pkgname-doc"
+source="http://marmaro.de/prog/${pkgname}/files/${pkgname}-${pkgver}.tar.gz
+	musl-fixes.patch"
+
+_builddir="$srcdir"/$pkgname-$pkgver
+prepare() {
+	cd "$_builddir"
+	local i=
+	for i in $source; do
+		case $i in
+		*.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1 ;;
+		esac
+	done
+}
+
+build() {
+	cd "$_builddir"
+	./configure --prefix=/usr
+	make || return 1
+}
+
+package() {
+	make DESTDIR="${pkgdir}" \
+		-C "$_builddir" install || return 1
+}
+
+md5sums="df9c3aa40dc4edb15fd7d6a39c4777cd  mmh-0.1.tar.gz
+b7a44eea5bdee97078b7e19a5d2031ee  musl-fixes.patch"
+sha256sums="68c4285b72d26f922390b594980535829025a973c910c8490b415543f4c774b1  mmh-0.1.tar.gz
+2d232e308a7db86aa7e6893ea43052769c0684ae58336829b5c70739e5c801b8  musl-fixes.patch"
+sha512sums="2b24795862ace1f093f1861bb90012160b6e6c253c743ca4de1ecce46bfd03707b9579a2113139e96a8638fe451f7693ba28605b123a76b80a955acc9f3f7080  mmh-0.1.tar.gz
+e588bda54ecd1b61f8789550707a63f94efa0e172f3a012385044146005d8410643ea09d04d14ce1c1b14548905d8cf2db42714d5e7b157b2774ca207f06a978  musl-fixes.patch"
diff --git a/testing/mmh/musl-fixes.patch b/testing/mmh/musl-fixes.patch
new file mode 100644
index 0000000..4fc2726
--- /dev/null
+++ b/testing/mmh/musl-fixes.patch
@@ -0,0 +1,537 @@
+--- mmh-0.1.orig/sbr/discard.c
++++ mmh-0.1/sbr/discard.c
+@@ -18,14 +18,6 @@
+ 
+ 	tcflush(fileno(io), TCOFLUSH);
+ 
+-#if defined(_FSTDIO) || defined(__DragonFly__)
+-	fpurge(io);
+-#else
+-# ifdef LINUX_STDIO
+-	io->_IO_write_ptr = io->_IO_write_base;
+-# else
+-	if ((io->_ptr = io->_base))
+-		io->_cnt = 0;
+-# endif
+-#endif
++	/* There used to be an fpurge() here on some platforms, stdio
++	hackery on others.  But it didn't seem necessary. */
+ }
+--- mmh-0.1.orig/sbr/m_getfld.c
++++ mmh-0.1/sbr/m_getfld.c
+@@ -137,7 +137,7 @@
+ ** is used in m_Eom because the first character of the string
+ ** has been read and matched before m_Eom is called.
+ */
+-char *msg_delim = "";
++static char *msg_delim = "";
+ 
+ static unsigned char *fdelim;
+ static unsigned char *delimend;
+@@ -147,26 +147,85 @@
+ 
+ static int (*eom_action)(int) = NULL;
+ 
+-#ifdef _FSTDIO
+-# define _ptr _p  /* Gag   */
+-# define _cnt _r  /* Retch */
+-# define _filbuf __srget  /* Puke  */
+-# define DEFINED__FILBUF_TO_SOMETHING_SPECIFIC
+-#endif
++/*
++** This replaces the old approach, which included direct access to
++** stdio internals.  It uses one fread() to load a buffer that we
++** manage.
++*/
++#define MSG_INPUT_SIZE 8192
++static struct m_getfld_buffer {
++	unsigned char msg_buf[2 * MSG_INPUT_SIZE];
++	unsigned char *readpos;
++	unsigned char *end;  /* One past the last character read in. */
++} m;
+ 
+-#ifndef DEFINED__FILBUF_TO_SOMETHING_SPECIFIC
+-extern int  _filbuf(FILE*);
+-#endif
++static void
++setup_buffer(FILE *iob, struct m_getfld_buffer *m)
++{
++	/*
++	** Rely on Restrictions that m_getfld() calls on different file
++	** streams are not interleaved, and no other file stream read
++	** methods are used.  And, the first call to m_getfld (), etc., on
++	** a stream always reads at least 1 byte.
++	** I don't think it's necessary to use ftello() because we just
++	** need to determine whether the current offset is 0 or not.
++	*/
++	if (ftell(iob) == 0) {
++		/* A new file stream, so reset the buffer state. */
++		m->readpos = m->end = m->msg_buf;
++	}
++}
+ 
++static size_t
++read_more(struct m_getfld_buffer *m, FILE *iob)
++{
++	size_t num_read;
+ 
++	/* Move any leftover at the end of buf to the beginning. */
++	if (m->end > m->readpos) {
++		memmove(m->msg_buf, m->readpos, m->end - m->readpos);
++	}
++	m->readpos = m->msg_buf + (m->end - m->readpos);
++	num_read = fread(m->readpos, 1, MSG_INPUT_SIZE, iob);
++	m->end = m->readpos + num_read;
++
++	return num_read;
++}
++
++static int
++Getc(FILE *iob)
++{
++	if (m.end - m.readpos < 1) {
++		if (read_more(&m, iob) == 0) {
++			/*
++			**  Pretend that we read a character.
++			** That's what stdio does.
++			*/
++			++m.readpos;
++			return EOF;
++		}
++	}
++	return (m.readpos < m.end) ? *m.readpos++ : EOF;
++}
++
++static int
++Ungetc(int c, FILE *iob)
++{
++	return (m.readpos == m.msg_buf) ? EOF : (*--m.readpos = c);
++}
++
++
++
+ int
+ m_getfld(int state, unsigned char *name, unsigned char *buf,
+ 	int bufsz, FILE *iob)
+ {
+-	register unsigned char  *bp, *cp, *ep, *sp;
+-	register int cnt, c, i, j;
++	unsigned char  *bp, *cp, *ep, *sp;
++	int cnt, c, i, j, k;
+ 
+-	if ((c = getc(iob)) < 0) {
++	setup_buffer(iob, &m);
++
++	if ((c = Getc(iob)) < 0) {
+ 		msg_count = 0;
+ 		*buf = 0;
+ 		return FILEEOF;
+@@ -174,10 +233,10 @@
+ 	if (eom(c, iob)) {
+ 		if (! eom_action) {
+ 			/* flush null messages */
+-			while ((c = getc(iob)) >= 0 && eom(c, iob))
++			while ((c = Getc(iob)) >= 0 && eom(c, iob))
+ 				;
+ 			if (c >= 0)
+-				ungetc(c, iob);
++				Ungetc(c, iob);
+ 		}
+ 		msg_count = 0;
+ 		*buf = 0;
+@@ -190,16 +249,16 @@
+ 	case FLD:
+ 		if (c == '\n' || c == '-') {
+ 			/* we hit the header/body separator */
+-			while (c != '\n' && (c = getc(iob)) >= 0)
++			while (c != '\n' && (c = Getc(iob)) >= 0)
+ 				;
+ 
+-			if (c < 0 || (c = getc(iob)) < 0 || eom(c, iob)) {
++			if (c < 0 || (c = Getc(iob)) < 0 || eom(c, iob)) {
+ 				if (!eom_action) {
+ 					/* flush null messages */
+-					while ((c = getc(iob)) >= 0 && eom(c, iob))
++					while ((c = Getc(iob)) >= 0 && eom(c, iob))
+ 						;
+ 					if (c >= 0)
+-						ungetc(c, iob);
++						Ungetc(c, iob);
+ 				}
+ 				msg_count = 0;
+ 				*buf = 0;
+@@ -216,47 +275,28 @@
+ 		cp = name;
+ 		i = NAMESZ - 1;
+ 		for (;;) {
+-#ifdef LINUX_STDIO
+-			bp = sp = (unsigned char *) iob->_IO_read_ptr - 1;
+-			j = (cnt = ((long) iob->_IO_read_end -
+-				(long) iob->_IO_read_ptr)  + 1) < i ? cnt : i;
+-#elif defined(__DragonFly__)
+-			bp = sp = (unsigned char *) ((struct __FILE_public *)iob)->_p - 1;
+-			j = (cnt = ((struct __FILE_public *)iob)->_r+1) < i ? cnt : i;
+-#else
+-			bp = sp = (unsigned char *) iob->_ptr - 1;
+-			j = (cnt = iob->_cnt+1) < i ? cnt : i;
+-#endif
++			/* Store current pos, ungetting the last char. */
++			bp = sp = (unsigned char *) m.readpos - 1;
++			j = ((cnt = m.end - m.readpos + 1) < i) ? cnt : i;
++
+ 			while (--j >= 0 && (c = *bp++) != ':' && c != '\n')
+ 				*cp++ = c;
+ 
+ 			j = bp - sp;
+ 			if ((cnt -= j) <= 0) {
+-#ifdef LINUX_STDIO
+-				iob->_IO_read_ptr = iob->_IO_read_end;
+-				if (__underflow(iob) == EOF) {
+-#elif defined(__DragonFly__)
+-				if (__srget(iob) == EOF) {
+-#else
+-				if (_filbuf(iob) == EOF) {
+-#endif
++				/*
++				** Used to explicitly force refill of the
++				** buffer here, but Getc() will do that
++				** if necessary.
++				*/
++				if (Getc (iob) == EOF) {
+ 					*cp = *buf = 0;
+ 					advise(NULL, "eof encountered in field \"%s\"", name);
+ 					return FMTERR;
+ 				}
+-#ifdef LINUX_STDIO
+-				iob->_IO_read_ptr++; /* NOT automatic in __underflow()! */
+-#endif
+ 			} else {
+-#ifdef LINUX_STDIO
+-				iob->_IO_read_ptr = bp + 1;
+-#elif defined(__DragonFly__)
+-				((struct __FILE_public *)iob)->_p = bp + 1;
+-				((struct __FILE_public *)iob)->_r = cnt - 1;
+-#else
+-				iob->_ptr = bp + 1;
+-				iob->_cnt = cnt - 1;
+-#endif
++				/* Restore the current offset. */
++				m.readpos = bp + 1;
+ 			}
+ 			if (c == ':')
+ 				break;
+@@ -310,7 +350,13 @@
+ 				** that should be harmless enough, right?
+ 				** This is a corrupt message anyway.
+ 				*/
+-				fseek(iob, ftell(iob) - 2, SEEK_SET);
++				/* emulates:  fseek(iob, ftell(iob) -(-2 + cnt + 1), SEEK_SET) */
++				m.readpos += cnt - 1;
++				/*
++				** Reset file stream position so caller,
++				** e.g., get_content, can use ftell(), etc.
++				*/
++				fseek(iob, -cnt - 1, SEEK_CUR);
+ 				return BODY;
+ 			}
+ 			if ((i -= j) <= 0) {
+@@ -334,16 +380,9 @@
+ 		*/
+ 		cp = buf; i = bufsz-1;
+ 		for (;;) {
+-#ifdef LINUX_STDIO
+-			cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr;
+-			bp = (unsigned char *) --iob->_IO_read_ptr;
+-#elif defined(__DragonFly__)
+-			cnt = ((struct __FILE_public *)iob)->_r++;
+-			bp = (unsigned char *) --((struct __FILE_public *)iob)->_p;
+-#else
+-			cnt = iob->_cnt++;
+-			bp = (unsigned char *) --iob->_ptr;
+-#endif
++			/* Set and save the current pos and update cnt. */
++			cnt = m.end - m.readpos;
++			bp = --m.readpos;
+ 			c = cnt < i ? cnt : i;
+ 			while ((ep = locc( c, bp, '\n' ))) {
+ 				/*
+@@ -351,21 +390,13 @@
+ 				** return.
+ 				*/
+ 				if ((j = *++ep) != ' ' && j != '\t') {
+-#ifdef LINUX_STDIO
+-					j = ep - (unsigned char *) iob->_IO_read_ptr;
+-					memcpy(cp, iob->_IO_read_ptr, j);
+-					iob->_IO_read_ptr = ep;
+-#elif defined(__DragonFly__)
+-					j = ep - (unsigned char *) ((struct __FILE_public *)iob)->_p;
+-					memcpy(cp, ((struct __FILE_public *)iob)->_p, j);
+-					((struct __FILE_public *)iob)->_p = ep;
+-					((struct __FILE_public *)iob)->_r -= j;
+-#else
+-					j = ep - (unsigned char *) iob->_ptr;
+-					memcpy(cp, iob->_ptr, j);
+-					iob->_ptr = ep;
+-					iob->_cnt -= j;
+-#endif
++					/*
++					** Save the text and update the
++					** current position.
++					*/
++					j = ep - m.readpos;
++					memcpy (cp, m.readpos, j);
++					m.readpos = ep;
+ 					cp += j;
+ 					state = FLD;
+ 					goto finish;
+@@ -377,64 +408,34 @@
+ 			** end of input or dest buffer - copy what
+ 			** we've found.
+ 			*/
+-#ifdef LINUX_STDIO
+-			c += bp - (unsigned char *) iob->_IO_read_ptr;
+-			memcpy(cp, iob->_IO_read_ptr, c);
+-#elif defined(__DragonFly__)
+-			c += bp - (unsigned char *) ((struct __FILE_public *)iob)->_p;
+-			memcpy(cp, ((struct __FILE_public *)iob)->_p, c);
+-#else
+-			c += bp - (unsigned char *) iob->_ptr;
+-			memcpy(cp, iob->_ptr, c);
+-#endif
+-			i -= c;
+-			cp += c;
++			c += bp - m.readpos;
++			for (k = 0; k < c; ++k, --i) {
++				*cp++ = Getc (iob);
++			}
+ 			if (i <= 0) {
+ 				/* the dest buffer is full */
+-#ifdef LINUX_STDIO
+-				iob->_IO_read_ptr += c;
+-#elif defined(__DragonFly__)
+-				((struct __FILE_public *)iob)->_r -= c;
+-				((struct __FILE_public *)iob)->_p += c;
+-#else
+-				iob->_cnt -= c;
+-				iob->_ptr += c;
+-#endif
+ 				state = FLDPLUS;
+ 				break;
+ 			}
+ 			/*
+ 			** There's one character left in the input
+-			** buffer.  Copy it & fill the buffer.
+-			** If the last char was a newline and the
+-			** next char is not whitespace, this is
+-			** the end of the field.  Otherwise loop.
++			** buffer.  Copy it & fill the buffer (that
++			** fill used to be explicit, but now Getc()
++			** does it). If the last char was a newline
++			** and the next char is not whitespace, this
++			** is the end of the field.  Otherwise loop.
+ 			*/
+ 			--i;
+-#ifdef LINUX_STDIO
+-			*cp++ = j = *(iob->_IO_read_ptr + c);
+-			iob->_IO_read_ptr = iob->_IO_read_end;
+-			c = __underflow(iob);
+-			iob->_IO_read_ptr++;  /* NOT automatic! */
+-#elif defined(__DragonFly__)
+-			*cp++ =j = *(((struct __FILE_public *)iob)->_p + c);
+-			c = __srget(iob);
+-#else
+-			*cp++ = j = *(iob->_ptr + c);
+-			c = _filbuf(iob);
+-#endif
++			*cp++ = j = Getc(iob);
++			c = Getc(iob);
+ 			if (c == EOF ||
+ 			  ((j == '\0' || j == '\n') && c != ' ' && c != '\t')) {
+ 				if (c != EOF) {
+-#ifdef LINUX_STDIO
+-					--iob->_IO_read_ptr;
+-#elif defined(__DragonFly__)
+-					--((struct __FILE_public *)iob)->_p;
+-					++((struct __FILE_public *)iob)->_r;
+-#else
+-					--iob->_ptr;
+-					++iob->_cnt;
+-#endif
++					/*
++					** Put the character back for
++					** the next call.
++					*/
++					--m.readpos;
+ 				}
+ 				state = FLD;
+ 				break;
+@@ -452,17 +453,10 @@
+ 		** don't add an eos.
+ 		*/
+ 		i = (bufsz < 0) ? -bufsz : bufsz-1;
+-#ifdef LINUX_STDIO
+-		bp = (unsigned char *) --iob->_IO_read_ptr;
+-		cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr;
+-#elif defined(__DragonFly__)
+-		bp = (unsigned char *) --((struct __FILE_public *)iob)->_p;
+-		cnt = ++((struct __FILE_public *)iob)->_r;
+-#else
+-		bp = (unsigned char *) --iob->_ptr;
+-		cnt = ++iob->_cnt;
+-#endif
+-		c = (cnt < i ? cnt : i);
++		/* Back up and store the current position and update cnt. */
++		bp = --m.readpos;
++		cnt = m.end - m.readpos;
++		c = (cnt < i) ? cnt : i;
+ 		if (ismbox && c > 1) {
+ 			/*
+ 			** packed maildrop - only take up to the (possible)
+@@ -545,15 +539,8 @@
+ 			}
+ 		}
+ 		memcpy( buf, bp, c );
+-#ifdef LINUX_STDIO
+-		iob->_IO_read_ptr += c;
+-#elif defined(__DragonFly__)
+-		((struct __FILE_public *)iob)->_r -= c;
+-		((struct __FILE_public *)iob)->_p += c;
+-#else
+-		iob->_cnt -= c;
+-		iob->_ptr += c;
+-#endif
++		/* Advance the current position to reflect the copy out. */
++		m.readpos += c;
+ 		if (bufsz < 0) {
+ 			msg_count = c;
+ 			return (state);
+@@ -574,16 +561,18 @@
+ void
+ thisisanmbox(FILE *iob)
+ {
+-	register int c;
++	int c;
+ 	char text[10];
+-	register char *cp;
+-	register char *delimstr;
++	char *cp;
++	char *delimstr;
+ 
+-	c = getc(iob); 
++	setup_buffer(iob, &m);
++
++	c = Getc(iob); 
+ 	if (feof(iob)) {
+ 		return;
+ 	}
+-	ungetc(c, iob);
++	Ungetc(c, iob);
+ 
+ 	/*
+ 	** Figure out what the message delimitter string is for this
+@@ -597,7 +586,12 @@
+ 	** abort.
+ 	*/
+ 
+-	if (fread(text, sizeof(*text), 5, iob) != 5) {
++	for (c=0, cp=text; c<5; ++c, ++cp) {
++		if ((*cp = Getc(iob)) == EOF) {
++			break;
++		}
++	}
++	if (c != 5) {
+ 		adios(NULL, "Read error");
+ 	}
+ 	if (strncmp(text, "From ", 5)!=0) {
+@@ -605,7 +599,7 @@
+ 	}
+ 	ismbox = TRUE;
+ 	delimstr = "\nFrom ";
+-	while ((c = getc(iob)) != '\n' && c >= 0) {
++	while ((c = Getc(iob)) != '\n' && c >= 0) {
+ 		continue;
+ 	}
+ 	c = strlen(delimstr);
+@@ -628,8 +622,9 @@
+ 	*/
+ 	pat_map = (unsigned char **) calloc(256, sizeof(unsigned char *));
+ 
+-	for (cp = (char *) fdelim + 1; cp < (char *) delimend; cp++ )
++	for (cp = (char *) fdelim + 1; cp < (char *) delimend; cp++) {
+ 		pat_map[(unsigned char)*cp] = (unsigned char *) cp;
++	}
+ }
+ 
+ 
+@@ -640,27 +635,34 @@
+ static int
+ m_Eom(int c, FILE *iob)
+ {
+-	register long pos = 0L;
+-	register int i;
++	unsigned char *pos;
++	int i;
+ 	char text[10];
++	char *cp;
+ 
+-	pos = ftell(iob);
+-	if ((i = fread(text, sizeof *text, edelimlen, iob)) != edelimlen ||
++	pos = m.readpos; /* ftell */
++	for (i=0, cp=text; i<edelimlen; ++i, ++cp) {
++		if ((*cp = Getc(iob)) == EOF) {
++			break;
++		}
++	}
++
++	if (i != edelimlen ||
+ 			(strncmp(text, (char *)edelim, edelimlen)!=0)) {
+-		if (i == 0 && ismbox)
++		if (i == 0 && ismbox) {
+ 			/*
+ 			** the final newline in the (brain damaged) unix-format
+ 			** maildrop is part of the delimitter - delete it.
+ 			*/
+ 			return 1;
+-
+-		fseek(iob, (long)(pos-1), SEEK_SET);
+-		getc(iob);  /* should be OK */
++		}
++		m.readpos = pos - 1;  /* fseek(iob, pos - 1, SEEK_SET) */
++		Getc(iob);  /* should be OK */
+ 		return 0;
+ 	}
+ 
+ 	if (ismbox) {
+-		while ((c = getc(iob)) != '\n' && c >= 0) {
++		while ((c = Getc(iob)) != '\n' && c >= 0) {
+ 			continue;
+ 		}
+ 	}
+@@ -672,11 +674,11 @@
+ static unsigned char *
+ matchc(int patln, char *pat, int strln, char *str)
+ {
+-	register char *es = str + strln - patln;
+-	register char *sp;
+-	register char *pp;
+-	register char *ep = pat + patln;
+-	register char pc = *pat++;
++	char *es = str + strln - patln;
++	char *sp;
++	char *pp;
++	char *ep = pat + patln;
++	char pc = *pat++;
+ 
+ 	for(;;) {
+ 		while (pc != *str++)
+--- mmh-0.1.orig/uip/Makefile.in
++++ mmh-0.1/uip/Makefile.in
+@@ -32,7 +32,7 @@
+ 
+ COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS)
+ LINK    = $(CC) $(LDFLAGS) -o $@
+-LN = ln
++LN = ln -s
+ 
+ INSTALL         = @INSTALL@
+ INSTALL_PROGRAM = @INSTALL_PROGRAM@
-- 
2.5.1

---
Unsubscribe:  [email-masked]
Help:         [email-masked]
---