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