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 Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include 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 .