SMOLNET PORTAL home about changes
iInitial commit. - utf8expr - expr(1) for UTF-8	Err	bitreich.org	70
hgit clone git://bitreich.org/utf8expr/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/utf8expr/	URL:git://bitreich.org/utf8expr/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/utf8expr/	bitreich.org	70
1Log	/scm/utf8expr/log.gph	bitreich.org	70
1Files	/scm/utf8expr/files.gph	bitreich.org	70
1Refs	/scm/utf8expr/refs.gph	bitreich.org	70
1Tags	/scm/utf8expr/tag	bitreich.org	70
1LICENSE	/scm/utf8expr/file/LICENSE.gph	bitreich.org	70
i---	Err	bitreich.org	70
1commit 4d85a682220a55d83e8c6460808329e72becca36	/scm/utf8expr/commit/4d85a682220a55d83e8c6460808329e72becca36.gph	bitreich.org	70
hAuthor: Christoph Lohmann <20h@r-36.net>	URL:mailto:20h@r-36.net	bitreich.org	70
iDate:   Mon, 21 May 2012 17:35:22 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iInitial commit.	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  A LICENSE                             |      21 +++++++++++++++++++++	Err	bitreich.org	70
i  A Makefile                            |      56 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A arg.h                               |      41 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A config.mk                           |      23 +++++++++++++++++++++++	Err	bitreich.org	70
i  A utf8expr.1                          |      41 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i  A utf8expr.c                          |     173 +++++++++++++++++++++++++++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i6 files changed, 355 insertions(+), 0 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/LICENSE b/LICENSE	/scm/utf8expr/file/LICENSE.gph	bitreich.org	70
i@@ -0,0 +1,21 @@	Err	bitreich.org	70
i+MIT/X Consortium License	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+© 2012 Christoph Lohmann <20h@r-36.net>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+Permission is hereby granted, free of charge, to any person obtaining a	Err	bitreich.org	70
i+copy of this software and associated documentation files (the "Software"),	Err	bitreich.org	70
i+to deal in the Software without restriction, including without limitation	Err	bitreich.org	70
i+the rights to use, copy, modify, merge, publish, distribute, sublicense,	Err	bitreich.org	70
i+and/or sell copies of the Software, and to permit persons to whom the	Err	bitreich.org	70
i+Software is furnished to do so, subject to the following conditions:	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+The above copyright notice and this permission notice shall be included in	Err	bitreich.org	70
i+all copies or substantial portions of the Software.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR	Err	bitreich.org	70
i+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,	Err	bitreich.org	70
i+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL	Err	bitreich.org	70
i+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER	Err	bitreich.org	70
i+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING	Err	bitreich.org	70
i+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER	Err	bitreich.org	70
i+DEALINGS IN THE SOFTWARE.	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/utf8expr/file/Makefile.gph	bitreich.org	70
i@@ -0,0 +1,56 @@	Err	bitreich.org	70
i+# utf8expr – expr(1) for utf8 	Err	bitreich.org	70
i+# See LICENSE file for copyright and license details.	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+include config.mk	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+SRC = ${NAME}.c	Err	bitreich.org	70
i+OBJ = ${SRC:.c=.o}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+all: options ${NAME}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+options:	Err	bitreich.org	70
i+        @echo ${NAME} build options:	Err	bitreich.org	70
i+        @echo "CFLAGS   = ${CFLAGS}"	Err	bitreich.org	70
i+        @echo "LDFLAGS  = ${LDFLAGS}"	Err	bitreich.org	70
i+        @echo "CC       = ${CC}"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+.c.o:	Err	bitreich.org	70
i+        @echo CC $<	Err	bitreich.org	70
i+        @${CC} -c ${CFLAGS} $<	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+${OBJ}: config.mk	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+${NAME}: ${OBJ}	Err	bitreich.org	70
i+        @echo CC -o $@	Err	bitreich.org	70
i+        @${CC} -o $@ ${OBJ} ${LDFLAGS}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+clean:	Err	bitreich.org	70
i+        @echo cleaning	Err	bitreich.org	70
i+        @rm -f ${NAME} ${OBJ} ${NAME}-${VERSION}.tar.gz	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+dist: clean	Err	bitreich.org	70
i+        @echo creating dist tarball	Err	bitreich.org	70
i+        @mkdir -p ${NAME}-${VERSION}	Err	bitreich.org	70
i+        @cp -R LICENSE Makefile config.mk \	Err	bitreich.org	70
i+                ${SRC} ${NAME}.8 *.h ${NAME}-${VERSION}	Err	bitreich.org	70
i+        @tar -cf ${NAME}-${VERSION}.tar ${NAME}-${VERSION}	Err	bitreich.org	70
i+        @gzip ${NAME}-${VERSION}.tar	Err	bitreich.org	70
i+        @rm -rf ${NAME}-${VERSION}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+install: all	Err	bitreich.org	70
i+        @echo installing executable file to ${DESTDIR}${PREFIX}/bin	Err	bitreich.org	70
i+        @mkdir -p ${DESTDIR}${PREFIX}/bin	Err	bitreich.org	70
i+        @cp -f ${NAME} ${DESTDIR}${PREFIX}/bin	Err	bitreich.org	70
i+        @chmod 755 ${DESTDIR}${PREFIX}/bin/${NAME}	Err	bitreich.org	70
i+        @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1	Err	bitreich.org	70
i+        @mkdir -p ${DESTDIR}${MANPREFIX}/man1	Err	bitreich.org	70
i+        @cp -f ${NAME}.1 ${DESTDIR}${MANPREFIX}/man1	Err	bitreich.org	70
i+        @chmod 644 ${DESTDIR}${MANPREFIX}/man1/${NAME}.1	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+uninstall:	Err	bitreich.org	70
i+        @echo removing executable file from ${DESTDIR}${PREFIX}/bin	Err	bitreich.org	70
i+        @rm -f ${DESTDIR}${PREFIX}/bin/${NAME}	Err	bitreich.org	70
i+        @echo removing manual page from ${DESTDIR}${PREFIX}/man1	Err	bitreich.org	70
i+        @rm -f ${DESTDIR}${MANPREFIX}/man1/${NAME}.1	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+.PHONY: all options clean dist install uninstall	Err	bitreich.org	70
1diff --git a/arg.h b/arg.h	/scm/utf8expr/file/arg.h.gph	bitreich.org	70
i@@ -0,0 +1,41 @@	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Copy me if you can.	Err	bitreich.org	70
i+ * by 20h	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#ifndef __ARG_H__	Err	bitreich.org	70
i+#define __ARG_H__	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+extern char *argv0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define USED(x) ((void)(x))	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define ARGBEGIN        for (argv0 = *argv, argv++, argc--;\	Err	bitreich.org	70
i+                                        argv[0] && argv[0][1]\	Err	bitreich.org	70
i+                                        && argv[0][0] == '-';\	Err	bitreich.org	70
i+                                        argc--, argv++) {\	Err	bitreich.org	70
i+                                char _argc;\	Err	bitreich.org	70
i+                                char **_argv;\	Err	bitreich.org	70
i+                                if (argv[0][1] == '-' && argv[0][2] == '\0') {\	Err	bitreich.org	70
i+                                        argv++;\	Err	bitreich.org	70
i+                                        argc--;\	Err	bitreich.org	70
i+                                        break;\	Err	bitreich.org	70
i+                                }\	Err	bitreich.org	70
i+                                for (argv[0]++, _argv = argv; argv[0][0];\	Err	bitreich.org	70
i+                                                argv[0]++) {\	Err	bitreich.org	70
i+                                        if (_argv != argv)\	Err	bitreich.org	70
i+                                                break;\	Err	bitreich.org	70
i+                                        _argc = argv[0][0];\	Err	bitreich.org	70
i+                                        switch (_argc)	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define ARGEND                        }\	Err	bitreich.org	70
i+                                USED(_argc);\	Err	bitreich.org	70
i+                        }\	Err	bitreich.org	70
i+                        USED(argv);\	Err	bitreich.org	70
i+                        USED(argc);	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#define EARGF(x)        ((argv[1] == NULL)? ((x), abort(), (char *)0) :\	Err	bitreich.org	70
i+                        (argc--, argv++, argv[0]))	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#endif	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/config.mk b/config.mk	/scm/utf8expr/file/config.mk.gph	bitreich.org	70
i@@ -0,0 +1,23 @@	Err	bitreich.org	70
i+# nldev metadata	Err	bitreich.org	70
i+NAME = utf8expr	Err	bitreich.org	70
i+VERSION = 0.8	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# Customize below to fit your system	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# paths	Err	bitreich.org	70
i+PREFIX = /usr/local	Err	bitreich.org	70
i+MANPREFIX = ${PREFIX}/share/man	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# includes and libs	Err	bitreich.org	70
i+INCS = -I. -I/usr/include	Err	bitreich.org	70
i+LIBS = -L/usr/lib -lc	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# flags	Err	bitreich.org	70
i+CPPFLAGS = -DVERSION=\"${VERSION}\"	Err	bitreich.org	70
i+CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}	Err	bitreich.org	70
i+LDFLAGS = -static -g ${LIBS}	Err	bitreich.org	70
i+#LDFLAGS = -s ${LIBS}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+# compiler and linker	Err	bitreich.org	70
i+CC = cc	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/utf8expr.1 b/utf8expr.1	/scm/utf8expr/file/utf8expr.1.gph	bitreich.org	70
i@@ -0,0 +1,41 @@	Err	bitreich.org	70
i+.Dd May 21, 2012 	Err	bitreich.org	70
i+.Dt UTF8EXPR 1	Err	bitreich.org	70
i+.Os	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh NAME	Err	bitreich.org	70
i+.Nm utf8expr	Err	bitreich.org	70
i+.Nd evalute UTF-8 expressions	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh SYNOPSIS	Err	bitreich.org	70
i+.Nm	Err	bitreich.org	70
i+.Bk -words	Err	bitreich.org	70
i+EXPRESSION	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh DESCRIPTION	Err	bitreich.org	70
i+.Bd -filled	Err	bitreich.org	70
i+.Nm	Err	bitreich.org	70
i+will evalute a subset of the expr(1) syntax with taking care	Err	bitreich.org	70
i+of UTF-8 characters.	Err	bitreich.org	70
i+.Ed	Err	bitreich.org	70
i+. 	Err	bitreich.org	70
i+.Sh EXPRESSIONS 	Err	bitreich.org	70
i+.Pp	Err	bitreich.org	70
i+.Bl -tag -width ".Fl test Ao Ar string Ac"	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.It substr STRING POS LENGTH	Err	bitreich.org	70
i+substring of STRING, POS counted from 1	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.It index STRING CHARS	Err	bitreich.org	70
i+index in STRING where any CHARS is found, or 0	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.It length STRING	Err	bitreich.org	70
i+length of STRING	Err	bitreich.org	70
i+. 	Err	bitreich.org	70
i+.Sh AUTHORS	Err	bitreich.org	70
i+See the LICENSE file for the authors of this software.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+.Sh LICENSE	Err	bitreich.org	70
i+.Nm	Err	bitreich.org	70
i+is released under the MIT/X Consortium License.	Err	bitreich.org	70
i+.	Err	bitreich.org	70
i+	Err	bitreich.org	70
1diff --git a/utf8expr.c b/utf8expr.c	/scm/utf8expr/file/utf8expr.c.gph	bitreich.org	70
i@@ -0,0 +1,173 @@	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Copy me if you can.	Err	bitreich.org	70
i+ * by 20h	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include <unistd.h>	Err	bitreich.org	70
i+#include <string.h>	Err	bitreich.org	70
i+#include <stdlib.h>	Err	bitreich.org	70
i+#include <stdio.h>	Err	bitreich.org	70
i+#include <libgen.h>	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+#include "arg.h"	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char *argv0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+/*	Err	bitreich.org	70
i+ * Idea taken from:	Err	bitreich.org	70
i+ *        http://canonical.org/~kragen/strlen-utf8.html	Err	bitreich.org	70
i+ */	Err	bitreich.org	70
i+size_t	Err	bitreich.org	70
i+utf8strlen(char *s)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        size_t i;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        i = 0;	Err	bitreich.org	70
i+        for (; s[0]; s++) {	Err	bitreich.org	70
i+                if ((s[0] & 0xc0) != 0x80)	Err	bitreich.org	70
i+                        i++;	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return i;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char *	Err	bitreich.org	70
i+utf8strchr(char *s, char *c)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        size_t j, cl;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        cl = strlen(c);	Err	bitreich.org	70
i+        if (cl == 0)	Err	bitreich.org	70
i+                return NULL;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        for (j = 0; ; s++) {	Err	bitreich.org	70
i+                if (j > 6)	Err	bitreich.org	70
i+                        return NULL;	Err	bitreich.org	70
i+                j++;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                if ((s[0] & 0xc0) != 0x80 || s[0] == '\0') {	Err	bitreich.org	70
i+                        if (cl == j) {	Err	bitreich.org	70
i+                                if (!memcmp(&s[-j], c, cl))	Err	bitreich.org	70
i+                                        return &s[-j];	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                        j = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                        if (s[0] == '\0')	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return NULL;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+char *	Err	bitreich.org	70
i+utf8substr(char *s, size_t pos, size_t *length)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        size_t i, j, rl;	Err	bitreich.org	70
i+        char *ret;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (*length < 1)	Err	bitreich.org	70
i+                return NULL;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        ret = NULL;	Err	bitreich.org	70
i+        rl = 0;	Err	bitreich.org	70
i+        for (i = 0, j = 0; *length > 0; s++) {	Err	bitreich.org	70
i+                if (j > 6)	Err	bitreich.org	70
i+                        return NULL;	Err	bitreich.org	70
i+                j++;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                if (ret != NULL)	Err	bitreich.org	70
i+                        rl++;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                if ((s[0] & 0xc0) != 0x80 || s[0] == '\0') {	Err	bitreich.org	70
i+                        if (i >= pos) {	Err	bitreich.org	70
i+                                if (ret == NULL) {	Err	bitreich.org	70
i+                                        ret = &s[-j];	Err	bitreich.org	70
i+                                        rl = j;	Err	bitreich.org	70
i+                                }	Err	bitreich.org	70
i+                                (*length)--;	Err	bitreich.org	70
i+                        }	Err	bitreich.org	70
i+                        i++;	Err	bitreich.org	70
i+                        j = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                        if (s[0] == '\0')	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        *length = rl;	Err	bitreich.org	70
i+        return ret;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+size_t	Err	bitreich.org	70
i+utf8index(char *s, char *chars)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        size_t i, j;	Err	bitreich.org	70
i+        char c[7];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        j = 0;	Err	bitreich.org	70
i+        for (i = 0; ; s++) {	Err	bitreich.org	70
i+                if (j > 6)	Err	bitreich.org	70
i+                        return 0;	Err	bitreich.org	70
i+                j++;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                if ((s[0] & 0xc0) != 0x80 || s[0] == '\0') {	Err	bitreich.org	70
i+                        memset(c, 0, sizeof(c));	Err	bitreich.org	70
i+                        memmove(c, &s[-j], j);	Err	bitreich.org	70
i+                        if (utf8strchr(chars, c))	Err	bitreich.org	70
i+                                return i;	Err	bitreich.org	70
i+                        i++;	Err	bitreich.org	70
i+                        j = 0;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+                        if (s[0] == '\0')	Err	bitreich.org	70
i+                                break;	Err	bitreich.org	70
i+                }	Err	bitreich.org	70
i+        }	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+void	Err	bitreich.org	70
i+usage(void)	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        fprintf(stderr, "usage: %s [substr|index|length] str [args ...]\n",	Err	bitreich.org	70
i+                        basename(argv0));	Err	bitreich.org	70
i+        exit(1);	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+int	Err	bitreich.org	70
i+main(int argc, char *argv[])	Err	bitreich.org	70
i+{	Err	bitreich.org	70
i+        char *s;	Err	bitreich.org	70
i+        size_t len;	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        argv0 = argv[0];	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        if (argc < 3)	Err	bitreich.org	70
i+                usage();	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        switch(argv[1][0]) {	Err	bitreich.org	70
i+        case 'i':	Err	bitreich.org	70
i+                if (argc < 4)	Err	bitreich.org	70
i+                        usage();	Err	bitreich.org	70
i+                printf("%ld\n", utf8index(argv[2], argv[3]));	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case 'l':	Err	bitreich.org	70
i+                printf("%ld\n", utf8strlen(argv[2]));	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        case 's':	Err	bitreich.org	70
i+                if (argc < 5)	Err	bitreich.org	70
i+                        usage();	Err	bitreich.org	70
i+                len = atoi(argv[4]);	Err	bitreich.org	70
i+                s = utf8substr(argv[2], atoi(argv[3]), &len);	Err	bitreich.org	70
i+                if (s == NULL)	Err	bitreich.org	70
i+                        return -1;	Err	bitreich.org	70
i+                printf("%.*s\n", (int)len, s);	Err	bitreich.org	70
i+                break;	Err	bitreich.org	70
i+        default:	Err	bitreich.org	70
i+                usage();	Err	bitreich.org	70
i+        };	Err	bitreich.org	70
i+	Err	bitreich.org	70
i+        return 0;	Err	bitreich.org	70
i+}	Err	bitreich.org	70
i+	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/utf8expr/commit/4d85a682220a5...
Content-Typetext/plain; charset=utf-8