socsvn commit: r273285 - in soc2014/ghostmansd/head: bin/colldb lib lib/libcolldb share/examples/colldb usr.bin usr.bin/colldb

ghostmansd at FreeBSD.org ghostmansd at FreeBSD.org
Thu Aug 28 23:24:59 UTC 2014


Author: ghostmansd
Date: Thu Aug 28 23:24:56 2014
New Revision: 273285
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=273285

Log:
  colldb, its manual page and some small fixes

Added:
  soc2014/ghostmansd/head/usr.bin/colldb/
     - copied from r273177, soc2014/ghostmansd/head/bin/colldb/
  soc2014/ghostmansd/head/usr.bin/colldb/Makefile   (contents, props changed)
  soc2014/ghostmansd/head/usr.bin/colldb/colldb.c
Deleted:
  soc2014/ghostmansd/head/bin/colldb/
Modified:
  soc2014/ghostmansd/head/lib/Makefile
  soc2014/ghostmansd/head/lib/libcolldb/Makefile
  soc2014/ghostmansd/head/lib/libcolldb/colldb.h
  soc2014/ghostmansd/head/share/examples/colldb/colldb.py
  soc2014/ghostmansd/head/usr.bin/Makefile

Modified: soc2014/ghostmansd/head/lib/Makefile
==============================================================================
--- soc2014/ghostmansd/head/lib/Makefile	Thu Aug 28 22:52:20 2014	(r273284)
+++ soc2014/ghostmansd/head/lib/Makefile	Thu Aug 28 23:24:56 2014	(r273285)
@@ -37,6 +37,7 @@
 	libcam \
 	${_libcapsicum} \
 	${_libcasper} \
+	libcolldb \
 	${_libcom_err} \
 	libcompat \
 	libcrypt \
@@ -114,10 +115,6 @@
 	${_cuse} \
 	${_tests}
 
-.ifdef UNICODE
-SUBDIR+= libcolldb
-.endif
-
 # Inter-library dependencies.  When the makefile for a library contains LDADD
 # libraries, those libraries should be listed as build order dependencies here.
 

Modified: soc2014/ghostmansd/head/lib/libcolldb/Makefile
==============================================================================
--- soc2014/ghostmansd/head/lib/libcolldb/Makefile	Thu Aug 28 22:52:20 2014	(r273284)
+++ soc2014/ghostmansd/head/lib/libcolldb/Makefile	Thu Aug 28 23:24:56 2014	(r273285)
@@ -3,12 +3,7 @@
 SRCS=	colldb.c
 INCS=	colldb.h
 MAN+=	colldb.3
-
 CFLAGS+= -I${COLLDB}
-
-.colldb.py
-	install -m644 /usr/share/examples/collation
-
 WARNS?=	3
 
 .include <bsd.lib.mk>

Modified: soc2014/ghostmansd/head/lib/libcolldb/colldb.h
==============================================================================
--- soc2014/ghostmansd/head/lib/libcolldb/colldb.h	Thu Aug 28 22:52:20 2014	(r273284)
+++ soc2014/ghostmansd/head/lib/libcolldb/colldb.h	Thu Aug 28 23:24:56 2014	(r273285)
@@ -58,7 +58,12 @@
 
 
 #define	COLLDB_VERSION		0x00000001
-#define	COLLDB_WEIGHTS_MAX	10
+#ifndef COLLDB_CHARS_MAX
+#define	COLLDB_CHARS_MAX	8
+#endif
+#ifndef COLLDB_WEIGHTS_MAX
+#define	COLLDB_WEIGHTS_MAX	32
+#endif
 
 struct colldb_weight {
 	uint8_t alternate;
@@ -67,16 +72,19 @@
 	uint32_t level3;
 	uint32_t level4;
 };
+#define	COLLDB_WEIGHT_INIT	{0, 0, 0, 0, 0}
 
 struct colldb_key {
 	size_t count;
 	uint32_t *chars;
 };
+#define	COLLDB_KEY_INIT		{0, NULL}
 
 struct colldb_value {
 	size_t count;
 	struct colldb_weight *weights;
 };
+#define	COLLDB_VALUE_INIT	{0, NULL}
 
 
 void*	colldb_create(const char*, int mode);

Modified: soc2014/ghostmansd/head/share/examples/colldb/colldb.py
==============================================================================
--- soc2014/ghostmansd/head/share/examples/colldb/colldb.py	Thu Aug 28 22:52:20 2014	(r273284)
+++ soc2014/ghostmansd/head/share/examples/colldb/colldb.py	Thu Aug 28 23:24:56 2014	(r273285)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # *-* coding: utf-8 *-*
 """Python bindings for libcolldb"""
 

Modified: soc2014/ghostmansd/head/usr.bin/Makefile
==============================================================================
--- soc2014/ghostmansd/head/usr.bin/Makefile	Thu Aug 28 22:52:20 2014	(r273284)
+++ soc2014/ghostmansd/head/usr.bin/Makefile	Thu Aug 28 23:24:56 2014	(r273285)
@@ -26,6 +26,7 @@
 	${_clang} \
 	cmp \
 	col \
+	colldb \
 	colldef \
 	colrm \
 	column \

Added: soc2014/ghostmansd/head/usr.bin/colldb/Makefile
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2014/ghostmansd/head/usr.bin/colldb/Makefile	Thu Aug 28 23:24:56 2014	(r273285)
@@ -0,0 +1,10 @@
+#	@(#)Makefile	8.1 (Berkeley) 5/31/93
+
+PROG=		colldb
+MAN=		colldb.1
+DPADD=		${LIBCOLLDB}
+LDADD=		-lcolldb
+MLINKS+=	colldb.1
+LINKS+=		${BINDIR}/colldb
+
+.include <bsd.prog.mk>

Added: soc2014/ghostmansd/head/usr.bin/colldb/colldb.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ soc2014/ghostmansd/head/usr.bin/colldb/colldb.c	Thu Aug 28 23:24:56 2014	(r273285)
@@ -0,0 +1,172 @@
+/*-
+ * Copyright (c) 2014 Dmitry Selyutin.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DECOMPOSITION, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define _WITH_GETLINE
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdint.h>
+#include <colldb.h>
+
+
+int
+main(int argc, const char **argv)
+{
+	size_t i = 0;
+	int lineno = 0;
+	size_t cap = 0;
+	ssize_t len = 0;
+	FILE *src = NULL;
+	void *dst = NULL;
+	char *line = NULL;
+	char *iter = NULL;
+	char *repr = NULL;
+	char *check = NULL;
+	char *cdata = NULL;
+	char *wdata = NULL;
+	size_t ccount = 0;
+	size_t wcount = 0;
+	unsigned long code = 0;
+	uint32_t *levels[4] = {NULL};
+	uint32_t chars[COLLDB_CHARS_MAX] = {0};
+	struct colldb_key key = COLLDB_KEY_INIT;
+	struct colldb_value value = COLLDB_VALUE_INIT;
+	struct colldb_weight weights[COLLDB_WEIGHTS_MAX] = {COLLDB_WEIGHT_INIT};
+
+	if (argc != 3) {
+		fprintf(stderr, "usage: colldb source_file target_file\n");
+		return (EXIT_FAILURE);
+	}
+	src = fopen(argv[1], "rb");
+	if (src == NULL ) {
+		fprintf(stderr, "colldb: %s: %s\n", strerror(errno), argv[1]);
+		return (EXIT_FAILURE);
+	}
+	dst = colldb_create(argv[2], 0777);
+	if (dst == NULL) {
+		fprintf(stderr, "colldb: %s: %s\n", strerror(errno), argv[2]);
+		return (EXIT_FAILURE);
+	}
+
+	for (lineno = 1; ((len = getline(&line, &cap, src)) != -1); ++lineno) {
+		if ((line[0] == '#') || (line[0] == '@') || (line[0] == '\n'))
+			continue;
+		cdata = line;
+		for (iter = cdata; *iter != '\n'; ++iter) {
+			if (*iter == ';')
+				break;
+		}
+		if (*iter != ';')
+			goto failure;
+		wdata = (iter + 1);
+
+		/* Process characters. */
+		ccount = 0;
+		for (--iter; iter != cdata; --iter) {
+			if (!isspace(*iter))
+				break;
+			*iter = '\0';
+		}
+		for (repr = cdata; *repr != '\0'; ++ccount) {
+			if (ccount > COLLDB_CHARS_MAX) {
+				fprintf(stderr, "colldb: %s[%d]: %s\n",
+					argv[1], lineno, "overlong chars sequence\n");
+				free(line);
+				return (EXIT_FAILURE);
+			}
+			code = strtoul(repr, &check, 16);
+			if (repr == check)
+				goto failure;
+			chars[ccount] = (uint32_t)code;
+			repr = check;
+		}
+
+		/* Process weights. */
+		wcount = 0;
+		for (; isspace(*wdata); ++wdata);
+		for (iter = (line + len); iter != wdata; --iter) {
+			if (*iter == ']')
+				break;
+			*iter = '\0';
+		}
+		for (repr = wdata; *repr != '\0'; ++wcount) {
+			if (ccount > COLLDB_CHARS_MAX) {
+				fprintf(stderr, "colldb: %s[%d]: %s\n",
+					argv[1], lineno, "overlong weights sequence\n");
+				free(line);
+				return (EXIT_FAILURE);
+			}
+			if (*repr != '[')
+				goto failure;
+			++repr;
+			levels[0] = &weights[wcount].level1;
+			levels[1] = &weights[wcount].level2;
+			levels[2] = &weights[wcount].level3;
+			levels[3] = &weights[wcount].level4;
+			if ((*repr != '.') && (*repr != '*'))
+				goto failure;
+			weights[wcount].alternate = (*repr++ == '*');
+			for (i = 0; i < 4; ++i) {
+				code = strtoul(repr, &check, 16);
+				if (repr == check)
+					goto failure;
+				*(levels[i]) = (uint32_t)code;
+				if (isspace(*check) ||
+				   (*check == '.') || (*check == ']')) {
+					repr = (check + 1);
+					continue;
+				}
+				if ((*check == ']') && (i == 3))
+					break;
+				goto failure;
+			}
+		}
+
+		/* Store key and value pair. */
+		key.count = ccount;
+		key.chars = chars;
+		value.count = wcount;
+		value.weights = weights;
+		fprintf(stderr, "%d\n", lineno);
+		if (colldb_put(dst, &key, &value) != 0) {
+			fprintf(stderr, "colldb: %s: %s\n", argv[2], strerror(errno));
+			free(line);
+			return (EXIT_FAILURE);
+		}
+	}
+	colldb_close(dst);
+	fclose(src);
+	free(line);
+	return (EXIT_SUCCESS);
+
+failure:
+	fprintf(stderr, "colldb: %s[%d]: illegal format\n", argv[1], lineno);
+	free(line);
+	return (EXIT_FAILURE);
+}


More information about the svn-soc-all mailing list