From 18c249b158380214aab988ddc9522d14d01759c4 Mon Sep 17 00:00:00 2001 From: Sehong Na Date: Sat, 31 May 2014 12:47:25 +0900 Subject: [PATCH 1/1] Initialize Tizen 2.3 --- LICENSE | 26 ++ Makefile.am | 36 +++ autogen.sh | 13 + configure.ac | 75 +++++ include/Makefile.am | 31 ++ include/cvsignore | 11 + include/iri.h | 68 +++++ iri-config/Makefile.am | 35 +++ iri-config/cvsignore | 14 + iri-config/iri-config.c.in | 111 +++++++ libiri.manifest | 5 + libiri.pc.in | 12 + libiri/Makefile.am | 37 +++ libiri/cvsignore | 11 + libiri/destory.c | 47 +++ libiri/destroy.c | 47 +++ libiri/dup.c | 83 ++++++ libiri/p_libiri.h | 279 ++++++++++++++++++ libiri/parse.c | 719 +++++++++++++++++++++++++++++++++++++++++++++ packaging/libiri.spec | 52 ++++ tests/Makefile.am | 34 +++ tests/cvsignore | 13 + tests/iridump.c | 69 +++++ 23 files changed, 1828 insertions(+) create mode 100644 LICENSE create mode 100644 Makefile.am create mode 100755 autogen.sh create mode 100755 configure.ac create mode 100644 include/Makefile.am create mode 100644 include/cvsignore create mode 100644 include/iri.h create mode 100644 iri-config/Makefile.am create mode 100644 iri-config/cvsignore create mode 100644 iri-config/iri-config.c.in create mode 100644 libiri.manifest create mode 100644 libiri.pc.in create mode 100644 libiri/Makefile.am create mode 100644 libiri/cvsignore create mode 100644 libiri/destory.c create mode 100644 libiri/destroy.c create mode 100644 libiri/dup.c create mode 100644 libiri/p_libiri.h create mode 100644 libiri/parse.c create mode 100644 packaging/libiri.spec create mode 100644 tests/Makefile.am create mode 100644 tests/cvsignore create mode 100644 tests/iridump.c diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..969fa67 --- /dev/null +++ b/LICENSE @@ -0,0 +1,26 @@ +@(#) $Id$ + +Copyright (c) 2005, 2008 Mo McRoberts. + +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. +3. The names of the author(s) of this software may not be used to endorse + or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED ``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 +AUTHORS OF THIS SOFTWARE 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, DATA, 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. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..15b242a --- /dev/null +++ b/Makefile.am @@ -0,0 +1,36 @@ +## +## libiri: An IRI/URI/URL parsing library +## @(#) $Id$ +## + +## Copyright (c) 2008 Mo McRoberts. +## +## 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. +## 3. The names of the author(s) of this software may not be used to endorse +## or promote products derived from this software without specific prior +## written permission. +## +## THIS SOFTWARE IS PROVIDED ``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 +## AUTHORS OF THIS SOFTWARE 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, DATA, 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. + +SUBDIRS = iri-config include libiri tests + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libiri.pc + +EXTRA_DIST = LICENSE diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..c75e9f0 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,13 @@ +#! /bin/sh +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. +cd $srcdir + +mkdir -p autotools +libtoolize --force || exit 1 +aclocal -I autotools || exit 1 +autoheader || exit 1 +automake --add-missing --copy || exit 1 +autoconf || exit +configure --prefix=$PREFIX +$srcdir/configure $AUTOGEN_CONFIGURE_ARGS "$@" || exit $? diff --git a/configure.ac b/configure.ac new file mode 100755 index 0000000..f784e78 --- /dev/null +++ b/configure.ac @@ -0,0 +1,75 @@ +dnl @(#) $Id$ + +dnl Copyright (c) 2005, 2008 Mo McRoberts. +dnl +dnl Redistribution and use in source and binary forms, with or without +dnl modification, are permitted provided that the following conditions +dnl are met: +dnl 1. Redistributions of source code must retain the above copyright +dnl notice, this list of conditions and the following disclaimer. +dnl 2. Redistributions in binary form must reproduce the above copyright +dnl notice, this list of conditions and the following disclaimer in the +dnl documentation and/or other materials provided with the distribution. +dnl 3. The names of the author(s) of this software may not be used to endorse +dnl or promote products derived from this software without specific prior +dnl written permission. +dnl +dnl THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +dnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +dnl AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +dnl AUTHORS OF THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +dnl SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +dnl TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +AC_INIT(libiri, 2.0) +#AC_CONFIG_SRCDIR([include/iri.h]) +AC_CONFIG_SRCDIR([libiri.pc.in]) +AM_INIT_AUTOMAKE([foreign]) +AM_MAINTAINER_MODE + +CPPFLAGS="$CPPFLAGS -W -Wall -D_REENTRANT -I\${top_srcdir}/include" +export CPPFLAGS + +CFLAGS="$CFLAGS -g -O0" +export CFLAGS + +AC_PROG_CC +AC_PROG_LIBTOOL + +spfx="${prefix}" +sepfx="${exec_prefix}" +test x"${prefix}" = x"NONE" && prefix="${ac_default_prefix}" +test x"${exec_prefix}" = x"NONE" && exec_prefix="${prefix}" + +IRI_VERSION="${VERSION}" +AC_SUBST([IRI_VERSION]) + +IRI_CFLAGS="-I`eval echo $includedir`" +AC_SUBST([IRI_CFLAGS]) + +IRI_INCLUDES="-I`eval echo $includedir`" +AC_SUBST([IRI_INCLUDES]) + +IRI_LIBS="-L`eval echo $libdir` -liri" +AC_SUBST([IRI_LIBS]) + +prefix="${spfx}" +exec_prefix="${sepfx}" + +AC_CONFIG_HEADER([config.h]) + +AC_CONFIG_FILES([Makefile +include/Makefile +libiri/Makefile +iri-config/iri-config.c +iri-config/Makefile +tests/Makefile +libiri.pc +]) + +AC_OUTPUT + diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..369aa96 --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,31 @@ +## +## libiri: An IRI/URI/URL parsing library +## @(#) $Id$ +## + +## Copyright (c) 2008 Mo McRoberts. +## +## 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. +## 3. The names of the author(s) of this software may not be used to endorse +## or promote products derived from this software without specific prior +## written permission. +## +## THIS SOFTWARE IS PROVIDED ``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 +## AUTHORS OF THIS SOFTWARE 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, DATA, 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. + +include_HEADERS = iri.h diff --git a/include/cvsignore b/include/cvsignore new file mode 100644 index 0000000..33ea420 --- /dev/null +++ b/include/cvsignore @@ -0,0 +1,11 @@ +.deps +.libs +Makefile +Makefile.in +*.la +*.lo +*.so +*.a +*.dll +*.exe +*.o diff --git a/include/iri.h b/include/iri.h new file mode 100644 index 0000000..484fcc8 --- /dev/null +++ b/include/iri.h @@ -0,0 +1,68 @@ +/* + * libiri: An IRI/URI/URL parsing library + * @(#) $Id$ + */ + +/* + * Copyright (c) 2005, 2008 Mo McRoberts. + * + * 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. + * 3. The names of the author(s) of this software may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 + * AUTHORS OF THIS SOFTWARE 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, DATA, 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. + */ + +#ifndef IRI_H_ +# define IRI_H_ 1 + +# if !defined(LIBIRI_INTERNAL) +typedef struct iri_struct iri_t; +# endif + +struct iri_struct +{ + const char *display; + const char *scheme; + const char *user; + const char *auth; + const char *password; + const char *host; + int port; + const char *path; + const char *query; + const char *anchor; + const char **qparams; + const char **schemelist; + size_t nschemes; +}; + +# undef EXTERNC_ +# if defined(__cplusplus) +# define EXTERNC_ extern "C" +# else +# define EXTERNC_ extern +# endif + +EXTERNC_ iri_t *iri_parse(const char *src); +EXTERNC_ void iri_destroy(iri_t *iri); +EXTERNC_ iri_t *iri_dup(iri_t *iri); + +#endif /* !IRI_H_ */ diff --git a/iri-config/Makefile.am b/iri-config/Makefile.am new file mode 100644 index 0000000..bb71788 --- /dev/null +++ b/iri-config/Makefile.am @@ -0,0 +1,35 @@ +## +## libiri: An IRI/URI/URL parsing library +## @(#) $Id$ +## + +## Copyright (c) 2008 Mo McRoberts. +## +## 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. +## 3. The names of the author(s) of this software may not be used to endorse +## or promote products derived from this software without specific prior +## written permission. +## +## THIS SOFTWARE IS PROVIDED ``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 +## AUTHORS OF THIS SOFTWARE 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, DATA, 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. + +EXTRA_DIST = iri-config.c.in + +bin_PROGRAMS = iri-config + +iri_config_SOURCES = iri-config.c diff --git a/iri-config/cvsignore b/iri-config/cvsignore new file mode 100644 index 0000000..76c9f5a --- /dev/null +++ b/iri-config/cvsignore @@ -0,0 +1,14 @@ +.deps +.libs +Makefile +Makefile.in +*.la +*.lo +*.so +*.a +*.dll +*.exe +*.o +iri-config +iri-config.c + diff --git a/iri-config/iri-config.c.in b/iri-config/iri-config.c.in new file mode 100644 index 0000000..33593ce --- /dev/null +++ b/iri-config/iri-config.c.in @@ -0,0 +1,111 @@ +/* + * libiri: An IRI/URI/URL parsing library + * @(#) $Id$ + */ + +/* + * Copyright (c) 2005, 2008 Mo McRoberts. + * + * 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. + * 3. The names of the author(s) of this software may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 + * AUTHORS OF THIS SOFTWARE 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, DATA, 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +static struct +{ + const char *key; + const char *value; +} pairs[] = +{ + { "cflags", "@IRI_CFLAGS@" }, + { "include", "@IRI_INCLUDES@" }, + { "libs", "@IRI_LIBS@" }, + { "version", "@IRI_VERSION@" }, + { NULL, NULL } +}; + +static void +usage(int status) +{ + int d; + + puts("Usage: @bindir@/iri-config [OPTIONS]"); + puts("Options:"); + for(d = 0; NULL != pairs[d].key; d++) + { + printf("\t--%-14s [%s]\n", pairs[d].key, pairs[d].value); + } + exit(status); +} + +int +main(int argc, char **argv) +{ + int c, d; + + if(argc < 2) + { + usage(EXIT_SUCCESS); + } + for(c = 1 ; c < argc; c++) + { + if(argv[c][0] == '-' && argv[c][1] == '-') + { + for(d = 0; NULL != pairs[d].key; d++) + { + if(0 == strcmp(&(argv[c][2]), pairs[d].key)) + { + break; + } + } + if(NULL == pairs[d].key) + { + usage(EXIT_FAILURE); + } + } + else + { + usage(EXIT_FAILURE); + } + } + for(c = 1 ; c < argc; c++) + { + for(d = 0; NULL != pairs[d].key; d++) + { + if(0 == strcmp(&(argv[c][2]), pairs[d].key)) + { + printf("%s\n", pairs[d].value); + break; + } + } + } + return 0; +} diff --git a/libiri.manifest b/libiri.manifest new file mode 100644 index 0000000..2a0cec5 --- /dev/null +++ b/libiri.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/libiri.pc.in b/libiri.pc.in new file mode 100644 index 0000000..9949f4a --- /dev/null +++ b/libiri.pc.in @@ -0,0 +1,12 @@ +# Package Information for pkg-config + +prefix=/usr +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: libiri +Description: IRI - a simple library for parsing Internationalized Resource Identifiers +Version: 1.0 +Libs: -L${libdir} -liri +Cflags: -I${includedir} diff --git a/libiri/Makefile.am b/libiri/Makefile.am new file mode 100644 index 0000000..3763392 --- /dev/null +++ b/libiri/Makefile.am @@ -0,0 +1,37 @@ +## @(#) $Id$ + +## Copyright (c) 2008 Mo McRoberts. +## +## 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. +## 3. The names of the author(s) of this software may not be used to endorse +## or promote products derived from this software without specific prior +## written permission. +## +## THIS SOFTWARE IS PROVIDED ``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 +## AUTHORS OF THIS SOFTWARE 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, DATA, 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. + +lib_LTLIBRARIES = libiri.la + +libiri_la_LDFLAGS = -avoid-version + +libiri_la_CPPFLAGS = -DLIBIRI_INTERNAL=1 + +libiri_la_SOURCES = \ + p_libiri.h \ + parse.c destroy.c dup.c + diff --git a/libiri/cvsignore b/libiri/cvsignore new file mode 100644 index 0000000..33ea420 --- /dev/null +++ b/libiri/cvsignore @@ -0,0 +1,11 @@ +.deps +.libs +Makefile +Makefile.in +*.la +*.lo +*.so +*.a +*.dll +*.exe +*.o diff --git a/libiri/destory.c b/libiri/destory.c new file mode 100644 index 0000000..9b6cf5a --- /dev/null +++ b/libiri/destory.c @@ -0,0 +1,47 @@ +/* + * libiri: An IRI/URI/URL parsing library + * @(#) $Id$ + */ + +/* + * Copyright (c) 2005, 2008 Mo McRoberts. + * + * 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. + * 3. The names of the author(s) of this software may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 + * AUTHORS OF THIS SOFTWARE 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, DATA, 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "p_libiri.h" + +void +iri_destroy(iri_t *iri) +{ + if(NULL != iri) + { + free(iri->base); + free(iri); + } +} \ No newline at end of file diff --git a/libiri/destroy.c b/libiri/destroy.c new file mode 100644 index 0000000..ff2533d --- /dev/null +++ b/libiri/destroy.c @@ -0,0 +1,47 @@ +/* + * libiri: An IRI/URI/URL parsing library + * @(#) $Id$ + */ + +/* + * Copyright (c) 2005, 2008 Mo McRoberts. + * + * 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. + * 3. The names of the author(s) of this software may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 + * AUTHORS OF THIS SOFTWARE 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, DATA, 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "p_libiri.h" + +void +iri_destroy(iri_t *iri) +{ + if(NULL != iri) + { + free(iri->base); + free(iri); + } +} diff --git a/libiri/dup.c b/libiri/dup.c new file mode 100644 index 0000000..7ce1eb7 --- /dev/null +++ b/libiri/dup.c @@ -0,0 +1,83 @@ +/* + * libiri: An IRI/URI/URL parsing library + * @(#) $Id$ + */ + +/* + * Copyright (c) 2005, 2008 Mo McRoberts. + * + * 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. + * 3. The names of the author(s) of this software may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 + * AUTHORS OF THIS SOFTWARE 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, DATA, 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "p_libiri.h" + +static inline void +iri__dupcopy(const char **dest, const char *src, const char *srcbase, size_t buflen, const char *destbase) +{ + if(NULL == src) + { + *dest = NULL; + } + else if(src >= srcbase && src <= srcbase + buflen) + { + *dest = destbase + (src - srcbase); + } + else + { + *dest = strdup(src); + } +} + +iri_t * +iri_dup(iri_t *iri) +{ + iri_t *p; + + if(NULL == (p = (iri_t *) calloc(1, sizeof(iri_t)))) + { + return NULL; + } + if(NULL == (p->base = (char *) calloc(1, iri->nbytes))) + { + free(p); + return NULL; + } + p->nbytes = iri->nbytes; + p->iri.port = iri->iri.port; + memcpy(p->base, iri->base, p->nbytes); + iri__dupcopy(&(p->iri.display), iri->iri.display, iri->base, iri->nbytes, p->base); + iri__dupcopy(&(p->iri.scheme), iri->iri.scheme, iri->base, iri->nbytes, p->base); + iri__dupcopy(&(p->iri.user), iri->iri.user, iri->base, iri->nbytes, p->base); + iri__dupcopy(&(p->iri.auth), iri->iri.auth, iri->base, iri->nbytes, p->base); + iri__dupcopy(&(p->iri.password), iri->iri.password, iri->base, iri->nbytes, p->base); + iri__dupcopy(&(p->iri.host), iri->iri.host, iri->base, iri->nbytes, p->base); + iri__dupcopy(&(p->iri.path), iri->iri.path, iri->base, iri->nbytes, p->base); + iri__dupcopy(&(p->iri.query), iri->iri.query, iri->base, iri->nbytes, p->base); + iri__dupcopy(&(p->iri.anchor), iri->iri.anchor, iri->base, iri->nbytes, p->base); + return p; +} diff --git a/libiri/p_libiri.h b/libiri/p_libiri.h new file mode 100644 index 0000000..b5bdfa0 --- /dev/null +++ b/libiri/p_libiri.h @@ -0,0 +1,279 @@ +/* + * libiri: An IRI/URI/URL parsing library + * @(#) $Id$ + */ + +/* + * Copyright (c) 2005, 2008 Mo McRoberts. + * + * 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. + * 3. The names of the author(s) of this software may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 + * AUTHORS OF THIS SOFTWARE 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, DATA, 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. + */ + + +/* + +The following code was added by Samsung Electronics. + +--- a/libiri/p_libiri.h ++++ b/libiri/p_libiri.h +@@ -33,6 +33,8 @@ + #ifndef P_LIBIRI_H_ + # define P_LIBIRI_H_ 1 + ++#define LIBIRI_INTERNAL ++ + #include + + +License of the above code is Apache License + + + Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + + +#ifndef P_LIBIRI_H_ +# define P_LIBIRI_H_ 1 + +#define LIBIRI_INTERNAL + +#include +#include +#include + +typedef struct iri_internal_struct iri_t; + +#include "iri.h" + +struct iri_internal_struct +{ + struct iri_struct iri; + void *base; + size_t nbytes; +}; + +#endif /* !P_LIBIRI_H_ */ diff --git a/libiri/parse.c b/libiri/parse.c new file mode 100644 index 0000000..2ed3e2f --- /dev/null +++ b/libiri/parse.c @@ -0,0 +1,719 @@ +/* + * libiri: An IRI/URI/URL parsing library + * @(#) $Id$ + */ + +/* + * Copyright (c) 2005, 2008 Mo McRoberts. + * + * 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. + * 3. The names of the author(s) of this software may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 + * AUTHORS OF THIS SOFTWARE 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, DATA, 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. + */ + +/* + +The following code was added by Samsung Electronics. + +--- a/libiri/parse.c ++++ b/libiri/parse.c +@@ -59,6 +59,7 @@ iri__hexnibble(char c) + { + return c - 'a' + 10; + } ++ return 0; + } + + static inline const char * +@@ -130,6 +131,7 @@ iri__allocbuf(const char *src, size_t *len) + *len = (src - c) + 1 + sc + ((sc + 1) * (sizeof(char *) + 7)); + *len += (7 * 11); + } ++ *len = 9999; // FIXME: DIRTY HACK THAT USUALLY WORKS... UNTIL IRI IS NOT TO + return (char *) calloc(1, *len); + } + + + +License of the above code is Apache License + + + Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +*/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "p_libiri.h" + +#undef ALIGNMENT +#define ALIGNMENT 8 +#undef ALIGN +#define _ALIGN(x) ((((x)+(ALIGNMENT-1))&~(ALIGNMENT-1))) +#define ALIGN(x) (char *) _ALIGN((size_t) x) + +static inline int +iri__hexnibble(char c) +{ + if(c >= '0' && c <= '9') + { + return c - '0'; + } + if(c >= 'A' && c <= 'F') + { + return c - 'A' + 10; + } + if(c >= 'a' && c <= 'f') + { + return c - 'a' + 10; + } + return 0; +} + +static inline const char * +iri__copychar(char **dest, const char *src) +{ + **dest = *src; + (*dest)++; + src++; + return src; +} + +/* TODO: Punycode decoding for the host part */ +static inline const char * +iri__copychar_decode(char **dest, const char *src, int convert_space) +{ + unsigned char *p = (unsigned char *) (*dest); + + if(1 == convert_space && '+' == *src) + { + **dest = ' '; + } + else if('%' == *src) + { + if(0 == isxdigit(src[1]) || 0 == isxdigit(src[2])) + { + /* TODO: Deal with %u non-standard encoding - be liberal in + * what you accept, etc. + */ + **dest = '%'; + } + else + { + *p = (iri__hexnibble(src[1]) << 4) | iri__hexnibble(src[2]); + src += 2; + } + } + else + { + **dest = *src; + } + src++; + (*dest)++; + return src; +} + +static inline char * +iri__allocbuf(const char *src, size_t *len) +{ + size_t sc; + const char *p, *c; +/* + Internal format of IRI structure is very hard to understand at first. + The buffer is used to store character strings with every parsed part of + IRI, like host, user, auth, path etc. Start of every character string is + ALIGNED to ALIGNMENT value and finished with NULL byte. + Above that, the buffer is used to keep variable size array of parsed + scheme parts. It consist of the array of addresses pointing to starts + of scheme parts which are kept as all other characters strings, so are + aligned to ALIGMENT and ended with NULL byte. + This function calculates approximation of buffer size to store all the + data of parser IRI. + + Fully filled buffer with scheme parts looks as follows: + 0. start of the buffer + 1. aligned start of the scheme part with added NULL byte + 2. aligned start of the user part with added NULL byte + 3. aligned start of the password part with added NULL byte + 4. aligned start of the array of size schemes_number+1 of pointers that point + to consecutive scheme part character strings (last one is NULL) + schemes_number is a number of scheme tokens delimited with + sign in + scheme part + 5. schems_number of characters strings of scheme parts each of which + aligned and finished with NULL byte. + 6. aligned start of the host part with added NULL byte + 7. aligned start of the path part with added NULL byte + 8. aligned start of the query part with added NULL byte + 9. aligned start of the anchor part with added NULL byte + + There can be indentified 4 kinds of characters in IRI: + - characters which are copied one to one (i.e. letters) + - characters which are removed (special characters like comma in scheme) + - characters which are replaced with other characers where buffer grows + this only happens with scheme part + - characters which are replaced with other characers where buffer decreases + + Alighning a pointer in worst case will advance a buffer pointers + ALIGNMENT-1 bytes + + Knowing all that we can count an approximation of buffer size which can + be trusted that whole parsed IRI content will fit in. +*/ + +/* first approximation - all characers will have to be stored in buffer */ + *len = strlen(src); + +/* second approximation - IRI has all possible parts which have to be + * aligned to ALIGNMENT and have NULL byte an the end. There are 7 different + * parts like that */ + *len += 7 * (ALIGNMENT-1 + 1); + +/* third approximation - we have to make a room for scheme parts array. + * Because the array has an aligned array of n + 1 pointers and n + * characters strings aligned and NULL byte terminated. + */ + if(NULL != (c = strchr(src, ':'))) + { + sc = 1; + for(p = src; p < c; p++) + { + if(*p == '+') + { + sc++; + } + } + /* fourth approximation - all characters of scheme part will be stored + * in scheme parts tokens */ + *len += (c - src); + + /* fifth approximation - Ensure we can align each element on an + * ALIGNMENT byte boundary and append NULL byte */ + *len += sc * (ALIGNMENT-1 + 1); + + /* sixth approximation - Ensure we have a room for aligned array + * indexes */ + *len += ALIGNMENT-1 + (sc + 1) * (sizeof(char*)/sizeof(char)); + } + return (char *) calloc(1, *len); +} + +iri_t * +iri_parse(const char *src) +{ + iri_t *p; + char *bufstart, *endp, *bufp, **sl; + const char *at, *colon, *slash, *t, *slash3rd; + size_t buflen, sc, cp; + + if(NULL == (p = (iri_t *) calloc(1, sizeof(iri_t)))) + { + return NULL; + } + if(NULL == (bufstart = iri__allocbuf(src, &buflen))) + { + free(p); + return NULL; + } + p->base = bufp = bufstart; + p->nbytes = buflen; + at = strchr(src, '@'); + slash = strchr(src, '/'); + colon = strchr(src, ':'); + if(slash && colon && slash < colon) + { + /* We can disregard the colon if a slash appears before it */ + colon = NULL; + } + // "@" is valid character in hierarchical part of IRI + if(slash && colon && (colon[1] != '/' || colon[2] != '/')) + { + //if scheme not suffixed with ://, there is not autority + //therefore autority(and user within) is not set + at = NULL; + } + else if(at && slash && slash[1] && slash[2]) + { + slash3rd = strchr(slash + 2, '/'); + //here we know scheme suffix is "://" so autority can exist + //3rd slash should match start of hierarchical part if exists + //@ after that is valid character + if(slash3rd && slash3rd < at) + { + at = NULL; + } + } + if(colon && !at) + { + /* Definitely a scheme */ + bufp = ALIGN(bufp); + p->iri.scheme = bufp; + while(*src && *src != ':') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + src++; + /* src[0-1] SHOULD == '/' */ + if(src[0] == '/') src++; + if(src[0] == '/') src++; + } + else if(colon && at && colon < at) + { + fprintf(stderr, "Colon occurs before at\n"); + /* This could be scheme://user[;auth][:password]@host or [scheme:]user[;auth][:password]@host (urgh) */ + if(colon[1] == '/' && colon[2] == '/' && colon[3] != '/') + { + bufp = ALIGN(bufp); + p->iri.scheme = bufp; + while(*src && *src != ':') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + src++; + /* src[0-1] SHOULD == '/' */ + for(; *src == '/'; src++); + bufp = ALIGN(bufp); + p->iri.user = bufp; + fprintf(stderr, "Found user\n"); + } + else + { + fprintf(stderr, "Matched scheme\n"); + bufp = ALIGN(bufp); + p->iri.scheme = bufp; + } + while(*src && *src != ':' && *src != '@' && *src != ';') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + if(*src == ';') + { + /* Following authentication parameters */ + src++; + bufp = ALIGN(bufp); + p->iri.auth = bufp; + while(*src && *src != ':' && *src != '@') + { + /* Don't decode, so it can be extracted properly */ + src = iri__copychar(&bufp, src); + } + *bufp = 0; + bufp++; + } + if(*src == ':') + { + /* Following password data */ + src++; + bufp = ALIGN(bufp); + p->iri.password = bufp; + while(*src && *src != ':' && *src != '@') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + if(*src == ':') + { + src++; + /* It was actually scheme:user:auth@host */ + p->iri.user = p->iri.auth; + bufp = ALIGN(bufp); + p->iri.password = bufp; + while(*src && *src != '@') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + } + } + if(!*src) + { + /* No host part */ + return p; + } + if(*src == '@') + { + src++; + } + } + else if(at) + { + /* user[;auth]@host[/path...] */ + bufp = ALIGN(bufp); + p->iri.user = bufp; + while(*src != '@' && *src != ';') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + if(*src == ';') + { + src++; + bufp = ALIGN(bufp); + p->iri.auth = bufp; + while(*src && *src != '@') + { + /* Don't decode, so it can be extracted properly */ + src = iri__copychar(&bufp, src); + } + *bufp = 0; + bufp++; + } + else + { + src++; + } + } + if(NULL != p->iri.scheme) + { + sc = 1; + for(t = p->iri.scheme; *t; t++) + { + if('+' == *t) + { + sc++; + } + } + bufp = ALIGN(bufp); + sl = (char **) (void *) bufp; + bufp += (sc + 1) * sizeof(char *); + sc = 0; + cp = 0; + bufp = ALIGN(bufp); + sl[0] = bufp; + for(t = p->iri.scheme; *t; t++) + { + if('+' == *t) + { + if(sl[sc][0]) + { + sl[sc][cp] = 0; + bufp++; + sc++; + bufp = ALIGN(bufp); + sl[sc] = bufp; + cp = 0; + } + } + else + { + sl[sc][cp] = *t; + bufp++; + cp++; + } + } + if(sl[sc][0]) + { + sl[sc][cp] = 0; + sc++; + bufp++; + } + sl[sc] = NULL; + p->iri.schemelist = (const char **) sl; + p->iri.nschemes = sc; + bufp++; + } + bufp = ALIGN(bufp); + p->iri.host = bufp; + while(*src && *src != ':' && *src != '/' && *src != '?' && *src != '#') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + if(*src == ':') + { + /* Port part */ + src++; + endp = (char *) src; + p->iri.port = strtol(src, &endp, 10); + src = endp; + } + if(*src == '/') + { + bufp = ALIGN(bufp); + p->iri.path = bufp; + while(*src && *src != '?' && *src != '#') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + } + if(*src == '?') + { + bufp = ALIGN(bufp); + p->iri.query = bufp; + src++; + while(*src && *src != '#') + { + /* Don't actually decode the query itself, otherwise it + * can't be reliably split */ + src = iri__copychar(&bufp, src); + } + *bufp = 0; + bufp++; + } + if(*src == '#') + { + bufp = ALIGN(bufp); + p->iri.anchor = bufp; + while(*src) + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + } + if(*src) + { + /* Still stuff left? It must be a path... of sorts */ + bufp = ALIGN(bufp); + p->iri.path = bufp; + while(*src && *src != '?' && *src != '#') + { + src = iri__copychar_decode(&bufp, src, 0); + } + *bufp = 0; + bufp++; + } + return p; +} + + + + + diff --git a/packaging/libiri.spec b/packaging/libiri.spec new file mode 100644 index 0000000..e17c090 --- /dev/null +++ b/packaging/libiri.spec @@ -0,0 +1,52 @@ +Name: libiri +Summary: a simple library for parsing Internationalized Resource Identifiers (IRIs) +Version: 1.6 +Release: 1 +Group: Development/Libraries +License: TO_BE_FILLED +Source0: %{name}-%{version}.tar.gz +BuildRequires: pkgconfig(dlog) + +%description +a simple library for parsing Internationalized Resource Identifiers (IRIs) + +%package devel +Summary: a simple library for parsing Internationalized Resource Identifiers (IRIs) (Developement) +Group: Development/Libraries +Requires: %{name} = %{version} + +%description devel +a simple library for parsing Internationalized Resource Identifiers (IRIs) (Developement) + +%prep +%setup -q + +%build +./autogen.sh --prefix=/usr +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}/usr/share/license +cp LICENSE %{buildroot}/usr/share/license/%{name} +%make_install + +%clean +rm -rf %{buildroot} + +%post + +%postun + + +%files +%manifest libiri.manifest +%defattr(-,root,root,-) +%{_libdir}/libiri.so +%{_bindir}/iri-config +%{_datadir}/license/%{name} + +%files devel +%defattr(-,root,root,-) +%{_includedir}/iri.h +%{_libdir}/pkgconfig/libiri.pc diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..63d2b30 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,34 @@ +## +## libiri: An IRI/URI/URL parsing library +## @(#) $Id$ +## + +## Copyright (c) 2008 Mo McRoberts. +## +## 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. +## 3. The names of the author(s) of this software may not be used to endorse +## or promote products derived from this software without specific prior +## written permission. +## +## THIS SOFTWARE IS PROVIDED ``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 +## AUTHORS OF THIS SOFTWARE 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, DATA, 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. + +noinst_PROGRAMS = iridump + +iridump_SOURCES = iridump.c +iridump_LDADD = ../libiri/libiri.la diff --git a/tests/cvsignore b/tests/cvsignore new file mode 100644 index 0000000..4c55c0d --- /dev/null +++ b/tests/cvsignore @@ -0,0 +1,13 @@ +.deps +.libs +Makefile +Makefile.in +*.la +*.lo +*.so +*.a +*.dll +*.exe +*.o +iridump + diff --git a/tests/iridump.c b/tests/iridump.c new file mode 100644 index 0000000..809d3ba --- /dev/null +++ b/tests/iridump.c @@ -0,0 +1,69 @@ +/* + * libiri: An IRI/URI/URL parsing library + * @(#) $Id$ + */ + +/* + * Copyright (c) 2005, 2008 Mo McRoberts. + * + * 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. + * 3. The names of the author(s) of this software may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED ``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 + * AUTHORS OF THIS SOFTWARE 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, DATA, 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include "iri.h" + +int +main(int argc, char **argv) +{ + iri_t *iri; + size_t c; + + if(argc != 2) + { + fprintf(stderr, "Usage: %s IRI\n", argv[0]); + exit(EXIT_FAILURE); + } + iri = iri_parse(argv[1]); + printf(" scheme: %s\n", iri->scheme); + for(c = 0; c < iri->nschemes; c++) + { + printf("%8d: %s\n", (int) c, iri->schemelist[c]); + } + printf(" user: %s\n", iri->user); + printf(" auth: %s\n", iri->auth); + printf("password: %s\n", iri->password); + printf(" host: %s\n", iri->host); + printf(" port: %d\n", iri->port); + printf(" path: %s\n", iri->path); + printf(" query: %s\n", iri->query); + printf(" anchor: %s\n", iri->anchor); + return 0; +} -- 2.7.4