test for utf8 stuff

diff --git a/skeletons/tests/Makefile.am b/skeletons/tests/Makefile.am
index eb1f018..a58e469 100644
--- a/skeletons/tests/Makefile.am
+++ b/skeletons/tests/Makefile.am
@@ -5,6 +5,7 @@
 	check-length		\
 	check-OIDs		\
 	check-GeneralizedTime	\
+	check-UTF8String	\
 	check-UTCTime		\
 	check-INTEGER		\
 	check-REAL
diff --git a/skeletons/tests/Makefile.in b/skeletons/tests/Makefile.in
index 0587cec..835df71 100644
--- a/skeletons/tests/Makefile.in
+++ b/skeletons/tests/Makefile.in
@@ -13,7 +13,7 @@
 # PARTICULAR PURPOSE.
 
 @SET_MAKE@
-SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-REAL.c check-UTCTime.c check-ber_tlv_tag.c check-length.c
+SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c check-REAL.c check-UTCTime.c check-UTF8String.c check-ber_tlv_tag.c check-length.c
 
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
@@ -38,8 +38,8 @@
 host_triplet = @host@
 check_PROGRAMS = check-ber_tlv_tag$(EXEEXT) check-length$(EXEEXT) \
 	check-OIDs$(EXEEXT) check-GeneralizedTime$(EXEEXT) \
-	check-UTCTime$(EXEEXT) check-INTEGER$(EXEEXT) \
-	check-REAL$(EXEEXT)
+	check-UTF8String$(EXEEXT) check-UTCTime$(EXEEXT) \
+	check-INTEGER$(EXEEXT) check-REAL$(EXEEXT)
 subdir = skeletons/tests
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -69,6 +69,10 @@
 check_UTCTime_OBJECTS = check-UTCTime.$(OBJEXT)
 check_UTCTime_LDADD = $(LDADD)
 check_UTCTime_DEPENDENCIES =
+check_UTF8String_SOURCES = check-UTF8String.c
+check_UTF8String_OBJECTS = check-UTF8String.$(OBJEXT)
+check_UTF8String_LDADD = $(LDADD)
+check_UTF8String_DEPENDENCIES =
 check_ber_tlv_tag_SOURCES = check-ber_tlv_tag.c
 check_ber_tlv_tag_OBJECTS = check-ber_tlv_tag.$(OBJEXT)
 check_ber_tlv_tag_LDADD = $(LDADD)
@@ -85,6 +89,7 @@
 @AMDEP_TRUE@	./$(DEPDIR)/check-OIDs.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/check-REAL.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/check-UTCTime.Po \
+@AMDEP_TRUE@	./$(DEPDIR)/check-UTF8String.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/check-ber_tlv_tag.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/check-length.Po
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
@@ -96,11 +101,11 @@
 LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \
-	check-REAL.c check-UTCTime.c check-ber_tlv_tag.c \
-	check-length.c
+	check-REAL.c check-UTCTime.c check-UTF8String.c \
+	check-ber_tlv_tag.c check-length.c
 DIST_SOURCES = check-GeneralizedTime.c check-INTEGER.c check-OIDs.c \
-	check-REAL.c check-UTCTime.c check-ber_tlv_tag.c \
-	check-length.c
+	check-REAL.c check-UTCTime.c check-UTF8String.c \
+	check-ber_tlv_tag.c check-length.c
 ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -271,6 +276,9 @@
 check-UTCTime$(EXEEXT): $(check_UTCTime_OBJECTS) $(check_UTCTime_DEPENDENCIES) 
 	@rm -f check-UTCTime$(EXEEXT)
 	$(LINK) $(check_UTCTime_LDFLAGS) $(check_UTCTime_OBJECTS) $(check_UTCTime_LDADD) $(LIBS)
+check-UTF8String$(EXEEXT): $(check_UTF8String_OBJECTS) $(check_UTF8String_DEPENDENCIES) 
+	@rm -f check-UTF8String$(EXEEXT)
+	$(LINK) $(check_UTF8String_LDFLAGS) $(check_UTF8String_OBJECTS) $(check_UTF8String_LDADD) $(LIBS)
 check-ber_tlv_tag$(EXEEXT): $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_DEPENDENCIES) 
 	@rm -f check-ber_tlv_tag$(EXEEXT)
 	$(LINK) $(check_ber_tlv_tag_LDFLAGS) $(check_ber_tlv_tag_OBJECTS) $(check_ber_tlv_tag_LDADD) $(LIBS)
@@ -289,6 +297,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-OIDs.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-REAL.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTCTime.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-UTF8String.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-ber_tlv_tag.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-length.Po@am__quote@
 
diff --git a/skeletons/tests/check-UTF8String.c b/skeletons/tests/check-UTF8String.c
new file mode 100644
index 0000000..be8c273
--- /dev/null
+++ b/skeletons/tests/check-UTF8String.c
@@ -0,0 +1,84 @@
+#include <UTF8String.c>
+#include <OCTET_STRING.c>
+#include <ber_decoder.c>
+#include <ber_tlv_length.c>
+#include <ber_tlv_tag.c>
+#include <der_encoder.c>
+#include <constraints.c>
+#include <sys/time.h>
+
+static void
+check(int expect_length, char *buf, int buflen) {
+	UTF8String_t st;
+	int ret;
+
+	if(buflen < 0) buflen = strlen(buf);
+
+	st.buf = (uint8_t *)buf;
+	st.size = buflen;
+	printf("[");
+
+	for(ret = 0; ret < buflen; ret++)
+		printf("%c", buf[ret]);
+	ret = UTF8String_length(&st, 0, 0, 0);
+	printf("]: size=%d, expect=%d, got=%d\n",
+		buflen, expect_length, ret);
+	assert(ret == expect_length);
+}
+
+static int
+check_speed() {
+	int cycles = 1000000;
+	double start, stop;
+	struct timeval tv;
+	UTF8String_t st;
+	char long_test[] =
+		"a\303\237a\303\237a\303\237a\303\237"
+		"a\303\237a\303\237a\303\237a\303\237"
+		"a\303\237a\303\237a\303\237a\303\237"
+		"a\303\237a\303\237a\303\237a\303\237"
+		"a\303\237a\303\237a\303\237a\303\237";
+	int ret;
+	int i;
+
+	st.buf = long_test;
+	st.size = sizeof(long_test) - 1;
+
+	ret = UTF8String_length(&st, 0, 0, 0);
+	assert(ret == 40);
+	printf("Now wait a bit...\n");
+
+	gettimeofday(&tv, 0);
+	start = tv.tv_sec + tv.tv_usec / 1000000.0;
+	for(i = 0; i < cycles; i++) {
+		ret += UTF8String_length(&st, 0, 0, 0);
+	}
+	gettimeofday(&tv, 0);
+	stop = tv.tv_sec + tv.tv_usec / 1000000.0;
+
+	printf("%d cycles in %.3fms\n", cycles, stop - start);
+
+	return ret;
+}
+
+int
+main() {
+
+	check(0, "", 0);
+	check(1, "\0", 1);
+	check(-1, "\377", 1);
+	check(1, "a", 1);
+	check(2, "ab", 2);
+	check(3, "abc", 3);
+	assert(sizeof("a\303\237cd") == 6);
+	check(4, "a\303\237cd", 5);
+	check(-1, "a\303", 2);
+	check(-1, "a\370\200\200\200c", 5);
+	check(3, "a\370\201\200\201\257c", 7);
+	/* not yet check(-1, "a\370\200\200\200\257c", 7); */
+
+	check_speed();
+
+	return 0;
+}
+