on the linking of the program as the last option, so that its initialization
code is run first. In the case of using the C object model, the linking
options should be: <code>-lgedcom_gom -lgedcom</code><br>
- <br>
- The next sections will refine this piece of code to be able to have
+ <br>The function <code>gedcom_init()</code> also initializes locale handling by calling <code>setlocale(LC_ALL, "")</code>, in case the application would not do this (it doesn't hurt for the application to do the same).<br>
+ <br>
+The next sections will refine this piece of code to be able to have
meaningful errors and the actual data that is in the file.<br>
<hr width="100%" size="2">
<br>
The source distribution of <code>
-gedcom-parse</code> contains an example implementation (<code>utf8-locale.c</code>
- and <code> utf8-locale.h</code> in the "t" subdirectory of the top directory).
- Feel free to use it in your source code (it is not part of the library,
-and it isn't installed anywhere, so you need to take over the source and
-header file in your application). <br>
+gedcom-parse</code> contains an a library implementing help functions for UTF-8 encoding (<code></code>see
+the "utf8" subdirectory of the top directory). Feel free to use
+ it in your source code. It isn't installed anywhere, so you need
+to take over the source and header files in your application. Note that on
+some systems it uses libcharset, which is also included in this subdirectory.
+ <br>
<br>
- Its interface is:<br>
+ Its interface contains first of all the following two help functions:<br>
<blockquote>
- <pre><code>char *<b>convert_utf8_to_locale</b> (char *input, int *conv_failures);<br>char *<b>convert_locale_to_utf8</b> (char *input);<br></code></pre>
+ <pre><code>int <b>is_utf8_string</b> (char *input);<br>int <b>utf8_strlen</b> (char *input);<br></code></pre></blockquote>The
+first one returns 1 if the given input is a valid UTF-8 string, it returns
+0 otherwise, the second gives the number of UTF-8 characters in the given
+input. Note that the second function assumes that the input is valid
+UTF-8, and gives unpredictable results if it isn't.<br>
+<br>
+For conversion, the following functions are available:<br>
+<blockquote>
+ <pre><code></code><code>char *<b>convert_utf8_to_locale</b> (char *input, int *conv_failures);<br>char *<b>convert_locale_to_utf8</b> (char *input);<br></code></pre>
+</blockquote>
+<blockquote>
</blockquote>
+
Both functions return a pointer to a static buffer that is overwritten
on each call. To function properly, the application must first set
the locale using the <code>setlocale</code> function (the second step detailed
<blockquote>
<pre><code>iconv_close(iconv_handle);<br></code></pre>
</blockquote>
- </blockquote>
- The example implementation
- mentioned above grows the output buffer dynamically and outputs "?" for characters
+ </blockquote>
+ The example implementation
+mentioned above grows the output buffer dynamically and outputs "?" for characters
that can't be converted.<br>
<hr width="100%" size="2">
-<h2><a name="Support_for_configure.in"></a>Support for configure.in</h2>
- Programs using the GEDCOM parser library and using autoconf to configure
- their sources can use the following statements in configure.in (the example
- is checking for gedcom-parse, version 1.34):<br>
-
-<blockquote><code>AC_CHECK_LIB(gedcom, gedcom_parse_file,,<br>
- AC_MSG_ERROR(Cannot
- find libgedcom: Please install gedcom-parse))<br>
- AC_MSG_CHECKING(for libgedcom version)<br>
- AC_TRY_RUN([<br>
- #include <stdio.h><br>
- #include <stdlib.h><br>
- #include <gedcom.h><br>
- int<br>
- main()<br>
- {<br>
- if (GEDCOM_PARSE_VERSION >= 1034) exit(0);<br>
- exit(1);<br>
- }],<br>
- ac_gedcom_version_ok='yes',<br>
- ac_gedcom_version_ok='no',<br>
- ac_gedcom_version_ok='no')<br>
- if test "$ac_gedcom_version_ok" = 'yes' ; then<br>
- AC_MSG_RESULT(ok)<br>
- else<br>
- AC_MSG_RESULT(not ok)<br>
- AC_MSG_ERROR(You need at least version 1.34 of gedcom-parse)<br>
- fi</code><br>
- </blockquote>
- There are three preprocessor symbols defined for version checks in the
- header:<br>
+<h2><a name="Support_for_configure.in"></a>Support for configure.in</h2>There
+is a macro available for use in configure.in for applications that are using
+autoconf to configure their sources. The following macro checks whether
+the Gedcom parser library is available and whether its version is high enough:<br>
+<blockquote><code>AM_LIB_GEDCOM_PARSER([<i>major</i>,[<i>minor</i>,[<i>patch</i>]]])</code><br>
+</blockquote>
+All the arguments are optional and default to 0. E.g. to check for
+version 1.34, you would put in configure.in the following statement:<br>
+<blockquote><code>AM_LIB_GEDCOM_PARSER(1,34)</code><br>
+</blockquote>
+To be able to use this macro in the sources of your application, you have three options:<br>
+<ul>
+ <li>Put the file <code>m4/gedcom.m4</code> in your autoconf data directory (i.e. the path given by '<code>aclocal --print-ac-dir</code>', usually <code>/usr/share/aclocal</code>). You can do this automatically by going into the m4 subdirectory and typing '<code>make install-m4</code>'.<br>
+ <br>
+ </li>
+ <li>If you're using autoconf, but not automake, copy the contents of <code>m4/gedcom.m4</code> in the <code>aclocal.m4</code> file in your sources.<br>
+ <br>
+ </li>
+ <li>If you're using automake, copy the contents of <code>m4/gedcom.m4</code> in the <code>acinclude.m4</code> file in your sources.<br>
+ </li>
+</ul>
+<br>
+There are three preprocessor symbols defined for version checks in the
+ header (but their direct use is deprecated: please use the macro above):<br>
<ul>
<li><code>GEDCOM_PARSE_VERSION_MAJOR</code></li>
</ul>
The last one is equal to <code>(GEDCOM_PARSE_VERSION_MAJOR * 1000) + GEDCOM_PARSE_VERSION_MINOR.</code><br>
+
<hr width="100%" size="2">
<pre> </pre>
+<br>
+<br>
+<br>
<br>
<br>
<br>