Skip to content
Browse files

Initial commit

  • Loading branch information...
0 parents commit 2c43f4ec493416718c82a7a5824e85d0a330ab66 @tagoh committed
62 .gitignore
@@ -0,0 +1,62 @@
+*\.autogen_bak
+*\.bak
+*\.bz2
+*\.desktop
+*\.gir
+*\.gir\.c
+*\.gir\.h
+*\.gmo
+*\.gz
+*\.la
+*\.lo
+*\.o
+*\.pc
+*\.rpm
+*\.schemas
+*\.service
+*\.stamp
+*\.typelib
+*~
+\.deps
+\.libs
+Makefile
+Makefile.in
+a\.out
+aclocal\.m4
+autom4te\.cache
+config\.*
+configure
+core.*
+data/*\.in
+!data/*\.in\.in
+data/*\.sh
+data/*\.conf
+depcomp
+docs/html
+docs/tmpl
+docs/xml
+docs/*-decl-list\.txt
+docs/*-decl\.txt
+docs/*-sections\.txt
+docs/*-undeclared\.txt
+docs/*-undocumented\.txt
+docs/*-unused\.txt
+docs/*\.args
+docs/*\.hierarchy
+docs/*\.interfaces
+docs/*\.prerequisites
+docs/*\.signals
+docs/version.xml
+gtk-doc\.make
+install-sh
+intltool-*
+libtool
+ltmain\.sh
+missing
+mkinstalldirs
+po/\.cache
+po/\.intltool*
+po/Makefile*
+po/POTFILES
+stamp*
+tests/test-*
1 AUTHORS
@@ -0,0 +1 @@
+Akira TAGOH <akira@tagoh.org>
165 COPYING
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
0 ChangeLog
No changes.
365 INSTALL
@@ -0,0 +1,365 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package. Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system.
+
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the `make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type `make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior `make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type `make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide `make
+ distcheck', which can by used by developers to test that all other
+ targets like `make install' and `make uninstall' work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'. This
+is known as a "VPATH" build.
+
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'. Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated. The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the `DESTDIR' variable. For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names. The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of `make' will be. For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put `/usr/ucb' early in your `PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+ On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
63 Makefile.am
@@ -0,0 +1,63 @@
+NULL =
+AUTOMAKE_OPTIONS = dist-bzip2
+SUBDIRS = liblangtag
+
+if ENABLE_GOBJECT
+#SUBDIRS += liblangtag-gobject
+endif
+
+#SUBDIRS += docs tests
+SUBDIRS += tests
+
+ACLOCAL_AMFLAGS = \
+ -I m4macros \
+ $(NULL)
+
+CONFIGURE_DEPENDENCIES = \
+ requires \
+ $(NULL)
+
+EXTRA_DIST = \
+ $(pkgconfig_DATA) \
+ $(noinst_DATA) \
+ requires \
+ $(NULL)
+
+DISTCLEANFILES = \
+ $(pkgconfig_DATA) \
+ $(noinst_DATA) \
+ $(NULL)
+
+DISTCHECK_CONFIGURE_FLAGS = \
+ --enable-introspection \
+ --enable-gtk-doc \
+ $(NULL)
+
+#
+#
+#
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = \
+ liblangtag.pc \
+ liblangtag-gobject.pc \
+ $(NULL)
+$(pkgconfig_DATA): $(top_builddir)/config.status
+noinst_DATA = \
+ liblangtag-uninstalled.pc \
+ liblangtag-gobject-uninstalled.pc \
+ $(NULL)
+$(noinst_DATA): $(top_builddir)/config.status
+#
+dist-hook:
+ @if test -d "$(srcdir)/.git"; \
+ then \
+ echo Creating ChangeLog && \
+ ( cd "$(top_srcdir)" && \
+ echo '# Generated by Makefile. Do not edit.'; echo; \
+ $(top_srcdir)/missing --run git log --stat) > ChangeLog.tmp \
+ && mv -f ChangeLog.tmp $(top_distdir)/ChangeLog \
+ || (rm -f ChangeLog.tmp; \
+ echo Failed to generate ChangeLog >&2 ); \
+ else \
+ echo A git clone is required to generate a ChangeLog >&2; \
+ fi
0 NEWS
No changes.
2 README
@@ -0,0 +1,2 @@
+An interface library to access tags for identifying languages
+
135 configure.ac
@@ -0,0 +1,135 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.62)
+AC_INIT([liblangtag], 0.1, [http://github.com/tagoh/liblangtag/issues])
+
+. `dirname $0`/requires
+
+AM_INIT_AUTOMAKE([1.11 -Wno-portability])
+AM_MAINTAINER_MODE
+AM_CONFIG_HEADER([config.h])
+AC_CONFIG_MACRO_DIR([m4macros])
+
+AC_PROG_LIBTOOL
+AC_PROG_CC
+
+GNOME_COMPILE_WARNINGS
+
+GNOME_COMMON_INIT
+GNOME_DEBUG_CHECK
+GNOME_MAINTAINER_MODE_DEFINES
+
+CFLAGS="$CFLAGS $WARN_CFLAGS"
+
+dnl ======================================================================
+dnl Libraries versioning
+dnl ======================================================================
+dnl Quote from Updating library version information at libtool.info
+dnl and renumbering
+dnl
+dnl 1. Update the version information only immediately before a public
+dnl release of your software. More frequent updates are unnecessary,
+dnl and only guarantee that the current interface number gets larger
+dnl faster.
+dnl 2. If the library source code has changed at all since the last
+dnl update, then increment REVISION (`C:R:A' becomes `C:r+1:A')
+dnl 3. If any interfaces have been added, removed, or changed since the
+dnl last update, increment CURRENT, and set REVISION to 0.
+dnl 4. If any interfaces have been added since the last public release,
+dnl then increment AGE.
+dnl 5. If any interfaces have been removed since the last public release,
+dnl then set AGE to 0.
+dnl
+
+dnl for libeasyfc.la
+LT_CURRENT=1
+LT_REVISION=0
+LT_AGE=1
+
+AC_SUBST(LT_CURRENT)
+AC_SUBST(LT_REVISION)
+AC_SUBST(LT_AGE)
+
+dnl for libeasyfc-gobject.la
+LT_G_CURRENT=0
+LT_G_REVISION=0
+LT_G_AGE=0
+
+AC_SUBST(LT_G_CURRENT)
+AC_SUBST(LT_G_REVISION)
+AC_SUBST(LT_G_AGE)
+
+dnl ======================================================================
+dnl define variables
+dnl ======================================================================
+
+dnl ======================================================================
+dnl functions testing
+dnl ======================================================================
+
+dnl ======================================================================
+dnl gettext stuff
+dnl ======================================================================
+GETTEXT_PACKAGE=$PACKAGE
+AC_SUBST(GETTEXT_PACKAGE)
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package])
+
+AM_GLIB_GNU_GETTEXT
+
+dnl ======================================================================
+dnl check pkg-config stuff
+dnl ======================================================================
+PKG_CHECK_MODULES(ISOCODES, iso-codes)
+PKG_CHECK_MODULES(LIBXML2, libxml-2.0 >= $LIBXML2_REQUIRED)
+PKG_CHECK_MODULES(GOBJECT, gobject-2.0 >= $GOBJECT_REQUIRED, has_gobject=yes, has_gobject=no)
+
+AM_CONDITIONAL(ENABLE_GOBJECT, test x$has_gobject != xno)
+iso_codes_prefix=`$PKG_CONFIG --variable=prefix iso-codes`
+AC_DEFINE_UNQUOTED([ISO_CODES_DOMAINS], ["`$PKG_CONFIG --variable=domains iso-codes`"], [ISO codes domains])
+
+dnl ======================================================================
+dnl check another libraries
+dnl ======================================================================
+AM_PATH_GLIB_2_0($GLIB_REQUIRED, :,
+ AC_MSG_ERROR([
+*** GLIB $GLIB_REQUIRED_VERSION or better is required. The latest version of
+*** GLIB is always available from ftp://ftp.gtk.org/.]),
+ glib)
+
+GOBJECT_INTROSPECTION_CHECK([1.30.0])
+GTK_DOC_CHECK(1.0)
+
+dnl ======================================================================
+dnl options
+dnl ======================================================================
+AC_ARG_WITH(iso-codes-dir,
+ AC_HELP_STRING([--with-iso-codes-dir], [Where the xml files from iso-codes installed])
+ ,,
+ with_iso_codes_dir=$iso_codes_prefix/share/xml/iso-codes)
+
+dnl ======================================================================
+dnl options - iso-codes-dir
+dnl ======================================================================
+AC_DEFINE_UNQUOTED([ISO_PREFIX], ["$with_iso_codes_dir"], [ISO codes directory])
+
+
+dnl ======================================================================
+dnl output
+dnl ======================================================================
+AC_CONFIG_FILES([
+ Makefile
+ liblangtag.pc
+ liblangtag-uninstalled.pc
+ liblangtag-gobject.pc
+ liblangtag-gobject-uninstalled.pc
+ liblangtag/Makefile
+ tests/Makefile
+])
+AC_OUTPUT
+
+dnl ======================================================================
+dnl result
+dnl ======================================================================
+echo ""
+echo "========== Build Information =========="
+echo " CFLAGS: $CFLAGS"
+echo " LDFLAGS: $LDFLAGS"
6 liblangtag-gobject-uninstalled.pc.in
@@ -0,0 +1,6 @@
+Name: liblangtag-gobject Uninstalled
+Description: GObject based interface to access tags for identifying languages
+Version: @VERSION@
+Requires: gobject-2.0 liblangtag
+Libs: ${pc_top_builddir}/${pcfiledir}/liblangtag-gobject/liblangtag-gobject.la
+Cflags: -I${pc_top_builddir}/${pcfiledir} -I${pc_top_builddir}/${pcfiledir}/@srcdir@
10 liblangtag-gobject.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: liblangtag-gobject
+Description: GObject based interface to access tags for identifying languages
+Version: @VERSION@
+Requires: gobject-2.0 liblangtag
+Libs: -L$(libdir) -llangtag-gobject
6 liblangtag-uninstalled.pc.in
@@ -0,0 +1,6 @@
+Name: liblangtag Uninstalled
+Description: Interface to access tags for identifying languages
+Version: @VERSION@
+Requires: glib-2.0
+Libs: ${pc_top_builddir}/${pcfiledir}/liblangtag/liblangtag.la
+Cflags: -I${pc_top_builddir}/${pcfiledir} -I${pc_top_builddir}/${pcfiledir}/@srcdir@
10 liblangtag.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: liblangtag
+Description: Interface to access tags for identifying languages
+Version: @VERSION@
+Requires: glib-2.0
+Libs: -L$(libdir) -llangtag
92 liblangtag/Makefile.am
@@ -0,0 +1,92 @@
+##
+# Global definitions
+NULL =
+INCLUDES = \
+ -I$(top_srcdir)/liblangtag/ \
+ -I$(top_srcdir) \
+ -D__LANGTAG_COMPILATION \
+ $(GLIB_CFLAGS) \
+ $(LIBXML2_CFLAGS) \
+ $(NULL)
+LIBS = \
+ @LDFLAGS@ \
+ $(GLIB_LIBS) \
+ $(LIBXML2_LIBS) \
+ $(NULL)
+EXTRA_DIST = \
+ $(NULL)
+MAINTAINERCLEANFILES = \
+ $(liblangtag_built_public_headers) \
+ $(liblangtag_built_private_headers) \
+ $(liblangtag_built_sources) \
+ $(stamp_files) \
+ $(NULL)
+CLEANFILES = \
+ xgen-h \
+ xgen-c \
+ $(NULL)
+BUILT_FILES = \
+ $(liblangtag_built_public_headers) \
+ $(liblangtag_built_private_headers) \
+ $(liblangtag_built_sources) \
+ $(NULL)
+
+##
+# Local definitions
+liblangtag_public_headers = \
+ lt-error.h \
+ lt-lang.h \
+ $(NULL)
+liblangtag_private_headers = \
+ lt-mem.h \
+ $(NULL)
+liblangtag_built_public_headers = \
+ $(NULL)
+liblangtag_built_private_headers = \
+ $(NULL)
+#
+liblangtag_built_sources = \
+ $(NULL)
+liblangtag_sources = \
+ $(liblangtag_built_sources) \
+ lt-error.c \
+ lt-lang.c \
+ lt-mem.c \
+ $(NULL)
+#
+stamp_files = \
+ $(NULL)
+
+
+##
+# Local Rules
+
+
+##
+# Target platform
+lib_LTLIBRARIES = \
+ liblangtag.la \
+ $(NULL)
+#
+liblangtagincdir = $(includedir)/liblangtag
+liblangtaginc_HEADERS = \
+ langtag.h \
+ $(liblangtag_public_headers) \
+ $(liblangtag_built_public_headers) \
+ $(NULL)
+#
+noinst_HEADERS = \
+ $(liblangtag_private_headers) \
+ $(liblangtag_built_private_headers) \
+ $(NULL)
+#
+liblangtag_la_SOURCES = \
+ $(liblangtag_sources) \
+ $(NULL)
+liblangtag_la_CFLAGS = \
+ -DG_LOG_DOMAIN="\"LangTag\"" \
+ $(NULL)
+liblangtag_la_LDFLAGS = \
+ $(LDFLAGS) \
+ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \
+ $(NULL)
40 liblangtag/lt-error.c
@@ -0,0 +1,40 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * lt-error.c
+ * Copyright (C) 2011 Akira TAGOH
+ *
+ * Authors:
+ * Akira TAGOH <akira@tagoh.org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "lt-error.h"
+
+/*< private >*/
+
+/*< public >*/
+GQuark
+lt_error_get_quark(void)
+{
+ static GQuark quark = 0;
+
+ if (quark == 0)
+ quark = g_quark_from_static_string("lt-error-quark");
+
+ return quark;
+}
46 liblangtag/lt-error.h
@@ -0,0 +1,46 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * lt-error.h
+ * Copyright (C) 2011 Akira TAGOH
+ *
+ * Authors:
+ * Akira TAGOH <akira@tagoh.org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __LT_ERROR_H__
+#define __LT_ERROR_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define LT_ERROR (lt_error_get_quark())
+
+enum _lt_error_t {
+ LT_ERR_UNKNOWN = -1,
+ LT_ERR_SUCCESS = 0,
+ LT_ERR_OOM,
+ LT_ERR_FAIL_ON_XML,
+ LT_ERR_END
+};
+
+typedef enum _lt_error_t lt_error_t;
+
+
+GQuark lt_error_get_quark(void);
+
+G_END_DECLS
+
+#endif /* __LT_ERROR_H__ */
599 liblangtag/lt-lang.c
@@ -0,0 +1,599 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * lt-lang.c
+ * Copyright (C) 2011 Akira TAGOH
+ *
+ * Authors:
+ * Akira TAGOH <akira@tagoh.org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <libxml/parser.h>
+#include <libxml/xpath.h>
+#include "lt-error.h"
+#include "lt-mem.h"
+#include "lt-lang.h"
+
+
+typedef enum _lt_lang_entry_type_t {
+ LT_LANG_ENTRY_639_2,
+ LT_LANG_ENTRY_639_3,
+ LT_LANG_ENTRY_END
+} lt_lang_entry_type_t;
+typedef struct _lt_lang_entry_t {
+ lt_mem_t parent;
+ lt_lang_entry_type_t type;
+ gchar *name;
+ union {
+ struct {
+ gchar *_2B_code;
+ gchar *_2T_code;
+ gchar *_1_code;
+ } _639_2;
+ struct {
+ gchar *part2_code;
+ gchar *id;
+ gchar *part1_code;
+ } _639_3;
+ } iso;
+} lt_lang_entry_t;
+
+struct _lt_lang_t {
+ lt_mem_t parent;
+ GHashTable *languages;
+ GHashTable *lang_codes;
+};
+
+typedef gboolean (* lt_xpath_func_t) (lt_lang_t *lang,
+ xmlDocPtr doc,
+ lt_lang_options_t options,
+ GError **error);
+
+/*< private >*/
+static lt_lang_entry_t *
+lt_lang_entry_new(lt_lang_entry_type_t type)
+{
+ lt_lang_entry_t *retval = lt_mem_alloc_object(sizeof (lt_lang_entry_t));
+
+ if (retval) {
+ retval->type = type;
+ }
+
+ return retval;
+}
+
+static lt_lang_entry_t *
+lt_lang_entry_ref(lt_lang_entry_t *entry)
+{
+ g_return_val_if_fail (entry != NULL, NULL);
+
+ return lt_mem_ref(&entry->parent);
+}
+
+static void
+lt_lang_entry_unref(lt_lang_entry_t *entry)
+{
+ if (entry)
+ lt_mem_unref(&entry->parent);
+}
+
+static void
+lt_lang_entry_set_name(lt_lang_entry_t *entry,
+ const gchar *name)
+{
+ g_return_if_fail (entry != NULL);
+ g_return_if_fail (name != NULL);
+
+ if (entry->name)
+ lt_mem_remove_ref(&entry->parent, entry->name);
+ entry->name = g_strdup(name);
+ lt_mem_add_ref(&entry->parent, entry->name,
+ (lt_destroy_func_t)g_free);
+}
+
+static void
+lt_lang_entry_set_code(lt_lang_entry_t *entry,
+ lt_lang_code_t code_type,
+ const gchar *code)
+{
+ gchar **p;
+
+ g_return_if_fail (entry != NULL);
+ g_return_if_fail (code != NULL);
+
+ switch (code_type) {
+ case LT_LANG_CODE_1:
+ if (entry->type == LT_LANG_ENTRY_639_2)
+ p = &entry->iso._639_2._1_code;
+ else if (entry->type == LT_LANG_ENTRY_639_3)
+ p = &entry->iso._639_3.part1_code;
+ else {
+ g_warning("Unknown entry type: %d\n", entry->type);
+ return;
+ }
+ break;
+ case LT_LANG_CODE_2B:
+ if (entry->type == LT_LANG_ENTRY_639_2)
+ p = &entry->iso._639_2._2B_code;
+ else if (entry->type == LT_LANG_ENTRY_639_3)
+ p = &entry->iso._639_3.part2_code;
+ else {
+ g_warning("Unknown entry type: %d\n", entry->type);
+ return;
+ }
+ break;
+ case LT_LANG_CODE_2T:
+ if (entry->type == LT_LANG_ENTRY_639_2)
+ p = &entry->iso._639_2._2T_code;
+ else if (entry->type == LT_LANG_ENTRY_639_3)
+ p = &entry->iso._639_3.id;
+ else {
+ g_warning("Unknown entry type: %d\n", entry->type);
+ return;
+ }
+ break;
+ default:
+ g_warning("Unkonwn code type: %d\n", code_type);
+ return;
+ }
+ if (*p)
+ lt_mem_remove_ref(&entry->parent, *p);
+ *p = g_strdup(code);
+ lt_mem_add_ref(&entry->parent, *p,
+ (lt_destroy_func_t)g_free);
+}
+
+static const gchar *
+lt_lang_entry_get_name(const lt_lang_entry_t *entry)
+{
+ g_return_val_if_fail (entry != NULL, NULL);
+
+ return entry->name;
+}
+
+static const gchar *
+lt_lang_entry_get_code(const lt_lang_entry_t *entry,
+ lt_lang_code_t code_type)
+{
+ const gchar *retval;
+
+ g_return_val_if_fail (entry != NULL, NULL);
+
+ switch (code_type) {
+ case LT_LANG_CODE_1:
+ if (entry->type == LT_LANG_ENTRY_639_2)
+ retval = entry->iso._639_2._1_code;
+ else if (entry->type == LT_LANG_ENTRY_639_3)
+ retval = entry->iso._639_3.part1_code;
+ else {
+ g_warning("Unknown entry type: %d\n", entry->type);
+ retval = NULL;
+ }
+ break;
+ case LT_LANG_CODE_2B:
+ if (entry->type == LT_LANG_ENTRY_639_2)
+ retval = entry->iso._639_2._2B_code;
+ else if (entry->type == LT_LANG_ENTRY_639_3)
+ retval = entry->iso._639_3.part2_code;
+ else {
+ g_warning("Unknown entry type: %d\n", entry->type);
+ retval = NULL;
+ }
+ break;
+ case LT_LANG_CODE_2T:
+ if (entry->type == LT_LANG_ENTRY_639_2)
+ retval = entry->iso._639_2._2T_code;
+ else if (entry->type == LT_LANG_ENTRY_639_3)
+ retval = entry->iso._639_3.id;
+ else {
+ g_warning("Unknown entry type: %d\n", entry->type);
+ retval = NULL;
+ }
+ break;
+ default:
+ g_warning("Unknown code type: %d", code_type);
+ retval = NULL;
+ }
+
+ return retval;
+}
+
+static lt_lang_options_t
+_lt_lang_options_get_scope_from_string(const xmlChar *str)
+{
+ static const gchar *scopes[] = {
+ "I", "M", "C", "D", "R", "S", NULL
+ };
+ int i;
+
+ for (i = 0; scopes[i] != NULL; i++) {
+ if (g_strcmp0(scopes[i], (const gchar *)str) == 0)
+ return i + LT_LANG_SCOPE_BEGIN;
+ }
+
+ return 0;
+}
+
+static lt_lang_options_t
+_lt_lang_options_get_type_from_string(const xmlChar *str)
+{
+ static const gchar *types[] = {
+ "L", "E", "A", "H", "C", NULL
+ };
+ int i;
+
+ for (i = 0; types[i] != NULL; i++) {
+ if (g_strcmp0(types[i], (const gchar *)str) == 0)
+ return i + LT_LANG_TYPE_BEGIN;
+ }
+
+ /* XXX: what is the type "S" ? */
+
+ return 0;
+}
+
+static gboolean
+_lt_lang_parse(lt_lang_t *lang,
+ const gchar *filename,
+ lt_lang_options_t options,
+ lt_xpath_func_t func,
+ GError **error)
+{
+ xmlParserCtxtPtr xmlparser = xmlNewParserCtxt();
+ xmlDocPtr doc = NULL;
+ GError *err = NULL;
+ gboolean retval = TRUE;
+
+ if (!xmlparser) {
+ g_set_error(&err, LT_ERROR, LT_ERR_OOM,
+ "Unable to create an instance of xmlParserCtxt.");
+ goto bail;
+ }
+ doc = xmlCtxtReadFile(xmlparser, filename, "UTF-8", 0);
+ if (!doc) {
+ g_set_error(&err, LT_ERROR, LT_ERR_FAIL_ON_XML,
+ "Unable to read the xml file: %s",
+ filename);
+ goto bail;
+ }
+ retval = func(lang, doc, options, &err);
+
+ bail:
+ if (err) {
+ if (error)
+ *error = g_error_copy(err);
+ else
+ g_warning(err->message);
+ g_error_free(err);
+ retval = FALSE;
+ }
+ if (doc)
+ xmlFreeDoc(doc);
+ if (xmlparser)
+ xmlFreeParserCtxt(xmlparser);
+
+ xmlCleanupParser();
+
+ return retval;
+}
+
+static gboolean
+_lt_lang_parse_639(lt_lang_t *lang,
+ xmlDocPtr doc,
+ lt_lang_options_t options,
+ GError **error)
+{
+ xmlXPathContextPtr xctxt = xmlXPathNewContext(doc);
+ xmlXPathObjectPtr xobj = NULL;
+ gboolean retval = TRUE;
+ int i, n;
+
+ if (!xctxt) {
+ g_set_error(error, LT_ERROR, LT_ERR_OOM,
+ "Unable to create an instance of xmlXPathContextPtr.");
+ retval = FALSE;
+ goto bail;
+ }
+ xobj = xmlXPathEvalExpression((const xmlChar *)"/iso_639_entries/iso_639_entry", xctxt);
+ if (!xobj) {
+ g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_XML,
+ "No valid elements for %s",
+ doc->name);
+ retval = FALSE;
+ goto bail;
+ }
+ n = xmlXPathNodeSetGetLength(xobj->nodesetval);
+
+ for (i = 0; i < n; i++) {
+ xmlNodePtr ent = xmlXPathNodeSetItem(xobj->nodesetval, i);
+ xmlChar *p;
+ lt_lang_entry_t *le;
+
+ if (!ent) {
+ g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_XML,
+ "Unable to obtain the xml node via XPath.");
+ goto bail;
+ }
+ le = lt_lang_entry_new(LT_LANG_ENTRY_639_2);
+ if (!le) {
+ g_set_error(error, LT_ERROR, LT_ERR_OOM,
+ "Unable to create an instance of lt_lang_entry_t.");
+ goto bail;
+ }
+ p = xmlGetProp(ent, (const xmlChar *)"name");
+ lt_lang_entry_set_name(le, (const gchar *)p);
+ xmlFree(p);
+ g_hash_table_replace(lang->languages,
+ (gchar *)lt_lang_entry_get_name(le),
+ lt_lang_entry_ref(le));
+ p = xmlGetProp(ent, (const xmlChar *)"iso_639_1_code");
+ if (p) {
+ lt_lang_entry_set_code(le,
+ LT_LANG_CODE_1,
+ (const gchar *)p);
+ xmlFree(p);
+ g_hash_table_replace(lang->lang_codes,
+ (gchar *)lt_lang_entry_get_code(le, LT_LANG_CODE_1),
+ lt_lang_entry_ref(le));
+ }
+ if (options & LT_LANG_READ_BIBLIOGRAPHIC) {
+ p = xmlGetProp(ent, (const xmlChar *)"iso_639_2B_code");
+ lt_lang_entry_set_code(le,
+ LT_LANG_CODE_2B,
+ (const gchar *)p);
+ xmlFree(p);
+ g_hash_table_replace(lang->lang_codes,
+ (gchar *)lt_lang_entry_get_code(le, LT_LANG_CODE_2B),
+ lt_lang_entry_ref(le));
+ }
+ if (options & LT_LANG_READ_TERMINOLOGY) {
+ p = xmlGetProp(ent, (const xmlChar *)"iso_639_2T_code");
+ lt_lang_entry_set_code(le,
+ LT_LANG_CODE_2T,
+ (const gchar *)p);
+ xmlFree(p);
+ g_hash_table_replace(lang->lang_codes,
+ (gchar *)lt_lang_entry_get_code(le, LT_LANG_CODE_2T),
+ lt_lang_entry_ref(le));
+ }
+ lt_lang_entry_unref(le);
+ }
+ bail:
+ if (xobj)
+ xmlXPathFreeObject(xobj);
+ if (xctxt)
+ xmlXPathFreeContext(xctxt);
+
+ return retval;
+}
+
+static gboolean
+_lt_lang_parse_639_3(lt_lang_t *lang,
+ xmlDocPtr doc,
+ lt_lang_options_t options,
+ GError **error)
+{
+ xmlXPathContextPtr xctxt = xmlXPathNewContext(doc);
+ xmlXPathObjectPtr xobj = NULL;
+ gboolean retval = TRUE;
+ int i, n;
+
+ if (!xctxt) {
+ g_set_error(error, LT_ERROR, LT_ERR_OOM,
+ "Unable to create an instance of xmlXPathContextPtr.");
+ retval = FALSE;
+ goto bail;
+ }
+ xobj = xmlXPathEvalExpression((const xmlChar *)"/iso_639_3_entries/iso_639_3_entry", xctxt);
+ if (!xobj) {
+ g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_XML,
+ "No valid elements for %s",
+ doc->name);
+ retval = FALSE;
+ goto bail;
+ }
+ n = xmlXPathNodeSetGetLength(xobj->nodesetval);
+
+ for (i = 0; i < n; i++) {
+ xmlNodePtr ent = xmlXPathNodeSetItem(xobj->nodesetval, i);
+ xmlChar *p, *type, *scope;
+ lt_lang_entry_t *le;
+ lt_lang_options_t oscope, otype;
+
+ if (!ent) {
+ g_set_error(error, LT_ERROR, LT_ERR_FAIL_ON_XML,
+ "Unable to obtain the xml node via XPath.");
+ goto bail;
+ }
+ scope = xmlGetProp(ent, (const xmlChar *)"scope");
+ type = xmlGetProp(ent, (const xmlChar *)"type");
+ oscope = _lt_lang_options_get_scope_from_string(scope);
+ otype = _lt_lang_options_get_type_from_string(type);
+ xmlFree(scope);
+ xmlFree(type);
+ if ((options & (oscope|otype))) {
+ le = lt_lang_entry_new(LT_LANG_ENTRY_639_3);
+ if (!lang) {
+ g_set_error(error, LT_ERROR, LT_ERR_OOM,
+ "Unable to create an instance of lt_lang_entry_t.");
+ goto bail;
+ }
+ p = xmlGetProp(ent, (const xmlChar *)"name");
+ lt_lang_entry_set_name(le, (const gchar *)p);
+ xmlFree(p);
+ g_hash_table_replace(lang->languages,
+ (gchar *)lt_lang_entry_get_name(le),
+ lt_lang_entry_ref(le));
+ p = xmlGetProp(ent, (const xmlChar *)"id");
+ lt_lang_entry_set_code(le,
+ LT_LANG_CODE_ID,
+ (const gchar *)p);
+ xmlFree(p);
+ g_hash_table_replace(lang->lang_codes,
+ (gchar *)lt_lang_entry_get_code(le, LT_LANG_CODE_ID),
+ lt_lang_entry_ref(le));
+ p = xmlGetProp(ent, (const xmlChar *)"part1_code");
+ if (p) {
+ lt_lang_entry_set_code(le,
+ LT_LANG_CODE_PART1,
+ (const gchar *)p);
+ xmlFree(p);
+ g_hash_table_replace(lang->lang_codes,
+ (gchar *)lt_lang_entry_get_code(le, LT_LANG_CODE_PART1),
+ lt_lang_entry_ref(le));
+ }
+ p = xmlGetProp(ent, (const xmlChar *)"part2_code");
+ if (p) {
+ lt_lang_entry_set_code(le,
+ LT_LANG_CODE_PART2,
+ (const gchar *)p);
+ xmlFree(p);
+ g_hash_table_replace(lang->lang_codes,
+ (gchar *)lt_lang_entry_get_code(le, LT_LANG_CODE_PART2),
+ lt_lang_entry_ref(le));
+ }
+ lt_lang_entry_unref(le);
+ }
+ }
+ bail:
+ if (xobj)
+ xmlXPathFreeObject(xobj);
+ if (xctxt)
+ xmlXPathFreeContext(xctxt);
+
+ return retval;
+}
+
+static gboolean
+lt_lang_parse(lt_lang_t *lang,
+ lt_lang_options_t options,
+ GError **error)
+{
+ gchar *iso639, *iso639_3;
+ gboolean retval;
+
+ g_return_val_if_fail (lang != NULL, FALSE);
+
+ iso639 = g_build_filename(ISO_PREFIX, "iso_639.xml", NULL);
+ iso639_3 = g_build_filename(ISO_PREFIX, "iso_639_3.xml", NULL);
+
+ if (!(retval = _lt_lang_parse(lang, iso639, options,
+ _lt_lang_parse_639,
+ error)))
+ goto bail;
+ if (!(retval = _lt_lang_parse(lang, iso639_3, options,
+ _lt_lang_parse_639_3,
+ error)))
+ goto bail;
+
+ bail:
+ g_free(iso639);
+ g_free(iso639_3);
+
+ return retval;
+}
+
+/*< public >*/
+lt_lang_t *
+lt_lang_new(lt_lang_options_t options)
+{
+ lt_lang_t *retval = lt_mem_alloc_object(sizeof (lt_lang_t));
+
+ if (retval) {
+ GError *err = NULL;
+
+ retval->languages = g_hash_table_new_full(g_str_hash,
+ g_str_equal,
+ NULL,
+ (GDestroyNotify)lt_lang_entry_unref);
+ lt_mem_add_ref(&retval->parent, retval->languages,
+ (lt_destroy_func_t)g_hash_table_destroy);
+ retval->lang_codes = g_hash_table_new_full(g_str_hash,
+ g_str_equal,
+ NULL,
+ (GDestroyNotify)lt_lang_entry_unref);
+ lt_mem_add_ref(&retval->parent, retval->lang_codes,
+ (lt_destroy_func_t)g_hash_table_destroy);
+
+ lt_lang_parse(retval, options, &err);
+ if (err) {
+ g_printerr(err->message);
+ lt_lang_unref(retval);
+ retval = NULL;
+ g_error_free(err);
+ }
+ }
+
+ return retval;
+}
+
+lt_lang_t *
+lt_lang_ref(lt_lang_t *lang)
+{
+ g_return_val_if_fail (lang != NULL, NULL);
+
+ return lt_mem_ref(&lang->parent);
+}
+
+void
+lt_lang_unref(lt_lang_t *lang)
+{
+ if (lang)
+ lt_mem_unref(&lang->parent);
+}
+
+GList *
+lt_lang_get_languages(lt_lang_t *lang)
+{
+ g_return_val_if_fail (lang != NULL, NULL);
+
+ return g_hash_table_get_keys(lang->languages);
+}
+
+const gchar *
+lt_lang_lookup_language(lt_lang_t *lang,
+ const gchar *code)
+{
+ lt_lang_entry_t *le;
+
+ g_return_val_if_fail (lang != NULL, NULL);
+ g_return_val_if_fail (code != NULL, NULL);
+
+ le = g_hash_table_lookup(lang->lang_codes, code);
+ if (le)
+ return lt_lang_entry_get_name(le);
+
+ return NULL;
+}
+
+const gchar *
+lt_lang_lookup_code(lt_lang_t *lang,
+ const gchar *language,
+ lt_lang_code_t type)
+{
+ lt_lang_entry_t *le;
+
+ g_return_val_if_fail (lang != NULL, NULL);
+ g_return_val_if_fail (language != NULL, NULL);
+
+ le = g_hash_table_lookup(lang->languages, language);
+ if (le)
+ return lt_lang_entry_get_code(le, type);
+
+ return NULL;
+}
81 liblangtag/lt-lang.h
@@ -0,0 +1,81 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * lt-lang.h
+ * Copyright (C) 2011 Akira TAGOH
+ *
+ * Authors:
+ * Akira TAGOH <akira@tagoh.org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __LT_LANG_H__
+#define __LT_LANG_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+#define LT_LANG_SCOPE_BEGIN 2
+#define LT_LANG_TYPE_BEGIN 8
+
+enum _lt_lang_options_t {
+ LT_LANG_READ_BIBLIOGRAPHIC = 1 << 0,
+ LT_LANG_READ_TERMINOLOGY = 1 << 1,
+ LT_LANG_READ_SCOPE_INDIVIDUAL = 1 << (LT_LANG_SCOPE_BEGIN + 0), /* 2 */
+ LT_LANG_READ_SCOPE_MACRO = 1 << (LT_LANG_SCOPE_BEGIN + 1), /* 3 */
+ LT_LANG_READ_SCOPE_COLLECTIONS = 1 << (LT_LANG_SCOPE_BEGIN + 2), /* 4 */
+ LT_LANG_READ_SCOPE_DIALECTS = 1 << (LT_LANG_SCOPE_BEGIN + 3), /* 5 */
+ LT_LANG_READ_SCOPE_LOCAL_USE = 1 << (LT_LANG_SCOPE_BEGIN + 4), /* 6 */
+ LT_LANG_READ_SCOPE_SPECIAL = 1 << (LT_LANG_SCOPE_BEGIN + 5), /* 7 */
+ LT_LANG_READ_TYPE_LIVING = 1 << (LT_LANG_TYPE_BEGIN + 0), /* 8 */
+ LT_LANG_READ_TYPE_EXTINCT = 1 << (LT_LANG_TYPE_BEGIN + 1), /* 9 */
+ LT_LANG_READ_TYPE_ANCIENT = 1 << (LT_LANG_TYPE_BEGIN + 2), /* 10 */
+ LT_LANG_READ_TYPE_HISTORIC = 1 << (LT_LANG_TYPE_BEGIN + 3), /* 11 */
+ LT_LANG_READ_TYPE_CONSTRUCTED = 1 << (LT_LANG_TYPE_BEGIN + 4), /* 12 */
+ LT_LANG_END = 1 << (LT_LANG_TYPE_BEGIN + 5) /* 13 */
+};
+#define LT_LANG_READ_ALL ((LT_LANG_END - 1))
+#define LT_LANG_READ_MINIMAL (( \
+ LT_LANG_READ_TERMINOLOGY| \
+ LT_LANG_READ_SCOPE_INDIVIDUAL| \
+ LT_LANG_READ_TYPE_LIVING))
+
+enum _lt_lang_code_t {
+ LT_LANG_CODE_1 = 1,
+ LT_LANG_CODE_2B = 2,
+ LT_LANG_CODE_2T = 3,
+ LT_LANG_CODE_ID = LT_LANG_CODE_2T,
+ LT_LANG_CODE_PART1 = LT_LANG_CODE_1,
+ LT_LANG_CODE_PART2 = LT_LANG_CODE_2B,
+ LT_LANG_CODE_END
+};
+
+typedef struct _lt_lang_t lt_lang_t;
+typedef enum _lt_lang_options_t lt_lang_options_t;
+typedef enum _lt_lang_code_t lt_lang_code_t;
+
+
+lt_lang_t *lt_lang_new (lt_lang_options_t options);
+lt_lang_t *lt_lang_ref (lt_lang_t *parser);
+void lt_lang_unref (lt_lang_t *parser);
+GList *lt_lang_get_languages (lt_lang_t *lang);
+const gchar *lt_lang_lookup_language(lt_lang_t *lang,
+ const gchar *code);
+const gchar *lt_lang_lookup_code (lt_lang_t *lang,
+ const gchar *language,
+ lt_lang_code_t type);
+
+G_END_DECLS
+
+#endif /* __LT_LANG_H__ */
125 liblangtag/lt-mem.c
@@ -0,0 +1,125 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * lt-mem.c
+ * Copyright (C) 2011 Akira TAGOH
+ *
+ * Authors:
+ * Akira TAGOH <akira@tagoh.org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "lt-mem.h"
+
+
+/*< private >*/
+
+/*< public >*/
+gpointer
+lt_mem_alloc_object(gsize size)
+{
+ lt_mem_t *retval;
+
+ g_return_val_if_fail (size > 0, NULL);
+
+ retval = g_malloc0(size);
+ if (retval) {
+ retval->ref_count = 1;
+ retval->refs = NULL;
+ retval->size = size;
+ }
+
+ return retval;
+}
+
+gpointer
+lt_mem_ref(lt_mem_t *object)
+{
+ g_return_val_if_fail (object != NULL, NULL);
+
+ g_atomic_int_inc(&object->ref_count);
+
+ return object;
+}
+
+void
+lt_mem_unref(lt_mem_t *object)
+{
+ g_return_if_fail (object != NULL);
+
+ if (g_atomic_int_dec_and_test(&object->ref_count)) {
+ if (object->refs) {
+ GHashTableIter iter;
+ gpointer p, unref;
+
+ g_hash_table_iter_init(&iter, object->refs);
+ while (g_hash_table_iter_next(&iter, &p, &unref)) {
+ if (unref) {
+ ((lt_destroy_func_t)unref)(p);
+ }
+ }
+ }
+ g_hash_table_destroy(object->refs);
+ g_free(object);
+ }
+}
+
+void
+lt_mem_add_ref(lt_mem_t *object,
+ gpointer p,
+ lt_destroy_func_t func)
+{
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (p != NULL);
+ g_return_if_fail (func != NULL);
+
+ if (!object->refs) {
+ object->refs = g_hash_table_new(g_direct_hash,
+ g_direct_equal);
+ }
+ g_hash_table_replace(object->refs,
+ p, func);
+}
+
+void
+lt_mem_remove_ref(lt_mem_t *object,
+ gpointer p)
+{
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (p != NULL);
+
+ if (object->refs) {
+ lt_destroy_func_t unref;
+
+ if ((unref = g_hash_table_lookup(object->refs, p))) {
+ unref(p);
+ g_hash_table_remove(object->refs, p);
+ }
+ }
+}
+
+void
+lt_mem_delete_ref(lt_mem_t *object,
+ gpointer p)
+{
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (p != NULL);
+
+ if (object->refs) {
+ g_hash_table_remove(object->refs, p);
+ }
+}
52 liblangtag/lt-mem.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * lt-mem.h
+ * Copyright (C) 2011 Akira TAGOH
+ *
+ * Authors:
+ * Akira TAGOH <akira@tagoh.org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __LT_MEM_H__
+#define __LT_MEM_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef struct _lt_mem_t lt_mem_t;
+
+typedef void (* lt_destroy_func_t) (gpointer data);
+
+struct _lt_mem_t {
+ gint ref_count;
+ gsize size;
+ GHashTable *refs;
+};
+
+gpointer lt_mem_alloc_object(gsize size);
+gpointer lt_mem_ref (lt_mem_t *object);
+void lt_mem_unref (lt_mem_t *object);
+void lt_mem_add_ref (lt_mem_t *object,
+ gpointer p,
+ lt_destroy_func_t func);
+void lt_mem_remove_ref (lt_mem_t *object,
+ gpointer p);
+void lt_mem_delete_ref (lt_mem_t *object,
+ gpointer p);
+
+G_END_DECLS
+
+#endif /* __LT_MEM_H__ */
0 m4macros/.no_files
No changes.
3 requires
@@ -0,0 +1,3 @@
+GLIB_REQUIRED=2.14.0
+GOBJECT_REQUIRED=2.0
+LIBXML2_REQUIRED=2.1.0
45 tests/Makefile.am
@@ -0,0 +1,45 @@
+##
+# Global definitions
+NULL =
+SUBDIRS =
+INCLUDES = \
+ -I$(top_srcdir)/liblangtag \
+ -I$(top_srcdir) \
+ $(GLIB_CFLAGS) \
+ $(NULL)
+DEPS = \
+ $(top_builddir)/liblangtag/liblangtag.la \
+ $(NULL)
+LIBS = \
+ @LDFLAGS@ \
+ $(top_builddir)/liblangtag/liblangtag.la \
+ $(NULL)
+EXTRA_DIST = \
+ $(NULL)
+TESTS = \
+ $(NULL)
+
+
+##
+# Local definitions
+common_private_headers = \
+ $(NULL)
+common_sources = \
+ $(NULL)
+
+##
+# Local Rules
+
+
+##
+# Target platform
+noinst_HEADERS = \
+ $(common_private_headers) \
+ $(NULL)
+noinst_PROGRAMS = \
+ test-lang \
+ $(NULL)
+#
+test_lang_SOURCES = \
+ lang.c \
+ $(NULL)
57 tests/lang.c
@@ -0,0 +1,57 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * lang.c
+ * Copyright (C) 2011 Akira TAGOH
+ *
+ * Authors:
+ * Akira TAGOH <akira@tagoh.org>
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <locale.h>
+#include "lt-lang.h"
+
+int
+main(int argc,
+ char **argv)
+{
+ lt_lang_t *lang;
+
+ setlocale(LC_ALL, "");
+
+ lang = lt_lang_new(LT_LANG_READ_MINIMAL);
+
+ if (g_strcmp0(argv[1], "list") == 0) {
+ GList *l = lt_lang_get_languages(lang), *ll;
+
+ for (ll = l; ll != NULL; ll = g_list_next(ll)) {
+ g_print("%s\n", (gchar *)ll->data);
+ }
+ g_list_free(l);
+ } else if (g_strcmp0(argv[1], "code") == 0) {
+ g_print("%s\n", lt_lang_lookup_code(lang, argv[2], LT_LANG_CODE_ID));
+ g_print("%s\n", lt_lang_lookup_code(lang, argv[2], LT_LANG_CODE_PART1));
+ g_print("%s\n", lt_lang_lookup_code(lang, argv[2], LT_LANG_CODE_PART2));
+ } else if (g_strcmp0(argv[1], "lang") == 0) {
+ g_print("%s\n", lt_lang_lookup_language(lang, argv[2]));
+ }
+
+ lt_lang_unref(lang);
+
+ return 0;
+}

0 comments on commit 2c43f4e

Please sign in to comment.
Something went wrong with that request. Please try again.