summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--ChangeLog9
-rw-r--r--Lib/.keep0
-rw-r--r--Makefile.am6
-rw-r--r--README100
-rwxr-xr-xconfigure22476
-rw-r--r--configure.ac36
-rw-r--r--debian/changelog (renamed from changelog)0
-rw-r--r--debian/compat (renamed from compat)0
-rw-r--r--debian/control (renamed from control)0
-rw-r--r--debian/copyright (renamed from copyright)0
-rw-r--r--debian/gbp.conf (renamed from gbp.conf)0
-rw-r--r--debian/libfyba-dev.doc-base (renamed from libfyba-dev.doc-base)0
-rw-r--r--debian/libfyba-dev.docs (renamed from libfyba-dev.docs)0
-rw-r--r--debian/libfyba-dev.install (renamed from libfyba-dev.install)0
-rw-r--r--debian/libfyba0.docs (renamed from libfyba0.docs)0
-rw-r--r--debian/libfyba0.install (renamed from libfyba0.install)0
-rw-r--r--debian/libfyba0.lintian-overrides (renamed from libfyba0.lintian-overrides)0
-rw-r--r--debian/patches/01_noexit_in_library.patch (renamed from patches/01_noexit_in_library.patch)0
-rw-r--r--debian/patches/02_fix_linking.patch (renamed from patches/02_fix_linking.patch)0
-rw-r--r--debian/patches/fix_issue.patch (renamed from patches/fix_issue.patch)0
-rw-r--r--debian/patches/series (renamed from patches/series)0
-rwxr-xr-xdebian/rules (renamed from rules)0
-rw-r--r--debian/shlibs (renamed from shlibs)0
-rw-r--r--debian/source/format (renamed from source/format)0
-rw-r--r--debian/source/lintian-overrides (renamed from source/lintian-overrides)0
-rw-r--r--debian/upstream/metadata (renamed from upstream/metadata)0
-rw-r--r--debian/watch (renamed from watch)0
-rw-r--r--doc/Makefile.am3
-rw-r--r--doc/en_EN/fyba.html10
-rw-r--r--doc/en_EN/fyba1.html304
-rw-r--r--doc/en_EN/fyba2.html6789
-rw-r--r--doc/no_NB/fyba.html10
-rw-r--r--doc/no_NB/fyba1.html304
-rw-r--r--doc/no_NB/fyba2.html6795
-rw-r--r--fyba.pc.in11
-rw-r--r--include/fyba.h1484
-rw-r--r--include/fygm.h129
-rw-r--r--include/fyut.h283
-rw-r--r--m4/.keep0
-rw-r--r--src/FYBA/FYBA.cpp42
-rw-r--r--src/FYBA/FYBA.sln26
-rw-r--r--src/FYBA/FYBA.vcxproj231
-rw-r--r--src/FYBA/FYBA_DLL.cpp25
-rw-r--r--src/FYBA/FYHO.cpp1456
-rw-r--r--src/FYBA/FYLB.cpp4646
-rw-r--r--src/FYBA/FYLD.cpp111
-rw-r--r--src/FYBA/FYLE.cpp494
-rw-r--r--src/FYBA/FYLH.cpp1035
-rw-r--r--src/FYBA/FYLI.cpp2297
-rw-r--r--src/FYBA/FYLO.cpp2529
-rw-r--r--src/FYBA/FYLP.cpp1169
-rw-r--r--src/FYBA/FYLR.cpp2240
-rw-r--r--src/FYBA/FYLS.cpp678
-rw-r--r--src/FYBA/FYLU.cpp2904
-rw-r--r--src/FYBA/FYLX.cpp4948
-rw-r--r--src/FYBA/FYTA.cpp199
-rw-r--r--src/FYBA/Fyba_Callback.cpp232
-rw-r--r--src/FYBA/Fyba_melding.cpp201
-rw-r--r--src/FYBA/Fyba_melding_dll.cpp.bak368
-rw-r--r--src/FYBA/LICENSE24
-rw-r--r--src/FYBA/Makefile.am9
-rw-r--r--src/FYBA/fyba.h1484
-rw-r--r--src/FYBA/fyba_strings.h223
-rw-r--r--src/FYBA/fybax.h344
-rw-r--r--src/FYBA/fyln.cpp870
-rwxr-xr-xsrc/FYBA/make.sh5
-rw-r--r--src/FYBA/stdafx.cpp8
-rw-r--r--src/FYBA/stdafx.h16
-rw-r--r--src/GM/GM.cpp3245
-rw-r--r--src/GM/GM.sln26
-rw-r--r--src/GM/GM.vcxproj193
-rw-r--r--src/GM/LICENSE24
-rw-r--r--src/GM/Makefile.am10
-rw-r--r--src/GM/fygm.h129
-rwxr-xr-xsrc/GM/make.sh4
-rw-r--r--src/GM/stdafx.cpp8
-rw-r--r--src/GM/stdafx.h9
-rw-r--r--src/UT/ANFORSEL.cpp189
-rw-r--r--src/UT/CREDIR.cpp81
-rw-r--r--src/UT/CopyFile.cpp78
-rw-r--r--src/UT/DELDIR.cpp78
-rw-r--r--src/UT/DELFILE.cpp43
-rw-r--r--src/UT/DISKINFO.cpp199
-rw-r--r--src/UT/FILNACMP.cpp54
-rw-r--r--src/UT/FULLPATH.cpp249
-rw-r--r--src/UT/INQSIZE.cpp173
-rw-r--r--src/UT/INQTID.cpp209
-rw-r--r--src/UT/LICENSE24
-rw-r--r--src/UT/MAKEPATH.cpp140
-rw-r--r--src/UT/Makefile.am11
-rw-r--r--src/UT/SETSIZE.cpp210
-rw-r--r--src/UT/SPLITPTH.cpp94
-rw-r--r--src/UT/StrtPros.cpp122
-rw-r--r--src/UT/UT.sln29
-rw-r--r--src/UT/UT.vcxproj218
-rw-r--r--src/UT/UT1.cpp817
-rw-r--r--src/UT/UT2.cpp1550
-rw-r--r--src/UT/UT3.cpp575
-rw-r--r--src/UT/UT4.cpp149
-rw-r--r--src/UT/fyut.h283
-rwxr-xr-xsrc/UT/make.sh4
-rw-r--r--src/UT/stdafx.cpp8
-rw-r--r--src/UT/stdafx.h12
104 files changed, 76815 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0bd29f0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+Lib/*.lib
+*Debug*
+*Release*
+*.sdf
+*.suo \ No newline at end of file
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..ab2b6c5
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,9 @@
+4.1.1:
+ Automake build routines
+ Simplified building routines in Linux, Windows and Mac
+ Removed routines possibly copyrighted by Borland
+ Handling for file permission denied of index files
+ Translated some documentation into English.
+ Added ChangeLog :)
+4.1.0:
+ First release to be published under an open source license
diff --git a/Lib/.keep b/Lib/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Lib/.keep
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..3897403
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,6 @@
+ACLOCAL_AMFLAGS = -I m4
+AUTOMAKE_OPTIONS = foreign
+SUBDIRS = src/GM src/UT src/FYBA doc
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = fyba.pc
diff --git a/README b/README
new file mode 100644
index 0000000..25f98af
--- /dev/null
+++ b/README
@@ -0,0 +1,100 @@
+== INTRODUCTION ==
+
+OpenFYBA is the source code release of the FYBA library, distributed by the
+National Mapping Authority of Norway (Statens kartverk) to read and write
+files in the National geodata standard format SOSI.
+
+The original library has a long history, and was originally developed for
+systems as diverse as DOS, OS/2-16, OS/2-32, Win16, Win32, and various UNIX
+variants (POSIX, HPUX, Silicon graphics). In Norwegian. It shows in the
+source code. OpenFYBA has been tested to run at least on Windows and Linux
+environments.
+
+We welcome any contributions towards internationalization of the library.
+In the meantime, if you do not happen to speak Norwegian, google translate
+can help you with the documentation.
+
+Do send feedback if you think you can help to improve this documentation.
+
+_______________________________________________________________________
+
+Send feedback to: Thomas Hirsch <thomas.hirsch@statkart.no>
+
+== INSTALLATION ==
+
+The FYBA library depends on two helper libraries, GM for geometry routines
+and UT for utilities. The general procedure is therefore:
+- Compile libfybagm and libfybaut using the provided make scripts (or Visual
+ Studio project files).
+- Compile libfyba using the provided make script.
+- Optionally build and run the unit tests in the tests folder.
+
+** Linux **
+
+./configure
+make
+make install
+
+If the first step does not work right away, try to rebuild the configure
+file for your system with autotools first:
+
+autoreconf --force --install
+
+** Mac OS X **
+
+See issue #12. Replace any include of vfs.h with mount.h, then proceed with as per the Linux instructions.
+Patches welcome.
+
+** Windows **
+
+On Windows all three libs of the FYBA library (GM.lib, UT.lib, and FYBA.lib)
+have to be build individually.
+
+For building FYBA on Windows project files for MS Visual Studio Express 2012
+are provided in the folders fyba/src/GM, fyba/src/UT and fyba/src/FYBA.
+Using these project files the individual libs are built in a subfolder within
+the project directory and then copied to the fyba/Lib folder.
+Therefore the fyba/Lib folder has to be created before running the build process.
+
+When GM.lib, UT.lib and FYBA.lib are built you may want to use the libs for
+activating the SOSI-driver in GDAL. For building GDAL with SOSI-support on Windows
+see: http://trac.osgeo.org/gdal/wiki/SOSI
+
+** Other **
+
+Do send feedback if you manage to compile the library on any other system!
+
+== USAGE ==
+
+Please refer to the extensive, but Norwegian documentation in docs/no_NB.
+Take a moment to enjoy the pleasant International mix of method names.
+Most methods have a few lines of example code to help you getting started.
+
+If you do not speak Norwegian, try google translating the document.
+
+I personally would also suggest to take a look at the
+SOSI driver for the GDAL/OGR library for more usage examples.
+
+== LICENSE ==
+
+/******************************************************************************
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+
diff --git a/configure b/configure
new file mode 100755
index 0000000..1dcd21e
--- /dev/null
+++ b/configure
@@ -0,0 +1,22476 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for fyba 4.1.0.
+#
+# Report bugs to <thomas.hirsch@statkart.no>.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+tagnames=${tagnames+${tagnames},}CXX
+
+tagnames=${tagnames+${tagnames},}F77
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='fyba'
+PACKAGE_TARNAME='fyba'
+PACKAGE_VERSION='4.1.0'
+PACKAGE_STRING='fyba 4.1.0'
+PACKAGE_BUGREPORT='thomas.hirsch@statkart.no'
+
+ac_unique_file="include/fygm.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP build build_cpu build_vendor build_os host host_cpu host_vendor host_os SED EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOBJS POW_LIB LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+ac_env_F77_set=${F77+set}
+ac_env_F77_value=$F77
+ac_cv_env_F77_set=${F77+set}
+ac_cv_env_F77_value=$F77
+ac_env_FFLAGS_set=${FFLAGS+set}
+ac_env_FFLAGS_value=$FFLAGS
+ac_cv_env_FFLAGS_set=${FFLAGS+set}
+ac_cv_env_FFLAGS_value=$FFLAGS
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures fyba 4.1.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of fyba 4.1.0:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --enable-shared[=PKGS]
+ build shared libraries [default=yes]
+ --enable-static[=PKGS]
+ build static libraries [default=yes]
+ --enable-fast-install[=PKGS]
+ optimize for fast installation [default=yes]
+ --disable-libtool-lock avoid locking (might break parallel builds)
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-pic try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-tags[=TAGS]
+ include additional configurations [automatic]
+
+Some influential environment variables:
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CC C compiler command
+ CFLAGS C compiler flags
+ CPP C preprocessor
+ CXXCPP C++ preprocessor
+ F77 Fortran 77 compiler command
+ FFLAGS Fortran 77 compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <thomas.hirsch@statkart.no>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+fyba configure 4.1.0
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by fyba $as_me 4.1.0, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+am__api_version="1.9"
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,$program_prefix,;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$,$program_suffix,;$program_transform_name"
+# Double any \ or $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE=fyba
+ VERSION=4.1.0
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+ac_macro_dir=./m4;
+
+LT_INIT()
+case ./m4 in
+ [\\/]* | ?:[\\/]* ) ac_macro_dir=./m4 ;;
+ *) ac_macro_dir=$srcdir/./m4 ;;
+esac
+if test -d "$ac_macro_dir"; then :
+else
+ { { echo "$as_me:$LINENO: error: cannot find macro directory \`./m4'" >&5
+echo "$as_me: error: cannot find macro directory \`./m4'" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+
+ ac_config_headers="$ac_config_headers config.h"
+
+
+# Checks for programs.
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+ CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cxx_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+ enableval="$enable_dependency_tracking"
+
+fi;
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CXX" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_shared=yes
+fi;
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_static=yes
+fi;
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval="$enable_fast_install"
+ p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac
+else
+ enable_fast_install=yes
+fi;
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
+if test "${lt_cv_path_SED+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && continue
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+
+fi
+
+SED=$lt_cv_path_SED
+
+echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ darwin*)
+ if test "$GCC" = yes; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_nm_to_check="${ac_tool_prefix}nm"
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/$lt_tmp_nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ done
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6
+NM="$lt_cv_path_NM"
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[45]*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu | dragonfly*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix3*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 4390 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ lt_cv_cc_needs_belf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+lt_cv_cc_needs_belf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ---------------------------------------- ##
+## Report this to thomas.hirsch@statkart.no ##
+## ---------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+fi
+
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$F77"; then
+ ac_cv_prog_F77="$F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+ echo "$as_me:$LINENO: result: $F77" >&5
+echo "${ECHO_T}$F77" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$F77" && break
+ done
+fi
+if test -z "$F77"; then
+ ac_ct_F77=$F77
+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_F77"; then
+ ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_F77="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+ echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
+echo "${ECHO_T}$ac_ct_F77" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_F77" && break
+done
+
+ F77=$ac_ct_F77
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:5291:" \
+ "checking for Fortran 77 compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file. (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
+if test "${ac_cv_f77_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+#ifndef __GNUC__
+ choke me
+#endif
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
+echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_f77_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ FFLAGS=-g
+cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_f77_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_f77_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
+echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
+if test "$ac_test_FFLAGS" = set; then
+ FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-g -O2"
+ else
+ FFLAGS="-g"
+ fi
+else
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-O2"
+ else
+ FFLAGS=
+ fi
+fi
+
+G77=`test $ac_compiler_gnu = yes && echo yes`
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+
+# find the maximum length of command line arguments
+echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ ;;
+ esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+ echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+else
+ echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDEGRST]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDGIRSTW]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[BCDEGRST]'
+ ;;
+osf*)
+ symcode='[BCDEGQRST]'
+ ;;
+solaris*)
+ symcode='[BDRT]'
+ ;;
+sco3.2v5*)
+ symcode='[DT]'
+ ;;
+sysv4.2uw2*)
+ symcode='[DT]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[ABDT]'
+ ;;
+sysv4)
+ symcode='[DFNSTU]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
+ (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+ fi
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+ echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+if test "${lt_cv_objdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6
+objdir=$lt_cv_objdir
+
+
+
+
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ AR=$ac_ct_AR
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/${ac_tool_prefix}file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MAGIC_CMD in
+[\\/*] | ?:[\\/]*)
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/file; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/file"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+enable_dlopen=no
+enable_win32_dll=no
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+
+fi;
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+ withval="$with_pic"
+ pic_mode="$withval"
+else
+ pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:6354: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:6358: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_static='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ interix3*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static='-Bstatic'
+ else
+ lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic='-qnocommon'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl='-Qoption ld '
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic='-Kconform_pic'
+ lt_prog_compiler_static='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_can_build_shared=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic='-pic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:6622: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:6626: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+
+if test x"$lt_prog_compiler_pic_works" = xyes; then
+ case $lt_prog_compiler_pic in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+ esac
+else
+ lt_prog_compiler_pic=
+ lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic=
+ ;;
+ *)
+ lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works=yes
+ fi
+ else
+ lt_prog_compiler_static_works=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+
+if test x"$lt_prog_compiler_static_works" = xyes; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:6726: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:6730: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag=
+ enable_shared_with_static_runtimes=no
+ archive_cmds=
+ archive_expsym_cmds=
+ old_archive_From_new_cmds=
+ old_archive_from_expsyms_cmds=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ thread_safe_flag_spec=
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_flag_spec_ld=
+ hardcode_libdir_separator=
+ hardcode_direct=no
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ link_all_deplibs=unknown
+ hardcode_automatic=no
+ module_cmds=
+ module_expsym_cmds=
+ always_export_symbols=no
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ allow_undefined_flag=unsupported
+ always_export_symbols=no
+ enable_shared_with_static_runtimes=yes
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ interix3*)
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag=unsupported
+ always_export_symbols=yes
+ archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds=''
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct=yes
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag="-z nodefs"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag=' ${wl}-bernotok'
+ allow_undefined_flag=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ archive_cmds_need_lc=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ allow_undefined_flag=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ whole_archive_flag_spec=''
+ link_all_deplibs=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ hardcode_direct=yes
+ export_dynamic_flag_spec='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld='+b $libdir'
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=yes
+ export_dynamic_flag_spec='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ link_all_deplibs=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ newsos6)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_shlibpath_var=no
+ ;;
+
+ openbsd*)
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ link_all_deplibs=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds='$CC -r -o $output$reload_objs'
+ hardcode_direct=no
+ ;;
+ motorola)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ export_dynamic_flag_spec='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ no_undefined_flag='${wl}-z,text'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag='${wl}-z,text'
+ allow_undefined_flag='${wl}-z,nodefs'
+ archive_cmds_need_lc=no
+ hardcode_shlibpath_var=no
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ link_all_deplibs=yes
+ export_dynamic_flag_spec='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl
+ pic_flag=$lt_prog_compiler_pic
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag
+ allow_undefined_flag=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc=no
+ else
+ archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix3*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '#line 8195 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var" || \
+ test "X$hardcode_automatic" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no &&
+ test "$hardcode_minus_L" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+if test "$hardcode_action" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+ esac
+fi
+
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+
+fi
+
+ ;;
+
+ *)
+ echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shl_load
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+ lt_cv_dlopen="shl_load"
+else
+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef dlopen
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+ lt_cv_dlopen="dlopen"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 9092 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self" >&6
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then :
+ lt_cv_dlopen_self_static=cross
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+#line 9192 "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&5 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+ x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+ esac
+ else :
+ # compilation failed
+ lt_cv_dlopen_self_static=no
+ fi
+fi
+rm -fr conftest*
+
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+
+
+# Report which library types will actually be built
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler \
+ CC \
+ LD \
+ lt_prog_compiler_wl \
+ lt_prog_compiler_pic \
+ lt_prog_compiler_static \
+ lt_prog_compiler_no_builtin_flag \
+ export_dynamic_flag_spec \
+ thread_safe_flag_spec \
+ whole_archive_flag_spec \
+ enable_shared_with_static_runtimes \
+ old_archive_cmds \
+ old_archive_from_new_cmds \
+ predep_objects \
+ postdep_objects \
+ predeps \
+ postdeps \
+ compiler_lib_search_path \
+ archive_cmds \
+ archive_expsym_cmds \
+ postinstall_cmds \
+ postuninstall_cmds \
+ old_archive_from_expsyms_cmds \
+ allow_undefined_flag \
+ no_undefined_flag \
+ export_symbols_cmds \
+ hardcode_libdir_flag_spec \
+ hardcode_libdir_flag_spec_ld \
+ hardcode_libdir_separator \
+ hardcode_automatic \
+ module_cmds \
+ module_expsym_cmds \
+ lt_cv_prog_compiler_c_o \
+ exclude_expsyms \
+ include_expsyms; do
+
+ case $var in
+ old_archive_cmds | \
+ old_archive_from_new_cmds | \
+ archive_cmds | \
+ archive_expsym_cmds | \
+ module_cmds | \
+ module_expsym_cmds | \
+ old_archive_from_expsyms_cmds | \
+ export_symbols_cmds | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ { echo "$as_me:$LINENO: creating $ofile" >&5
+echo "$as_me: creating $ofile" >&6;}
+
+ cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\`
+gcc_ver=\`gcc -dumpversion\`
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=\`echo $lt_predep_objects | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=\`echo $lt_postdep_objects | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+
+# Check whether --with-tags or --without-tags was given.
+if test "${with_tags+set}" = set; then
+ withval="$with_tags"
+ tagnames="$withval"
+fi;
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+ else
+ { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+ "") ;;
+ *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+echo "$as_me: error: invalid tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+ $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+ $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+compiler_CXX=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+else
+ lt_prog_compiler_no_builtin_flag_CXX=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi;
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+ grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_CXX=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+ld_shlibs_CXX=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_CXX=''
+ hardcode_direct_CXX=yes
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct_CXX=yes
+ else
+ # We have old collect2
+ hardcode_direct_CXX=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_CXX=yes
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ hardcode_libdir_separator_CXX=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_CXX=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_CXX='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_CXX="-z nodefs"
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_CXX=' ${wl}-bernotok'
+ allow_undefined_flag_CXX=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ archive_cmds_need_lc_CXX=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_CXX=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ allow_undefined_flag_CXX=unsupported
+ always_export_symbols_CXX=no
+ enable_shared_with_static_runtimes_CXX=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ whole_archive_flag_spec_CXX=''
+ link_all_deplibs_CXX=yes
+
+ if test "$GXX" = yes ; then
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ freebsd[12]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ ld_shlibs_CXX=no
+ ;;
+ freebsd-elf*)
+ archive_cmds_need_lc_CXX=no
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
+ ;;
+ *)
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ ;;
+ *)
+ hardcode_direct_CXX=yes
+ hardcode_minus_L_CXX=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ interix3*)
+ hardcode_direct_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ link_all_deplibs_CXX=yes
+ ;;
+ esac
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc*)
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+ whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ ld_shlibs_CXX=no
+ ;;
+ openbsd*)
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+ export_dynamic_flag_spec_CXX='${wl}-E'
+ whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd='echo'
+ ;;
+ osf3*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ allow_undefined_flag_CXX=' -expect_unresolved \*'
+ archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+ $rm $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_CXX=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ archive_cmds_need_lc_CXX=yes
+ no_undefined_flag_CXX=' -zdefs'
+ archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ hardcode_libdir_flag_spec_CXX='-R$libdir'
+ hardcode_shlibpath_var_CXX=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker. We must also pass each convience library through
+ # to the system linker between allextract/defaultextract.
+ # The C++ compiler will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='echo'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+ fi
+ ;;
+ esac
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ no_undefined_flag_CXX='${wl}-z,text'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ no_undefined_flag_CXX='${wl}-z,text'
+ allow_undefined_flag_CXX='${wl}-z,nodefs'
+ archive_cmds_need_lc_CXX=no
+ hardcode_shlibpath_var_CXX=no
+ hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+ export_dynamic_flag_spec_CXX='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+GCC_CXX="$GXX"
+LD_CXX="$LD"
+
+
+cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" \
+ || test $p = "-R"; then
+ prev=$p
+ continue
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p in
+ -L* | -R*)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$compiler_lib_search_path_CXX"; then
+ compiler_lib_search_path_CXX="${prev}${p}"
+ else
+ compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$postdeps_CXX"; then
+ postdeps_CXX="${prev}${p}"
+ else
+ postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$predep_objects_CXX"; then
+ predep_objects_CXX="$p"
+ else
+ predep_objects_CXX="$predep_objects_CXX $p"
+ fi
+ else
+ if test -z "$postdep_objects_CXX"; then
+ postdep_objects_CXX="$p"
+ else
+ postdep_objects_CXX="$postdep_objects_CXX $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$rm -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix3*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ predep_objects_CXX=
+ postdep_objects_CXX=
+ postdeps_CXX=
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # Adding this requires a known-good setup of shared libraries for
+ # Sun compiler versions before 5.6, else PIC objects from an old
+ # archive will be linked into the output, leading to subtle bugs.
+ postdeps_CXX='-lCstd -lCrun'
+ ;;
+ esac
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+
+lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_CXX='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ lt_prog_compiler_pic_CXX=
+ ;;
+ interix3*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_CXX=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_CXX='-Bstatic'
+ else
+ lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_CXX='-qnocommon'
+ lt_prog_compiler_wl_CXX='-Wl,'
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ lt_prog_compiler_pic_CXX='+Z'
+ fi
+ ;;
+ aCC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_static_CXX='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler.
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-fpic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_static_CXX='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ lt_prog_compiler_wl_CXX='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ lt_prog_compiler_pic_CXX='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ lt_prog_compiler_pic_CXX='-pic'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ lt_prog_compiler_pic_CXX='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-Bstatic'
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:11535: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:11539: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6
+
+if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then
+ case $lt_prog_compiler_pic_CXX in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+ esac
+else
+ lt_prog_compiler_pic_CXX=
+ lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_CXX=
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_CXX=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6
+
+if test x"$lt_prog_compiler_static_works_CXX" = xyes; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:11639: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:11643: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_CXX=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ export_symbols_cmds_CXX="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_CXX=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_CXX in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_CXX
+ pic_flag=$lt_prog_compiler_pic_CXX
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+ allow_undefined_flag_CXX=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_CXX=no
+ else
+ archive_cmds_need_lc_CXX=yes
+ fi
+ allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix3*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '#line 12175 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" || \
+ test -n "$runpath_var_CXX" || \
+ test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_CXX" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+ test "$hardcode_minus_L_CXX" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_CXX=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_CXX=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_CXX=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6
+
+if test "$hardcode_action_CXX" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_CXX \
+ CC_CXX \
+ LD_CXX \
+ lt_prog_compiler_wl_CXX \
+ lt_prog_compiler_pic_CXX \
+ lt_prog_compiler_static_CXX \
+ lt_prog_compiler_no_builtin_flag_CXX \
+ export_dynamic_flag_spec_CXX \
+ thread_safe_flag_spec_CXX \
+ whole_archive_flag_spec_CXX \
+ enable_shared_with_static_runtimes_CXX \
+ old_archive_cmds_CXX \
+ old_archive_from_new_cmds_CXX \
+ predep_objects_CXX \
+ postdep_objects_CXX \
+ predeps_CXX \
+ postdeps_CXX \
+ compiler_lib_search_path_CXX \
+ archive_cmds_CXX \
+ archive_expsym_cmds_CXX \
+ postinstall_cmds_CXX \
+ postuninstall_cmds_CXX \
+ old_archive_from_expsyms_cmds_CXX \
+ allow_undefined_flag_CXX \
+ no_undefined_flag_CXX \
+ export_symbols_cmds_CXX \
+ hardcode_libdir_flag_spec_CXX \
+ hardcode_libdir_flag_spec_ld_CXX \
+ hardcode_libdir_separator_CXX \
+ hardcode_automatic_CXX \
+ module_cmds_CXX \
+ module_expsym_cmds_CXX \
+ lt_cv_prog_compiler_c_o_CXX \
+ exclude_expsyms_CXX \
+ include_expsyms_CXX; do
+
+ case $var in
+ old_archive_cmds_CXX | \
+ old_archive_from_new_cmds_CXX | \
+ archive_cmds_CXX | \
+ archive_expsym_cmds_CXX | \
+ module_cmds_CXX | \
+ module_expsym_cmds_CXX | \
+ old_archive_from_expsyms_cmds_CXX | \
+ export_symbols_cmds_CXX | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_CXX
+
+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\`
+gcc_ver=\`gcc -dumpversion\`
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_CXX
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=\`echo $lt_predep_objects_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=\`echo $lt_postdep_objects_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_CXX | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_CXX"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_flag_spec_ld_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+compiler_F77=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+GCC_F77="$G77"
+LD_F77="$LD"
+
+lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_static_F77='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_F77='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_F77='-fno-common'
+ ;;
+
+ interix3*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared_F77=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_F77=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_F77='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_F77='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_F77='-Bstatic'
+ else
+ lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_F77='-qnocommon'
+ lt_prog_compiler_wl_F77='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_F77='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-fpic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl_F77='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl_F77='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_F77='-Qoption ld '
+ lt_prog_compiler_pic_F77='-PIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_F77='-Kconform_pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_F77='-pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_F77=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_F77"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:13233: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:13237: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_F77=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6
+
+if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
+ case $lt_prog_compiler_pic_F77 in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+ esac
+else
+ lt_prog_compiler_pic_F77=
+ lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_F77=
+ ;;
+ *)
+ lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_F77=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_F77=yes
+ fi
+ else
+ lt_prog_compiler_static_works_F77=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6
+
+if test x"$lt_prog_compiler_static_works_F77" = xyes; then
+ :
+else
+ lt_prog_compiler_static_F77=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_F77=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:13337: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:13341: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_F77=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag_F77=
+ enable_shared_with_static_runtimes_F77=no
+ archive_cmds_F77=
+ archive_expsym_cmds_F77=
+ old_archive_From_new_cmds_F77=
+ old_archive_from_expsyms_cmds_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ thread_safe_flag_spec_F77=
+ hardcode_libdir_flag_spec_F77=
+ hardcode_libdir_flag_spec_ld_F77=
+ hardcode_libdir_separator_F77=
+ hardcode_direct_F77=no
+ hardcode_minus_L_F77=no
+ hardcode_shlibpath_var_F77=unsupported
+ link_all_deplibs_F77=unknown
+ hardcode_automatic_F77=no
+ module_cmds_F77=
+ module_expsym_cmds_F77=
+ always_export_symbols_F77=no
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_F77=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs_F77=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_F77='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_F77=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_F77=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs_F77=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_F77=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=no
+ enable_shared_with_static_runtimes_F77=yes
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ interix3*)
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs_F77=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs_F77=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_F77" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=yes
+ archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L_F77=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct_F77=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_F77=''
+ hardcode_direct_F77=yes
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct_F77=yes
+ else
+ # We have old collect2
+ hardcode_direct_F77=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_F77=yes
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_libdir_separator_F77=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_F77=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_F77='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_F77="-z nodefs"
+ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_F77=' ${wl}-bernotok'
+ allow_undefined_flag_F77=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_F77='$convenience'
+ archive_cmds_need_lc_F77=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_F77=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec_F77=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_F77=' '
+ allow_undefined_flag_F77=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_F77='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_F77=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_F77=no
+ hardcode_direct_F77=no
+ hardcode_automatic_F77=yes
+ hardcode_shlibpath_var_F77=unsupported
+ whole_archive_flag_spec_F77=''
+ link_all_deplibs_F77=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_F77=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_direct_F77=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_F77='+b $libdir'
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ ;;
+ *)
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ link_all_deplibs_F77=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ newsos6)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ openbsd*)
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ allow_undefined_flag_F77=unsupported
+ archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ solaris*)
+ no_undefined_flag_F77=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_shlibpath_var_F77=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ link_all_deplibs_F77=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_F77='$CC -r -o $output$reload_objs'
+ hardcode_direct_F77=no
+ ;;
+ motorola)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ export_dynamic_flag_spec_F77='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_F77=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ no_undefined_flag_F77='${wl}-z,text'
+ archive_cmds_need_lc_F77=no
+ hardcode_shlibpath_var_F77=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_F77='${wl}-z,text'
+ allow_undefined_flag_F77='${wl}-z,nodefs'
+ archive_cmds_need_lc_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
+echo "${ECHO_T}$ld_shlibs_F77" >&6
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_F77=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_F77 in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_F77
+ pic_flag=$lt_prog_compiler_pic_F77
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+ allow_undefined_flag_F77=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_F77=no
+ else
+ archive_cmds_need_lc_F77=yes
+ fi
+ allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix3*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '#line 14786 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" || \
+ test -n "$runpath_var_F77" || \
+ test "X$hardcode_automatic_F77" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_F77" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+ test "$hardcode_minus_L_F77" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_F77=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_F77=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_F77=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
+echo "${ECHO_T}$hardcode_action_F77" >&6
+
+if test "$hardcode_action_F77" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_F77 \
+ CC_F77 \
+ LD_F77 \
+ lt_prog_compiler_wl_F77 \
+ lt_prog_compiler_pic_F77 \
+ lt_prog_compiler_static_F77 \
+ lt_prog_compiler_no_builtin_flag_F77 \
+ export_dynamic_flag_spec_F77 \
+ thread_safe_flag_spec_F77 \
+ whole_archive_flag_spec_F77 \
+ enable_shared_with_static_runtimes_F77 \
+ old_archive_cmds_F77 \
+ old_archive_from_new_cmds_F77 \
+ predep_objects_F77 \
+ postdep_objects_F77 \
+ predeps_F77 \
+ postdeps_F77 \
+ compiler_lib_search_path_F77 \
+ archive_cmds_F77 \
+ archive_expsym_cmds_F77 \
+ postinstall_cmds_F77 \
+ postuninstall_cmds_F77 \
+ old_archive_from_expsyms_cmds_F77 \
+ allow_undefined_flag_F77 \
+ no_undefined_flag_F77 \
+ export_symbols_cmds_F77 \
+ hardcode_libdir_flag_spec_F77 \
+ hardcode_libdir_flag_spec_ld_F77 \
+ hardcode_libdir_separator_F77 \
+ hardcode_automatic_F77 \
+ module_cmds_F77 \
+ module_expsym_cmds_F77 \
+ lt_cv_prog_compiler_c_o_F77 \
+ exclude_expsyms_F77 \
+ include_expsyms_F77; do
+
+ case $var in
+ old_archive_cmds_F77 | \
+ old_archive_from_new_cmds_F77 | \
+ archive_cmds_F77 | \
+ archive_expsym_cmds_F77 | \
+ module_cmds_F77 | \
+ module_expsym_cmds_F77 | \
+ old_archive_from_expsyms_cmds_F77 | \
+ export_symbols_cmds_F77 | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_F77
+
+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\`
+gcc_ver=\`gcc -dumpversion\`
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_F77
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=\`echo $lt_predep_objects_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=\`echo $lt_postdep_objects_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_F77 | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_F77"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+
+
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+objext_GCJ=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+compiler_GCJ=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+archive_cmds_need_lc_GCJ=no
+
+old_archive_cmds_GCJ=$old_archive_cmds
+
+
+lt_prog_compiler_no_builtin_flag_GCJ=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="-fno-rtti -fno-exceptions"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:15564: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:15568: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_rtti_exceptions=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl_GCJ=
+lt_prog_compiler_pic_GCJ=
+lt_prog_compiler_static_GCJ=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_static_GCJ='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_GCJ='-fno-common'
+ ;;
+
+ interix3*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ lt_prog_compiler_can_build_shared_GCJ=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_GCJ=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_GCJ='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ else
+ lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_GCJ='-qnocommon'
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-fpic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl_GCJ='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld '
+ lt_prog_compiler_pic_GCJ='-PIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_GCJ='-Kconform_pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_GCJ='-pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_GCJ"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_GCJ=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:15832: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:15836: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_GCJ=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
+ case $lt_prog_compiler_pic_GCJ in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
+ esac
+else
+ lt_prog_compiler_pic_GCJ=
+ lt_prog_compiler_can_build_shared_GCJ=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_GCJ=
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_GCJ=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_GCJ=yes
+ fi
+ else
+ lt_prog_compiler_static_works_GCJ=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then
+ :
+else
+ lt_prog_compiler_static_GCJ=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_GCJ=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:15936: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:15940: \$? = $ac_status" >&5
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ lt_cv_prog_compiler_c_o_GCJ=yes
+ fi
+ fi
+ chmod u+w . 2>&5
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag_GCJ=
+ enable_shared_with_static_runtimes_GCJ=no
+ archive_cmds_GCJ=
+ archive_expsym_cmds_GCJ=
+ old_archive_From_new_cmds_GCJ=
+ old_archive_from_expsyms_cmds_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ thread_safe_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_ld_GCJ=
+ hardcode_libdir_separator_GCJ=
+ hardcode_direct_GCJ=no
+ hardcode_minus_L_GCJ=no
+ hardcode_shlibpath_var_GCJ=unsupported
+ link_all_deplibs_GCJ=unknown
+ hardcode_automatic_GCJ=no
+ module_cmds_GCJ=
+ module_expsym_cmds_GCJ=
+ always_export_symbols_GCJ=no
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_GCJ=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ ld_shlibs_GCJ=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_GCJ=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_GCJ=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ ld_shlibs_GCJ=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_GCJ=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=no
+ enable_shared_with_static_runtimes_GCJ=yes
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ interix3*)
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs_GCJ=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs_GCJ=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_GCJ" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=yes
+ archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L_GCJ=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct_GCJ=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ archive_cmds_GCJ=''
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ hardcode_direct_GCJ=yes
+ else
+ # We have old collect2
+ hardcode_direct_GCJ=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ hardcode_minus_L_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_libdir_separator_GCJ=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ always_export_symbols_GCJ=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ allow_undefined_flag_GCJ='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_GCJ="-z nodefs"
+ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ no_undefined_flag_GCJ=' ${wl}-bernotok'
+ allow_undefined_flag_GCJ=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_GCJ='$convenience'
+ archive_cmds_need_lc_GCJ=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_GCJ=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec_GCJ=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec_GCJ=' '
+ allow_undefined_flag_GCJ=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_GCJ='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_GCJ=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_GCJ=no
+ hardcode_direct_GCJ=no
+ hardcode_automatic_GCJ=yes
+ hardcode_shlibpath_var_GCJ=unsupported
+ whole_archive_flag_spec_GCJ=''
+ link_all_deplibs_GCJ=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_GCJ=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_direct_GCJ=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+ *)
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ link_all_deplibs_GCJ=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ newsos6)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ openbsd*)
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ allow_undefined_flag_GCJ=unsupported
+ archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ solaris*)
+ no_undefined_flag_GCJ=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ link_all_deplibs_GCJ=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_GCJ='$CC -r -o $output$reload_objs'
+ hardcode_direct_GCJ=no
+ ;;
+ motorola)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ export_dynamic_flag_spec_GCJ='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_GCJ=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ no_undefined_flag_GCJ='${wl}-z,text'
+ archive_cmds_need_lc_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ no_undefined_flag_GCJ='${wl}-z,text'
+ allow_undefined_flag_GCJ='${wl}-z,nodefs'
+ archive_cmds_need_lc_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
+echo "${ECHO_T}$ld_shlibs_GCJ" >&6
+test "$ld_shlibs_GCJ" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_GCJ" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_GCJ=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_GCJ in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_GCJ
+ pic_flag=$lt_prog_compiler_pic_GCJ
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
+ allow_undefined_flag_GCJ=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_GCJ=no
+ else
+ archive_cmds_need_lc_GCJ=yes
+ fi
+ allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[01] | aix4.[01].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[123]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix3*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # find out which ABI we are using
+ libsuff=
+ case "$host_cpu" in
+ x86_64*|s390x*|powerpc64*)
+ echo '#line 17405 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *64-bit*)
+ libsuff=64
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+ esac
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[89] | openbsd2.[89].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$dynamic_linker" >&6
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_GCJ=
+if test -n "$hardcode_libdir_flag_spec_GCJ" || \
+ test -n "$runpath_var_GCJ" || \
+ test "X$hardcode_automatic_GCJ" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_GCJ" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
+ test "$hardcode_minus_L_GCJ" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_GCJ=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_GCJ=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_GCJ=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
+echo "${ECHO_T}$hardcode_action_GCJ" >&6
+
+if test "$hardcode_action_GCJ" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_GCJ \
+ CC_GCJ \
+ LD_GCJ \
+ lt_prog_compiler_wl_GCJ \
+ lt_prog_compiler_pic_GCJ \
+ lt_prog_compiler_static_GCJ \
+ lt_prog_compiler_no_builtin_flag_GCJ \
+ export_dynamic_flag_spec_GCJ \
+ thread_safe_flag_spec_GCJ \
+ whole_archive_flag_spec_GCJ \
+ enable_shared_with_static_runtimes_GCJ \
+ old_archive_cmds_GCJ \
+ old_archive_from_new_cmds_GCJ \
+ predep_objects_GCJ \
+ postdep_objects_GCJ \
+ predeps_GCJ \
+ postdeps_GCJ \
+ compiler_lib_search_path_GCJ \
+ archive_cmds_GCJ \
+ archive_expsym_cmds_GCJ \
+ postinstall_cmds_GCJ \
+ postuninstall_cmds_GCJ \
+ old_archive_from_expsyms_cmds_GCJ \
+ allow_undefined_flag_GCJ \
+ no_undefined_flag_GCJ \
+ export_symbols_cmds_GCJ \
+ hardcode_libdir_flag_spec_GCJ \
+ hardcode_libdir_flag_spec_ld_GCJ \
+ hardcode_libdir_separator_GCJ \
+ hardcode_automatic_GCJ \
+ module_cmds_GCJ \
+ module_expsym_cmds_GCJ \
+ lt_cv_prog_compiler_c_o_GCJ \
+ exclude_expsyms_GCJ \
+ include_expsyms_GCJ; do
+
+ case $var in
+ old_archive_cmds_GCJ | \
+ old_archive_from_new_cmds_GCJ | \
+ archive_cmds_GCJ | \
+ archive_expsym_cmds_GCJ | \
+ module_cmds_GCJ | \
+ module_expsym_cmds_GCJ | \
+ old_archive_from_expsyms_cmds_GCJ | \
+ export_symbols_cmds_GCJ | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_GCJ
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_GCJ
+
+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\`
+gcc_ver=\`gcc -dumpversion\`
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_GCJ
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_GCJ
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_GCJ
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_GCJ
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_GCJ
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_GCJ
+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_GCJ
+module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=\`echo $lt_predep_objects_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=\`echo $lt_postdep_objects_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_GCJ
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_GCJ | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_GCJ
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_GCJ
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_GCJ
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_GCJ
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_GCJ
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_GCJ
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_GCJ"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_GCJ
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_GCJ
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_GCJ
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+
+ac_outfile=conftest.$ac_objext
+printf "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$CC
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_RC \
+ CC_RC \
+ LD_RC \
+ lt_prog_compiler_wl_RC \
+ lt_prog_compiler_pic_RC \
+ lt_prog_compiler_static_RC \
+ lt_prog_compiler_no_builtin_flag_RC \
+ export_dynamic_flag_spec_RC \
+ thread_safe_flag_spec_RC \
+ whole_archive_flag_spec_RC \
+ enable_shared_with_static_runtimes_RC \
+ old_archive_cmds_RC \
+ old_archive_from_new_cmds_RC \
+ predep_objects_RC \
+ postdep_objects_RC \
+ predeps_RC \
+ postdeps_RC \
+ compiler_lib_search_path_RC \
+ archive_cmds_RC \
+ archive_expsym_cmds_RC \
+ postinstall_cmds_RC \
+ postuninstall_cmds_RC \
+ old_archive_from_expsyms_cmds_RC \
+ allow_undefined_flag_RC \
+ no_undefined_flag_RC \
+ export_symbols_cmds_RC \
+ hardcode_libdir_flag_spec_RC \
+ hardcode_libdir_flag_spec_ld_RC \
+ hardcode_libdir_separator_RC \
+ hardcode_automatic_RC \
+ module_cmds_RC \
+ module_expsym_cmds_RC \
+ lt_cv_prog_compiler_c_o_RC \
+ exclude_expsyms_RC \
+ include_expsyms_RC; do
+
+ case $var in
+ old_archive_cmds_RC | \
+ old_archive_from_new_cmds_RC | \
+ archive_cmds_RC | \
+ archive_expsym_cmds_RC | \
+ module_cmds_RC | \
+ module_expsym_cmds_RC | \
+ old_archive_from_expsyms_cmds_RC | \
+ export_symbols_cmds_RC | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+gcc_dir=\`gcc -print-file-name=. | $SED 's,/\.$,,'\`
+gcc_ver=\`gcc -dumpversion\`
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=\`echo $lt_predep_objects_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=\`echo $lt_postdep_objects_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=\`echo $lt_compiler_lib_search_path_RC | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$hardcode_automatic_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=\`echo $lt_sys_lib_search_path_spec | \$SED -e "s@\${gcc_dir}@\\\${gcc_dir}@g;s@\${gcc_ver}@\\\${gcc_ver}@g"\`
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_RC"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+ ;;
+
+ *)
+ { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Checks for libraries.
+
+# Checks for header files.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in fcntl.h float.h inttypes.h limits.h locale.h memory.h stdint.h stdlib.h string.h sys/ioctl.h sys/statvfs.h sys/time.h sys/vfs.h termios.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ---------------------------------------- ##
+## Report this to thomas.hirsch@statkart.no ##
+## ---------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5
+echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6
+if test "${ac_cv_header_stdbool_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <stdbool.h>
+#ifndef bool
+# error bool is not defined
+#endif
+#ifndef false
+# error false is not defined
+#endif
+#if false
+# error false is not 0
+#endif
+#ifndef true
+# error true is not defined
+#endif
+#if true != 1
+# error true is not 1
+#endif
+#ifndef __bool_true_false_are_defined
+# error __bool_true_false_are_defined is not defined
+#endif
+
+ struct s { _Bool s: 1; _Bool t; } s;
+
+ char a[true == 1 ? 1 : -1];
+ char b[false == 0 ? 1 : -1];
+ char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+ char d[(bool) -0.5 == true ? 1 : -1];
+ bool e = &s;
+ char f[(_Bool) -0.0 == false ? 1 : -1];
+ char g[true];
+ char h[sizeof (_Bool)];
+ char i[sizeof s.t];
+
+int
+main ()
+{
+ return !a + !b + !c + !d + !e + !f + !g + !h + !i;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdbool_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdbool_h=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5
+echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6
+echo "$as_me:$LINENO: checking for _Bool" >&5
+echo $ECHO_N "checking for _Bool... $ECHO_C" >&6
+if test "${ac_cv_type__Bool+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((_Bool *) 0)
+ return 0;
+if (sizeof (_Bool))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type__Bool=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type__Bool=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5
+echo "${ECHO_T}$ac_cv_type__Bool" >&6
+if test $ac_cv_type__Bool = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE__BOOL 1
+_ACEOF
+
+
+fi
+
+if test $ac_cv_header_stdbool_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STDBOOL_H 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for mode_t" >&5
+echo $ECHO_N "checking for mode_t... $ECHO_C" >&6
+if test "${ac_cv_type_mode_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((mode_t *) 0)
+ return 0;
+if (sizeof (mode_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_mode_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_mode_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5
+echo "${ECHO_T}$ac_cv_type_mode_t" >&6
+if test $ac_cv_type_mode_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define mode_t int
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_size_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned
+_ACEOF
+
+fi
+
+
+# Checks for library functions.
+
+for ac_header in stdlib.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ---------------------------------------- ##
+## Report this to thomas.hirsch@statkart.no ##
+## ---------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5
+echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6
+if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_malloc_0_nonnull=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if STDC_HEADERS || HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+char *malloc ();
+#endif
+
+int
+main ()
+{
+exit (malloc (0) ? 0 : 1);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_malloc_0_nonnull=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_malloc_0_nonnull=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5
+echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6
+if test $ac_cv_func_malloc_0_nonnull = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MALLOC 1
+_ACEOF
+
+else
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_MALLOC 0
+_ACEOF
+
+ case $LIBOBJS in
+ "malloc.$ac_objext" | \
+ *" malloc.$ac_objext" | \
+ "malloc.$ac_objext "* | \
+ *" malloc.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;;
+esac
+
+
+cat >>confdefs.h <<\_ACEOF
+#define malloc rpl_malloc
+_ACEOF
+
+fi
+
+
+
+
+for ac_header in stdlib.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ---------------------------------------- ##
+## Report this to thomas.hirsch@statkart.no ##
+## ---------------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+echo "$as_me:$LINENO: checking for GNU libc compatible realloc" >&5
+echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6
+if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_realloc_0_nonnull=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#if STDC_HEADERS || HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+char *realloc ();
+#endif
+
+int
+main ()
+{
+exit (realloc (0, 0) ? 0 : 1);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_realloc_0_nonnull=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_realloc_0_nonnull=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_realloc_0_nonnull" >&5
+echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6
+if test $ac_cv_func_realloc_0_nonnull = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_REALLOC 1
+_ACEOF
+
+else
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_REALLOC 0
+_ACEOF
+
+ case $LIBOBJS in
+ "realloc.$ac_objext" | \
+ *" realloc.$ac_objext" | \
+ "realloc.$ac_objext "* | \
+ *" realloc.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;;
+esac
+
+
+cat >>confdefs.h <<\_ACEOF
+#define realloc rpl_realloc
+_ACEOF
+
+fi
+
+
+
+echo "$as_me:$LINENO: checking for working strcoll" >&5
+echo $ECHO_N "checking for working strcoll... $ECHO_C" >&6
+if test "${ac_cv_func_strcoll_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_strcoll_works=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+exit (strcoll ("abc", "def") >= 0 ||
+ strcoll ("ABC", "DEF") >= 0 ||
+ strcoll ("123", "456") >= 0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_strcoll_works=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_strcoll_works=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_strcoll_works" >&5
+echo "${ECHO_T}$ac_cv_func_strcoll_works" >&6
+if test $ac_cv_func_strcoll_works = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRCOLL 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for working strtod" >&5
+echo $ECHO_N "checking for working strtod... $ECHO_C" >&6
+if test "${ac_cv_func_strtod+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_strtod=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+double strtod ();
+int
+main()
+{
+ {
+ /* Some versions of Linux strtod mis-parse strings with leading '+'. */
+ char *string = " +69";
+ char *term;
+ double value;
+ value = strtod (string, &term);
+ if (value != 69 || term != (string + 4))
+ exit (1);
+ }
+
+ {
+ /* Under Solaris 2.4, strtod returns the wrong value for the
+ terminating character under some conditions. */
+ char *string = "NaN";
+ char *term;
+ strtod (string, &term);
+ if (term != string && *(term - 1) == 0)
+ exit (1);
+ }
+ exit (0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_strtod=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_strtod=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_strtod" >&5
+echo "${ECHO_T}$ac_cv_func_strtod" >&6
+if test $ac_cv_func_strtod = no; then
+ case $LIBOBJS in
+ "strtod.$ac_objext" | \
+ *" strtod.$ac_objext" | \
+ "strtod.$ac_objext "* | \
+ *" strtod.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS strtod.$ac_objext" ;;
+esac
+
+echo "$as_me:$LINENO: checking for pow" >&5
+echo $ECHO_N "checking for pow... $ECHO_C" >&6
+if test "${ac_cv_func_pow+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define pow to an innocuous variant, in case <limits.h> declares pow.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define pow innocuous_pow
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char pow (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef pow
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pow ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_pow) || defined (__stub___pow)
+choke me
+#else
+char (*f) () = pow;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != pow;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_pow=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_pow=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_pow" >&5
+echo "${ECHO_T}$ac_cv_func_pow" >&6
+
+if test $ac_cv_func_pow = no; then
+ echo "$as_me:$LINENO: checking for pow in -lm" >&5
+echo $ECHO_N "checking for pow in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_pow+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pow ();
+int
+main ()
+{
+pow ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_pow=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_pow=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_pow" >&5
+echo "${ECHO_T}$ac_cv_lib_m_pow" >&6
+if test $ac_cv_lib_m_pow = yes; then
+ POW_LIB=-lm
+else
+ { echo "$as_me:$LINENO: WARNING: cannot find library containing definition of pow" >&5
+echo "$as_me: WARNING: cannot find library containing definition of pow" >&2;}
+fi
+
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_func in floor getcwd memmove memset mkdir modf pow rmdir sqrt strchr strerror strpbrk strstr strtol strtoul
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by fyba $as_me 4.1.0, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+fyba config.status 4.1.0
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+ ac_config_files="$ac_config_files Makefile src/GM/Makefile src/UT/Makefile src/FYBA/Makefile doc/Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by fyba $as_me 4.1.0, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+fyba config.status 4.1.0
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "src/GM/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/GM/Makefile" ;;
+ "src/UT/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/UT/Makefile" ;;
+ "src/FYBA/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/FYBA/Makefile" ;;
+ "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CYGPATH_W@,$CYGPATH_W,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@ACLOCAL@,$ACLOCAL,;t t
+s,@AUTOCONF@,$AUTOCONF,;t t
+s,@AUTOMAKE@,$AUTOMAKE,;t t
+s,@AUTOHEADER@,$AUTOHEADER,;t t
+s,@MAKEINFO@,$MAKEINFO,;t t
+s,@install_sh@,$install_sh,;t t
+s,@STRIP@,$STRIP,;t t
+s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s,@mkdir_p@,$mkdir_p,;t t
+s,@AWK@,$AWK,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@AMTAR@,$AMTAR,;t t
+s,@am__tar@,$am__tar,;t t
+s,@am__untar@,$am__untar,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@am__include@,$am__include,;t t
+s,@am__quote@,$am__quote,;t t
+s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
+s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s,@CPP@,$CPP,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@SED@,$SED,;t t
+s,@EGREP@,$EGREP,;t t
+s,@LN_S@,$LN_S,;t t
+s,@ECHO@,$ECHO,;t t
+s,@AR@,$AR,;t t
+s,@ac_ct_AR@,$ac_ct_AR,;t t
+s,@RANLIB@,$RANLIB,;t t
+s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s,@CXXCPP@,$CXXCPP,;t t
+s,@F77@,$F77,;t t
+s,@FFLAGS@,$FFLAGS,;t t
+s,@ac_ct_F77@,$ac_ct_F77,;t t
+s,@LIBTOOL@,$LIBTOOL,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@POW_LIB@,$POW_LIB,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..ac27e83
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,36 @@
+# -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_PREREQ([2.59])
+AC_INIT(fyba, 4.1.1, thomas.hirsch@statkart.no)
+AM_INIT_AUTOMAKE(fyba, 4.1.1)
+LT_INIT()
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_SRCDIR([include/fygm.h])
+AC_CONFIG_HEADERS([config.h])
+
+# Checks for programs.
+AC_PROG_CXX
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_LIBTOOL
+
+# Checks for libraries.
+
+# Checks for header files.
+AC_CHECK_HEADERS([fcntl.h float.h inttypes.h limits.h locale.h memory.h stdint.h stdlib.h string.h sys/ioctl.h sys/statvfs.h sys/time.h sys/vfs.h termios.h unistd.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_HEADER_STDBOOL
+AC_TYPE_MODE_T
+AC_TYPE_SIZE_T
+
+# Checks for library functions.
+AC_FUNC_MALLOC
+AC_FUNC_REALLOC
+AC_FUNC_STRCOLL
+AC_FUNC_STRTOD
+AC_CHECK_FUNCS([floor getcwd memmove memset mkdir modf pow rmdir sqrt strchr strerror strpbrk strstr strtol strtoul])
+
+AC_OUTPUT
+AC_OUTPUT(fyba.pc Makefile src/GM/Makefile src/UT/Makefile src/FYBA/Makefile doc/Makefile)
diff --git a/changelog b/debian/changelog
index 4b87cc7..4b87cc7 100644
--- a/changelog
+++ b/debian/changelog
diff --git a/compat b/debian/compat
index ec63514..ec63514 100644
--- a/compat
+++ b/debian/compat
diff --git a/control b/debian/control
index d1c192b..d1c192b 100644
--- a/control
+++ b/debian/control
diff --git a/copyright b/debian/copyright
index 9cd76a0..9cd76a0 100644
--- a/copyright
+++ b/debian/copyright
diff --git a/gbp.conf b/debian/gbp.conf
index cdeff4c..cdeff4c 100644
--- a/gbp.conf
+++ b/debian/gbp.conf
diff --git a/libfyba-dev.doc-base b/debian/libfyba-dev.doc-base
index 79abd50..79abd50 100644
--- a/libfyba-dev.doc-base
+++ b/debian/libfyba-dev.doc-base
diff --git a/libfyba-dev.docs b/debian/libfyba-dev.docs
index fb0cb8d..fb0cb8d 100644
--- a/libfyba-dev.docs
+++ b/debian/libfyba-dev.docs
diff --git a/libfyba-dev.install b/debian/libfyba-dev.install
index 76f28fa..76f28fa 100644
--- a/libfyba-dev.install
+++ b/debian/libfyba-dev.install
diff --git a/libfyba0.docs b/debian/libfyba0.docs
index e845566..e845566 100644
--- a/libfyba0.docs
+++ b/debian/libfyba0.docs
diff --git a/libfyba0.install b/debian/libfyba0.install
index 3ddde58..3ddde58 100644
--- a/libfyba0.install
+++ b/debian/libfyba0.install
diff --git a/libfyba0.lintian-overrides b/debian/libfyba0.lintian-overrides
index 4f024df..4f024df 100644
--- a/libfyba0.lintian-overrides
+++ b/debian/libfyba0.lintian-overrides
diff --git a/patches/01_noexit_in_library.patch b/debian/patches/01_noexit_in_library.patch
index 39a35ab..39a35ab 100644
--- a/patches/01_noexit_in_library.patch
+++ b/debian/patches/01_noexit_in_library.patch
diff --git a/patches/02_fix_linking.patch b/debian/patches/02_fix_linking.patch
index eadb262..eadb262 100644
--- a/patches/02_fix_linking.patch
+++ b/debian/patches/02_fix_linking.patch
diff --git a/patches/fix_issue.patch b/debian/patches/fix_issue.patch
index 3db44f1..3db44f1 100644
--- a/patches/fix_issue.patch
+++ b/debian/patches/fix_issue.patch
diff --git a/patches/series b/debian/patches/series
index 50f440c..50f440c 100644
--- a/patches/series
+++ b/debian/patches/series
diff --git a/rules b/debian/rules
index 4390ca9..4390ca9 100755
--- a/rules
+++ b/debian/rules
diff --git a/shlibs b/debian/shlibs
index 13fde37..13fde37 100644
--- a/shlibs
+++ b/debian/shlibs
diff --git a/source/format b/debian/source/format
index 163aaf8..163aaf8 100644
--- a/source/format
+++ b/debian/source/format
diff --git a/source/lintian-overrides b/debian/source/lintian-overrides
index d9d9775..d9d9775 100644
--- a/source/lintian-overrides
+++ b/debian/source/lintian-overrides
diff --git a/upstream/metadata b/debian/upstream/metadata
index 592edb4..592edb4 100644
--- a/upstream/metadata
+++ b/debian/upstream/metadata
diff --git a/watch b/debian/watch
index 7e2a4b1..7e2a4b1 100644
--- a/watch
+++ b/debian/watch
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..ec931a6
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,3 @@
+docdir = $(datadir)/doc/@PACKAGE@
+doc_DATA = en_EN/fyba.html en_EN/fyba1.html en_EN/fyba2.html
+
diff --git a/doc/en_EN/fyba.html b/doc/en_EN/fyba.html
new file mode 100644
index 0000000..eadab98
--- /dev/null
+++ b/doc/en_EN/fyba.html
@@ -0,0 +1,10 @@
+<HTML>
+<HEAD>
+<META http-equiv="Content-Type" CONTENT="text/htm; iso-8859-1">
+<TITLE>FYBA</TITLE>
+</HEAD>
+<frameset COLS="20%,80%">
+<frame SRC="fyba1.html" NAME="Felt1" scrolling =auto>
+<frame SRC="fyba2.html" NAME="Felt2" scrolling =auto>
+</frameset>
+</HTML>
diff --git a/doc/en_EN/fyba1.html b/doc/en_EN/fyba1.html
new file mode 100644
index 0000000..d99136f
--- /dev/null
+++ b/doc/en_EN/fyba1.html
@@ -0,0 +1,304 @@
+<HTML>
+<HEAD>
+<META http-equiv="Content-Type" CONTENT="text/htm; iso-8859-1">
+</HEAD>
+<STYLE>
+<
+BODY {background: white; color: black}
+A {font-size: 9pt; color: blue ; text-decoration: none; font-family: arial, helvetica, sans-serif;}
+PRE {font-size: 10pt; font-family: arial, helvetica, sans-serif;}
+>
+</STYLE>
+<BODY>
+<PRE><B>Content:</B>
+<P><A HREF="fyba2.html" target="Felt2"><FONT COLOR=BLACK>Top</FONT></A>
+<P><A HREF="fyba2.html#O1" target="Felt2"><FONT COLOR=BLACK><B>1 Introduction</B></FONT></A>
+<P><A HREF="fyba2.html#O2" target="Felt2"><FONT COLOR=BLACK><B>2 Overview of the Functionality of FYBA</B></FONT></A>
+<P><A HREF="fyba2.html#O3" target="Felt2"><FONT COLOR=BLACK><B>3 The Internal Working of the Index System</B></FONT></A>
+<A HREF="fyba2.html#Gruppetabell" target="Felt2">- Group table</A>
+<A HREF="fyba2.html#Brukttabell" target="Felt2">- Used table</A>
+<A HREF="fyba2.html#SOSI-buffer" target="Felt2">- SOSI buffer</A>
+<A HREF="fyba2.html#Serienummer-tabell" target="Felt2">- Serial number table</A>
+<A HREF="fyba2.html#Geografisk-søketabell" target="Felt2">- Geographical search table</A>
+<P><A HREF="fyba2.html#O4" target="Felt2"><FONT COLOR=BLACK><B>4 Naming Conventions</B></FONT></A>
+<P><A HREF="fyba2.html#O5" target="Felt2"><FONT COLOR=BLACK><B>5 Initialisation and Control</B></FONT></A>
+<A HREF="fyba2.html#LC_Init" target="Felt2">- LC_Init</A>
+<A HREF="fyba2.html#LC_InqVer" target="Felt2">- LC_InqVer</A>
+<A HREF="fyba2.html#LC_Close" target="Felt2">- LC_Close</A>
+<A HREF="fyba2.html#LC_ErInitiert" target="Felt2">- LC_ErInitiert</A>
+<A HREF="fyba2.html#LC_MaxSkriv" target="Felt2">- LC_MaxSkriv</A>
+<A HREF="fyba2.html#LC_InqMaxSkriv" target="Felt2">- LC_InqMaxSkriv</A>
+<A HREF="fyba2.html#LC_SetNgisModus" target="Felt2">- LC_SetNgisModus</A>
+<A HREF="fyba2.html#LC_SetDefLpfi" target="Felt2">- LC_SetDefLpfi</A>
+<A HREF="fyba2.html#LC_InqDefLpfi" target="Felt2">- LC_InqDefLpfi</A>
+<A HREF="fyba2.html#LC_SetUtvidModus" target="Felt2">- LC_SetUtvidModus</A>
+<A HREF="fyba2.html#LC_GetUtvidModus" target="Felt2">- LC_GetUtvidModus</A>
+<P><A HREF="fyba2.html#O6" target="Felt2"><FONT COLOR=BLACK><B>6 Opening Base and SOSI Files</B></FONT></A>
+<A HREF="fyba2.html#LC_OpenBase" target="Felt2">- LC_OpenBase</A>
+<A HREF="fyba2.html#LC_CloseBase" target="Felt2">- LC_CloseBase</A>
+<A HREF="fyba2.html#LC_SelectBase" target="Felt2">- LC_SelectBase</A>
+<A HREF="fyba2.html#LC_InqCurBase" target="Felt2">- LC_InqCurBase</A>
+<A HREF="fyba2.html#LC_OpenSos" target="Felt2">- LC_OpenSos</A>
+<A HREF="fyba2.html#LC_CloseSos" target="Felt2">- LC_CloseSos</A>
+<A HREF="fyba2.html#LC_DelIdx" target="Felt2">- LC_DelIdx</A>
+<A HREF="fyba2.html#LC_FcloseSos" target="Felt2">- LC_FcloseSos</A>
+<P><A HREF="fyba2.html#O7" target="Felt2"><FONT COLOR=BLACK><B>7 Helper Functions</B></FONT></A>
+<P><A HREF="fyba2.html#O8" target="Felt2"><FONT COLOR=GREEN><B>7.1 Base and File</B></FONT></A>
+<A HREF="fyba2.html#LC_GetBaOm" target="Felt2">- LC_GetBaOm</A>
+<A HREF="fyba2.html#LC_GetFiOm" target="Felt2">- LC_GetFiOm</A>
+<A HREF="fyba2.html#LC_GetFiNr" target="Felt2">- LC_GetFiNr</A>
+<A HREF="fyba2.html#LC_GetFiNa" target="Felt2">- LC_GetFiNa</A>
+<A HREF="fyba2.html#LC_GetTegnsett" target="Felt2">- LC_GetTegnsett</A>
+<A HREF="fyba2.html#LC_InqLag" target="Felt2">- LC_InqLag</A>
+<A HREF="fyba2.html#LC_InqFilLag" target="Felt2">- LC_InqFilLag</A>
+<A HREF="fyba2.html#LC_SetFilLag" target="Felt2">- LC_SetFilLag</A>
+<A HREF="fyba2.html#LC_FiLastGr" target="Felt2">- LC_FiLastGr</A>
+<A HREF="fyba2.html#LC_ErFilBase" target="Felt2">- LC_ErFilBase</A>
+<A HREF="fyba2.html#LC_ErKoordsysLik" target="Felt2">- LC_ErKoordsysLik</A>
+<A HREF="fyba2.html#LC_ErVertdatumLik" target="Felt2">- LC_ErVertdatumLik</A>
+<A HREF="fyba2.html#LC_Backup" target="Felt2">- LC_Backup</A>
+<A HREF="fyba2.html#LC_GetNgisLag" target="Felt2">- LC_GetNgisLag</A>
+<A HREF="fyba2.html#LC_SetFilType" target="Felt2">- LC_SetFilType</A>
+<A HREF="fyba2.html#LC_GetFilType" target="Felt2">- LC_GetFilType</A>
+<A HREF="fyba2.html#LC_ErLik_Avrundet" target="Felt2">- LC_ErLik_Avrundet</A>
+<A HREF="fyba2.html#LC_ErLik_IkkeAvrundet" target="Felt2">- LC_ErLik_IkkeAvrundet</A>
+<A HREF="fyba2.html#LC_ErReferert" target="Felt2">- LC_ErReferert</A>
+<P><A HREF="fyba2.html#O9" target="Felt2"><FONT COLOR=GREEN><B>7.2 SOSI Group</B></FONT></A>
+<A HREF="fyba2.html#LC_GetGrNr" target="Felt2">- LC_GetGrNr</A>
+<A HREF="fyba2.html#LC_GetGrPara" target="Felt2">- LC_GetGrPara</A>
+<A HREF="fyba2.html#LC_GetGrParaBgr" target="Felt2">- LC_GetGrParaBgr</A>
+<A HREF="fyba2.html#LC_GetGrFi" target="Felt2">- LC_GetGrFi</A>
+<A HREF="fyba2.html#LC_SetEndringsstatus" target="Felt2">- LC_SetEndringsstatus</A>
+<P><A HREF="fyba2.html#O10" target="Felt2"><FONT COLOR=GREEN><B>7.3 Header, active group</B></FONT></A>
+<A HREF="fyba2.html#LC_NyttHode" target="Felt2">- LC_NyttHode</A>
+<A HREF="fyba2.html#LC_TestHode" target="Felt2">- LC_TestHode</A>
+<A HREF="fyba2.html#LC_GetOmr" target="Felt2">- LC_GetOmr</A>
+<A HREF="fyba2.html#LC_PutOmr" target="Felt2">- LC_PutOmr</A>
+<A HREF="fyba2.html#LC_GetTrans" target="Felt2">- LC_GetTrans</A>
+<A HREF="fyba2.html#LC_GetTransEx" target="Felt2">- LC_GetTransEx</A>
+<A HREF="fyba2.html#LC_PutTrans" target="Felt2">- LC_PutTrans</A>
+<A HREF="fyba2.html#LC_PutTransEx" target="Felt2">- LC_PutTransEx</A>
+<P><A HREF="fyba2.html#O11" target="Felt2"><FONT COLOR=GREEN><B>7.4 Header, directly from SOSI-file</B></FONT></A>
+<A HREF="fyba2.html#HO_New" target="Felt2">- HO_New</A>
+<A HREF="fyba2.html#HO_TestSOSI" target="Felt2">- HO_TestSOSI</A>
+<A HREF="fyba2.html#HO_GetKvalitet" target="Felt2">- HO_GetKvalitet</A>
+<A HREF="fyba2.html#HO_GetTegnsett" target="Felt2">- HO_GetTegnsett</A>
+<A HREF="fyba2.html#HO_GetVal" target="Felt2">- HO_GetVal</A>
+<A HREF="fyba2.html#HO_GetTrans" target="Felt2">- HO_GetTrans</A>
+<A HREF="fyba2.html#HO_GetTransEx" target="Felt2">- HO_GetTransEx</A>
+<A HREF="fyba2.html#HO_GetOmr" target="Felt2">- HO_GetOmr</A>
+<A HREF="fyba2.html#HO_SjekkTegnsett" target="Felt2">- HO_SjekkTegnsett</A>
+<P><A HREF="fyba2.html#O12" target="Felt2"><FONT COLOR=BLACK><B>8 New Group</B></FONT></A>
+<A HREF="fyba2.html#LC_NyGr" target="Felt2">- LC_NyGr</A>
+<P><A HREF="fyba2.html#O13" target="Felt2"><FONT COLOR=BLACK><B>9 Direct Read/Write</B></FONT></A>
+<A HREF="fyba2.html#LC_RxGr" target="Felt2">- LC_RxGr</A>
+<A HREF="fyba2.html#LC_WxGr" target="Felt2">- LC_WxGr</A>
+<P><A HREF="fyba2.html#O14" target="Felt2"><FONT COLOR=BLACK><B>10 Sequential Read/Write</B></FONT></A>
+<A HREF="fyba2.html#LC_RsGr" target="Felt2">- LC_RsGr</A>
+<A HREF="fyba2.html#LC_RsHode" target="Felt2">- LC_RsHode</A>
+<A HREF="fyba2.html#LC_WsGr" target="Felt2">- LC_WsGr</A>
+<A HREF="fyba2.html#LC_WsGrPart" target="Felt2">- LC_WsGrPart</A>
+<A HREF="fyba2.html#LC_EndreHode" target="Felt2">- LC_EndreHode</A>
+<P><A HREF="fyba2.html#O15" target="Felt2"><FONT COLOR=BLACK><B>11 Delete Group</B></FONT></A>
+<A HREF="fyba2.html#LC_DelGr" target="Felt2">- LC_DelGr</A>
+<P><A HREF="fyba2.html#O16" target="Felt2"><FONT COLOR=BLACK><B>12 Storing Back the Buffered Info to a SOSI File</B></FONT></A>
+<A HREF="fyba2.html#LC_Save" target="Felt2">- LC_Save</A>
+<P><A HREF="fyba2.html#O17" target="Felt2"><FONT COLOR=BLACK><B>13 Reserve Space in the Ring Buffer</B></FONT></A>
+<A HREF="fyba2.html#LC_InsGiL" target="Felt2">- LC_InsGiL</A>
+<A HREF="fyba2.html#LC_AppGiL" target="Felt2">- LC_AppGiL</A>
+<A HREF="fyba2.html#LC_InsKoL" target="Felt2">- LC_InsKoL</A>
+<A HREF="fyba2.html#LC_AppKoL" target="Felt2">- LC_AppKoL</A>
+<A HREF="fyba2.html#LC_DelGiL" target="Felt2">- LC_DelGiL</A>
+<A HREF="fyba2.html#LC_DelKoL" target="Felt2">- LC_DelKoL</A>
+<P><A HREF="fyba2.html#O18" target="Felt2"><FONT COLOR=BLACK><B>14 Add Data to the Ring Buffer</B></FONT></A>
+<P><A HREF="fyba2.html#O19" target="Felt2"><FONT COLOR=GREEN><B>14.1 Copying Group</B></FONT></A>
+<A HREF="fyba2.html#LC_CopyGr" target="Felt2">- LC_CopyGr</A>
+<A HREF="fyba2.html#LC_CopyCoord" target="Felt2">- LC_CopyCoord</A>
+<P><A HREF="fyba2.html#O20" target="Felt2"><FONT COLOR=GREEN><B>14.2 Group Information</B></FONT></A>
+<A HREF="fyba2.html#LC_PutGi" target="Felt2">- LC_PutGi</A>
+<A HREF="fyba2.html#LC_PutGP" target="Felt2">- LC_PutGP</A>
+<A HREF="fyba2.html#LC_AppGP" target="Felt2">- LC_AppGP</A>
+<A HREF="fyba2.html#LC_UpdateGP" target="Felt2">- LC_UpdateGP</A>
+<A HREF="fyba2.html#LC_UpdateGiEnhet" target="Felt2">- LC_UpdateGiEnhet</A>
+<A HREF="fyba2.html#LC_UpdateGiKvalitet" target="Felt2">- LC_UpdateGiKvalitet</A>
+<A HREF="fyba2.html#LC_UpdatePiKvalitet" target="Felt2">- LC_UpdatePiKvalitet</A>
+<A HREF="fyba2.html#LC_OppdaterEndret" target="Felt2">- LC_OppdaterEndret</A>
+<A HREF="fyba2.html#LC_DelGiNavn" target="Felt2">- LC_DelGiNavn</A>
+<A HREF="fyba2.html#LC_FinnNivo" target="Felt2">- LC_FinnNivo</A>
+<P><A HREF="fyba2.html#O21" target="Felt2"><FONT COLOR=GREEN><B>14.3 Serial Number and Reference Number</B></FONT></A>
+<A HREF="fyba2.html#LC_PutSn" target="Felt2">- LC_PutSn</A>
+<A HREF="fyba2.html#LC_PutRef" target="Felt2">- LC_PutRef</A>
+<P><A HREF="fyba2.html#O22" target="Felt2"><FONT COLOR=GREEN><B>14.4 Coordinates</B></FONT></A>
+<A HREF="fyba2.html#LC_PutTK" target="Felt2">- LC_PutTK</A>
+<A HREF="fyba2.html#LC_PutTH" target="Felt2">- LC_PutTH</A>
+<A HREF="fyba2.html#LC_PutTD" target="Felt2">- LC_PutTD</A>
+<P><A HREF="fyba2.html#O23" target="Felt2"><FONT COLOR=GREEN><B>14.5 Connection Nodes</B></FONT></A>
+<A HREF="fyba2.html#LC_PutKp" target="Felt2">- LC_PutKp</A>
+<P><A HREF="fyba2.html#O24" target="Felt2"><FONT COLOR=GREEN><B>14.6 Node Information</B></FONT></A>
+<A HREF="fyba2.html#LC_PutPi" target="Felt2">- LC_PutPi</A>
+<P><A HREF="fyba2.html#O25" target="Felt2"><FONT COLOR=BLACK><B>15 Get Data from the Ring Buffer</B></FONT></A>
+<P><A HREF="fyba2.html#O26" target="Felt2"><FONT COLOR=GREEN><B>15.1 General Value for a SOSI Name</B></FONT></A>
+<P><A HREF="fyba2.html#O27" target="Felt2"><FONT COLOR=GREEN><B>15.2 Group Information</B></FONT></A>
+<A HREF="fyba2.html#LC_GetGi" target="Felt2">- LC_GetGi</A>
+<A HREF="fyba2.html#LC_GetGP" target="Felt2">- LC_GetGP</A>
+<P><A HREF="fyba2.html#O28" target="Felt2"><FONT COLOR=GREEN><B>15.3 Serial Number and Reference Number</B></FONT></A>
+<A HREF="fyba2.html#LC_GetSn" target="Felt2">- LC_GetSn</A>
+<A HREF="fyba2.html#LC_GetRef" target="Felt2">- LC_GetRef</A>
+<A HREF="fyba2.html#LC_InqAntRef" target="Felt2">- LC_InqAntRef</A>
+<A HREF="fyba2.html#LC_InitGetRefFlate" target="Felt2">- LC_InitGetRefFlate</A>
+<A HREF="fyba2.html#LC_GetRefFlate" target="Felt2">- LC_GetRefFlate</A>
+<A HREF="fyba2.html#LC_ErLinjeRefLin" target="Felt2">- LC_ErLinjeRefLin</A>
+<P><A HREF="fyba2.html#O29" target="Felt2"><FONT COLOR=GREEN><B>15.4 Special get-functions</B></FONT></A>
+<A HREF="fyba2.html#LC_GetBuePar" target="Felt2">- LC_GetBuePar</A>
+<A HREF="fyba2.html#LC_GetBue" target="Felt2">- LC_GetBue</A>
+<A HREF="fyba2.html#LC_GetBuep" target="Felt2">- LC_GetBuep</A>
+<A HREF="fyba2.html#LC_GetSirkel" target="Felt2">- LC_GetSirkel</A>
+<A HREF="fyba2.html#LC_GetSirkelp" target="Felt2">- LC_GetSirkelp</A>
+<A HREF="fyba2.html#LC_GetKvalitet" target="Felt2">- LC_GetKvalitet</A>
+<P><A HREF="fyba2.html#O30" target="Felt2"><FONT COLOR=GREEN><B>15.5 Coordinates</B></FONT></A>
+<A HREF="fyba2.html#LC_GetTK" target="Felt2">- LC_GetTK</A>
+<A HREF="fyba2.html#LC_GetArrayTK" target="Felt2">- LC_GetArrayTK</A>
+<A HREF="fyba2.html#LC_GetTH" target="Felt2">- LC_GetTH</A>
+<A HREF="fyba2.html#LC_GetArrayTH" target="Felt2">- LC_GetArrayTH</A>
+<A HREF="fyba2.html#LC_GetHoyde" target="Felt2">- LC_GetHoyde</A>
+<A HREF="fyba2.html#LC_GetTD" target="Felt2">- LC_GetTD</A>
+<A HREF="fyba2.html#LC_GetDybde" target="Felt2">- LC_GetDybde</A>
+<P><A HREF="fyba2.html#O31" target="Felt2"><FONT COLOR=GREEN><B>15.6 Connection Nodes</B></FONT></A>
+<A HREF="fyba2.html#LC_GetKp" target="Felt2">- LC_GetKp</A>
+<A HREF="fyba2.html#LC_FinnKp" target="Felt2">- LC_FinnKp</A>
+<P><A HREF="fyba2.html#O32" target="Felt2"><FONT COLOR=GREEN><B>15.7 Node Information</B></FONT></A>
+<A HREF="fyba2.html#LC_GetPi" target="Felt2">- LC_GetPi</A>
+<A HREF="fyba2.html#LC_InitPP" target="Felt2">- LC_InitPP</A>
+<A HREF="fyba2.html#LC_GetPP" target="Felt2">- LC_GetPP</A>
+<A HREF="fyba2.html#LC_GetPiVerdi" target="Felt2">- LC_GetPiVerdi</A>
+<A HREF="fyba2.html#LC_TestPi" target="Felt2">- LC_TestPi</A>
+<P><A HREF="fyba2.html#O33" target="Felt2"><FONT COLOR=GREEN><B>15.8 Special get Operations</B></FONT></A>
+<A HREF="fyba2.html#LC_GetCurEnhet" target="Felt2">- LC_GetCurEnhet</A>
+<A HREF="fyba2.html#LC_GetCurKvalitet" target="Felt2">- LC_GetCurKvalitet</A>
+<A HREF="fyba2.html#LC_GetObjtypeBgr" target="Felt2">- LC_GetObjtypeBgr</A>
+<A HREF="fyba2.html#LC_GetElementNavn" target="Felt2">- LC_GetElementNavn</A>
+<P><A HREF="fyba2.html#O34" target="Felt2"><FONT COLOR=BLACK><B>16 Iterating in the Base</B></FONT></A>
+<A HREF="fyba2.html#LC_InitNextFil" target="Felt2">- LC_InitNextFil</A>
+<A HREF="fyba2.html#LC_NextFil" target="Felt2">- LC_NextFil</A>
+<A HREF="fyba2.html#LC_InitNextBgr" target="Felt2">- LC_InitNextBgr</A>
+<A HREF="fyba2.html#LC_NextBgr" target="Felt2">- LC_NextBgr</A>
+<P><A HREF="fyba2.html#O35" target="Felt2"><FONT COLOR=BLACK><B>17 Geographical Search</B></FONT></A>
+<A HREF="fyba2.html#LC_GetGrWin" target="Felt2">- LC_GetGrWin</A>
+<A HREF="fyba2.html#LC_SBFlate" target="Felt2">- LC_SBFlate</A>
+<A HREF="fyba2.html#LC_FFFlate" target="Felt2">- LC_FFFlate</A>
+<A HREF="fyba2.html#LC_FNFlate" target="Felt2">- LC_FNFlate</A>
+<A HREF="fyba2.html#LC_SBGeo" target="Felt2">- LC_SBGeo</A>
+<A HREF="fyba2.html#LC_FFGeo" target="Felt2">- LC_FFGeo</A>
+<A HREF="fyba2.html#LC_FNGeo" target="Felt2">- LC_FNGeo</A>
+<A HREF="fyba2.html#LC_FAGeo" target="Felt2">- LC_FAGeo</A>
+<A HREF="fyba2.html#LC_FFGeoFil" target="Felt2">- LC_FFGeoFil</A>
+<A HREF="fyba2.html#LC_FNGeoFil" target="Felt2">- LC_FNGeoFil</A>
+<A HREF="fyba2.html#LC_AvsluttSok" target="Felt2">- LC_AvsluttSok</A>
+<A HREF="fyba2.html#LC_WTst" target="Felt2">- LC_WTst</A>
+<A HREF="fyba2.html#LC_PTst" target="Felt2">- LC_PTst</A>
+<A HREF="fyba2.html#LC_PTstOmkrets" target="Felt2">- LC_PTstOmkrets</A>
+<P><A HREF="fyba2.html#O36" target="Felt2"><FONT COLOR=BLACK><B>18 Serial Number Search</B></FONT></A>
+<A HREF="fyba2.html#LC_SBSn" target="Felt2">- LC_SBSn</A>
+<A HREF="fyba2.html#LC_MoveSn" target="Felt2">- LC_MoveSn</A>
+<A HREF="fyba2.html#LC_FiSn" target="Felt2">- LC_FiSn</A>
+<A HREF="fyba2.html#LC_FiArraySn" target="Felt2">- LC_FiArraySn</A>
+<A HREF="fyba2.html#LC_FASn" target="Felt2">- LC_FASn</A>
+<A HREF="fyba2.html#LC_FFSn" target="Felt2">- LC_FFSn</A>
+<A HREF="fyba2.html#LC_FNSn" target="Felt2">- LC_FNSn</A>
+<A HREF="fyba2.html#LC_FPSn" target="Felt2">- LC_FPSn</A>
+<A HREF="fyba2.html#LC_FLSn" target="Felt2">- LC_FLSn</A>
+<A HREF="fyba2.html#LC_FFSnBt" target="Felt2">- LC_FFSnBt</A>
+<A HREF="fyba2.html#LC_FNSnBt" target="Felt2">- LC_FNSnBt</A>
+<A HREF="fyba2.html#LC_FPSnBt" target="Felt2">- LC_FPSnBt</A>
+<A HREF="fyba2.html#LC_FLSnBt" target="Felt2">- LC_FLSnBt</A>
+<P><A HREF="fyba2.html#O37" target="Felt2"><FONT COLOR=BLACK><B>19 Property Subset</B></FONT></A>
+<A HREF="fyba2.html#LC_OpenQuery" target="Felt2">- LC_OpenQuery</A>
+<A HREF="fyba2.html#LC_CloseQuery" target="Felt2">- LC_CloseQuery</A>
+<A HREF="fyba2.html#LC_PutQueryLine" target="Felt2">- LC_PutQueryLine</A>
+<A HREF="fyba2.html#LC_PutQueryRegel" target="Felt2">- LC_PutQueryRegel</A>
+<A HREF="fyba2.html#LC_LesUtvalg" target="Felt2">- LC_LesUtvalg</A>
+<A HREF="fyba2.html#LC_GetUtRegelNavn" target="Felt2">- LC_GetUtRegelNavn</A>
+<A HREF="fyba2.html#LC_GruppeUtvalg" target="Felt2">- LC_GruppeUtvalg</A>
+<A HREF="fyba2.html#LC_PunktUtvalg" target="Felt2">- LC_PunktUtvalg</A>
+<A HREF="fyba2.html#LC_FinnPinfoUtvalg" target="Felt2">- LC_FinnPinfoUtvalg</A>
+<A HREF="fyba2.html#LC_PiTestUtvalg" target="Felt2">- LC_PiTestUtvalg</A>
+<A HREF="fyba2.html#LC_GiQuery" target="Felt2">- LC_GiQuery</A>
+<A HREF="fyba2.html#LC_FAGiQuery" target="Felt2">- LC_FAGiQuery</A>
+<A HREF="fyba2.html#LC_FAGiKombinertFlateQuery" target="Felt2">- LC_FAGiKombinertFlateQuery</A>
+<A HREF="fyba2.html#LC_QueryGP" target="Felt2">- LC_QueryGP</A>
+<A HREF="fyba2.html#LC_InqMaxPrioritet" target="Felt2">- LC_InqMaxPrioritet</A>
+<A HREF="fyba2.html#LC_TestPrioritetBrukt" target="Felt2">- LC_TestPrioritetBrukt</A>
+<A HREF="fyba2.html#LC_UtvalgPrioritet" target="Felt2">- LC_UtvalgPrioritet</A>
+<P><A HREF="fyba2.html#O38" target="Felt2"><FONT COLOR=BLACK><B>20 Marking Groups</B></FONT></A>
+<A HREF="fyba2.html#LC_SetBt" target="Felt2">- LC_SetBt</A>
+<A HREF="fyba2.html#LC_ClrBt" target="Felt2">- LC_ClrBt</A>
+<A HREF="fyba2.html#LC_GetBt" target="Felt2">- LC_GetBt</A>
+<A HREF="fyba2.html#LC_EraseBt" target="Felt2">- LC_EraseBt</A>
+<A HREF="fyba2.html#LC_CopyBt" target="Felt2">- LC_CopyBt</A>
+<A HREF="fyba2.html#LC_SetModusMerk" target="Felt2">- LC_SetModusMerk</A>
+<A HREF="fyba2.html#LC_MerkGr" target="Felt2">- LC_MerkGr</A>
+<P><A HREF="fyba2.html#O39" target="Felt2"><FONT COLOR=BLACK><B>21 Special Handling of Polygons</B></FONT></A>
+<A HREF="fyba2.html#Polygonbeskrivelse" target="Felt2">- Polygonbeskrivelse</A>
+<A HREF="fyba2.html#LC_POL_InitPolygon" target="Felt2">- LC_POL_InitPolygon</A>
+<A HREF="fyba2.html#LC_POL_FrigiPolygon" target="Felt2">- LC_POL_FrigiPolygon</A>
+<A HREF="fyba2.html#LC_POL_InitOmkrets" target="Felt2">- LC_POL_InitOmkrets</A>
+<A HREF="fyba2.html#LC_POL_LeggTilGruppeOmkrets" target="Felt2">- LC_POL_LeggTilGruppeOmkrets</A>
+<A HREF="fyba2.html#LC_POL_FjernGruppeOmkrets" target="Felt2">- LC_POL_FjernGruppeOmkrets</A>
+<A HREF="fyba2.html#LC_POL_FjernSisteGruppeOmkrets" target="Felt2">- LC_POL_FjernSisteGruppeOmkrets</A>
+<A HREF="fyba2.html#LC_POL_FrigiOmkrets" target="Felt2">- LC_POL_FrigiOmkrets</A>
+<A HREF="fyba2.html#LC_POL_InitOy" target="Felt2">- LC_POL_InitOy</A>
+<A HREF="fyba2.html#LC_POL_FrigiAlleOyer" target="Felt2">- LC_POL_FrigiAlleOyer</A>
+<A HREF="fyba2.html#LC_POL_FjernOy" target="Felt2">- LC_POL_FjernOy</A>
+<A HREF="fyba2.html#LC_POL_LeggTilOy" target="Felt2">- LC_POL_LeggTilOy</A>
+<A HREF="fyba2.html#LC_POL_TestBrukt" target="Felt2">- LC_POL_TestBrukt</A>
+<A HREF="fyba2.html#LC_POL_PutRef" target="Felt2">- LC_POL_PutRef</A>
+<A HREF="fyba2.html#LC_POL_GetRef" target="Felt2">- LC_POL_GetRef</A>
+<A HREF="fyba2.html#LC_POL_GetRefOmkrets" target="Felt2">- LC_POL_GetRefOmkrets</A>
+<A HREF="fyba2.html#LC_POL_PTst" target="Felt2">- LC_POL_PTst</A>
+<A HREF="fyba2.html#LC_POL_PTstOmkrets" target="Felt2">- LC_POL_PTstOmkrets</A>
+<A HREF="fyba2.html#LC_POL_Box" target="Felt2">- LC_POL_Box</A>
+<P><A HREF="fyba2.html#O40" target="Felt2"><FONT COLOR=BLACK><B>22 Various Functions</B></FONT></A>
+<P><A HREF="fyba2.html#O41" target="Felt2"><FONT COLOR=GREEN><B>22.1 Calculations</B></FONT></A>
+<A HREF="fyba2.html#LC_BerAreal" target="Felt2">- LC_BerAreal</A>
+<A HREF="fyba2.html#LC_BerLengde" target="Felt2">- LC_BerLengde</A>
+<A HREF="fyba2.html#LC_BerLengde3D" target="Felt2">- LC_BerLengde3D</A>
+<A HREF="fyba2.html#LC_BerAvgrensLengde" target="Felt2">- LC_BerAvgrensLengde</A>
+<A HREF="fyba2.html#LC_BerYtreAvgrensLengde" target="Felt2">- LC_BerYtreAvgrensLengde</A>
+<A HREF="fyba2.html#LC_BerIndreAvgrensLengde" target="Felt2">- LC_BerIndreAvgrensLengde</A>
+<A HREF="fyba2.html#LC_RoundKoord" target="Felt2">- LC_RoundKoord</A>
+<P><A HREF="fyba2.html#O42" target="Felt2"><FONT COLOR=GREEN><B>22.2 Structure Changes</B></FONT></A>
+<A HREF="fyba2.html#LC_SnuGr" target="Felt2">- LC_SnuGr</A>
+<A HREF="fyba2.html#LC_SammenfoyGr" target="Felt2">- LC_SammenfoyGr</A>
+<A HREF="fyba2.html#LC_SplittGr" target="Felt2">- LC_SplittGr</A>
+<A HREF="fyba2.html#LC_ErstattReferanse" target="Felt2">- LC_ErstattReferanse</A>
+<P><A HREF="fyba2.html#O43" target="Felt2"><FONT COLOR=GREEN><B>22.3 The Entire Base</B></FONT></A>
+<A HREF="fyba2.html#LC_InqAntFiler" target="Felt2">- LC_InqAntFiler</A>
+<P><A HREF="fyba2.html#O44" target="Felt2"><FONT COLOR=GREEN><B>22.4 Priority</B></FONT></A>
+<A HREF="fyba2.html#LC_ClrPrioritet" target="Felt2">- LC_ClrPrioritet</A>
+<A HREF="fyba2.html#LC_SetPrioritet" target="Felt2">- LC_SetPrioritet</A>
+<A HREF="fyba2.html#LC_InqPrioritet" target="Felt2">- LC_InqPrioritet</A>
+<A HREF="fyba2.html#LC_ErasePrioritet" target="Felt2">- LC_ErasePrioritet</A>
+<A HREF="fyba2.html#LC_EraseAllPrioritet" target="Felt2">- LC_EraseAllPrioritet</A>
+<P><A HREF="fyba2.html#O45" target="Felt2"><FONT COLOR=GREEN><B>22.5 Quality</B></FONT></A>
+<A HREF="fyba2.html#LC_FormatterKvalitet" target="Felt2">- LC_FormatterKvalitet</A>
+<P><A HREF="fyba2.html#O46" target="Felt2"><FONT COLOR=GREEN><B>22.6 Table Handling</B></FONT></A>
+<A HREF="fyba2.html#LC_InitTabel" target="Felt2">- LC_InitTabel</A>
+<A HREF="fyba2.html#LC_PutTabel" target="Felt2">- LC_PutTabel</A>
+<A HREF="fyba2.html#LC_GetTabel" target="Felt2">- LC_GetTabel</A>
+<A HREF="fyba2.html#LC_CloseTabel" target="Felt2">- LC_CloseTabel</A>
+<P><A HREF="fyba2.html#O47" target="Felt2"><FONT COLOR=GREEN><B>22.7 Message Handling</B></FONT></A>
+<A HREF="fyba2.html#LC_SetErrorHandler" target="Felt2">- LC_SetErrorHandler</A>
+<A HREF="fyba2.html#LC_SetStartMessageHandler" target="Felt2">- LC_SetStartMessageHandler</A>
+<A HREF="fyba2.html#LC_SetShowMessageHandler" target="Felt2">- LC_SetShowMessageHandler</A>
+<A HREF="fyba2.html#LC_SetEndMessageHandler" target="Felt2">- LC_SetEndMessageHandler</A>
+<A HREF="fyba2.html#LC_SetCancelHandler" target="Felt2">- LC_SetCancelHandler</A>
+<A HREF="fyba2.html#LC_StartMessage" target="Felt2">- LC_StartMessage</A>
+<A HREF="fyba2.html#LC_ShowMessage" target="Felt2">- LC_ShowMessage</A>
+<A HREF="fyba2.html#LC_EndMessage" target="Felt2">- LC_EndMessage</A>
+<A HREF="fyba2.html#LC_Cancel" target="Felt2">- LC_Cancel</A>
+<A HREF="fyba2.html#LC_Error" target="Felt2">- LC_Error</A>
+<P><A HREF="fyba2.html#O48" target="Felt2"><FONT COLOR=GREEN><B>22.8 Helper Functions for Message Handling</B></FONT></A>
+<A HREF="fyba2.html#LC_StrError" target="Felt2">- LC_StrError</A>
+<P><A HREF="fyba2.html#O49" target="Felt2"><FONT COLOR=GREEN><B>22.9 Debugging</B></FONT></A>
+<A HREF="fyba2.html#LC_DumpTab" target="Felt2">- LC_DumpTab</A>
+</PRE></BODY></HTML>
diff --git a/doc/en_EN/fyba2.html b/doc/en_EN/fyba2.html
new file mode 100644
index 0000000..bfbfa10
--- /dev/null
+++ b/doc/en_EN/fyba2.html
@@ -0,0 +1,6789 @@
+<HTML>
+<HEAD>
+<META http-equiv="Content-Type" CONTENT="text/htm; iso-8859-1">
+</HEAD>
+<BODY BGCOLOR="ffffff">
+<BODY>
+<BR>
+<BR>
+<FONT COLOR="Red" SIZE="+6" FACE="Comic Sans MS"><I><B><CENTER>FYBA</CENTER></I></B></FONT>
+<BR>
+<FONT SIZE="+2" FACE="Comic Sans MS"><I><B><CENTER>A Storage System for Geo Data in SOSI format.</CENTER></I></B></FONT>
+<BR>
+<BR>
+<BR>
+<BR>
+<FONT SIZE="-1"><CENTER>Last updated: 2014-08-24 by rubund. Translated from the norwegian version dated 2013-10-09</CENTER></FONT>
+
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O1"NAME="O1"></A><H1>1 Introduction</H1>
+
+</PRE>
+FYBA is a library to handle searching, reading and updating of
+<A TARGET="top" HREF="http://www.statkart.no/nor/sosi/" target="_new">SOSI</A>-files.
+FYBA is now compatible with the <A TARGET="top" HREF="http://www.statkart.no/nor/sosi/" target="_new">SOSI</A>-format
+versjon 4.0, and will be adapted to newer <A TARGET="top" HREF="http://www.statkart.no/nor/sosi/" target="_new"">SOSI</A>-versions.
+<BR>
+This user manual is made for people who are familiar with SOSI and C-programming.
+
+All functions and constants are defined in the file FYBA.H.
+This file should therefore be included in all files which use the FYBA-functions.
+
+<BR>
+FYBA is written in ANSI C and it should therefore be possible to compile it in all platforms where there is a suitable compiler.
+There are however some helper functions that are architecture-dependent.
+These functions were separated into a separate library (UT) and must be adapted to the architecture.
+They have been tested in
+DOS, OS/2-16, OS/2-32, Win16, Win32, X64 and
+various UNIX varieties (POSIX, HPUX, Silicon graphics).
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O2"NAME="O2"></A><H1>2 Overview of the Functionality of FYBA</H1>
+
+</PRE>
+FYBA is a library that establishes and maintains "index-files" (.IDX) with the necessary information for
+reading, writing, searching and manipulation of data in SOSI files.
+
+As an overview, the following figure can explain the relationship between the
+SOSI-files, the library and programs linked with the library.
+
+<PRE>
+ !---------------!
+ !---------------->! Index-files !<-------!
+ ! !---------------! !
+ ! ^ !
+ ! ! !
+ ! !---!-----! ! !-----------------!
+ ! ! ! !-->! !
+ ! ! Buffer ! ! !
+!------!------! LC_Rxxxx ! ! LC_PutXxx ! User-program !
+! SOSI-file(s)!<----------- !internal !<------------- ! !
+! ! ----------->! ! ! !
+!-------------! LC_Wxxxx ! in ! ------------->! !
+ ! ! LC_GetXxx ! !
+ ! the FYBA! ! !
+ ! ! ! !
+ ! routines! !-----------------!
+ ! !
+ !---------!
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O3"NAME="O3"></A><H1>3 The Internal Workings of the Index System</H1>
+
+The index system consists of a bunch of tables. These are partly kept in RAM, and
+partly as files on the hard drive.
+
+Below, there is a drawing of these tables.
+This is only for your information. It is not necessary to know them in detail to be able
+to use the library:
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Gruppetabell"NAME="Gruppetabell"></A><H2>Group table</H2>
+<BIG><I><B>Group table</I></B></BIG><PRE>
+This is the main table with the information about every single group in the SOSI file.
+
+!------------------------------:-----------------------------------------------*
+!Start !Start !Ant. !Ant. ! Gruppeinnhold !
+! på ! i !tegn !tegn !-----------------------------------------------!
+!SOSI- ! RB !GINFO- !PINFO- !Gruppe!ant. !ant. !Kvali- !Enhet ! Div. info !
+!fil ! !buffer !buffer !navn !GINFO! NØ ! tet ! ! (bit def.) !
+!-------!------!-------!-------!------!-----!-----!--------!------!------------!
+!sosi_st!rb_st !ulGiLen!ulPiLen!gnavn !ngi !nko !Kvalitet!dEnhet! info !
+! n64 ! n64 ! ul ! ul ! s ! s ! l ! struct ! d ! us !
+! ! ! ! ! ! ! ! ! !0=i !
+! ! ! ! ! ! ! ! ! !1=H !
+! ! ! ! ! ! ! ! ! !2=KP !
+! ! ! ! ! ! ! ! ! !3=REF !
+! ! ! ! ! ! ! ! ! !4=REF med ØY!
+! ! ! ! ! ! ! ! ! !5=sletta !
+! ! ! ! ! ! ! ! ! !6=NGIS oppd !
+*------------------------------------------------------------------------------*
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Brukttabell"NAME="Brukttabell"></A><H2>Used table</H2>
+<BIG><I><B>Marking of groups</I></B></BIG><PRE>
+This table is partly used internally by FYBA and partly by the user program.
+
+The following bits are defined:
+--------------------------------------------------------------------------------------
+ 31 The group has been found after a geographical search -----! Users can read/use
+ 30 The group has been found with a GINFO selection ! these, but it is not
+ 29 The group has been found after a serial number search ! allowed to change them.
+ 28 The group is in the ring buffer !
+ 27 The group is used in a rewritten block ------!
+ 26 -----!
+ . ! Users have
+ . ! full access
+ 2 ! to these.
+ 1 -----!
+ 0 The group is waiting in a line to be written to the SOSI-file
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="SOSI-buffer"NAME="SOSI-buffer"></A><H2>SOSI buffer</H2>
+<BIG><I><B>Binary copy of the SOSI-file</I></B></BIG><PRE>
+In order to increase the speed, the library makes a binary copy of the SOSI file.
+This copy is partly stored in RAM and partly on the hard drive.
+
+The copy consists of group information, coordinates and node information.
+
+The group information for one group is treated as a long string with pointers
+to the start position for every GINFO-line
+
+!-----------:-----------:----------:----------------------------------!
+! GINFO 1 ! GINFO 2 ! GINFO 3 ! ..... !
+!-----------:-----------:----------:----------------------------------!
+ ! ! !
+ !---------! ! !
+ ! ! !
+!--------! ! ! !
+! GINFO ! ! ! !
+!--------! ! ! !
+! offset !-! ! !
+! !----- !
+! !-----------------
+
+The coordinates are stored in separate arrays. The node information is stored
+as a long string for the entire group with pointers to every node to the start
+position for PINFO for every node in the same way as GINFO.
+
+!--------! !--------! !----------:-------:--------!
+! East ! ! North ! ! Altitude ! KP ! PINFO !
+!--------! !--------! !----------!-------!--------!
+! double ! ! double ! ! double ! short ! ushort !
+! m ! ! m ! ! m ! ! ofset !
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Serienummer-tabell"NAME="Serienummer-tabell"></A><H2>Serial number table</H2>
+!-------------*
+! Group number!
+!-------------! The line number in the table is the serial number.
+! lGrNr !
+! (long) !
+*-------------*
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Geografisk-søketabell"NAME="Geografisk-søketabell"></A><H2>Geographical search table</H2>
+<BIG><I><B>Geographical search table</I></B></BIG><PRE>
+
+Geopgraphical search is based on a rewritten box.
+The boxes are organised in an R-tree.
+
+!-----------------------------------*
+! Rewritte box !
+! !
+! min-N ! min-E ! max-N ! max-E !
+! ! ! ! !
+!--------!--------!--------!--------!
+!dMinNord!dMinAust!dMaxNord!dMaxAust!
+! d ! d ! d ! d !
+! ! ! ! !
+*-----------------------------------*
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O4"NAME="O4"></A><H1>4 Naming Conventions</H1>
+
+</PRE>
+The variable names are freely chosen to say as much about what the variables contain. Many of the names are in Norwegian because of the origin of the library.
+<BR>
+Most of the functions in the user interface begin with "LC_":
+<BR>
+In addition, there are some special functions that are used to read the file header directly from a SOSI file.
+These have names that start with "HO_":
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O5"NAME="O5"></A><H1>5 Initialisation and Control</H1>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Init"NAME="LC_Init"></A><H2>LC_Init</H2>
+<BIG><I><B>Initialises FYBA</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Initialises FYBA.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+Usage:
+LC_Init();
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_Init(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqVer"NAME="LC_InqVer"></A><H2>LC_InqVer</H2>
+<BIG><I><B>Identification</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Gets the version of this library.
+ =============================================================================
+
+SK_EntPnt_FYBA char *LC_InqVer(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Close"NAME="LC_Close"></A><H2>LC_Close</H2>
+<BIG><I><B>Closes FYBA</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Closes FYBA.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+Usage:
+LC_Close();
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_Close(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErInitiert"NAME="LC_ErInitiert"></A><H2>LC_ErInitiert</H2>
+<BIG><I><B>Is FYBA initialised</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Checks if FYBA has been initialised / is available.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short sStaus r 0=not initialised, or closed
+ 1=initialised
+Usage:
+sStatus = LC_ErInitiert();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_ErInitiert(void)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_MaxSkriv"NAME="LC_MaxSkriv"></A><H2>LC_MaxSkriv</H2>
+<BIG><I><B>Maximum number of times to write before writing to the SOSI file</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sets the maximum number of times to write before writing to the SOSI file
+(0 = everything is written directly to the SOSI file.)
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+long number i Maxium number of times to write before writing to the SOSI file
+Usage:
+LC_MaxSkriv(number);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_MaxSkriv(long antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqMaxSkriv"NAME="LC_InqMaxSkriv"></A><H2>LC_InqMaxSkriv</H2>
+<BIG><I><B>Maximum number of times to write before writing to the SOSI file</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Gets the maximum number of times to write before writing to the SOSI file.
+(0 = everything is written directly to the SOSI file.)
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+long number i Maxium number of times to write before writing to the SOSI file
+Usage:
+number = LC_InqMaxSkriv();
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_InqMaxSkriv(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetNgisModus"NAME="LC_SetNgisModus"></A><H2>LC_SetNgisModus</H2>
+<BIG><I><B>Choose NGIS mode</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sets the way to handle groups that are marked for update by NGIS.
+The default value after LC_Init is NGIS_NORMAL.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short mode i The way to handle:
+ NGIS_NORMAL (0) = Normal
+ NGIS_SPESIAL (1) = Special mode where it is possible to read
+ groups that have been marked as deleted
+Usage:
+LC_SetNgisModus(NGIS_NORMAL);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetNgisModus(short modus)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetDefLpfi"NAME="LC_SetDefLpfi"></A><H2>LC_SetDefLpfi</H2>
+<BIG><I><B>Available space between groups</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Adds default value for the number of letters available behind groups in a .SOS-file
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------------
+short num_letters i Number of letters available space.
+Usage:
+LC_SetDefLpfi(ant_tegn);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_SetDefLpfi(short ant_tegn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqDefLpfi"NAME="LC_InqDefLpfi"></A><H2>LC_InqDefLpfi</H2>
+<BIG><I><B>Gets the available space between groups</I></B></BIG><PRE>
+==========================================================================
+Purpose
+Gets the default value for the number of letters available behind groups in a .SOS-file
+Parameters:
+Type Name I/O Explanation
+----------------------------------------------------------------------------------
+short num_letters r Number of letters available space.
+Usage:
+ant_tegn = LC_InqDefLpfi();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_InqDefLpfi(void)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetUtvidModus"NAME="LC_SetUtvidModus"></A><H2>LC_SetUtvidModus</H2>
+<BIG><I><B>Set the expanding mode</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Set the way to handle expanding of SOSI files.
+The default value after LC_Init is LC_UTVID_SIKKER.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short mode i Way to handle:
+ LC_UTVID_SIKKER (0) = The SOSI file is closed and the file size
+ is updated after every group that is
+ written in the end of the file.
+ LC_UTVID_RASK (1) = The SOSI file is not closed after each
+ group that is written at the end
+ of the file.
+ (Only to be used in special circumstances.)
+Usage:
+LC_SetUtvidModus(LC_UTVID_SIKKER);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetUtvidModus(short modus)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetUtvidModus"NAME="LC_GetUtvidModus"></A><H2>LC_GetUtvidModus</H2>
+<BIG><I><B>Get the expanding mode</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Get the way to handle expanding of SOSI files.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short mode r Way to handle:
+ LC_UTVID_SIKKER (0) = The SOSI file is closed and the file size
+ is updated after every group that is
+ written in the end of the file.
+ LC_UTVID_RASK (1) = The SOSI file is not closed after each
+ group that is written at the end
+ of the file.
+ (Only to be used in special circumstances.)
+Usage:
+short sModus = LC_GetUtvidModus();
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetUtvidModus(void)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O6"NAME="O6"></A><H1>6 Opening Base and SOSI Files</H1>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_OpenBase"NAME="LC_OpenBase"></A><H2>LC_OpenBase</H2>
+<BIG><I><B>Opens a new base</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Opens a new base, resets the tables.
+If the base is a draft base, a SOSI file with one group is created in the base.
+This is used as a buffer for read / write.
+The draft file is stored in the current directory.
+The draft base is only used when all SOSI files are opened with a sequential read / write.
+
+The new base is chosen as the active base.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short sBaseType i Base type. Constants defined:
+ LC_BASE = Standard base.
+ LC_KLADD = Draft base. Only used in special
+ circumstances if no files is opened
+ as a LC_BASE_xx.
+LC_BASEADM * pBase r Base pointer.
+Usage:
+pBase = LC_OpenBase(sBaseType);
+ ==========================================================================
+
+SK_EntPnt_FYBA LC_BASEADM * LC_OpenBase(short sBaseType)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CloseBase"NAME="LC_CloseBase"></A><H2>LC_CloseBase</H2>
+<BIG><I><B>Close base</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Closes all the files in the base, and releases the basee administration block.
+If the active base is closed, the first base in the system is chosen as
+the new active base.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+PLCBASEADM pBase i Pointer to baseAdm
+short s_stat i Close-status
+ RESET_IDX = Removes the index files
+ SAVE_IDX = Saves the index files
+ ABORT = Saves the index files (for cancelled index
+ generation)
+Usage:
+LC_CloseBase(pBase,s_stat);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_CloseBase(LC_BASEADM * pBase,short s_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SelectBase"NAME="LC_SelectBase"></A><H2>LC_SelectBase</H2>
+<BIG><I><B>Selects active base</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Selects the active base.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_BASEADM * pBase i Pointer to baseAdm
+Usage:
+LC_SelectBase(pBase);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SelectBase(LC_BASEADM * pBase)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqCurBase"NAME="LC_InqCurBase"></A><H2>LC_InqCurBase</H2>
+<BIG><I><B>Gets the active base</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Gets the active base.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_BASEADM * pBase r Base pointer
+Usage:
+pBase = LC_InqCurBase();
+ =============================================================================
+
+SK_EntPnt_FYBA LC_BASEADM * LC_InqCurBase(void)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_OpenSos"NAME="LC_OpenSos"></A><H2>LC_OpenSos</H2>
+<BIG><I><B>Åpner og sjekker SOSI-fil</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Opens a new file in active base.
+Allocates memory for a new file administration block and initialises it.
+Opens the SOSI file and adds names etc into the file administration block.
+Reads the header and interprets it in the file table.
+The header is not generated for new files. It can be generated with LC_PutGi, or
+LC_NyttHode or copied from another file, and written with LC_WsGr or LC_WxGr.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------
+char *fil i Filename including path and file type
+ (If the file type is missing, it assumes .SOS)
+short sModus i File mode
+ LC_BASE_FRAMGR = Foreground file
+ LC_BASE_BAKGR = Background file (Only read)
+ LC_SEKV_LES = Sequential, read
+ LC_SEKV_SKRIV = Sequential, write
+ LC_SEKV_UTVID = Sequential, expand old file
+short sNyIdx i Index generation:
+ LC_NY_IDX = Forced new generation
+ LC_GML_IDX = Use old .idx if it is OK
+short sVisStatus i Show the index
+ LC_VIS_STATUS = Show status
+ LC_INGEN_STATUS = Hide status
+LC_FILADM **pFil u Pointer to file administration block.
+short *o_stat u Detailed open status:
+ 0: Opening and header OK
+ >0: Error when opening
+ -1: Opening OK, empty file / not a SOSI file
+ -2: Not opened, append can not be used on
+ an empty file / not SOSI file
+ -3: (LC_CANCEL): Not opened,
+ index generation cancelled with [Esc].
+ or a file error.
+ -4: (LC_DUBLIKAT): The file is already in the base (pFil)
+ -5: (LC_OPPTATT): The file is opened in another program
+short status r Opening status: UT_TRUE = OK
+ UT_FALSE = Error, (o_stat contains the details)
+Usage:
+ist=LC_OpenSos(fil,LC_BASE_FRAMGR,LC_NY_IDX,LC_VIS_STATUS,&pFil,&o_stat);
+ist=LC_OpenSos(fil,LC_SEKV_LES,LC_NY_IDX,LC_INGEN_STATUS,&pFil,&o_stat);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_OpenSos(const char *fil,short sModus,short sNyIdx,short sVisStatus,
+ LC_FILADM **pFil, short *o_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CloseSos"NAME="LC_CloseSos"></A><H2>LC_CloseSos</H2>
+<BIG><I><B>Close SOSI file</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Closes a SOSI file, and removes it from the base.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Pointer to a filAdm-block
+short s_stat i End-status
+ RESET_IDX = Remove the index files
+ SAVE_IDX = Saves the index files
+Usage:
+LC_CloseSos(pFil,SAVE_IDX);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_CloseSos(LC_FILADM *pFil,short s_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelIdx"NAME="LC_DelIdx"></A><H2>LC_DelIdx</H2>
+<BIG><I><B>Delete the index files</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Deletes the index files for a specified SOSI file
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char *szSosFil i SOSI filename
+Usage:
+LC_DelIdx(szSosFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_DelIdx(char *szSosFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FcloseSos"NAME="LC_FcloseSos"></A><H2>LC_FcloseSos</H2>
+<BIG><I><B>Close an opened SOSI file in the file system</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+This function is used to ensure that a file is updated and closed in the file system,
+such that the SOSI file can be read from another program.
+Note!
+Only closes the file in the file system.
+The file is still open in the base.
+FYBA will automatically reopen the file when it is needed.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Pointer to FilAdm-block
+Usage:
+LC_FcloseSos(pFil);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_FcloseSos(LC_FILADM *pFil)
+</PRE>
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O7"NAME="O7"></A><H1>7 Helper Functions</H1>
+
+<BR>
+<BR>
+<BR>
+<A ID="O8"NAME="O8"></A><H2>7.1 Base og File</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBaOm"NAME="LC_GetBaOm"></A><H2>LC_GetBaOm</H2>
+<BIG><I><B>Get the base area</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Gets the base area for the active base (Summary of the headers).
+Sequential files are not included.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+unsigned short usLag i Choose which "layers" to be searched in.
+ LC_FRAMGR and /or LC_BAKGR
+ (Use "|" to combine.)
+double *nva u Lower left east
+double *nvn u Lower left north
+double *oha u Upper right east
+double *ohn u Upper right north
+short sStatus r UT_TRUE=OK, UT_FALSE=No file
+Usage:
+sStatus = LC_GetBaOm(LC_FRAMGR,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetBaOm(unsigned short usLag,double *nva,double *nvn,double *oha,
+ double *ohn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetFiOm"NAME="LC_GetFiOm"></A><H2>LC_GetFiOm</H2>
+<BIG><I><B>Get area from the file header</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Hent område for en SOSI-fil i basen.
+Fungerer ikke mot sekvensielle filer.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+double nva u Nedre venstre øst
+double nvn u Nedre venstre nord
+double oha u Øvre høyre øst
+double ohn u Øvre høyre nord
+short ist r Status (UT_TRUE=OK, UT_FALSE=sekvensiell fil)
+Usage:
+ist = LC_GetFiOm(pFil,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetFiOm(LC_FILADM *pFil,double *nva,double *nvn,double *oha,double *ohn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetFiNr"NAME="LC_GetFiNr"></A><H2>LC_GetFiNr</H2>
+<BIG><I><B>Get file number</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker alle filer i aktuell base om noen av den har det gitte filnavnet.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char fil_navn i Filnavn
+LC_FILADM *pFil r Peker til FilAdm for filen. (NULL = ukjent fil)
+Usage:
+pFil = LC_GetFiNr(fil_navn);
+ ==========================================================================
+
+SK_EntPnt_FYBA LC_FILADM *LC_GetFiNr(const char *fil_navn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetFiNa"NAME="LC_GetFiNa"></A><H2>LC_GetFiNa</H2>
+<BIG><I><B>Get filename</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter filnavnet for en fil i basen. Fungerer både for basefiler
+og for sekvensielle filer.
+OBS! Hvis du skal endre på filnavnet må du først kopiere det
+ til en lokale varialel.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+char *fil_navn r Peker til filnavn
+Usage:
+fil_navn = LC_GetFiNa(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetFiNa(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTegnsett"NAME="LC_GetTegnsett"></A><H2>LC_GetTegnsett</H2>
+<BIG><I><B>Get encoding</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finne tegnsett i ginfo i aktuell gruppe.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short *psTegnsett u Tegnsett, konstanter definert:
+ TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+ TS_ND7 = Norsk Data 7-bits
+ TS_ISO8859 = ISO8859-10 norsk/samisk
+ TS_DECM8 = DEC multinasjonal 8-bits
+ TS_DECN7 = DEC norsk 7-bits
+short sStatus r Status: UT_TRUE = Funnet
+ UT_FALSE = Ikke funnet
+Usage:
+ sStatus = LC_GetTegnsett(&sTegnsett);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetTegnsett(short *psTegnsett)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqLag"NAME="LC_InqLag"></A><H2>LC_InqLag</H2>
+<BIG><I><B>Get which layer the active group belongs to</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finn hvilket lag aktuell gruppe tilhører.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+unsigned short *usLag u "Lag": LC_FRAMGR eller LC_BAKGR
+short status r UT_TRUE = OK, UT_FALSE = Ingen aktuell gruppe
+Usage:
+ status = LC_InqLag(&usLag);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_InqLag(unsigned short *usLag)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqFilLag"NAME="LC_InqFilLag"></A><H2>LC_InqFilLag</H2>
+<BIG><I><B>Get which layer a file belongs to</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finn hvilket lag en fil tilhører.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Filpeker
+unsigned short usLag r "Lag": LC_FRAMGR eller LC_BAKGR
+Usage:
+ usLag = LC_InqFilLag(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA unsigned short LC_InqFilLag(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetFilLag"NAME="LC_SetFilLag"></A><H2>LC_SetFilLag</H2>
+<BIG><I><B>Set which layer a file belongs to</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Velg hvilket lag en fil tilhører.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Filpeker
+unsigned short usLag i "Lag": LC_FRAMGR eller LC_BAKGR
+Usage:
+ LC_SetFilLag(pFil,LC_FRAMGR);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetFilLag(LC_FILADM *pFil,unsigned short usLag)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FiLastGr"NAME="LC_FiLastGr"></A><H2>LC_FiLastGr</H2>
+<BIG><I><B>Find the last group in the file</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner gruppenummer for siste gruppe i filen.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+bgr long r Gruppenummer
+Usage:
+bgr = LC_FiLastGr(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_FiLastGr(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErFilBase"NAME="LC_ErFilBase"></A><H2>LC_ErFilBase</H2>
+<BIG><I><B>Check if the file is in the base</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker om en fil er i basen.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------
+char *fil i Filnavn inkl. sti og fil-type
+ (Hvis fil-type mangler forutsettes .SOS)
+short status r Status: UT_TRUE = Filen er med i basen.
+ UT_FALSE = Filen er IKKE med i basen.
+Usage:
+ist = LC_ErFilBase(fil);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_ErFilBase(const char *fil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErKoordsysLik"NAME="LC_ErKoordsysLik"></A><H2>LC_ErKoordsysLik</H2>
+<BIG><I><B>Check that all files in the base have the same coordinate system</I></B></BIG><PRE>
+=======================================================================
+Purpose:
+Sjekk at alle filene i basen har samme koordinatsystem.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+short status r Status: UT_TRUE = KOORDSYS er lik.
+ UT_FALSE = KOORDSYS er IKKE lik.
+Usage:
+ist = LC_ErKoordsysLik();
+ =======================================================================
+
+SK_EntPnt_FYBA short LC_ErKoordsysLik(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErVertdatumLik"NAME="LC_ErVertdatumLik"></A><H2>LC_ErVertdatumLik</H2>
+<BIG><I><B>Check that all files have the same VERT-DATUM</I></B></BIG><PRE>
+=======================================================================
+Purpose:
+Sjekk at alle filene i basen har samme VERT-DATUM.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+short status r Status: UT_TRUE = VERT-DATUM er lik.
+ UT_FALSE = VERT-DATUM er IKKE lik.
+Usage:
+ist = LC_ErVertdatumLik();
+ =======================================================================
+
+SK_EntPnt_FYBA short LC_ErVertdatumLik(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Backup"NAME="LC_Backup"></A><H2>LC_Backup</H2>
+<BIG><I><B>Make backup of a SOSI file</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Lag backup av gitt SOSI-fil.
+Kopien legges på en underkatlog med navn "Backup" under den katalogen
+SOSI-filen ligger på. Kopien navnes "Filnavn.nnn" der nnn er et
+fortløpende nummer fra 000 og oppover. Det første ledige numret blir brukt.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Filpeker
+char *pszBackupPath i Katalognavn for lagring av backup.
+short sStatus r UT_TRUE = OK
+ UT_FALSE = Feil.
+Usage:
+ sStatus = LC_Backup(pFil, szBackupPath);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_Backup(LC_FILADM *pFil, const char *pszBackupPath)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetNgisLag"NAME="LC_GetNgisLag"></A><H2>LC_GetNgisLag</H2>
+<BIG><I><B>Get NGIS-LAG from a file</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter NGIS-LAG for gitt fil.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Fil det ønskes opplsninger om.
+char* pszNgisLag r NGIS-lag.
+ Tom streng = ..NGIS-LAG er ikke funnet
+ "0" = Bare leseaksess (..NGIS-LAG 0)
+Usage:
+pszNgisLag = LC_GetNgisLag(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA char* LC_GetNgisLag(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetFilType"NAME="LC_SetFilType"></A><H2>LC_SetFilType</H2>
+<BIG><I><B>Set file type for a SOSI file</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Setter filtype for en fil.
+Denne rutinen er primært tenkt brukt i GabEdit hvor det er behov for å
+definere flere typer arbeidsfil.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til filen
+short type i Filtypen som skal settes
+ LC_FILTYPE_UKJENT
+ LC_FILTYPE_INAKTIV
+ LC_FILTYPE_GAB_EIENDOM
+ LC_FILTYPE_GAB_ADRESSE
+ LC_FILTYPE_GAB_BYGNING
+ LC_FILTYPE_BYGG
+ LC_FILTYPE_DEK
+ LC_FILTYPE_DEK_ENDRING
+ LC_FILTYPE_GRUNNKRETS
+ LC_FILTYPE_POSTKRETS
+ LC_FILTYPE_SKOLEKRETS
+ LC_FILTYPE_KIRKESOGN
+ LC_FILTYPE_TETTSTED
+ LC_FILTYPE_VALGKRETS
+Usage:
+LC_SetFilType(pFil,type);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetFilType(LC_FILADM *pFil, short sType)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetFilType"NAME="LC_GetFilType"></A><H2>LC_GetFilType</H2>
+<BIG><I><B>Get file type for a SOSI file</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner filtypen for en fil.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til filen
+short type r Filtypen som skal settes
+ LC_FILTYPE_UKJENT
+ LC_FILTYPE_INAKTIV
+ LC_FILTYPE_GAB_EIENDOM
+ LC_FILTYPE_GAB_ADRESSE
+ LC_FILTYPE_GAB_BYGNING
+ LC_FILTYPE_BYGG
+ LC_FILTYPE_DEK
+ LC_FILTYPE_DEK_ENDRING
+ LC_FILTYPE_GRUNNKRETS
+ LC_FILTYPE_POSTKRETS
+ LC_FILTYPE_SKOLEKRETS
+ LC_FILTYPE_KIRKESOGN
+ LC_FILTYPE_TETTSTED
+ LC_FILTYPE_VALGKRETS
+Usage:
+type = LC_GetFilType(pFil);
+=============================================================================
+
+SK_EntPnt_FYBA short LC_GetFilType(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErLik_Avrundet"NAME="LC_ErLik_Avrundet"></A><H2>LC_ErLik_Avrundet</H2>
+<BIG><I><B>Rund av og sjekk om sammenfallende punkt</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Runder av til valgt enhet, og sjekker om de to punktene er sammenfallende.
+(Avviket er mindre enn 1/10 enhet både nord og øst)
+Parameters:
+Type Name I/O Explanation
+---------------------------------------------------------------------------
+double dA1 i P1
+double dN1 i
+double dA2 i P2
+double dN2 i
+double dEnhet i Enhet som skal brukes i sammenligningen
+bool bErLike r Status: true = Samme koordinat
+ false = Ikke samme koordinat
+Usage:
+bSammenfallende = LC_ErLik(dA1,dN1,dA2,dN2,dEnhet);
+ ===========================================================================
+
+SK_EntPnt_FYBA bool LC_ErLik_Avrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErLik_IkkeAvrundet"NAME="LC_ErLik_IkkeAvrundet"></A><H2>LC_ErLik_IkkeAvrundet</H2>
+<BIG><I><B>Sjekk om sammenfallende punkt (uten avrunding)</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker om de to punktene er sammenfallende innen gitt nøyaktighet.
+Det skjer ingen avrunding av koordinatene før sammenligningen.
+(Avviket er mindre enn 1/10 enhet både nord og øst)
+Parameters:
+Type Name I/O Explanation
+---------------------------------------------------------------------------
+double dA1 i P1
+double dN1 i
+double dA2 i P2
+double dN2 i
+double dEnhet i Enhet som skal brukes i sammenligningen
+bool bErLike r Status: true = Samme koordinat
+ false = Ikke samme koordinat
+Usage:
+bSammenfallende = LC_ErLik(dA1,dN1,dA2,dN2,dEnhet);
+ ===========================================================================
+
+SK_EntPnt_FYBA bool LC_ErLik_IkkeAvrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErReferert"NAME="LC_ErReferert"></A><H2>LC_ErReferert</H2>
+<BIG><I><B>Sjekk om gruppe er referert</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker om aktuell gruppe er referert fra andre grupper.
+Parameters:
+Type Name I/O Explanation
+---------------------------------------------------------------------------
+bool bReferert r Det finnes referanser til gruppen
+Usage:
+bReferert = LC_ErReferert();
+===========================================================================
+
+SK_EntPnt_FYBA bool LC_ErReferert(void)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O9"NAME="O9"></A><H2>7.2 SOSI Group</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrNr"NAME="LC_GetGrNr"></A><H2>LC_GetGrNr</H2>
+<BIG><I><B>Hent gruppe-nummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter gruppenummer for aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pBgr iu Peker til gruppestruktur der gruppenummer lagres
+short status r Status UT_TRUE=OK, UT_FALSE=ingen aktuell gruppe
+Usage:
+ status = LC_GetGrNr(&Bgr)
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetGrNr(LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrPara"NAME="LC_GetGrPara"></A><H2>LC_GetGrPara</H2>
+<BIG><I><B>Hent gruppe-parametre</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter diverse opplysninger om aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+------------------------------------------------------------------------
+short *ngi u Antall linjer GINFO
+long *nko u Antall koordinater
+short *info u Diverse informasjon. En sum av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har dybde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. :n)
+ GI_OY_REF= gruppen har referanser med øy
+ GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+ GI_SLETTA = gruppen er sletta (merka som sletta)
+ GI_READ_ONLY = gruppen kan ikke endres.
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Usage:
+ gnavn = LC_GetGrPara(&ngi,&nko,&info);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetGrPara(short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrParaBgr"NAME="LC_GetGrParaBgr"></A><H2>LC_GetGrParaBgr</H2>
+<BIG><I><B>Hent gruppe-parametre for gruppe</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter diverse opplysninger om gitt gruppenummer.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_BGR * pBgr i Gruppenummer det ønskes opplysninger om.
+short *ngi u Antall linjer GINFO (0=sletta eller ulovlig nummer)
+long *nko u Antall koordinater
+unsigned short *info u Diverse informasjon. En sum av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har døbde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. :n)
+ GI_OY_REF= gruppen har referanser med øy
+ GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+ GI_SLETTA = gruppen er sletta (merka som sletta)
+ GI_READ_ONLY = gruppen kan ikke endres.
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Usage:
+ gnavn = LC_GetGrParaBgr(pBgr,&ngi,&nko,&info,&snr);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_GetGrParaBgr(LC_BGR * pBgr,short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrFi"NAME="LC_GetGrFi"></A><H2>LC_GetGrFi</H2>
+<BIG><I><B>Hent gruppe-filnr</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter peker til FilAdm for aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_FILADM * *ppFil u Peker til FilAdm-peker
+short status r UT_TRUE = OK, UT_FALSE = Ingen aktuell gruppe
+Usage:
+ status = LC_GetGrFi(&pFil);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_GetGrFi(LC_FILADM **ppFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetEndringsstatus"NAME="LC_SetEndringsstatus"></A><H2>LC_SetEndringsstatus</H2>
+<BIG><I><B>Setter endringsstatus for aktuell gruppe</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Setter endringsstatus for aktuell gruppe.
+NB! Denne rutinen bør normalt ikke brukes av vanlige klient-program!
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short sStatus i Kode for endring:
+ END_UENDRA 0 Ikke endra
+ END_KOPI 1 Endra ved totalkopi fra annen gruppe
+ END_ENDRA 2 Endra ved normal Put fra program
+Usage:
+LC_dg_SetEndringsstatus(END_KOPI);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetEndringsstatus(short sStatus)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O10"NAME="O10"></A><H2>7.3 Header, active group</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_NyttHode"NAME="LC_NyttHode"></A><H2>LC_NyttHode</H2>
+<BIG><I><B>Lager nytt hode</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn et standard SOSI-filhode i ginfo i aktuell gruppe.
+Parameters:
+ ingen
+Usage:
+ LC_NyttHode();
+==========================================================================
+
+SK_EntPnt_FYBA void LC_NyttHode(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_TestHode"NAME="LC_TestHode"></A><H2>LC_TestHode</H2>
+<BIG><I><B>Tester SOSI-hodet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker at ginfo i aktuell gruppe er et lovlig SOSI-filhode.
+Parameters:
+ Type Name I/O Explanation
+--------------------------------------------------------------------------
+ short ist r status: UT_TRUE=OK, UT_FALSE=feil
+Usage:
+ ist = LC_TestHode();
+==========================================================================
+
+SK_EntPnt_FYBA short LC_TestHode(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetOmr"NAME="LC_GetOmr"></A><H2>LC_GetOmr</H2>
+<BIG><I><B>Finner ..OMRÅDE i hodet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut område fra ginfo i aktuell gruppe.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double *nv_a u Område
+double *nv_n u
+double *oh_a u
+double *oh_n u
+short ist r status: UT_TRUE=OK, UT_FALSE=feil (navn er ikke funnet)
+Usage:
+ ist = LC_GetOmr(&nv_a,&nv_n,&oh_a,&oh_n);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetOmr(double *nv_a,double *nv_n,double *oh_a,double *oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutOmr"NAME="LC_PutOmr"></A><H2>LC_PutOmr</H2>
+<BIG><I><B>Legger inn ..OMRÅDE i hodet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn område i ginfo i aktuell gruppe.
+Hvis område ikke har noen utstrekning justeres
+dette med 1 meter i hver retning.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode av ny type.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double nv_a i Område
+double nv_n i
+double oh_a i
+double oh_n i
+short ist r status: UT_TRUE=OK, UT_FALSE=feil
+Usage:
+ ist = LC_PutOmr(nv_a,nv_n,oh_a,oh_n);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_PutOmr(double nv_a,double nv_n,double oh_a,double oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTrans"NAME="LC_GetTrans"></A><H2>LC_GetTrans</H2>
+<BIG><I><B>Finner ..TRANSPAR i hodet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut transformasjonsparametrene fra ginfo i aktuell gruppe.
+Forutsetter at aktuell gruppe er et SOSI-filhode.
+OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+ For nye programmer bør LC_GetTransEx benyttes. LC_GetTransEx er
+ kompatibel med nye versjoner av SOSI.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short *koosys u Koordinatsystem
+double *origo_a u Origo øst
+double *origo_n u Origo nord
+double *enhet u Enhet
+double *enhet_h u ...ENHET-H
+double *enhet_d u ...ENHET-D
+short ist r status: UT_TRUE=OK, UT_FALSE=feil (navn er ikke funnet)
+Usage:
+ ist = LC_GetTrans(&koosys,&origo_a,&origo_n,&enhet,&enhet_h,&enhet_d);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetTrans(short *koosys,double *origo_a,double *origo_n,double *enhet,
+ double *enhet_h,double *enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTransEx"NAME="LC_GetTransEx"></A><H2>LC_GetTransEx</H2>
+<BIG><I><B>Henter ..TRANSPAR fra hodet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut innholdet under ..TRANSPAR fra ginfo i aktuell gruppe.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+Må velge mellom KOORDSYS, TRANSSYS eller GEOSYS. Kun en av disse kan benyttes i filhodet.
+KOORDSYS er den mest vanlige måte å definere referansesystem.
+GEOKOORD skal benyttes for GEOSYS og for TRANSSYS
+Må velge mellom VERT-DATUM eller VERT-INT.
+VERT-DATUM er den mest vanlige beskrivelsesmåten.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+unsigned short *pusMaske iu [Inn] Styrer hvilke deler av TRANSPAR som skal hentes
+ [Ut] Viser hvilke deler av TRANSPAR som er funnet/hentet.
+ Følgende konstanter er definert:
+ LC_TR_ALLT - Alle deler av ..TRANSPAR hentes
+ LC_TR_KOORDSYS - Koordsys
+ LC_TR_TRANSSYS - Transsys
+ LC_TR_GEOSYS - Geosys
+ LC_TR_GEOKOORD - Geokoord
+ LC_TR_ORIGO - Origo-nø
+ LC_TR_ENHET - Enhet
+ LC_TR_ENHETH - Enhet-h
+ LC_TR_ENHETD - Enhet-d
+ LC_TR_VERTDATUM - Vert-datum
+ LC_TR_VERTINT - Vert-int
+ LC_TR_VERTDELTA - Vert-delta
+LC_TRANSPAR * pTrans iu Peker til struktur som skal motta ..TRANSPAR informasjonen.
+short sStatus r Status: UT_TRUE=OK, UT_FALSE=feil (ikke funnet).
+Usage:
+unsigned short usMaske = LC_TR_ALLT;
+LC_TRANSPAR Trans;
+ist = LC_GetTransEx(&usMaske,&Trans);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetTransEx(unsigned short *pusMaske, LC_TRANSPAR * pTrans)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTrans"NAME="LC_PutTrans"></A><H2>LC_PutTrans</H2>
+<BIG><I><B>Legger inn ..TRANSPAR i hodet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn transformasjonsparametrene i ginfo i aktuell gruppe.
+Forutsetter at aktuell gruppe er et SOSI-filhode versjon 3.x.
+OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+ For nye programmer bør LC_PutTransEx benyttes. LC_PutTransEx er
+ kompatibel med nye versjoner av SOSI.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short koosys i Koordinatsystem
+double origo_a i Origo øst
+double origo_n i Origo nord
+double enhet i Enhet
+double enhet_h i Enhet-H
+double enhet_d i Enhet-D
+short ngi r Antall GINFO-linjer etter oppdateringen.
+Usage:
+ ngi = LC_PutTrans(koosys,origo_a,origo_n,enhet,enhet_h,enhet_d);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_PutTrans(short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTransEx"NAME="LC_PutTransEx"></A><H2>LC_PutTransEx</H2>
+<BIG><I><B>Legger inn ..TRANSPAR i hodet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn innholdet under ..TRANSPAR i ginfo i aktuell gruppe.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode versjon 3.x.
+Må velge mellom KOORDSYS, TRANSSYS eller GEOSYS.
+Kun en av disse kan benyttes i filhodet.
+KOORDSYS er den mest vanlige måte å definere referansesystem.
+GEOKOORD skal benyttes for GEOSYS og for TRANSSYS
+Må velge mellom VERT-DATUM eller VERT-INT.
+VERT-DATUM er den mest vanlige beskrivelsesmåten.
+Følgende kompaktifisering brukes:
+ ..TRANSPAR
+ ...KOORDSYS <SYSKODE> <DATUM> <PROJEK>
+ ...TRANSSYS <TILSYS> <KONSTA1> <KONSTB1> <KONSTA2> <KONSTB2> <KONSTC1> <KONSTC2>
+ ...GEOSYS <GEO-DATUM> <GEO-PROJ> <GEO-SONE>
+ ...GEOKOORD <GEOKOORD>
+ ...ORIGO-NØ <ORIGO-N> <ORIGO-Ø>
+ ...ENHET <ENHET>
+ ...ENHET-H <ENHET-H>
+ ...ENHET-D <ENHET-D>
+ ...VERT-DATUM <HØYDE-REF> <DYBDE-REF> <FRISEIL-REF> <HØYDE-TYPE>
+ ...VERT-INT <H-REF-INT> <D-REF-INT> <F-REF-INT>
+ ...VERT-DELTA <V-DELTA-MIN> <V-DELTA-MAX>
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+unsigned short usMaske i Maske som styrer hvilke deler av TRANSPAR som brukt
+ Følgende konstanter er definert:
+ LC_TR_KOORDSYS - Koordsys
+ LC_TR_TRANSSYS - Transsys
+ LC_TR_GEOSYS - Geosys
+ LC_TR_GEOKOORD - Geokoord
+ LC_TR_ORIGO - Origo-nø
+ LC_TR_ENHET - Enhet
+ LC_TR_ENHETH - Enhet-h
+ LC_TR_ENHETD - Enhet-d
+ LC_TR_VERTDATUM - Vert-datum
+ LC_TR_VERTINT - Vert-int
+ LC_TR_VERTDELTA - Vert-delta
+LC_TRANSPAR * pTrans i Peker til struktur med ..TRANSPAR informasjonen.
+short ngi r Antall GINFO-linjer etter oppdateringen.
+Usage:
+LC_TRANSPAR Trans;
+unsigned short usMaske = LC_TR_KOORDSYS | LC_TR_ORIGO | LC_TR_ENHET;
+Trans.sKoordsys = 32;
+Trans.dOrigoAust = 0.0;
+Trans.dOrigoNord = 0.0;
+Trans.dEnhet = 1.0;
+ngi = LC_PutTransEx(usMaske,&Trans);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_PutTransEx(unsigned short usMaske, LC_TRANSPAR * pTrans)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O11"NAME="O11"></A><H2>7.4 Header, directly from SOSI-file</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_New"NAME="HO_New"></A><H2>HO_New</H2>
+<BIG><I><B>Lager nytt hode</I></B></BIG><PRE>
+ =========================================================================
+Purpose:
+Genererer et nytt SOSI-filhode.
+Hvis område ikke har noen utstrekning justeres
+dette med 1 meter i hver retning.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short koosys i Koordinatsystem
+double origo_a i Origo øst
+double origo_n i Origo nord
+double enhet i Enhet
+double enhet_h i Enhet-H
+double enhet_d i Enhet-D
+double nv_a i Område: Nedre venstre hjørne
+double nv_n i
+double oh_a i Øvre høyre hjørne
+double oh_n i
+short sStatus r Status: UT_TRUE = Funnet
+ UT_FALSE = Ikke funnet
+Usage:
+sStatus = HO_New(fil,koosys,origo_a,origo_n,enhet,enhet_h-enhet_d,
+ nv_a,nv_n,oh_a,oh_n);
+=============================================================================
+
+SK_EntPnt_FYBA short HO_New(const char *pszFil,short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_TestSOSI"NAME="HO_TestSOSI"></A><H2>HO_TestSOSI</H2>
+<BIG><I><B>Tester SOSI-filen</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Sjekker at filen er en SOSI-fil, og finner posisjonen for .SLUTT.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+UT_INT64 *sluttpos u Posisjon for .SLUTT
+short ist r Status: UT_TRUE = OK
+ UT_FALSE = feil
+Usage:
+ ist = HO_TestSOSI(pszFil,&sluttpos);
+=============================================================================
+
+SK_EntPnt_FYBA short HO_TestSOSI(const char *pszFil,UT_INT64 *sluttpos)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetKvalitet"NAME="HO_GetKvalitet"></A><H2>HO_GetKvalitet</H2>
+<BIG><I><B>Finner kvalitetsopplysninger</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Finne kvalitetsopplysninger i filhode.
+(Ikke aktuellt etter SOSI v. 4.00.)
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short *psMetode u Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+long *pLNnoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+short *psSynbarhet u Synbarhet i bilde
+ KVAL_SYN_UNDEF synbarhet er udefinert.
+short *psHoydeMetode u Hvordan høyden er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+long *plHoydeNoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+short ist r Statusvariabel: UT_TRUE - OK, ..KVALITET er funnet
+ UT_FALSE - ikke funnet
+Usage:
+ ist = HO_GetKvalitet(fil,&sMetode,&lNoyaktighet,&sSynbarhet,
+ &sHoydeMetode,&lHoydeNoyaktighet);
+=============================================================================
+
+SK_EntPnt_FYBA short HO_GetKvalitet(const char *pszFil,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetTegnsett"NAME="HO_GetTegnsett"></A><H2>HO_GetTegnsett</H2>
+<BIG><I><B>Finner tegnsett</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finne tegnsett i filhodet.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short *psTegnsett u Tegnsett, konstanter definert:
+ TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+ TS_ND7 = Norsk Data 7-bits
+ TS_DECM8 = DEC multinasjonal 8-bits
+ TS_ISO8859 = ISO8859-10 Norsk/samisk tegnsett
+ TS_DECN7 = DEC norsk 7-bits
+short sStatus r Status: UT_TRUE = Funnet
+ UT_FALSE = Ikke funnet
+Usage:
+ sStatus = HO_GetTegnsett(pszFil,&sTegnsett);
+==========================================================================
+
+SK_EntPnt_FYBA short HO_GetTegnsett(const char *pszFil,short *psTegnsett)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetVal"NAME="HO_GetVal"></A><H2>HO_GetVal</H2>
+<BIG><I><B>Finn verdien til et SOSI-navn</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter parametrene til et SOSI-navn.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+char *sosi_navn i SOSI-navn det skal finnes verdi til
+short *sett_nr i/u i: "Sett nummer"(linjenummer) for start søking (min 1)
+ u: Ved tilslag returneres "Sett nummer" for
+ tilslaget.
+char *para_peker r Peker til parameter-streng avslutta med '/0'.
+ Hvis SOSI-navnet ikke er funnet returneres NULL.
+Usage:
+para_peker = HO_GetVal(fil,sosi_navn,&sett_nr);
+ =============================================================================
+
+SK_EntPnt_FYBA char *HO_GetVal(const char *pszFil,char *sosi_navn,short *sett_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetTrans"NAME="HO_GetTrans"></A><H2>HO_GetTrans</H2>
+<BIG><I><B>Finner .TRANSPAR i hodet</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter transformasjonsparametrene fra filhodet.
+OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+ For nye programmer bør HO_GetTransEx benyttes. HO_GetTransEx er
+ kompatibel med nye versjoner av SOSI.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short *koosys u Koordinatsystem
+double *origo_a u ..ORIGO-AUST
+double *origo_n u ..ORIGO-NORD
+double *enhet u ...ENHET
+double *enhet_h u ...ENHET-H
+double *enhet_d u ...ENHET-D
+short sStatus r UT_TRUE, eller UT_FALSE.
+Usage:
+sStatus = HO_GetTrans(fil,&koosys,&origo_a,&origo_n,&enhet,&enhet_h,&enhet_d);
+ =============================================================================
+
+SK_EntPnt_FYBA short HO_GetTrans(const char *pszFil,short *koosys,double *origo_a,
+ double *origo_n,double *enhet,double *enhet_h,double *enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetTransEx"NAME="HO_GetTransEx"></A><H2>HO_GetTransEx</H2>
+<BIG><I><B>Finner .TRANSPAR i hodet</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter ut innholdet under ..TRANSPAR fra fra filhodet.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+unsigned short *pusMaske iu [Inn] Styrer hvilke deler av TRANSPAR som skal hentes
+ [Ut] Viser hvilke deler av TRANSPAR som er funnet/hentet.
+ Følgende konstanter er definert:
+ LC_TR_ALLT - Alle deler av ..TRANSPAR hentes
+ LC_TR_KOORDSYS - Koordsys
+ LC_TR_TRANSSYS - Transsys
+ LC_TR_GEOSYS - Geosys
+ LC_TR_GEOKOORD - Geokoord
+ LC_TR_ORIGO - Origo-nø
+ LC_TR_ENHET - Enhet
+ LC_TR_ENHETH - Enhet-h
+ LC_TR_ENHETD - Enhet-d
+ LC_TR_VERTDATUM - Vert-datum
+ LC_TR_VERTINT - Vert-int
+ LC_TR_VERTDELTA - Vert-delta
+LC_TRANSPAR * pTrans iu Peker til struktur som skal motta ..TRANSPAR informasjonen.
+short sStatus r Status: UT_TRUE=OK, UT_FALSE=feil (ikke funnet).
+Usage:
+unsigned short usMaske = LC_TR_ALLT;
+LC_TRANSPAR Trans;
+ist = HO_GetTransEx("Test.sos",&usMaske,&Trans);
+==========================================================================
+
+SK_EntPnt_FYBA short HO_GetTransEx(const char *pszFil,unsigned short *pusMaske, LC_TRANSPAR * pTrans)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetOmr"NAME="HO_GetOmr"></A><H2>HO_GetOmr</H2>
+<BIG><I><B>Finner ..OMRÅDE i hodet</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter områdeangivelsen fra filhodet.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+double *nv_a u
+double *nv_n u
+double *oh_a u
+double *oh_n u
+short sStatus r UT_TRUE, eller UT_FALSE.
+Usage:
+sStatus = HO_GetOmr(pszFil,&nv_a,&nv_n,&oh_a,&oh_n);
+ =============================================================================
+
+SK_EntPnt_FYBA short HO_GetOmr(const char * pszFil,double *nv_a,double *nv_n,double *oh_a,double *oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_SjekkTegnsett"NAME="HO_SjekkTegnsett"></A><H2>HO_SjekkTegnsett</H2>
+<BIG><I><B>Sjekker tegnsett på SOSI-filen</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Sjekker faktisk tegnsett i .HODE.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short *psTegnsett u Tegnsett, konstanter definert:
+ TS_UKJENT = Fikk ikke sjekket tegnsett
+ TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+ TS_ND7 = Norsk Data 7-bits
+ TS_DECM8 = DEC multinasjonal 8-bits
+ TS_ISO8859 = ISO8859-10 Norsk/samisk tegnsett
+ TS_DECN7 = DEC norsk 7-bits
+short sStatus r Status: 0 = Ikke funnet
+ 1 = Ett tegnsett funnet
+ 2 = Flere tegnsett funnet
+Usage:
+ sStatus = HO_SjekkTegnsett(fpek,tegnsett);
+=============================================================================
+
+SK_EntPnt_FYBA short HO_SjekkTegnsett(const char *pszFil,short *psTegnsett)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O12"NAME="O12"></A><H1>8 New Group</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_NyGr"NAME="LC_NyGr"></A><H2>LC_NyGr</H2>
+<BIG><I><B>Ny gruppe i basen</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Lager en ny gruppe i basen, og tildeler serienummer.
+Sjekker at gruppenavnet er lovlig i denne versjon av FYBA.
+Ved feil navn vil ".LINJE" bli valgt.
+Legger inn gruppenavn i buffer.
+Gruppen blir "aktuell" gruppe.
+Sjekker ledig plass både for indeks-fil og sosi-fil.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+char *sosi i Gruppenavn (Eks. ".KURVE")
+LC_BGR * pBgr iu Tildelt gruppenummer i basen
+ (Bgr.lNr=INGEN_GRUPPE = Feil, ikke oppretta)
+long snr u Tildelt serienummer
+gnavn short r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+ INGEN_GRUPPE hvis det ikke er opprettet noen ny gruppe.
+Usage:
+gnavn = LC_NyGr (pFil,sosi,&Bgr,&snr);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_NyGr (LC_FILADM *pFil,char *sosi,LC_BGR * pBgr,long *snr)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O13"NAME="O13"></A><H1>9 Direct Read/Write</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_RxGr"NAME="LC_RxGr"></A><H2>LC_RxGr</H2>
+<BIG><I><B>Les gruppe fra base</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Velger en gruppe som aktiv gruppe, og leser den fra SOSI-filen hvis den
+ikke er i RB fra før. (Styres også av les_sosi.)
+Hvis gruppen ikke finnes (sletta eller ulovlig gruppenummer) returneres
+ngi=0 og nko=0.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pBgr i Peker til fil- og gruppenummer.
+short les_sosi i Lesemetode: Følgende konstanter er definert:
+ LES_OPTIMALT (0 = Les mest effektivt base/SOSI)
+ LES_SOSI (1 = Les alltid fra SOSI-filen)
+short *ngi u Antall linjer GINFO
+long *nko u Antall koordinater
+unsigned short *info u Diverse informasjon. En sum av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har dybde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. eller ..REF)
+ GI_OY_REF = gruppen har referanser med øy
+ GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+ GI_SLETTA = gruppen er sletta (merka som sletta)
+ GI_READ_ONLY = gruppen kan ikke endres.
+short gnavn r Gruppenavn - Følgende konstanter er definert:
+ INGEN_GRUPPE = Gruppen finnes ikke, ikke lest.
+ L_SLUTT = (.SLUTT)
+ L_PUNKT = (.PUNKT)
+ L_LINJE = (.LINJE)
+ L_KURVE = (.KURVE)
+ L_BUE = (.BUE)
+ L_BUEP = (.BUEP)
+ L_SIRKEL = (.SIRKEL)
+ L_SIRKELP = (.SIRKELP)
+ L_KLOTOIDE = (.KLOTOIDE)
+ L_SVERM = (.SVERM)
+ L_TEKST = (.TEKST)
+ L_TRASE = (.TRASE)
+ L_FLATE = (.FLATE)
+ L_BEZIER = (.BEZIER)
+ L_RASTER = (.RASTER)
+ L_DEF = (.DEF)
+ L_OBJDEF = (.OBJDEF)
+ L_MLINJE = (.MLINJE)
+ L_STRUKTUR = (.STRUKTUR)
+ L_OBJEKT = (.OBJEKT)
+ L_SYMBOL = (.SYMBOL)
+ L_HODE = (.HODE)
+
+Usage:
+ gnavn = LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (info & GI_PINFO) (gruppen har PINFO)
+ ;
+ if (info & GI_KP) (gruppen har KP)
+ ;
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_RxGr(LC_BGR * pBgr,short les_sosi,short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_WxGr"NAME="LC_WxGr"></A><H2>LC_WxGr</H2>
+<BIG><I><B>Skriv gruppe til base</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Skriver aktuell gruppe til tilhørende SOSI-fil.
+Brukerindeks og geografisk indeks oppdateres straks, uavhengig av kø.
+Ledig plass fram til neste gruppe blir blanket.
+Filhode blir ALLTID skrevet direkte til SOSI-filen.
+Parameters:
+Type Name I/O Explanation
+------------------------------------------------------------------------
+short k_stat i Skrivemetode: Følgende konstanter er definert:
+ SKRIV_OPTIMALT = Skriv mest effektivt kø/SOSI
+ SKRIV_SOSI = Skriv direkte til SOSI-filen
+short status r Status: UT_TRUE = OK
+ UT_FALSE = Ikke utført, pga. feil.
+Usage:
+LC_WxGr(k_stat)
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_WxGr(short k_stat)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O14"NAME="O14"></A><H1>10 Sequential Read/Write</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_RsGr"NAME="LC_RsGr"></A><H2>LC_RsGr</H2>
+<BIG><I><B>Les gruppe sekvensielt</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Leser en datagruppe fra ekstern SOSI-fil inn i aktuell gruppe i ringbuffer.
+Rutinen tilsvarer put fra brukerprogram inn i ringbufferet, men rutinen
+tildeler selv nødvendig plass..
+Gruppen beholder serienummer tildelt i LC_NyGr.
+Brukerindeks og geografisk-indeks blir ikke oppdatert.
+(Dette skjer først når gruppen skrives til basen.)
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short *rstat iu Lesestatus
+ Inn: 1=Les fra starten, 0=Les neste
+ Ut: 0=OK, -1=slutten av filen er nådd
+LC_FILADM *pFil i Peker til FilAdm
+short *ngi u Antall linjer GINFO
+long *nko u Antall koordinater
+unsigned short *info u Diverse informasjon. En "sum" av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har dybde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. eller ..REF)
+ GI_OY_REF = gruppen har referanser med øy
+ GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+ GI_SLETTA = gruppen er sletta (merka som sletta)
+ GI_READ_ONLY = gruppen kan ikke endres.
+long gml_snr u Serienummer gruppen hadde på ekstern fil
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Usage:
+ gnavn = LC_RsGr(&rstat,pFil,&ngi,&nko,&info,&gml_snr);
+ if (info & GI_PINFO) (gruppen har PINFO)
+ ;
+ if (info & GI_KP) (gruppen har KP)
+ ;
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_RsGr(short *rstat,LC_FILADM *pFil,short *ngi,long *nko,
+ unsigned short *info,long *gml_snr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_RsHode"NAME="LC_RsHode"></A><H2>LC_RsHode</H2>
+<BIG><I><B>Les filhode sekvensiellt</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Leser et filhode fra ekstern SOSI-fil inn i aktuell gruppe i ringbuffer.
+Rutinen tilsvarer put fra brukerprogram inn i ringbufret, men rutinen
+tildeler selv nødvendig plass i RB.
+Denne rutinen er stort sett lik LC_RsGr, men LC_RsHode forandrer
+ikke aktuell filposisjon på den sekvensielle filen.
+Gruppen beholder serienummer hodet hadde på SOSI-filen.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+short *ngi u Antall linjer GINFO
+long *nko u Antall koordinater
+unsigned short *info u Diverse informasjon. En "sum" av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har dybde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. :n)
+ GI_OY_REF= gruppen har referanser med øy
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Usage:
+ gnavn = LC_RsHode(pFil,&ngi,&nko,&info);
+ =============================================================================
+
+short LC_RsHode(LC_FILADM *pFil,short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_WsGr"NAME="LC_WsGr"></A><H2>LC_WsGr</H2>
+<BIG><I><B>Skriv gruppe sekvensiellt</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Skriver aktuell gruppe til ekstern, sekvensiell SOSI-fil.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+Usage:
+LC_WsGr(pFil);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_WsGr(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_WsGrPart"NAME="LC_WsGrPart"></A><H2>LC_WsGrPart</H2>
+<BIG><I><B>Skriv del av gruppe sekvensiellt</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Skriver en del av aktuell gruppe til ekstern, sekvensiell SOSI-fil.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+long fra_punkt i Punktnummer for første koordinat som skal skrives.
+ (Lovlig: 1 <= fra_punkt <= nko)
+long antall i Antall koordinatlinjer som skal skrives.
+ (Lovlig: 0 <= antall <= nko)
+Usage:
+LC_WsGrPart(pFil,fra_punkt,antall);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_WsGrPart(LC_FILADM *pFil,long fra_punkt,long antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_EndreHode"NAME="LC_EndreHode"></A><H2>LC_EndreHode</H2>
+<BIG><I><B>Endre hodet på eksisterende SOSI-fil</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Skriver aktuell gruppe til starten av sekvensiell SOSI-fil.
+Det er en forutsetning at aktuell gruppe er et filhode.
+Denne rutinen er stort sett lik LC_WsGr, men LC_EndreHode forandrer ikke
+aktuell filposisjon på den sekvensielle filen.
+OBS!
+Det må være nok ledig plass før neste gruppe for tilbakeskrivingen.
+Det er ikke mulig å forandre koordinatsystem, enhet eller origo på fil
+som inneholder data.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+short oppdatert r Skrivestatus (1=OK, 0=Det er ikke plass
+ til å skrive hodet)
+Usage:
+ist = LC_EndreHode(pFil);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_EndreHode(LC_FILADM *pFil)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O15"NAME="O15"></A><H1>11 Delete Group</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelGr"NAME="LC_DelGr"></A><H2>LC_DelGr</H2>
+<BIG><I><B>Slett gruppe</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Fjerner aktuell gruppe fra basen.
+Grupper som er tatt ut fra NGIS for oppdatering blir ikke sletta fra
+SOSI-filen, men de blir merka som sletta. (LC_SetNgisModus avgjør da om
+disse kan leses.)
+Det er ikke mulig å slette grupper fra sekvensielle filer, eller grupper
+som er brukt i flater.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short sStatus r Status: UT_TRUE = OK
+ UT_FALSE = feil, ikke sletta
+Usage:
+sStatus = LC_DelGr();
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_DelGr(void)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O16"NAME="O16"></A><H1>12 Storing Back the Buffered Info to a SOSI File</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Save"NAME="LC_Save"></A><H2>LC_Save</H2>
+<BIG><I><B>Tøm skrivekøa</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Skriver gruppene som ligger i skrivekø ut til SOSI-fil.
+Parameters: ingen
+Usage:
+LC_Save();
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_Save(void)
+</PRE>
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O17"NAME="O17"></A><H1>13 Reserve Space in the Ring Buffer</H1>
+</PRE>
+These are functions to allocate space for Ginfo/coordinates in the
+ring buffer, and they must be called before data is added to the
+ring buffer with functions such as LC_PuGi and LC_PuTK
+
+ Note: The active data group must first be read/selected with the
+ functions LC_RxGr or LC_NyGr
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InsGiL"NAME="LC_InsGiL"></A><H2>LC_InsGiL</H2>
+<BIG><I><B>Skyt inn GINFO-linjer</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Skyter inn linjer GINFO-delen i en gruppe.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short linje i Linjenummer linjen skal skytes inn forran.
+ (Lovlig: 1 til ngi+1)
+short antall i Antall linjer som skal skytest inn.
+short ngi r Antall GINFO-linjer i gruppen etter innskuddet.
+Usage:
+ngi = LC_InsGiL(linje, antall);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_InsGiL(short linje, short antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_AppGiL"NAME="LC_AppGiL"></A><H2>LC_AppGiL</H2>
+<BIG><I><B>Heng på en GINFO-linje</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henger på en linje i GINFO-delen i en gruppe.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short ngi r Antall GINFO-linjer i gruppen etter utvidelsen.
+ (Linjenumret på den tilføyde linjen.)
+Usage:
+ngi = LC_AppGiL();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_AppGiL()
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InsKoL"NAME="LC_InsKoL"></A><H2>LC_InsKoL</H2>
+<BIG><I><B>Skyt inn koordinatlinjer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Skyter inn linjer koordinatdelen i en gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long linje i Linjenummer linjen skal skytes inn forran.
+ (Lovlig: 1 til nko+1)
+long antall i Antall linjer som skal skytest inn.
+long nko r Antall koordinater i gruppen etter innskuddet.
+Usage:
+nko = LC_InsKoL(linje, antall);
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_InsKoL(long linje, long antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_AppKoL"NAME="LC_AppKoL"></A><H2>LC_AppKoL</H2>
+<BIG><I><B>Heng på en koordinatlinje</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henger på en linje i koordinatdelen i en gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long nko r Antall koordinater i gruppen etter utvidelsen.
+Usage:
+nko = LC_AppKoL();
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_AppKoL()
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelGiL"NAME="LC_DelGiL"></A><H2>LC_DelGiL</H2>
+<BIG><I><B>Fjern GINFO-linjer</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Fjerner linjer i GINFO-delen i en gruppe.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short linje i Første linjenummer som skal fjernes.
+ (Lovlig: 2 til ngi)
+short antall i Antall linjer som skal fjernes.
+short ngi r Antall GINFO-linjer i gruppen etter setting.
+Usage:
+ngi = LC_DelGiL(linje, antall);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_DelGiL(short linje, short antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelKoL"NAME="LC_DelKoL"></A><H2>LC_DelKoL</H2>
+<BIG><I><B>Fjern koordinatlinjer</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Fjerner linjer koordinatdelen i en gruppe.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+long linje i Første linje som skal fjernes.
+ (Lovlig: 1 til nko)
+long antall i Antall linjer som skal fjernes.(Max resten av gruppen)
+long nko r Antall koordinater i gruppen etter blanking.
+Usage:
+nko = LC_DelKoL(linje, antall);
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_DelKoL(long linje, long antall)
+</PRE>
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O18"NAME="O18"></A><H1>14 Add Data to the Ring Buffer</H1>
+</PRE>
+These are functions to add data to the ring buffer.
+The functions interact with the current data group.
+It is assumed that there is allocated place with the functions in the
+previous chapter.
+(LC_AppGiL,LC_InsGiL,LC_AppKoL,LC_InsKoL)
+
+Note: After having added all the desired data, it is required to save
+ the data with LC_WxGr.
+
+<BR>
+<BR>
+<BR>
+<A ID="O19"NAME="O19"></A><H2>14.1 Copying group</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CopyGr"NAME="LC_CopyGr"></A><H2>LC_CopyGr</H2>
+<BIG><I><B>Kopier gruppe</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Kopierer fra en annen gruppe inn i aktuell gruppe i buffer.
+Rutinen tilsvarer put fra brukerprogram inn i bufret, men rutinen
+tildeler selv nødvendig plass.
+Gruppen beholder serienummer tildelt i LC_NyGr.
+Geografisk-indeks blir ikke oppdatert før gruppen skrives til basen.
+Enhet blir oppdatert slik at opprinnelig enhet blir bevart. Om nødvendig
+legges det inn ..ENHET i GINFO.
+Kvalitet og dato blir oppdatert hvis SOSI-VERSJON < 4.00.
+Hvis det er filhode som kopieres skjer det ingen endring av egenskaper.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR *pBgr i Gruppenummer det skal kopieres fra.
+short ngis i Behandling for ..NGIS-FLAGG:
+ OPPDATER_NGIS (0) = ..NGIS-FLAGG oppdateres i henhold
+ til hodet i filen det kopieres til.
+ BEVAR_NGIS (1) = ..NGIS-FLAGG bevares uforandret i kopien
+short ngi u Antall linjer GINFO
+long nko u Antall koordinater
+unsigned short info u Diverse informasjon. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Usage:
+ gnavn = LC_CopyGr(&Bgr,ngis,&ngi,&nko,&info)
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_CopyGr (LC_BGR * pBgr,short ngis,short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CopyCoord"NAME="LC_CopyCoord"></A><H2>LC_CopyCoord</H2>
+<BIG><I><B>Kopier koordinater fra annen gruppe</I></B></BIG><PRE>
+===========================================================================
+Purpose:
+Kopierer koordinater fra en annen gruppe inn i aktuell gruppe i ringbuffer.
+De kopierte koordinatene kommer som en utvidelse av gruppen.
+Rutinen tilsvarer put fra brukerprogram inn i ringbufret, men rutinen
+tildeler selv nødvendig plass i RB.
+Geografisk-indeks blir ikke oppdatert før gruppen skrives til basen.
+Kvalitet og enhet blir automatisk oppdatert slik at gruppene ikke
+mister informasjon.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_BGR *pBgr i Gruppenummer det skal kopieres fra.
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+long til_linje i Linjenummer linjen skal skytes inn forran.
+ (Lovlig: 1 til nko+1)
+short ngi u Antall GINFO-linjer
+long nko u Antall koordinater
+short info u Diverse informasjon. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+short sStatus r Status: UT_TRUE=OK, UT_FALSE=ikke utført.
+Usage:
+sStatus = LC_CopyCoord(bgr,retning,til_linje,&ngi,&nko,&info);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_CopyCoord(LC_BGR * pBgr,short retning,long til_linje,short *ngi,
+ long *nko,unsigned short *info)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O20"NAME="O20"></A><H2>14.2 Group Information</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutGi"NAME="LC_PutGi"></A><H2>LC_PutGi</H2>
+<BIG><I><B>Put GINFO-linje</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn GINFO-linje rent generellt.
+Dette omfatter også nytt gruppenavn (GINFO-linje 1)
+Ønsker du å endre serienummer må LC_PutSn benyttes.
+Referansenummer legges inn med LC_PutRef.
+Blanke på starten og slutten blir skrella vekk, og SOSI-navnet blir
+konvertert til "store" bokstaver, .ellers lagres det slik det er.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short lin_nr i Linjenummer i GINFO (1 er første linje)
+char *ginfo i GINFO-streng avslutta med '/0'
+Usage:
+LC_PutGi(lin_nr,ginfo);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutGi(short lin_nr, const char *pszGinfo)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutGP"NAME="LC_PutGP"></A><H2>LC_PutGP</H2>
+<BIG><I><B>Put GINFO-parameter</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn et SOSI-navn med verdi.
+Denne rutinen kan brukes til å legge inn ginfo med nytt SOSI-navn.
+Rutinen kan endre antall ginfo-linjer.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char sosi_navn i Sosi-navn det skal legges inn verdi til
+char verdi i Streng som skal legges inn.
+short *linje_nr u Linjenummer for endringen.
+short ngi r Ant. ginfo-linjer etter endringen.
+Usage:
+ngi = LC_PutGP(sosi_navn,verdi,&linje_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PutGP(const char *sosi_navn,const char *verdi,short *linje_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_AppGP"NAME="LC_AppGP"></A><H2>LC_AppGP</H2>
+<BIG><I><B>Legg til GINFO-parameter</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger til et SOSI-navn med verdi i GINFO.
+Lik LC_PutGP, men legger alltid til ny linje i ginfo.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char sosi_navn i Sosi-navn det skal legges inn verdi til
+char verdi i Streng som skal legges inn.
+short *linje_nr u Linjenummer for endringen.
+short ngi r Ant. ginfo-linjer etter endringen.
+Usage:
+ngi = LC_AppGP(sosi_navn,verdi,&linje_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_AppGP(const char *sosi_navn,const char *verdi,short *linje_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UpdateGP"NAME="LC_UpdateGP"></A><H2>LC_UpdateGP</H2>
+<BIG><I><B>Endre GINFO-parameter</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn parametren til et SOSI-navn.
+Rutinen handterer at det er flere SOSI-navn på samme linje.
+OBS! Denne rutinen kan ikke brukes til å legge inn nytt SOSI-navn.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short linje_nr i Linjenummer som skal endres.
+char sosi_navn i Sosi-navn det skal legges inn verdi til
+char verdi i Streng som skall legges inn
+short ist r 1=ok, 0=navnet er ikke funnet
+Usage:
+ist = LC_UpdateGP(linje_nr,sosi_navn,verdi);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_UpdateGP(short linje_nr,const char *sosi_navn,const char *verdi)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UpdateGiEnhet"NAME="LC_UpdateGiEnhet"></A><H2>LC_UpdateGiEnhet</H2>
+<BIG><I><B>Oppdater ..ENHET i GINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Setter koordinat-enhet for gruppen.
+Oppdaterer ..ENHET / ..ENHET-H / ..ENHET-D i GINFO.
+Rutinen handterer selv tildeling eller sletting av GINFO-linje.
+Hvis verdien er lik filhodets verdi blir det ikke lagt inn verdi i GINFO.
+Enhet = 0.0 = bruk filhodets enhet, og fører til at det ikke legges inn
+i GINFO. Eventuell eksisterende linje jgernes.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til FilAdm
+double enhet i Grunnriss-enhet
+double enhet_h i Høyde-enhet
+double enhet_d i Dybde-enhet
+ngi short r Antall GINFO-linjer etter oppdatering
+Usage:
+ngi = LC_UpdateGiEnhet(pFil,enhet,enhet_h,enhet_d);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_UpdateGiEnhet(LC_FILADM *pFil,double enhet,double enhet_h,double enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UpdateGiKvalitet"NAME="LC_UpdateGiKvalitet"></A><H2>LC_UpdateGiKvalitet</H2>
+<BIG><I><B>Oppdaterer ..KVALITET i Ginfo</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Oppdaterer GINFO med ..KVALITET
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+Parameters:
+LC_FILADM *pFil i Peker til FilAdm for sosifil kvalitet skal
+ testes mot.
+short sMetode i Metode i ..KVALITET
+long lNoyaktighet i Nøyaktighet i ..KVALITET
+short sSynbarhet i Synbarhet i ..KVALITET
+short sHoydeMetode i HøydeMetode i ..KVALITET
+long lHoydeNoyaktighet i HøydeNøyaktighet i ..KVALITET
+short ngi r Antall linjer i ginfo.
+Usage:
+ ngi = LC_UpdateGiKvalitet(pFil,sMetode,lNoyaktighet,sSynbarhet,
+ sHoydeMetode,lHoydeNoyaktighet);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_UpdateGiKvalitet(LC_FILADM *pFil,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UpdatePiKvalitet"NAME="LC_UpdatePiKvalitet"></A><H2>LC_UpdatePiKvalitet</H2>
+<BIG><I><B>Oppdaterer ...KVALITET i Pinfo</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Oppdaterer PINFO med ...KVALITET
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til FilAdm for sosifil kvalitet
+ skal testes mot.
+long pnr i Punktnummer som skal oppdateres.
+short sMetode i Metode i ..KVALITET
+long lNoyaktighet i Nøyaktighet i ..KVALITET
+short sSynbarhet i Synbarhet i ..KVALITET
+short sHoydeMetode i HøydeMetode i ..KVALITET
+long lHoydeNoyaktighet i HøydeNøyaktighet i ..KVALITET
+short sStatus r UT_TRUE = OK,
+ UT_FALSE = ikke utført (for lite plass tilgjengelig)
+Usage:
+sStatus = LC_UpdatePiKvalitet(pFil,pnr,sMetode,lNoyaktighet,sSynbarhet,
+ sHoydeMetode,lHoydeNoyaktighet)
+==========================================================================
+
+SK_EntPnt_FYBA short LC_UpdatePiKvalitet(LC_FILADM *pFil,long pnr,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_OppdaterEndret"NAME="LC_OppdaterEndret"></A><H2>LC_OppdaterEndret</H2>
+<BIG><I><B>Oppdater ..NGIS-FLAGG</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Oppdaterer ..NGIS-FLAGG i GINFO og ajourfører interne tabeller.
+Hvis endring = O_GINFO oppateres tabellene i forhold til
+eksisterende GINFO.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+endring short i Kode for endring:
+ O_GINFO (0) = Oppdater interne tabeller i fht. GINFO
+ O_ENDRET (1) = Merk for endret og oppdat. tab.
+ O_SLETTET (2) = Merk for slettet og oppdat. tab.
+Usage:
+LC_OppdaterEndret(O_ENDRET);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_OppdaterEndret(short endring)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelGiName"NAME="LC_DelGiName"></A><H2>LC_DelGiName</H2>
+<BIG><I><B>Fjerner egenskap fra GINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Fjerner alle forekomster av gitt egenskap (SOSI-navn) fra GINFO.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char *pszEgenskapName i SOSI-navn som skal slettes
+short ngi r Antall GINFO-linjer i gruppen etter setting
+Usage:
+ngi = LC_DelGiName("..RADIUS");
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_DelGiName(char *pszEgenskapName)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FinnNivo"NAME="LC_FinnNivo"></A><H2>LC_FinnNivo</H2>
+<BIG><I><B>Beregn nivå</I></B></BIG><PRE>
+==============================================================
+Purpose:
+Teller antall prikker i starten på egenskapsnavn.
+PARAMETERLISTE:
+Type Name I/O Merknad
+-------------------------------------------------------------
+char *pszGinfo i Streng med egenskapsnavn i starten
+short sNivo r Antall prikker
+Usage:
+sNivo = LC_FinnNivo(pszGinfo);
+ ================================================================
+
+SK_EntPnt_FYBA short LC_FinnNivo(const char * pszName)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O21"NAME="O21"></A><H2>14.3 Serial Number and Reference Number</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutSn"NAME="LC_PutSn"></A><H2>LC_PutSn</H2>
+<BIG><I><B>Put Serienummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn nytt serienummer på aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long snr i Serienummer
+Usage:
+LC_PutSn(snr);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutSn(long snr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutRef"NAME="LC_PutRef"></A><H2>LC_PutRef</H2>
+<BIG><I><B>Legger inn referanser i GINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn et array med referanser til GINFO i aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long ref_array i Gruppenummer for refererte grupper.
+ Start øy, og slutt øy angis ved fiktive gruppenr.
+ Følgende konstanter er definert:
+ START_OY = 9999999L = Start øy.
+ SLUTT_OY = -9999999L = Slutt øy.
+long ant_ref i Antall linjer i ref_array.
+short *ngi r Antall linjer GINFO
+Usage:
+ ngi = LC_PutRef(ref_array,ant_ref);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_PutRef(long *ref_array,long ant_ref)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O22"NAME="O22"></A><H2>14.4 Coordinates</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTK"NAME="LC_PutTK"></A><H2>LC_PutTK</H2>
+<BIG><I><B>Put koordinat</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn et punkts koordinater (n,ø) i meter i terreng
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double aust i Øst-koordinat i meter i terreng
+double nord i Nord-koordinat i meter i terreng
+Usage:
+LC_PutTK(punkt_nr,aust,nord);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutTK(long punkt_nr,double aust,double nord)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTH"NAME="LC_PutTH"></A><H2>LC_PutTH</H2>
+<BIG><I><B>Put høyde</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn et punkts høyde i meter i terreng
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double hoyde i Høyde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har høydeverdi.
+Usage:
+LC_PutTH(punkt_nr,hoyde);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutTH(long punkt_nr, double hoyde)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTD"NAME="LC_PutTD"></A><H2>LC_PutTD</H2>
+<BIG><I><B>Put dybde</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn et punkts dybde i meter i terreng
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double hoyde i Dybde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har dybdeverdi.
+Usage:
+LC_PutTD(punkt_nr,dybde);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutTD(long punkt_nr, double dybde)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O23"NAME="O23"></A><H2>14.5 Connection Nodes</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutKp"NAME="LC_PutKp"></A><H2>LC_PutKp</H2>
+<BIG><I><B>Put knutepunkt</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn knutepunktverdi i punktet. Ny verdi skrives over eksisterende
+verdi. (Multiple KP er ikke mulig.)
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+short kp i Knutepunkt (lovlig verdi 0 - SHRT_MAX)
+ kp == 0 fjerner knutepunkt.
+Usage:
+LC_PutKp(punkt_nr,kp);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutKp(long punkt_nr, short kp)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O24"NAME="O24"></A><H2>14.6 Node information</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutPi"NAME="LC_PutPi"></A><H2>LC_PutPi</H2>
+<BIG><I><B>Put PINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn hele punktinformasjonen på angitte punkt
+Ny verdi skriver over eksisterende verdi.
+Verdi "" fjerner eksisterende PINFO.
+Knutepunkt legges inn med LC_PutKp.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+char *pinfo i PINFO-streng som skal legges inn
+ (Knutepunkt regnes ikke som pinfo)
+short sStatus r UT_TRUE = OK,
+ UT_FALSE = ikke utført (for lite plass tilgjengelig)
+Usage:
+sStatus = LC_PutPi(punkt_nr,pinfo);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PutPi(long punkt_nr, const char *pinfo)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O25"NAME="O25"></A><H1>15 Get Data from the Ring Buffer</H1>
+</PRE>
+These are functions to get data from the ring buffer.
+They interact with the current data group.
+The current data group may be chosen either by reading from a SOSI file
+or by establishing a new SOSI file.
+
+<BR>
+<BR>
+<BR>
+<A ID="O26"NAME="O26"></A><H2>15.1 General Value for a SOSI Name</H2>
+</PRE>
+Regarding the general mechanism in the SOSI file where the information
+can either be in HODE, GINFO or PINFO, there's a need for a functions that
+checks everything to find the actual value for this group.
+This applies mainly for quality information, date etc.
+
+<BR>
+<BR>
+<BR>
+<A ID="O27"NAME="O27"></A><H2>15.2 Group Information</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGi"NAME="LC_GetGi"></A><H2>LC_GetGi</H2>
+<BIG><I><B>Get GINFO-linje</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter en GINFO-linje som en streng rent generellt.
+Dette omfatter også serienummer og referansenummer.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short lin_nr i Linjenummer i GINFO (1 er første linje)
+char *ginfo r Peker til GINFO-streng avslutta med '/0'
+Usage:
+ginfo = LC_GetGi(lin_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetGi(short lin_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGP"NAME="LC_GetGP"></A><H2>LC_GetGP</H2>
+<BIG><I><B>Get GINFO-parameter</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter parametrene til et SOSI-navn.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+Leddnummer, delstreng,skilletegn og formateringskode kan inngå som
+forlengelse av SOSI-navnet.
+Leddnummer for flerleddet parameter angis ved #n.
+Eks: ..GID#2 er bruksnummer.
+Delstreng angis ved: [start:slutt].
+NB! 1 er første tegn.
+Sluttposisjon 0 betyr at resten av strengen skal brukes.
+Eks: ..STRENG[2:0] Posisjon 2 og resten av strengen.
+Skilletegn for flerleddet GINFO. Dette angis ved ^x hvor x er det tegnet
+som skal skrives ut mellom leddene.
+Formateringskode. Dette brukes for å angi plassering av komma og antall
+desimaler i desimaltall.
+Eks: ..AREAL%-3.2 Betyr at ..AREAL fra GINFO skal formateres slik:
+Komma flyttes 3 posisjoner til venstre (divisjon med tusen) og resultatet
+presenteres avrundet til 2 desimaler.
+Eks: ..DYBDE£-1.2 Betyr at ..DYBDE fra GINFO skal formateres slik:
+Komma flyttes 1 posisjon til venstre (divisjon med ti) og resultatet
+presenteres med 2 desimaler uten avrunding. Spesielt for dybdeverdier.
+Disse tilleggene kan kombineres, slik at ..GID#2[1:2] betyr at det er
+tegn nummer 1 og 2 i det andre leddet (bruksnumret) som skal brukes.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char sosi_navn i SOSI-navn det skal finnes verdi til.
+ Leddnummer, posisjon, skilletegn
+ og formateringskode kan inngå
+ som forlengelse av navnet.
+ OBS! Store og små bokstaver er signifikante.
+short *forste_linje iu GINFO-linjenummer for start søking
+ (1 er første linje i GINFO.)
+ Ved tilslag returneres linjenummer for tilslaget.
+short siste_linje i Siste GINFO-linje det skal søkes i.
+char *para_peker r Peker til parameter-streng avslutta med '/0'.
+ Hvis SOSI-navnet ikke er funnet returneres NULL.
+Usage:
+para_peker = LC_GetGP(sosi_navn,&forste_linje,siste_linje);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetGP(const char *sosi_navn,short *forste_linje,short siste_linje)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O28"NAME="O28"></A><H2>15.3 Serial Number and Reference Number</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetSn"NAME="LC_GetSn"></A><H2>LC_GetSn</H2>
+<BIG><I><B>Get serienummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter serienummer for aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------
+long snr r Serienr. (INGEN_GRUPPE = ingen aktuell gruppe)
+Usage:
+snr = LC_GetSn();
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_GetSn(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetRef"NAME="LC_GetRef"></A><H2>LC_GetRef</H2>
+<BIG><I><B>Hent referanser fra GINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut et array med referanser fra GINFO i aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long *ref_array u Serienr. for refererte grupper.
+ Start øy, og slutt øy angis ved fiktive gruppenr.
+ Følgende konstanter er definert:
+ START_OY = 9999999L = Start øy.
+ SLUTT_OY = -9999999L = Slutt øy.
+long max_ref i Max antall linjer i ref_array.
+short *gilin i/u linje for start referanselesing
+short *refpos i/u posisjon i linja for neste innlegging i array.
+long ant_ref r Antall linjer brukt i ref_array.
+Usage:
+ ant_ref = LC_GetRef(ref_array,max_ref,&gilin,&refpos);
+==========================================================================
+
+SK_EntPnt_FYBA long LC_GetRef(long *ref_array,long max_ref,short *gilin,short *refpos)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqAntRef"NAME="LC_InqAntRef"></A><H2>LC_InqAntRef</H2>
+<BIG><I><B>Spørr om antall referanser</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Spørr om antall referanser i GINFO i aktuell gruppe.
+Dette kallet kan brukes til å finne hvor stor array som må allokeres før
+kall til LC_GetRef.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long ant_ref r Antall referanser i GINFO.
+ OBS! Start- og sluttparantes for øy blir regnet
+ som egne referanser.
+Usage:
+ long lAntRef;
+ short sGiLin,sRefPos;
+ long *plRefArray;
+ lAntRef = LC_InqAntRef();
+ plRefArray = (long *) UT_MALLOC(lAntRef * sizeof(long));
+ sGiLin = 2;
+ sRefPos = 0;
+ LC_GetRef(plRefArray,lAntRef,&sGiLin,&sRefPos);
+==========================================================================
+
+SK_EntPnt_FYBA long LC_InqAntRef(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitGetRefFlate"NAME="LC_InitGetRefFlate"></A><H2>LC_InitGetRefFlate</H2>
+<BIG><I><B>Initierer status for GetRefFlate</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Initierer status for GetRefFlate.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_GRF_STATUS * pRefStat iu Struktur med statusopplysninger.
+Usage:
+ LC_InitGetRefFlate(pGrfStat,pBgr);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_InitGetRefFlate(LC_GRF_STATUS * pGS)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetRefFlate"NAME="LC_GetRefFlate"></A><H2>LC_GetRefFlate</H2>
+<BIG><I><B>Hent referanser for flate fra GINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut et array med referanser for flate fra GINFO i aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+-------------------------------------------------------------------------
+LC_GRF_STATUS * GrfStat iu Struktur med statusopplysninger.
+unsigned short usHent i Hva skal hentes:
+ GRF_YTRE = Ytre avgrensing
+ GRF_INDRE = Indre avgrensing, øyer
+ (kan kombineres med | (or).)
+long *ref_array u GRUPPENUMMER for refererte grupper.
+unsigned char *ref_status u Status for gruppene i ref_array.
+ LC_MED_DIG = Brukes MED dig retning.
+ LC_MOT_DIG = Brukes MOT dig retning.
+ GRF_START_OY = Første gruppe i øy
+ GRF_SLUTT_OY = Siste gruppe i øy
+long max_ref i Max antall linjer i ref_array og ref_status.
+long ant_ref r Antall linjer brukt i ref_array.
+ 0 viser at hele flata er behandla.
+Usage:
+ #define MAX_REF 20
+ long ref_arr[MAX_REF];
+ char ref_status[MAX_REF];
+ long ant_ref;
+ LC_GRF_STATUS GrfStat;
+ LC_InitGetRefFlate(&GrfStat);
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+ do {
+ if (ant_ref > 0) {
+ .
+ Behandle ytre avgrensing
+ .
+ }
+ [if (ant_ref < MAX_REF) break;]
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+ } while (ant_ref > 0);
+ LC_InitGetRefFlate(&GrfStat);
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_INDRE,ref_arr,ref_status,MAX_REF);
+ do {
+ if (ant_ref > 0) {
+ .
+ Behandle indre avgrensing (øy)
+ .
+ }
+ [if (ant_ref < MAX_REF) break;]
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_INDRE,ref_arr,ref_status,MAX_REF);
+ } while (ant_ref > 0);
+==========================================================================
+
+SK_EntPnt_FYBA long LC_GetRefFlate(LC_GRF_STATUS * GrfStat,unsigned short usHent,long *ref_array,
+ unsigned char *ref_status,long max_ref)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErLinjeRefLin"NAME="LC_ErLinjeRefLin"></A><H2>LC_ErLinjeRefLin</H2>
+<BIG><I><B>Sjekk om linje inneholder referanser</I></B></BIG><PRE>
+=======================================================================
+Usage:
+sRefLin = LC_ErLinjeRefLin(gp,sRefLin);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+char *pszGinfoLin i Peikar til GINFO-linje
+short sRefLin i Flagg som viser om forrige linje inneholdt referanser
+short sRefLin r Flagg som viser om aktuell linje inneholdt referanser
+Sjekk om linje er linje med referanser.
+=======================================================================
+
+short LC_ErLinjeRefLin(char *pszSosiLin, short sRefLin)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O29"NAME="O29"></A><H2>15.4 Special get functions</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBuePar"NAME="LC_GetBuePar"></A><H2>LC_GetBuePar</H2>
+<BIG><I><B>Beregner parametre som definerer sirkelbue</I></B></BIG><PRE>
+============================================================================
+Purpose: fi
+Sirkelbue defineres i SOSI ved en av /
+geometrielementene .SIRKEL, .SIRKELP, /
+.BUE, .BUEP. / /
+Denne rutina regner om til en intern as, ns * -radius- ) dfi
+bueangivelse med sirkelsentrum, radius / /
+og retning til buens startpunkt samt /
+delta for sluttpunktet uansett hvordan /
+buen er definert i SOSI.
+NB! Alle retninger i radianer, 0-retning i øst-aksen og positiv
+omløpsretning mot urviseren.
+Parameters:
+Type Name I/O Explanation
+----------------------------------------------------------------------------
+short buff_retning i Buffer-retning (kun for BUE og BUEP)
+ HENT_FORRFRA (1) = Vanlig
+ HENT_BAKFRA (-1) = Buffer skal snues
+double *as u Øst-koordinat sentrum sirkelbue
+double *an u Nord-koordinat sentrum sirkelbue
+double *radius u Radius i sirkelbue.
+double *fi u Retningsvinkel sentrum -> startpunkt bue
+double *dfi u Vinkel mellom fi og sentrum -> sluttpunkt bue
+ dfi > 0 = Positiv omløpsretning(mot klokka)
+ dfi < 0 = Negativ omløpsretning(med klokka)
+short *sfeil u Feilstatus, definert dersom ist = 0
+ 1 = Ulovlig geometritype(ikke bue)
+ 2 = Feil ved beregning av bueparametre
+short ist r Returstatus
+ UT_TRUE = Alt OK
+ UT_FALSE = Feil, se returvariabel sfeil
+Usage:
+ist = LC_GetBuePar(buff_retning, &as, &ns, &radius, &fi, &dfi, &sfeil )
+ ============================================================================
+
+SK_EntPnt_FYBA short LC_GetBuePar(short buff_retning, double *as, double *ns, double *radius,
+ double *fi, double *dfi, short *sfeil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBue"NAME="LC_GetBue"></A><H2>LC_GetBue</H2>
+<BIG><I><B>Hent bue</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut nødvendige opplysninger om en bue.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+double *a1 u Koordinat i første punkt
+double *n1 u
+double *a2 u Koordinat i siste punkt
+double *n2 u
+double *radius u Radius
+short *storbue u 0=vanlig bue, 1=storbue
+short ist r status: UT_TRUE = OK,
+ UT_FALSE = feil (Gruppen er ikke OK bue)
+Usage:
+ ist = LC_GetBue(retning,&a1,&n1,&a2,&n2,&radius,&storbue);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetBue(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *radius,short *storbue)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBuep"NAME="LC_GetBuep"></A><H2>LC_GetBuep</H2>
+<BIG><I><B>Hent buep</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut nødvendige opplysninger om en buep.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+double *a1 u Koordinat i første punkt
+double *n1 u
+double *a2 u Koordinat i midtre punkt
+double *n2 u
+double *a3 u Koordinat i siste punkt
+double *n3 u
+short ist r status: UT_TRUE = OK,
+ UT_FALSE = feil (Gruppen er ikke OK buep)
+Usage:
+ ist = LC_GetBuep(retning,&a1,&n1,&a2,&n2,&a3,&n3);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetBuep(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetSirkel"NAME="LC_GetSirkel"></A><H2>LC_GetSirkel</H2>
+<BIG><I><B>Hent silkel</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut nødvendige opplysninger om en sirkel.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double *as u Koordinat i sentrum
+double *ns u
+double *radius u Radius
+short ist r status: UT_TRUE = OK,
+ UT_FALSE = Feil (Gruppen er ikke OK sirkel)
+Usage:
+ ist = LC_GetSirkel(&as,&ns,&radius);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetSirkel(double *as,double *ns,double *radius)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetSirkelp"NAME="LC_GetSirkelp"></A><H2>LC_GetSirkelp</H2>
+<BIG><I><B>Hent silkelp</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut nødvendige opplysninger om en sirkelp.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double *a1 u Koordinat i P1
+double *n1 u
+double *a2 u Koordinat i P2
+double *n2 u
+double *a3 u Koordinat i P3
+double *n3 u
+short ist r status: UT_TRUE = OK,
+ UT_FALSE = Feil (Gruppen er ikke OK sirkelp)
+Usage:
+ ist = LC_GetSirkelp(&a1,&n1,&a2,&n2,&a3,&n3);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetSirkelp(double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetKvalitet"NAME="LC_GetKvalitet"></A><H2>LC_GetKvalitet</H2>
+<BIG><I><B>Finner kvalitetsopplysninger</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finne kvalitetsopplysninger i filhode eller vanlig gruppe.
+(Tolker aktuell gruppe.)
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short *psMetode u Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+ KVAL_MET_STD standard metode fra nivå over.
+long *pLNnoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+ KVAL_NOY_STD standard nøyaktighet fra nivå over
+short *psSynbarhet u Synbarhet i bilde
+ KVAL_SYN_UNDEF synbarhet er udefinert.
+ KVAL_SYN_STD standard metode fra nivå over.
+short *psHoydeMetode u Hvordan høyden er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+ KVAL_MET_STD standard metode fra nivå over.
+long *plHoydeNoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+ KVAL_NOY_STD standard nøyaktighet fra nivå over
+short ist r Status: UT_TRUE = OK, ..KVALITET er funnet
+ UT_FALSE = ikke funnet
+Usage:
+ ist = LC_GetKvalitet(&sMetode,&lNoyaktighet,&sSynbarhet,
+ &sHoydeMetode,&lHoydeNoyaktighet);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetKvalitet(short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O30"NAME="O30"></A><H2>15.5 Coordinates</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTK"NAME="LC_GetTK"></A><H2>LC_GetTK</H2>
+<BIG><I><B>Get koordinat</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter et punkts koordinater (ø,n) i meter i terreng
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *aust u Øst-koordinat i meter i terreng
+double *nord u Nord-koordinat i meter i terreng
+Usage:
+LC_GetTK(punkt_nr,&aust,&nord);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_GetTK(long punkt_nr,double *aust,double *nord)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetArrayTK"NAME="LC_GetArrayTK"></A><H2>LC_GetArrayTK</H2>
+<BIG><I><B>Hent tabell med koordinater</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter tabell med koordinater (ø,n) i meter i terreng
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+long max_antall i Max antall punkt som kan hentes
+long fra_punkt i Fra punktnummer (1 eller nko er første punkt)
+double *aust u Peker til tab. for øst-koordinater
+double *nord u Peker til tab. for nord-koordinater
+long *antall u Antall punkt hentet
+Usage:
+LC_GetArrayTK(retning,max_antall,fra_punkt,aust,nord,&lest);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_GetArrayTK(short retning,long max_antall,long fra_punkt,
+ double *aust,double *nord,long *antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTH"NAME="LC_GetTH"></A><H2>LC_GetTH</H2>
+<BIG><I><B>Get høyde</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter et punkts høyde i meter i terreng. (Henter BARE FRA PUNKTET.)
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *hoyde r Høyde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har høydeverdi.
+Usage:
+hoyde = LC_GetTH(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA double LC_GetTH(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetArrayTH"NAME="LC_GetArrayTH"></A><H2>LC_GetArrayTH</H2>
+<BIG><I><B>Hent tabell med høyder</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter tabell med høyder
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+long max_antall i Max antall punkt som kan hentes
+long fra_punkt i Fra punktnummer (1 eller nko er første punkt)
+double *aust u Peker til tab. for høyder
+long *antall u Antall punkt hentet
+Usage:
+LC_GetArrayTH(retning,max_antall,fra_punkt,hoyde,&lest);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_GetArrayTH(short retning,long max_antall,long fra_punkt,
+ double *hoyde,long *antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetHoyde"NAME="LC_GetHoyde"></A><H2>LC_GetHoyde</H2>
+<BIG><I><B>Get høyde</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter et punkts høyde i meter i terreng. (Henter fra punktet eller fra
+GINFO.)
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *hoyde r Høyde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har høydeverdi.
+Usage:
+hoyde = LC_GetHoyde(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA double LC_GetHoyde(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTD"NAME="LC_GetTD"></A><H2>LC_GetTD</H2>
+<BIG><I><B>Get dybde</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter et punkts dybde i meter i terreng. (Henter BARE FRA PUNKTET.)
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *dybde r Dybde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har dybdeverdi.
+Usage:
+dybde = LC_GetTD(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA double LC_GetTD(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetDybde"NAME="LC_GetDybde"></A><H2>LC_GetDybde</H2>
+<BIG><I><B>Get dybde</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter et punkts dybde i meter i terreng. (Henter fra punktet eller fra
+GINFO.)
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *hoyde r Dybde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har høydeverdi.
+Usage:
+dybde = LC_GetHoyde(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA double LC_GetDybde(long punkt_nr)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O31"NAME="O31"></A><H2>15.6 Connection Nodes</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetKp"NAME="LC_GetKp"></A><H2>LC_GetKp</H2>
+<BIG><I><B>Get knutepunkt</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter knutepunktverdi i punktet.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+short kp_type r Knutepunkttype (1-4095)
+ (0 = punktet har ikke knutepunkt)
+Usage:
+kp = LC_GetKp(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetKp(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FinnKp"NAME="LC_FinnKp"></A><H2>LC_FinnKp</H2>
+<BIG><I><B>Finn knutepunkt</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Skanner gruppe, og finner punkt som er knutepunkt.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long *forste_punkt iu Punktnummer for start søking.
+ (1 er første punkt i gruppen.)
+ Ved tilslag returneres punktnummer for tilslaget.
+long siste_punkt i Siste punkt det skal søkes i.
+short *kp u Knutepunkt.
+short status r Søkestatus (1=funnet, 0=ikke funnet)
+Usage:
+status = LC_FinnKp(&forste_punkt,siste_punkt,kp);
+ ==========================================================================
+
+short LC_FinnKp(long *forste_punkt,long siste_punkt,short *kp)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O32"NAME="O32"></A><H2>15.7 Node Information</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetPi"NAME="LC_GetPi"></A><H2>LC_GetPi</H2>
+<BIG><I><B>Get PINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter punktinformasjon i angitte punkt som en streng.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+char *pinfo r Peker til punktinformasjon eksklusiv knutepunkt
+Usage:
+pinfo = LC_GetPi(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetPi(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitPP"NAME="LC_InitPP"></A><H2>LC_InitPP</H2>
+<BIG><I><B>Initier PINFO-søk</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Initierer søk etter PINFO.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char sosi_navn i Sosi-navn det skal finnes verdi til
+long forste_punkt i Første punkt. (1 er første pkt i gr)
+long siste_punkt i Siste punkt det skal søkes i
+LC_GETPP_STATUS pp_stat iu Struktur med statusvariabler. Denne er
+ bare for intern bruk i InitPP / GetPP.
+Usage:
+ Se under LC_GetPP.
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_InitPP(char *sosi_navn,long forste_punkt,long siste_punkt,
+ LC_GETPP_STATUS *pp_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetPP"NAME="LC_GetPP"></A><H2>LC_GetPP</H2>
+<BIG><I><B>Utfør PINFO-søk</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter parametrene til et SOSI-navn definert i LC_InitPP.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long *punkt u Ved tilslag returneres punktnummer for
+ tilslaget.
+LC_GETPP_STATUS pp_stat iu Struktur med statusvariabler. Denne er
+ bare for intern bruk i InitPP / GetPP.
+char *para_peker r Peker til para.-streng avslutta med '/0'.
+ Hvis ingenting er funnet returneres NULL.
+Usage:
+.
+ LC_GETPP_STATUS pp_stat;
+.
+LC_InitPP(sosi_navn,forste_punkt,siste_punkt,pp_stat);
+para_peker = LC_GetPP(&punkt,pp_stat);
+ .
+ =============================================================================
+
+SK_EntPnt_FYBA char *LC_GetPP(long *punkt,LC_GETPP_STATUS *pp_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetPiVerdi"NAME="LC_GetPiVerdi"></A><H2>LC_GetPiVerdi</H2>
+<BIG><I><B>Get PINFO-verdi</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter parametrene til et SOSI-navn.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+Leddnummer, delstreng og formateringskode kan inngå som
+forlengelse av SOSI-navnet.
+Leddnummer for flerleddet parameter angis ved #n.
+Eks: ...KVALITET#2 er nøyaktighet.
+Delstreng angis ved: [start:slutt].
+NB! 1 er første tegn.
+Sluttposisjon 0 betyr at resten av strengen skal brukes.
+Eks: ..STRENG[2:0] Posisjon 2 og resten av strengen.
+Formateringskode kan angi skilletegn for flerleddet PINFO. Dette
+angis ved ^x hvor x er det tegnet som skal skrives ut mellom leddene.
+Disse tilleggene kan kombineres, slik at ...KVALITET#2[1:2] betyr at
+det er tegn nummer 1 og 2 i det andre leddet (nøyaktigheten) som skal
+brukes.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+char pszSosiName i SOSI-navn det skal finnes verdi til.
+ Leddnummer posisjon og formateringskode kan
+ inngå som forlengelse av navnet.
+ OBS! Store og små bokstaver er signifikante.
+ HØYDE er spesialverdi som henter formatert
+ høyde fra punktet eller GINFO.
+ KVALITET er spesialverdi som henter formatert
+ kvalitet fra punktet, GINFO eller hode.
+long lPnr i Punktnummer
+short *sSettNr iu PINFO-nummer (1 er første sett i PINFO.)
+ Ved tilslag returneres settnummer for tilslaget.
+char *pszVerdi r Peker til verdien avslutta med '/0'.
+ Hvis SOSI-navnet ikke er funnet returneres NULL.
+Usage:
+pszVerdi = LC_GetPiVerdi(pszSosiName,lPnr,&sSettNr);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetPiVerdi(const char *pszSosiName,long lPnr,short *sSettNr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_TestPi"NAME="LC_TestPi"></A><H2>LC_TestPi</H2>
+<BIG><I><B>Sjekk om punkt har PINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker om et punkt har PINFO i en eller annen form.
+(PINFO, KP, høyde.)
+Høyde handteres ikke foreløpig.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+short sTestHoyde i Bryter for å si om høyde skal regnes med i sjekken.
+short sStatus r UT_TRUE=har "pinfo", UT_FALSE=har ikke "pinfo"
+Usage:
+sStatus = LC_TestPi(punkt_nr,UT_TRUE);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_TestPi(long punkt_nr,short sTestHoyde)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O33"NAME="O33"></A><H2>15.8 Special get operations</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetCurEnhet"NAME="LC_GetCurEnhet"></A><H2>LC_GetCurEnhet</H2>
+<BIG><I><B>Hent enhet på angitt nivå</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter ut enhet fra filhode eller GINFO
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til FilAdm
+short *nivaa iu angir nivå for henting, returnerer aktuelt nivå
+ 1 = filhode
+ 2 = GINFO
+double *enhet u Aktuell enhet
+double *enhet_h u Aktuell enhet-H
+double *enhet_d u Aktuell enhet-D
+Usage:
+ LC_GetCurEnhet(pFil,&nivaa,&enhet,&enhet_h,&enhet_d);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_GetCurEnhet(LC_FILADM * pFil,short *nivaa, double *enhet,
+ double *enhet_h, double *enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetCurKvalitet"NAME="LC_GetCurKvalitet"></A><H2>LC_GetCurKvalitet</H2>
+<BIG><I><B>Finner kvalitetsopplysninger på angitt nivå</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finne kvalitetsopplysninger på angitt nivå, hode ginfo eller pinfo.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til FilAdm
+short *nivaa iu Hvor skal det letes.
+ 0 = ikke funnet
+ 1 = hode
+ 2 = ginfo
+ 3 = pinfo
+ Returnerer aktuelt nivå.
+long pnr i punktnr. ved spørring på pinfo
+short *psMetode u Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+long *pLNnoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+short *psSynbarhet u Synbarhet i bilde
+ KVAL_SYN_UNDEF synbarhet er udefinert.
+short *psHoydeMetode u Hvordan høyden er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+long *plHoydeNoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+short ist r Statusvariabel:
+ UT_TRUE = OK, KVALITET er funnet
+ UT_FALSE = KVALITET er ikke funnet
+Usage:
+ ist = LC_GetCurKvalitet(pFil,&nivaa,pnr,&sMetode,&lNoyaktighet,
+ &sSynbarhet,&sHoydeMetode,&lHoydeNoyaktighet);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetCurKvalitet(LC_FILADM *pFil,short *nivaa,long pnr,
+ short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetObjtypeBgr"NAME="LC_GetObjtypeBgr"></A><H2>LC_GetObjtypeBgr</H2>
+<BIG><I><B>Hent objekttype</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter objekttype for gitt gruppenummer.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_BGR *pBgr i Gruppenummer det ønskes opplysninger om.
+char *pszObjtype r OBJTYPE
+ NULL hvis gruppen ikke finnes
+Usage:
+pszObjtype = LC_GetObjtypeBgr(pBgr);
+=============================================================================
+
+SK_EntPnt_FYBA const char *LC_GetObjtypeBgr(LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetElementName"NAME="LC_GetElementName"></A><H2>LC_GetElementName</H2>
+<BIG><I><B>Hent elementnavn</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Hent et elementnavn fra den interne navnetabellen i FYBA.
+Denne tabellen inneholder både gruppenavn (.LINJE, .KURVE, ...) og
+egenskapsnavn (..OBJTYPE, ..LTEMA, ...)
+Tabellen har tre logiske deler:
+ - (Linje 0 - L_HODE): Forhåndsdefinerte gruppenavn.
+ - (Linje L_HODE+1 - L_KP): Forhåndsdefinerte egenskapsnavn.
+ - (Linje L_KP+1 - n): Andre elementnavn brukt i SOSI-filen etter
+ indeksoppbygging.
+Selv om egenskapen blir fjernet fra SOSI-filen blir navnet fortsatt
+liggende i navnetabellen
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+short sNameNr i Linjenummer i navnetabellen (0 - n)
+bool *bBrukt Viser om navnet har/er brukt i filen
+ Hvis det har vært en gruppe som har brukt navnet blir
+ denne stående "true" selv om gruppen er slettet.
+const char *pszName r Peker til elementnavn,
+ NULL = ukjent fil eller ulovlig linjenummer
+Usage:
+// Går gjennom alle navnene ut over de forhåndsdefinerte navnene.
+short sNameNr = L_KP+1;
+while ((pszName = LC_GetElementName(pFil,sNameNr)) != NULL)
+{
+ // Gjør noe med navnet
+ ...
+ ++sNameNr;
+}
+=============================================================================
+
+SK_EntPnt_FYBA const char *LC_GetElementName(LC_FILADM *pFil,short sNameNr,bool *bBrukt)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O34"NAME="O34"></A><H1>16 Iterating in the Base</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitNextFil"NAME="LC_InitNextFil"></A><H2>LC_InitNextFil</H2>
+<BIG><I><B>Initier finn neste fil</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Initierer pFil for bruk i finn neste fil.
+Parameters:
+Type Name I/O Explanation
+------------------------------------------------------------------------
+LC_FILADM **ppFil u Peker til FilAdm-peker
+Usage:
+ LC_InitNextFil(&pFil)
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_InitNextFil(LC_FILADM **ppFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_NextFil"NAME="LC_NextFil"></A><H2>LC_NextFil</H2>
+<BIG><I><B>Finn neste fil</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finn neste fil i aktuell base.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM **ppFil iu Peker til FilAdm-peker
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR, LC_BAKGR og /eller LC_SEKV
+ (Bruk "|" for å kombinere.)
+short sStatus r Status UT_TRUE=OK, UT_FALSE=ingen flere funnet
+Usage:
+ LC_FILADM *pFil;
+ Denne løkka går gjennom alle framgrunns-filene i basen
+ LC_InitNextFil(&pFil)
+ while (LC_NextFil(&pFil,LC_FRAMGR)) {
+ pszFilName = LC_GetFiNa(pFil);
+ .
+ Behandle filnavnet
+ .
+ }
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_NextFil(LC_FILADM **ppFil,unsigned short usLag)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitNextBgr"NAME="LC_InitNextBgr"></A><H2>LC_InitNextBgr</H2>
+<BIG><I><B>Initier finn neste gruppe</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Initierer Bgr for bruk i finn neste gruppe.
+Parameters:
+Type Name I/O Explanation
+------------------------------------------------------------------------
+LC_BGR * pBgr iu Peker til gruppestruktur
+Usage:
+ LC_InitNextBgr(&Bgr)
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_InitNextBgr(LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_NextBgr"NAME="LC_NextBgr"></A><H2>LC_NextBgr</H2>
+<BIG><I><B>Finn neste gruppe</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finn neste gruppe i aktuell base.
+Sekvensielle filer blir ikke håndtert.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pBgr iu Peker til gruppestruktur der gruppenummer lagres
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+ (Bruk "|" for å kombinere.)
+short sStatus r Status UT_TRUE=OK, UT_FALSE=ingen flere grupper
+Usage:
+ LC_BGR Bgr;
+ Denne løkka går gjennom alle framgrunns-gruppene i basen
+ LC_InitNextBgr(&Bgr);
+ while (LC_NextBgr(&Bgr,LC_FRAMGR)) {
+ gnavn = LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ .
+ Behandle gruppen
+ .
+ }
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_NextBgr(LC_BGR * pBgr,unsigned short usLag)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O35"NAME="O35"></A><H1>17 Geographical Search</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrWin"NAME="LC_GetGrWin"></A><H2>LC_GetGrWin</H2>
+<BIG><I><B>Hent omskrevet rektangel for gruppe</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter omskrevet rektangel for gitt gruppe.
+For flater er refererte grupper medregnet.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pBgr i Gruppenummer
+double *nva u Omskrevet rektangel for gruppen. Avrundet utover
+double *nvn u en enhet.
+double *oha u
+double *ohn u
+short ist r Status. UT_TRUE=OK, UT_FALSE=ulovlig gruppenummer.
+Usage:
+ ist = LC_GetGrWin(&Bgr,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetGrWin(LC_BGR * pBgr,double *nva,double *nvn,double *oha,double *ohn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SBFlate"NAME="LC_SBFlate"></A><H2>LC_SBFlate</H2>
+<BIG><I><B>Sett søkegrense for geografisk søk på flate</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Definerer punkt for geografisk søk på flate.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+double nv_a i Koordinat nedre venstre hjørne
+double nv_n i
+double oh_a i Koordinat øvre høyre hjørne
+double oh_n i
+Usage:
+LC_GEO_STATUS GeoStat;
+.
+LC_SBFlate(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+if (LC_FFFlate(&GeoStat,&Bgr)) {
+ do{
+ . Behandle funnet gruppe
+ .
+ } while (LC_FNFlate(&GeoStat,&Bgr));
+}
+LC_AvsluttSok(&GeoStat);
+.
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_SBFlate(LC_GEO_STATUS * pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFFlate"NAME="LC_FFFlate"></A><H2>LC_FFFlate</H2>
+<BIG><I><B>Finn første ved flatesøk</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Finner første gruppe i det definerte området for flatesøk.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+Se under LC_SBFlate.
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_FFFlate(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNFlate"NAME="LC_FNFlate"></A><H2>LC_FNFlate</H2>
+<BIG><I><B>Finn neste ved flatesøk</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner neste gruppe i det definerte området for flatesøk.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+Se under LC_SBFlate.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FNFlate(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SBGeo"NAME="LC_SBGeo"></A><H2>LC_SBGeo</H2>
+<BIG><I><B>Sett søkegrense for grov geografisk søk</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Definerer geografisk område for geografisk søk.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus.
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+double nv_a i Koordinat nedre venstre hjørne.
+double nv_n i
+double oh_a i Koordinat øvre høyre hjørne.
+double oh_n i
+Usage:
+LC_GEO_STATUS GeoStat;
+.
+LC_SBGeo(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+if (LC_FFGeo(&GeoStat,&Bgr)) {
+ do{
+ . Behandle funnet gruppe
+ .
+ } while (LC_FNGeo(&GeoStat,&bgr));
+}
+LC_AvsluttSok(&GeoStat);
+.
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_SBGeo(LC_GEO_STATUS * pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFGeo"NAME="LC_FFGeo"></A><H2>LC_FFGeo</H2>
+<BIG><I><B>Finn første ved geografisk søk</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner første gruppe i det definerte området for kombinert geografisk søk.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+Se under LC_SBGeo.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FFGeo(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNGeo"NAME="LC_FNGeo"></A><H2>LC_FNGeo</H2>
+<BIG><I><B>Finn neste ved geografisk søk</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner neste gruppe i det definerte området for geografisk søk.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+Se under LC_SBGeo.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FNGeo(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FAGeo"NAME="LC_FAGeo"></A><H2>LC_FAGeo</H2>
+<BIG><I><B>Finn alle ved geografisk søk</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finn alle i geografisk søkeområde.
+Tilslag merkes i brukttabellen kolonne BT_GEOSOK (15).
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+long lAntall r Antall funnet.
+Usage:
+.
+LC_SBGeo(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+antall = LC_FAGeo(&Bgr);
+.
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_FAGeo(LC_GEO_STATUS * pGeoStat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFGeoFil"NAME="LC_FFGeoFil"></A><H2>LC_FFGeoFil</H2>
+<BIG><I><B>Finn første ved geografisk søk i en fil</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner første gruppe i det definerte området for kombinert geografisk søk.
+Søker bare i en gitt fil.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_FILADM * pOnsketFil i Filpeker til den filen det skal søkes i.
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+Se under LC_SBGeo.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FFGeoFil(LC_GEO_STATUS * pGeoStat,LC_FILADM *pOnsketFil,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNGeoFil"NAME="LC_FNGeoFil"></A><H2>LC_FNGeoFil</H2>
+<BIG><I><B>Finn neste ved geografisk søk i en fil</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner neste gruppe i det definerte området for geografisk søk.
+Søker bare i en gitt fil.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_FILADM * pFil i Filpeker til den filen det skal søkes i.
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+Se under LC_SBGeo.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FNGeoFil(LC_GEO_STATUS * pGeoStat,LC_FILADM *pFil,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_AvsluttSok"NAME="LC_AvsluttSok"></A><H2>LC_AvsluttSok</H2>
+<BIG><I><B>Avslutter geografisk søk</I></B></BIG><PRE>
+=======================================================================
+Usage:
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat i Peker til struktur for søkestatus
+Purpose:
+Avslutter geografisk søk, og frigir kjede med søkeresultat.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_AvsluttSok(LC_GEO_STATUS * pGeoStat)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_WTst"NAME="LC_WTst"></A><H2>LC_WTst</H2>
+<BIG><I><B>Vindustest</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekk om aktuell gruppe berører gitt vindu.
+Tar hensyn til gruppenavnet. Handterer (PUNKT, LINJE, KURVE, BUE,
+BUEP, SIRKEL, SIRKELP, SVERM, TRASE ).
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double nva i Avgrensing av vinduet
+double nvn i
+double oha i
+double ohn i
+short ist r status: 0 = ikke berøring
+ 1 = skjæring
+Usage:
+.
+LC_SBGeo(&GeoStat,nv_a,nv_n,oh_a,oh_n);
+if (LC_FFGeo(&GeoStat,&Bgr)){
+ do{
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (LC_WTst(nv_a,nv_n,oh_a,oh_n)) { (Nøyaktig vindustest)
+ . Behandle funnet gruppe
+ .
+ }
+ } while (LC_FNGeo(&GeoStat,&Bgr));
+}
+LC_AvsluttSok(&GeoStat);
+.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_WTst(double nva,double nvn,double oha,double ohn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PTst"NAME="LC_PTst"></A><H2>LC_PTst</H2>
+<BIG><I><B>Polygontest</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker om gitt punkt ligger innenfor polygon angitt av aktuell gruppe.
+Forutsetter at tabellen danner et lukket polygon
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double a i Punkt som skal sjekkes
+double n i
+short ist r status: 0 = punktet er utenfor flaten
+ 1 = punktet ligger inne på flaten
+Usage:
+.
+LC_SBFlate(&GeoStat,a-d,n-d,a+d,n+d);
+if (LC_FFFlate(&GeoStat,&Bgr)) {
+ do{
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (LC_PTst(a,n)){ (Nøyaktig polygontest)
+ . Behandle funnet gruppe
+ .
+ }
+ } while (LC_FNFlate(&GeoStat,&Bgr));
+}
+LC_AvsluttSok(&GeoStat);
+.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PTst(double a,double n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PTstOmkrets"NAME="LC_PTstOmkrets"></A><H2>LC_PTstOmkrets</H2>
+<BIG><I><B>Sjekk om punkt ligger inni polygon</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker om gitt punkt ligger innenfor yttergrensen for polygon angitt
+av aktuell gruppe.
+Forutsetter at tabellen danner et lukket polygon
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double a i Punkt som skal sjekkes
+double n i
+short ist r status: 0 = punktet er utenfor flaten
+ 1 = punktet ligger inne på flaten
+Usage:
+ist = LC_PTstOmkrets(a,n);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PTstOmkrets(double a,double n)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O36"NAME="O36"></A><H1>18 Serial Number Search</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SBSn"NAME="LC_SBSn"></A><H2>LC_SBSn</H2>
+<BIG><I><B>Sett søkegrense for serienummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Setter søkegrenser for serienummersøk.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_FILADM * pFil i Peker til FilAdm
+long lMinSnr i Fra og med serienummer
+long lMaxSnr i Til og med serienummer
+Usage:
+LC_SNR_ADM SnrAdm;
+LC_SBSn(&SnrAdm,pFil,lMinSnr,lMaxSnr);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SBSn(LC_SNR_ADM * pSnrAdm,LC_FILADM *pFil,long lMinSnr,long lMaxSnr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_MoveSn"NAME="LC_MoveSn"></A><H2>LC_MoveSn</H2>
+<BIG><I><B>Flytt til gruppenummer for et serienummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finn gruppenummer for et gitt serienummer i søkeområdet for serienummer.
+Intern "aktuellt serienummer" blir endret, slik at videre søk med
+neste/forrige nå tar utgangspunkt i dette serienummer.
+(Bare hvis snr er funnet).
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm iu Peker til statusblokk for serienummersøk
+long lSnr i Serienummer som skal finnes
+LC_BGR *pBgr u Gruppenummer i basen
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_MoveSn(pSnrAdm,snr,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_MoveSn(LC_SNR_ADM * pSnrAdm,long lSnr,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FiSn"NAME="LC_FiSn"></A><H2>LC_FiSn</H2>
+<BIG><I><B>Finn gruppenummer for et serienummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finn gruppenummer for et gitt serienummer i søkeområdet for serienummer.
+Endrer IKKE "current gruppe".
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+long lSnr i Serienummer som skal finnes
+LC_BGR *pBgr u Gruppenummer i basen
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FiSn(pFil,lSnr,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FiSn(LC_FILADM *pFil,long lSnr,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FiArraySn"NAME="LC_FiArraySn"></A><H2>LC_FiArraySn</H2>
+<BIG><I><B>Finn gruppenummer for flere serienummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner gruppenummer for tabell med serienummer.
+Endrer IKKE "current gruppe".
+Serienummertabellen kan være "rå" slik den kommer fra GetRef. Linjer med
+start øy og slutt øy overses.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+short antall i Antall linjer brukt i serienummertabellen
+long *snr i Tabell med serienummer som skal finnes
+long *bgr u Tabell med gruppenummer funnet
+ (INGEN_GRUPPE = ikke funnet)
+Usage:
+LC_FiArraySn(pFil,antall,snr,bgr);
+================================================================================
+
+SK_EntPnt_FYBA void LC_FiArraySn(LC_FILADM *pFil,short antall,long *snr,long *bgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FASn"NAME="LC_FASn"></A><H2>LC_FASn</H2>
+<BIG><I><B>Finn alle serienummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner alle grupper i fil/serienummer søkeområdet og merker i kolonne
+BT_SNRSOK i brukttabellen.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+long antall r Antall grupper funnet.
+Usage:
+antall_funnet = LC_FASn(&SnrAdm);
+=============================================================================
+
+SK_EntPnt_FYBA long LC_FASn(LC_SNR_ADM * pSnrAdm)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFSn"NAME="LC_FFSn"></A><H2>LC_FFSn</H2>
+<BIG><I><B>Finn første serienummer</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Finner første gruppe i fil/serienummer søkeområdet.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FFSn(&SnrAdm,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FFSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNSn"NAME="LC_FNSn"></A><H2>LC_FNSn</H2>
+<BIG><I><B>Finn neste serienummer</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner neste gruppe i fil/serienummer søkeområdet.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_BGR * pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FNSn(&SnrAdm,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FNSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FPSn"NAME="LC_FPSn"></A><H2>LC_FPSn</H2>
+<BIG><I><B>Finn forige serienummer</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Finner forrige gruppe i fil/serienummer søkeområdet.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FPSn(&SnrAdm,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FPSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FLSn"NAME="LC_FLSn"></A><H2>LC_FLSn</H2>
+<BIG><I><B>Finn siste serienummer</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Finner siste gruppe i fil/serienummer søkeområdet.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FLSn(&SnrAdm,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FLSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFSnBt"NAME="LC_FFSnBt"></A><H2>LC_FFSnBt</H2>
+<BIG><I><B>Finn første serienummer med tilleggskrav</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner første gruppe som er merka i gitt kolonne i brukttabellen.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FFSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+=============================================================================
+
+SK_EntPnt_FYBA short LC_FFSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNSnBt"NAME="LC_FNSnBt"></A><H2>LC_FNSnBt</H2>
+<BIG><I><B>Finn neste serienummer med tilleggskrav</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner neste gruppe også er merka i gitt kolonne i brukttabellen.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FNSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FNSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FPSnBt"NAME="LC_FPSnBt"></A><H2>LC_FPSnBt</H2>
+<BIG><I><B>Finn forige serienummer med tilleggskrav</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner forrige gruppe i fil/serienummer søkeområdet, som også er merka i
+gitt kolonne i brukttabellen.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FPSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FPSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FLSnBt"NAME="LC_FLSnBt"></A><H2>LC_FLSnBt</H2>
+<BIG><I><B>Finn siste serienummer med tilleggskrav</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finner siste gruppe i fil/serienummer søkeområdet som også er merka i
+gitt kolonne i brukttabellen.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Usage:
+sstat = LC_FLSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FLSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O37"NAME="O37"></A><H1>19 Property Subset</H1>
+FYBA har en egen "utvalgsmotor" som har et rikt sett av utvalgsmetoder.
+Disse metodene er spesiellt tilpasset SOSI-formatet.
+
+<PRE>
+Følgende metoder er definert:
+
+ ! Ikke (Tilslag når SOSI-navnet ikke finnes. Bare GINFO.)
+
+ AL Alle
+
+ <> Fra-til
+
+ >< Utenfor
+
+ < Mindre-enn
+
+ > Større-enn
+
+ / Delelig-med, eventuellt med sjekk på om restverdi er 2. verdi
+
+ !/ Ikke-delelig-med
+
+ () Inneholder
+
+ = Lik
+
+ IV Ikke valgt (Tilslag når gruppen ikke er tegnet ennå.
+ Kombineres med SOSI-navnet "..*")
+
+ != Ikke lik (Tilslag når denne navn og verdi kombinasjonen ikke
+ finnes. (Bare GINFO)
+
+ FL Flere (Tilslag når SOSI-navnet forekommer flere ganger.)
+
+ !FL Ikke flere enn (Tilslag når SOSI-navnet IKKE forekommer
+ flere ganger enn gitt antall.)
+
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_OpenQuery"NAME="LC_OpenQuery"></A><H2>LC_OpenQuery</H2>
+<BIG><I><B>Initier query</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Initierer query mot GINFO/PINFO.
+Tildeler administrasjonsblokk for utvalg.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_UT_ADM *UtAdm r Peker til administrasjonsblokk for utvalg.
+Usage:
+pUtAdm = LC_OpenQuery();
+ ==========================================================================
+
+SK_EntPnt_FYBA LC_UT_ADM *LC_OpenQuery(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CloseQuery"NAME="LC_CloseQuery"></A><H2>LC_CloseQuery</H2>
+<BIG><I><B>Avslutter query</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Avslutter query mot GINFO/PINFO.
+Frigir minne brukt til administrasjon og utvalgstabeller.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_UT_ADM *UtAdm i Peker til administrasjonsblokk for utvalg.
+Usage:
+LC_CloseQuery(pUtAdm);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_CloseQuery(LC_UT_ADM * pUtAdm)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutQueryLine"NAME="LC_PutQueryLine"></A><H2>LC_PutQueryLine</H2>
+<BIG><I><B>Legg inn en query-linje</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn og tolker en linje med query-tekst.
+Parameters:
+Type Name I/O Explanation
+------------------------------------------------------------------------
+LC_UT_ADM *UtAdm i Peker til administrasjonsblokk for utvalg.
+char *qulin i Linje med query-tekst. (Uten prikker på første nivå).
+short sType i Gruppe eller Punkt (U_GRUPPE eller U_PUNKT).
+short ist r Status (UT_TRUE=OK, UT_FALSE=linjen er ikke OK)
+Usage:
+ist = LC_PutQueryLine(pUtAdm,qulin,sType);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_PutQueryLine(LC_UT_ADM *pUtAdm,const char *qulin,short sType)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutQueryRegel"NAME="LC_PutQueryRegel"></A><H2>LC_PutQueryRegel</H2>
+<BIG><I><B>Legg inn et regelnavn</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legger inn et regelnavn på siste linje i utvalgstabellen.
+(Nameet blir intern konvertert til "store" bokstaver.)
+Parameters:
+Type Name I/O Explanation
+------------------------------------------------------------------------
+LC_UTVALG *pU i Peker til utvalg
+char *navn i Regelnavn.
+Usage:
+LC_PutQueryRegel(pU,navn);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_PutQueryRegel(LC_UTVALG * pU,const char *navn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_LesUtvalg"NAME="LC_LesUtvalg"></A><H2>LC_LesUtvalg</H2>
+<BIG><I><B>Les utvalg i kom.filen</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Leser og tolker gruppe og punktutvalg på kommandofilen og legger i tabell.
+Forutsetter at filen er åpnet på forhånd.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+FILE *pKomFil i Peker til "handle" for åpnet kommandofil.
+short sStatus r UT_TRUE=OK, UT_FALSE=feil i linjen
+Usage:
+sStatus = LC_LesUtvalg(pUtAdm,pKomFil);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_LesUtvalg(LC_UT_ADM *pUtAdm,const char *pszKomFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetUtRegelName"NAME="LC_GetUtRegelName"></A><H2>LC_GetUtRegelName</H2>
+<BIG><I><B>Henter regelnavn</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter regelnavn for at programmet utenfor skal kunne sjekke
+at det er tilgjengelig videre behandling av alle definerte navn.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+short *ist iu Status (Inn: 1=start, 0=neste)
+ (Ut: 0=OK, -1=ferdig);
+char *regelpeker r Peker til utvalgsnavn.
+Usage:
+regelpeker = LC_GetUtRegelName(pUtAdm,&ist);
+ =============================================================================
+
+SK_EntPnt_FYBA char *LC_GetUtRegelName(LC_UT_ADM *pUtAdm,short *ist)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GruppeUtvalg"NAME="LC_GruppeUtvalg"></A><H2>LC_GruppeUtvalg</H2>
+<BIG><I><B>GINFO-utvalg</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker GINFO-delen av aktuell gruppe mot alle gruppeutvalg fra fil.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+short sPrior i Prioritet.
+ LC_OVERSE_PRIORITET = Tar ikke hensyn til prioritet.
+short *sstat iu Søkestatus, Inn: 1=start søk, 0=fortsett søk
+ Ut : 0=tilslag, -1=ikke tilslag
+char **regelnavn u Peker til regelnavn
+char *regelnavn u Peker til utvalgsnavn
+Usage:
+pszUtvalgsName = LC_GruppeUtvalg(pUtAdm.sPrior,&sstat,&regel);
+ =============================================================================
+
+SK_EntPnt_FYBA char *LC_GruppeUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *sstat,char **regelnavn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PunktUtvalg"NAME="LC_PunktUtvalg"></A><H2>LC_PunktUtvalg</H2>
+<BIG><I><B>PUNKT-utvalg</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Sjekker PINFO-delen av aktuell gruppe for tilslag på PUNKT-UTVALG.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+short sPrior i Prioritet.
+short *psStat iu Søkestatus, Inn: 1=start søk, 0=fortsett søk
+ Ut : 0=tilslag, -1=ikke tilslag
+long lPnr i Punktnummer som skal sjekkes.
+char **ppszRegel u Peker til regelnavn
+Usage:
+LC_PunktUtvalg(pUtAdm,sPrior,&psStat,lPnr,&ppszRegel);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_PunktUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *psStat,long lPnr,char **ppszRegel)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FinnPinfoUtvalg"NAME="LC_FinnPinfoUtvalg"></A><H2>LC_FinnPinfoUtvalg</H2>
+==========================================================================
+Purpose:
+Finner et PINFO-UTVALG i kjeden av slike utvalg.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+char *pszName i Utvalgsnavn
+LC_UTVALG * pUtvalg r Peker til utvalget. (NULL = ikke funnet)
+Usage:
+pUtvalg = LC_FinnPinfoUtvalg(pszName);
+ ==========================================================================
+
+SK_EntPnt_FYBA LC_UTVALG * LC_FinnPinfoUtvalg(LC_UT_ADM * pUtAdm,const char *pszName)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PiTestUtvalg"NAME="LC_PiTestUtvalg"></A><H2>LC_PiTestUtvalg</H2>
+<BIG><I><B>Sjekk PUNKT/PINFO utvalg</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekk om PINFO i aktuellt punkt tilfredstiller et punkt-utvalg.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_UT_ADM * pUtAdm i Administrasjonsblokk
+LC_UTVALG * pU i Peker til utvalg
+long lPnr i Punktnummer som skal sjekkes.
+short sTilslag r Status: UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+Usage:
+sTilslag = LC_PiTestUtvalg(pUtAdm,pU,lPnr);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PiTestUtvalg(LC_UT_ADM * pUtAdm,LC_UTVALG * pU,long lPnr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GiQuery"NAME="LC_GiQuery"></A><H2>LC_GiQuery</H2>
+<BIG><I><B>Query mot aktuell ginfo</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Sjekker GINFO-delen av aktuell gruppe mot aktuellt query-oppsett.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+short status r Søkestatus, UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+Usage:
+ist = LC_GiQuery(pUtAdm);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_GiQuery(LC_UT_ADM *pUtAdm)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FAGiQuery"NAME="LC_FAGiQuery"></A><H2>LC_FAGiQuery</H2>
+<BIG><I><B>Finn alle ved query mot ginfo</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Sjekker GINFO-delen av alle grupper mot aktuell queryopsett.
+Tilslag merkes i brukttabellen kolonne BT_GISOK (14).
+[Esc] avbryter utvalget, antall tilslag settes da til -1.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+short antall r Antall tilslag på utvalget.
+Usage:
+antall = LC_FAGiQuery(pUtAdm, LC_FRAMGR | LC_BAKGR);
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_FAGiQuery(LC_UT_ADM *pUtAdm,unsigned short usLag)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FAGiKombinertFlateQuery"NAME="LC_FAGiKombinertFlateQuery"></A><H2>LC_FAGiKombinertFlateQuery</H2>
+<BIG><I><B>Finn alle ved query mot ginfo i flate og omkrets</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Sjekker GINFO-delen av alle flater mot aktuell queryopsett. Finner de flatene
+som har tilslag på utvalgsblokken pUtAdmFlate og har har referanser til grupper
+som har tilslag på utvalgsblokken pUtAdmOmkrets.
+Tilslag merkes i brukttabellen kolonne BT_GISOK (30).
+[Esc] avbryter utvalget, antall tilslag settes da til -1.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdmFlate i Peker til administrasjonsblokk for utvalg for flata.
+LC_UT_ADM *pUtAdmOmkrets i Peker til administrasjonsblokk for utvalg for omkrets.
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+short sAlle i Flagg for hvorvidt utvalg for omkrets må slå til på
+ alle gruppene i omkretsen. TRUE/FALSE
+short antall r Antall tilslag på utvalget.
+Usage:
+antall = LC_FAGiQuery(pUtAdm, LC_FRAMGR | LC_BAKGR);
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_FAGiKombinertFlateQuery(LC_UT_ADM * pUtAdmFlate,LC_UT_ADM * pUtAdmOmkrets,
+ unsigned short usLag,short sMetode)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_QueryGP"NAME="LC_QueryGP"></A><H2>LC_QueryGP</H2>
+<BIG><I><B>Søk i ginfo og finn verdi</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Bruker query-tekst for å finne linje der parameter skal hentes.
+Parameters:
+Type Name I/O Explanation
+---------------------------------------------------------------------------
+char *qulin i Linje med query-tekst.
+unsigned short iniv i Nivå: Det er definert konstanter som henges
+ sammen med "|".
+ LC_GINFO = søk i GINFO på aktuell gruppe
+ LC_HODE = søk i filhodet
+ Hvis begge er brukt søkes det først i GINFO.
+unsigned short *univ u Nivå: LC_GINFO = parameter er fra GINFO
+ LC_HODE = parameter er fra filhodet
+short *ulin u GINFO-linjenummer for tilslaget.
+char **para u Funnet parameter.
+short funnet r Status: UT_TRUE=funnet, UT_FALSE=ikke funnet
+Usage:
+funnet = LC_QueryGP(qulin,LC_GINFO | LC_HODE,&univ,&ulin,&para);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_QueryGP(char *qulin,unsigned short iniv,unsigned short *univ,short *ulin,char **para)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqMaxPrioritet"NAME="LC_InqMaxPrioritet"></A><H2>LC_InqMaxPrioritet</H2>
+<BIG><I><B>Hent største prioritet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter største prioritet for gitt utvalgstype.
+Parameters:
+Type Name I/O Explanation
+----------------------------------------------------------------------
+LC_UT_ADM * pUA i Peker til administrasjonsblokk for utvalg.
+short sMaxPrioritet r Max prioritet
+Usage:
+sMaxPrioritet = LC_InqMaxPrioritet(pUA);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_InqMaxPrioritet(LC_UT_ADM * pUA)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_TestPrioritetBrukt"NAME="LC_TestPrioritetBrukt"></A><H2>LC_TestPrioritetBrukt</H2>
+<BIG><I><B>Tester om en prioritet er brukt</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Tester om en prioritet er brukt.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+short sPrioritet i Prioritet som skal testes.
+short sBrukt r Status: UT_TRUE=brukt, UT_FALSE=ikke brukt.
+Usage:
+sBrukt = LC_TestPrioritetBrukt(pUtAdm,sPrioritet);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_TestPrioritetBrukt(LC_UT_ADM * pUtAdm,short sPrioritet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UtvalgPrioritet"NAME="LC_UtvalgPrioritet"></A><H2>LC_UtvalgPrioritet</H2>
+<BIG><I><B>Finn brukt prioritet</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker GINFO og PINFO for å finne hvilke prioriteter som "berører" aktuell
+gruppe. Resultatet markeres i Gruppetabellen ulPrior.
+Parameters:
+Type Name I/O Explanation
+---------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+Usage:
+LC_UtvalgPrioritet(pUtAdm);
+ ===========================================================================
+
+SK_EntPnt_FYBA void LC_UtvalgPrioritet(LC_UT_ADM *pUtAdm)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O38"NAME="O38"></A><H1>20 Marking Groups</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetBt"NAME="LC_SetBt"></A><H2>LC_SetBt</H2>
+<BIG><I><B>Sett merke i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Legg inn merke i brukttabellen.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+short kolonne i Kolonne som skal merkes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+Usage:
+LC_SetBt(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetBt(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ClrBt"NAME="LC_ClrBt"></A><H2>LC_ClrBt</H2>
+<BIG><I><B>Slett merke i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Fjern merke i brukttabellen.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal merkes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+Usage:
+LC_ClrBt(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_ClrBt(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBt"NAME="LC_GetBt"></A><H2>LC_GetBt</H2>
+<BIG><I><B>Hent merke i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Hent merke i brukttabellen.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal brukes.
+ (Lovlig BT_MIN_BT - BT_MAX_BT)
+merke short r UT_FALSE = ikke marka, UT_TRUE = merka
+Usage:
+merke = LC_GetBt(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetBt(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_EraseBt"NAME="LC_EraseBt"></A><H2>LC_EraseBt</H2>
+<BIG><I><B>Slett område i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Blanker en eller flere kolonner i brukttabellen i aktuell base.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+fra_kol short i Første kolonne som skal blankes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+til_kol short i Siste kolonne som skall blankes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+Usage:
+LC_EraseBt(fra_kol,til_kol);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_EraseBt(short fra_kol,short til_kol)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CopyBt"NAME="LC_CopyBt"></A><H2>LC_CopyBt</H2>
+<BIG><I><B>Kopier kolonne i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Kopier kolonne i brukttabellen.
+Samtidig er det mulig å utføre logiske operasjoner mellom de to kolonnene.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short fra_kol i Kolonne det skal kopieres fra. (Lovlig 0 - BT_MAX_BT)
+short til_kol i Kolonne det skal kopieres til. (Lovlig 1 - BT_MAX_USER)
+short operasjon i Logisk operasjon mellom kolonnene.
+ BC_COPY = Overskriv gammelt innhold.
+ BC_AND = Logisk AND mellom de to kolonnene.
+ BC_OR = Logisk OR mellom de to kolonnene.
+ BC_INVERT = Overskriv gammelt innhold med
+ invertert verdi.
+ BC_EXCHANGE = Bytter innholdet i de to kolonnene.
+
+Usage:
+LC_CopyBt(fra_kol,til_kol,operasjon);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_CopyBt(short fra_kol,short til_kol,short operasjon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetModusMerk"NAME="LC_SetModusMerk"></A><H2>LC_SetModusMerk</H2>
+<BIG><I><B>Setter flag for merking av referert gruppe.</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Setter flag for merking av referert gruppe.
+Har innvirkning for virkemåten til:
+LC_FAGeo, LC_FASn, og LC_FAGiQuery
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+unsigned short modus i 0 = Ikke merk referert gruppe.
+ 1 = Merk referert gruppe.
+Usage:
+LC_SetModusMerk(1);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetModusMerk(unsigned short usModus)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_MerkGr"NAME="LC_MerkGr"></A><H2>LC_MerkGr</H2>
+<BIG><I><B>Merk en gruppe brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+CH Merk aktuell gruppe i brukttabellen. Hvis flag for merking av referert
+gruppe er satt, blir også eventuelle refererte grupper merket.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short sKolonne i Kolonne som skal merkes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+short sBryter i Bryter 1=på, 0=av
+long lAntall r Antall grupper merket.
+Usage:
+lAntall = LC_MerkGr(sKolonne,sBryter);
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_MerkGr(short sKolonne,short sBryter)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O39"NAME="O39"></A><H1>21 Special Handling of Polygons</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Polygonbeskrivelse"NAME="Polygonbeskrivelse"></A><H2>Polygon Description</H2>
+<BIG><I><B>Structs for polygon description.</I></B></BIG><PRE>
+
+This is a set of structs that are linked together in order to form complete description
+of a polygon. Examples usage can be found in:
+<A HREF="file:///LC_POL_GetRef">LC_POL_GetRef</A>.
+
+
+ !-----------------!
+ ! LC_POLYGON !
+ ! ! !-------------------------!
+ ! !- Omkrets --! ! ! !-----------------! !---------------!
+ ! !LC_POL_OMKR ! ! ! !-!LC_POL_ELEMENT ! !-!LC_POL_ELEMENT !
+ ! ! ! ! ! ! ! - Bgr ! ! ! - Bgr !
+ ! !- Siste !--!-------! ! ! - Snr ! ! ! - Snr !
+ ! !- Første !--!---------! ! - Retning ! ! ! - Retning !
+ ! !------------! ! ! - Forrige (NULL)! ! ! - Forrige !
+ ! !- Hull ------! ! ! - Neste !-! ! - Neste (NULL)!
+ ! !LC_OY_ADM ! ! !-----------------! !---------------!
+ ! ! ! !
+ ! !- Første øy !-!-!
+!-!-!- Siste øy ! ! !
+! ! !-------------! ! !
+! !-----------------! !
+! !-----------------!
+! ! !------------------------!
+! ! !------------! ! !-----------------! !---------------!
+! !--------------! !-!LC_POL_OMKR ! ! !-!LC_POL_ELEMENT !!!LC_POL_ELEMENT !
+! !LC_OY_ELEMENT ! ! ! ! ! ! ! - Bgr !!! - Bgr !
+! !- Omkrets !--! !- Siste !-! ! ! - Snr !!! - Snr !
+! !- Neste !-! !- Første !---! ! - Retning !!! - Retning !
+! !--------------! ! !------------! ! - Forrige (NULL)!!! - Forrige !
+! ! ! - Neste !!! - Neste (NULL)!
+! ! !-----------------! !---------------!
+! !
+! !---------------! !--------------------------!
+! ! !------------! ! !-----------------! !---------------!
+! !--------------! !-!LC_POL_OMKR ! ! !-!LC_POL_ELEMENT ! !-!LC_POL_ELEMENT !
+!--!LC_OY_ELEMENT ! ! ! ! ! ! ! - Bgr ! ! ! - Bgr !
+ !- Omkrets !--! !- Siste !-! ! ! - Snr ! ! ! - Snr !
+ !- Neste (NULL)! !- Første !---! ! - Retning ! ! ! - Retning !
+ !--------------! !------------! ! - Forrige (NULL)! ! ! - Forrige !
+ ! - Neste !-! ! - Neste (NULL)!
+ !-----------------! !---------------!
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_InitPolygon"NAME="LC_POL_InitPolygon"></A><H2>LC_POL_InitPolygon</H2>
+<BIG><I><B>Initierer polygon-struktur</I></B></BIG><PRE>
+=======================================================================
+Purpose:
+Initierer polygon-struktur.
+Parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Peikar til polygonbeskrivelse
+Usage:
+LC_POLYGON Polygon;
+LC_POL_InitPolygon(&Polygon);
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_InitPolygon(LC_POLYGON *pPolygon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FrigiPolygon"NAME="LC_POL_FrigiPolygon"></A><H2>LC_POL_FrigiPolygon</H2>
+<BIG><I><B>Frigi minne som er allokert til polygon</I></B></BIG><PRE>
+=======================================================================
+Purpose:
+Frigir minne som er allokert til polygon. (Både omkrets og hull.)
+Parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Peikar til polygonbeskrivelse
+Usage:
+LC_POLYGON Polygon;
+LC_POL_FrigiPolygon(&Polygon);
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FrigiPolygon(LC_POLYGON *pPolygon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_InitOmkrets"NAME="LC_POL_InitOmkrets"></A><H2>LC_POL_InitOmkrets</H2>
+<BIG><I><B>Initierer polygon-omkrets</I></B></BIG><PRE>
+=======================================================================
+Usage:
+POL_OMKR YtrePolygon;
+LC_POL_InitOmkrets(YtrePolygon);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POL_OMKR *pPO I/O Peikar til polygonadministrasjonsblokka
+Initierer administrasjonsblokka for polygonelement
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_InitOmkrets(LC_POL_OMKR *pPO)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_LeggTilGruppeOmkrets"NAME="LC_POL_LeggTilGruppeOmkrets"></A><H2>LC_POL_LeggTilGruppeOmkrets</H2>
+<BIG><I><B>Legg til eit element</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_POL_OMKR YtrePolygon;
+pElement = LC_POL_LeggTilGruppeOmkrets(YtrePolygon,pBgr,sRetning,lSnr);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POL_OMKR * pPO I/O Peikar til polygonadministrasjonsblokka
+LC_BGR * pBgr I Gruppenummer
+short sRetning I Nøsteretning (LC_MED_DIG eller LC_MOT_DIG)
+long lSnr I Serienummer
+LC_POL_ELEMENT * pElement R Peker til innlagt element
+Legg til eit element i kjeden av polygonelement.
+=======================================================================
+
+SK_EntPnt_FYBA LC_POL_ELEMENT * LC_POL_LeggTilGruppeOmkrets(LC_POL_OMKR *pPO,LC_BGR *pBgr,
+ short sRetning, long lSnr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FjernGruppeOmkrets"NAME="LC_POL_FjernGruppeOmkrets"></A><H2>LC_POL_FjernGruppeOmkrets</H2>
+<BIG><I><B>Fjernar element</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_POL_OMKR YtrePolygon;
+LC_POL_FjernGruppeOmkrets(&YtrePolygon,);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POL_OMKR *pPO I/O Peikar til polygonadministrasjonsblokka
+LC_POL_ELEMENT *pPE I Peker til element som skal fjernes
+Fjernar et element i kjeden av polygonelement.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FjernGruppeOmkrets(LC_POL_OMKR *pPO, LC_POL_ELEMENT *pPE)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FjernSisteGruppeOmkrets"NAME="LC_POL_FjernSisteGruppeOmkrets"></A><H2>LC_POL_FjernSisteGruppeOmkrets</H2>
+<BIG><I><B>Fjernar siste element</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_POL_OMKR YtrePolygon;
+LC_POL_FjernSisteGruppeOmkrets(&YtrePolygon);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POL_OMKR * pPO I/O Peikar til polygonadministrasjonsblokka
+Fjernar siste element i kjeden av polygonelement.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FjernSisteGruppeOmkrets(LC_POL_OMKR *pPO)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FrigiOmkrets"NAME="LC_POL_FrigiOmkrets"></A><H2>LC_POL_FrigiOmkrets</H2>
+<BIG><I><B>Frigjer minne som er allokert til kjede av polygonelement</I></B></BIG><PRE>
+=======================================================================
+Usage:
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POL_OMKR *pPO I/O Peikar til polygonadministrasjonsblokka
+Frigir minne som er allokert til kjede av polygonelement.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FrigiOmkrets(LC_POL_OMKR *pPO)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_InitOy"NAME="LC_POL_InitOy"></A><H2>LC_POL_InitOy</H2>
+<BIG><I><B>Initierer øy-kjeden</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_OY_ADM OyKjede;
+LC_POL_InitOy(OyKjede);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_OY_ADM *pOA I/O Peikar til øyadministrasjonsblokka
+Initierer øy-kjeden.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_InitOy(LC_OY_ADM *pOA)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FrigiAlleOyer"NAME="LC_POL_FrigiAlleOyer"></A><H2>LC_POL_FrigiAlleOyer</H2>
+<BIG><I><B>Frigjer minne som er allokert til kjede av øyelement</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_OY_ADM OyKjede;
+LC_POL_FrigiAlleOyer(OyKjede);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_OY_ADM *pOA I/O Peikar til øyadministrasjonsblokka
+Frigjer minne som er allokert til kjede av øy (i polygon) - element.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FrigiAlleOyer(LC_OY_ADM *pOA)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FjernOy"NAME="LC_POL_FjernOy"></A><H2>LC_POL_FjernOy</H2>
+<BIG><I><B>Fjernar ei oy frå kjede av øyelement</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_OY_ADM OyKjede;
+LC_POL_FjernOy(OyKjede,OyElement);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_OY_ADM *pOA I/O Peikar til øyadministrasjonsblokka
+LC_OY_ELEMENT *pOE I/O Peikar til kjede av oyar
+Frigjer minne som er allokert til kjede av øy (i polygon) - element.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FjernOy(LC_OY_ADM *pOA,LC_OY_ELEMENT *pOE)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_LeggTilOy"NAME="LC_POL_LeggTilOy"></A><H2>LC_POL_LeggTilOy</H2>
+<BIG><I><B>Legg til eit element</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_OY_ADM OyKjede;
+LC_POL_LeggTilOy(&OyKjede,pPO);
+Parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_OY_ADM *pOyKjede I/O Peikar til kjede av øyelement
+LC_POL_OMKR *pPO I Peikar til polygonadministrasjonsblokka
+Legg til eit element i kjeden av øyar (i polygon) - element.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_LeggTilOy(LC_OY_ADM *pOA,LC_POL_OMKR *pPO)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_TestBrukt"NAME="LC_POL_TestBrukt"></A><H2>LC_POL_TestBrukt</H2>
+<BIG><I><B>Testar om ei gruppe er brukt i polygonet</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_POL_TestBrukt(pPolygon,&Bgr);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Peker til polygonbeskrivelse.
+LC_BGR *pBgr I Peikar til gruppe
+short status R Status UT_TRUE = gruppe er brukt i polygonet
+ Status UT_FALSE = gruppe er IKKJE brukt i polygonet
+Testar om ei gruppe er brukt i gitt polygon.
+=======================================================================
+
+SK_EntPnt_FYBA short LC_POL_TestBrukt(LC_POLYGON *pPolygon,LC_BGR *pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_PutRef"NAME="LC_POL_PutRef"></A><H2>LC_POL_PutRef</H2>
+<BIG><I><B>Legger inn referanser i GINFO</I></B></BIG><PRE>
+=======================================================================
+Purpose:
+Legger inn referanser i GINFO, ut fra beskrivelse i struktur.
+Parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Polygonbeskrivelse
+short ngi r Antall linjer GINFO
+Usage:
+ngi = LC_POL_PutRef(pPolygon);
+=======================================================================
+
+SK_EntPnt_FYBA short LC_POL_PutRef(LC_POLYGON *pPolygon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_GetRef"NAME="LC_POL_GetRef"></A><H2>LC_POL_GetRef</H2>
+<BIG><I><B>Hent referanser for flate fra GINFO</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter referanser fra GINFO til struktur.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Peker til adm. for polygonbeskrivelse
+Usage:
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_POLYGON Polygon;
+ LC_POL_ELEMENT * pPE;
+ LC_OY_ELEMENT * pOE;
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+ . Omkretsen .
+ for(pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ gnavn = LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ .
+ Behandle ytre avgrensing
+ .
+ }
+ . Øyer .
+ for (pOE = Polygon.OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ gnavn = LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ .
+ Behandle indre avgrensing (øy)
+ .
+ }
+ }
+ . Frigi allokerte kjeder .
+ LC_POL_FrigiPolygon(&Polygon);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_POL_GetRef(LC_POLYGON *pPolygon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_GetRefOmkrets"NAME="LC_POL_GetRefOmkrets"></A><H2>LC_POL_GetRefOmkrets</H2>
+<BIG><I><B>Hent referanser for omkretsen av flate</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter referanser fra GINFO til struktur.
+Rutinen initierer strukturen pPO, men frigir ikke eventuellt gammelt innhold.
+Parameters:
+Type Name I/O Explanation
+-------------------------------------------------------------------------
+LC_POL_OMKR *pPO; IU Peker til kjede som beskriver omkretsen.
+Usage:
+ LC_POL_GetRefOmkrets(&OyPO);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_POL_GetRefOmkrets(LC_POL_OMKR *pPO)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_PTst"NAME="LC_POL_PTst"></A><H2>LC_POL_PTst</H2>
+<BIG><I><B>Polygontest</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker om gitt punkt ligger innenfor polygon angitt av pPolygon.
+Forutsetter at pPolygon danner et lukket polygon.
+Skifter ikke aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double a i Punkt som skal sjekkes
+double n i
+short ist r status: UT_FALSE = punktet er utenfor flaten
+ UT_TRUE = punktet ligger inne på flaten
+Usage:
+.
+==========================================================================
+
+SK_EntPnt_FYBA short LC_POL_PTst(LC_POLYGON *pPolygon,double a,double n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_PTstOmkrets"NAME="LC_POL_PTstOmkrets"></A><H2>LC_POL_PTstOmkrets</H2>
+<BIG><I><B>Sjekk om punkt ligger inni polygonomkrets</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekker om gitt punkt ligger innenfor yttergrensen for polygon angitt
+av struktur.
+Forutsetter at tabellen danner et lukket polygon
+Skifter ikke aktuell gruppe.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_POL_OMKR *pPO I/O Peker til beskrivelse av omkretsen
+double a i Punkt som skal sjekkes
+double n i
+short ist r status: UT_FALSE = punktet er utenfor flaten
+ UT_TRUE = punktet ligger inne på flaten
+Usage:
+ist = LC_POL_PTstOmkrets(pPO,a,n);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_POL_PTstOmkrets(LC_POL_OMKR *pPO,double a,double n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_Box"NAME="LC_POL_Box"></A><H2>LC_POL_Box</H2>
+<BIG><I><B>Henter omskreven boks</I></B></BIG><PRE>
+=======================================================================
+Usage:
+LC_POL_Box(pPA,&nva,&nvn,&oha,&ohn);
+parametere:
+Type Name I/O Explanation
+-----------------------------------------------------------------------
+LC_POL_OMKR *pPO I Peikar til polygonadministrasjonsblokka
+double *nva U
+double *nvn U
+double *oha U
+double *ohn U
+Henter omskriven boks for polygon.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_Box(LC_POL_OMKR *pPO,double *nva,double *nvn, double *oha,double*ohn)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O40"NAME="O40"></A><H1>22 Various Functions</H1>
+
+<BR>
+<BR>
+<BR>
+<A ID="O41"NAME="O41"></A><H2>22.1 Calculations</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerAreal"NAME="LC_BerAreal"></A><H2>LC_BerAreal</H2>
+<BIG><I><B>Calculate the area of the active group</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Beregner arealet av aktuell gruppe hvis denne er flate.
+Referansene brukes for arealberegningen.
+Tar hensyn til fradrag for øyer.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double areal u Beregnet areal
+Usage:
+areal = LC_BerAreal();
+ =============================================================================
+
+SK_EntPnt_FYBA double LC_BerAreal(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerLengde"NAME="LC_BerLengde"></A><H2>LC_BerLengde</H2>
+<BIG><I><B>Calculate the horizonal length of the active group</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Beregn horisontal lengde av aktuell gruppe.
+Tar ikke hensyn til høyde/dybde.
+Referansene brukes IKKE i beregningen.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double lengde u Beregnet lengde
+Usage:
+areal = LC_BerLengde();
+=============================================================================
+
+SK_EntPnt_FYBA double LC_BerLengde(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerLengde3D"NAME="LC_BerLengde3D"></A><H2>LC_BerLengde3D</H2>
+<BIG><I><B>Calculate the diagonal length of the active group</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Beregn skrå lengde av aktuell gruppe.
+Krever at det finnes høyde/dybde i alle punkt.
+Referansene brukes IKKE i beregningen.
+Beregner bare for LINJE og KURVE.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double lengde u Beregnet lengde
+bool beregnet r Status som viser om lengde er beregnet
+Usage:
+beregnet = LC_BerLengde3D(&skraa_lengde);
+=============================================================================
+
+SK_EntPnt_FYBA bool LC_BerLengde3D(double *skraa_lengde)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerAvgrensLengde"NAME="LC_BerAvgrensLengde"></A><H2>LC_BerAvgrensLengde</H2>
+<BIG><I><B>Calculate the length of the perimeter of a polygon</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Beregn lengden av avgrensningen av aktuell gruppe hvis denne er flate.
+Både indre og ytre avgrensning beregnes.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double lengde u Beregnet areal
+Usage:
+lengde = LC_BerAvgrensLengde();
+=============================================================================
+
+SK_EntPnt_FYBA double LC_BerAvgrensLengde(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerYtreAvgrensLengde"NAME="LC_BerYtreAvgrensLengde"></A><H2>LC_BerYtreAvgrensLengde</H2>
+<BIG><I><B>Calculate the length of the outer perimeter of a polygon</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Beregn lengden av ytre avgrensningen av aktuell gruppe hvis denne er flate.
+Bare ytre avgrensning beregnes.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double lengde u Beregnet lengde
+Usage:
+lengde = LC_BerYtreAvgrensLengde();
+=============================================================================
+
+SK_EntPnt_FYBA double LC_BerYtreAvgrensLengde(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerIndreAvgrensLengde"NAME="LC_BerIndreAvgrensLengde"></A><H2>LC_BerIndreAvgrensLengde</H2>
+<BIG><I><B>Calculate the length of the inner perimeter of a polygon</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Beregn lengden av indre avgrensningen av aktuell gruppe hvis denne er flate.
+Bare indre avgrensning beregnes.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+double lengde u Beregnet lengde
+Usage:
+lengde = LC_BerIndreAvgrensLengde();
+=============================================================================
+
+SK_EntPnt_FYBA double LC_BerIndreAvgrensLengde(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_RoundKoord"NAME="LC_RoundKoord"></A><H2>LC_RoundKoord</H2>
+<BIG><I><B>Change the coordinates in the active group to the correct unit</I></B></BIG><PRE>
+===========================================================================
+Purpose:
+Endrer koordinatene i aktuell gruppe i buffer til valgt enhet.
+(Rutinen blir utført fra LC_WxGr.)
+Parameters: ingen
+Usage:
+LC_RoundKoord();
+==============================================================================
+
+SK_EntPnt_FYBA void LC_RoundKoord(void)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O42"NAME="O42"></A><H2>22.2 Structure Changes</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SnuGr"NAME="LC_SnuGr"></A><H2>LC_SnuGr</H2>
+<BIG><I><B>Invert group order</I></B></BIG><PRE>
+===========================================================================
+Purpose:
+Snur en gruppe.
+Rutinen tilsvarer put fra brukerprogram inn i ringbufret.
+Både koordinater, høyde, KP og PINFO blir behandlet.
+For .BUE blir fortegnet på radius endret.
+Fortegnet på referanser til gruppen blir oppdatert.
+Det er ikke mulig å snu gruppe som er referert fra grupper som
+ikke kan oppdateres. (Flate/trase som er sjekket ut av andre i NGIS.)
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short sStatus r Status: UT_TRUE = OK
+ UT_FALSE = feil, ikke splittet
+Usage:
+ status = LC_SnuGr();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_SnuGr(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SammenfoyGr"NAME="LC_SammenfoyGr"></A><H2>LC_SammenfoyGr</H2>
+<BIG><I><B>Merge groups</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sammenføye to grupper.
+Kopierer koordinater fra gitt gruppe inn i aktuell gruppe.
+De kopierte koordinatene kommer som en utvidelse av gruppen.
+Rutinen tildeler selv nødvendig plass i buffer.
+Kvalitet og enhet blir automatisk oppdatert slik at gruppene ikke
+mister informasjon.
+Gruppen det kopieres fra blir slettet.
+Eventuelle referanser til gruppene blir oppdatert.
+Det er ikke mulig å sammenføye hvis en av gruppene er referert fra grupper
+som ikke kan oppdateres. (Flate/trase som er sjekket ut av andre i NGIS.)
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+LC_BGR * pFraBgr i Gruppenummer det skal kopieres fra.
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snus.
+short plassering i Forteller hvor pFraBgr skal plasseres i
+ aktuell gruppe.
+ LC_SG_FORRAN = Heng den andre gruppen inn
+ foran første koordinat.
+ LC_SG_BAK = Heng den andre gruppen inn
+ etter siste koordinat.
+short metode i Forteller hva som skal skje med sammenføingspunktene.
+ LC_SG_BEHOLD = Begge punktene beholdes.
+ LC_SG_FJERN = Bare det ene av punktene beholdes.
+short ngi u Antall GINFO-linjer
+long nko u Antall koordinater
+unsigned short info u Diverse informasjon. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+short sStatus r Status: UT_TRUE=OK, UT_FALSE=ikke utført.
+Usage:
+sStatus = LC_SammenfoyGr(bgr,retning,plassering,metode,&ngi,&nko,&info);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_SammenfoyGr(LC_BGR * pFraBgr,short retning,short plassering,short metode,
+ short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SplittGr"NAME="LC_SplittGr"></A><H2>LC_SplittGr</H2>
+<BIG><I><B>Split group</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Splitter aktuell gruppe i to deler.
+Første del av gruppen beholdes som aktuell gruppe. Denne blir ikke
+skrevet til SOSI-filen, men buffer er oppdatert.
+Siste del av gruppen legges som en ny gruppe på samme fil som
+opprinnelig gruppe. Denne blir skrevet til basen.
+Den delen av gruppen som ligger mellom P1 og P2 blir fjernet.
+Hvis gruppen er BUEP og en av delene får bare to koordinater
+blir det lagt inn et nytt punkt midt på buen.
+Det er ikke mulig å splitte grupper som er referert fra grupper som
+ikke kan oppdateres. (Flate/trase som er sjekket ut av andre i NGIS.)
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+long sP1 i Punktnummer 1. (Må være større enn 1)
+long sP2 i Punktnummer 2. (Må være mindre enn nko)
+LC_BGR * pBgr2 u Nytt gruppenummer for siste del av gruppen.
+short sStatus r Status: UT_TRUE = OK
+ UT_FALSE = feil, ikke splittet
+Usage:
+sStatus = LC_SplittGr(sP1,sP2,&Bgr2);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_SplittGr (long sP1,long sP2,LC_BGR * pBgr2)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErstattReferanse"NAME="LC_ErstattReferanse"></A><H2>LC_ErstattReferanse</H2>
+<BIG><I><B>Replace reference</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Erstatt referanse i alle grupper i gitt fil.
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Fil som skal behandles
+long lGmlSnr i Gruppe som skal byttes ut
+long lNyttSnr i Ny gruppe
+ Verdien 0 fører til gammelt serienummer
+ fjernes uten at det legges inn noe nytt.
+bool bSammeRetning i Gruppene er digitalisert i samme retning
+Usage:
+sStatus = LC_ErstattReferanse(pFil, lGmlSnr, lNyttSnr, bSammeRetning);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_ErstattReferanse (LC_FILADM *pFil,long lGmlSnr,long lNyttSnr, bool bSammeRetning)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O43"NAME="O43"></A><H2>22.3 The Entire Base</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqAntFiler"NAME="LC_InqAntFiler"></A><H2>LC_InqAntFiler</H2>
+<BIG><I><B>Get number of files in the base</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Finn antall filer i aktuell base.
+Parameters:
+Type Name I/O Explanation
+-------------------------------------------------------------------
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+ (Bruk "|" for å kombinere.)
+short sAntall r Antall filer i aktuell base.
+Usage:
+ Finner antall framgrunnsfiler i basen
+ sAntall = LC_InqAntFiler(LC_FRAMGR);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_InqAntFiler(unsigned short usLag)
+</PRE>
+
+
+<BR>
+<BR>
+<BR>
+<A ID="O44"NAME="O44"></A><H2>22.4 Priority</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ClrPrioritet"NAME="LC_ClrPrioritet"></A><H2>LC_ClrPrioritet</H2>
+<BIG><I><B>Clear priority bit</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Slett prioritets-bit.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal merkes.
+ (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+Usage:
+LC_ClrPrioritet(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_ClrPrioritet(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetPrioritet"NAME="LC_SetPrioritet"></A><H2>LC_SetPrioritet</H2>
+<BIG><I><B>Set priority bit</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sett prioritets-bit.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal merkes.
+ (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+Usage:
+LC_SetPrioritet(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetPrioritet(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqPrioritet"NAME="LC_InqPrioritet"></A><H2>LC_InqPrioritet</H2>
+<BIG><I><B>Get priority bit</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Hent prioritets-bit.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal hentes.
+ (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+short sAvPaa r Av eller På (UT_TRUE = På, UT_FALSE = Av)
+Usage:
+sAvPaa = LC_InqPrioritet(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_InqPrioritet(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErasePrioritet"NAME="LC_ErasePrioritet"></A><H2>LC_ErasePrioritet</H2>
+<BIG><I><B>Erase priority bit</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Blank ut prioritets-bit.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+Usage:
+LC_ErasePrioritet(pGr);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_ErasePrioritet(LC_BGR * pGr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_EraseAllPrioritet"NAME="LC_EraseAllPrioritet"></A><H2>LC_EraseAllPrioritet</H2>
+<BIG><I><B>Erase all priority bits</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Blank ut alle prioritets-bit på alle gruppene i denne filen.
+Parameters:
+Name Type I/O Explanation
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Filpeker
+Usage:
+LC_EraseAllPrioritet(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_EraseAllPrioritet(LC_FILADM *pFil)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O45"NAME="O45"></A><H2>22.5 Quality</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FormatterKvalitet"NAME="LC_FormatterKvalitet"></A><H2>LC_FormatterKvalitet</H2>
+<BIG><I><B>Format for KVALITET</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Formater parameterstrengen for KVALITET.
+Resultatet legges i en intern streng, og må kopieres over til andre
+variabler før endring.
+Parameters:
+Type Name I/O Explanation
+-------------------------------------------------------------------------
+short sMetode i Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+ KVAL_MET_STD standard metode fra nivå over.
+long lNoyaktighet i Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+ KVAL_NOY_STD standard nøyaktighet fra nivå over
+short sSynbarhet i Synbarhet i bilde
+ KVAL_SYN_GOD godt synlig.
+ KVAL_SYN_UNDEF synbarhet er udefinert.
+ KVAL_SYN_STD standard metode fra nivå over.
+short sHoydeMetode i Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+ KVAL_MET_STD standard metode fra nivå over.
+long lHoydeNoyaktighet i Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+ KVAL_NOY_STD standard nøyaktighet fra nivå over
+char *pszParameter r Peker til '/0'-avslutta streng.
+Usage:
+ pszParameter = LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,
+ sHoydeMetode,lHoydeNoyaktighet);
+=============================================================================
+
+SK_EntPnt_FYBA char *LC_FormatterKvalitet(short sMetode,long lNoyaktighet,short sSynbarhet,
+ short sHoydeMetode,long lHoydeNoyaktighet)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O46"NAME="O46"></A><H2>22.6 Table Handling</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitTabel"NAME="LC_InitTabel"></A><H2>LC_InitTabel</H2>
+<BIG><I><B>Initialise the table system</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Initierer tabellsystemet og åpner filen.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+long n_rec i Antall reckords som skal nullstilles. Disse kan
+ etterpå brukes til tilfeldig aksess. Utvidelse
+ av filen kan senere bare skje i fortløpende
+ rekkefølge.
+short rec_len i Reckordlengde. (Bruk sizeof for å finne lengden.)
+void *buffer i Peker til buffer som skal brukes for nullstilling.
+short ist r Status. (0=OK, -1=feil)
+Usage:
+ .
+ struct{
+ long snr;
+ short ngi;
+ short nko;
+ } buffer;
+ .
+ .
+ ist = LC_InitTabel(10000L,sizeof buffer,(void *)(&buffer));
+ .
+ ist = LC_PutTabel(linje,(void *)&buffer);
+ .
+ ist = LC_GetTabel(linje,(void *)&buffer);
+ .
+ LC_CloseTabel();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_InitTabel(long n_rec,short rec_len,void *buffer)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTabel"NAME="LC_PutTabel"></A><H2>LC_PutTabel</H2>
+<BIG><I><B>Add one line to the table file (push)</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Legg inn en linje fra tabellfilen.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+long linje i Linjenummer som skal legges inn. (0 er første linje)
+ (Største lovlige er 1 større enn det største hittil.)
+void *buffer i Peker til struktur som skal legges inn.
+short ist r Status (0=OK, -1=feil)
+Usage:
+ist = LC_PutTabel(linje,(void *)&buffer);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_PutTabel(long linje,void *buffer)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTabel"NAME="LC_GetTabel"></A><H2>LC_GetTabel</H2>
+<BIG><I><B>Get one line from the table file</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Henter en linje fra tabellfilen.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+long linje i Linjenummer som skal hentes. (0 er første linje)
+void *buffer i Peker til struktur som skal ta mot lest reckord.
+short ist r Status (0=OK, -1=feil)
+Usage:
+ist = LC_GetTabel(linje,(void *)&buffer);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_GetTabel(long linje,void *buffer)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CloseTabel"NAME="LC_CloseTabel"></A><H2>LC_CloseTabel</H2>
+<BIG><I><B>Close the table system</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Avslutter tabellsystemet og stenger og sletter filen.
+Tabellen kan nå åpnes på nytt for annen bruk.
+Parameters: ingen
+
+Usage:
+LC_CloseTabel();
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_CloseTabel(void)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O47"NAME="O47"></A><H2>22.7 Message Handling</H2>
+FYBA has a feature which makes it possible to let the calling program handle the
+messages for the user.
+This is made up of callback-functions which are called from FYBA for error message
+handling and to present the progress while the indices are being built.
+
+One example implementation can be found in Fyba_Callback.cpp.
+In order to have a good user interface, these functions should be changed such that
+they use the message and error handling system that is used by the main program.
+
+If FYBA is used as a DLL, the message handling functions must be registered with
+the following functions:
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetErrorHandler"NAME="LC_SetErrorHandler"></A><H2>LC_SetErrorHandler</H2>
+<BIG><I><B>Set error handler</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Registrer feilmeldingsrutine.
+Feilmeldingsrutinen blir kallt hvis det oppstår feil.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+void (*f) (short ,char *,char *) i Peker til feilmeldingsrutine
+Usage:
+LC_SetErrorHandler(ErrorHandler);
+Feilmeldingsrutinen skal ha følgende definisjon:
+void ErrorHandler(short feil_nr,const char *logtx,const char *vartx);
+Med følgende Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short feil_nr i Feil-nummer
+char *logtx i Tekst som bare skrives til logfil.
+ Eks:"(utført i LC_RxGr)"
+char *vartx i Denne tekststreng henges etter feilmeldingsteksten.
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetErrorHandler(void (*f) (short,const char*,const char*))
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetStartMessageHandler"NAME="LC_SetStartMessageHandler"></A><H2>LC_SetStartMessageHandler</H2>
+<BIG><I><B>Set start message handler</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Registrer initieringsrutine.
+Initieringsrutinen blir kalt for å starte visning av framdrift.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+void (*f)(char*) i Peker til initieringsrutine
+Usage:
+LC_SetStartMessageHandler(StartMessageHandler);
+Initieringsrutinen skal ha følgende definisjon:
+void StartMessageHandler(char *pszFilnavn);
+Med følgende Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+char *pszFilnavn i Ekstra meldingstekst (filnavn)
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetStartMessageHandler(void (*f)(const char*))
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetShowMessageHandler"NAME="LC_SetShowMessageHandler"></A><H2>LC_SetShowMessageHandler</H2>
+<BIG><I><B>Set show message handler</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Registrer visningsrutine.
+Visningsrutine blir kalt for å vise framdrift ved indeks-oppbygging.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+void (*f)(double) i Peker til visningsrutine
+Usage:
+LC_SetShowMessageHandler(ShowMessageHandler);
+Visningsrutinen skal ha følgende definisjon:
+void ShowMessageHandler(double prosent);
+Med følgende Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+double prosent i Prosent ferdig (0.0 - 100.0)
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetShowMessageHandler(void (*f)(double))
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetEndMessageHandler"NAME="LC_SetEndMessageHandler"></A><H2>LC_SetEndMessageHandler</H2>
+<BIG><I><B>Set end message handler</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Registrer avslutningsrutine.
+Avslutningsrutinen blir kalt for å avslutte visning av framdrift ved indeksoppbygging.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+void (*f)(void) i Peker til avslutningsrutine
+Usage:
+LC_SetEndMessageHandler(EndMessageHandler);
+Avslutningsrutinen skal ha følgende definisjon:
+void EndMessageHandler(void);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetEndMessageHandler(void (*f)(void))
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetCancelHandler"NAME="LC_SetCancelHandler"></A><H2>LC_SetCancelHandler</H2>
+<BIG><I><B>Set cancel handler</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Registrer avbruddsstyring.
+Rutine for avbruddsstyring blir kalt for å sjekke om bruker ønsker
+å avbryte beregningen.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short (*f)(void) i Peker til rutine for avbruddsstyring.
+Usage:
+LC_SetCancelHandler(CancelHandler);
+Rutine for avbruddsstyring skal ha følgende definisjon:
+short CancelHandler(void);
+Med følgende Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short sAvbrutt r UT_TRUE = Cancel
+ UT_FALSE = ikke avbrudd
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetCancelHandler(short (*f)(void))
+</PRE>
+
+En tilsvarende enkel feilmeldingshandtering ligger i FYBA_DLL.dll.
+Denne (DLL'ens) meldingshandteringen blir brukt hvis ekstern meldingshandtering
+ikke blir aktivisert.
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_StartMessage"NAME="LC_StartMessage"></A><H2>LC_StartMessage</H2>
+<BIG><I><B>Start message</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Starter vising av melding om baseoppbygging.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+char *pszFilnavn i Ekstra meldingstekst (filnavn)
+Usage:
+LC_StartMessage(pszFilnavn);
+=============================================================================
+
+void LC_StartMessage(const char *pszFilnavn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ShowMessage"NAME="LC_ShowMessage"></A><H2>LC_ShowMessage</H2>
+<BIG><I><B>Show message</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Vising av melding om baseoppbygging.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+double prosent i Prosent ferdig (0.0 - 100.0)
+Usage:
+LC_ShowMessage(prosent);
+=============================================================================
+
+void LC_ShowMessage(double prosent)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_EndMessage"NAME="LC_EndMessage"></A><H2>LC_EndMessage</H2>
+<BIG><I><B>End message</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Avslutt melding om baseoppbygging.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+Usage:
+LC_EndMessage();
+=============================================================================
+
+void LC_EndMessage(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Cancel"NAME="LC_Cancel"></A><H2>LC_Cancel</H2>
+<BIG><I><B>Check if Esc has been pushed</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Sjekk om det er trykkt på Esc (Avbryte indeksoppbygging).
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short sAvbrutt r UT_TRUE = Cancel
+ UT_FALSE = ikke avbrudd
+Usage:
+sAvbrutt = LC_Cancel();
+==========================================================================
+
+short LC_Cancel(void)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Error"NAME="LC_Error"></A><H2>LC_Error</H2>
+<BIG><I><B>Error message function</I></B></BIG><PRE>
+=============================================================================
+Purpose:
+Standard feilmeldingsrutine.
+Parameters:
+Type Name I/O Explanation
+-----------------------------------------------------------------------------
+short feil_nr i Feil-nummer
+char *logtx i Tekst som bare skrives til logfil.
+ Eks:"(utført i LC_RxGr)"
+char *vartx i Denne tekststreng henges etter feilmeldingsteksten.
+Usage:
+LC_Error(35,"(Kallt i LC_Xxxx)","");
+=============================================================================
+
+void LC_Error(short feil_nr,const char *logtx,const char *vartx)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O48"NAME="O48"></A><H2>22.8 Helper Functions for Message Handling</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_StrError"NAME="LC_StrError"></A><H2>LC_StrError</H2>
+<BIG><I><B>Error message text</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Henter feilmeldingstekst og nivå for et feilmeldingsnummer.
+Strengen legges i en egen feilmeldingsstruktur for feil-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "feil-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+short feil_nr i Feilmeldingsnummer
+char **feilmelding u Peker til feilmeldingstekst avslutta med '/0'.
+short *strategi r Feilnivå (0-4)
+ 0 = Ikke i bruk. (Utkoblet, testmeldinger mm.)
+ 1 = Lite alvorlig. Vises kort.
+ 2 = Normal feilmelding. Vises ca. 1 sekund.
+ 3 = Alvorlig. Krev tastetrykk for å fortsette.
+ 4 = Svært alvorlig. Programmet bør avbrytes.
+Usage:
+strategi = LC_StrError(ckap,feil_nr,&feilmeldingspeker);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_StrError(short feil_nr,char **feilmelding)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O49"NAME="O49"></A><H2>22.9 Debugging</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DumpTab"NAME="LC_DumpTab"></A><H2>LC_DumpTab</H2>
+<BIG><I><B>Dump internal tables to stderr</I></B></BIG><PRE>
+==========================================================================
+Purpose:
+Dump internal tables to stderr
+Parameters:
+Type Name I/O Explanation
+--------------------------------------------------------------------------
+Usage:
+LC_DumpTab();
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_DumpTab(void)
+</PRE>
+
+
+
+
+
+
+
+</BODY></HTML>
diff --git a/doc/no_NB/fyba.html b/doc/no_NB/fyba.html
new file mode 100644
index 0000000..eadab98
--- /dev/null
+++ b/doc/no_NB/fyba.html
@@ -0,0 +1,10 @@
+<HTML>
+<HEAD>
+<META http-equiv="Content-Type" CONTENT="text/htm; iso-8859-1">
+<TITLE>FYBA</TITLE>
+</HEAD>
+<frameset COLS="20%,80%">
+<frame SRC="fyba1.html" NAME="Felt1" scrolling =auto>
+<frame SRC="fyba2.html" NAME="Felt2" scrolling =auto>
+</frameset>
+</HTML>
diff --git a/doc/no_NB/fyba1.html b/doc/no_NB/fyba1.html
new file mode 100644
index 0000000..1599735
--- /dev/null
+++ b/doc/no_NB/fyba1.html
@@ -0,0 +1,304 @@
+<HTML>
+<HEAD>
+<META http-equiv="Content-Type" CONTENT="text/htm; iso-8859-1">
+</HEAD>
+<STYLE>
+<
+BODY {background: white; color: black}
+A {font-size: 9pt; color: blue ; text-decoration: none; font-family: arial, helvetica, sans-serif;}
+PRE {font-size: 10pt; font-family: arial, helvetica, sans-serif;}
+>
+</STYLE>
+<BODY>
+<PRE><B>Innhold:</B>
+<P><A HREF="fyba2.html" target="Felt2"><FONT COLOR=BLACK>Topp</FONT></A>
+<P><A HREF="fyba2.html#O1" target="Felt2"><FONT COLOR=BLACK><B>1 Innledning</B></FONT></A>
+<P><A HREF="fyba2.html#O2" target="Felt2"><FONT COLOR=BLACK><B>2 Oversikt over funksjonaliteten til FYBA</B></FONT></A>
+<P><A HREF="fyba2.html#O3" target="Felt2"><FONT COLOR=BLACK><B>3 Indeks-systemets oppbygning</B></FONT></A>
+<A HREF="fyba2.html#Gruppetabell" target="Felt2">- Gruppetabell</A>
+<A HREF="fyba2.html#Brukttabell" target="Felt2">- Brukttabell</A>
+<A HREF="fyba2.html#SOSI-buffer" target="Felt2">- SOSI-buffer</A>
+<A HREF="fyba2.html#Serienummer-tabell" target="Felt2">- Serienummer-tabell</A>
+<A HREF="fyba2.html#Geografisk-søketabell" target="Felt2">- Geografisk-søketabell</A>
+<P><A HREF="fyba2.html#O4" target="Felt2"><FONT COLOR=BLACK><B>4 Navnekonvensjoner</B></FONT></A>
+<P><A HREF="fyba2.html#O5" target="Felt2"><FONT COLOR=BLACK><B>5 Initiering og styring</B></FONT></A>
+<A HREF="fyba2.html#LC_Init" target="Felt2">- LC_Init</A>
+<A HREF="fyba2.html#LC_InqVer" target="Felt2">- LC_InqVer</A>
+<A HREF="fyba2.html#LC_Close" target="Felt2">- LC_Close</A>
+<A HREF="fyba2.html#LC_ErInitiert" target="Felt2">- LC_ErInitiert</A>
+<A HREF="fyba2.html#LC_MaxSkriv" target="Felt2">- LC_MaxSkriv</A>
+<A HREF="fyba2.html#LC_InqMaxSkriv" target="Felt2">- LC_InqMaxSkriv</A>
+<A HREF="fyba2.html#LC_SetNgisModus" target="Felt2">- LC_SetNgisModus</A>
+<A HREF="fyba2.html#LC_SetDefLpfi" target="Felt2">- LC_SetDefLpfi</A>
+<A HREF="fyba2.html#LC_InqDefLpfi" target="Felt2">- LC_InqDefLpfi</A>
+<A HREF="fyba2.html#LC_SetUtvidModus" target="Felt2">- LC_SetUtvidModus</A>
+<A HREF="fyba2.html#LC_GetUtvidModus" target="Felt2">- LC_GetUtvidModus</A>
+<P><A HREF="fyba2.html#O6" target="Felt2"><FONT COLOR=BLACK><B>6 Åpning av base og sosi-filer</B></FONT></A>
+<A HREF="fyba2.html#LC_OpenBase" target="Felt2">- LC_OpenBase</A>
+<A HREF="fyba2.html#LC_CloseBase" target="Felt2">- LC_CloseBase</A>
+<A HREF="fyba2.html#LC_SelectBase" target="Felt2">- LC_SelectBase</A>
+<A HREF="fyba2.html#LC_InqCurBase" target="Felt2">- LC_InqCurBase</A>
+<A HREF="fyba2.html#LC_OpenSos" target="Felt2">- LC_OpenSos</A>
+<A HREF="fyba2.html#LC_CloseSos" target="Felt2">- LC_CloseSos</A>
+<A HREF="fyba2.html#LC_DelIdx" target="Felt2">- LC_DelIdx</A>
+<A HREF="fyba2.html#LC_FcloseSos" target="Felt2">- LC_FcloseSos</A>
+<P><A HREF="fyba2.html#O7" target="Felt2"><FONT COLOR=BLACK><B>7 Hjelpefunksjoner</B></FONT></A>
+<P><A HREF="fyba2.html#O8" target="Felt2"><FONT COLOR=GREEN><B>7.1 Base og fil</B></FONT></A>
+<A HREF="fyba2.html#LC_GetBaOm" target="Felt2">- LC_GetBaOm</A>
+<A HREF="fyba2.html#LC_GetFiOm" target="Felt2">- LC_GetFiOm</A>
+<A HREF="fyba2.html#LC_GetFiNr" target="Felt2">- LC_GetFiNr</A>
+<A HREF="fyba2.html#LC_GetFiNa" target="Felt2">- LC_GetFiNa</A>
+<A HREF="fyba2.html#LC_GetTegnsett" target="Felt2">- LC_GetTegnsett</A>
+<A HREF="fyba2.html#LC_InqLag" target="Felt2">- LC_InqLag</A>
+<A HREF="fyba2.html#LC_InqFilLag" target="Felt2">- LC_InqFilLag</A>
+<A HREF="fyba2.html#LC_SetFilLag" target="Felt2">- LC_SetFilLag</A>
+<A HREF="fyba2.html#LC_FiLastGr" target="Felt2">- LC_FiLastGr</A>
+<A HREF="fyba2.html#LC_ErFilBase" target="Felt2">- LC_ErFilBase</A>
+<A HREF="fyba2.html#LC_ErKoordsysLik" target="Felt2">- LC_ErKoordsysLik</A>
+<A HREF="fyba2.html#LC_ErVertdatumLik" target="Felt2">- LC_ErVertdatumLik</A>
+<A HREF="fyba2.html#LC_Backup" target="Felt2">- LC_Backup</A>
+<A HREF="fyba2.html#LC_GetNgisLag" target="Felt2">- LC_GetNgisLag</A>
+<A HREF="fyba2.html#LC_SetFilType" target="Felt2">- LC_SetFilType</A>
+<A HREF="fyba2.html#LC_GetFilType" target="Felt2">- LC_GetFilType</A>
+<A HREF="fyba2.html#LC_ErLik_Avrundet" target="Felt2">- LC_ErLik_Avrundet</A>
+<A HREF="fyba2.html#LC_ErLik_IkkeAvrundet" target="Felt2">- LC_ErLik_IkkeAvrundet</A>
+<A HREF="fyba2.html#LC_ErReferert" target="Felt2">- LC_ErReferert</A>
+<P><A HREF="fyba2.html#O9" target="Felt2"><FONT COLOR=GREEN><B>7.2 SOSI-gruppe</B></FONT></A>
+<A HREF="fyba2.html#LC_GetGrNr" target="Felt2">- LC_GetGrNr</A>
+<A HREF="fyba2.html#LC_GetGrPara" target="Felt2">- LC_GetGrPara</A>
+<A HREF="fyba2.html#LC_GetGrParaBgr" target="Felt2">- LC_GetGrParaBgr</A>
+<A HREF="fyba2.html#LC_GetGrFi" target="Felt2">- LC_GetGrFi</A>
+<A HREF="fyba2.html#LC_SetEndringsstatus" target="Felt2">- LC_SetEndringsstatus</A>
+<P><A HREF="fyba2.html#O10" target="Felt2"><FONT COLOR=GREEN><B>7.3 Hode, aktuell gruppe</B></FONT></A>
+<A HREF="fyba2.html#LC_NyttHode" target="Felt2">- LC_NyttHode</A>
+<A HREF="fyba2.html#LC_TestHode" target="Felt2">- LC_TestHode</A>
+<A HREF="fyba2.html#LC_GetOmr" target="Felt2">- LC_GetOmr</A>
+<A HREF="fyba2.html#LC_PutOmr" target="Felt2">- LC_PutOmr</A>
+<A HREF="fyba2.html#LC_GetTrans" target="Felt2">- LC_GetTrans</A>
+<A HREF="fyba2.html#LC_GetTransEx" target="Felt2">- LC_GetTransEx</A>
+<A HREF="fyba2.html#LC_PutTrans" target="Felt2">- LC_PutTrans</A>
+<A HREF="fyba2.html#LC_PutTransEx" target="Felt2">- LC_PutTransEx</A>
+<P><A HREF="fyba2.html#O11" target="Felt2"><FONT COLOR=GREEN><B>7.4 Hode, direkte fra SOSI-fil</B></FONT></A>
+<A HREF="fyba2.html#HO_New" target="Felt2">- HO_New</A>
+<A HREF="fyba2.html#HO_TestSOSI" target="Felt2">- HO_TestSOSI</A>
+<A HREF="fyba2.html#HO_GetKvalitet" target="Felt2">- HO_GetKvalitet</A>
+<A HREF="fyba2.html#HO_GetTegnsett" target="Felt2">- HO_GetTegnsett</A>
+<A HREF="fyba2.html#HO_GetVal" target="Felt2">- HO_GetVal</A>
+<A HREF="fyba2.html#HO_GetTrans" target="Felt2">- HO_GetTrans</A>
+<A HREF="fyba2.html#HO_GetTransEx" target="Felt2">- HO_GetTransEx</A>
+<A HREF="fyba2.html#HO_GetOmr" target="Felt2">- HO_GetOmr</A>
+<A HREF="fyba2.html#HO_SjekkTegnsett" target="Felt2">- HO_SjekkTegnsett</A>
+<P><A HREF="fyba2.html#O12" target="Felt2"><FONT COLOR=BLACK><B>8 Ny gruppe</B></FONT></A>
+<A HREF="fyba2.html#LC_NyGr" target="Felt2">- LC_NyGr</A>
+<P><A HREF="fyba2.html#O13" target="Felt2"><FONT COLOR=BLACK><B>9 Direkte les/skriv</B></FONT></A>
+<A HREF="fyba2.html#LC_RxGr" target="Felt2">- LC_RxGr</A>
+<A HREF="fyba2.html#LC_WxGr" target="Felt2">- LC_WxGr</A>
+<P><A HREF="fyba2.html#O14" target="Felt2"><FONT COLOR=BLACK><B>10 Sekvensiell les/skriv</B></FONT></A>
+<A HREF="fyba2.html#LC_RsGr" target="Felt2">- LC_RsGr</A>
+<A HREF="fyba2.html#LC_RsHode" target="Felt2">- LC_RsHode</A>
+<A HREF="fyba2.html#LC_WsGr" target="Felt2">- LC_WsGr</A>
+<A HREF="fyba2.html#LC_WsGrPart" target="Felt2">- LC_WsGrPart</A>
+<A HREF="fyba2.html#LC_EndreHode" target="Felt2">- LC_EndreHode</A>
+<P><A HREF="fyba2.html#O15" target="Felt2"><FONT COLOR=BLACK><B>11 Slette gruppe</B></FONT></A>
+<A HREF="fyba2.html#LC_DelGr" target="Felt2">- LC_DelGr</A>
+<P><A HREF="fyba2.html#O16" target="Felt2"><FONT COLOR=BLACK><B>12 Tilbakeskriving av buffret info til SOSI-fil</B></FONT></A>
+<A HREF="fyba2.html#LC_Save" target="Felt2">- LC_Save</A>
+<P><A HREF="fyba2.html#O17" target="Felt2"><FONT COLOR=BLACK><B>13 Reservere plass i ringbuffer</B></FONT></A>
+<A HREF="fyba2.html#LC_InsGiL" target="Felt2">- LC_InsGiL</A>
+<A HREF="fyba2.html#LC_AppGiL" target="Felt2">- LC_AppGiL</A>
+<A HREF="fyba2.html#LC_InsKoL" target="Felt2">- LC_InsKoL</A>
+<A HREF="fyba2.html#LC_AppKoL" target="Felt2">- LC_AppKoL</A>
+<A HREF="fyba2.html#LC_DelGiL" target="Felt2">- LC_DelGiL</A>
+<A HREF="fyba2.html#LC_DelKoL" target="Felt2">- LC_DelKoL</A>
+<P><A HREF="fyba2.html#O18" target="Felt2"><FONT COLOR=BLACK><B>14 Legge data inn i ringbuffer</B></FONT></A>
+<P><A HREF="fyba2.html#O19" target="Felt2"><FONT COLOR=GREEN><B>14.1 Kopiere gruppe</B></FONT></A>
+<A HREF="fyba2.html#LC_CopyGr" target="Felt2">- LC_CopyGr</A>
+<A HREF="fyba2.html#LC_CopyCoord" target="Felt2">- LC_CopyCoord</A>
+<P><A HREF="fyba2.html#O20" target="Felt2"><FONT COLOR=GREEN><B>14.2 Gruppeinforasjon</B></FONT></A>
+<A HREF="fyba2.html#LC_PutGi" target="Felt2">- LC_PutGi</A>
+<A HREF="fyba2.html#LC_PutGP" target="Felt2">- LC_PutGP</A>
+<A HREF="fyba2.html#LC_AppGP" target="Felt2">- LC_AppGP</A>
+<A HREF="fyba2.html#LC_UpdateGP" target="Felt2">- LC_UpdateGP</A>
+<A HREF="fyba2.html#LC_UpdateGiEnhet" target="Felt2">- LC_UpdateGiEnhet</A>
+<A HREF="fyba2.html#LC_UpdateGiKvalitet" target="Felt2">- LC_UpdateGiKvalitet</A>
+<A HREF="fyba2.html#LC_UpdatePiKvalitet" target="Felt2">- LC_UpdatePiKvalitet</A>
+<A HREF="fyba2.html#LC_OppdaterEndret" target="Felt2">- LC_OppdaterEndret</A>
+<A HREF="fyba2.html#LC_DelGiNavn" target="Felt2">- LC_DelGiNavn</A>
+<A HREF="fyba2.html#LC_FinnNivo" target="Felt2">- LC_FinnNivo</A>
+<P><A HREF="fyba2.html#O21" target="Felt2"><FONT COLOR=GREEN><B>14.3 Serienummer og referansenummer</B></FONT></A>
+<A HREF="fyba2.html#LC_PutSn" target="Felt2">- LC_PutSn</A>
+<A HREF="fyba2.html#LC_PutRef" target="Felt2">- LC_PutRef</A>
+<P><A HREF="fyba2.html#O22" target="Felt2"><FONT COLOR=GREEN><B>14.4 Koordinater</B></FONT></A>
+<A HREF="fyba2.html#LC_PutTK" target="Felt2">- LC_PutTK</A>
+<A HREF="fyba2.html#LC_PutTH" target="Felt2">- LC_PutTH</A>
+<A HREF="fyba2.html#LC_PutTD" target="Felt2">- LC_PutTD</A>
+<P><A HREF="fyba2.html#O23" target="Felt2"><FONT COLOR=GREEN><B>14.5 Knutepunkt</B></FONT></A>
+<A HREF="fyba2.html#LC_PutKp" target="Felt2">- LC_PutKp</A>
+<P><A HREF="fyba2.html#O24" target="Felt2"><FONT COLOR=GREEN><B>14.6 Punktinformasjon</B></FONT></A>
+<A HREF="fyba2.html#LC_PutPi" target="Felt2">- LC_PutPi</A>
+<P><A HREF="fyba2.html#O25" target="Felt2"><FONT COLOR=BLACK><B>15 Hente data fra ringbuffer</B></FONT></A>
+<P><A HREF="fyba2.html#O26" target="Felt2"><FONT COLOR=GREEN><B>15.1 Generell verdi til et SOSI-navn</B></FONT></A>
+<P><A HREF="fyba2.html#O27" target="Felt2"><FONT COLOR=GREEN><B>15.2 Gruppeinforasjon</B></FONT></A>
+<A HREF="fyba2.html#LC_GetGi" target="Felt2">- LC_GetGi</A>
+<A HREF="fyba2.html#LC_GetGP" target="Felt2">- LC_GetGP</A>
+<P><A HREF="fyba2.html#O28" target="Felt2"><FONT COLOR=GREEN><B>15.3 Serienummer og referansenummer</B></FONT></A>
+<A HREF="fyba2.html#LC_GetSn" target="Felt2">- LC_GetSn</A>
+<A HREF="fyba2.html#LC_GetRef" target="Felt2">- LC_GetRef</A>
+<A HREF="fyba2.html#LC_InqAntRef" target="Felt2">- LC_InqAntRef</A>
+<A HREF="fyba2.html#LC_InitGetRefFlate" target="Felt2">- LC_InitGetRefFlate</A>
+<A HREF="fyba2.html#LC_GetRefFlate" target="Felt2">- LC_GetRefFlate</A>
+<A HREF="fyba2.html#LC_ErLinjeRefLin" target="Felt2">- LC_ErLinjeRefLin</A>
+<P><A HREF="fyba2.html#O29" target="Felt2"><FONT COLOR=GREEN><B>15.4 Spesielle get-rutiner</B></FONT></A>
+<A HREF="fyba2.html#LC_GetBuePar" target="Felt2">- LC_GetBuePar</A>
+<A HREF="fyba2.html#LC_GetBue" target="Felt2">- LC_GetBue</A>
+<A HREF="fyba2.html#LC_GetBuep" target="Felt2">- LC_GetBuep</A>
+<A HREF="fyba2.html#LC_GetSirkel" target="Felt2">- LC_GetSirkel</A>
+<A HREF="fyba2.html#LC_GetSirkelp" target="Felt2">- LC_GetSirkelp</A>
+<A HREF="fyba2.html#LC_GetKvalitet" target="Felt2">- LC_GetKvalitet</A>
+<P><A HREF="fyba2.html#O30" target="Felt2"><FONT COLOR=GREEN><B>15.5 Koordinater</B></FONT></A>
+<A HREF="fyba2.html#LC_GetTK" target="Felt2">- LC_GetTK</A>
+<A HREF="fyba2.html#LC_GetArrayTK" target="Felt2">- LC_GetArrayTK</A>
+<A HREF="fyba2.html#LC_GetTH" target="Felt2">- LC_GetTH</A>
+<A HREF="fyba2.html#LC_GetArrayTH" target="Felt2">- LC_GetArrayTH</A>
+<A HREF="fyba2.html#LC_GetHoyde" target="Felt2">- LC_GetHoyde</A>
+<A HREF="fyba2.html#LC_GetTD" target="Felt2">- LC_GetTD</A>
+<A HREF="fyba2.html#LC_GetDybde" target="Felt2">- LC_GetDybde</A>
+<P><A HREF="fyba2.html#O31" target="Felt2"><FONT COLOR=GREEN><B>15.6 Knutepunkt</B></FONT></A>
+<A HREF="fyba2.html#LC_GetKp" target="Felt2">- LC_GetKp</A>
+<A HREF="fyba2.html#LC_FinnKp" target="Felt2">- LC_FinnKp</A>
+<P><A HREF="fyba2.html#O32" target="Felt2"><FONT COLOR=GREEN><B>15.7 Punktinformasjon</B></FONT></A>
+<A HREF="fyba2.html#LC_GetPi" target="Felt2">- LC_GetPi</A>
+<A HREF="fyba2.html#LC_InitPP" target="Felt2">- LC_InitPP</A>
+<A HREF="fyba2.html#LC_GetPP" target="Felt2">- LC_GetPP</A>
+<A HREF="fyba2.html#LC_GetPiVerdi" target="Felt2">- LC_GetPiVerdi</A>
+<A HREF="fyba2.html#LC_TestPi" target="Felt2">- LC_TestPi</A>
+<P><A HREF="fyba2.html#O33" target="Felt2"><FONT COLOR=GREEN><B>15.8 Spesielle henteoperasjoner</B></FONT></A>
+<A HREF="fyba2.html#LC_GetCurEnhet" target="Felt2">- LC_GetCurEnhet</A>
+<A HREF="fyba2.html#LC_GetCurKvalitet" target="Felt2">- LC_GetCurKvalitet</A>
+<A HREF="fyba2.html#LC_GetObjtypeBgr" target="Felt2">- LC_GetObjtypeBgr</A>
+<A HREF="fyba2.html#LC_GetElementNavn" target="Felt2">- LC_GetElementNavn</A>
+<P><A HREF="fyba2.html#O34" target="Felt2"><FONT COLOR=BLACK><B>16 Blaing i basen</B></FONT></A>
+<A HREF="fyba2.html#LC_InitNextFil" target="Felt2">- LC_InitNextFil</A>
+<A HREF="fyba2.html#LC_NextFil" target="Felt2">- LC_NextFil</A>
+<A HREF="fyba2.html#LC_InitNextBgr" target="Felt2">- LC_InitNextBgr</A>
+<A HREF="fyba2.html#LC_NextBgr" target="Felt2">- LC_NextBgr</A>
+<P><A HREF="fyba2.html#O35" target="Felt2"><FONT COLOR=BLACK><B>17 Geografisk søking</B></FONT></A>
+<A HREF="fyba2.html#LC_GetGrWin" target="Felt2">- LC_GetGrWin</A>
+<A HREF="fyba2.html#LC_SBFlate" target="Felt2">- LC_SBFlate</A>
+<A HREF="fyba2.html#LC_FFFlate" target="Felt2">- LC_FFFlate</A>
+<A HREF="fyba2.html#LC_FNFlate" target="Felt2">- LC_FNFlate</A>
+<A HREF="fyba2.html#LC_SBGeo" target="Felt2">- LC_SBGeo</A>
+<A HREF="fyba2.html#LC_FFGeo" target="Felt2">- LC_FFGeo</A>
+<A HREF="fyba2.html#LC_FNGeo" target="Felt2">- LC_FNGeo</A>
+<A HREF="fyba2.html#LC_FAGeo" target="Felt2">- LC_FAGeo</A>
+<A HREF="fyba2.html#LC_FFGeoFil" target="Felt2">- LC_FFGeoFil</A>
+<A HREF="fyba2.html#LC_FNGeoFil" target="Felt2">- LC_FNGeoFil</A>
+<A HREF="fyba2.html#LC_AvsluttSok" target="Felt2">- LC_AvsluttSok</A>
+<A HREF="fyba2.html#LC_WTst" target="Felt2">- LC_WTst</A>
+<A HREF="fyba2.html#LC_PTst" target="Felt2">- LC_PTst</A>
+<A HREF="fyba2.html#LC_PTstOmkrets" target="Felt2">- LC_PTstOmkrets</A>
+<P><A HREF="fyba2.html#O36" target="Felt2"><FONT COLOR=BLACK><B>18 Serienummer-søking</B></FONT></A>
+<A HREF="fyba2.html#LC_SBSn" target="Felt2">- LC_SBSn</A>
+<A HREF="fyba2.html#LC_MoveSn" target="Felt2">- LC_MoveSn</A>
+<A HREF="fyba2.html#LC_FiSn" target="Felt2">- LC_FiSn</A>
+<A HREF="fyba2.html#LC_FiArraySn" target="Felt2">- LC_FiArraySn</A>
+<A HREF="fyba2.html#LC_FASn" target="Felt2">- LC_FASn</A>
+<A HREF="fyba2.html#LC_FFSn" target="Felt2">- LC_FFSn</A>
+<A HREF="fyba2.html#LC_FNSn" target="Felt2">- LC_FNSn</A>
+<A HREF="fyba2.html#LC_FPSn" target="Felt2">- LC_FPSn</A>
+<A HREF="fyba2.html#LC_FLSn" target="Felt2">- LC_FLSn</A>
+<A HREF="fyba2.html#LC_FFSnBt" target="Felt2">- LC_FFSnBt</A>
+<A HREF="fyba2.html#LC_FNSnBt" target="Felt2">- LC_FNSnBt</A>
+<A HREF="fyba2.html#LC_FPSnBt" target="Felt2">- LC_FPSnBt</A>
+<A HREF="fyba2.html#LC_FLSnBt" target="Felt2">- LC_FLSnBt</A>
+<P><A HREF="fyba2.html#O37" target="Felt2"><FONT COLOR=BLACK><B>19 Egenskapsutvalg</B></FONT></A>
+<A HREF="fyba2.html#LC_OpenQuery" target="Felt2">- LC_OpenQuery</A>
+<A HREF="fyba2.html#LC_CloseQuery" target="Felt2">- LC_CloseQuery</A>
+<A HREF="fyba2.html#LC_PutQueryLine" target="Felt2">- LC_PutQueryLine</A>
+<A HREF="fyba2.html#LC_PutQueryRegel" target="Felt2">- LC_PutQueryRegel</A>
+<A HREF="fyba2.html#LC_LesUtvalg" target="Felt2">- LC_LesUtvalg</A>
+<A HREF="fyba2.html#LC_GetUtRegelNavn" target="Felt2">- LC_GetUtRegelNavn</A>
+<A HREF="fyba2.html#LC_GruppeUtvalg" target="Felt2">- LC_GruppeUtvalg</A>
+<A HREF="fyba2.html#LC_PunktUtvalg" target="Felt2">- LC_PunktUtvalg</A>
+<A HREF="fyba2.html#LC_FinnPinfoUtvalg" target="Felt2">- LC_FinnPinfoUtvalg</A>
+<A HREF="fyba2.html#LC_PiTestUtvalg" target="Felt2">- LC_PiTestUtvalg</A>
+<A HREF="fyba2.html#LC_GiQuery" target="Felt2">- LC_GiQuery</A>
+<A HREF="fyba2.html#LC_FAGiQuery" target="Felt2">- LC_FAGiQuery</A>
+<A HREF="fyba2.html#LC_FAGiKombinertFlateQuery" target="Felt2">- LC_FAGiKombinertFlateQuery</A>
+<A HREF="fyba2.html#LC_QueryGP" target="Felt2">- LC_QueryGP</A>
+<A HREF="fyba2.html#LC_InqMaxPrioritet" target="Felt2">- LC_InqMaxPrioritet</A>
+<A HREF="fyba2.html#LC_TestPrioritetBrukt" target="Felt2">- LC_TestPrioritetBrukt</A>
+<A HREF="fyba2.html#LC_UtvalgPrioritet" target="Felt2">- LC_UtvalgPrioritet</A>
+<P><A HREF="fyba2.html#O38" target="Felt2"><FONT COLOR=BLACK><B>20 Merke grupper</B></FONT></A>
+<A HREF="fyba2.html#LC_SetBt" target="Felt2">- LC_SetBt</A>
+<A HREF="fyba2.html#LC_ClrBt" target="Felt2">- LC_ClrBt</A>
+<A HREF="fyba2.html#LC_GetBt" target="Felt2">- LC_GetBt</A>
+<A HREF="fyba2.html#LC_EraseBt" target="Felt2">- LC_EraseBt</A>
+<A HREF="fyba2.html#LC_CopyBt" target="Felt2">- LC_CopyBt</A>
+<A HREF="fyba2.html#LC_SetModusMerk" target="Felt2">- LC_SetModusMerk</A>
+<A HREF="fyba2.html#LC_MerkGr" target="Felt2">- LC_MerkGr</A>
+<P><A HREF="fyba2.html#O39" target="Felt2"><FONT COLOR=BLACK><B>21 Spesiell handtering av flater</B></FONT></A>
+<A HREF="fyba2.html#Polygonbeskrivelse" target="Felt2">- Polygonbeskrivelse</A>
+<A HREF="fyba2.html#LC_POL_InitPolygon" target="Felt2">- LC_POL_InitPolygon</A>
+<A HREF="fyba2.html#LC_POL_FrigiPolygon" target="Felt2">- LC_POL_FrigiPolygon</A>
+<A HREF="fyba2.html#LC_POL_InitOmkrets" target="Felt2">- LC_POL_InitOmkrets</A>
+<A HREF="fyba2.html#LC_POL_LeggTilGruppeOmkrets" target="Felt2">- LC_POL_LeggTilGruppeOmkrets</A>
+<A HREF="fyba2.html#LC_POL_FjernGruppeOmkrets" target="Felt2">- LC_POL_FjernGruppeOmkrets</A>
+<A HREF="fyba2.html#LC_POL_FjernSisteGruppeOmkrets" target="Felt2">- LC_POL_FjernSisteGruppeOmkrets</A>
+<A HREF="fyba2.html#LC_POL_FrigiOmkrets" target="Felt2">- LC_POL_FrigiOmkrets</A>
+<A HREF="fyba2.html#LC_POL_InitOy" target="Felt2">- LC_POL_InitOy</A>
+<A HREF="fyba2.html#LC_POL_FrigiAlleOyer" target="Felt2">- LC_POL_FrigiAlleOyer</A>
+<A HREF="fyba2.html#LC_POL_FjernOy" target="Felt2">- LC_POL_FjernOy</A>
+<A HREF="fyba2.html#LC_POL_LeggTilOy" target="Felt2">- LC_POL_LeggTilOy</A>
+<A HREF="fyba2.html#LC_POL_TestBrukt" target="Felt2">- LC_POL_TestBrukt</A>
+<A HREF="fyba2.html#LC_POL_PutRef" target="Felt2">- LC_POL_PutRef</A>
+<A HREF="fyba2.html#LC_POL_GetRef" target="Felt2">- LC_POL_GetRef</A>
+<A HREF="fyba2.html#LC_POL_GetRefOmkrets" target="Felt2">- LC_POL_GetRefOmkrets</A>
+<A HREF="fyba2.html#LC_POL_PTst" target="Felt2">- LC_POL_PTst</A>
+<A HREF="fyba2.html#LC_POL_PTstOmkrets" target="Felt2">- LC_POL_PTstOmkrets</A>
+<A HREF="fyba2.html#LC_POL_Box" target="Felt2">- LC_POL_Box</A>
+<P><A HREF="fyba2.html#O40" target="Felt2"><FONT COLOR=BLACK><B>22 Diverse funksjoner</B></FONT></A>
+<P><A HREF="fyba2.html#O41" target="Felt2"><FONT COLOR=GREEN><B>22.1 Beregninger</B></FONT></A>
+<A HREF="fyba2.html#LC_BerAreal" target="Felt2">- LC_BerAreal</A>
+<A HREF="fyba2.html#LC_BerLengde" target="Felt2">- LC_BerLengde</A>
+<A HREF="fyba2.html#LC_BerLengde3D" target="Felt2">- LC_BerLengde3D</A>
+<A HREF="fyba2.html#LC_BerAvgrensLengde" target="Felt2">- LC_BerAvgrensLengde</A>
+<A HREF="fyba2.html#LC_BerYtreAvgrensLengde" target="Felt2">- LC_BerYtreAvgrensLengde</A>
+<A HREF="fyba2.html#LC_BerIndreAvgrensLengde" target="Felt2">- LC_BerIndreAvgrensLengde</A>
+<A HREF="fyba2.html#LC_RoundKoord" target="Felt2">- LC_RoundKoord</A>
+<P><A HREF="fyba2.html#O42" target="Felt2"><FONT COLOR=GREEN><B>22.2 Strukturendring</B></FONT></A>
+<A HREF="fyba2.html#LC_SnuGr" target="Felt2">- LC_SnuGr</A>
+<A HREF="fyba2.html#LC_SammenfoyGr" target="Felt2">- LC_SammenfoyGr</A>
+<A HREF="fyba2.html#LC_SplittGr" target="Felt2">- LC_SplittGr</A>
+<A HREF="fyba2.html#LC_ErstattReferanse" target="Felt2">- LC_ErstattReferanse</A>
+<P><A HREF="fyba2.html#O43" target="Felt2"><FONT COLOR=GREEN><B>22.3 Hele basen</B></FONT></A>
+<A HREF="fyba2.html#LC_InqAntFiler" target="Felt2">- LC_InqAntFiler</A>
+<P><A HREF="fyba2.html#O44" target="Felt2"><FONT COLOR=GREEN><B>22.4 Prioritet</B></FONT></A>
+<A HREF="fyba2.html#LC_ClrPrioritet" target="Felt2">- LC_ClrPrioritet</A>
+<A HREF="fyba2.html#LC_SetPrioritet" target="Felt2">- LC_SetPrioritet</A>
+<A HREF="fyba2.html#LC_InqPrioritet" target="Felt2">- LC_InqPrioritet</A>
+<A HREF="fyba2.html#LC_ErasePrioritet" target="Felt2">- LC_ErasePrioritet</A>
+<A HREF="fyba2.html#LC_EraseAllPrioritet" target="Felt2">- LC_EraseAllPrioritet</A>
+<P><A HREF="fyba2.html#O45" target="Felt2"><FONT COLOR=GREEN><B>22.5 Kvalitet</B></FONT></A>
+<A HREF="fyba2.html#LC_FormatterKvalitet" target="Felt2">- LC_FormatterKvalitet</A>
+<P><A HREF="fyba2.html#O46" target="Felt2"><FONT COLOR=GREEN><B>22.6 Tabellhandtering</B></FONT></A>
+<A HREF="fyba2.html#LC_InitTabel" target="Felt2">- LC_InitTabel</A>
+<A HREF="fyba2.html#LC_PutTabel" target="Felt2">- LC_PutTabel</A>
+<A HREF="fyba2.html#LC_GetTabel" target="Felt2">- LC_GetTabel</A>
+<A HREF="fyba2.html#LC_CloseTabel" target="Felt2">- LC_CloseTabel</A>
+<P><A HREF="fyba2.html#O47" target="Felt2"><FONT COLOR=GREEN><B>22.7 Meldingshandtering</B></FONT></A>
+<A HREF="fyba2.html#LC_SetErrorHandler" target="Felt2">- LC_SetErrorHandler</A>
+<A HREF="fyba2.html#LC_SetStartMessageHandler" target="Felt2">- LC_SetStartMessageHandler</A>
+<A HREF="fyba2.html#LC_SetShowMessageHandler" target="Felt2">- LC_SetShowMessageHandler</A>
+<A HREF="fyba2.html#LC_SetEndMessageHandler" target="Felt2">- LC_SetEndMessageHandler</A>
+<A HREF="fyba2.html#LC_SetCancelHandler" target="Felt2">- LC_SetCancelHandler</A>
+<A HREF="fyba2.html#LC_StartMessage" target="Felt2">- LC_StartMessage</A>
+<A HREF="fyba2.html#LC_ShowMessage" target="Felt2">- LC_ShowMessage</A>
+<A HREF="fyba2.html#LC_EndMessage" target="Felt2">- LC_EndMessage</A>
+<A HREF="fyba2.html#LC_Cancel" target="Felt2">- LC_Cancel</A>
+<A HREF="fyba2.html#LC_Error" target="Felt2">- LC_Error</A>
+<P><A HREF="fyba2.html#O48" target="Felt2"><FONT COLOR=GREEN><B>22.8 Hjelperutine for meldingshandtering</B></FONT></A>
+<A HREF="fyba2.html#LC_StrError" target="Felt2">- LC_StrError</A>
+<P><A HREF="fyba2.html#O49" target="Felt2"><FONT COLOR=GREEN><B>22.9 Feilsøking</B></FONT></A>
+<A HREF="fyba2.html#LC_DumpTab" target="Felt2">- LC_DumpTab</A>
+</PRE></BODY></HTML>
diff --git a/doc/no_NB/fyba2.html b/doc/no_NB/fyba2.html
new file mode 100644
index 0000000..0f44612
--- /dev/null
+++ b/doc/no_NB/fyba2.html
@@ -0,0 +1,6795 @@
+<HTML>
+<HEAD>
+<META http-equiv="Content-Type" CONTENT="text/htm; iso-8859-1">
+</HEAD>
+<BODY BGCOLOR="ffffff">
+<BODY>
+<BR>
+<BR>
+<FONT COLOR="Red" SIZE="+6" FACE="Comic Sans MS"><I><B><CENTER>FYBA</CENTER></I></B></FONT>
+<BR>
+<FONT SIZE="+2" FACE="Comic Sans MS"><I><B><CENTER>Et lagringssystem for geodata på SOSI-format.</CENTER></I></B></FONT>
+<BR>
+<BR>
+<BR>
+<BR>
+<FONT SIZE="-1"><CENTER>Sist oppdatert: 2013-10-09 av rosand</CENTER></FONT>
+
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O1"NAME="O1"></A><H1>1 Innledning</H1>
+
+</PRE>
+FYBA er et rutinebibliotek for å kunne håndtere
+<A TARGET="top" HREF="http://www.statkart.no/nor/sosi/" target="_new">SOSI</A>-filer på en
+mest mulig elegant måte, både mht. søking, lesing og oppdatering.
+FYBA er nå tilpasset <A TARGET="top" HREF="http://www.statkart.no/nor/sosi/" target="_new">SOSI</A>-format
+versjon 4.0, og blir fortløpende tilpasset nye <A TARGET="top" HREF="http://www.statkart.no/nor/sosi/" target="_new"">SOSI</A>-versjoner.
+<BR>
+Dene brukerveiledningen er laget for personell som er familiær med
+SOSI og C-programmering.
+
+Alle rutinegrensesnitt og konstanter er definert på filen FYBA.H.
+Denne filen bør derfor inkluderes i alle filer som skal bruke FYBA-rutinene.
+
+<BR>
+FYBA er skrevet i ANSI C, og kan i utgangspunktet kompileres på alle
+platformer der det finnes en passende kompilator.
+Det er imidlertid en del hjelperutiner som er maskin/operativsystem-avhengig.
+Disse er skillt ut til et eget bibliotek (UT) som må tilpasses til
+maskin/opperativsystem. Dette er testet under DOS, OS/2-16, OS/2-32, Win16, Win32, X64 og
+div. UNIX varianter (POSIX, HPUX, Silicon graphics).
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O2"NAME="O2"></A><H1>2 Oversikt over funksjonaliteten til FYBA</H1>
+
+</PRE>
+FYBA et rutinebibliotek som etablerer og vedlikeholder
+egne "indeks-filer" (.IDX) med nødvendige opplysninger for
+lesing,skriving,søk og manipulering av data på SOSI-filene.
+
+
+Som en oversikt kan følgende figur forklare sammenhengen mellom
+SOSI-filene ,biblioteket og brukerprogrammene.
+
+<PRE>
+ !---------------!
+ !---------------->! Indeks-filer !<-------!
+ ! !---------------! !
+ ! ^ !
+ ! ! !
+ ! !---!-----! ! !-----------------!
+ ! ! ! !-->! !
+ ! ! Buffer ! ! !
+!------!------! LC_Rxxxx ! ! LC_PutXxx ! Bruker-program !
+! SOSI-fil(er)!<----------- ! internt !<------------- ! !
+! ! ----------->! ! ! !
+!-------------! LC_Wxxxx ! i ! ------------->! !
+ ! ! LC_GetXxx ! !
+ ! FYBA- ! ! !
+ ! ! ! !
+ ! rutinene! !-----------------!
+ ! !
+ !---------!
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O3"NAME="O3"></A><H1>3 Indeks-systemets oppbygning</H1>
+
+Indeks-systemet er bygt opp av en hel rekke tabeller. Disse ligger
+delevis i minnet, og delevis som filer på disken.
+
+Nedenfor følger en tegning av aktuelle tabeller.
+Dette bare til informasjon. Bruker behøver stort-sett ikke
+kjenne til oppbygningen av disse:
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Gruppetabell"NAME="Gruppetabell"></A><H2>Gruppetabell</H2>
+<BIG><I><B>Gruppetabell</I></B></BIG><PRE>
+Dette er hovedtabellen med informasjon om hver enkelt gruppe på SOSI-filen.
+
+!------------------------------:-----------------------------------------------*
+!Start !Start !Ant. !Ant. ! Gruppeinnhold !
+! på ! i !tegn !tegn !-----------------------------------------------!
+!SOSI- ! RB !GINFO- !PINFO- !Gruppe!ant. !ant. !Kvali- !Enhet ! Div. info !
+!fil ! !buffer !buffer !navn !GINFO! NØ ! tet ! ! (bit def.) !
+!-------!------!-------!-------!------!-----!-----!--------!------!------------!
+!sosi_st!rb_st !ulGiLen!ulPiLen!gnavn !ngi !nko !Kvalitet!dEnhet! info !
+! n64 ! n64 ! ul ! ul ! s ! s ! l ! struct ! d ! us !
+! ! ! ! ! ! ! ! ! !0=i !
+! ! ! ! ! ! ! ! ! !1=H !
+! ! ! ! ! ! ! ! ! !2=KP !
+! ! ! ! ! ! ! ! ! !3=REF !
+! ! ! ! ! ! ! ! ! !4=REF med ØY!
+! ! ! ! ! ! ! ! ! !5=sletta !
+! ! ! ! ! ! ! ! ! !6=NGIS oppd !
+*------------------------------------------------------------------------------*
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Brukttabell"NAME="Brukttabell"></A><H2>Brukttabell</H2>
+<BIG><I><B>Merking av grupper</I></B></BIG><PRE>
+Denne tabellen brukes delevis internt av FYBA, og delevis av brukerprogrammet.
+
+Følgende bit er definert:
+-------------------------------------------------------------------------
+ 31 Gruppen er funnet ved geografisk søk -----! Brukere kan lese/bruke
+ 30 Gruppen er funnet ved GINFO-utvalg ! disse, men det er ikke
+ 29 Gruppen er funnet ved serienummer-søk ! lov til å endre dem.
+ 28 Gruppen er i ringbufferet !
+ 27 Referanser er brukt i omskrevet blokk ------!
+ 26 -----!
+ . ! Brukere har
+ . ! full tilgang
+ 2 ! til disse.
+ 1 -----!
+ 0 Gruppen ligger i kø for skriving til SOSI-filen
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="SOSI-buffer"NAME="SOSI-buffer"></A><H2>SOSI-buffer</H2>
+<BIG><I><B>Binær kopi av SOSI-filen</I></B></BIG><PRE>
+For å øke hastigheten holder FYBA en binær kopi av SOSI-filen.
+Denne kopien ligger delevis i minne og delevis på disk.
+
+Denne kopien består av gruppeinformasjon, koordinater og punktinformasjon.
+
+Gruppeinformasjonen for en gruppe handteres som en lang streng med pekere
+til startposisjon for hver GINFO-linje.
+
+!-----------:-----------:----------:----------------------------------!
+! GINFO 1 ! GINFO 2 ! GINFO 3 ! ..... !
+!-----------:-----------:----------:----------------------------------!
+ ! ! !
+ !---------! ! !
+ ! ! !
+!--------! ! ! !
+! GINFO ! ! ! !
+!--------! ! ! !
+! ofset !-! ! !
+! !----- !
+! !-----------------
+
+Koordinatene lagres i egne array. Punktinformasjonen lagres som
+en lang streng for hele gruppen med peker for hvert punkt til startposisjon
+for PINFO for hvert punkt på samme måte som GINFO.
+
+!--------! !--------! !--------:-------:--------!
+! Øst ! ! Nord ! ! Høyde ! KP ! PINFO !
+!--------! !--------! !--------!-------!--------!
+! double ! ! double ! ! double ! short ! ushort !
+! m ! ! m ! ! m ! ! ofset !
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Serienummer-tabell"NAME="Serienummer-tabell"></A><H2>Serienummer-tabell</H2>
+!-------------*
+! Gruppenummer!
+!-------------! Linjenummer i tabellen er serienummer.
+! lGrNr !
+! (long) !
+*-------------*
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Geografisk-søketabell"NAME="Geografisk-søketabell"></A><H2>Geografisk-søketabell</H2>
+<BIG><I><B>Geografisk søketabell</I></B></BIG><PRE>
+
+Geografisk søk er basert på omskrevet boks.
+Boksene organiseres i et R-tre.
+
+!-----------------------------------*
+! Omskreven boks !
+! !
+! min-N ! min-Ø ! max-N ! max-Ø !
+! ! ! ! !
+!--------!--------!--------!--------!
+!dMinNord!dMinAust!dMaxNord!dMaxAust!
+! d ! d ! d ! d !
+! ! ! ! !
+*-----------------------------------*
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O4"NAME="O4"></A><H1>4 Navnekonvensjoner</H1>
+
+</PRE>
+Variabelnavn er fritt valgt for å si mest mulig om hva variabelen inneholder.
+<BR>
+De fleste rutiner i brukergrensesnittet starter med "LC_":
+<BR>
+I tillegg kommer noen spesielle rutiner for å lese filhodet direkte fra
+SOSI-fil. Disse har navn som starter med "HO_":
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O5"NAME="O5"></A><H1>5 Initiering og styring</H1>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Init"NAME="LC_Init"></A><H2>LC_Init</H2>
+<BIG><I><B>Initierer FYBA</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Initierer FYBA.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+Bruk:
+LC_Init();
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_Init(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqVer"NAME="LC_InqVer"></A><H2>LC_InqVer</H2>
+<BIG><I><B>Identifikasjon</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter versjons-identifikasjon for dette biblioteket.
+ =============================================================================
+
+SK_EntPnt_FYBA char *LC_InqVer(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Close"NAME="LC_Close"></A><H2>LC_Close</H2>
+<BIG><I><B>Stenger ned FYBA</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Stenger ned FYBA.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+Bruk:
+LC_Close();
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_Close(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErInitiert"NAME="LC_ErInitiert"></A><H2>LC_ErInitiert</H2>
+<BIG><I><B>Er FYBA initiert</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Sjekker om FYBA er initiert / tilgjengelig for bruk.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short sStaus r 0=ikke initiert, eller FYBA er stengt ned
+ 1=initiert
+Bruk:
+sStatus = LC_ErInitiert();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_ErInitiert(void)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_MaxSkriv"NAME="LC_MaxSkriv"></A><H2>LC_MaxSkriv</H2>
+<BIG><I><B>Max skriv før lagring</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Setter max antall skriv uten lagring til SOSI-filen.
+(0 = allt skrives direkte til SOSI-filen.)
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+long antall i Max antall skriv uten lagring til SOSI-filen
+Bruk:
+LC_MaxSkriv(antall);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_MaxSkriv(long antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqMaxSkriv"NAME="LC_InqMaxSkriv"></A><H2>LC_InqMaxSkriv</H2>
+<BIG><I><B>Max skriv før lagring</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Spørr etter max antall skriv uten lagring til SOSI-filen.
+(0 = allt skrives direkte til SOSI-filen.)
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+long antall i Max antall skriv uten lagring til SOSI-filen
+Bruk:
+antall = LC_InqMaxSkriv();
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_InqMaxSkriv(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetNgisModus"NAME="LC_SetNgisModus"></A><H2>LC_SetNgisModus</H2>
+<BIG><I><B>Velg NGIS modus</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Velger handteringsmåte for grupper som er merket for oppdatering av NGIS.
+Standardverdi fra LC_Init er NGIS_NORMAL.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short modus i Behandlingsmåte:
+ NGIS_NORMAL (0) = Vanlig handtering
+ NGIS_SPESIAL (1) = Spesialmodus der det er mulig å lese
+ grupper som er merka som sletta.
+Bruk:
+LC_SetNgisModus(NGIS_NORMAL);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetNgisModus(short modus)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetDefLpfi"NAME="LC_SetDefLpfi"></A><H2>LC_SetDefLpfi</H2>
+<BIG><I><B>Ledig plass mellom grupper</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn standardverdi for antall tegn ledig plass bak gruppe
+på .SOS-fil.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short ant_tegn i Antall tegn ledig plass.
+Bruk:
+LC_SetDefLpfi(ant_tegn);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_SetDefLpfi(short ant_tegn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqDefLpfi"NAME="LC_InqDefLpfi"></A><H2>LC_InqDefLpfi</H2>
+<BIG><I><B>Hent ledig plass mellom grupper</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut standardverdi for antall tegn ledig plass bak gruppe
+på .SOS-fil.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short ant_tegn r Antall tegn ledig plass.
+Bruk:
+ant_tegn = LC_InqDefLpfi();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_InqDefLpfi(void)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetUtvidModus"NAME="LC_SetUtvidModus"></A><H2>LC_SetUtvidModus</H2>
+<BIG><I><B>Velg utvis modus</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Velger handteringsmåte for utvidelse av SOSI-filer.
+Standardverdi fra LC_Init er LC_UTVID_SIKKER.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short modus i Behandlingsmåte:
+ LC_UTVID_SIKKER (0) = SOSI-filen stenges og filstørrelsen
+ oppdateres etter hver gruppe som er
+ skrevet på slutten av filen.
+ LC_UTVID_RASK (1) = SOSI-filen stenges IKKE etter hver
+ gruppe som er skrevet på slutten
+ av filen.
+ (Må bare brukes i spesielle tilfeller.)
+Bruk:
+LC_SetUtvidModus(LC_UTVID_SIKKER);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetUtvidModus(short modus)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetUtvidModus"NAME="LC_GetUtvidModus"></A><H2>LC_GetUtvidModus</H2>
+<BIG><I><B>Hent utvis modus</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter valgt handteringsmåte for utvidelse av SOSI-filer.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short modus r Behandlingsmåte:
+ LC_UTVID_SIKKER (0) = SOSI-filen stenges og filstørrelsen
+ oppdateres etter hver gruppe som er
+ skrevet på slutten av filen.
+ LC_UTVID_RASK (1) = SOSI-filen stenges IKKE etter hver
+ gruppe som er skrevet på slutten
+ av filen.
+ (Må bare brukes i spesielle tilfeller.)
+Bruk:
+short sModus = LC_GetUtvidModus();
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetUtvidModus(void)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O6"NAME="O6"></A><H1>6 Åpning av base og sosi-filer</H1>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_OpenBase"NAME="LC_OpenBase"></A><H2>LC_OpenBase</H2>
+<BIG><I><B>Åpner ny base</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Åpner en base, nullstiller tabellene.
+Hvis basen er kladdebase opprettes en SOSI-fil med en gruppe i basen,
+denne brukes som buffer for les / skriv.
+Kladdefilen legges på current directory.
+Kladdebase brukes bare når alle SOSI-filer åpnes med sekvensiell les/skriv.
+
+Den nye basen velges som aktuell base.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short sBaseType i Basetype. Konstanter definert:
+ LC_BASE = Vanlig base.
+ LC_KLADD = Kladdebase. Brukes bare i spesielle
+ tilfeller hvis ingen fil åpnes
+ som LC_BASE_xx.
+LC_BASEADM * pBase r Basepeker.
+Bruk:
+pBase = LC_OpenBase(sBaseType);
+ ==========================================================================
+
+SK_EntPnt_FYBA LC_BASEADM * LC_OpenBase(short sBaseType)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CloseBase"NAME="LC_CloseBase"></A><H2>LC_CloseBase</H2>
+<BIG><I><B>Steng base</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Stenger alle filer i basen, og frigir baseadministrasjonsblokken.
+Hvis aktuell base blir stengt blir første base i systemet valgt som ny
+aktuell base.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+PLCBASEADM pBase i Peker tilBaseAdm
+short s_stat i Slutt-status
+ RESET_IDX = Fjern indeksfilene
+ SAVE_IDX = Lagrer indeksfilene.
+ ABORT = Fjerner indeksfilene (ved avbrutt
+ indeks oppbygging).
+Bruk:
+LC_CloseBase(pBase,s_stat);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_CloseBase(LC_BASEADM * pBase,short s_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SelectBase"NAME="LC_SelectBase"></A><H2>LC_SelectBase</H2>
+<BIG><I><B>Velg aktuell base</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Velger ny aktuell base.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_BASEADM * pBase i Peker til BasAdm.
+Bruk:
+LC_SelectBase(pBase);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SelectBase(LC_BASEADM * pBase)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqCurBase"NAME="LC_InqCurBase"></A><H2>LC_InqCurBase</H2>
+<BIG><I><B>Aktuell base</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Spørr etter aktuell base.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_BASEADM * pBase r Basepeker.
+Bruk:
+pBase = LC_InqCurBase();
+ =============================================================================
+
+SK_EntPnt_FYBA LC_BASEADM * LC_InqCurBase(void)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_OpenSos"NAME="LC_OpenSos"></A><H2>LC_OpenSos</H2>
+<BIG><I><B>Åpner og sjekker SOSI-fil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Åpner en ny fil i aktuell base.
+Allokerer minne til ny filadministrasjonsblokk og initierer denne.
+Åpner SOSI-filen og legger navn mm. inn i fil-adm.
+Leser hodet og tolker det inn i filtabellen.
+Hode blir ikke generert for nye filer. Dette kan lages med LC_PutGi, eller
+LC_NyttHode eller kopieres fra annen fil, og skrives med LC_WsGr
+eller LC_WxGr.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------
+char *fil i Filnavn inkl. sti og fil-type
+ (Hvis fil-type mangler forutsettes .SOS)
+short sModus i Filmodus
+ LC_BASE_FRAMGR = Framgrunnsfil
+ LC_BASE_BAKGR = Bakgrunnsfil (Bare les)
+ LC_SEKV_LES = Sekvensiell, les
+ LC_SEKV_SKRIV = Sekvensiell, skriv
+ LC_SEKV_UTVID = Sekvensiell, utvid gammel fil
+short sNyIdx i Indeksgenerering:
+ LC_NY_IDX = Tvungen nygenerering
+ LC_GML_IDX = Bruk gammel .idx hvis den er OK
+short sVisStatus i Vis indeksoppbygging
+ LC_VIS_STATUS = Vis status
+ LC_INGEN_STATUS = Ikke vis status
+LC_FILADM **pFil u Peker til FilAdm blokk.
+short *o_stat u Detaljert åpningsstatus:
+ 0: Åpning og hode OK
+ >0: Åpningsfeil feilmelding
+ -1: Åpning OK, tom fil / ikke SOSI-fil
+ -2: Ikke åpnet, kan ikke bruke append på
+ tom fil / ikke sosi-fil
+ -3: (LC_CANCEL): Ikke åpnet,
+ indeksoppbygging avbrutt med [Esc],
+ eller feil på filen.
+ -4: (LC_DUBLIKAT): Filen er i basen fra før (pFil)
+ -5: (LC_OPPTATT): Filen er åpen i annet program
+short status r Åpningsstatus: UT_TRUE = OK
+ UT_FALSE = Feil, (o_stat gir detalj)
+Bruk:
+ist=LC_OpenSos(fil,LC_BASE_FRAMGR,LC_NY_IDX,LC_VIS_STATUS,&pFil,&o_stat);
+ist=LC_OpenSos(fil,LC_SEKV_LES,LC_NY_IDX,LC_INGEN_STATUS,&pFil,&o_stat);
+ ==========================================================================
+
+/// <summary><c>LC_OpenSos</c> Åpner og sjekker SOSI-fil <c>FYBA</c> biblioteket.
+/// </summary>
+/// <param name="fil">Filnavn inkl. sti og fil-type (Hvis fil-type mangler forutsettes .SOS)</param>
+SK_EntPnt_FYBA short LC_OpenSos(const char *fil,short sModus,short sNyIdx,short sVisStatus,
+ LC_FILADM **pFil, short *o_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CloseSos"NAME="LC_CloseSos"></A><H2>LC_CloseSos</H2>
+<BIG><I><B>Steng SOSI-fil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Stenger en SOSI-fil, og fjerner den fra basen.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm-blokk
+short s_stat i Slutt-status
+ RESET_IDX = Fjern indeksfilene
+ SAVE_IDX = Lagrer indeksfilene.
+Bruk:
+LC_CloseSos(pFil,SAVE_IDX);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_CloseSos(LC_FILADM *pFil,short s_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelIdx"NAME="LC_DelIdx"></A><H2>LC_DelIdx</H2>
+<BIG><I><B>Sletter indeksfilene</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sletter indeksfilene for gitt SOSI-fil.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char *szSosFil i SOSI-filnavn
+Bruk:
+LC_DelIdx(szSosFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_DelIdx(char *szSosFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FcloseSos"NAME="LC_FcloseSos"></A><H2>LC_FcloseSos</H2>
+<BIG><I><B>Steng åpen SOSI-fil i filsystemet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Denne rutinen brukes til å sikre at en fil er oppdatert og stengt i filsystemet,
+slik at SOSI-filen kan leses fra andre program.
+OBS!
+Stenger bare filen i filsystemet.
+Filen er fortsatt åpen i basen.
+FYBA åpner automatisk filen på nytt når det er behov for dette.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm-blokk
+Bruk:
+LC_FcloseSos(pFil);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_FcloseSos(LC_FILADM *pFil)
+</PRE>
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O7"NAME="O7"></A><H1>7 Hjelpefunksjoner</H1>
+
+<BR>
+<BR>
+<BR>
+<A ID="O8"NAME="O8"></A><H2>7.1 Base og fil</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBaOm"NAME="LC_GetBaOm"></A><H2>LC_GetBaOm</H2>
+<BIG><I><B>Hent baseområde</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter baseområdet for aktuell base (Sum av filhodene).
+Sekvensielle filer regnes ikke med.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+ (Bruk "|" for å kombinere.)
+double *nva u Nedre venstre øst
+double *nvn u Nedre venstre nord
+double *oha u Øvre høyre øst
+double *ohn u Øvre høyre nord
+short sStatus r UT_TRUE=OK, UT_FALSE=ingen fil
+Bruk:
+sStatus = LC_GetBaOm(LC_FRAMGR,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetBaOm(unsigned short usLag,double *nva,double *nvn,double *oha,
+ double *ohn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetFiOm"NAME="LC_GetFiOm"></A><H2>LC_GetFiOm</H2>
+<BIG><I><B>Hent område fra fil-hode</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Hent område for en SOSI-fil i basen.
+Fungerer ikke mot sekvensielle filer.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+double nva u Nedre venstre øst
+double nvn u Nedre venstre nord
+double oha u Øvre høyre øst
+double ohn u Øvre høyre nord
+short ist r Status (UT_TRUE=OK, UT_FALSE=sekvensiell fil)
+Bruk:
+ist = LC_GetFiOm(pFil,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetFiOm(LC_FILADM *pFil,double *nva,double *nvn,double *oha,double *ohn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetFiNr"NAME="LC_GetFiNr"></A><H2>LC_GetFiNr</H2>
+<BIG><I><B>Get fil nummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker alle filer i aktuell base om noen av den har det gitte filnavnet.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char fil_navn i Filnavn
+LC_FILADM *pFil r Peker til FilAdm for filen. (NULL = ukjent fil)
+Bruk:
+pFil = LC_GetFiNr(fil_navn);
+ ==========================================================================
+
+SK_EntPnt_FYBA LC_FILADM *LC_GetFiNr(const char *fil_navn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetFiNa"NAME="LC_GetFiNa"></A><H2>LC_GetFiNa</H2>
+<BIG><I><B>Hent filnavn</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter filnavnet for en fil i basen. Fungerer både for basefiler
+og for sekvensielle filer.
+OBS! Hvis du skal endre på filnavnet må du først kopiere det
+ til en lokale varialel.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+char *fil_navn r Peker til filnavn
+Bruk:
+fil_navn = LC_GetFiNa(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetFiNa(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTegnsett"NAME="LC_GetTegnsett"></A><H2>LC_GetTegnsett</H2>
+<BIG><I><B>Finner tegnsett</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finne tegnsett i ginfo i aktuell gruppe.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short *psTegnsett u Tegnsett, konstanter definert:
+ TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+ TS_ND7 = Norsk Data 7-bits
+ TS_ISO8859 = ISO8859-10 norsk/samisk
+ TS_DECM8 = DEC multinasjonal 8-bits
+ TS_DECN7 = DEC norsk 7-bits
+short sStatus r Status: UT_TRUE = Funnet
+ UT_FALSE = Ikke funnet
+Bruk:
+ sStatus = LC_GetTegnsett(&sTegnsett);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetTegnsett(short *psTegnsett)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqLag"NAME="LC_InqLag"></A><H2>LC_InqLag</H2>
+<BIG><I><B>Finn hvilet lag aktuell gruppe tilhører</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finn hvilket lag aktuell gruppe tilhører.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+unsigned short *usLag u "Lag": LC_FRAMGR eller LC_BAKGR
+short status r UT_TRUE = OK, UT_FALSE = Ingen aktuell gruppe
+Bruk:
+ status = LC_InqLag(&usLag);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_InqLag(unsigned short *usLag)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqFilLag"NAME="LC_InqFilLag"></A><H2>LC_InqFilLag</H2>
+<BIG><I><B>Finn hvilet lag en fil tilhører</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finn hvilket lag en fil tilhører.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Filpeker
+unsigned short usLag r "Lag": LC_FRAMGR eller LC_BAKGR
+Bruk:
+ usLag = LC_InqFilLag(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA unsigned short LC_InqFilLag(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetFilLag"NAME="LC_SetFilLag"></A><H2>LC_SetFilLag</H2>
+<BIG><I><B>Velg hvilet lag en fil tilhører</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Velg hvilket lag en fil tilhører.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Filpeker
+unsigned short usLag i "Lag": LC_FRAMGR eller LC_BAKGR
+Bruk:
+ LC_SetFilLag(pFil,LC_FRAMGR);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetFilLag(LC_FILADM *pFil,unsigned short usLag)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FiLastGr"NAME="LC_FiLastGr"></A><H2>LC_FiLastGr</H2>
+<BIG><I><B>Finn siste gruppe i filen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner gruppenummer for siste gruppe i filen.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+bgr long r Gruppenummer
+Bruk:
+bgr = LC_FiLastGr(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_FiLastGr(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErFilBase"NAME="LC_ErFilBase"></A><H2>LC_ErFilBase</H2>
+<BIG><I><B>Sjekker om en fil er i basen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker om en fil er i basen.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------
+char *fil i Filnavn inkl. sti og fil-type
+ (Hvis fil-type mangler forutsettes .SOS)
+short status r Status: UT_TRUE = Filen er med i basen.
+ UT_FALSE = Filen er IKKE med i basen.
+Bruk:
+ist = LC_ErFilBase(fil);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_ErFilBase(const char *fil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErKoordsysLik"NAME="LC_ErKoordsysLik"></A><H2>LC_ErKoordsysLik</H2>
+<BIG><I><B>Sjekker KOORDSYS</I></B></BIG><PRE>
+=======================================================================
+Formål:
+Sjekk at alle filene i basen har samme koordinatsystem.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+short status r Status: UT_TRUE = KOORDSYS er lik.
+ UT_FALSE = KOORDSYS er IKKE lik.
+Bruk:
+ist = LC_ErKoordsysLik();
+ =======================================================================
+
+SK_EntPnt_FYBA short LC_ErKoordsysLik(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErVertdatumLik"NAME="LC_ErVertdatumLik"></A><H2>LC_ErVertdatumLik</H2>
+<BIG><I><B>Sjekker VERT-DATUM</I></B></BIG><PRE>
+=======================================================================
+Formål:
+Sjekk at alle filene i basen har samme VERT-DATUM.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+short status r Status: UT_TRUE = VERT-DATUM er lik.
+ UT_FALSE = VERT-DATUM er IKKE lik.
+Bruk:
+ist = LC_ErVertdatumLik();
+ =======================================================================
+
+SK_EntPnt_FYBA short LC_ErVertdatumLik(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Backup"NAME="LC_Backup"></A><H2>LC_Backup</H2>
+<BIG><I><B>Lag backup av gitt SOSI-fil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Lag backup av gitt SOSI-fil.
+Kopien legges på en underkatlog med navn "Backup" under den katalogen
+SOSI-filen ligger på. Kopien navnes "Filnavn.nnn" der nnn er et
+fortløpende nummer fra 000 og oppover. Det første ledige numret blir brukt.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Filpeker
+char *pszBackupPath i Katalognavn for lagring av backup.
+short sStatus r UT_TRUE = OK
+ UT_FALSE = Feil.
+Bruk:
+ sStatus = LC_Backup(pFil, szBackupPath);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_Backup(LC_FILADM *pFil, const char *pszBackupPath)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetNgisLag"NAME="LC_GetNgisLag"></A><H2>LC_GetNgisLag</H2>
+<BIG><I><B>Hent NGIS-LAG </I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter NGIS-LAG for gitt fil.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Fil det ønskes opplsninger om.
+char* pszNgisLag r NGIS-lag.
+ Tom streng = ..NGIS-LAG er ikke funnet
+ "0" = Bare leseaksess (..NGIS-LAG 0)
+Bruk:
+pszNgisLag = LC_GetNgisLag(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA char* LC_GetNgisLag(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetFilType"NAME="LC_SetFilType"></A><H2>LC_SetFilType</H2>
+<BIG><I><B>Setter filtype for en sosifil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Setter filtype for en fil.
+Denne rutinen er primært tenkt brukt i GabEdit hvor det er behov for å
+definere flere typer arbeidsfil.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til filen
+short type i Filtypen som skal settes
+ LC_FILTYPE_UKJENT
+ LC_FILTYPE_INAKTIV
+ LC_FILTYPE_GAB_EIENDOM
+ LC_FILTYPE_GAB_ADRESSE
+ LC_FILTYPE_GAB_BYGNING
+ LC_FILTYPE_BYGG
+ LC_FILTYPE_DEK
+ LC_FILTYPE_DEK_ENDRING
+ LC_FILTYPE_GRUNNKRETS
+ LC_FILTYPE_POSTKRETS
+ LC_FILTYPE_SKOLEKRETS
+ LC_FILTYPE_KIRKESOGN
+ LC_FILTYPE_TETTSTED
+ LC_FILTYPE_VALGKRETS
+Bruk:
+LC_SetFilType(pFil,type);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetFilType(LC_FILADM *pFil, short sType)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetFilType"NAME="LC_GetFilType"></A><H2>LC_GetFilType</H2>
+<BIG><I><B>Henter filtype for en sosifil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner filtypen for en fil.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til filen
+short type r Filtypen som skal settes
+ LC_FILTYPE_UKJENT
+ LC_FILTYPE_INAKTIV
+ LC_FILTYPE_GAB_EIENDOM
+ LC_FILTYPE_GAB_ADRESSE
+ LC_FILTYPE_GAB_BYGNING
+ LC_FILTYPE_BYGG
+ LC_FILTYPE_DEK
+ LC_FILTYPE_DEK_ENDRING
+ LC_FILTYPE_GRUNNKRETS
+ LC_FILTYPE_POSTKRETS
+ LC_FILTYPE_SKOLEKRETS
+ LC_FILTYPE_KIRKESOGN
+ LC_FILTYPE_TETTSTED
+ LC_FILTYPE_VALGKRETS
+Bruk:
+type = LC_GetFilType(pFil);
+=============================================================================
+
+SK_EntPnt_FYBA short LC_GetFilType(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErLik_Avrundet"NAME="LC_ErLik_Avrundet"></A><H2>LC_ErLik_Avrundet</H2>
+<BIG><I><B>Rund av og sjekk om sammenfallende punkt</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Runder av til valgt enhet, og sjekker om de to punktene er sammenfallende.
+(Avviket er mindre enn 1/10 enhet både nord og øst)
+Parametre:
+Type Navn I/U Forklaring
+---------------------------------------------------------------------------
+double dA1 i P1
+double dN1 i
+double dA2 i P2
+double dN2 i
+double dEnhet i Enhet som skal brukes i sammenligningen
+bool bErLike r Status: true = Samme koordinat
+ false = Ikke samme koordinat
+Bruk:
+bSammenfallende = LC_ErLik(dA1,dN1,dA2,dN2,dEnhet);
+ ===========================================================================
+
+SK_EntPnt_FYBA bool LC_ErLik_Avrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErLik_IkkeAvrundet"NAME="LC_ErLik_IkkeAvrundet"></A><H2>LC_ErLik_IkkeAvrundet</H2>
+<BIG><I><B>Sjekk om sammenfallende punkt (uten avrunding)</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker om de to punktene er sammenfallende innen gitt nøyaktighet.
+Det skjer ingen avrunding av koordinatene før sammenligningen.
+(Avviket er mindre enn 1/10 enhet både nord og øst)
+Parametre:
+Type Navn I/U Forklaring
+---------------------------------------------------------------------------
+double dA1 i P1
+double dN1 i
+double dA2 i P2
+double dN2 i
+double dEnhet i Enhet som skal brukes i sammenligningen
+bool bErLike r Status: true = Samme koordinat
+ false = Ikke samme koordinat
+Bruk:
+bSammenfallende = LC_ErLik(dA1,dN1,dA2,dN2,dEnhet);
+ ===========================================================================
+
+SK_EntPnt_FYBA bool LC_ErLik_IkkeAvrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErReferert"NAME="LC_ErReferert"></A><H2>LC_ErReferert</H2>
+<BIG><I><B>Sjekk om gruppe er referert</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker om aktuell gruppe er referert fra andre grupper.
+Parametre:
+Type Navn I/U Forklaring
+---------------------------------------------------------------------------
+bool bReferert r Det finnes referanser til gruppen
+Bruk:
+bReferert = LC_ErReferert();
+===========================================================================
+
+SK_EntPnt_FYBA bool LC_ErReferert(void)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O9"NAME="O9"></A><H2>7.2 SOSI-gruppe</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrNr"NAME="LC_GetGrNr"></A><H2>LC_GetGrNr</H2>
+<BIG><I><B>Hent gruppe-nummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter gruppenummer for aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pBgr iu Peker til gruppestruktur der gruppenummer lagres
+short status r Status UT_TRUE=OK, UT_FALSE=ingen aktuell gruppe
+Bruk:
+ status = LC_GetGrNr(&Bgr)
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetGrNr(LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrPara"NAME="LC_GetGrPara"></A><H2>LC_GetGrPara</H2>
+<BIG><I><B>Hent gruppe-parametre</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter diverse opplysninger om aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+------------------------------------------------------------------------
+short *ngi u Antall linjer GINFO
+long *nko u Antall koordinater
+short *info u Diverse informasjon. En sum av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har dybde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. :n)
+ GI_OY_REF= gruppen har referanser med øy
+ GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+ GI_SLETTA = gruppen er sletta (merka som sletta)
+ GI_READ_ONLY = gruppen kan ikke endres.
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Bruk:
+ gnavn = LC_GetGrPara(&ngi,&nko,&info);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetGrPara(short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrParaBgr"NAME="LC_GetGrParaBgr"></A><H2>LC_GetGrParaBgr</H2>
+<BIG><I><B>Hent gruppe-parametre for gruppe</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter diverse opplysninger om gitt gruppenummer.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_BGR * pBgr i Gruppenummer det ønskes opplysninger om.
+short *ngi u Antall linjer GINFO (0=sletta eller ulovlig nummer)
+long *nko u Antall koordinater
+unsigned short *info u Diverse informasjon. En sum av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har døbde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. :n)
+ GI_OY_REF= gruppen har referanser med øy
+ GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+ GI_SLETTA = gruppen er sletta (merka som sletta)
+ GI_READ_ONLY = gruppen kan ikke endres.
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Bruk:
+ gnavn = LC_GetGrParaBgr(pBgr,&ngi,&nko,&info,&snr);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_GetGrParaBgr(LC_BGR * pBgr,short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrFi"NAME="LC_GetGrFi"></A><H2>LC_GetGrFi</H2>
+<BIG><I><B>Hent gruppe-filnr</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter peker til FilAdm for aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_FILADM * *ppFil u Peker til FilAdm-peker
+short status r UT_TRUE = OK, UT_FALSE = Ingen aktuell gruppe
+Bruk:
+ status = LC_GetGrFi(&pFil);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_GetGrFi(LC_FILADM **ppFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetEndringsstatus"NAME="LC_SetEndringsstatus"></A><H2>LC_SetEndringsstatus</H2>
+<BIG><I><B>Setter endringsstatus for aktuell gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Setter endringsstatus for aktuell gruppe.
+NB! Denne rutinen bør normalt ikke brukes av vanlige klient-program!
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short sStatus i Kode for endring:
+ END_UENDRA 0 Ikke endra
+ END_KOPI 1 Endra ved totalkopi fra annen gruppe
+ END_ENDRA 2 Endra ved normal Put fra program
+Bruk:
+LC_dg_SetEndringsstatus(END_KOPI);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetEndringsstatus(short sStatus)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O10"NAME="O10"></A><H2>7.3 Hode, aktuell gruppe</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_NyttHode"NAME="LC_NyttHode"></A><H2>LC_NyttHode</H2>
+<BIG><I><B>Lager nytt hode</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn et standard SOSI-filhode i ginfo i aktuell gruppe.
+Parametre:
+ ingen
+Bruk:
+ LC_NyttHode();
+==========================================================================
+
+SK_EntPnt_FYBA void LC_NyttHode(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_TestHode"NAME="LC_TestHode"></A><H2>LC_TestHode</H2>
+<BIG><I><B>Tester SOSI-hodet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker at ginfo i aktuell gruppe er et lovlig SOSI-filhode.
+Parametre:
+ Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+ short ist r status: UT_TRUE=OK, UT_FALSE=feil
+Bruk:
+ ist = LC_TestHode();
+==========================================================================
+
+SK_EntPnt_FYBA short LC_TestHode(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetOmr"NAME="LC_GetOmr"></A><H2>LC_GetOmr</H2>
+<BIG><I><B>Finner ..OMRÅDE i hodet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut område fra ginfo i aktuell gruppe.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double *nv_a u Område
+double *nv_n u
+double *oh_a u
+double *oh_n u
+short ist r status: UT_TRUE=OK, UT_FALSE=feil (navn er ikke funnet)
+Bruk:
+ ist = LC_GetOmr(&nv_a,&nv_n,&oh_a,&oh_n);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetOmr(double *nv_a,double *nv_n,double *oh_a,double *oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutOmr"NAME="LC_PutOmr"></A><H2>LC_PutOmr</H2>
+<BIG><I><B>Legger inn ..OMRÅDE i hodet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn område i ginfo i aktuell gruppe.
+Hvis område ikke har noen utstrekning justeres
+dette med 1 meter i hver retning.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode av ny type.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double nv_a i Område
+double nv_n i
+double oh_a i
+double oh_n i
+short ist r status: UT_TRUE=OK, UT_FALSE=feil
+Bruk:
+ ist = LC_PutOmr(nv_a,nv_n,oh_a,oh_n);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_PutOmr(double nv_a,double nv_n,double oh_a,double oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTrans"NAME="LC_GetTrans"></A><H2>LC_GetTrans</H2>
+<BIG><I><B>Finner ..TRANSPAR i hodet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut transformasjonsparametrene fra ginfo i aktuell gruppe.
+Forutsetter at aktuell gruppe er et SOSI-filhode.
+OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+ For nye programmer bør LC_GetTransEx benyttes. LC_GetTransEx er
+ kompatibel med nye versjoner av SOSI.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short *koosys u Koordinatsystem
+double *origo_a u Origo øst
+double *origo_n u Origo nord
+double *enhet u Enhet
+double *enhet_h u ...ENHET-H
+double *enhet_d u ...ENHET-D
+short ist r status: UT_TRUE=OK, UT_FALSE=feil (navn er ikke funnet)
+Bruk:
+ ist = LC_GetTrans(&koosys,&origo_a,&origo_n,&enhet,&enhet_h,&enhet_d);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetTrans(short *koosys,double *origo_a,double *origo_n,double *enhet,
+ double *enhet_h,double *enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTransEx"NAME="LC_GetTransEx"></A><H2>LC_GetTransEx</H2>
+<BIG><I><B>Henter ..TRANSPAR fra hodet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut innholdet under ..TRANSPAR fra ginfo i aktuell gruppe.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+Må velge mellom KOORDSYS, TRANSSYS eller GEOSYS. Kun en av disse kan benyttes i filhodet.
+KOORDSYS er den mest vanlige måte å definere referansesystem.
+GEOKOORD skal benyttes for GEOSYS og for TRANSSYS
+Må velge mellom VERT-DATUM eller VERT-INT.
+VERT-DATUM er den mest vanlige beskrivelsesmåten.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+unsigned short *pusMaske iu [Inn] Styrer hvilke deler av TRANSPAR som skal hentes
+ [Ut] Viser hvilke deler av TRANSPAR som er funnet/hentet.
+ Følgende konstanter er definert:
+ LC_TR_ALLT - Alle deler av ..TRANSPAR hentes
+ LC_TR_KOORDSYS - Koordsys
+ LC_TR_TRANSSYS - Transsys
+ LC_TR_GEOSYS - Geosys
+ LC_TR_GEOKOORD - Geokoord
+ LC_TR_ORIGO - Origo-nø
+ LC_TR_ENHET - Enhet
+ LC_TR_ENHETH - Enhet-h
+ LC_TR_ENHETD - Enhet-d
+ LC_TR_VERTDATUM - Vert-datum
+ LC_TR_VERTINT - Vert-int
+ LC_TR_VERTDELTA - Vert-delta
+LC_TRANSPAR * pTrans iu Peker til struktur som skal motta ..TRANSPAR informasjonen.
+short sStatus r Status: UT_TRUE=OK, UT_FALSE=feil (ikke funnet).
+Bruk:
+unsigned short usMaske = LC_TR_ALLT;
+LC_TRANSPAR Trans;
+ist = LC_GetTransEx(&usMaske,&Trans);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetTransEx(unsigned short *pusMaske, LC_TRANSPAR * pTrans)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTrans"NAME="LC_PutTrans"></A><H2>LC_PutTrans</H2>
+<BIG><I><B>Legger inn ..TRANSPAR i hodet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn transformasjonsparametrene i ginfo i aktuell gruppe.
+Forutsetter at aktuell gruppe er et SOSI-filhode versjon 3.x.
+OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+ For nye programmer bør LC_PutTransEx benyttes. LC_PutTransEx er
+ kompatibel med nye versjoner av SOSI.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short koosys i Koordinatsystem
+double origo_a i Origo øst
+double origo_n i Origo nord
+double enhet i Enhet
+double enhet_h i Enhet-H
+double enhet_d i Enhet-D
+short ngi r Antall GINFO-linjer etter oppdateringen.
+Bruk:
+ ngi = LC_PutTrans(koosys,origo_a,origo_n,enhet,enhet_h,enhet_d);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_PutTrans(short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTransEx"NAME="LC_PutTransEx"></A><H2>LC_PutTransEx</H2>
+<BIG><I><B>Legger inn ..TRANSPAR i hodet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn innholdet under ..TRANSPAR i ginfo i aktuell gruppe.
+OBS! Forutsetter at aktuell gruppe er et SOSI-filhode versjon 3.x.
+Må velge mellom KOORDSYS, TRANSSYS eller GEOSYS.
+Kun en av disse kan benyttes i filhodet.
+KOORDSYS er den mest vanlige måte å definere referansesystem.
+GEOKOORD skal benyttes for GEOSYS og for TRANSSYS
+Må velge mellom VERT-DATUM eller VERT-INT.
+VERT-DATUM er den mest vanlige beskrivelsesmåten.
+Følgende kompaktifisering brukes:
+ ..TRANSPAR
+ ...KOORDSYS <SYSKODE> <DATUM> <PROJEK>
+ ...TRANSSYS <TILSYS> <KONSTA1> <KONSTB1> <KONSTA2> <KONSTB2> <KONSTC1> <KONSTC2>
+ ...GEOSYS <GEO-DATUM> <GEO-PROJ> <GEO-SONE>
+ ...GEOKOORD <GEOKOORD>
+ ...ORIGO-NØ <ORIGO-N> <ORIGO-Ø>
+ ...ENHET <ENHET>
+ ...ENHET-H <ENHET-H>
+ ...ENHET-D <ENHET-D>
+ ...VERT-DATUM <HØYDE-REF> <DYBDE-REF> <FRISEIL-REF> <HØYDE-TYPE>
+ ...VERT-INT <H-REF-INT> <D-REF-INT> <F-REF-INT>
+ ...VERT-DELTA <V-DELTA-MIN> <V-DELTA-MAX>
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+unsigned short usMaske i Maske som styrer hvilke deler av TRANSPAR som brukt
+ Følgende konstanter er definert:
+ LC_TR_KOORDSYS - Koordsys
+ LC_TR_TRANSSYS - Transsys
+ LC_TR_GEOSYS - Geosys
+ LC_TR_GEOKOORD - Geokoord
+ LC_TR_ORIGO - Origo-nø
+ LC_TR_ENHET - Enhet
+ LC_TR_ENHETH - Enhet-h
+ LC_TR_ENHETD - Enhet-d
+ LC_TR_VERTDATUM - Vert-datum
+ LC_TR_VERTINT - Vert-int
+ LC_TR_VERTDELTA - Vert-delta
+LC_TRANSPAR * pTrans i Peker til struktur med ..TRANSPAR informasjonen.
+short ngi r Antall GINFO-linjer etter oppdateringen.
+Bruk:
+LC_TRANSPAR Trans;
+unsigned short usMaske = LC_TR_KOORDSYS | LC_TR_ORIGO | LC_TR_ENHET;
+Trans.sKoordsys = 32;
+Trans.dOrigoAust = 0.0;
+Trans.dOrigoNord = 0.0;
+Trans.dEnhet = 1.0;
+ngi = LC_PutTransEx(usMaske,&Trans);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_PutTransEx(unsigned short usMaske, LC_TRANSPAR * pTrans)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O11"NAME="O11"></A><H2>7.4 Hode, direkte fra SOSI-fil</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_New"NAME="HO_New"></A><H2>HO_New</H2>
+<BIG><I><B>Lager nytt hode</I></B></BIG><PRE>
+ =========================================================================
+Formål:
+Genererer et nytt SOSI-filhode.
+Hvis område ikke har noen utstrekning justeres
+dette med 1 meter i hver retning.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short koosys i Koordinatsystem
+double origo_a i Origo øst
+double origo_n i Origo nord
+double enhet i Enhet
+double enhet_h i Enhet-H
+double enhet_d i Enhet-D
+double nv_a i Område: Nedre venstre hjørne
+double nv_n i
+double oh_a i Øvre høyre hjørne
+double oh_n i
+short sStatus r Status: UT_TRUE = Funnet
+ UT_FALSE = Ikke funnet
+Bruk:
+sStatus = HO_New(fil,koosys,origo_a,origo_n,enhet,enhet_h-enhet_d,
+ nv_a,nv_n,oh_a,oh_n);
+=============================================================================
+
+SK_EntPnt_FYBA short HO_New(const char *pszFil,short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_TestSOSI"NAME="HO_TestSOSI"></A><H2>HO_TestSOSI</H2>
+<BIG><I><B>Tester SOSI-filen</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Sjekker at filen er en SOSI-fil, og finner posisjonen for .SLUTT.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+UT_INT64 *sluttpos u Posisjon for .SLUTT
+short ist r Status: UT_TRUE = OK
+ UT_FALSE = feil
+Bruk:
+ ist = HO_TestSOSI(pszFil,&sluttpos);
+=============================================================================
+
+SK_EntPnt_FYBA short HO_TestSOSI(const char *pszFil,UT_INT64 *sluttpos)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetKvalitet"NAME="HO_GetKvalitet"></A><H2>HO_GetKvalitet</H2>
+<BIG><I><B>Finner kvalitetsopplysninger</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Finne kvalitetsopplysninger i filhode.
+(Ikke aktuellt etter SOSI v. 4.00.)
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short *psMetode u Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+long *pLNnoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+short *psSynbarhet u Synbarhet i bilde
+ KVAL_SYN_UNDEF synbarhet er udefinert.
+short *psHoydeMetode u Hvordan høyden er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+long *plHoydeNoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+short ist r Statusvariabel: UT_TRUE - OK, ..KVALITET er funnet
+ UT_FALSE - ikke funnet
+Bruk:
+ ist = HO_GetKvalitet(fil,&sMetode,&lNoyaktighet,&sSynbarhet,
+ &sHoydeMetode,&lHoydeNoyaktighet);
+=============================================================================
+
+SK_EntPnt_FYBA short HO_GetKvalitet(const char *pszFil,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetTegnsett"NAME="HO_GetTegnsett"></A><H2>HO_GetTegnsett</H2>
+<BIG><I><B>Finner tegnsett</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finne tegnsett i filhodet.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short *psTegnsett u Tegnsett, konstanter definert:
+ TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+ TS_ND7 = Norsk Data 7-bits
+ TS_DECM8 = DEC multinasjonal 8-bits
+ TS_ISO8859 = ISO8859-10 Norsk/samisk tegnsett
+ TS_DECN7 = DEC norsk 7-bits
+short sStatus r Status: UT_TRUE = Funnet
+ UT_FALSE = Ikke funnet
+Bruk:
+ sStatus = HO_GetTegnsett(pszFil,&sTegnsett);
+==========================================================================
+
+SK_EntPnt_FYBA short HO_GetTegnsett(const char *pszFil,short *psTegnsett)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetVal"NAME="HO_GetVal"></A><H2>HO_GetVal</H2>
+<BIG><I><B>Finn verdien til et SOSI-navn</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter parametrene til et SOSI-navn.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+char *sosi_navn i SOSI-navn det skal finnes verdi til
+short *sett_nr i/u i: "Sett nummer"(linjenummer) for start søking (min 1)
+ u: Ved tilslag returneres "Sett nummer" for
+ tilslaget.
+char *para_peker r Peker til parameter-streng avslutta med '/0'.
+ Hvis SOSI-navnet ikke er funnet returneres NULL.
+Bruk:
+para_peker = HO_GetVal(fil,sosi_navn,&sett_nr);
+ =============================================================================
+
+SK_EntPnt_FYBA char *HO_GetVal(const char *pszFil,char *sosi_navn,short *sett_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetTrans"NAME="HO_GetTrans"></A><H2>HO_GetTrans</H2>
+<BIG><I><B>Finner .TRANSPAR i hodet</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter transformasjonsparametrene fra filhodet.
+OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+ For nye programmer bør HO_GetTransEx benyttes. HO_GetTransEx er
+ kompatibel med nye versjoner av SOSI.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short *koosys u Koordinatsystem
+double *origo_a u ..ORIGO-AUST
+double *origo_n u ..ORIGO-NORD
+double *enhet u ...ENHET
+double *enhet_h u ...ENHET-H
+double *enhet_d u ...ENHET-D
+short sStatus r UT_TRUE, eller UT_FALSE.
+Bruk:
+sStatus = HO_GetTrans(fil,&koosys,&origo_a,&origo_n,&enhet,&enhet_h,&enhet_d);
+ =============================================================================
+
+SK_EntPnt_FYBA short HO_GetTrans(const char *pszFil,short *koosys,double *origo_a,
+ double *origo_n,double *enhet,double *enhet_h,double *enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetTransEx"NAME="HO_GetTransEx"></A><H2>HO_GetTransEx</H2>
+<BIG><I><B>Finner .TRANSPAR i hodet</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter ut innholdet under ..TRANSPAR fra fra filhodet.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+unsigned short *pusMaske iu [Inn] Styrer hvilke deler av TRANSPAR som skal hentes
+ [Ut] Viser hvilke deler av TRANSPAR som er funnet/hentet.
+ Følgende konstanter er definert:
+ LC_TR_ALLT - Alle deler av ..TRANSPAR hentes
+ LC_TR_KOORDSYS - Koordsys
+ LC_TR_TRANSSYS - Transsys
+ LC_TR_GEOSYS - Geosys
+ LC_TR_GEOKOORD - Geokoord
+ LC_TR_ORIGO - Origo-nø
+ LC_TR_ENHET - Enhet
+ LC_TR_ENHETH - Enhet-h
+ LC_TR_ENHETD - Enhet-d
+ LC_TR_VERTDATUM - Vert-datum
+ LC_TR_VERTINT - Vert-int
+ LC_TR_VERTDELTA - Vert-delta
+LC_TRANSPAR * pTrans iu Peker til struktur som skal motta ..TRANSPAR informasjonen.
+short sStatus r Status: UT_TRUE=OK, UT_FALSE=feil (ikke funnet).
+Bruk:
+unsigned short usMaske = LC_TR_ALLT;
+LC_TRANSPAR Trans;
+ist = HO_GetTransEx("Test.sos",&usMaske,&Trans);
+==========================================================================
+
+SK_EntPnt_FYBA short HO_GetTransEx(const char *pszFil,unsigned short *pusMaske, LC_TRANSPAR * pTrans)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_GetOmr"NAME="HO_GetOmr"></A><H2>HO_GetOmr</H2>
+<BIG><I><B>Finner ..OMRÅDE i hodet</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter områdeangivelsen fra filhodet.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+double *nv_a u
+double *nv_n u
+double *oh_a u
+double *oh_n u
+short sStatus r UT_TRUE, eller UT_FALSE.
+Bruk:
+sStatus = HO_GetOmr(pszFil,&nv_a,&nv_n,&oh_a,&oh_n);
+ =============================================================================
+
+SK_EntPnt_FYBA short HO_GetOmr(const char * pszFil,double *nv_a,double *nv_n,double *oh_a,double *oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="HO_SjekkTegnsett"NAME="HO_SjekkTegnsett"></A><H2>HO_SjekkTegnsett</H2>
+<BIG><I><B>Sjekker tegnsett på SOSI-filen</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Sjekker faktisk tegnsett i .HODE.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+char *pszFil i Fullstendig filnavn
+short *psTegnsett u Tegnsett, konstanter definert:
+ TS_UKJENT = Fikk ikke sjekket tegnsett
+ TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+ TS_ND7 = Norsk Data 7-bits
+ TS_DECM8 = DEC multinasjonal 8-bits
+ TS_ISO8859 = ISO8859-10 Norsk/samisk tegnsett
+ TS_DECN7 = DEC norsk 7-bits
+short sStatus r Status: 0 = Ikke funnet
+ 1 = Ett tegnsett funnet
+ 2 = Flere tegnsett funnet
+Bruk:
+ sStatus = HO_SjekkTegnsett(fpek,tegnsett);
+=============================================================================
+
+SK_EntPnt_FYBA short HO_SjekkTegnsett(const char *pszFil,short *psTegnsett)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O12"NAME="O12"></A><H1>8 Ny gruppe</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_NyGr"NAME="LC_NyGr"></A><H2>LC_NyGr</H2>
+<BIG><I><B>Ny gruppe i basen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Lager en ny gruppe i basen, og tildeler serienummer.
+Sjekker at gruppenavnet er lovlig i denne versjon av FYBA.
+Ved feil navn vil ".LINJE" bli valgt.
+Legger inn gruppenavn i buffer.
+Gruppen blir "aktuell" gruppe.
+Sjekker ledig plass både for indeks-fil og sosi-fil.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+char *sosi i Gruppenavn (Eks. ".KURVE")
+LC_BGR * pBgr iu Tildelt gruppenummer i basen
+ (Bgr.lNr=INGEN_GRUPPE = Feil, ikke oppretta)
+long snr u Tildelt serienummer
+gnavn short r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+ INGEN_GRUPPE hvis det ikke er opprettet noen ny gruppe.
+Bruk:
+gnavn = LC_NyGr (pFil,sosi,&Bgr,&snr);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_NyGr (LC_FILADM *pFil,char *sosi,LC_BGR * pBgr,long *snr)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O13"NAME="O13"></A><H1>9 Direkte les/skriv</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_RxGr"NAME="LC_RxGr"></A><H2>LC_RxGr</H2>
+<BIG><I><B>Les gruppe fra base</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Velger en gruppe som aktiv gruppe, og leser den fra SOSI-filen hvis den
+ikke er i RB fra før. (Styres også av les_sosi.)
+Hvis gruppen ikke finnes (sletta eller ulovlig gruppenummer) returneres
+ngi=0 og nko=0.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pBgr i Peker til fil- og gruppenummer.
+short les_sosi i Lesemetode: Følgende konstanter er definert:
+ LES_OPTIMALT (0 = Les mest effektivt base/SOSI)
+ LES_SOSI (1 = Les alltid fra SOSI-filen)
+short *ngi u Antall linjer GINFO
+long *nko u Antall koordinater
+unsigned short *info u Diverse informasjon. En sum av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har dybde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. eller ..REF)
+ GI_OY_REF = gruppen har referanser med øy
+ GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+ GI_SLETTA = gruppen er sletta (merka som sletta)
+ GI_READ_ONLY = gruppen kan ikke endres.
+short gnavn r Gruppenavn - Følgende konstanter er definert:
+ INGEN_GRUPPE = Gruppen finnes ikke, ikke lest.
+ L_SLUTT = (.SLUTT)
+ L_PUNKT = (.PUNKT)
+ L_LINJE = (.LINJE)
+ L_KURVE = (.KURVE)
+ L_BUE = (.BUE)
+ L_BUEP = (.BUEP)
+ L_SIRKEL = (.SIRKEL)
+ L_SIRKELP = (.SIRKELP)
+ L_KLOTOIDE = (.KLOTOIDE)
+ L_SVERM = (.SVERM)
+ L_TEKST = (.TEKST)
+ L_TRASE = (.TRASE)
+ L_FLATE = (.FLATE)
+ L_BEZIER = (.BEZIER)
+ L_RASTER = (.RASTER)
+ L_DEF = (.DEF)
+ L_OBJDEF = (.OBJDEF)
+ L_MLINJE = (.MLINJE)
+ L_STRUKTUR = (.STRUKTUR)
+ L_OBJEKT = (.OBJEKT)
+ L_SYMBOL = (.SYMBOL)
+ L_HODE = (.HODE)
+
+Bruk:
+ gnavn = LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (info & GI_PINFO) (gruppen har PINFO)
+ ;
+ if (info & GI_KP) (gruppen har KP)
+ ;
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_RxGr(LC_BGR * pBgr,short les_sosi,short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_WxGr"NAME="LC_WxGr"></A><H2>LC_WxGr</H2>
+<BIG><I><B>Skriv gruppe til base</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Skriver aktuell gruppe til tilhørende SOSI-fil.
+Brukerindeks og geografisk indeks oppdateres straks, uavhengig av kø.
+Ledig plass fram til neste gruppe blir blanket.
+Filhode blir ALLTID skrevet direkte til SOSI-filen.
+Parametre:
+Type Navn I/U Forklaring
+------------------------------------------------------------------------
+short k_stat i Skrivemetode: Følgende konstanter er definert:
+ SKRIV_OPTIMALT = Skriv mest effektivt kø/SOSI
+ SKRIV_SOSI = Skriv direkte til SOSI-filen
+short status r Status: UT_TRUE = OK
+ UT_FALSE = Ikke utført, pga. feil.
+Bruk:
+LC_WxGr(k_stat)
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_WxGr(short k_stat)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O14"NAME="O14"></A><H1>10 Sekvensiell les/skriv</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_RsGr"NAME="LC_RsGr"></A><H2>LC_RsGr</H2>
+<BIG><I><B>Les gruppe sekvensielt</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Leser en datagruppe fra ekstern SOSI-fil inn i aktuell gruppe i ringbuffer.
+Rutinen tilsvarer put fra brukerprogram inn i ringbufferet, men rutinen
+tildeler selv nødvendig plass..
+Gruppen beholder serienummer tildelt i LC_NyGr.
+Brukerindeks og geografisk-indeks blir ikke oppdatert.
+(Dette skjer først når gruppen skrives til basen.)
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short *rstat iu Lesestatus
+ Inn: 1=Les fra starten, 0=Les neste
+ Ut: 0=OK, -1=slutten av filen er nådd
+LC_FILADM *pFil i Peker til FilAdm
+short *ngi u Antall linjer GINFO
+long *nko u Antall koordinater
+unsigned short *info u Diverse informasjon. En "sum" av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har dybde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. eller ..REF)
+ GI_OY_REF = gruppen har referanser med øy
+ GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+ GI_SLETTA = gruppen er sletta (merka som sletta)
+ GI_READ_ONLY = gruppen kan ikke endres.
+long gml_snr u Serienummer gruppen hadde på ekstern fil
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Bruk:
+ gnavn = LC_RsGr(&rstat,pFil,&ngi,&nko,&info,&gml_snr);
+ if (info & GI_PINFO) (gruppen har PINFO)
+ ;
+ if (info & GI_KP) (gruppen har KP)
+ ;
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_RsGr(short *rstat,LC_FILADM *pFil,short *ngi,long *nko,
+ unsigned short *info,long *gml_snr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_RsHode"NAME="LC_RsHode"></A><H2>LC_RsHode</H2>
+<BIG><I><B>Les filhode sekvensiellt</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Leser et filhode fra ekstern SOSI-fil inn i aktuell gruppe i ringbuffer.
+Rutinen tilsvarer put fra brukerprogram inn i ringbufret, men rutinen
+tildeler selv nødvendig plass i RB.
+Denne rutinen er stort sett lik LC_RsGr, men LC_RsHode forandrer
+ikke aktuell filposisjon på den sekvensielle filen.
+Gruppen beholder serienummer hodet hadde på SOSI-filen.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+short *ngi u Antall linjer GINFO
+long *nko u Antall koordinater
+unsigned short *info u Diverse informasjon. En "sum" av følgende:
+ GI_PINFO = gruppen har PINFO
+ GI_NAH = gruppen har høyde informasjon (..NØH)
+ GI_NAD = gruppen har dybde informasjon (..NØD)
+ GI_KP = gruppen har knutepunkt (...KP n)
+ GI_REF = gruppen har referanser (.. :n)
+ GI_OY_REF= gruppen har referanser med øy
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Bruk:
+ gnavn = LC_RsHode(pFil,&ngi,&nko,&info);
+ =============================================================================
+
+short LC_RsHode(LC_FILADM *pFil,short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_WsGr"NAME="LC_WsGr"></A><H2>LC_WsGr</H2>
+<BIG><I><B>Skriv gruppe sekvensiellt</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Skriver aktuell gruppe til ekstern, sekvensiell SOSI-fil.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+Bruk:
+LC_WsGr(pFil);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_WsGr(LC_FILADM *pFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_WsGrPart"NAME="LC_WsGrPart"></A><H2>LC_WsGrPart</H2>
+<BIG><I><B>Skriv del av gruppe sekvensiellt</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Skriver en del av aktuell gruppe til ekstern, sekvensiell SOSI-fil.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+long fra_punkt i Punktnummer for første koordinat som skal skrives.
+ (Lovlig: 1 <= fra_punkt <= nko)
+long antall i Antall koordinatlinjer som skal skrives.
+ (Lovlig: 0 <= antall <= nko)
+Bruk:
+LC_WsGrPart(pFil,fra_punkt,antall);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_WsGrPart(LC_FILADM *pFil,long fra_punkt,long antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_EndreHode"NAME="LC_EndreHode"></A><H2>LC_EndreHode</H2>
+<BIG><I><B>Endre hodet på eksisterende SOSI-fil</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Skriver aktuell gruppe til starten av sekvensiell SOSI-fil.
+Det er en forutsetning at aktuell gruppe er et filhode.
+Denne rutinen er stort sett lik LC_WsGr, men LC_EndreHode forandrer ikke
+aktuell filposisjon på den sekvensielle filen.
+OBS!
+Det må være nok ledig plass før neste gruppe for tilbakeskrivingen.
+Det er ikke mulig å forandre koordinatsystem, enhet eller origo på fil
+som inneholder data.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+short oppdatert r Skrivestatus (1=OK, 0=Det er ikke plass
+ til å skrive hodet)
+Bruk:
+ist = LC_EndreHode(pFil);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_EndreHode(LC_FILADM *pFil)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O15"NAME="O15"></A><H1>11 Slette gruppe</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelGr"NAME="LC_DelGr"></A><H2>LC_DelGr</H2>
+<BIG><I><B>Slett gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Fjerner aktuell gruppe fra basen.
+Grupper som er tatt ut fra NGIS for oppdatering blir ikke sletta fra
+SOSI-filen, men de blir merka som sletta. (LC_SetNgisModus avgjør da om
+disse kan leses.)
+Det er ikke mulig å slette grupper fra sekvensielle filer, eller grupper
+som er brukt i flater.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short sStatus r Status: UT_TRUE = OK
+ UT_FALSE = feil, ikke sletta
+Bruk:
+sStatus = LC_DelGr();
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_DelGr(void)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O16"NAME="O16"></A><H1>12 Tilbakeskriving av buffret info til SOSI-fil</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Save"NAME="LC_Save"></A><H2>LC_Save</H2>
+<BIG><I><B>Tøm skrivekøa</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Skriver gruppene som ligger i skrivekø ut til SOSI-fil.
+Parametre: ingen
+Bruk:
+LC_Save();
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_Save(void)
+</PRE>
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O17"NAME="O17"></A><H1>13 Reservere plass i ringbuffer</H1>
+</PRE>
+Dette er rutiner for å tildele/reservere plass til Ginfo/Koordinater
+i ringbufferet, og må utføres før det legges data inn i rungbuffer
+med rutiner som LC_PuGi og LC_PuTK
+
+ OBS: Aktuell datagruppe må først være lest/valgt med rutinene
+ LC_RxGr eller LC_NyGr.
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InsGiL"NAME="LC_InsGiL"></A><H2>LC_InsGiL</H2>
+<BIG><I><B>Skyt inn GINFO-linjer</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Skyter inn linjer GINFO-delen i en gruppe.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short linje i Linjenummer linjen skal skytes inn forran.
+ (Lovlig: 1 til ngi+1)
+short antall i Antall linjer som skal skytest inn.
+short ngi r Antall GINFO-linjer i gruppen etter innskuddet.
+Bruk:
+ngi = LC_InsGiL(linje, antall);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_InsGiL(short linje, short antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_AppGiL"NAME="LC_AppGiL"></A><H2>LC_AppGiL</H2>
+<BIG><I><B>Heng på en GINFO-linje</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henger på en linje i GINFO-delen i en gruppe.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short ngi r Antall GINFO-linjer i gruppen etter utvidelsen.
+ (Linjenumret på den tilføyde linjen.)
+Bruk:
+ngi = LC_AppGiL();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_AppGiL()
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InsKoL"NAME="LC_InsKoL"></A><H2>LC_InsKoL</H2>
+<BIG><I><B>Skyt inn koordinatlinjer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Skyter inn linjer koordinatdelen i en gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long linje i Linjenummer linjen skal skytes inn forran.
+ (Lovlig: 1 til nko+1)
+long antall i Antall linjer som skal skytest inn.
+long nko r Antall koordinater i gruppen etter innskuddet.
+Bruk:
+nko = LC_InsKoL(linje, antall);
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_InsKoL(long linje, long antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_AppKoL"NAME="LC_AppKoL"></A><H2>LC_AppKoL</H2>
+<BIG><I><B>Heng på en koordinatlinje</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henger på en linje i koordinatdelen i en gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long nko r Antall koordinater i gruppen etter utvidelsen.
+Bruk:
+nko = LC_AppKoL();
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_AppKoL()
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelGiL"NAME="LC_DelGiL"></A><H2>LC_DelGiL</H2>
+<BIG><I><B>Fjern GINFO-linjer</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Fjerner linjer i GINFO-delen i en gruppe.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short linje i Første linjenummer som skal fjernes.
+ (Lovlig: 2 til ngi)
+short antall i Antall linjer som skal fjernes.
+short ngi r Antall GINFO-linjer i gruppen etter setting.
+Bruk:
+ngi = LC_DelGiL(linje, antall);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_DelGiL(short linje, short antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelKoL"NAME="LC_DelKoL"></A><H2>LC_DelKoL</H2>
+<BIG><I><B>Fjern koordinatlinjer</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Fjerner linjer koordinatdelen i en gruppe.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+long linje i Første linje som skal fjernes.
+ (Lovlig: 1 til nko)
+long antall i Antall linjer som skal fjernes.(Max resten av gruppen)
+long nko r Antall koordinater i gruppen etter blanking.
+Bruk:
+nko = LC_DelKoL(linje, antall);
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_DelKoL(long linje, long antall)
+</PRE>
+
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O18"NAME="O18"></A><H1>14 Legge data inn i ringbuffer</H1>
+</PRE>
+Dette er rutiner for legge data inn i ringbufferet.
+Rutinene arbeider mot aktuell datagruppe.
+Det forutsettes at det er tildelt plass med rutinene i kapittelet foran.
+(dvs: LC_AppGiL,LC_InsGiL,LC_AppKoL,LC_InsKoL)
+
+OBS: Etter at du er ferdig mned å legge inn nytt innhold må du
+ lagre data med LC_WxGr.
+
+<BR>
+<BR>
+<BR>
+<A ID="O19"NAME="O19"></A><H2>14.1 Kopiere gruppe</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CopyGr"NAME="LC_CopyGr"></A><H2>LC_CopyGr</H2>
+<BIG><I><B>Kopier gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Kopierer fra en annen gruppe inn i aktuell gruppe i buffer.
+Rutinen tilsvarer put fra brukerprogram inn i bufret, men rutinen
+tildeler selv nødvendig plass.
+Gruppen beholder serienummer tildelt i LC_NyGr.
+Geografisk-indeks blir ikke oppdatert før gruppen skrives til basen.
+Enhet blir oppdatert slik at opprinnelig enhet blir bevart. Om nødvendig
+legges det inn ..ENHET i GINFO.
+Kvalitet og dato blir oppdatert hvis SOSI-VERSJON < 4.00.
+Hvis det er filhode som kopieres skjer det ingen endring av egenskaper.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR *pBgr i Gruppenummer det skal kopieres fra.
+short ngis i Behandling for ..NGIS-FLAGG:
+ OPPDATER_NGIS (0) = ..NGIS-FLAGG oppdateres i henhold
+ til hodet i filen det kopieres til.
+ BEVAR_NGIS (1) = ..NGIS-FLAGG bevares uforandret i kopien
+short ngi u Antall linjer GINFO
+long nko u Antall koordinater
+unsigned short info u Diverse informasjon. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+short gnavn r Gruppenavn. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+Bruk:
+ gnavn = LC_CopyGr(&Bgr,ngis,&ngi,&nko,&info)
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_CopyGr (LC_BGR * pBgr,short ngis,short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CopyCoord"NAME="LC_CopyCoord"></A><H2>LC_CopyCoord</H2>
+<BIG><I><B>Kopier koordinater fra annen gruppe</I></B></BIG><PRE>
+===========================================================================
+Formål:
+Kopierer koordinater fra en annen gruppe inn i aktuell gruppe i ringbuffer.
+De kopierte koordinatene kommer som en utvidelse av gruppen.
+Rutinen tilsvarer put fra brukerprogram inn i ringbufret, men rutinen
+tildeler selv nødvendig plass i RB.
+Geografisk-indeks blir ikke oppdatert før gruppen skrives til basen.
+Kvalitet og enhet blir automatisk oppdatert slik at gruppene ikke
+mister informasjon.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_BGR *pBgr i Gruppenummer det skal kopieres fra.
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+long til_linje i Linjenummer linjen skal skytes inn forran.
+ (Lovlig: 1 til nko+1)
+short ngi u Antall GINFO-linjer
+long nko u Antall koordinater
+short info u Diverse informasjon. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+short sStatus r Status: UT_TRUE=OK, UT_FALSE=ikke utført.
+Bruk:
+sStatus = LC_CopyCoord(bgr,retning,til_linje,&ngi,&nko,&info);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_CopyCoord(LC_BGR * pBgr,short retning,long til_linje,short *ngi,
+ long *nko,unsigned short *info)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O20"NAME="O20"></A><H2>14.2 Gruppeinformasjon</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutGi"NAME="LC_PutGi"></A><H2>LC_PutGi</H2>
+<BIG><I><B>Put GINFO-linje</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn GINFO-linje rent generellt.
+Dette omfatter også nytt gruppenavn (GINFO-linje 1)
+Ønsker du å endre serienummer må LC_PutSn benyttes.
+Referansenummer legges inn med LC_PutRef.
+Blanke på starten og slutten blir skrella vekk, og SOSI-navnet blir
+konvertert til "store" bokstaver, .ellers lagres det slik det er.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short lin_nr i Linjenummer i GINFO (1 er første linje)
+char *ginfo i GINFO-streng avslutta med '/0'
+Bruk:
+LC_PutGi(lin_nr,ginfo);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutGi(short lin_nr, const char *pszGinfo)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutGP"NAME="LC_PutGP"></A><H2>LC_PutGP</H2>
+<BIG><I><B>Put GINFO-parameter</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn et SOSI-navn med verdi.
+Denne rutinen kan brukes til å legge inn ginfo med nytt SOSI-navn.
+Rutinen kan endre antall ginfo-linjer.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char sosi_navn i Sosi-navn det skal legges inn verdi til
+char verdi i Streng som skal legges inn.
+short *linje_nr u Linjenummer for endringen.
+short ngi r Ant. ginfo-linjer etter endringen.
+Bruk:
+ngi = LC_PutGP(sosi_navn,verdi,&linje_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PutGP(const char *sosi_navn,const char *verdi,short *linje_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_AppGP"NAME="LC_AppGP"></A><H2>LC_AppGP</H2>
+<BIG><I><B>Legg til GINFO-parameter</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger til et SOSI-navn med verdi i GINFO.
+Lik LC_PutGP, men legger alltid til ny linje i ginfo.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char sosi_navn i Sosi-navn det skal legges inn verdi til
+char verdi i Streng som skal legges inn.
+short *linje_nr u Linjenummer for endringen.
+short ngi r Ant. ginfo-linjer etter endringen.
+Bruk:
+ngi = LC_AppGP(sosi_navn,verdi,&linje_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_AppGP(const char *sosi_navn,const char *verdi,short *linje_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UpdateGP"NAME="LC_UpdateGP"></A><H2>LC_UpdateGP</H2>
+<BIG><I><B>Endre GINFO-parameter</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn parametren til et SOSI-navn.
+Rutinen handterer at det er flere SOSI-navn på samme linje.
+OBS! Denne rutinen kan ikke brukes til å legge inn nytt SOSI-navn.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short linje_nr i Linjenummer som skal endres.
+char sosi_navn i Sosi-navn det skal legges inn verdi til
+char verdi i Streng som skall legges inn
+short ist r 1=ok, 0=navnet er ikke funnet
+Bruk:
+ist = LC_UpdateGP(linje_nr,sosi_navn,verdi);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_UpdateGP(short linje_nr,const char *sosi_navn,const char *verdi)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UpdateGiEnhet"NAME="LC_UpdateGiEnhet"></A><H2>LC_UpdateGiEnhet</H2>
+<BIG><I><B>Oppdater ..ENHET i GINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Setter koordinat-enhet for gruppen.
+Oppdaterer ..ENHET / ..ENHET-H / ..ENHET-D i GINFO.
+Rutinen handterer selv tildeling eller sletting av GINFO-linje.
+Hvis verdien er lik filhodets verdi blir det ikke lagt inn verdi i GINFO.
+Enhet = 0.0 = bruk filhodets enhet, og fører til at det ikke legges inn
+i GINFO. Eventuell eksisterende linje jgernes.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til FilAdm
+double enhet i Grunnriss-enhet
+double enhet_h i Høyde-enhet
+double enhet_d i Dybde-enhet
+ngi short r Antall GINFO-linjer etter oppdatering
+Bruk:
+ngi = LC_UpdateGiEnhet(pFil,enhet,enhet_h,enhet_d);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_UpdateGiEnhet(LC_FILADM *pFil,double enhet,double enhet_h,double enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UpdateGiKvalitet"NAME="LC_UpdateGiKvalitet"></A><H2>LC_UpdateGiKvalitet</H2>
+<BIG><I><B>Oppdaterer ..KVALITET i Ginfo</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Oppdaterer GINFO med ..KVALITET
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+Parametre:
+LC_FILADM *pFil i Peker til FilAdm for sosifil kvalitet skal
+ testes mot.
+short sMetode i Metode i ..KVALITET
+long lNoyaktighet i Nøyaktighet i ..KVALITET
+short sSynbarhet i Synbarhet i ..KVALITET
+short sHoydeMetode i HøydeMetode i ..KVALITET
+long lHoydeNoyaktighet i HøydeNøyaktighet i ..KVALITET
+short ngi r Antall linjer i ginfo.
+Bruk:
+ ngi = LC_UpdateGiKvalitet(pFil,sMetode,lNoyaktighet,sSynbarhet,
+ sHoydeMetode,lHoydeNoyaktighet);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_UpdateGiKvalitet(LC_FILADM *pFil,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UpdatePiKvalitet"NAME="LC_UpdatePiKvalitet"></A><H2>LC_UpdatePiKvalitet</H2>
+<BIG><I><B>Oppdaterer ...KVALITET i Pinfo</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Oppdaterer PINFO med ...KVALITET
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til FilAdm for sosifil kvalitet
+ skal testes mot.
+long pnr i Punktnummer som skal oppdateres.
+short sMetode i Metode i ..KVALITET
+long lNoyaktighet i Nøyaktighet i ..KVALITET
+short sSynbarhet i Synbarhet i ..KVALITET
+short sHoydeMetode i HøydeMetode i ..KVALITET
+long lHoydeNoyaktighet i HøydeNøyaktighet i ..KVALITET
+short sStatus r UT_TRUE = OK,
+ UT_FALSE = ikke utført (for lite plass tilgjengelig)
+Bruk:
+sStatus = LC_UpdatePiKvalitet(pFil,pnr,sMetode,lNoyaktighet,sSynbarhet,
+ sHoydeMetode,lHoydeNoyaktighet)
+==========================================================================
+
+SK_EntPnt_FYBA short LC_UpdatePiKvalitet(LC_FILADM *pFil,long pnr,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_OppdaterEndret"NAME="LC_OppdaterEndret"></A><H2>LC_OppdaterEndret</H2>
+<BIG><I><B>Oppdater ..NGIS-FLAGG</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Oppdaterer ..NGIS-FLAGG i GINFO og ajourfører interne tabeller.
+Hvis endring = O_GINFO oppateres tabellene i forhold til
+eksisterende GINFO.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+endring short i Kode for endring:
+ O_GINFO (0) = Oppdater interne tabeller i fht. GINFO
+ O_ENDRET (1) = Merk for endret og oppdat. tab.
+ O_SLETTET (2) = Merk for slettet og oppdat. tab.
+Bruk:
+LC_OppdaterEndret(O_ENDRET);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_OppdaterEndret(short endring)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DelGiNavn"NAME="LC_DelGiNavn"></A><H2>LC_DelGiNavn</H2>
+<BIG><I><B>Fjerner egenskap fra GINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Fjerner alle forekomster av gitt egenskap (SOSI-navn) fra GINFO.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char *pszEgenskapNavn i SOSI-navn som skal slettes
+short ngi r Antall GINFO-linjer i gruppen etter setting
+Bruk:
+ngi = LC_DelGiNavn("..RADIUS");
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_DelGiNavn(char *pszEgenskapNavn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FinnNivo"NAME="LC_FinnNivo"></A><H2>LC_FinnNivo</H2>
+<BIG><I><B>Beregn nivå</I></B></BIG><PRE>
+==============================================================
+Formål:
+Teller antall prikker i starten på egenskapsnavn.
+PARAMETERLISTE:
+Type Navn I/U Merknad
+-------------------------------------------------------------
+char *pszGinfo i Streng med egenskapsnavn i starten
+short sNivo r Antall prikker
+Bruk:
+sNivo = LC_FinnNivo(pszGinfo);
+ ================================================================
+
+SK_EntPnt_FYBA short LC_FinnNivo(const char * pszNavn)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O21"NAME="O21"></A><H2>14.3 Serienummer og referansenummer</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutSn"NAME="LC_PutSn"></A><H2>LC_PutSn</H2>
+<BIG><I><B>Put Serienummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn nytt serienummer på aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long snr i Serienummer
+Bruk:
+LC_PutSn(snr);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutSn(long snr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutRef"NAME="LC_PutRef"></A><H2>LC_PutRef</H2>
+<BIG><I><B>Legger inn referanser i GINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn et array med referanser til GINFO i aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long ref_array i Gruppenummer for refererte grupper.
+ Start øy, og slutt øy angis ved fiktive gruppenr.
+ Følgende konstanter er definert:
+ START_OY = 9999999L = Start øy.
+ SLUTT_OY = -9999999L = Slutt øy.
+long ant_ref i Antall linjer i ref_array.
+short *ngi r Antall linjer GINFO
+Bruk:
+ ngi = LC_PutRef(ref_array,ant_ref);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_PutRef(long *ref_array,long ant_ref)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O22"NAME="O22"></A><H2>14.4 Koordinater</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTK"NAME="LC_PutTK"></A><H2>LC_PutTK</H2>
+<BIG><I><B>Put koordinat</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn et punkts koordinater (n,ø) i meter i terreng
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double aust i Øst-koordinat i meter i terreng
+double nord i Nord-koordinat i meter i terreng
+Bruk:
+LC_PutTK(punkt_nr,aust,nord);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutTK(long punkt_nr,double aust,double nord)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTH"NAME="LC_PutTH"></A><H2>LC_PutTH</H2>
+<BIG><I><B>Put høyde</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn et punkts høyde i meter i terreng
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double hoyde i Høyde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har høydeverdi.
+Bruk:
+LC_PutTH(punkt_nr,hoyde);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutTH(long punkt_nr, double hoyde)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTD"NAME="LC_PutTD"></A><H2>LC_PutTD</H2>
+<BIG><I><B>Put dybde</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn et punkts dybde i meter i terreng
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double hoyde i Dybde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har dybdeverdi.
+Bruk:
+LC_PutTD(punkt_nr,dybde);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutTD(long punkt_nr, double dybde)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O23"NAME="O23"></A><H2>14.5 Knutepunkt</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutKp"NAME="LC_PutKp"></A><H2>LC_PutKp</H2>
+<BIG><I><B>Put knutepunkt</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn knutepunktverdi i punktet. Ny verdi skrives over eksisterende
+verdi. (Multiple KP er ikke mulig.)
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+short kp i Knutepunkt (lovlig verdi 0 - SHRT_MAX)
+ kp == 0 fjerner knutepunkt.
+Bruk:
+LC_PutKp(punkt_nr,kp);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_PutKp(long punkt_nr, short kp)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O24"NAME="O24"></A><H2>14.6 Punktinformasjon</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutPi"NAME="LC_PutPi"></A><H2>LC_PutPi</H2>
+<BIG><I><B>Put PINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn hele punktinformasjonen på angitte punkt
+Ny verdi skriver over eksisterende verdi.
+Verdi "" fjerner eksisterende PINFO.
+Knutepunkt legges inn med LC_PutKp.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+char *pinfo i PINFO-streng som skal legges inn
+ (Knutepunkt regnes ikke som pinfo)
+short sStatus r UT_TRUE = OK,
+ UT_FALSE = ikke utført (for lite plass tilgjengelig)
+Bruk:
+sStatus = LC_PutPi(punkt_nr,pinfo);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PutPi(long punkt_nr, const char *pinfo)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O25"NAME="O25"></A><H1>15 Hente data fra ringbuffer</H1>
+</PRE>
+Dette er rutiner for hente data ut fra ringbufferet.
+Rutinene arbeider mot current datagruppe.
+Denne kan du ha fått inn enten ved les fra SOSI-fil eller at du er i
+etableringsfasen av en ny.
+
+<BR>
+<BR>
+<BR>
+<A ID="O26"NAME="O26"></A><H2>15.1 Generell verdi til et SOSI-navn</H2>
+</PRE>
+I henhold til den generelle mekanisme på SOSI-fila hvor info kan
+være enten i HODE ,GINFO eller PINFO er det behov for rutine som går
+over det hele for å finne aktuell verdi for denne gruppa
+Det tenkes her spesiellt på kavlitetsopplysninger, dato etc.
+
+<BR>
+<BR>
+<BR>
+<A ID="O27"NAME="O27"></A><H2>15.2 Gruppeinformasjon</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGi"NAME="LC_GetGi"></A><H2>LC_GetGi</H2>
+<BIG><I><B>Get GINFO-linje</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter en GINFO-linje som en streng rent generellt.
+Dette omfatter også serienummer og referansenummer.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short lin_nr i Linjenummer i GINFO (1 er første linje)
+char *ginfo r Peker til GINFO-streng avslutta med '/0'
+Bruk:
+ginfo = LC_GetGi(lin_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetGi(short lin_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGP"NAME="LC_GetGP"></A><H2>LC_GetGP</H2>
+<BIG><I><B>Get GINFO-parameter</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter parametrene til et SOSI-navn.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+Leddnummer, delstreng,skilletegn og formateringskode kan inngå som
+forlengelse av SOSI-navnet.
+Leddnummer for flerleddet parameter angis ved #n.
+Eks: ..GID#2 er bruksnummer.
+Delstreng angis ved: [start:slutt].
+NB! 1 er første tegn.
+Sluttposisjon 0 betyr at resten av strengen skal brukes.
+Eks: ..STRENG[2:0] Posisjon 2 og resten av strengen.
+Skilletegn for flerleddet GINFO. Dette angis ved ^x hvor x er det tegnet
+som skal skrives ut mellom leddene.
+Formateringskode. Dette brukes for å angi plassering av komma og antall
+desimaler i desimaltall.
+Eks: ..AREAL%-3.2 Betyr at ..AREAL fra GINFO skal formateres slik:
+Komma flyttes 3 posisjoner til venstre (divisjon med tusen) og resultatet
+presenteres avrundet til 2 desimaler.
+Eks: ..DYBDE£-1.2 Betyr at ..DYBDE fra GINFO skal formateres slik:
+Komma flyttes 1 posisjon til venstre (divisjon med ti) og resultatet
+presenteres med 2 desimaler uten avrunding. Spesielt for dybdeverdier.
+Disse tilleggene kan kombineres, slik at ..GID#2[1:2] betyr at det er
+tegn nummer 1 og 2 i det andre leddet (bruksnumret) som skal brukes.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char sosi_navn i SOSI-navn det skal finnes verdi til.
+ Leddnummer, posisjon, skilletegn
+ og formateringskode kan inngå
+ som forlengelse av navnet.
+ OBS! Store og små bokstaver er signifikante.
+short *forste_linje iu GINFO-linjenummer for start søking
+ (1 er første linje i GINFO.)
+ Ved tilslag returneres linjenummer for tilslaget.
+short siste_linje i Siste GINFO-linje det skal søkes i.
+char *para_peker r Peker til parameter-streng avslutta med '/0'.
+ Hvis SOSI-navnet ikke er funnet returneres NULL.
+Bruk:
+para_peker = LC_GetGP(sosi_navn,&forste_linje,siste_linje);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetGP(const char *sosi_navn,short *forste_linje,short siste_linje)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O28"NAME="O28"></A><H2>15.3 Serienummer og referansenummer</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetSn"NAME="LC_GetSn"></A><H2>LC_GetSn</H2>
+<BIG><I><B>Get serienummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter serienummer for aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------
+long snr r Serienr. (INGEN_GRUPPE = ingen aktuell gruppe)
+Bruk:
+snr = LC_GetSn();
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_GetSn(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetRef"NAME="LC_GetRef"></A><H2>LC_GetRef</H2>
+<BIG><I><B>Hent referanser fra GINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut et array med referanser fra GINFO i aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long *ref_array u Serienr. for refererte grupper.
+ Start øy, og slutt øy angis ved fiktive gruppenr.
+ Følgende konstanter er definert:
+ START_OY = 9999999L = Start øy.
+ SLUTT_OY = -9999999L = Slutt øy.
+long max_ref i Max antall linjer i ref_array.
+short *gilin i/u linje for start referanselesing
+short *refpos i/u posisjon i linja for neste innlegging i array.
+long ant_ref r Antall linjer brukt i ref_array.
+Bruk:
+ ant_ref = LC_GetRef(ref_array,max_ref,&gilin,&refpos);
+==========================================================================
+
+SK_EntPnt_FYBA long LC_GetRef(long *ref_array,long max_ref,short *gilin,short *refpos)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqAntRef"NAME="LC_InqAntRef"></A><H2>LC_InqAntRef</H2>
+<BIG><I><B>Spørr om antall referanser</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Spørr om antall referanser i GINFO i aktuell gruppe.
+Dette kallet kan brukes til å finne hvor stor array som må allokeres før
+kall til LC_GetRef.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long ant_ref r Antall referanser i GINFO.
+ OBS! Start- og sluttparantes for øy blir regnet
+ som egne referanser.
+Bruk:
+ long lAntRef;
+ short sGiLin,sRefPos;
+ long *plRefArray;
+ lAntRef = LC_InqAntRef();
+ plRefArray = (long *) UT_MALLOC(lAntRef * sizeof(long));
+ sGiLin = 2;
+ sRefPos = 0;
+ LC_GetRef(plRefArray,lAntRef,&sGiLin,&sRefPos);
+==========================================================================
+
+SK_EntPnt_FYBA long LC_InqAntRef(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitGetRefFlate"NAME="LC_InitGetRefFlate"></A><H2>LC_InitGetRefFlate</H2>
+<BIG><I><B>Initierer status for GetRefFlate</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Initierer status for GetRefFlate.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_GRF_STATUS * pRefStat iu Struktur med statusopplysninger.
+Bruk:
+ LC_InitGetRefFlate(pGrfStat,pBgr);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_InitGetRefFlate(LC_GRF_STATUS * pGS)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetRefFlate"NAME="LC_GetRefFlate"></A><H2>LC_GetRefFlate</H2>
+<BIG><I><B>Hent referanser for flate fra GINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut et array med referanser for flate fra GINFO i aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+-------------------------------------------------------------------------
+LC_GRF_STATUS * GrfStat iu Struktur med statusopplysninger.
+unsigned short usHent i Hva skal hentes:
+ GRF_YTRE = Ytre avgrensing
+ GRF_INDRE = Indre avgrensing, øyer
+ (kan kombineres med | (or).)
+long *ref_array u GRUPPENUMMER for refererte grupper.
+unsigned char *ref_status u Status for gruppene i ref_array.
+ LC_MED_DIG = Brukes MED dig retning.
+ LC_MOT_DIG = Brukes MOT dig retning.
+ GRF_START_OY = Første gruppe i øy
+ GRF_SLUTT_OY = Siste gruppe i øy
+long max_ref i Max antall linjer i ref_array og ref_status.
+long ant_ref r Antall linjer brukt i ref_array.
+ 0 viser at hele flata er behandla.
+Bruk:
+ #define MAX_REF 20
+ long ref_arr[MAX_REF];
+ char ref_status[MAX_REF];
+ long ant_ref;
+ LC_GRF_STATUS GrfStat;
+ LC_InitGetRefFlate(&GrfStat);
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+ do {
+ if (ant_ref > 0) {
+ .
+ Behandle ytre avgrensing
+ .
+ }
+ [if (ant_ref < MAX_REF) break;]
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+ } while (ant_ref > 0);
+ LC_InitGetRefFlate(&GrfStat);
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_INDRE,ref_arr,ref_status,MAX_REF);
+ do {
+ if (ant_ref > 0) {
+ .
+ Behandle indre avgrensing (øy)
+ .
+ }
+ [if (ant_ref < MAX_REF) break;]
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_INDRE,ref_arr,ref_status,MAX_REF);
+ } while (ant_ref > 0);
+==========================================================================
+
+SK_EntPnt_FYBA long LC_GetRefFlate(LC_GRF_STATUS * GrfStat,unsigned short usHent,long *ref_array,
+ unsigned char *ref_status,long max_ref)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErLinjeRefLin"NAME="LC_ErLinjeRefLin"></A><H2>LC_ErLinjeRefLin</H2>
+<BIG><I><B>Sjekk om linje inneholder referanser</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+sRefLin = LC_ErLinjeRefLin(gp,sRefLin);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+char *pszGinfoLin i Peikar til GINFO-linje
+short sRefLin i Flagg som viser om forrige linje inneholdt referanser
+short sRefLin r Flagg som viser om aktuell linje inneholdt referanser
+Sjekk om linje er linje med referanser.
+=======================================================================
+
+short LC_ErLinjeRefLin(char *pszSosiLin, short sRefLin)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O29"NAME="O29"></A><H2>15.4 Spesielle get-rutiner</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBuePar"NAME="LC_GetBuePar"></A><H2>LC_GetBuePar</H2>
+<BIG><I><B>Beregner parametre som definerer sirkelbue</I></B></BIG><PRE>
+============================================================================
+Formål: fi
+Sirkelbue defineres i SOSI ved en av /
+geometrielementene .SIRKEL, .SIRKELP, /
+.BUE, .BUEP. / /
+Denne rutina regner om til en intern as, ns * -radius- ) dfi
+bueangivelse med sirkelsentrum, radius / /
+og retning til buens startpunkt samt /
+delta for sluttpunktet uansett hvordan /
+buen er definert i SOSI.
+NB! Alle retninger i radianer, 0-retning i øst-aksen og positiv
+omløpsretning mot urviseren.
+Parametre:
+Type Navn I/U Forklaring
+----------------------------------------------------------------------------
+short buff_retning i Buffer-retning (kun for BUE og BUEP)
+ HENT_FORRFRA (1) = Vanlig
+ HENT_BAKFRA (-1) = Buffer skal snues
+double *as u Øst-koordinat sentrum sirkelbue
+double *an u Nord-koordinat sentrum sirkelbue
+double *radius u Radius i sirkelbue.
+double *fi u Retningsvinkel sentrum -> startpunkt bue
+double *dfi u Vinkel mellom fi og sentrum -> sluttpunkt bue
+ dfi > 0 = Positiv omløpsretning(mot klokka)
+ dfi < 0 = Negativ omløpsretning(med klokka)
+short *sfeil u Feilstatus, definert dersom ist = 0
+ 1 = Ulovlig geometritype(ikke bue)
+ 2 = Feil ved beregning av bueparametre
+short ist r Returstatus
+ UT_TRUE = Alt OK
+ UT_FALSE = Feil, se returvariabel sfeil
+Bruk:
+ist = LC_GetBuePar(buff_retning, &as, &ns, &radius, &fi, &dfi, &sfeil )
+ ============================================================================
+
+SK_EntPnt_FYBA short LC_GetBuePar(short buff_retning, double *as, double *ns, double *radius,
+ double *fi, double *dfi, short *sfeil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBue"NAME="LC_GetBue"></A><H2>LC_GetBue</H2>
+<BIG><I><B>Hent bue</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut nødvendige opplysninger om en bue.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+double *a1 u Koordinat i første punkt
+double *n1 u
+double *a2 u Koordinat i siste punkt
+double *n2 u
+double *radius u Radius
+short *storbue u 0=vanlig bue, 1=storbue
+short ist r status: UT_TRUE = OK,
+ UT_FALSE = feil (Gruppen er ikke OK bue)
+Bruk:
+ ist = LC_GetBue(retning,&a1,&n1,&a2,&n2,&radius,&storbue);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetBue(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *radius,short *storbue)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBuep"NAME="LC_GetBuep"></A><H2>LC_GetBuep</H2>
+<BIG><I><B>Hent buep</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut nødvendige opplysninger om en buep.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+double *a1 u Koordinat i første punkt
+double *n1 u
+double *a2 u Koordinat i midtre punkt
+double *n2 u
+double *a3 u Koordinat i siste punkt
+double *n3 u
+short ist r status: UT_TRUE = OK,
+ UT_FALSE = feil (Gruppen er ikke OK buep)
+Bruk:
+ ist = LC_GetBuep(retning,&a1,&n1,&a2,&n2,&a3,&n3);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetBuep(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetSirkel"NAME="LC_GetSirkel"></A><H2>LC_GetSirkel</H2>
+<BIG><I><B>Hent silkel</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut nødvendige opplysninger om en sirkel.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double *as u Koordinat i sentrum
+double *ns u
+double *radius u Radius
+short ist r status: UT_TRUE = OK,
+ UT_FALSE = Feil (Gruppen er ikke OK sirkel)
+Bruk:
+ ist = LC_GetSirkel(&as,&ns,&radius);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetSirkel(double *as,double *ns,double *radius)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetSirkelp"NAME="LC_GetSirkelp"></A><H2>LC_GetSirkelp</H2>
+<BIG><I><B>Hent silkelp</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut nødvendige opplysninger om en sirkelp.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double *a1 u Koordinat i P1
+double *n1 u
+double *a2 u Koordinat i P2
+double *n2 u
+double *a3 u Koordinat i P3
+double *n3 u
+short ist r status: UT_TRUE = OK,
+ UT_FALSE = Feil (Gruppen er ikke OK sirkelp)
+Bruk:
+ ist = LC_GetSirkelp(&a1,&n1,&a2,&n2,&a3,&n3);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetSirkelp(double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetKvalitet"NAME="LC_GetKvalitet"></A><H2>LC_GetKvalitet</H2>
+<BIG><I><B>Finner kvalitetsopplysninger</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finne kvalitetsopplysninger i filhode eller vanlig gruppe.
+(Tolker aktuell gruppe.)
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short *psMetode u Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+ KVAL_MET_STD standard metode fra nivå over.
+long *pLNnoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+ KVAL_NOY_STD standard nøyaktighet fra nivå over
+short *psSynbarhet u Synbarhet i bilde
+ KVAL_SYN_UNDEF synbarhet er udefinert.
+ KVAL_SYN_STD standard metode fra nivå over.
+short *psHoydeMetode u Hvordan høyden er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+ KVAL_MET_STD standard metode fra nivå over.
+long *plHoydeNoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+ KVAL_NOY_STD standard nøyaktighet fra nivå over
+short ist r Status: UT_TRUE = OK, ..KVALITET er funnet
+ UT_FALSE = ikke funnet
+Bruk:
+ ist = LC_GetKvalitet(&sMetode,&lNoyaktighet,&sSynbarhet,
+ &sHoydeMetode,&lHoydeNoyaktighet);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetKvalitet(short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O30"NAME="O30"></A><H2>15.5 Koordinater</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTK"NAME="LC_GetTK"></A><H2>LC_GetTK</H2>
+<BIG><I><B>Get koordinat</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter et punkts koordinater (ø,n) i meter i terreng
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *aust u Øst-koordinat i meter i terreng
+double *nord u Nord-koordinat i meter i terreng
+Bruk:
+LC_GetTK(punkt_nr,&aust,&nord);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_GetTK(long punkt_nr,double *aust,double *nord)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetArrayTK"NAME="LC_GetArrayTK"></A><H2>LC_GetArrayTK</H2>
+<BIG><I><B>Hent tabell med koordinater</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter tabell med koordinater (ø,n) i meter i terreng
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+long max_antall i Max antall punkt som kan hentes
+long fra_punkt i Fra punktnummer (1 eller nko er første punkt)
+double *aust u Peker til tab. for øst-koordinater
+double *nord u Peker til tab. for nord-koordinater
+long *antall u Antall punkt hentet
+Bruk:
+LC_GetArrayTK(retning,max_antall,fra_punkt,aust,nord,&lest);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_GetArrayTK(short retning,long max_antall,long fra_punkt,
+ double *aust,double *nord,long *antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTH"NAME="LC_GetTH"></A><H2>LC_GetTH</H2>
+<BIG><I><B>Get høyde</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter et punkts høyde i meter i terreng. (Henter BARE FRA PUNKTET.)
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *hoyde r Høyde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har høydeverdi.
+Bruk:
+hoyde = LC_GetTH(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA double LC_GetTH(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetArrayTH"NAME="LC_GetArrayTH"></A><H2>LC_GetArrayTH</H2>
+<BIG><I><B>Hent tabell med høyder</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter tabell med høyder
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snues.
+long max_antall i Max antall punkt som kan hentes
+long fra_punkt i Fra punktnummer (1 eller nko er første punkt)
+double *aust u Peker til tab. for høyder
+long *antall u Antall punkt hentet
+Bruk:
+LC_GetArrayTH(retning,max_antall,fra_punkt,hoyde,&lest);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_GetArrayTH(short retning,long max_antall,long fra_punkt,
+ double *hoyde,long *antall)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetHoyde"NAME="LC_GetHoyde"></A><H2>LC_GetHoyde</H2>
+<BIG><I><B>Get høyde</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter et punkts høyde i meter i terreng. (Henter fra punktet eller fra
+GINFO.)
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *hoyde r Høyde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har høydeverdi.
+Bruk:
+hoyde = LC_GetHoyde(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA double LC_GetHoyde(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTD"NAME="LC_GetTD"></A><H2>LC_GetTD</H2>
+<BIG><I><B>Get dybde</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter et punkts dybde i meter i terreng. (Henter BARE FRA PUNKTET.)
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *dybde r Dybde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har dybdeverdi.
+Bruk:
+dybde = LC_GetTD(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA double LC_GetTD(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetDybde"NAME="LC_GetDybde"></A><H2>LC_GetDybde</H2>
+<BIG><I><B>Get dybde</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter et punkts dybde i meter i terreng. (Henter fra punktet eller fra
+GINFO.)
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+double *hoyde r Dybde i meter i terreng. Konstanten
+ HOYDE_MANGLER (-999.999) angir at punktet ikke
+ har høydeverdi.
+Bruk:
+dybde = LC_GetHoyde(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA double LC_GetDybde(long punkt_nr)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O31"NAME="O31"></A><H2>15.6 Knutepunkt</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetKp"NAME="LC_GetKp"></A><H2>LC_GetKp</H2>
+<BIG><I><B>Get knutepunkt</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter knutepunktverdi i punktet.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+short kp_type r Knutepunkttype (1-4095)
+ (0 = punktet har ikke knutepunkt)
+Bruk:
+kp = LC_GetKp(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetKp(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FinnKp"NAME="LC_FinnKp"></A><H2>LC_FinnKp</H2>
+<BIG><I><B>Finn knutepunkt</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Skanner gruppe, og finner punkt som er knutepunkt.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long *forste_punkt iu Punktnummer for start søking.
+ (1 er første punkt i gruppen.)
+ Ved tilslag returneres punktnummer for tilslaget.
+long siste_punkt i Siste punkt det skal søkes i.
+short *kp u Knutepunkt.
+short status r Søkestatus (1=funnet, 0=ikke funnet)
+Bruk:
+status = LC_FinnKp(&forste_punkt,siste_punkt,kp);
+ ==========================================================================
+
+short LC_FinnKp(long *forste_punkt,long siste_punkt,short *kp)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O32"NAME="O32"></A><H2>15.7 Punktinformasjon</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetPi"NAME="LC_GetPi"></A><H2>LC_GetPi</H2>
+<BIG><I><B>Get PINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter punktinformasjon i angitte punkt som en streng.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+char *pinfo r Peker til punktinformasjon eksklusiv knutepunkt
+Bruk:
+pinfo = LC_GetPi(punkt_nr);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetPi(long punkt_nr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitPP"NAME="LC_InitPP"></A><H2>LC_InitPP</H2>
+<BIG><I><B>Initier PINFO-søk</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Initierer søk etter PINFO.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char sosi_navn i Sosi-navn det skal finnes verdi til
+long forste_punkt i Første punkt. (1 er første pkt i gr)
+long siste_punkt i Siste punkt det skal søkes i
+LC_GETPP_STATUS pp_stat iu Struktur med statusvariabler. Denne er
+ bare for intern bruk i InitPP / GetPP.
+Bruk:
+ Se under LC_GetPP.
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_InitPP(char *sosi_navn,long forste_punkt,long siste_punkt,
+ LC_GETPP_STATUS *pp_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetPP"NAME="LC_GetPP"></A><H2>LC_GetPP</H2>
+<BIG><I><B>Utfør PINFO-søk</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter parametrene til et SOSI-navn definert i LC_InitPP.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk strcpy).
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long *punkt u Ved tilslag returneres punktnummer for
+ tilslaget.
+LC_GETPP_STATUS pp_stat iu Struktur med statusvariabler. Denne er
+ bare for intern bruk i InitPP / GetPP.
+char *para_peker r Peker til para.-streng avslutta med '/0'.
+ Hvis ingenting er funnet returneres NULL.
+Bruk:
+.
+ LC_GETPP_STATUS pp_stat;
+.
+LC_InitPP(sosi_navn,forste_punkt,siste_punkt,pp_stat);
+para_peker = LC_GetPP(&punkt,pp_stat);
+ .
+ =============================================================================
+
+SK_EntPnt_FYBA char *LC_GetPP(long *punkt,LC_GETPP_STATUS *pp_stat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetPiVerdi"NAME="LC_GetPiVerdi"></A><H2>LC_GetPiVerdi</H2>
+<BIG><I><B>Get PINFO-verdi</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter parametrene til et SOSI-navn.
+Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+Leddnummer, delstreng og formateringskode kan inngå som
+forlengelse av SOSI-navnet.
+Leddnummer for flerleddet parameter angis ved #n.
+Eks: ...KVALITET#2 er nøyaktighet.
+Delstreng angis ved: [start:slutt].
+NB! 1 er første tegn.
+Sluttposisjon 0 betyr at resten av strengen skal brukes.
+Eks: ..STRENG[2:0] Posisjon 2 og resten av strengen.
+Formateringskode kan angi skilletegn for flerleddet PINFO. Dette
+angis ved ^x hvor x er det tegnet som skal skrives ut mellom leddene.
+Disse tilleggene kan kombineres, slik at ...KVALITET#2[1:2] betyr at
+det er tegn nummer 1 og 2 i det andre leddet (nøyaktigheten) som skal
+brukes.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+char pszSosiNavn i SOSI-navn det skal finnes verdi til.
+ Leddnummer posisjon og formateringskode kan
+ inngå som forlengelse av navnet.
+ OBS! Store og små bokstaver er signifikante.
+ HØYDE er spesialverdi som henter formatert
+ høyde fra punktet eller GINFO.
+ KVALITET er spesialverdi som henter formatert
+ kvalitet fra punktet, GINFO eller hode.
+long lPnr i Punktnummer
+short *sSettNr iu PINFO-nummer (1 er første sett i PINFO.)
+ Ved tilslag returneres settnummer for tilslaget.
+char *pszVerdi r Peker til verdien avslutta med '/0'.
+ Hvis SOSI-navnet ikke er funnet returneres NULL.
+Bruk:
+pszVerdi = LC_GetPiVerdi(pszSosiNavn,lPnr,&sSettNr);
+ ==========================================================================
+
+SK_EntPnt_FYBA char *LC_GetPiVerdi(const char *pszSosiNavn,long lPnr,short *sSettNr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_TestPi"NAME="LC_TestPi"></A><H2>LC_TestPi</H2>
+<BIG><I><B>Sjekk om punkt har PINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker om et punkt har PINFO i en eller annen form.
+(PINFO, KP, høyde.)
+Høyde handteres ikke foreløpig.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long punkt_nr i Punktnummer (1 er første punkt)
+short sTestHoyde i Bryter for å si om høyde skal regnes med i sjekken.
+short sStatus r UT_TRUE=har "pinfo", UT_FALSE=har ikke "pinfo"
+Bruk:
+sStatus = LC_TestPi(punkt_nr,UT_TRUE);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_TestPi(long punkt_nr,short sTestHoyde)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O33"NAME="O33"></A><H2>15.8 Spesielle henteoperasjoner</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetCurEnhet"NAME="LC_GetCurEnhet"></A><H2>LC_GetCurEnhet</H2>
+<BIG><I><B>Hent enhet på angitt nivå</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter ut enhet fra filhode eller GINFO
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til FilAdm
+short *nivaa iu angir nivå for henting, returnerer aktuelt nivå
+ 1 = filhode
+ 2 = GINFO
+double *enhet u Aktuell enhet
+double *enhet_h u Aktuell enhet-H
+double *enhet_d u Aktuell enhet-D
+Bruk:
+ LC_GetCurEnhet(pFil,&nivaa,&enhet,&enhet_h,&enhet_d);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_GetCurEnhet(LC_FILADM * pFil,short *nivaa, double *enhet,
+ double *enhet_h, double *enhet_d)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetCurKvalitet"NAME="LC_GetCurKvalitet"></A><H2>LC_GetCurKvalitet</H2>
+<BIG><I><B>Finner kvalitetsopplysninger på angitt nivå</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finne kvalitetsopplysninger på angitt nivå, hode ginfo eller pinfo.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM * pFil i Peker til FilAdm
+short *nivaa iu Hvor skal det letes.
+ 0 = ikke funnet
+ 1 = hode
+ 2 = ginfo
+ 3 = pinfo
+ Returnerer aktuelt nivå.
+long pnr i punktnr. ved spørring på pinfo
+short *psMetode u Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+long *pLNnoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+short *psSynbarhet u Synbarhet i bilde
+ KVAL_SYN_UNDEF synbarhet er udefinert.
+short *psHoydeMetode u Hvordan høyden er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+long *plHoydeNoyaktighet u Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+short ist r Statusvariabel:
+ UT_TRUE = OK, KVALITET er funnet
+ UT_FALSE = KVALITET er ikke funnet
+Bruk:
+ ist = LC_GetCurKvalitet(pFil,&nivaa,pnr,&sMetode,&lNoyaktighet,
+ &sSynbarhet,&sHoydeMetode,&lHoydeNoyaktighet);
+==========================================================================
+
+SK_EntPnt_FYBA short LC_GetCurKvalitet(LC_FILADM *pFil,short *nivaa,long pnr,
+ short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetObjtypeBgr"NAME="LC_GetObjtypeBgr"></A><H2>LC_GetObjtypeBgr</H2>
+<BIG><I><B>Hent objekttype</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter objekttype for gitt gruppenummer.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_BGR *pBgr i Gruppenummer det ønskes opplysninger om.
+char *pszObjtype r OBJTYPE
+ NULL hvis gruppen ikke finnes
+Bruk:
+pszObjtype = LC_GetObjtypeBgr(pBgr);
+=============================================================================
+
+SK_EntPnt_FYBA const char *LC_GetObjtypeBgr(LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetElementNavn"NAME="LC_GetElementNavn"></A><H2>LC_GetElementNavn</H2>
+<BIG><I><B>Hent elementnavn</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Hent et elementnavn fra den interne navnetabellen i FYBA.
+Denne tabellen inneholder både gruppenavn (.LINJE, .KURVE, ...) og
+egenskapsnavn (..OBJTYPE, ..LTEMA, ...)
+Tabellen har tre logiske deler:
+ - (Linje 0 - L_HODE): Forhåndsdefinerte gruppenavn.
+ - (Linje L_HODE+1 - L_KP): Forhåndsdefinerte egenskapsnavn.
+ - (Linje L_KP+1 - n): Andre elementnavn brukt i SOSI-filen etter
+ indeksoppbygging.
+Selv om egenskapen blir fjernet fra SOSI-filen blir navnet fortsatt
+liggende i navnetabellen
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+short sNavnNr i Linjenummer i navnetabellen (0 - n)
+bool *bBrukt Viser om navnet har/er brukt i filen
+ Hvis det har vært en gruppe som har brukt navnet blir
+ denne stående "true" selv om gruppen er slettet.
+const char *pszNavn r Peker til elementnavn,
+ NULL = ukjent fil eller ulovlig linjenummer
+Bruk:
+// Går gjennom alle navnene ut over de forhåndsdefinerte navnene.
+short sNavnNr = L_KP+1;
+while ((pszNavn = LC_GetElementNavn(pFil,sNavnNr)) != NULL)
+{
+ // Gjør noe med navnet
+ ...
+ ++sNavnNr;
+}
+=============================================================================
+
+SK_EntPnt_FYBA const char *LC_GetElementNavn(LC_FILADM *pFil,short sNavnNr,bool *bBrukt)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O34"NAME="O34"></A><H1>16 Blaing i basen</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitNextFil"NAME="LC_InitNextFil"></A><H2>LC_InitNextFil</H2>
+<BIG><I><B>Initier finn neste fil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Initierer pFil for bruk i finn neste fil.
+Parametre:
+Type Navn I/U Forklaring
+------------------------------------------------------------------------
+LC_FILADM **ppFil u Peker til FilAdm-peker
+Bruk:
+ LC_InitNextFil(&pFil)
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_InitNextFil(LC_FILADM **ppFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_NextFil"NAME="LC_NextFil"></A><H2>LC_NextFil</H2>
+<BIG><I><B>Finn neste fil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finn neste fil i aktuell base.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM **ppFil iu Peker til FilAdm-peker
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR, LC_BAKGR og /eller LC_SEKV
+ (Bruk "|" for å kombinere.)
+short sStatus r Status UT_TRUE=OK, UT_FALSE=ingen flere funnet
+Bruk:
+ LC_FILADM *pFil;
+ Denne løkka går gjennom alle framgrunns-filene i basen
+ LC_InitNextFil(&pFil)
+ while (LC_NextFil(&pFil,LC_FRAMGR)) {
+ pszFilNavn = LC_GetFiNa(pFil);
+ .
+ Behandle filnavnet
+ .
+ }
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_NextFil(LC_FILADM **ppFil,unsigned short usLag)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitNextBgr"NAME="LC_InitNextBgr"></A><H2>LC_InitNextBgr</H2>
+<BIG><I><B>Initier finn neste gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Initierer Bgr for bruk i finn neste gruppe.
+Parametre:
+Type Navn I/U Forklaring
+------------------------------------------------------------------------
+LC_BGR * pBgr iu Peker til gruppestruktur
+Bruk:
+ LC_InitNextBgr(&Bgr)
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_InitNextBgr(LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_NextBgr"NAME="LC_NextBgr"></A><H2>LC_NextBgr</H2>
+<BIG><I><B>Finn neste gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finn neste gruppe i aktuell base.
+Sekvensielle filer blir ikke håndtert.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pBgr iu Peker til gruppestruktur der gruppenummer lagres
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+ (Bruk "|" for å kombinere.)
+short sStatus r Status UT_TRUE=OK, UT_FALSE=ingen flere grupper
+Bruk:
+ LC_BGR Bgr;
+ Denne løkka går gjennom alle framgrunns-gruppene i basen
+ LC_InitNextBgr(&Bgr);
+ while (LC_NextBgr(&Bgr,LC_FRAMGR)) {
+ gnavn = LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ .
+ Behandle gruppen
+ .
+ }
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_NextBgr(LC_BGR * pBgr,unsigned short usLag)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O35"NAME="O35"></A><H1>17 Geografisk søking</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetGrWin"NAME="LC_GetGrWin"></A><H2>LC_GetGrWin</H2>
+<BIG><I><B>Hent omskrevet rektangel for gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter omskrevet rektangel for gitt gruppe.
+For flater er refererte grupper medregnet.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pBgr i Gruppenummer
+double *nva u Omskrevet rektangel for gruppen. Avrundet utover
+double *nvn u en enhet.
+double *oha u
+double *ohn u
+short ist r Status. UT_TRUE=OK, UT_FALSE=ulovlig gruppenummer.
+Bruk:
+ ist = LC_GetGrWin(&Bgr,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetGrWin(LC_BGR * pBgr,double *nva,double *nvn,double *oha,double *ohn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SBFlate"NAME="LC_SBFlate"></A><H2>LC_SBFlate</H2>
+<BIG><I><B>Sett søkegrense for geografisk søk på flate</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Definerer punkt for geografisk søk på flate.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+double nv_a i Koordinat nedre venstre hjørne
+double nv_n i
+double oh_a i Koordinat øvre høyre hjørne
+double oh_n i
+Bruk:
+LC_GEO_STATUS GeoStat;
+.
+LC_SBFlate(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+if (LC_FFFlate(&GeoStat,&Bgr)) {
+ do{
+ . Behandle funnet gruppe
+ .
+ } while (LC_FNFlate(&GeoStat,&Bgr));
+}
+LC_AvsluttSok(&GeoStat);
+.
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_SBFlate(LC_GEO_STATUS * pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFFlate"NAME="LC_FFFlate"></A><H2>LC_FFFlate</H2>
+<BIG><I><B>Finn første ved flatesøk</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Finner første gruppe i det definerte området for flatesøk.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+Se under LC_SBFlate.
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_FFFlate(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNFlate"NAME="LC_FNFlate"></A><H2>LC_FNFlate</H2>
+<BIG><I><B>Finn neste ved flatesøk</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner neste gruppe i det definerte området for flatesøk.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+Se under LC_SBFlate.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FNFlate(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SBGeo"NAME="LC_SBGeo"></A><H2>LC_SBGeo</H2>
+<BIG><I><B>Sett søkegrense for grov geografisk søk</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Definerer geografisk område for geografisk søk.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus.
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+double nv_a i Koordinat nedre venstre hjørne.
+double nv_n i
+double oh_a i Koordinat øvre høyre hjørne.
+double oh_n i
+Bruk:
+LC_GEO_STATUS GeoStat;
+.
+LC_SBGeo(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+if (LC_FFGeo(&GeoStat,&Bgr)) {
+ do{
+ . Behandle funnet gruppe
+ .
+ } while (LC_FNGeo(&GeoStat,&bgr));
+}
+LC_AvsluttSok(&GeoStat);
+.
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_SBGeo(LC_GEO_STATUS * pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFGeo"NAME="LC_FFGeo"></A><H2>LC_FFGeo</H2>
+<BIG><I><B>Finn første ved geografisk søk</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner første gruppe i det definerte området for kombinert geografisk søk.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+Se under LC_SBGeo.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FFGeo(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNGeo"NAME="LC_FNGeo"></A><H2>LC_FNGeo</H2>
+<BIG><I><B>Finn neste ved geografisk søk</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner neste gruppe i det definerte området for geografisk søk.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+Se under LC_SBGeo.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FNGeo(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FAGeo"NAME="LC_FAGeo"></A><H2>LC_FAGeo</H2>
+<BIG><I><B>Finn alle ved geografisk søk</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finn alle i geografisk søkeområde.
+Tilslag merkes i brukttabellen kolonne BT_GEOSOK (15).
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+long lAntall r Antall funnet.
+Bruk:
+.
+LC_SBGeo(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+antall = LC_FAGeo(&Bgr);
+.
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_FAGeo(LC_GEO_STATUS * pGeoStat)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFGeoFil"NAME="LC_FFGeoFil"></A><H2>LC_FFGeoFil</H2>
+<BIG><I><B>Finn første ved geografisk søk i en fil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner første gruppe i det definerte området for kombinert geografisk søk.
+Søker bare i en gitt fil.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_FILADM * pOnsketFil i Filpeker til den filen det skal søkes i.
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+Se under LC_SBGeo.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FFGeoFil(LC_GEO_STATUS * pGeoStat,LC_FILADM *pOnsketFil,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNGeoFil"NAME="LC_FNGeoFil"></A><H2>LC_FNGeoFil</H2>
+<BIG><I><B>Finn neste ved geografisk søk i en fil</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner neste gruppe i det definerte området for geografisk søk.
+Søker bare i en gitt fil.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+LC_FILADM * pFil i Filpeker til den filen det skal søkes i.
+LC_BGR * pBgr u Funnet gruppe
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+Se under LC_SBGeo.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_FNGeoFil(LC_GEO_STATUS * pGeoStat,LC_FILADM *pFil,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_AvsluttSok"NAME="LC_AvsluttSok"></A><H2>LC_AvsluttSok</H2>
+<BIG><I><B>Avslutter geografisk søk</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_GEO_STATUS * pGeoStat i Peker til struktur for søkestatus
+Formål:
+Avslutter geografisk søk, og frigir kjede med søkeresultat.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_AvsluttSok(LC_GEO_STATUS * pGeoStat)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_WTst"NAME="LC_WTst"></A><H2>LC_WTst</H2>
+<BIG><I><B>Vindustest</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekk om aktuell gruppe berører gitt vindu.
+Tar hensyn til gruppenavnet. Handterer (PUNKT, LINJE, KURVE, BUE,
+BUEP, SIRKEL, SIRKELP, SVERM, TRASE ).
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double nva i Avgrensing av vinduet
+double nvn i
+double oha i
+double ohn i
+short ist r status: 0 = ikke berøring
+ 1 = skjæring
+Bruk:
+.
+LC_SBGeo(&GeoStat,nv_a,nv_n,oh_a,oh_n);
+if (LC_FFGeo(&GeoStat,&Bgr)){
+ do{
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (LC_WTst(nv_a,nv_n,oh_a,oh_n)) { (Nøyaktig vindustest)
+ . Behandle funnet gruppe
+ .
+ }
+ } while (LC_FNGeo(&GeoStat,&Bgr));
+}
+LC_AvsluttSok(&GeoStat);
+.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_WTst(double nva,double nvn,double oha,double ohn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PTst"NAME="LC_PTst"></A><H2>LC_PTst</H2>
+<BIG><I><B>Polygontest</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker om gitt punkt ligger innenfor polygon angitt av aktuell gruppe.
+Forutsetter at tabellen danner et lukket polygon
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double a i Punkt som skal sjekkes
+double n i
+short ist r status: 0 = punktet er utenfor flaten
+ 1 = punktet ligger inne på flaten
+Bruk:
+.
+LC_SBFlate(&GeoStat,a-d,n-d,a+d,n+d);
+if (LC_FFFlate(&GeoStat,&Bgr)) {
+ do{
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (LC_PTst(a,n)){ (Nøyaktig polygontest)
+ . Behandle funnet gruppe
+ .
+ }
+ } while (LC_FNFlate(&GeoStat,&Bgr));
+}
+LC_AvsluttSok(&GeoStat);
+.
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PTst(double a,double n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PTstOmkrets"NAME="LC_PTstOmkrets"></A><H2>LC_PTstOmkrets</H2>
+<BIG><I><B>Sjekk om punkt ligger inni polygon</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker om gitt punkt ligger innenfor yttergrensen for polygon angitt
+av aktuell gruppe.
+Forutsetter at tabellen danner et lukket polygon
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double a i Punkt som skal sjekkes
+double n i
+short ist r status: 0 = punktet er utenfor flaten
+ 1 = punktet ligger inne på flaten
+Bruk:
+ist = LC_PTstOmkrets(a,n);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PTstOmkrets(double a,double n)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O36"NAME="O36"></A><H1>18 Serienummer-søking</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SBSn"NAME="LC_SBSn"></A><H2>LC_SBSn</H2>
+<BIG><I><B>Sett søkegrense for serienummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Setter søkegrenser for serienummersøk.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_FILADM * pFil i Peker til FilAdm
+long lMinSnr i Fra og med serienummer
+long lMaxSnr i Til og med serienummer
+Bruk:
+LC_SNR_ADM SnrAdm;
+LC_SBSn(&SnrAdm,pFil,lMinSnr,lMaxSnr);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SBSn(LC_SNR_ADM * pSnrAdm,LC_FILADM *pFil,long lMinSnr,long lMaxSnr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_MoveSn"NAME="LC_MoveSn"></A><H2>LC_MoveSn</H2>
+<BIG><I><B>Flytt til gruppenummer for et serienummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finn gruppenummer for et gitt serienummer i søkeområdet for serienummer.
+Intern "aktuellt serienummer" blir endret, slik at videre søk med
+neste/forrige nå tar utgangspunkt i dette serienummer.
+(Bare hvis snr er funnet).
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm iu Peker til statusblokk for serienummersøk
+long lSnr i Serienummer som skal finnes
+LC_BGR *pBgr u Gruppenummer i basen
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_MoveSn(pSnrAdm,snr,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_MoveSn(LC_SNR_ADM * pSnrAdm,long lSnr,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FiSn"NAME="LC_FiSn"></A><H2>LC_FiSn</H2>
+<BIG><I><B>Finn gruppenummer for et serienummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finn gruppenummer for et gitt serienummer i søkeområdet for serienummer.
+Endrer IKKE "current gruppe".
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+long lSnr i Serienummer som skal finnes
+LC_BGR *pBgr u Gruppenummer i basen
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FiSn(pFil,lSnr,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FiSn(LC_FILADM *pFil,long lSnr,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FiArraySn"NAME="LC_FiArraySn"></A><H2>LC_FiArraySn</H2>
+<BIG><I><B>Finn gruppenummer for flere serienummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner gruppenummer for tabell med serienummer.
+Endrer IKKE "current gruppe".
+Serienummertabellen kan være "rå" slik den kommer fra GetRef. Linjer med
+start øy og slutt øy overses.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_FILADM *pFil i Peker til FilAdm
+short antall i Antall linjer brukt i serienummertabellen
+long *snr i Tabell med serienummer som skal finnes
+long *bgr u Tabell med gruppenummer funnet
+ (INGEN_GRUPPE = ikke funnet)
+Bruk:
+LC_FiArraySn(pFil,antall,snr,bgr);
+================================================================================
+
+SK_EntPnt_FYBA void LC_FiArraySn(LC_FILADM *pFil,short antall,long *snr,long *bgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FASn"NAME="LC_FASn"></A><H2>LC_FASn</H2>
+<BIG><I><B>Finn alle serienummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner alle grupper i fil/serienummer søkeområdet og merker i kolonne
+BT_SNRSOK i brukttabellen.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+long antall r Antall grupper funnet.
+Bruk:
+antall_funnet = LC_FASn(&SnrAdm);
+=============================================================================
+
+SK_EntPnt_FYBA long LC_FASn(LC_SNR_ADM * pSnrAdm)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFSn"NAME="LC_FFSn"></A><H2>LC_FFSn</H2>
+<BIG><I><B>Finn første serienummer</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Finner første gruppe i fil/serienummer søkeområdet.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FFSn(&SnrAdm,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FFSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNSn"NAME="LC_FNSn"></A><H2>LC_FNSn</H2>
+<BIG><I><B>Finn neste serienummer</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner neste gruppe i fil/serienummer søkeområdet.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_BGR * pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FNSn(&SnrAdm,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FNSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FPSn"NAME="LC_FPSn"></A><H2>LC_FPSn</H2>
+<BIG><I><B>Finn forige serienummer</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Finner forrige gruppe i fil/serienummer søkeområdet.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FPSn(&SnrAdm,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FPSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FLSn"NAME="LC_FLSn"></A><H2>LC_FLSn</H2>
+<BIG><I><B>Finn siste serienummer</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Finner siste gruppe i fil/serienummer søkeområdet.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm iu Peker til statusblokk for serienummersøk
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FLSn(&SnrAdm,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FLSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FFSnBt"NAME="LC_FFSnBt"></A><H2>LC_FFSnBt</H2>
+<BIG><I><B>Finn første serienummer med tilleggskrav</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner første gruppe som er merka i gitt kolonne i brukttabellen.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FFSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+=============================================================================
+
+SK_EntPnt_FYBA short LC_FFSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FNSnBt"NAME="LC_FNSnBt"></A><H2>LC_FNSnBt</H2>
+<BIG><I><B>Finn neste serienummer med tilleggskrav</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner neste gruppe også er merka i gitt kolonne i brukttabellen.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FNSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FNSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FPSnBt"NAME="LC_FPSnBt"></A><H2>LC_FPSnBt</H2>
+<BIG><I><B>Finn forige serienummer med tilleggskrav</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner forrige gruppe i fil/serienummer søkeområdet, som også er merka i
+gitt kolonne i brukttabellen.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FPSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FPSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FLSnBt"NAME="LC_FLSnBt"></A><H2>LC_FLSnBt</H2>
+<BIG><I><B>Finn siste serienummer med tilleggskrav</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finner siste gruppe i fil/serienummer søkeområdet som også er merka i
+gitt kolonne i brukttabellen.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_SNR_ADM *pSnrAdm i Peker til statusblokk for serienummersøk
+short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+LC_BGR *pBgr u Gruppenummer
+short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+Bruk:
+sstat = LC_FLSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+
+SK_EntPnt_FYBA short LC_FLSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O37"NAME="O37"></A><H1>19 Egenskapsutvalg</H1>
+FYBA har en egen "utvalgsmotor" som har et rikt sett av utvalgsmetoder.
+Disse metodene er spesiellt tilpasset SOSI-formatet.
+
+<PRE>
+Følgende metoder er definert:
+
+ ! Ikke (Tilslag når SOSI-navnet ikke finnes. Bare GINFO.)
+
+ AL Alle
+
+ <> Fra-til
+
+ >< Utenfor
+
+ < Mindre-enn
+
+ > Større-enn
+
+ / Delelig-med, eventuellt med sjekk på om restverdi er 2. verdi
+
+ !/ Ikke-delelig-med
+
+ () Inneholder
+
+ = Lik
+
+ IV Ikke valgt (Tilslag når gruppen ikke er tegnet ennå.
+ Kombineres med SOSI-navnet "..*")
+
+ != Ikke lik (Tilslag når denne navn og verdi kombinasjonen ikke
+ finnes. (Bare GINFO)
+
+ FL Flere (Tilslag når SOSI-navnet forekommer flere ganger.)
+
+ !FL Ikke flere enn (Tilslag når SOSI-navnet IKKE forekommer
+ flere ganger enn gitt antall.)
+
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_OpenQuery"NAME="LC_OpenQuery"></A><H2>LC_OpenQuery</H2>
+<BIG><I><B>Initier query</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Initierer query mot GINFO/PINFO.
+Tildeler administrasjonsblokk for utvalg.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_UT_ADM *UtAdm r Peker til administrasjonsblokk for utvalg.
+Bruk:
+pUtAdm = LC_OpenQuery();
+ ==========================================================================
+
+SK_EntPnt_FYBA LC_UT_ADM *LC_OpenQuery(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CloseQuery"NAME="LC_CloseQuery"></A><H2>LC_CloseQuery</H2>
+<BIG><I><B>Avslutter query</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Avslutter query mot GINFO/PINFO.
+Frigir minne brukt til administrasjon og utvalgstabeller.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_UT_ADM *UtAdm i Peker til administrasjonsblokk for utvalg.
+Bruk:
+LC_CloseQuery(pUtAdm);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_CloseQuery(LC_UT_ADM * pUtAdm)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutQueryLine"NAME="LC_PutQueryLine"></A><H2>LC_PutQueryLine</H2>
+<BIG><I><B>Legg inn en query-linje</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn og tolker en linje med query-tekst.
+Parametre:
+Type Navn I/U Forklaring
+------------------------------------------------------------------------
+LC_UT_ADM *UtAdm i Peker til administrasjonsblokk for utvalg.
+char *qulin i Linje med query-tekst. (Uten prikker på første nivå).
+short sType i Gruppe eller Punkt (U_GRUPPE eller U_PUNKT).
+short ist r Status (UT_TRUE=OK, UT_FALSE=linjen er ikke OK)
+Bruk:
+ist = LC_PutQueryLine(pUtAdm,qulin,sType);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_PutQueryLine(LC_UT_ADM *pUtAdm,const char *qulin,short sType)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutQueryRegel"NAME="LC_PutQueryRegel"></A><H2>LC_PutQueryRegel</H2>
+<BIG><I><B>Legg inn et regelnavn</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legger inn et regelnavn på siste linje i utvalgstabellen.
+(Navnet blir intern konvertert til "store" bokstaver.)
+Parametre:
+Type Navn I/U Forklaring
+------------------------------------------------------------------------
+LC_UTVALG *pU i Peker til utvalg
+char *navn i Regelnavn.
+Bruk:
+LC_PutQueryRegel(pU,navn);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_PutQueryRegel(LC_UTVALG * pU,const char *navn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_LesUtvalg"NAME="LC_LesUtvalg"></A><H2>LC_LesUtvalg</H2>
+<BIG><I><B>Les utvalg i kom.filen</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Leser og tolker gruppe og punktutvalg på kommandofilen og legger i tabell.
+Forutsetter at filen er åpnet på forhånd.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+FILE *pKomFil i Peker til "handle" for åpnet kommandofil.
+short sStatus r UT_TRUE=OK, UT_FALSE=feil i linjen
+Bruk:
+sStatus = LC_LesUtvalg(pUtAdm,pKomFil);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_LesUtvalg(LC_UT_ADM *pUtAdm,const char *pszKomFil)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetUtRegelNavn"NAME="LC_GetUtRegelNavn"></A><H2>LC_GetUtRegelNavn</H2>
+<BIG><I><B>Henter regelnavn</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter regelnavn for at programmet utenfor skal kunne sjekke
+at det er tilgjengelig videre behandling av alle definerte navn.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+short *ist iu Status (Inn: 1=start, 0=neste)
+ (Ut: 0=OK, -1=ferdig);
+char *regelpeker r Peker til utvalgsnavn.
+Bruk:
+regelpeker = LC_GetUtRegelNavn(pUtAdm,&ist);
+ =============================================================================
+
+SK_EntPnt_FYBA char *LC_GetUtRegelNavn(LC_UT_ADM *pUtAdm,short *ist)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GruppeUtvalg"NAME="LC_GruppeUtvalg"></A><H2>LC_GruppeUtvalg</H2>
+<BIG><I><B>GINFO-utvalg</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker GINFO-delen av aktuell gruppe mot alle gruppeutvalg fra fil.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+short sPrior i Prioritet.
+ LC_OVERSE_PRIORITET = Tar ikke hensyn til prioritet.
+short *sstat iu Søkestatus, Inn: 1=start søk, 0=fortsett søk
+ Ut : 0=tilslag, -1=ikke tilslag
+char **regelnavn u Peker til regelnavn
+char *regelnavn u Peker til utvalgsnavn
+Bruk:
+pszUtvalgsNavn = LC_GruppeUtvalg(pUtAdm.sPrior,&sstat,&regel);
+ =============================================================================
+
+SK_EntPnt_FYBA char *LC_GruppeUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *sstat,char **regelnavn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PunktUtvalg"NAME="LC_PunktUtvalg"></A><H2>LC_PunktUtvalg</H2>
+<BIG><I><B>PUNKT-utvalg</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Sjekker PINFO-delen av aktuell gruppe for tilslag på PUNKT-UTVALG.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+short sPrior i Prioritet.
+short *psStat iu Søkestatus, Inn: 1=start søk, 0=fortsett søk
+ Ut : 0=tilslag, -1=ikke tilslag
+long lPnr i Punktnummer som skal sjekkes.
+char **ppszRegel u Peker til regelnavn
+Bruk:
+LC_PunktUtvalg(pUtAdm,sPrior,&psStat,lPnr,&ppszRegel);
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_PunktUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *psStat,long lPnr,char **ppszRegel)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FinnPinfoUtvalg"NAME="LC_FinnPinfoUtvalg"></A><H2>LC_FinnPinfoUtvalg</H2>
+==========================================================================
+Formål:
+Finner et PINFO-UTVALG i kjeden av slike utvalg.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+char *pszNavn i Utvalgsnavn
+LC_UTVALG * pUtvalg r Peker til utvalget. (NULL = ikke funnet)
+Bruk:
+pUtvalg = LC_FinnPinfoUtvalg(pszNavn);
+ ==========================================================================
+
+SK_EntPnt_FYBA LC_UTVALG * LC_FinnPinfoUtvalg(LC_UT_ADM * pUtAdm,const char *pszNavn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PiTestUtvalg"NAME="LC_PiTestUtvalg"></A><H2>LC_PiTestUtvalg</H2>
+<BIG><I><B>Sjekk PUNKT/PINFO utvalg</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekk om PINFO i aktuellt punkt tilfredstiller et punkt-utvalg.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_UT_ADM * pUtAdm i Administrasjonsblokk
+LC_UTVALG * pU i Peker til utvalg
+long lPnr i Punktnummer som skal sjekkes.
+short sTilslag r Status: UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+Bruk:
+sTilslag = LC_PiTestUtvalg(pUtAdm,pU,lPnr);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_PiTestUtvalg(LC_UT_ADM * pUtAdm,LC_UTVALG * pU,long lPnr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GiQuery"NAME="LC_GiQuery"></A><H2>LC_GiQuery</H2>
+<BIG><I><B>Query mot aktuell ginfo</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Sjekker GINFO-delen av aktuell gruppe mot aktuellt query-oppsett.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+short status r Søkestatus, UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+Bruk:
+ist = LC_GiQuery(pUtAdm);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_GiQuery(LC_UT_ADM *pUtAdm)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FAGiQuery"NAME="LC_FAGiQuery"></A><H2>LC_FAGiQuery</H2>
+<BIG><I><B>Finn alle ved query mot ginfo</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Sjekker GINFO-delen av alle grupper mot aktuell queryopsett.
+Tilslag merkes i brukttabellen kolonne BT_GISOK (14).
+[Esc] avbryter utvalget, antall tilslag settes da til -1.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+short antall r Antall tilslag på utvalget.
+Bruk:
+antall = LC_FAGiQuery(pUtAdm, LC_FRAMGR | LC_BAKGR);
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_FAGiQuery(LC_UT_ADM *pUtAdm,unsigned short usLag)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FAGiKombinertFlateQuery"NAME="LC_FAGiKombinertFlateQuery"></A><H2>LC_FAGiKombinertFlateQuery</H2>
+<BIG><I><B>Finn alle ved query mot ginfo i flate og omkrets</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Sjekker GINFO-delen av alle flater mot aktuell queryopsett. Finner de flatene
+som har tilslag på utvalgsblokken pUtAdmFlate og har har referanser til grupper
+som har tilslag på utvalgsblokken pUtAdmOmkrets.
+Tilslag merkes i brukttabellen kolonne BT_GISOK (30).
+[Esc] avbryter utvalget, antall tilslag settes da til -1.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_UT_ADM *pUtAdmFlate i Peker til administrasjonsblokk for utvalg for flata.
+LC_UT_ADM *pUtAdmOmkrets i Peker til administrasjonsblokk for utvalg for omkrets.
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+short sAlle i Flagg for hvorvidt utvalg for omkrets må slå til på
+ alle gruppene i omkretsen. TRUE/FALSE
+short antall r Antall tilslag på utvalget.
+Bruk:
+antall = LC_FAGiQuery(pUtAdm, LC_FRAMGR | LC_BAKGR);
+ =============================================================================
+
+SK_EntPnt_FYBA long LC_FAGiKombinertFlateQuery(LC_UT_ADM * pUtAdmFlate,LC_UT_ADM * pUtAdmOmkrets,
+ unsigned short usLag,short sMetode)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_QueryGP"NAME="LC_QueryGP"></A><H2>LC_QueryGP</H2>
+<BIG><I><B>Søk i ginfo og finn verdi</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Bruker query-tekst for å finne linje der parameter skal hentes.
+Parametre:
+Type Navn I/U Forklaring
+---------------------------------------------------------------------------
+char *qulin i Linje med query-tekst.
+unsigned short iniv i Nivå: Det er definert konstanter som henges
+ sammen med "|".
+ LC_GINFO = søk i GINFO på aktuell gruppe
+ LC_HODE = søk i filhodet
+ Hvis begge er brukt søkes det først i GINFO.
+unsigned short *univ u Nivå: LC_GINFO = parameter er fra GINFO
+ LC_HODE = parameter er fra filhodet
+short *ulin u GINFO-linjenummer for tilslaget.
+char **para u Funnet parameter.
+short funnet r Status: UT_TRUE=funnet, UT_FALSE=ikke funnet
+Bruk:
+funnet = LC_QueryGP(qulin,LC_GINFO | LC_HODE,&univ,&ulin,&para);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_QueryGP(char *qulin,unsigned short iniv,unsigned short *univ,short *ulin,char **para)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqMaxPrioritet"NAME="LC_InqMaxPrioritet"></A><H2>LC_InqMaxPrioritet</H2>
+<BIG><I><B>Hent største prioritet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter største prioritet for gitt utvalgstype.
+Parametre:
+Type Navn I/U Forklaring
+----------------------------------------------------------------------
+LC_UT_ADM * pUA i Peker til administrasjonsblokk for utvalg.
+short sMaxPrioritet r Max prioritet
+Bruk:
+sMaxPrioritet = LC_InqMaxPrioritet(pUA);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_InqMaxPrioritet(LC_UT_ADM * pUA)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_TestPrioritetBrukt"NAME="LC_TestPrioritetBrukt"></A><H2>LC_TestPrioritetBrukt</H2>
+<BIG><I><B>Tester om en prioritet er brukt</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Tester om en prioritet er brukt.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+short sPrioritet i Prioritet som skal testes.
+short sBrukt r Status: UT_TRUE=brukt, UT_FALSE=ikke brukt.
+Bruk:
+sBrukt = LC_TestPrioritetBrukt(pUtAdm,sPrioritet);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_TestPrioritetBrukt(LC_UT_ADM * pUtAdm,short sPrioritet)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_UtvalgPrioritet"NAME="LC_UtvalgPrioritet"></A><H2>LC_UtvalgPrioritet</H2>
+<BIG><I><B>Finn brukt prioritet</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker GINFO og PINFO for å finne hvilke prioriteter som "berører" aktuell
+gruppe. Resultatet markeres i Gruppetabellen ulPrior.
+Parametre:
+Type Navn I/U Forklaring
+---------------------------------------------------------------------------
+LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+Bruk:
+LC_UtvalgPrioritet(pUtAdm);
+ ===========================================================================
+
+SK_EntPnt_FYBA void LC_UtvalgPrioritet(LC_UT_ADM *pUtAdm)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O38"NAME="O38"></A><H1>20 Merke grupper</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetBt"NAME="LC_SetBt"></A><H2>LC_SetBt</H2>
+<BIG><I><B>Sett merke i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Legg inn merke i brukttabellen.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+short kolonne i Kolonne som skal merkes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+Bruk:
+LC_SetBt(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetBt(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ClrBt"NAME="LC_ClrBt"></A><H2>LC_ClrBt</H2>
+<BIG><I><B>Slett merke i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Fjern merke i brukttabellen.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal merkes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+Bruk:
+LC_ClrBt(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_ClrBt(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetBt"NAME="LC_GetBt"></A><H2>LC_GetBt</H2>
+<BIG><I><B>Hent merke i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Hent merke i brukttabellen.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal brukes.
+ (Lovlig BT_MIN_BT - BT_MAX_BT)
+merke short r UT_FALSE = ikke marka, UT_TRUE = merka
+Bruk:
+merke = LC_GetBt(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_GetBt(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_EraseBt"NAME="LC_EraseBt"></A><H2>LC_EraseBt</H2>
+<BIG><I><B>Slett område i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Blanker en eller flere kolonner i brukttabellen i aktuell base.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+fra_kol short i Første kolonne som skal blankes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+til_kol short i Siste kolonne som skall blankes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+Bruk:
+LC_EraseBt(fra_kol,til_kol);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_EraseBt(short fra_kol,short til_kol)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CopyBt"NAME="LC_CopyBt"></A><H2>LC_CopyBt</H2>
+<BIG><I><B>Kopier kolonne i brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Kopier kolonne i brukttabellen.
+Samtidig er det mulig å utføre logiske operasjoner mellom de to kolonnene.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short fra_kol i Kolonne det skal kopieres fra. (Lovlig 0 - BT_MAX_BT)
+short til_kol i Kolonne det skal kopieres til. (Lovlig 1 - BT_MAX_USER)
+short operasjon i Logisk operasjon mellom kolonnene.
+ BC_COPY = Overskriv gammelt innhold.
+ BC_AND = Logisk AND mellom de to kolonnene.
+ BC_OR = Logisk OR mellom de to kolonnene.
+ BC_INVERT = Overskriv gammelt innhold med
+ invertert verdi.
+ BC_EXCHANGE = Bytter innholdet i de to kolonnene.
+
+Bruk:
+LC_CopyBt(fra_kol,til_kol,operasjon);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_CopyBt(short fra_kol,short til_kol,short operasjon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetModusMerk"NAME="LC_SetModusMerk"></A><H2>LC_SetModusMerk</H2>
+<BIG><I><B>Setter flag for merking av referert gruppe.</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Setter flag for merking av referert gruppe.
+Har innvirkning for virkemåten til:
+LC_FAGeo, LC_FASn, og LC_FAGiQuery
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+unsigned short modus i 0 = Ikke merk referert gruppe.
+ 1 = Merk referert gruppe.
+Bruk:
+LC_SetModusMerk(1);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetModusMerk(unsigned short usModus)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_MerkGr"NAME="LC_MerkGr"></A><H2>LC_MerkGr</H2>
+<BIG><I><B>Merk en gruppe brukttabellen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+CH Merk aktuell gruppe i brukttabellen. Hvis flag for merking av referert
+gruppe er satt, blir også eventuelle refererte grupper merket.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short sKolonne i Kolonne som skal merkes.
+ (Lovlig BT_MIN_USER - BT_MAX_USER)
+short sBryter i Bryter 1=på, 0=av
+long lAntall r Antall grupper merket.
+Bruk:
+lAntall = LC_MerkGr(sKolonne,sBryter);
+ ==========================================================================
+
+SK_EntPnt_FYBA long LC_MerkGr(short sKolonne,short sBryter)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O39"NAME="O39"></A><H1>21 Spesiell handtering av flater</H1>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="Polygonbeskrivelse"NAME="Polygonbeskrivelse"></A><H2>Polygonbeskrivelse</H2>
+<BIG><I><B>Strukturer for polygonbeskrivelse.</I></B></BIG><PRE>
+
+Dette er et sett med strukturer som er kjedet sammen til en komplett
+beskrielse av en flate. Eksempel på bruk er gitt under <A HREF="file:///LC_POL_GetRef">LC_POL_GetRef</A>.
+
+
+ !-----------------!
+ ! LC_POLYGON !
+ ! ! !-------------------------!
+ ! !- Omkrets --! ! ! !-----------------! !---------------!
+ ! !LC_POL_OMKR ! ! ! !-!LC_POL_ELEMENT ! !-!LC_POL_ELEMENT !
+ ! ! ! ! ! ! ! - Bgr ! ! ! - Bgr !
+ ! !- Siste !--!-------! ! ! - Snr ! ! ! - Snr !
+ ! !- Første !--!---------! ! - Retning ! ! ! - Retning !
+ ! !------------! ! ! - Forrige (NULL)! ! ! - Forrige !
+ ! !- Hull ------! ! ! - Neste !-! ! - Neste (NULL)!
+ ! !LC_OY_ADM ! ! !-----------------! !---------------!
+ ! ! ! !
+ ! !- Første øy !-!-!
+!-!-!- Siste øy ! ! !
+! ! !-------------! ! !
+! !-----------------! !
+! !-----------------!
+! ! !------------------------!
+! ! !------------! ! !-----------------! !---------------!
+! !--------------! !-!LC_POL_OMKR ! ! !-!LC_POL_ELEMENT !!!LC_POL_ELEMENT !
+! !LC_OY_ELEMENT ! ! ! ! ! ! ! - Bgr !!! - Bgr !
+! !- Omkrets !--! !- Siste !-! ! ! - Snr !!! - Snr !
+! !- Neste !-! !- Første !---! ! - Retning !!! - Retning !
+! !--------------! ! !------------! ! - Forrige (NULL)!!! - Forrige !
+! ! ! - Neste !!! - Neste (NULL)!
+! ! !-----------------! !---------------!
+! !
+! !---------------! !--------------------------!
+! ! !------------! ! !-----------------! !---------------!
+! !--------------! !-!LC_POL_OMKR ! ! !-!LC_POL_ELEMENT ! !-!LC_POL_ELEMENT !
+!--!LC_OY_ELEMENT ! ! ! ! ! ! ! - Bgr ! ! ! - Bgr !
+ !- Omkrets !--! !- Siste !-! ! ! - Snr ! ! ! - Snr !
+ !- Neste (NULL)! !- Første !---! ! - Retning ! ! ! - Retning !
+ !--------------! !------------! ! - Forrige (NULL)! ! ! - Forrige !
+ ! - Neste !-! ! - Neste (NULL)!
+ !-----------------! !---------------!
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_InitPolygon"NAME="LC_POL_InitPolygon"></A><H2>LC_POL_InitPolygon</H2>
+<BIG><I><B>Initierer polygon-struktur</I></B></BIG><PRE>
+=======================================================================
+Formål:
+Initierer polygon-struktur.
+Parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Peikar til polygonbeskrivelse
+Bruk:
+LC_POLYGON Polygon;
+LC_POL_InitPolygon(&Polygon);
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_InitPolygon(LC_POLYGON *pPolygon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FrigiPolygon"NAME="LC_POL_FrigiPolygon"></A><H2>LC_POL_FrigiPolygon</H2>
+<BIG><I><B>Frigi minne som er allokert til polygon</I></B></BIG><PRE>
+=======================================================================
+Formål:
+Frigir minne som er allokert til polygon. (Både omkrets og hull.)
+Parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Peikar til polygonbeskrivelse
+Bruk:
+LC_POLYGON Polygon;
+LC_POL_FrigiPolygon(&Polygon);
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FrigiPolygon(LC_POLYGON *pPolygon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_InitOmkrets"NAME="LC_POL_InitOmkrets"></A><H2>LC_POL_InitOmkrets</H2>
+<BIG><I><B>Initierer polygon-omkrets</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+POL_OMKR YtrePolygon;
+LC_POL_InitOmkrets(YtrePolygon);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POL_OMKR *pPO I/U Peikar til polygonadministrasjonsblokka
+Initierer administrasjonsblokka for polygonelement
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_InitOmkrets(LC_POL_OMKR *pPO)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_LeggTilGruppeOmkrets"NAME="LC_POL_LeggTilGruppeOmkrets"></A><H2>LC_POL_LeggTilGruppeOmkrets</H2>
+<BIG><I><B>Legg til eit element</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_POL_OMKR YtrePolygon;
+pElement = LC_POL_LeggTilGruppeOmkrets(YtrePolygon,pBgr,sRetning,lSnr);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POL_OMKR * pPO I/U Peikar til polygonadministrasjonsblokka
+LC_BGR * pBgr I Gruppenummer
+short sRetning I Nøsteretning (LC_MED_DIG eller LC_MOT_DIG)
+long lSnr I Serienummer
+LC_POL_ELEMENT * pElement R Peker til innlagt element
+Legg til eit element i kjeden av polygonelement.
+=======================================================================
+
+SK_EntPnt_FYBA LC_POL_ELEMENT * LC_POL_LeggTilGruppeOmkrets(LC_POL_OMKR *pPO,LC_BGR *pBgr,
+ short sRetning, long lSnr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FjernGruppeOmkrets"NAME="LC_POL_FjernGruppeOmkrets"></A><H2>LC_POL_FjernGruppeOmkrets</H2>
+<BIG><I><B>Fjernar element</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_POL_OMKR YtrePolygon;
+LC_POL_FjernGruppeOmkrets(&YtrePolygon,);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POL_OMKR *pPO I/U Peikar til polygonadministrasjonsblokka
+LC_POL_ELEMENT *pPE I Peker til element som skal fjernes
+Fjernar et element i kjeden av polygonelement.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FjernGruppeOmkrets(LC_POL_OMKR *pPO, LC_POL_ELEMENT *pPE)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FjernSisteGruppeOmkrets"NAME="LC_POL_FjernSisteGruppeOmkrets"></A><H2>LC_POL_FjernSisteGruppeOmkrets</H2>
+<BIG><I><B>Fjernar siste element</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_POL_OMKR YtrePolygon;
+LC_POL_FjernSisteGruppeOmkrets(&YtrePolygon);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POL_OMKR * pPO I/U Peikar til polygonadministrasjonsblokka
+Fjernar siste element i kjeden av polygonelement.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FjernSisteGruppeOmkrets(LC_POL_OMKR *pPO)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FrigiOmkrets"NAME="LC_POL_FrigiOmkrets"></A><H2>LC_POL_FrigiOmkrets</H2>
+<BIG><I><B>Frigjer minne som er allokert til kjede av polygonelement</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POL_OMKR *pPO I/U Peikar til polygonadministrasjonsblokka
+Frigir minne som er allokert til kjede av polygonelement.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FrigiOmkrets(LC_POL_OMKR *pPO)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_InitOy"NAME="LC_POL_InitOy"></A><H2>LC_POL_InitOy</H2>
+<BIG><I><B>Initierer øy-kjeden</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_OY_ADM OyKjede;
+LC_POL_InitOy(OyKjede);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_OY_ADM *pOA I/U Peikar til øyadministrasjonsblokka
+Initierer øy-kjeden.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_InitOy(LC_OY_ADM *pOA)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FrigiAlleOyer"NAME="LC_POL_FrigiAlleOyer"></A><H2>LC_POL_FrigiAlleOyer</H2>
+<BIG><I><B>Frigjer minne som er allokert til kjede av øyelement</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_OY_ADM OyKjede;
+LC_POL_FrigiAlleOyer(OyKjede);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_OY_ADM *pOA I/U Peikar til øyadministrasjonsblokka
+Frigjer minne som er allokert til kjede av øy (i polygon) - element.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FrigiAlleOyer(LC_OY_ADM *pOA)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_FjernOy"NAME="LC_POL_FjernOy"></A><H2>LC_POL_FjernOy</H2>
+<BIG><I><B>Fjernar ei oy frå kjede av øyelement</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_OY_ADM OyKjede;
+LC_POL_FjernOy(OyKjede,OyElement);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_OY_ADM *pOA I/U Peikar til øyadministrasjonsblokka
+LC_OY_ELEMENT *pOE I/U Peikar til kjede av oyar
+Frigjer minne som er allokert til kjede av øy (i polygon) - element.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_FjernOy(LC_OY_ADM *pOA,LC_OY_ELEMENT *pOE)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_LeggTilOy"NAME="LC_POL_LeggTilOy"></A><H2>LC_POL_LeggTilOy</H2>
+<BIG><I><B>Legg til eit element</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_OY_ADM OyKjede;
+LC_POL_LeggTilOy(&OyKjede,pPO);
+Parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_OY_ADM *pOyKjede I/U Peikar til kjede av øyelement
+LC_POL_OMKR *pPO I Peikar til polygonadministrasjonsblokka
+Legg til eit element i kjeden av øyar (i polygon) - element.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_LeggTilOy(LC_OY_ADM *pOA,LC_POL_OMKR *pPO)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_TestBrukt"NAME="LC_POL_TestBrukt"></A><H2>LC_POL_TestBrukt</H2>
+<BIG><I><B>Testar om ei gruppe er brukt i polygonet</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_POL_TestBrukt(pPolygon,&Bgr);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Peker til polygonbeskrivelse.
+LC_BGR *pBgr I Peikar til gruppe
+short status R Status UT_TRUE = gruppe er brukt i polygonet
+ Status UT_FALSE = gruppe er IKKJE brukt i polygonet
+Testar om ei gruppe er brukt i gitt polygon.
+=======================================================================
+
+SK_EntPnt_FYBA short LC_POL_TestBrukt(LC_POLYGON *pPolygon,LC_BGR *pBgr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_PutRef"NAME="LC_POL_PutRef"></A><H2>LC_POL_PutRef</H2>
+<BIG><I><B>Legger inn referanser i GINFO</I></B></BIG><PRE>
+=======================================================================
+Formål:
+Legger inn referanser i GINFO, ut fra beskrivelse i struktur.
+Parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Polygonbeskrivelse
+short ngi r Antall linjer GINFO
+Bruk:
+ngi = LC_POL_PutRef(pPolygon);
+=======================================================================
+
+SK_EntPnt_FYBA short LC_POL_PutRef(LC_POLYGON *pPolygon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_GetRef"NAME="LC_POL_GetRef"></A><H2>LC_POL_GetRef</H2>
+<BIG><I><B>Hent referanser for flate fra GINFO</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter referanser fra GINFO til struktur.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POLYGON *pPolygon I Peker til adm. for polygonbeskrivelse
+Bruk:
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_POLYGON Polygon;
+ LC_POL_ELEMENT * pPE;
+ LC_OY_ELEMENT * pOE;
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+ . Omkretsen .
+ for(pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ gnavn = LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ .
+ Behandle ytre avgrensing
+ .
+ }
+ . Øyer .
+ for (pOE = Polygon.OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ gnavn = LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ .
+ Behandle indre avgrensing (øy)
+ .
+ }
+ }
+ . Frigi allokerte kjeder .
+ LC_POL_FrigiPolygon(&Polygon);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_POL_GetRef(LC_POLYGON *pPolygon)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_GetRefOmkrets"NAME="LC_POL_GetRefOmkrets"></A><H2>LC_POL_GetRefOmkrets</H2>
+<BIG><I><B>Hent referanser for omkretsen av flate</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter referanser fra GINFO til struktur.
+Rutinen initierer strukturen pPO, men frigir ikke eventuellt gammelt innhold.
+Parametre:
+Type Navn I/U Forklaring
+-------------------------------------------------------------------------
+LC_POL_OMKR *pPO; IU Peker til kjede som beskriver omkretsen.
+Bruk:
+ LC_POL_GetRefOmkrets(&OyPO);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_POL_GetRefOmkrets(LC_POL_OMKR *pPO)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_PTst"NAME="LC_POL_PTst"></A><H2>LC_POL_PTst</H2>
+<BIG><I><B>Polygontest</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker om gitt punkt ligger innenfor polygon angitt av pPolygon.
+Forutsetter at pPolygon danner et lukket polygon.
+Skifter ikke aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double a i Punkt som skal sjekkes
+double n i
+short ist r status: UT_FALSE = punktet er utenfor flaten
+ UT_TRUE = punktet ligger inne på flaten
+Bruk:
+.
+==========================================================================
+
+SK_EntPnt_FYBA short LC_POL_PTst(LC_POLYGON *pPolygon,double a,double n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_PTstOmkrets"NAME="LC_POL_PTstOmkrets"></A><H2>LC_POL_PTstOmkrets</H2>
+<BIG><I><B>Sjekk om punkt ligger inni polygonomkrets</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekker om gitt punkt ligger innenfor yttergrensen for polygon angitt
+av struktur.
+Forutsetter at tabellen danner et lukket polygon
+Skifter ikke aktuell gruppe.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_POL_OMKR *pPO I/U Peker til beskrivelse av omkretsen
+double a i Punkt som skal sjekkes
+double n i
+short ist r status: UT_FALSE = punktet er utenfor flaten
+ UT_TRUE = punktet ligger inne på flaten
+Bruk:
+ist = LC_POL_PTstOmkrets(pPO,a,n);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_POL_PTstOmkrets(LC_POL_OMKR *pPO,double a,double n)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_POL_Box"NAME="LC_POL_Box"></A><H2>LC_POL_Box</H2>
+<BIG><I><B>Henter omskreven boks</I></B></BIG><PRE>
+=======================================================================
+Bruk:
+LC_POL_Box(pPA,&nva,&nvn,&oha,&ohn);
+parametere:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------
+LC_POL_OMKR *pPO I Peikar til polygonadministrasjonsblokka
+double *nva U
+double *nvn U
+double *oha U
+double *ohn U
+Henter omskriven boks for polygon.
+=======================================================================
+
+SK_EntPnt_FYBA void LC_POL_Box(LC_POL_OMKR *pPO,double *nva,double *nvn, double *oha,double*ohn)
+</PRE>
+
+<BR>
+<BR>
+<HR COLOR=#80ff80 SIZE=5 NOSHADE>
+<BR>
+<BR>
+<BR>
+<A ID="O40"NAME="O40"></A><H1>22 Diverse funksjoner</H1>
+
+<BR>
+<BR>
+<BR>
+<A ID="O41"NAME="O41"></A><H2>22.1 Beregninger</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerAreal"NAME="LC_BerAreal"></A><H2>LC_BerAreal</H2>
+<BIG><I><B>Beregn areal av aktuell FLATE</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Beregner arealet av aktuell gruppe hvis denne er flate.
+Referansene brukes for arealberegningen.
+Tar hensyn til fradrag for øyer.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double areal u Beregnet areal
+Bruk:
+areal = LC_BerAreal();
+ =============================================================================
+
+SK_EntPnt_FYBA double LC_BerAreal(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerLengde"NAME="LC_BerLengde"></A><H2>LC_BerLengde</H2>
+<BIG><I><B>Beregn horisontal lengde av aktuell gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Beregn horisontal lengde av aktuell gruppe.
+Tar ikke hensyn til høyde/dybde.
+Referansene brukes IKKE i beregningen.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double lengde u Beregnet lengde
+Bruk:
+areal = LC_BerLengde();
+=============================================================================
+
+SK_EntPnt_FYBA double LC_BerLengde(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerLengde3D"NAME="LC_BerLengde3D"></A><H2>LC_BerLengde3D</H2>
+<BIG><I><B>Beregn skrå lengde av aktuell gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Beregn skrå lengde av aktuell gruppe.
+Krever at det finnes høyde/dybde i alle punkt.
+Referansene brukes IKKE i beregningen.
+Beregner bare for LINJE og KURVE.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double lengde u Beregnet lengde
+bool beregnet r Status som viser om lengde er beregnet
+Bruk:
+beregnet = LC_BerLengde3D(&skraa_lengde);
+=============================================================================
+
+SK_EntPnt_FYBA bool LC_BerLengde3D(double *skraa_lengde)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerAvgrensLengde"NAME="LC_BerAvgrensLengde"></A><H2>LC_BerAvgrensLengde</H2>
+<BIG><I><B>Beregn lengden av avgrensning av FLATE</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Beregn lengden av avgrensningen av aktuell gruppe hvis denne er flate.
+Både indre og ytre avgrensning beregnes.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double lengde u Beregnet areal
+Bruk:
+lengde = LC_BerAvgrensLengde();
+=============================================================================
+
+SK_EntPnt_FYBA double LC_BerAvgrensLengde(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerYtreAvgrensLengde"NAME="LC_BerYtreAvgrensLengde"></A><H2>LC_BerYtreAvgrensLengde</H2>
+<BIG><I><B>Beregn lengden av ytre avgrensning av FLATE</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Beregn lengden av ytre avgrensningen av aktuell gruppe hvis denne er flate.
+Bare ytre avgrensning beregnes.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double lengde u Beregnet lengde
+Bruk:
+lengde = LC_BerYtreAvgrensLengde();
+=============================================================================
+
+SK_EntPnt_FYBA double LC_BerYtreAvgrensLengde(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_BerIndreAvgrensLengde"NAME="LC_BerIndreAvgrensLengde"></A><H2>LC_BerIndreAvgrensLengde</H2>
+<BIG><I><B>Beregn lengden av indre avgrensning av FLATE</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Beregn lengden av indre avgrensningen av aktuell gruppe hvis denne er flate.
+Bare indre avgrensning beregnes.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+double lengde u Beregnet lengde
+Bruk:
+lengde = LC_BerIndreAvgrensLengde();
+=============================================================================
+
+SK_EntPnt_FYBA double LC_BerIndreAvgrensLengde(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_RoundKoord"NAME="LC_RoundKoord"></A><H2>LC_RoundKoord</H2>
+<BIG><I><B>Endre koordinatene i buffer til riktig enhet</I></B></BIG><PRE>
+===========================================================================
+Formål:
+Endrer koordinatene i aktuell gruppe i buffer til valgt enhet.
+(Rutinen blir utført fra LC_WxGr.)
+Parametre: ingen
+Bruk:
+LC_RoundKoord();
+==============================================================================
+
+SK_EntPnt_FYBA void LC_RoundKoord(void)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O42"NAME="O42"></A><H2>22.2 Strukturendring</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SnuGr"NAME="LC_SnuGr"></A><H2>LC_SnuGr</H2>
+<BIG><I><B>Snu gruppe</I></B></BIG><PRE>
+===========================================================================
+Formål:
+Snur en gruppe.
+Rutinen tilsvarer put fra brukerprogram inn i ringbufret.
+Både koordinater, høyde, KP og PINFO blir behandlet.
+For .BUE blir fortegnet på radius endret.
+Fortegnet på referanser til gruppen blir oppdatert.
+Det er ikke mulig å snu gruppe som er referert fra grupper som
+ikke kan oppdateres. (Flate/trase som er sjekket ut av andre i NGIS.)
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short sStatus r Status: UT_TRUE = OK
+ UT_FALSE = feil, ikke splittet
+Bruk:
+ status = LC_SnuGr();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_SnuGr(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SammenfoyGr"NAME="LC_SammenfoyGr"></A><H2>LC_SammenfoyGr</H2>
+<BIG><I><B>Sammenføy grupper</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sammenføye to grupper.
+Kopierer koordinater fra gitt gruppe inn i aktuell gruppe.
+De kopierte koordinatene kommer som en utvidelse av gruppen.
+Rutinen tildeler selv nødvendig plass i buffer.
+Kvalitet og enhet blir automatisk oppdatert slik at gruppene ikke
+mister informasjon.
+Gruppen det kopieres fra blir slettet.
+Eventuelle referanser til gruppene blir oppdatert.
+Det er ikke mulig å sammenføye hvis en av gruppene er referert fra grupper
+som ikke kan oppdateres. (Flate/trase som er sjekket ut av andre i NGIS.)
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+LC_BGR * pFraBgr i Gruppenummer det skal kopieres fra.
+short retning i Buffer-retning:
+ HENT_FORRFRA ( 1) = vanlig,
+ HENT_BAKFRA (-1) = buffer skal snus.
+short plassering i Forteller hvor pFraBgr skal plasseres i
+ aktuell gruppe.
+ LC_SG_FORRAN = Heng den andre gruppen inn
+ foran første koordinat.
+ LC_SG_BAK = Heng den andre gruppen inn
+ etter siste koordinat.
+short metode i Forteller hva som skal skje med sammenføingspunktene.
+ LC_SG_BEHOLD = Begge punktene beholdes.
+ LC_SG_FJERN = Bare det ene av punktene beholdes.
+short ngi u Antall GINFO-linjer
+long nko u Antall koordinater
+unsigned short info u Diverse informasjon. (Se under <A HREF="file:///LC_RxGr">LC_RxGr</A>)
+short sStatus r Status: UT_TRUE=OK, UT_FALSE=ikke utført.
+Bruk:
+sStatus = LC_SammenfoyGr(bgr,retning,plassering,metode,&ngi,&nko,&info);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_SammenfoyGr(LC_BGR * pFraBgr,short retning,short plassering,short metode,
+ short *ngi,long *nko,unsigned short *info)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SplittGr"NAME="LC_SplittGr"></A><H2>LC_SplittGr</H2>
+<BIG><I><B>Splitt gruppe</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Splitter aktuell gruppe i to deler.
+Første del av gruppen beholdes som aktuell gruppe. Denne blir ikke
+skrevet til SOSI-filen, men buffer er oppdatert.
+Siste del av gruppen legges som en ny gruppe på samme fil som
+opprinnelig gruppe. Denne blir skrevet til basen.
+Den delen av gruppen som ligger mellom P1 og P2 blir fjernet.
+Hvis gruppen er BUEP og en av delene får bare to koordinater
+blir det lagt inn et nytt punkt midt på buen.
+Det er ikke mulig å splitte grupper som er referert fra grupper som
+ikke kan oppdateres. (Flate/trase som er sjekket ut av andre i NGIS.)
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+long sP1 i Punktnummer 1. (Må være større enn 1)
+long sP2 i Punktnummer 2. (Må være mindre enn nko)
+LC_BGR * pBgr2 u Nytt gruppenummer for siste del av gruppen.
+short sStatus r Status: UT_TRUE = OK
+ UT_FALSE = feil, ikke splittet
+Bruk:
+sStatus = LC_SplittGr(sP1,sP2,&Bgr2);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_SplittGr (long sP1,long sP2,LC_BGR * pBgr2)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErstattReferanse"NAME="LC_ErstattReferanse"></A><H2>LC_ErstattReferanse</H2>
+<BIG><I><B>Erstatt referanse </I></B></BIG><PRE>
+==========================================================================
+Formål:
+Erstatt referanse i alle grupper i gitt fil.
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Fil som skal behandles
+long lGmlSnr i Gruppe som skal byttes ut
+long lNyttSnr i Ny gruppe
+ Verdien 0 fører til gammelt serienummer
+ fjernes uten at det legges inn noe nytt.
+bool bSammeRetning i Gruppene er digitalisert i samme retning
+Bruk:
+sStatus = LC_ErstattReferanse(pFil, lGmlSnr, lNyttSnr, bSammeRetning);
+==========================================================================
+
+SK_EntPnt_FYBA void LC_ErstattReferanse (LC_FILADM *pFil,long lGmlSnr,long lNyttSnr, bool bSammeRetning)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O43"NAME="O43"></A><H2>22.3 Hele basen</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqAntFiler"NAME="LC_InqAntFiler"></A><H2>LC_InqAntFiler</H2>
+<BIG><I><B>Finn antall filer i basen</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Finn antall filer i aktuell base.
+Parametre:
+Type Navn I/U Forklaring
+-------------------------------------------------------------------
+unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+ LC_FRAMGR og /eller LC_BAKGR
+ (Bruk "|" for å kombinere.)
+short sAntall r Antall filer i aktuell base.
+Bruk:
+ Finner antall framgrunnsfiler i basen
+ sAntall = LC_InqAntFiler(LC_FRAMGR);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_InqAntFiler(unsigned short usLag)
+</PRE>
+
+
+<BR>
+<BR>
+<BR>
+<A ID="O44"NAME="O44"></A><H2>22.4 Prioritet</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ClrPrioritet"NAME="LC_ClrPrioritet"></A><H2>LC_ClrPrioritet</H2>
+<BIG><I><B>Slett prioritets-bit</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Slett prioritets-bit.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal merkes.
+ (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+Bruk:
+LC_ClrPrioritet(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_ClrPrioritet(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetPrioritet"NAME="LC_SetPrioritet"></A><H2>LC_SetPrioritet</H2>
+<BIG><I><B>Sett prioritets-bit</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sett prioritets-bit.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal merkes.
+ (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+Bruk:
+LC_SetPrioritet(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_SetPrioritet(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InqPrioritet"NAME="LC_InqPrioritet"></A><H2>LC_InqPrioritet</H2>
+<BIG><I><B>Hent prioritets-bit</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Hent prioritets-bit.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+kolonne short i Kolonne som skal hentes.
+ (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+short sAvPaa r Av eller På (UT_TRUE = På, UT_FALSE = Av)
+Bruk:
+sAvPaa = LC_InqPrioritet(pGr,kolonne);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_InqPrioritet(LC_BGR * pGr,short kolonne)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ErasePrioritet"NAME="LC_ErasePrioritet"></A><H2>LC_ErasePrioritet</H2>
+<BIG><I><B>Blank ut prioritets-bit</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Blank ut prioritets-bit.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+LC_BGR * pGr i Gruppenummer
+Bruk:
+LC_ErasePrioritet(pGr);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_ErasePrioritet(LC_BGR * pGr)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_EraseAllPrioritet"NAME="LC_EraseAllPrioritet"></A><H2>LC_EraseAllPrioritet</H2>
+<BIG><I><B>Blank ut ALLE prioritets-bit</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Blank ut alle prioritets-bit på alle gruppene i denne filen.
+Parametre:
+Navn Type I/U Forklaring
+--------------------------------------------------------------------------
+LC_FILADM *pFil i Filpeker
+Bruk:
+LC_EraseAllPrioritet(pFil);
+ ==========================================================================
+
+SK_EntPnt_FYBA void LC_EraseAllPrioritet(LC_FILADM *pFil)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O45"NAME="O45"></A><H2>22.5 Kvalitet</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_FormatterKvalitet"NAME="LC_FormatterKvalitet"></A><H2>LC_FormatterKvalitet</H2>
+<BIG><I><B>Formatter KVALITET</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Formater parameterstrengen for KVALITET.
+Resultatet legges i en intern streng, og må kopieres over til andre
+variabler før endring.
+Parametre:
+Type Navn I/U Forklaring
+-------------------------------------------------------------------------
+short sMetode i Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+ KVAL_MET_STD standard metode fra nivå over.
+long lNoyaktighet i Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+ KVAL_NOY_STD standard nøyaktighet fra nivå over
+short sSynbarhet i Synbarhet i bilde
+ KVAL_SYN_GOD godt synlig.
+ KVAL_SYN_UNDEF synbarhet er udefinert.
+ KVAL_SYN_STD standard metode fra nivå over.
+short sHoydeMetode i Hvordan data er registrert.
+ KVAL_MET_UNDEF metode er udefinert.
+ KVAL_MET_STD standard metode fra nivå over.
+long lHoydeNoyaktighet i Registreringsnøyaktighet
+ KVAL_NOY_UKJENT nøyaktighet er ukjent.
+ KVAL_NOY_STD standard nøyaktighet fra nivå over
+char *pszParameter r Peker til '/0'-avslutta streng.
+Bruk:
+ pszParameter = LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,
+ sHoydeMetode,lHoydeNoyaktighet);
+=============================================================================
+
+SK_EntPnt_FYBA char *LC_FormatterKvalitet(short sMetode,long lNoyaktighet,short sSynbarhet,
+ short sHoydeMetode,long lHoydeNoyaktighet)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O46"NAME="O46"></A><H2>22.6 Tabellhandtering</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_InitTabel"NAME="LC_InitTabel"></A><H2>LC_InitTabel</H2>
+<BIG><I><B>Åpner tabellsystemet</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Initierer tabellsystemet og åpner filen.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+long n_rec i Antall reckords som skal nullstilles. Disse kan
+ etterpå brukes til tilfeldig aksess. Utvidelse
+ av filen kan senere bare skje i fortløpende
+ rekkefølge.
+short rec_len i Reckordlengde. (Bruk sizeof for å finne lengden.)
+void *buffer i Peker til buffer som skal brukes for nullstilling.
+short ist r Status. (0=OK, -1=feil)
+Bruk:
+ .
+ struct{
+ long snr;
+ short ngi;
+ short nko;
+ } buffer;
+ .
+ .
+ ist = LC_InitTabel(10000L,sizeof buffer,(void *)(&buffer));
+ .
+ ist = LC_PutTabel(linje,(void *)&buffer);
+ .
+ ist = LC_GetTabel(linje,(void *)&buffer);
+ .
+ LC_CloseTabel();
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_InitTabel(long n_rec,short rec_len,void *buffer)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_PutTabel"NAME="LC_PutTabel"></A><H2>LC_PutTabel</H2>
+<BIG><I><B>Put tabell-linje</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Legg inn en linje fra tabellfilen.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+long linje i Linjenummer som skal legges inn. (0 er første linje)
+ (Største lovlige er 1 større enn det største hittil.)
+void *buffer i Peker til struktur som skal legges inn.
+short ist r Status (0=OK, -1=feil)
+Bruk:
+ist = LC_PutTabel(linje,(void *)&buffer);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_PutTabel(long linje,void *buffer)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_GetTabel"NAME="LC_GetTabel"></A><H2>LC_GetTabel</H2>
+<BIG><I><B>Get tabell-linje</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Henter en linje fra tabellfilen.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+long linje i Linjenummer som skal hentes. (0 er første linje)
+void *buffer i Peker til struktur som skal ta mot lest reckord.
+short ist r Status (0=OK, -1=feil)
+Bruk:
+ist = LC_GetTabel(linje,(void *)&buffer);
+ =============================================================================
+
+SK_EntPnt_FYBA short LC_GetTabel(long linje,void *buffer)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_CloseTabel"NAME="LC_CloseTabel"></A><H2>LC_CloseTabel</H2>
+<BIG><I><B>Stenge tabellsystemet</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Avslutter tabellsystemet og stenger og sletter filen.
+Tabellen kan nå åpnes på nytt for annen bruk.
+Parametre: ingen
+
+Bruk:
+LC_CloseTabel();
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_CloseTabel(void)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O47"NAME="O47"></A><H2>22.7 Meldingshandtering</H2>
+FYBA har en mekanisme som muliggjør at kallende program handterer meldinger til bruker.
+Dette er callback-rutiner som kalles fra FYBA for feilmeldings-handtering
+og visning av framdrift under indeksoppbygging.
+
+Et eksempel på implementasjon ligger i Fyba_Callback.cpp.
+For å få et godt brukergrensesnitt bør disse rutinene endres slik at de bruker
+det meldings og feilhandteringssystemet som brukes av hovedprogrammet.
+
+Hvis FYBA brukes som en DLL må meldingshandteringsrutinene registreres
+med følgende rutiner:
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetErrorHandler"NAME="LC_SetErrorHandler"></A><H2>LC_SetErrorHandler</H2>
+<BIG><I><B>Registrer feilmeldingsrutine</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Registrer feilmeldingsrutine.
+Feilmeldingsrutinen blir kallt hvis det oppstår feil.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+void (*f) (short ,char *,char *) i Peker til feilmeldingsrutine
+Bruk:
+LC_SetErrorHandler(ErrorHandler);
+Feilmeldingsrutinen skal ha følgende definisjon:
+void ErrorHandler(short feil_nr,const char *logtx,const char *vartx);
+Med følgende parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short feil_nr i Feil-nummer
+char *logtx i Tekst som bare skrives til logfil.
+ Eks:"(utført i LC_RxGr)"
+char *vartx i Denne tekststreng henges etter feilmeldingsteksten.
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetErrorHandler(void (*f) (short,const char*,const char*))
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetStartMessageHandler"NAME="LC_SetStartMessageHandler"></A><H2>LC_SetStartMessageHandler</H2>
+<BIG><I><B>Registrer initieringsrutine</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Registrer initieringsrutine.
+Initieringsrutinen blir kalt for å starte visning av framdrift.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+void (*f)(char*) i Peker til initieringsrutine
+Bruk:
+LC_SetStartMessageHandler(StartMessageHandler);
+Initieringsrutinen skal ha følgende definisjon:
+void StartMessageHandler(char *pszFilnavn);
+Med følgende parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+char *pszFilnavn i Ekstra meldingstekst (filnavn)
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetStartMessageHandler(void (*f)(const char*))
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetShowMessageHandler"NAME="LC_SetShowMessageHandler"></A><H2>LC_SetShowMessageHandler</H2>
+<BIG><I><B>Registrer visningsrutine</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Registrer visningsrutine.
+Visningsrutine blir kalt for å vise framdrift ved indeks-oppbygging.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+void (*f)(double) i Peker til visningsrutine
+Bruk:
+LC_SetShowMessageHandler(ShowMessageHandler);
+Visningsrutinen skal ha følgende definisjon:
+void ShowMessageHandler(double prosent);
+Med følgende parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+double prosent i Prosent ferdig (0.0 - 100.0)
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetShowMessageHandler(void (*f)(double))
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetEndMessageHandler"NAME="LC_SetEndMessageHandler"></A><H2>LC_SetEndMessageHandler</H2>
+<BIG><I><B>Registrer avslutningsrutine</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Registrer avslutningsrutine.
+Avslutningsrutinen blir kalt for å avslutte visning av framdrift ved indeksoppbygging.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+void (*f)(void) i Peker til avslutningsrutine
+Bruk:
+LC_SetEndMessageHandler(EndMessageHandler);
+Avslutningsrutinen skal ha følgende definisjon:
+void EndMessageHandler(void);
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetEndMessageHandler(void (*f)(void))
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_SetCancelHandler"NAME="LC_SetCancelHandler"></A><H2>LC_SetCancelHandler</H2>
+<BIG><I><B>Registrer avbruddsstyring</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Registrer avbruddsstyring.
+Rutine for avbruddsstyring blir kalt for å sjekke om bruker ønsker
+å avbryte beregningen.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short (*f)(void) i Peker til rutine for avbruddsstyring.
+Bruk:
+LC_SetCancelHandler(CancelHandler);
+Rutine for avbruddsstyring skal ha følgende definisjon:
+short CancelHandler(void);
+Med følgende parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short sAvbrutt r UT_TRUE = Cancel
+ UT_FALSE = ikke avbrudd
+=============================================================================
+
+SK_EntPnt_FYBA void LC_SetCancelHandler(short (*f)(void))
+</PRE>
+
+En tilsvarende enkel feilmeldingshandtering ligger i FYBA_DLL.dll.
+Denne (DLL'ens) meldingshandteringen blir brukt hvis ekstern meldingshandtering
+ikke blir aktivisert.
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_StartMessage"NAME="LC_StartMessage"></A><H2>LC_StartMessage</H2>
+<BIG><I><B>Vise melding</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Starter vising av melding om baseoppbygging.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+char *pszFilnavn i Ekstra meldingstekst (filnavn)
+Bruk:
+LC_StartMessage(pszFilnavn);
+=============================================================================
+
+void LC_StartMessage(const char *pszFilnavn)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_ShowMessage"NAME="LC_ShowMessage"></A><H2>LC_ShowMessage</H2>
+<BIG><I><B>Vise melding</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Vising av melding om baseoppbygging.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+double prosent i Prosent ferdig (0.0 - 100.0)
+Bruk:
+LC_ShowMessage(prosent);
+=============================================================================
+
+void LC_ShowMessage(double prosent)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_EndMessage"NAME="LC_EndMessage"></A><H2>LC_EndMessage</H2>
+<BIG><I><B>Avslutt melding</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Avslutt melding om baseoppbygging.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+Bruk:
+LC_EndMessage();
+=============================================================================
+
+void LC_EndMessage(void)
+</PRE>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Cancel"NAME="LC_Cancel"></A><H2>LC_Cancel</H2>
+<BIG><I><B>Sjekk om Esc er trykket</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Sjekk om det er trykkt på Esc (Avbryte indeksoppbygging).
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short sAvbrutt r UT_TRUE = Cancel
+ UT_FALSE = ikke avbrudd
+Bruk:
+sAvbrutt = LC_Cancel();
+==========================================================================
+
+short LC_Cancel(void)
+</PRE>
+
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_Error"NAME="LC_Error"></A><H2>LC_Error</H2>
+<BIG><I><B>Feilmeldingsrutine</I></B></BIG><PRE>
+=============================================================================
+Formål:
+Standard feilmeldingsrutine.
+Parametre:
+Type Navn I/U Forklaring
+-----------------------------------------------------------------------------
+short feil_nr i Feil-nummer
+char *logtx i Tekst som bare skrives til logfil.
+ Eks:"(utført i LC_RxGr)"
+char *vartx i Denne tekststreng henges etter feilmeldingsteksten.
+Bruk:
+LC_Error(35,"(Kallt i LC_Xxxx)","");
+=============================================================================
+
+void LC_Error(short feil_nr,const char *logtx,const char *vartx)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O48"NAME="O48"></A><H2>22.8 Hjelperutine for meldingshandtering</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_StrError"NAME="LC_StrError"></A><H2>LC_StrError</H2>
+<BIG><I><B>Feilmeldingstekst</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Henter feilmeldingstekst og nivå for et feilmeldingsnummer.
+Strengen legges i en egen feilmeldingsstruktur for feil-rutiner i fyba.
+Dette blir ødelagt ved neste kall til en "feil-rutine". For å ta vare på
+strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+short feil_nr i Feilmeldingsnummer
+char **feilmelding u Peker til feilmeldingstekst avslutta med '/0'.
+short *strategi r Feilnivå (0-4)
+ 0 = Ikke i bruk. (Utkoblet, testmeldinger mm.)
+ 1 = Lite alvorlig. Vises kort.
+ 2 = Normal feilmelding. Vises ca. 1 sekund.
+ 3 = Alvorlig. Krev tastetrykk for å fortsette.
+ 4 = Svært alvorlig. Programmet bør avbrytes.
+Bruk:
+strategi = LC_StrError(ckap,feil_nr,&feilmeldingspeker);
+ ==========================================================================
+
+SK_EntPnt_FYBA short LC_StrError(short feil_nr,char **feilmelding)
+</PRE>
+
+<BR>
+<BR>
+<BR>
+<A ID="O49"NAME="O49"></A><H2>22.9 Feilsøking</H2>
+<BR>
+<BR>
+<HR>
+<BR>
+<BR>
+<A ID="LC_DumpTab"NAME="LC_DumpTab"></A><H2>LC_DumpTab</H2>
+<BIG><I><B>Dump interne tabeller til stderr</I></B></BIG><PRE>
+==========================================================================
+Formål:
+Dump interne tabeller til stderr
+Parametre:
+Type Navn I/U Forklaring
+--------------------------------------------------------------------------
+Bruk:
+LC_DumpTab();
+ =============================================================================
+
+SK_EntPnt_FYBA void LC_DumpTab(void)
+</PRE>
+
+
+
+
+
+
+
+</BODY></HTML>
diff --git a/fyba.pc.in b/fyba.pc.in
new file mode 100644
index 0000000..22251e9
--- /dev/null
+++ b/fyba.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: @PACKAGE_NAME@
+Description: FYBA library to read and write norwegian geodata standard format SOSI
+Version: @PACKAGE_VERSION@
+Requires:
+Libs: -L${libdir} -lfyba
+Cflags: -I${includedir}/fyba
diff --git a/include/fyba.h b/include/fyba.h
new file mode 100644
index 0000000..c75f19e
--- /dev/null
+++ b/include/fyba.h
@@ -0,0 +1,1484 @@
+/******************************************************************************
+*
+* STATENS KARTVERK - FYSAK
+*
+* Filename: fyba.h
+*
+* Content: Prototyper for rutiner for les/skriv av SOSI-fil.
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+#pragma once
+
+//
+// Når FYBA brukes som DLL, defineres FYBA_DLL_IMPORTS
+// Når FYBA brukes som lib er det ikke nødvendig med noen spesiell definisjon.
+// (Når FYBA skal kompileres/lages som DLL defineres FYBA_DLL_EXPORTS)
+//
+
+
+#ifdef WIN32
+#ifdef FYBA_DLL_IMPORTS /* FYBA brukes som DLL */
+# pragma comment (lib, "FYBA_DLL.lib")
+//# ifdef _DEBUG
+//# pragma comment (lib, "FYBA_DLLD.lib")
+//# else
+//# pragma comment (lib, "FYBA_DLL.lib")
+//# endif
+#else
+# ifndef FYBA_DLL_EXPORTS /* FYBA brukes som LIB */
+# ifdef _DEBUG
+# pragma comment (lib, "FYBAD.lib")
+# else
+# pragma comment (lib, "FYBA.lib")
+# endif
+# endif
+#endif
+
+
+# ifndef DllExport
+# define DllExport __declspec(dllexport)
+# define DllImport __declspec(dllimport)
+# endif /* !DllExport */
+#else
+# define DllExport
+# define DLLImport
+# define __cdecl
+#endif
+
+
+#ifndef SK_EntPnt_FYBA
+
+# ifdef FYBA_DLL_EXPORTS /* FYBA kompileres til DLL ==> FYBA_DLL.DLL */
+# define SK_EntPnt_FYBA DllExport
+
+# else
+# ifdef FYBA_DLL_IMPORTS /* FYBA brukes som DLL */
+# define SK_EntPnt_FYBA DllImport
+
+# else /* FYBA kompileres eller brukes som LIB */
+# define SK_EntPnt_FYBA
+# endif
+# endif
+#endif
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <fygm.h>
+#include <fyut.h>
+
+
+/* ======================================================= */
+/* Definerer konstanter */
+/* ======================================================= */
+ /* Max-verdier for basen */
+#define LC_MAX_GRU 10000000 /* Max grupper i en base */
+#define LC_MAX_GINFO 6000 /* Max linjer GINFO i en gruppe */
+#define LC_MAX_GINFO_BUFFER 250000 /* GINFO-buffer */
+#define LC_MAX_KOORD 90000 /* Max antall koordinater i en gruppe */
+#define LC_MAX_PINFO_BUFFER 250000 /* PINFO-buffer */
+#define LC_MAX_ANT_PRIOR 128 /* Max antall prioriteter */
+#define LC_DATO_LEN 9 /* Max lengde dato (inkl. '\0') */
+#define LC_BASEVER_LEN 50 /* Max lengde av szBaseVer (inkl. '\0') */
+#define LC_MAX_SOSINAVN_LEN 50 /* Max lengde for SOSI-navn (inkl. '\0') */
+#define LC_MAX_NAVN 500 /* Max linjer i navnetabellen (pr. fil) */
+#define LC_NGISLAG_LEN 50 /* Max lengde av NGIS-LAG fra filhodet */
+#define LC_MAX_SOSI_LINJE_LEN 1024 /* Max linjelengde for lesing fra SOSI-filen */
+#define LC_MAX_OBJTYPE_LEN 33 // Max lengde av objettypenavn (inkl. '\0')
+
+#define LC_INTERNT_TEGNSETT TS_ISO8859
+
+
+ /* Konstanter for basetype */
+#define LC_KLADD 3 /* Kladdebase */
+#define LC_BASE 1 /* Vanlig base */
+
+ /* Konstanter for åpning av eksisterende base */
+#define UKJENT_BASE -1
+#define FEIL_VERSJON -2
+#define IKKE_STENGT -3
+#define IDX_MANGLER -4
+#define IDX_FEIL_DATO -5
+#define SOS_MANGLER -6
+#define SOS_FEIL_DATO -7
+#define SOS_FEIL_AKSESS -8
+
+ /* Konstanter for LC_CloseBase */
+#define RESET_IDX 0 /* Fjern indeksfilene */
+#define SAVE_IDX 1 /* Lagrer indeksfilene */
+
+ /* Konstanter for LC_OpenSos */
+#define LC_BASE_FRAMGR 1 /* Framgrunnsfil i basen */
+#define LC_BASE_BAKGR 2 /* Bakgrunnsfil i basen (Bare les) */
+#define LC_SEKV_LES 3 /* Sekvensiell, les */
+#define LC_SEKV_SKRIV 4 /* Sekvensiell, skriv */
+#define LC_SEKV_UTVID 5 /* Sekvensiell, utvid gammel fil */
+
+#define LC_NY_IDX 1 /* Tvungen nygenerering */
+#define LC_GML_IDX 0 /* Bruk gammel .idx hvis den er OK */
+
+#define LC_VIS_STATUS 1 /* Vis status under indeksoppbygging */
+#define LC_INGEN_STATUS 0 /* Ikke vis status */
+
+ /* Lag i basen */
+#define LC_SEKV 0x0001 /* Sekvensiell fil */
+#define LC_BAKGR 0x0002 /* Bakgrunnsfil i base */
+#define LC_FRAMGR 0x0004 /* Framgrunnsfil i base */
+
+ /* Status fra LC_OpenSos */
+#define LC_CANCEL -3 // Avbrutt med [Esc], eller lesefeil
+#define LC_DUBLIKAT -4 // Filen er i basen fra før
+#define LC_OPPTATT -5 // Filen er åpen i annet program
+
+ /* Konstanter for LC_SetNgisModus */
+#define NGIS_NORMAL 0 /* Vanlig modus */
+#define NGIS_SPESIAL 1 /* Spesialmodus der det er mulig å finne og
+ lese grupper som er merka som sletta */
+
+ /* Konstanter for LC_SetUtvidModus */
+#define LC_UTVID_SIKKER 0 /* SOSI-filen stenges og filstørrelsen oppdateres */
+ /* etter hver gruppe som er skrevet på slutten av filen */
+#define LC_UTVID_RASK 1 /* SOSI-filen stenges IKKE etter hver oppdatering*/
+
+ /* Konstanter til QueryGP mfl. */
+#define LC_HODE 1
+#define LC_GINFO 2
+#define LC_PINFO 4
+
+/* Konstanter til bruk ved kombinert flatesøk. JAØ-20000516 */
+#define LC_INGEN 0
+#define LC_NOEN 1
+#define LC_ALLE 2
+
+ /* Gruppenummer når det ikke er noen aktuell gruppe */
+#define INGEN_GRUPPE -1L /* bgr når det ikke er noen akt. gruppe */
+
+ /* Lesemetode for LC_RxGr */
+#define LES_OPTIMALT 0 /* Les mest effektivt base/SOSI */
+#define LES_SOSI 1 /* Les alltid fra SOSI-filen */
+
+ /* Skrivemetode for LC_WxGr */
+#define SKRIV_OPTIMALT 0 /* Skriv mest effektivt kø/SOSI */
+#define SKRIV_SOSI 1 /* Skriv direkte til SOSI-filen */
+
+ /* Handteringmetode for NGIS-nøkkel for LC_CopyGr */
+#define OPPDATER_NGIS 0 /* NGIS-nøkkel oppdateres i henhold til hodet i filen det kopieres til */
+#define BEVAR_NGIS 1 /* NGIS-nøkkel bevares uforandret i kopien */
+
+ /* Manglende kvalitetsopplysninger */
+#define KVAL_MET_UNDEF -1 /* Udefinert metode */
+#define KVAL_MET_STD -2 /* Standard metode fra nivå over */
+
+#define KVAL_NOY_UNDEF -1L // Udefinert nøyaktighet. - OBS! Denne skal utgå
+#define KVAL_NOY_STD -2L /* Standard nøyaktighet fra nivå over */
+#define KVAL_NOY_UKJENT 999999L // Ukjent nøyaktighet
+
+
+#define KVAL_SYN_GOD 0 /* Godt synlig */
+#define KVAL_SYN_UNDEF -1 /* Udefinert synbarhet */
+#define KVAL_SYN_STD -2 /* Standard synbarhet fra nivå over */
+
+ /* For LC_GetTH og LC_PutTH */
+ /* Konstant for å si at punktet ikke har høyde */
+ /* OBS! Denne må stemme med definisjonen i filen port.h */
+#ifndef HOYDE_MANGLER
+# define HOYDE_MANGLER -9999.999 /* Høyde mangler i punktet */
+#endif
+
+#define KOORD_MANGLER -9999.999 /* Koordinat mangler i punktet */
+
+ /* Gruppeinformasjon */
+#define GI_PINFO ((unsigned short)0x0001) /* Har PINFO */
+#define GI_NAH ((unsigned short)0x0002) /* Gruppen har høyde informasjon (..NØH) */
+#define GI_KP ((unsigned short)0x0004) /* Har knutepunkt (...KP n) */
+#define GI_REF ((unsigned short)0x0008) /* Har referanser (.. :n) */
+#define GI_OY_REF ((unsigned short)0x0010) /* Har referanser med øy */
+#define GI_SLETTA ((unsigned short)0x0020) /* Er sletta (merka som sletta) */
+#define GI_NGIS ((unsigned short)0x0040) /* Er tatt ut fra NGIS */
+#define GI_NAD ((unsigned short)0x0080) /* Har dybde informasjon (..NØD) */
+#define GI_READ_ONLY ((unsigned short)0x0100) /* Bare leseaksess (kan ikke endres) */
+
+ /* Avgrensing av brukttabellen */
+#define BT_MIN_BT 0 /* Første kolonne i brukttabellen */
+#define BT_MAX_BT 31 /* Siste kolonne i brukttabellen */
+#define BT_MIN_USER 1 /* Første tilgjengelig for brukerprogram */
+#define BT_MAX_USER 26 /* Siste tilgjengelig for brukerprogram */
+ /* Spesielle posisjoner i brukttabellen */
+#define BT_SKRKO 0 /* I skrivekø */
+#define BT_REFBOX 27 /* Referanser er brukt i omskrevet boks */
+#define BT_X 28 /* Reserve systemposisjon */
+#define BT_SNRSOK 29 /* Funnet ved SNR-søk */
+#define BT_GISOK 30 /* Funnet ved GINFO-søk */
+#define BT_GEOSOK 31 /* Funnet ved geografisk søk */
+
+ /* Logiske operasjoner mellom kolonner i brukttabellen */
+#define BC_AND 0
+#define BC_OR 1
+#define BC_COPY 2
+#define BC_INVERT 3
+#define BC_EXCHANGE 4
+
+
+ /* Konstanter for get og put referansenummer */
+#define START_OY 9999999L /* Start øy */
+#define SLUTT_OY -9999999L /* Slutt øy */
+
+ /* Konstanter for GetArrayTK() */
+#define HENT_FORRFRA 1 /* Vanlig */
+#define HENT_BAKFRA -1 /* Snu buferet */
+
+/* UTVALG */
+
+// Utvalgskommandoer
+#define LC_U_OG 1 // ..OG
+#define LC_U_ELLER 2 // ..VELG og ..ELLER
+
+
+ // Utvalgsmetoder
+#define LC_U_IKKE 0 // ! Ikke (Tilslag når SOSI-navnet
+ // ikke finnes. Bare GINFO.)
+#define LC_U_ALLE 1 // AL Alle
+#define LC_U_FRATIL 2 // <> Fra-til
+#define LC_U_UTENFOR 3 // >< Utenfor
+#define LC_U_MINDRE 4 // < Mindre-enn
+#define LC_U_STORRE 5 // > Større-enn
+#define LC_U_DELELIG 6 // / Delelig-med, eventuellt med
+ // sjekk på om restverdi er 2. verdi
+#define LC_U_UDELELIG 7 // !/ Ikke-delelig-med
+#define LC_U_CONTEIN 8 // () Inneholder
+#define LC_U_IKKECONTEIN 9 // !() Inneholder ikke (Tilslag når
+ // denne navn og verdi kombinasjonen
+ // ikke finnes)
+#define LC_U_LIK 10 // = Lik
+#define LC_U_IKKEVALGT 11 // IV Ikke valgt (Tilslag når gruppen
+ // ikke er tegnet ennå. Kombineres
+ // med SOSI-navnet "..*")
+#define LC_U_IKKELIK 12 // != Ikke lik (Tilslag når denne
+ // navn og verdi kombinasjonen ikke
+ // finnes)
+#define LC_U_FLERE 13 // FL Flere (Tilslag når SOSI-navnet
+ // forekommer flere ganger.)
+#define LC_U_IKKEFLERE 14 // !FL Ikke flere enn (Tilslag når
+ // SOSI-navnet IKKE forekommer
+ // flere ganger enn gitt antall.)
+
+
+
+ // Parametertyper
+#define LC_U_TALL 1 // Heltall
+#define LC_U_FLYT 2 // Flyttall
+#define LC_U_ALFA 4 // Tekststreng
+#define LC_U_DEFINERT 8 // Type definert i utvalgsregel
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Kvalitet !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_KVALITET { /* Standard Kvalitet */
+ short sMetode;
+ long lNoyaktighet;
+ short sSynbarhet;
+ short sHoydeMetode;
+ long lHoydeNoyaktighet;
+} LC_KVALITET;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Buffer for lesing av SOSI-fil !
+ *!--------------------------------------------------------------!
+ */
+
+typedef struct dLB_LESEBUFFER {
+ char tx[LC_MAX_SOSI_LINJE_LEN]; /* Lesebuffer */
+ UT_INT64 filpos; /* Filposisjon for starten av bufret */
+ UT_INT64 startpos; /* Startposisjon i filen for aktuellt SOSI-navn */
+ char *cp; /* Peker til aktuell posisjon i bufret */
+ char *pp; /* Peker til start parameter */
+ char *ep; /* Peker til posisjon etter aktuellt ord */
+ char *np; /* Peker til posisjon etter parameter (neste cp) */
+ short cur_navn[6]; /* Aktuellt SOSI-navn på dette nivå */
+ short cur_niv; /* Aktuellt nivå (der cp peker) (Ant. prikker) */
+ short cur_ant_par; /* Antall parametre på aktuellt nivå */
+ short cur_type; /* Viser hva aktuellt set inneholder */
+ short set_brukt; /* Status som viser om aktuellt "sett" er brukt */
+ short sTegnsett; /* SOSI-filens tegnsett */
+ short sStatus; /* Status, viser om buffer har brukbart innhold */
+} LB_LESEBUFFER;
+
+
+/*
+ *!----------------------------------------------------------!
+ *! BUFFER for koordinater og GINFO i minne !
+ *!----------------------------------------------------------!
+*/
+
+/*
+CH SOSI-buffer Binær kopi av SOSI-filen
+CD For å øke hastigheten holder FYBA en binær kopi av SOSI-filen.
+CD Denne kopien ligger delevis i minne og delevis på disk.
+CD
+CD Denne kopien består av gruppeinformasjon, koordinater og punktinformasjon.
+CD
+CD Gruppeinformasjonen for en gruppe handteres som en lang streng med pekere
+CD til startposisjon for hver GINFO-linje.
+CD
+CD !-----------:-----------:----------:----------------------------------!
+CD ! GINFO 1 ! GINFO 2 ! GINFO 3 ! ..... !
+CD !-----------:-----------:----------:----------------------------------!
+CD ! ! !
+CD !---------! ! !
+CD ! ! !
+CD !--------! ! ! !
+CD ! GINFO ! ! ! !
+CD !--------! ! ! !
+CD ! ofset !-! ! !
+CD ! !----- !
+CD ! !-----------------
+CD
+CD Koordinatene lagres i egne array. Punktinformasjonen lagres som
+CD en lang streng for hele gruppen med peker for hvert punkt til startposisjon
+CD for PINFO for hvert punkt på samme måte som GINFO.
+CD
+CD !--------! !--------! !--------:-------:--------!
+CD ! Øst ! ! Nord ! ! Høyde ! KP ! PINFO !
+CD !--------! !--------! !--------!-------!--------!
+CD ! double ! ! double ! ! double ! short ! ushort !
+CD ! m ! ! m ! ! m ! ! ofset !
+*/
+typedef struct d_LB_INFO {
+ double dHoyde; // Høyde
+ short sKp; // Knutepunkt (0=ikke knutepunkt)
+ unsigned long ulPiOfset; // PINFO ofset i eget buffer
+} LB_INFO;
+
+
+# define LC_INGEN_PINFO ULONG_MAX /* Offset ved tom PINFO */
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Navnetabell !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dSOSINAVN { /* Navnetabellen */
+ char szNavn[LC_MAX_SOSINAVN_LEN]; /* Sosi-navn */
+ unsigned char ucAntPar; /* Antall parametre til dette navnet */
+ char cNivo; /* "Prikk-nivå" (1 = Gruppenavn) */
+ bool bBrukt; // Viser om navnet er vært brukt
+} SOSINAVN;
+
+typedef struct dLC_NAVNETABELL {
+ short sAntNavn; /* Antall navn totalt i navnetabellen */
+ SOSINAVN sosi[LC_MAX_NAVN]; /* Navnetabellen */
+} LC_NAVNETABELL;
+
+
+# define LC_ANT_PAR_UKJENT 255 /* Antall parametre til dette navnet er
+ ukjent, ta med fram til neste " ." */
+
+ /* Definerte navn */
+#define L_SLUTT 0
+#define L_PUNKT 1
+#define L_LINJE 2
+#define L_KURVE 3
+#define L_BUE 4
+#define L_BUEP 5
+#define L_SIRKEL 6
+#define L_SIRKELP 7
+#define L_KLOTOIDE 8
+#define L_SVERM 9
+#define L_TEKST 10
+#define L_TRASE 11
+#define L_FLATE 12
+#define L_BEZIER 13
+#define L_RASTER 14
+#define L_DEF 15
+#define L_OBJDEF 16
+#define L_MLINJE 17
+#define L_STRUKTUR 18
+#define L_OBJEKT 19
+#define L_SYMBOL 20
+#define L_HODE 21 /* L_HODE må alltid ligge sist av gruppenavnene */
+
+#define L_NA 22 /* Andre definerte navn */
+#define L_NAH 23
+#define L_REF1 24
+#define L_REF2 25
+#define L_RADIUS 26
+#define L_ENHET2 27
+#define L_ENHET2H 28
+#define L_ENHET2D 29
+#define L_ENHET3 30
+#define L_ENHET3H 31
+#define L_ENHET3D 32
+#define L_ORIGONO 33
+#define L_HOYDE 34
+#define L_DYBDE 35
+#define L_NAD 36
+#define L_NGISFLAGG 37
+#define L_NGISLAG 38
+#define L_OBJTYPE 39
+#define L_KP 40 /* L_KP må alltid ligge sist av de forhåndsdefierte navnene */
+
+
+
+/* ======= INDEKS-TABELLER =================== */
+
+/*
+CH Serienummer-tabell
+CD !-------------*
+CD ! Gruppenummer!
+CD !-------------! Linjenummer i tabellen er serienummer.
+CD ! lGrNr !
+CD ! (long) !
+CD *-------------*
+*/
+
+
+
+/*
+CH Geografisk-søketabell Geografisk søketabell
+CD
+CD Geografisk søk er basert på omskrevet boks.
+CD Boksene organiseres i et R-tre.
+CD
+CD !-----------------------------------*
+CD ! Omskreven boks !
+CD ! !
+CD ! min-N ! min-Ø ! max-N ! max-Ø !
+CD ! ! ! ! !
+CD !--------!--------!--------!--------!
+CD !dMinNord!dMinAust!dMaxNord!dMaxAust!
+CD ! d ! d ! d ! d !
+CD ! ! ! ! !
+CD *-----------------------------------*
+*/
+
+/*
+ *!--------------------------------------------------------------!
+ *! Boks for geografisk søk !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_BOKS{
+ double dMinAust;
+ double dMinNord;
+ double dMaxAust;
+ double dMaxNord;
+} LC_BOKS;
+
+#define LC_R_MAX_SON 3 /* Max antall sønner for hver node i R-treet */
+
+typedef struct dLC_R_NODE{
+ struct dLC_R_NODE *pFar; /* Far i treet (node) */
+ LC_BOKS Boks; /* Sum av omskreven boks for sønnene */
+ short sSonType; /* Hvilken type sønner har denne noden LC_NODE / LC_LEAF */
+ short sSonAnt; /* Antall sønner */
+ union {
+ struct dLC_R_NODE *pNode[LC_R_MAX_SON]; /* Sønner i treet (node) */
+ struct dLC_R_LEAF *pLeaf[LC_R_MAX_SON]; /* Sønner i treet (løv) */
+ } Son;
+} LC_R_NODE;
+
+#define LC_NODE 0
+#define LC_LEAF 1
+
+
+typedef struct dLC_R_LEAF{
+ LC_R_NODE *pFar; /* Far i treet (node) */
+ LC_BOKS Boks; /* Omskreven boks for gruppen */
+ long lNr; /* Gruppenummer i filen */
+} LC_R_LEAF;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Gruppetabel !
+ *!--------------------------------------------------------------!
+ */
+/*
+CH Gruppetabell Gruppetabell
+CD Dette er hovedtabellen med informasjon om hver enkelt gruppe på SOSI-filen.
+CD
+CD !------------------------------:-----------------------------------------------*
+CD !Start !Start !Ant. !Ant. ! Gruppeinnhold !
+CD ! på ! i !tegn !tegn !-----------------------------------------------!
+CD !SOSI- ! RB !GINFO- !PINFO- !Gruppe!ant. !ant. !Kvali- !Enhet ! Div. info !
+CD !fil ! !buffer !buffer !navn !GINFO! NØ ! tet ! ! (bit def.) !
+CD !-------!------!-------!-------!------!-----!-----!--------!------!------------!
+CD !sosi_st!rb_st !ulGiLen!ulPiLen!gnavn !ngi !nko !Kvalitet!dEnhet! info !
+CD ! n64 ! n64 ! ul ! ul ! s ! s ! l ! struct ! d ! us !
+CD ! ! ! ! ! ! ! ! ! !0=i !
+CD ! ! ! ! ! ! ! ! ! !1=H !
+CD ! ! ! ! ! ! ! ! ! !2=KP !
+CD ! ! ! ! ! ! ! ! ! !3=REF !
+CD ! ! ! ! ! ! ! ! ! !4=REF med ØY!
+CD ! ! ! ! ! ! ! ! ! !5=sletta !
+CD ! ! ! ! ! ! ! ! ! !6=NGIS oppd !
+CD *------------------------------------------------------------------------------*
+*/
+typedef struct dLC_GRTAB_LINJE{
+ unsigned long ulPrior[4]; /* Bitfelt for prioriteter. */
+ /* Siste bit viser om feltet er bygd opp. */
+ UT_INT64 sosi_st; /* Startposisjon i SOSI-filen */
+ UT_INT64 rb_st; /* Peker til start av gruppen i buffer-fil */
+ long rb_forrige_gr; /* Forrige gruppe i buffer-filen */
+ long rb_neste_gr; /* Neste gruppe i buffer-filen */
+ short gnavn; /* Gruppenavn. Eks. .HODE, .PUNKT, mm */
+ short ngi; /* Antall GINFO-linjer */
+ long nko; /* Antall koordinater */
+ unsigned short info; /* Info, se under gruppetabellen */
+ LC_KVALITET Kvalitet; /* Aktuell kvalitet fra GINFO */
+ char szObjtype[LC_MAX_OBJTYPE_LEN]; /* ..OBJTYPE fra GINFO */
+ double dEnhet; /* Aktuell enhet for gruppen i bufferet */
+ double dEnhetHoyde; /* Aktuell enhet-H for gruppen i bufferet */
+ double dEnhetDybde; /* Aktuell enhet-D for gruppen i bufferet */
+ unsigned long ulGiLen; /* Antall tegn i GINFO-buffer (inkl. \0) */
+ unsigned long ulPiLen; /* Antall tegn i PINFO-buffer (inkl. \0) */
+ LC_R_LEAF *pRL; /* Peker inn i geografisk søketre */
+
+} LC_GRTAB_LINJE;
+
+
+/*
+CH Brukttabell Merking av grupper
+CD Denne tabellen brukes delevis internt av FYBA, og delevis av brukerprogrammet.
+CD
+CD Følgende bit er definert:
+CD -------------------------------------------------------------------------
+CD 31 Gruppen er funnet ved geografisk søk -----! Brukere kan lese/bruke
+CD 30 Gruppen er funnet ved GINFO-utvalg ! disse, men det er ikke
+CD 29 Gruppen er funnet ved serienummer-søk ! lov til å endre dem.
+CD 28 Gruppen er i ringbufferet !
+CD 27 Referanser er brukt i omskrevet blokk ------!
+CD 26 -----!
+CD . ! Brukere har
+CD . ! full tilgang
+CD 2 ! til disse.
+CD 1 -----!
+CD 0 Gruppen ligger i kø for skriving til SOSI-filen
+*/
+
+
+ /*
+ *!--------------------------------------------------------------!
+ *! Overordnet blokk med pekere til de ulike indekstabellene !
+ *!--------------------------------------------------------------!
+ */
+#define LC_IDX_LIN_BLOKK 5000
+#define LC_ANT_IDX_BLOKK (LC_MAX_GRU / LC_IDX_LIN_BLOKK)
+typedef struct dLC_IDX_TABELL{
+ /* Array med pekere til starten av blokk med Gruppetabell-linjer */
+ LC_GRTAB_LINJE * GtAdm[LC_MAX_GRU / LC_IDX_LIN_BLOKK];
+
+ /* Array med pekere til starten av blokk med Gruppenummer for gitt SNR */
+ long *SnrAdm[LC_MAX_GRU / LC_IDX_LIN_BLOKK];
+
+ /* Array med pekere til starten av blokk med Brukttabell-linjer */
+ unsigned long *BtAdm[LC_MAX_GRU / LC_IDX_LIN_BLOKK];
+
+ /* Array med pekere til starten av blokk med Geo-tabell-linjer */
+ /* LC_GEOSOK_BOKS *GeoAdm[LC_MAX_GRU / LC_IDX_LIN_BLOKK]; */
+} LC_IDX_TABELL;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Koordinat 2D !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_KOORD_2D { /* (ø,n) Koordinatpar */
+ double dAust; /* øst-koordinat */
+ double dNord; /* nord-koordinat */
+} LC_KOORD_2D;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Koordinat 3D !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_KOORD_3D { /* (ø,n,h) Koordinatpar */
+ double dAust; /* øst-koordinat */
+ double dNord; /* nord-koordinat */
+ double dHoyde; /* Høyde */
+} LC_KOORD_3D;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Rektangel !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_REKT {
+ double dMinAust;
+ double dMinNord;
+ double dMaxAust;
+ double dMaxNord;
+} LC_REKT;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Kontanter og struktur for handtering av TRANSPAR i filhodet !
+ *!--------------------------------------------------------------!
+ */
+// Maske som styrer hvilke elementer i LC_TRANSPAR som benyttes
+#define LC_TR_KOORDSYS ((unsigned short)0x0001) /* Koordsys */
+#define LC_TR_TRANSSYS ((unsigned short)0x0002) /* Transsys */
+#define LC_TR_GEOSYS ((unsigned short)0x0004) /* Geosys */
+#define LC_TR_GEOKOORD ((unsigned short)0x0008) /* Geokoord */
+#define LC_TR_ORIGO ((unsigned short)0x0010) /* Origo-nø */
+#define LC_TR_ENHET ((unsigned short)0x0020) /* Enhet */
+#define LC_TR_ENHETH ((unsigned short)0x0040) /* Enhet-h */
+#define LC_TR_ENHETD ((unsigned short)0x0080) /* Enhet-d */
+#define LC_TR_VERTDATUM ((unsigned short)0x0100) /* Vert-datum */
+#define LC_TR_VERTINT ((unsigned short)0x0200) /* Vert-int */
+#define LC_TR_VERTDELTA ((unsigned short)0x0400) /* Vert-delta */
+
+#define LC_TR_ALLT ((unsigned short)0xFFFF) /* Alle deler av ..TRANSPAR */
+
+
+// Definerer struktur for ..TRANSPAR
+typedef struct dLC_TRANSPAR {
+ /* ...KOORDSYS */
+ short sKoordsys;
+ char szKoordsysDatum[36];
+ char szKoordsysProjek[36];
+ /* ...TRANSSYS */
+ short sTranssysTilsys;
+ double dTranssysKonstA1;
+ double dTranssysKonstB1;
+ double dTranssysKonstA2;
+ double dTranssysKonstB2;
+ double dTranssysKonstC1;
+ double dTranssysKonstC2;
+ /* ...GEOSYS */
+ short sGeosysDatum;
+ short sGeosysProj;
+ short sGeosysSone;
+ /*...GEOKOORD */
+ short sGeoKoord;
+ /* ...ORIGO-NØ */
+ LC_KOORD_2D Origo;
+ //double dOrigoAust;
+ //double dOrigoNord;
+ /* ...ENHET */
+ double dEnhet;
+ /* ...ENHET-H */
+ double dEnhet_h;
+ /* ...ENHET-D */
+ double dEnhet_d;
+ /* ...VERT-DATUM */
+ char szVertdatHref[7];
+ char szVertdatDref[6];
+ char szVertdatFref[6];
+ char szVertdatHtyp[2];
+ /* ...VERT-INT */
+ short sVertintHref;
+ short sVertintDref;
+ short sVertintFref;
+ /* ...VERT-DELTA */
+ short sVdeltaMin;
+ short sVdeltaMax;
+} LC_TRANSPAR;
+
+
+#define LC_TR_GEOSYS_INGEN_VERDI -9999 // Brukes for å angi at projeksjon og sone under geosys ikke er gitt
+
+// Konstanter for definering av filtype (primært for bruk i GabEdit) JAØ-20010306
+#define LC_FILTYPE_UKJENT 0
+#define LC_FILTYPE_INAKTIV 1
+#define LC_FILTYPE_GAB_EIENDOM 2
+#define LC_FILTYPE_GAB_ADRESSE 3
+#define LC_FILTYPE_GAB_BYGNING 4
+#define LC_FILTYPE_BYGG 5
+#define LC_FILTYPE_DEK 6
+#define LC_FILTYPE_DEK_ENDRING 7
+#define LC_FILTYPE_GRUNNKRETS 8
+#define LC_FILTYPE_POSTKRETS 9
+#define LC_FILTYPE_SKOLEKRETS 10
+#define LC_FILTYPE_KIRKESOGN 11
+#define LC_FILTYPE_TETTSTED 12
+#define LC_FILTYPE_VALGKRETS 13
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Filadministrasjon !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_FILADM{
+ char szBaseVer[LC_BASEVER_LEN]; // Versjon og dato for aktuell versjon av FYBA
+ char szIdxVer[5]; // Indeksfil-versjon
+ short sIdxOpen; // UT_FALSE/UT_TRUE - Flagg som viser at indeks er åpnet
+ unsigned long ulPid; // Prosess ID for programmet som har åpnet filen
+ short sFilType; // Primært tenkt brukt i GabEdit, definerer hvilken type arbeidsfil dette er.
+ unsigned short usLag; // Lag: (LC_SEKV,LC_FRAMGR,LC_BAKGR)
+ char szNgisLag[LC_NGISLAG_LEN]; // Ngislag i filhodet
+ short sAccess; // Aksess: (READ / UPDATE)
+ /* short sDisk; */ // Disk for SOSI-filen (1=A, 2=B, osv.)
+ char *pszNavn; // Filnavn (SOSI-filens navn, inkl. sti
+ UT_INT64 SosiBytes; // Antall byte i SOSI-filen
+ FTID SosiTid; // Oppdateringstidspunkt for SOSI-filen
+ LC_TRANSPAR TransPar; // Transformasjonsparametre fra filhodet
+ unsigned short TransMaske; // Maske som viser hvilke deler av TransPar som inneholder data
+ LC_REKT Omr; // ..OMRÅDE fra filhodet
+ short sTegnsett; // Tegnsett fra filhodet eller standardverdi
+ char szDato[LC_DATO_LEN]; // ..DATO fra fil-hodet
+ short sSosiVer; // ..SOSI-VERSJON fra fil-hodet * 100
+ char SosiNiv[2]; // ..SOSI-NIVÅ fra fil-hodet
+ // SosiNiv[0] = nivå fra filåpningen
+ // SosiNiv[1] = nivå fra senere handtering
+ // Filhodet oppdateres når filen stenges
+ // short usUlovligRef; // Bryter som viser om det er ulovlige
+ // // referanser i filen (Indeksoppbygging)
+ unsigned short usDataFeil; // Flagg som viser om det er datafeil
+ // i filen (Indeksoppbygging)
+ LC_KVALITET Kvalitet; // Kvalitet fra filhodet
+
+ UT_INT64 n64AktPos; // Aktuell posisjon for sekv. skriv / les
+ UT_INT64 n64NesteLedigRbPos; // Neste ledige posisjon i buffer-filen
+ long lSisteGrRb; // Siste gruppe i buffer-filen
+
+ long lMaxSnr; // Største serienummer brukt i filen
+ long lAntGr; // Antall grupper i filen
+
+ struct dLC_NAVNETABELL SosiNavn; // Navnetabell
+
+ LC_IDX_TABELL *pIdx; // Starten av indekstabellen
+ LC_R_NODE *pGeoRN; // Peker til starten av trestruktur for geografisk søk
+ LC_BOKS Omraade; // Område angitt i filhodet ved åpning
+
+ struct dLC_FILADM *pNesteFil; // Peker til neste fil-adm.
+ struct dLC_BASEADM *pBase; // Peker til base-adm. for denne filen
+} LC_FILADM;
+
+
+/* Konstanter for flagg som viser om det er datafeil i filen (Indeksoppbygging) */
+#define LC_DATAFEIL_REF 1 /* Ulovlig referanse (referanse til gruppe som ikke finnes)*/
+#define LC_DATAFEIL_BUE 2 /* Ulovlige buer i filen */
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Baseadministrasjon !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_BASEADM{
+ short sType; // Basetype: LC_BASE / LC_START_KLADD / LC_KLADD
+
+ long lAntGr; // Antall grupper i basen
+ LC_BOKS Omraade; // Summert område fra filhodene
+ short sAntFramgrFil; // Antall filer i framgrunn
+ short sAntBakgrFil; // Antall filer i bakgrunn
+
+ LB_LESEBUFFER BufAdm; // Vanlig lesebuffer mot SOSI-fil
+
+ LC_FILADM *pCurSos; // Fil-adm for åpen SOSI-fil
+ FILE *pfSos; // Filhandel for åpen SOSI-fil
+
+ LC_FILADM *pCurRb; // Fil-adm for åpen Rb-fil
+ FILE *pfRb; // Filhandel for åpen Rb-fil
+ short sModusRb; // LES eller SKRIV til buffer-filen
+ UT_INT64 n64FilPosRb; // Aktuell posisjon i buffer-filen
+
+ LC_FILADM *pForsteFil; // Peker til første fil-adm.
+ LC_FILADM *pSisteFil; // Peker til siste fil-adm.
+
+ struct dLC_BASEADM *pNesteBase; // Peker til neste base-adm
+} LC_BASEADM;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Gruppenummer !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_BGR {
+ LC_FILADM *pFil; /* Peker til FilAdm for SOSI-fil */
+ long lNr; /* Gruppenummer innen filen */
+} LC_BGR;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Hent flate-referanser, status !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_GR_STAT {
+ short sGiLinNr; /* Aktuell GINFO-linjenummer referanselesing */
+ short sRefPos; /* Aktuell posisjon i GINFO-linja */
+ short sRefLin; /* Viser om aktuel linje inneholder referanser */
+} LC_GR_STATUS;
+
+typedef struct dLC_GRF_STAT {
+ LC_GR_STATUS Omkr;
+ unsigned short usOmkretsFerdig;
+ LC_GR_STATUS Oy;
+ LC_BGR Bgr; /* Aktuell øy-gruppe */
+} LC_GRF_STATUS;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Geografisk søk, status mm. !
+ *!--------------------------------------------------------------!
+ */
+
+/* Kjede med resultatet av søket */
+typedef struct dLC_KJEDE_BGR {
+ LC_BGR Bgr;
+ struct dLC_KJEDE_BGR *pNesteKB;
+} LC_KJEDE_BGR;
+
+/* Søkemetode i basen */
+#define LC_GEO_SEKV 0x0000 /* Søker sekvensiellt gjennom gruppene */
+#define LC_GEO_RTRE 0x0001 /* Bruker R-tre-srukturene i søket */
+
+/* Status */
+typedef struct dLC_GEO_STAT {
+ unsigned short usMetode; /* Søkemetode (LC_GEO_SEKV eller LC_GEO_RTRE) */
+ double nvn,nva,ohn,oha; /* Rektangel for søkeområde. */
+ unsigned short usLag; /* Lag det skal søkes i. (LC_FRAMGR | LC_BAKGR) */
+ LC_BGR Bgr; /* Aktuell gruppe */
+ /* Kjede med resultatet av søket */
+ LC_KJEDE_BGR *pForsteKB;
+ LC_KJEDE_BGR *pSisteKB;
+ LC_KJEDE_BGR *pAktuellKB;
+} LC_GEO_STATUS;
+
+
+/*
+CH Utvalgstabell
+CD .===============================================================================.
+CD !Ginfo/!Utvalgs-!Prio-!SOSI-!Utvalgs-!Para-!Ledd-!Start !Slutt !Min !Max !Regel-!
+CD !Pinfo !kommando!ritet!navn !metode !type !nr !i str !i str ! ! !navn !
+CD !------!--------!-----!-----!--------!-----!-----!------!------!----!----!------!
+CD !gi_pi !kommando!sPri-!sosi !metode !type !ledd !start !slutt !min !max !regel !
+CD ! ! !orit-! ! ! ! ! ! ! ! ! !
+CD ! c ! c !et !c[] ! c ! c ! c ! c ! c !c[] !c[] ! c[] !
+CD ! ! ! ! ! ! ! ! ! ! ! ! !
+CD ! ! ! s ! ! ! ! ! ! ! ! ! !
+CD !Def. se under ! ! !Def. se !se ! ! ! !Def. se nedenfor!
+CD ! ! ! ! !nedenfor!nedf.! ! ! ! ! ! !
+CD *-------------------------------------------------------------------------------*
+*/
+
+ /* Gruppe, punkt eller pinfo-uvalg */
+#define U_GRUPPE 1 /* GRUPPE-UTVALG */
+#define U_PUNKT 2 /* PUNKT-UTVALG */
+#define U_PINFO 3 /* PINFO-UTVALG */
+
+/* Struktur for statusopplysninger for LC_InitPP / LC_GetPP */
+typedef struct {
+ short type; /* LC_GETPP_KP, LC_GETPP_HOYDE, LC_GETPP_KVALITET, LC_GETPP_VANLIG */
+ char pinfo_navn[LC_MAX_SOSINAVN_LEN]; /* Sosi-navn det skal finnes verdi til */
+ long curr_punkt; /* Aktuellt punkt */
+ long slutt_punkt; /* Første punkt etter søkeområdet */
+ short neste_tegn; /* Neste tegn (Ved flere PINFO i punktet) */
+} LC_GETPP_STATUS;
+/* Bruk: LC_GETPP_STATUS pp_stat; */
+
+#define LC_GETPP_VANLIG 0
+#define LC_GETPP_KP 1
+#define LC_GETPP_HOYDE 2
+#define LC_GETPP_KVALITET 3
+
+ /* Konstant for sAktuellPrioritet */
+#define LC_OVERSE_PRIORITET -1
+
+/* Utvalgslinje */
+typedef struct sLC_UTVALG_ELEMENT {
+ char kommando;
+ char sosi[LC_MAX_SOSINAVN_LEN];
+ char metode;
+ //char type;
+ short type;
+ char ledd; /* Ledd-nr for flerleddet parameter */
+ char start; /* Startposisjon i tegnstreng (0=hele) */
+ char slutt; /* Sluttposisjon i tegnstreng (0=resten) */
+ char *min;
+ char *max;
+ struct sLC_UTVALG_ELEMENT *pNesteUE; /* Neste på dette nivå */
+ struct sLC_UTVALG_ELEMENT *pForsteUE; /* Første på nivået under */
+ struct sLC_UTVALG_ELEMENT *pSisteUE; /* Siste på nivået under */
+} LC_UTVALG_ELEMENT;
+
+typedef struct sLC_LAG {
+ char *pszLagNavn; /* Lagnavn */
+ short sLagAktiv; /* Lag aktiv for tegning */
+ struct sLC_LAG *pNesteLag; /* Neste lag */
+} LC_LAG;
+
+#define LC_UFORANDRET 0
+#define LC_ENDRET 1
+#define LC_NY 2
+#define LC_SLETTET 3
+
+typedef struct sLC_UTVALG {
+ char *pszNavn;
+ short sPrioritet;
+ short sOriginalPrioritet;
+ short sStatus;
+ short sTegnes; // Flagg for å styre om utvalgsregelen skal brukes ved tegning
+ LC_UTVALG_ELEMENT *pForsteUE; /* Første utvalgslinje på øverste nivå */
+ LC_UTVALG_ELEMENT *pSisteUE; /* Siste utvalgslinje på øverste nivå */
+
+ struct sLC_UTVALG *pForrigeU; /* Forrige utvalg */
+ struct sLC_UTVALG *pNesteU; /* Neste utvalg */
+ struct sLC_LAG *pLag; /* Lag */
+ char *pszRegel; /* Regel */
+} LC_UTVALG;
+
+/* Toppblokk for GRUPPE-, PUNKT- og PINFO-utvalg */
+typedef struct dLC_UTVALG_BLOKK {
+ short sHoydeBrukt;
+ short sTestAllePi; /* "!" er brukt, må sjekke alle punkt */
+ LC_UTVALG *pForsteU;
+ LC_UTVALG *pSisteU;
+ LC_UTVALG *pAktU;
+} LC_UTVALG_BLOKK;
+
+/* Administrasjonsblokk for utvalg */
+typedef struct dLC_UT_ADM {
+ short sMaxPrior; /* Største prioritet */
+ LC_UTVALG_BLOKK Gruppe;
+ LC_UTVALG_BLOKK Punkt;
+ LC_UTVALG_BLOKK Pinfo;
+ LC_UTVALG_BLOKK *pAktUB;
+ short sGruppeValgt;
+ LC_LAG *pForsteLag;
+ LC_LAG *pSisteLag;
+} LC_UT_ADM;
+
+/* Administrasjonsblokk for serienummersøk */
+typedef struct dLC_SNR_ADM {
+ LC_FILADM *pFil;
+ long lMinSnr;
+ long lMaxSnr;
+ long lAktSnr;
+} LC_SNR_ADM;
+
+/*
+CH Polygonbeskrivelse Strukturer for polygonbeskrivelse.
+CD
+CD Dette er et sett med strukturer som er kjedet sammen til en komplett
+CD beskrielse av en flate. Eksempel på bruk er gitt under $LENKE<LC_POL_GetRef>.
+CD
+CD
+CD !-----------------!
+CD ! LC_POLYGON !
+CD ! ! !-------------------------!
+CD ! !- Omkrets --! ! ! !-----------------! !---------------!
+CD ! !LC_POL_OMKR ! ! ! !-!LC_POL_ELEMENT ! !-!LC_POL_ELEMENT !
+CD ! ! ! ! ! ! ! - Bgr ! ! ! - Bgr !
+CD ! !- Siste !--!-------! ! ! - Snr ! ! ! - Snr !
+CD ! !- Første !--!---------! ! - Retning ! ! ! - Retning !
+CD ! !------------! ! ! - Forrige (NULL)! ! ! - Forrige !
+CD ! !- Hull ------! ! ! - Neste !-! ! - Neste (NULL)!
+CD ! !LC_OY_ADM ! ! !-----------------! !---------------!
+CD ! ! ! !
+CD ! !- Første øy !-!-!
+CD !-!-!- Siste øy ! ! !
+CD ! ! !-------------! ! !
+CD ! !-----------------! !
+CD ! !-----------------!
+CD ! ! !------------------------!
+CD ! ! !------------! ! !-----------------! !---------------!
+CD ! !--------------! !-!LC_POL_OMKR ! ! !-!LC_POL_ELEMENT !!!LC_POL_ELEMENT !
+CD ! !LC_OY_ELEMENT ! ! ! ! ! ! ! - Bgr !!! - Bgr !
+CD ! !- Omkrets !--! !- Siste !-! ! ! - Snr !!! - Snr !
+CD ! !- Neste !-! !- Første !---! ! - Retning !!! - Retning !
+CD ! !--------------! ! !------------! ! - Forrige (NULL)!!! - Forrige !
+CD ! ! ! - Neste !!! - Neste (NULL)!
+CD ! ! !-----------------! !---------------!
+CD ! !
+CD ! !---------------! !--------------------------!
+CD ! ! !------------! ! !-----------------! !---------------!
+CD ! !--------------! !-!LC_POL_OMKR ! ! !-!LC_POL_ELEMENT ! !-!LC_POL_ELEMENT !
+CD !--!LC_OY_ELEMENT ! ! ! ! ! ! ! - Bgr ! ! ! - Bgr !
+CD !- Omkrets !--! !- Siste !-! ! ! - Snr ! ! ! - Snr !
+CD !- Neste (NULL)! !- Første !---! ! - Retning ! ! ! - Retning !
+CD !--------------! !------------! ! - Forrige (NULL)! ! ! - Forrige !
+CD ! - Neste !-! ! - Neste (NULL)!
+CD !-----------------! !---------------!
+*/
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Polygon element (ett for hver gruppe i polygonbeskrivelsen) !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_POL_ELEMENT {
+ LC_BGR Bgr; /* Gruppenummer */
+ short sRetning; /* LC_MED_DIG eller LC_MOT_DIG */
+ long lSnr; /* Serienummer */
+ LC_KOORD_2D Pkt; /* (ø,n) Representasjonspunkt (Brukes ikke av FYBA. Til disp.) */
+ struct dLC_POL_ELEMENT *pNestePE; /* Peker til neste element i polygonet */
+ struct dLC_POL_ELEMENT *pForrigePE; /* Peker til forrige element i polygonet */
+} LC_POL_ELEMENT;
+
+/*
+ *!----------------------------------------------------------------------!
+ *! Adm. blokk for polygon (en for hver lukket "del", omkrets eller øy) !
+ *!----------------------------------------------------------------------!
+ */
+typedef struct dLC_POL_OMKR {
+ LC_POL_ELEMENT *pForstePE;
+ LC_POL_ELEMENT *pSistePE;
+} LC_POL_OMKR;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Øy (i polygon) element (en for hver øy) !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_OY_ELEMENT{
+ LC_POL_OMKR PO; /* Administrasjonsblokk til kjede som beskriv øyavgrensinga */
+ struct dLC_OY_ELEMENT *pNesteOE; /* Peker til neste øyelement i polygonet */
+ struct dLC_OY_ELEMENT *pForrigeOE; /* Peker til forrige øyelement i polygonet */
+} LC_OY_ELEMENT;
+
+/*
+ *!------------------------------------------------------------------------!
+ *! Adm. blokk for øy (i polygon) element (en for alle øyene i en flate) !
+ *!------------------------------------------------------------------------!
+ */
+typedef struct dLC_OY_ADM{
+ LC_OY_ELEMENT *pForsteOE; /* Første øy (hull) */
+ LC_OY_ELEMENT *pSisteOE; /* Siste øy (hull) */
+} LC_OY_ADM;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Adm blokk for Polygon (En for hver flate, inkl øyer) !
+ *!--------------------------------------------------------------!
+ */
+
+typedef struct dLC_POLYGON {
+ LC_POL_OMKR HovedPO; /* Adm blokk for kjede som beskriver ytre avgrensing */
+ LC_OY_ADM OyOA; /* Kjede som beskriver hull i flata */
+} LC_POLYGON;
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyho.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short HO_New(const char *pszFil,short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d,
+ double nv_a,double nv_n,double oh_a,double oh_n);
+SK_EntPnt_FYBA short HO_TestSOSI(const char *pszFil,UT_INT64 *sluttpos);
+SK_EntPnt_FYBA char *HO_GetVal(const char *pszFil,char *sosi_navn,short *sett_nr);
+SK_EntPnt_FYBA short HO_GetKvalitet(const char *pszFil,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet);
+SK_EntPnt_FYBA short HO_GetTrans(const char *pszFil,short *koosys,double *origo_a,
+ double *origo_n,double *enhet,double *enhet_h,double *enhet_d);
+SK_EntPnt_FYBA short HO_GetTransEx(const char *pszFil,unsigned short *pusMaske, LC_TRANSPAR *pTrans);
+SK_EntPnt_FYBA short HO_GetOmr(const char *pszFil,double *nv_a,double *nv_n,double *oh_a,double *oh_n);
+SK_EntPnt_FYBA short HO_GetTegnsett(const char *pszFil,short *psTegnsett);
+SK_EntPnt_FYBA short HO_SjekkTegnsett(const char *pszFil,short *psTegnsett);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylh.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short LC_GetTrans(short *koosys,double *origo_a,double *origo_n,double *enhet,
+ double *enhet_h,double *enhet_d);
+SK_EntPnt_FYBA short LC_GetTransEx(unsigned short *pusMaske, LC_TRANSPAR *pTrans);
+SK_EntPnt_FYBA short LC_PutTrans(short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d);
+SK_EntPnt_FYBA short LC_PutTransEx(unsigned short usMaske, LC_TRANSPAR *pTrans);
+SK_EntPnt_FYBA short LC_GetTegnsett(short *psTegnsett);
+SK_EntPnt_FYBA short LC_GetOmr(double *nv_a,double *nv_n,double *oh_a,double *oh_n);
+SK_EntPnt_FYBA short LC_PutOmr(double nv_a,double nv_n,double oh_a,double oh_n);
+SK_EntPnt_FYBA void LC_NyttHode(void);
+SK_EntPnt_FYBA short LC_TestHode(void);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylo.c */
+/* ======================================================= */
+SK_EntPnt_FYBA void LC_Init(void);
+SK_EntPnt_FYBA void LC_Close(void);
+SK_EntPnt_FYBA LC_BASEADM* LC_OpenBase(short sBaseType);
+SK_EntPnt_FYBA void LC_CloseBase(LC_BASEADM *pBase,short s_stat);
+SK_EntPnt_FYBA short LC_OpenSos(const char *fil,short sModus,short sNyIdx,short sVisStatus,
+ LC_FILADM **ppFil, short *o_stat);
+SK_EntPnt_FYBA void LC_CloseSos(LC_FILADM *pFil,short s_stat);
+SK_EntPnt_FYBA void LC_FcloseSos(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_SetDefLpfi(short ant_tegn);
+SK_EntPnt_FYBA short LC_InqDefLpfi(void);
+SK_EntPnt_FYBA short LC_InqLag(unsigned short *usLag);
+SK_EntPnt_FYBA unsigned short LC_InqFilLag(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_SetFilLag(LC_FILADM *pFil,unsigned short usLag);
+SK_EntPnt_FYBA short LC_Backup(LC_FILADM *pFil,const char *pszBackupPath);
+SK_EntPnt_FYBA void LC_MaxSkriv(long);
+SK_EntPnt_FYBA long LC_InqMaxSkriv(void);
+SK_EntPnt_FYBA void LC_SetNgisModus(short modus);
+SK_EntPnt_FYBA short LC_GetNgisModus(void);
+SK_EntPnt_FYBA void LC_SetUtvidModus(short modus);
+SK_EntPnt_FYBA short LC_GetUtvidModus(void);
+SK_EntPnt_FYBA LC_BASEADM* LC_InqCurBase(void);
+SK_EntPnt_FYBA void LC_SelectBase(LC_BASEADM *pBase);
+SK_EntPnt_FYBA short LC_GetBaOm(unsigned short usLag,double *nva,double *nvn,double *oha,double *ohn);
+SK_EntPnt_FYBA short LC_GetFiOm(LC_FILADM *pFil,double *nva,double *nvn,double *oha,double *ohn);
+SK_EntPnt_FYBA LC_FILADM * LC_GetFiNr(const char *fil_navn);
+SK_EntPnt_FYBA char *LC_GetFiNa(LC_FILADM *pFil);
+SK_EntPnt_FYBA short LC_ErFilBase(const char *fil);
+SK_EntPnt_FYBA short LC_ErKoordsysLik(void);
+SK_EntPnt_FYBA short LC_ErVertdatumLik(void);
+SK_EntPnt_FYBA char* LC_GetNgisLag(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_SetEndringsstatus(short sStatus);
+SK_EntPnt_FYBA void LC_SetFilType(LC_FILADM *pFil, short sType);
+SK_EntPnt_FYBA short LC_GetFilType(LC_FILADM *pFil);
+SK_EntPnt_FYBA short LC_SetIdxPath(const char *pszIdxPath);
+SK_EntPnt_FYBA const char* LC_GetIdxPath(void);
+/* Konstanter for intgt.sEndra (aktuell gruppe er endra) */
+#define END_UENDRA 0 /* Ikke endra */
+#define END_KOPI 1 /* Endra ved totalkopi fra annen gruppe */
+#define END_ENDRA 2 /* Endra ved normal Put fra program */
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylx.c */
+/* ======================================================= */
+#define GRF_YTRE 0x01 /* Ytre avgrensing */
+#define GRF_INDRE 0x02 /* Indre avgrensing, øyer */
+#define LC_MED_DIG 0x01 /* Brukes MED dig retning */
+#define LC_MOT_DIG 0x02 /* Brukes MOT dig retning */
+#define GRF_START_OY 0x04 /* Første gruppe i øy */
+#define GRF_SLUTT_OY 0x08 /* Siste gruppe i øy */
+
+SK_EntPnt_FYBA long LC_InqAntRef(void);
+SK_EntPnt_FYBA void LC_InitGetRefFlate(LC_GRF_STATUS *pGrfStat);
+SK_EntPnt_FYBA long LC_GetRefFlate(LC_GRF_STATUS *RefStat,unsigned short sHent,long *ref_array,
+ unsigned char *ref_status,long max_ref);
+SK_EntPnt_FYBA short LC_PutRef(long *ref_array,long ant_ref);
+SK_EntPnt_FYBA long LC_GetRef(long *ref_array,long max_ref,short *gilin,short *refpos);
+
+SK_EntPnt_FYBA short LC_GetBuePar(short buff_retning, double *as, double *ns, double *radius,
+ double *fi, double *dfi, short *sfeil);
+SK_EntPnt_FYBA short LC_GetBue(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *radius,short *storbue);
+SK_EntPnt_FYBA short LC_GetBuep(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3);
+SK_EntPnt_FYBA short LC_GetSirkel(double *as,double *ns,double *radius);
+SK_EntPnt_FYBA short LC_GetSirkelp(double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3);
+
+SK_EntPnt_FYBA void LC_GetCurEnhet(LC_FILADM * pFil,short *nivaa, double *enhet,
+ double *enhet_h, double *enhet_d);
+SK_EntPnt_FYBA short LC_UpdateGiEnhet(LC_FILADM *pFil,double enhet,double enhet_h,double enhet_d);
+
+SK_EntPnt_FYBA short LC_GetKvalitet(short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet);
+SK_EntPnt_FYBA short LC_GetCurKvalitet(LC_FILADM *pFil,short *nivaa,long pnr,
+ short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet);
+SK_EntPnt_FYBA short LC_UpdateGiKvalitet(LC_FILADM *pFil,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet);
+SK_EntPnt_FYBA short LC_UpdatePiKvalitet(LC_FILADM *pFil,long pnr,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet);
+
+SK_EntPnt_FYBA char * LC_GetGP(const char *,short *,short);
+SK_EntPnt_FYBA short LC_PutGP(const char *sosi_navn,const char *verdi,short *linje_nr);
+SK_EntPnt_FYBA short LC_AppGP(const char *sosi_navn,const char *verdi,short *linje_nr);
+SK_EntPnt_FYBA short LC_UpdateGP(short linje_nr,const char *sosi_navn,const char *verdi);
+SK_EntPnt_FYBA void LC_InitPP(char *sosi_navn,long forste_punkt,long siste_punkt,
+ LC_GETPP_STATUS *pp_status);
+SK_EntPnt_FYBA char * LC_GetPP(long *punkt,LC_GETPP_STATUS *pp_stat);
+SK_EntPnt_FYBA char * LC_GetPiVerdi(const char *pszSosiNavn,long sPnr,short *sSettNr);
+SK_EntPnt_FYBA short LC_TestPi(long punkt_nr,short sTestHoyde);
+SK_EntPnt_FYBA short LC_FinnKp(long *forste_punkt,long siste_punkt,short *kp);
+SK_EntPnt_FYBA long LC_GetSn(void);
+SK_EntPnt_FYBA void LC_PutSn(long snr);
+SK_EntPnt_FYBA char * LC_GetGi(short gilin);
+SK_EntPnt_FYBA void LC_PutGi(short gilin,const char *ginfo);
+SK_EntPnt_FYBA void LC_GetTK(long pkt,double *aust,double *nord);
+SK_EntPnt_FYBA void LC_GetArrayTK(short retning,long max_antall,long fra_punkt,
+ double *aust,double *nord,long *antall);
+SK_EntPnt_FYBA void LC_GetArrayTH(short retning,long max_antall,long fra_punkt,
+ double *hoyde,long *antall);
+SK_EntPnt_FYBA void LC_PutTK(long punkt_nr,double aust,double nord);
+SK_EntPnt_FYBA double LC_GetTH(long pkt);
+SK_EntPnt_FYBA void LC_PutTH(long pkt,double hoyde);
+SK_EntPnt_FYBA double LC_GetHoyde(long punkt_nr);
+SK_EntPnt_FYBA void LC_PutTD(long punkt_nr, double dybde);
+SK_EntPnt_FYBA double LC_GetTD(long punkt_nr);
+SK_EntPnt_FYBA double LC_GetDybde(long punkt_nr);
+SK_EntPnt_FYBA char * LC_GetPi(long pkt);
+SK_EntPnt_FYBA short LC_PutPi(long pkt,const char *pi);
+SK_EntPnt_FYBA short LC_GetKp(long pkt);
+SK_EntPnt_FYBA void LC_PutKp(long pkt,short kp);
+SK_EntPnt_FYBA double LC_BerAreal(void);
+SK_EntPnt_FYBA double LC_BerLengde(void);
+SK_EntPnt_FYBA bool LC_BerLengde3D(double *skraa_lengde);
+SK_EntPnt_FYBA double LC_BerAvgrensLengde(void);
+SK_EntPnt_FYBA double LC_BerIndreAvgrensLengde(void);
+SK_EntPnt_FYBA double LC_BerYtreAvgrensLengde(void);
+SK_EntPnt_FYBA void LC_DumpTab(void);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylb.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short LC_GetGrFi(LC_FILADM **ppFil);
+SK_EntPnt_FYBA void LC_InitNextFil(LC_FILADM **ppFil);
+SK_EntPnt_FYBA short LC_NextFil(LC_FILADM **ppFil,unsigned short usLag);
+SK_EntPnt_FYBA void LC_InitNextBgr(LC_BGR * pBgr);
+SK_EntPnt_FYBA short LC_NextBgr(LC_BGR * pBgr,unsigned short usLag);
+SK_EntPnt_FYBA short LC_InqAntFiler(unsigned short usLag);
+SK_EntPnt_FYBA short LC_GetGrNr(LC_BGR * pBgr);
+SK_EntPnt_FYBA const char *LC_GetObjtypeBgr(LC_BGR * pBgr);
+SK_EntPnt_FYBA short LC_GetGrPara(short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_GetGrParaBgr(LC_BGR * pBgr,short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_RsGr(short *rstat,LC_FILADM *pFil,short *ngi,long *nko,
+ unsigned short *info,long *gml_snr);
+SK_EntPnt_FYBA short LC_RsHode(LC_FILADM *pFil,short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA void LC_WsGr(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_WsGrPart(LC_FILADM *pFil,long fra_punkt,long antall);
+SK_EntPnt_FYBA short LC_EndreHode(LC_FILADM *pFil);
+SK_EntPnt_FYBA short LC_RxGr(LC_BGR * pBgr,short les_sosi,short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_WxGr(short k_stat);
+SK_EntPnt_FYBA void LC_RoundKoord(void);
+SK_EntPnt_FYBA long LC_FiLastGr(LC_FILADM *pFil);
+SK_EntPnt_FYBA short LC_NyGr (LC_FILADM *pFil,char *sosi,LC_BGR * pBgr,long *snr);
+SK_EntPnt_FYBA short LC_CopyGr (LC_BGR * pBgr,short ngis,short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_CopyCoord(LC_BGR * pBgr,short retning,long til_linje,short *ngi,
+ long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_DelGr(void);
+SK_EntPnt_FYBA void LC_SnuGr(void);
+SK_EntPnt_FYBA short LC_SplittGr (long p1,long p2,LC_BGR * pBgr2);
+SK_EntPnt_FYBA short LC_SammenfoyGr(LC_BGR * pFraBgr,short retning,short plassering,short metode,
+ short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA void LC_ErstattReferanse (LC_FILADM *pFil,long lGmlSnr,long lNyttSnr, bool bSammeRetning);
+
+
+ /* Konstanter for SammenfoyGr() */
+#define LC_SG_FORRAN 1 /* Heng den andre gruppen inn forran første koordinat */
+#define LC_SG_BAK 2 /* Heng den andre gruppen inn etter siste koordinat */
+#define LC_SG_BEHOLD 3 /* Begge sammenføyings-punktene beholdes */
+#define LC_SG_FJERN 4 /* Bare det ene av sammenføyings-punktene beholdes */
+
+
+SK_EntPnt_FYBA short LC_InsGiL (short linje, short antall);
+SK_EntPnt_FYBA short LC_AppGiL (void);
+SK_EntPnt_FYBA short LC_DelGiL (short linje, short antall);
+SK_EntPnt_FYBA short LC_DelGiNavn(char *pszEgenskapNavn);
+SK_EntPnt_FYBA long LC_InsKoL (long linje, long antall);
+SK_EntPnt_FYBA long LC_AppKoL (void);
+SK_EntPnt_FYBA long LC_DelKoL (long linje, long antall);
+SK_EntPnt_FYBA void LC_Save (void);
+SK_EntPnt_FYBA void LC_OppdaterEndret(short endring);
+ #define O_GINFO 0 /* Oppdater tabeller i forhold til GINFO */
+ #define O_ENDRET 1 /* Merk for endret og oppdat. tab. */
+ #define O_SLETTET 2 /* Merk for slettet og oppdat. tab. */
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyli.c */
+/* ======================================================= */
+/* Brukttabellen */
+SK_EntPnt_FYBA void LC_SetBt(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA void LC_ClrBt(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA short LC_GetBt(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA void LC_EraseBt(short fra_kol,short til_kol);
+SK_EntPnt_FYBA void LC_CopyBt(short fra_kol,short til_kol,short operasjon);
+SK_EntPnt_FYBA void LC_SetModusMerk(unsigned short usModus);
+SK_EntPnt_FYBA long LC_MerkGr(short sKolonne,short sBryter);
+SK_EntPnt_FYBA void LC_ClrPrioritet(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA void LC_SetPrioritet(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA short LC_InqPrioritet(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA void LC_ErasePrioritet(LC_BGR * pGr);
+SK_EntPnt_FYBA void LC_EraseAllPrioritet(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_DumpBt(const char *pszMelding);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyld.c */
+/* ======================================================= */
+SK_EntPnt_FYBA void LC_DelIdx(char *szSosFil);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyta.c */
+/* ======================================================= */
+/* Tabellsystemet */
+SK_EntPnt_FYBA short LC_InitTabel(long n_rec,short rec_len,void *buffer);
+SK_EntPnt_FYBA short LC_PutTabel(long linje,void *buffer);
+SK_EntPnt_FYBA short LC_GetTabel(long linje,void *buffer);
+SK_EntPnt_FYBA void LC_CloseTabel(void);
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyln.c */
+/* ======================================================= */
+SK_EntPnt_FYBA char *LC_FormatterKvalitet(short sMetode,long lNoyaktighet,short sSynbarhet,
+ short sHoydeMetode,long lHoydeNoyaktighet);
+SK_EntPnt_FYBA short LC_FinnNivo(const char *pszNavn);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyls.c */
+/* ======================================================= */
+SK_EntPnt_FYBA void LC_SBSn(LC_SNR_ADM *pSnrAdm,LC_FILADM *pFil,long lMinSnr,long lMaxSnr);
+SK_EntPnt_FYBA short LC_MoveSn(LC_SNR_ADM *pSnrAdm,long lSnr,LC_BGR * pBgr);
+SK_EntPnt_FYBA short LC_FiSn(LC_FILADM *pFil,long lSnr,LC_BGR * pBgr);
+SK_EntPnt_FYBA void LC_FiArraySn(LC_FILADM *pFil,short antall,long *snr,long *bgr);
+SK_EntPnt_FYBA long LC_FASn(LC_SNR_ADM *pSnrAdm);
+SK_EntPnt_FYBA short LC_FFSn(LC_SNR_ADM *pSnrAdm,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FNSn(LC_SNR_ADM *pSnrAdm,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FPSn(LC_SNR_ADM *pSnrAdm,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FLSn(LC_SNR_ADM *pSnrAdm,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FFSnBt(LC_SNR_ADM *pSnrAdm,short kolonne,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FNSnBt(LC_SNR_ADM *pSnrAdm,short kolonne,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FPSnBt(LC_SNR_ADM *pSnrAdm,short kolonne,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FLSnBt(LC_SNR_ADM *pSnrAdm,short kolonne,LC_BGR *pBgr);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylr.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short LC_GetGrWin(LC_BGR *pBgr,double *nva,double *nvn,double *oha,double *ohn);
+/* Flate-søk */
+SK_EntPnt_FYBA void LC_SBFlate(LC_GEO_STATUS *pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n);
+SK_EntPnt_FYBA short LC_FFFlate(LC_GEO_STATUS *pGeoStat,LC_BGR * pBgr);
+SK_EntPnt_FYBA short LC_FNFlate(LC_GEO_STATUS *pGeoStat,LC_BGR * pBgr);
+/* Geografisk søk primær gruppe */
+SK_EntPnt_FYBA void LC_SBGeo(LC_GEO_STATUS *pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n);
+SK_EntPnt_FYBA short LC_FFGeo(LC_GEO_STATUS *pGeoStat,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FNGeo(LC_GEO_STATUS *pGeoStat,LC_BGR *pBgr);
+SK_EntPnt_FYBA long LC_FAGeo(LC_GEO_STATUS *pGeoStat);
+SK_EntPnt_FYBA short LC_FFGeoFil(LC_GEO_STATUS *pGeoStat,LC_FILADM *pFil,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FNGeoFil(LC_GEO_STATUS *pGeoStat,LC_FILADM *pFil,LC_BGR *pBgr);
+SK_EntPnt_FYBA void LC_AvsluttSok(LC_GEO_STATUS *pGeoStat);
+
+/* Vindustest mm */
+SK_EntPnt_FYBA short LC_WTst(double nva,double nvn,double oha,double ohn);
+SK_EntPnt_FYBA short LC_PTst(double a,double n);
+SK_EntPnt_FYBA short LC_PTstOmkrets(double a,double n);
+
+/* Debugformål */
+SK_EntPnt_FYBA void LC_DumpGeoRtre(LC_FILADM *pFil);
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylu.c */
+/* ======================================================= */
+SK_EntPnt_FYBA LC_UT_ADM * LC_OpenQuery(void);
+SK_EntPnt_FYBA void LC_CloseQuery(LC_UT_ADM *pUtAdm);
+//SK_EntPnt_FYBA short LC_PutQueryLine(LC_UT_ADM *pUtAdm,char *qulin);
+SK_EntPnt_FYBA short LC_PutQueryLine(LC_UT_ADM *pUtAdm,const char *qulin,short sType);
+SK_EntPnt_FYBA void LC_PutQueryRegel(LC_UTVALG *pU,const char *navn);
+SK_EntPnt_FYBA short LC_LesUtvalg(LC_UT_ADM *pUtAdm,const char *pszKomFil);
+SK_EntPnt_FYBA char *LC_GetUtRegelNavn(LC_UT_ADM *pUtAdm,short *ist);
+SK_EntPnt_FYBA char *LC_GruppeUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *sstat,char **regelnavn);
+SK_EntPnt_FYBA short LU_GiTestUtvalg(LC_UT_ADM *pUtAdm,LC_UTVALG * pU);
+SK_EntPnt_FYBA void LC_PunktUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *psStat,long lPnr,char **ppszRegel);
+SK_EntPnt_FYBA LC_UTVALG *LC_FinnPinfoUtvalg(LC_UT_ADM *pUtAdm,const char *pszNavn);
+SK_EntPnt_FYBA short LC_PiTestUtvalg(LC_UT_ADM *pUtAdm,LC_UTVALG * pU,long lPnr);
+SK_EntPnt_FYBA short LC_GiQuery(LC_UT_ADM *pUtAdm);
+SK_EntPnt_FYBA long LC_FAGiQuery(LC_UT_ADM *pUtAdm,unsigned short usLag);
+SK_EntPnt_FYBA long LC_FAPiQuery(LC_UT_ADM *pUtAdm,unsigned short usLag);
+SK_EntPnt_FYBA long LC_FAGiKombinertFlateQuery(LC_UT_ADM *pUtAdmFlate,LC_UT_ADM *pUtAdmOmkrets,
+ unsigned short usLag,short sMetode);
+SK_EntPnt_FYBA short LC_QueryGP(char *qulin,unsigned short iniv,unsigned short *univ,short *ulin,char **para);
+SK_EntPnt_FYBA short LC_InqMaxPrioritet(LC_UT_ADM *pUA);
+SK_EntPnt_FYBA short LC_TestPrioritetBrukt(LC_UT_ADM *pUtAdm,short sPrioritet);
+SK_EntPnt_FYBA void LC_UtvalgPrioritet(LC_UT_ADM *pUtAdm);
+SK_EntPnt_FYBA void LC_LoggPrioritetUtvalg(LC_UT_ADM *pUtAdm);
+SK_EntPnt_FYBA void LU_FrigiUE(LC_UTVALG_ELEMENT *pUE);
+SK_EntPnt_FYBA short LU_AppUE (LC_UTVALG *pU,short sNiv,const char *pszTx);
+SK_EntPnt_FYBA void LC_PutLag(LC_UT_ADM *pUtAdm,LC_UTVALG *pU,const char *navn);
+SK_EntPnt_FYBA bool LC_ErLik_Avrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet);
+SK_EntPnt_FYBA bool LC_ErLik_IkkeAvrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet);
+SK_EntPnt_FYBA bool LC_ErReferert(void);
+SK_EntPnt_FYBA long LC_ErReferertFraAntall(void);
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylp.c */
+/* ======================================================= */
+SK_EntPnt_FYBA void LC_POL_InitPolygon(LC_POLYGON *pPolygon);
+SK_EntPnt_FYBA void LC_POL_FrigiPolygon(LC_POLYGON *pPolygon);
+
+SK_EntPnt_FYBA void LC_POL_InitOmkrets(LC_POL_OMKR *pPO);
+SK_EntPnt_FYBA LC_POL_ELEMENT * LC_POL_LeggTilGruppeOmkrets(LC_POL_OMKR *pPO,LC_BGR *pBgr,short sRetning,long lSnr);
+SK_EntPnt_FYBA void LC_POL_FjernSisteGruppeOmkrets(LC_POL_OMKR *pPO);
+SK_EntPnt_FYBA void LC_POL_FjernGruppeOmkrets(LC_POL_OMKR *pPO, LC_POL_ELEMENT *pPE);
+SK_EntPnt_FYBA void LC_POL_FrigiOmkrets(LC_POL_OMKR *pPO);
+
+SK_EntPnt_FYBA void LC_POL_InitOy(LC_OY_ADM *pOA);
+SK_EntPnt_FYBA void LC_POL_FrigiAlleOyer(LC_OY_ADM *pOA);
+SK_EntPnt_FYBA void LC_POL_FjernOy(LC_OY_ADM *pOA,LC_OY_ELEMENT *pOE);
+SK_EntPnt_FYBA void LC_POL_LeggTilOy(LC_OY_ADM *pOA,LC_POL_OMKR *pPO);
+
+SK_EntPnt_FYBA short LC_POL_TestBrukt(LC_POLYGON *pPolygon,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_POL_PutRef(LC_POLYGON *pPolygon);
+SK_EntPnt_FYBA void LC_POL_GetRef(LC_POLYGON *pPolygon);
+SK_EntPnt_FYBA void LC_POL_GetRefOmkrets(LC_POL_OMKR *pPO);
+SK_EntPnt_FYBA short LC_POL_PTst(LC_POLYGON *pPolygon,double a,double n);
+SK_EntPnt_FYBA short LC_POL_PTstOmkrets(LC_POL_OMKR *pPO,double a,double n);
+SK_EntPnt_FYBA short LC_POL_OmkretsSkjaering(LC_POL_OMKR *pPO,double a,double n);
+SK_EntPnt_FYBA void LC_POL_Box(LC_POL_OMKR *pPO,double *nva,double *nvn, double *oha,double*ohn);
+SK_EntPnt_FYBA short LC_ErLinjeRefLin(char *pszSosiLin, short sRefLin);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyln.c */
+/* ======================================================= */
+SK_EntPnt_FYBA const char *LC_GetElementNavn(LC_FILADM *pFil,short sNavnNr,bool *bBrukt);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyba.c */
+/* ======================================================= */
+SK_EntPnt_FYBA char *LC_InqVer(void);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyle.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short LC_StrError(short feil_nr,char **feilmelding);
+
+SK_EntPnt_FYBA void LC_SetErrorHandler(void (*f) (short,const char*,const char*));
+SK_EntPnt_FYBA void LC_SetStartMessageHandler(void (*f)(const char*));
+SK_EntPnt_FYBA void LC_SetShowMessageHandler(void (*f)(double));
+SK_EntPnt_FYBA void LC_SetEndMessageHandler(void (*f)(void));
+SK_EntPnt_FYBA void LC_SetCancelHandler(short (*f)(void));
+
+//////////////////////////////////////////////////////////////////////////
+//
+// Når FYBA brukes som LIB må følgende funksjoner finnes definert
+//
+//////////////////////////////////////////////////////////////////////////
+void LC_Error (short ifeilnr, const char logtx[], const char vartx[]);
+void LC_StartMessage(const char *cfil);
+void LC_ShowMessage(double prosent);
+void LC_EndMessage(void);
+short LC_Cancel(void);
+
+//////////////////////////////////////////////////////////////////////////
+//
+// Når FYBA brukes som DLL må følgende funksjoner finnes definert.
+// Eksempel finnes i filen Fyba_Callback.cpp
+// Funksjonene aktiveres med LC_SetXxxxxHandler rutinene.
+// Hvis disse ikke blir aktivert brukes enkle rutiner som ligger i DLL-en.
+//
+//////////////////////////////////////////////////////////////////////////
+void LC_ErrorHandler (short ifeilnr, const char* logtx, const char* vartx);
+void LC_StartMessageHandler(const char *cfil);
+void LC_ShowMessageHandler(double prosent);
+void LC_EndMessageHandler(void);
+short LC_CancelHandler(void);
+
+
diff --git a/include/fygm.h b/include/fygm.h
new file mode 100644
index 0000000..b60a422
--- /dev/null
+++ b/include/fygm.h
@@ -0,0 +1,129 @@
+/******************************************************************************
+*
+* STATENS KARTVERK - FYSAK
+*
+* Filename: fygm.h
+*
+* Content: Prototyper for generelle geometrirutiner.
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+#pragma once
+
+#ifdef WIN32
+#ifdef _DEBUG
+ #pragma comment (lib, "GmD.lib")
+#else
+ #pragma comment (lib, "Gm.lib")
+#endif
+#endif
+
+#ifndef SK_EntPnt_GM
+# define SK_EntPnt_GM
+#endif
+
+
+/* --- Konstanter -- */
+//#define PI 3.14159265358979324
+#define PI 3.14159265358979323846
+#define PIHALV (PI/2.0)
+#define TOPI (PI*2.0)
+
+/* --- Makroer -- */
+#define Rad2Deg(Rad) ((Rad/PI)*180)
+#define Rad2Gon(Rad) ((Rad/PI)*200)
+
+#define Deg2Rad(Deg) ((Deg/180)*PI)
+#define Gon2Rad(Gon) ((Gon/200)*PI)
+
+
+/* ---- Funksjonsdefinisjoner for fygm.c -- */
+SK_EntPnt_GM short GM_sver(double ka,double kn,double la,double ln,double na,double nn,
+ double ma,double mn,double *sa,double *sn);
+SK_EntPnt_GM short GM_shor(double ka,double kn,double la,double ln,double na,double nn,
+ double ma,double mn,double *sa,double *sn);
+SK_EntPnt_GM short GM_sLinLin(double ka,double kn,double la,double ln,double ma,double mn,
+ double na,double nn,double *sa,double *sn);
+SK_EntPnt_GM short GM_Overlapp(double ka,double kn,double la,double ln,double ma,double mn,double na,double nn);
+SK_EntPnt_GM short GM_sVektVekt(double ka,double kn,double la,double ln,double ma,double mn,
+ double na,double nn,double *sa,double *sn);
+SK_EntPnt_GM short GM_sLinBue(double sa,double sn,double radius,double fi,double dfi,
+ double ka,double kn,double la,double ln,
+ double *a1,double *n1,double *a2,double *n2);
+SK_EntPnt_GM short GM_sVektSirk(double sa,double sn,double radius,
+ double ka,double kn,double la,double ln,
+ double *a1,double *n1,double *a2,double *n2);
+SK_EntPnt_GM short GM_sBueBue(double as1,double ns1,double radius1,double fi1,double dfi1,
+ double as2,double ns2,double radius2,double fi2,double dfi2,
+ double *a1,double *n1,double *a2,double *n2);
+SK_EntPnt_GM short GM_sSirkSirk(double as1,double ns1,double radius1,
+ double as2,double ns2,double radius2,
+ double *a1,double *n1,double *a2,double *n2);
+SK_EntPnt_GM short GM_fotp(double a1,double n1,double a2,double n2,double ap,double np,
+ double *af,double *nf);
+SK_EntPnt_GM short GM_fotp_ny(double a1, double n1, double a2, double n2, double ap, double np,
+ double *af, double *nf);
+SK_EntPnt_GM short GM_KonvBue(double a1,double n1,double a2,double n2,double radius,
+ short storbue,double *as,double *ns,double *fi,double *dfi);
+SK_EntPnt_GM short GM_KonvBuep(double a1,double n1,double a2,double n2,double a3,double n3,
+ double *as,double *ns,double *radius,double *fi,double *dfi);
+SK_EntPnt_GM short GM_KonvSirkel(double *fi,double *dfi);
+SK_EntPnt_GM short GM_KonvSirkelp(double a1,double n1,double a2,double n2,double a3,double n3,
+ double *as,double *ns,double *radius,double *fi,double *dfi);
+SK_EntPnt_GM short GM_bepa(double a1,double n1,double a2,double n2,
+ double *pa,double *pb,double *pc);
+SK_EntPnt_GM short GM_bepa3(double a1, double n1, double h1,
+ double a2, double n2, double h2,
+ double *pf, double *pg, double *ph);
+SK_EntPnt_GM short GM_cint(double pa1,double pb1,double pc1,double pa2,double pb2,
+ double pc2,double *as,double *ns);
+SK_EntPnt_GM short GM_wtst(double p1a,double p1n,double p2a,double p2n,
+ double wmina,double wminn,double wmaxa,double wmaxn);
+SK_EntPnt_GM short GM_wtstBue(double as,double ns,double radius,double fi,double dfi,
+ double wmina,double wminn,double wmaxa,double wmaxn);
+SK_EntPnt_GM short GM_wtstPunkt(double PktA, double PktN, double wa1, double wn1, double wa2, double wn2, double wa3, double wn3,
+ double wa4, double wn4);
+SK_EntPnt_GM short GM_Parallell(double ka,double kn,double la,double ln,double avstand,
+ double *ka1,double *kn1,double *la1,double *ln1);
+SK_EntPnt_GM double GM_Avstand(double as, double ns, double a, double n);
+SK_EntPnt_GM double GM_Avstand2(double a1, double n1, double a2, double n2);
+SK_EntPnt_GM double GM_Areal(double *pA, double *pN, short sNko);
+SK_EntPnt_GM double GM_retning(double ak,double nk,double al,double nl);
+SK_EntPnt_GM double GM_RetnGon(double a1, double n1, double a2, double n2);
+SK_EntPnt_GM double GM_Vinkel(double fi1, double fi2 );
+SK_EntPnt_GM double GM_RedVinkel(double fi );
+SK_EntPnt_GM void GM_RettvPol(double a1 , double n1, double a2, double n2,
+ double *gon, double *avst);
+SK_EntPnt_GM void GM_PolRettv(double *a , double *n, double gon, double avst);
+SK_EntPnt_GM void GM_buebox(double as,double ns,double radius,double fi,double dfi,
+ double *nva,double *nvn,double *oha,double *ohn);
+SK_EntPnt_GM short GM_NormVindu(double *nva,double *nvn,double *oha,double *ohn);
+SK_EntPnt_GM short GM_PktBue(double as,double ns,double fi,double dfi,
+ double a,double n,double *dfiPkt);
+SK_EntPnt_GM short GM_TestPktBue(double as,double ns,double fi,double dfi,
+ double a,double n);
+SK_EntPnt_GM short GM_BueTangent(double as, double ns, double fi, double dfi,
+ double radius, double a, double n, double *buetan);
+SK_EntPnt_GM short GM_BueTilKorder (double as,double ns,double r,double fi,double dfi,
+ double delta,short mpu,double *a_arr,double *n_arr);
+SK_EntPnt_GM void GM_PktTilOktagon (double dAs,double dNs,double dAreal,double *a_arr,double *n_arr);
+SK_EntPnt_GM void GM_TynnDared(double dMaxAvst,double dMaxPil,long *nko, double *pA,double *pN);
diff --git a/include/fyut.h b/include/fyut.h
new file mode 100644
index 0000000..abd515e
--- /dev/null
+++ b/include/fyut.h
@@ -0,0 +1,283 @@
+/******************************************************************************
+*
+* STATENS KARTVERK - FYSAK
+*
+* Filename: fyut.h
+*
+* Content: Prototyper for generelle hjelperutiner og operativsystemavhengige rutiner.
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+#pragma once
+
+
+
+#include <stdio.h>
+
+#ifndef SK_EntPnt_UT
+# define SK_EntPnt_UT
+#endif
+
+
+/* ----------------------------------------- Konstanter */
+/* Div. manifeste konstantar */
+
+#ifdef WIN32
+#ifdef _DEBUG
+ #pragma comment (lib, "UtD.lib")
+#else
+ #pragma comment (lib, "Ut.lib")
+#endif
+/* For DOS/OS2/Windows */
+# define UT_SLASH '\\'
+# define UT_STR_SLASH "\\"
+# define UT_INT64 __int64
+# define UT_SNPRINTF _snprintf_s
+# define UT_FPRINTF fprintf_s
+# define UT_GETPID _getpid
+
+#else
+ /* For UNIX */
+# ifdef LINUX /* specifically the LINUX */
+# include <stdint.h>
+# include <inttypes.h>
+# define UT_INT64 int64_t
+# endif
+
+# define UT_SNPRINTF snprintf
+# define UT_FPRINTF fprintf
+# define UT_GETPID getpid
+
+# define UT_SLASH '/'
+# define UT_STR_SLASH "/"
+# define cdecl
+# define EZERO 0
+
+# ifdef _FILE_OFFSET_BITS
+# undef _FILE_OFFSET_BITS
+# endif
+# define _FILE_OFFSET_BITS 64
+# include <limits.h>
+# include <sys/types.h>
+
+# ifdef WIN32
+# include <io.h>
+# else
+# include <unistd.h>
+# endif
+
+# define _TRUNCATE 0
+# define _fseeki64 fseek
+# define _ftelli64 ftell
+# define _strcmpi strcasecmp
+
+#endif
+
+#define UT_FALSE 0
+#define UT_TRUE 1
+#define UT_OVRFLW 2
+
+#define UT_NULL 0L
+
+#define UT_OK 0
+#define UT_EOF 1
+#define UT_ERROR -1
+#define UT_READ 0
+#define UT_WRITE 1
+#define UT_UPDATE 2
+#define UT_UNKNOWN 0
+#define UT_OLD 1
+#define UT_NEW 2
+
+/* Konstanter for UT_KonverterTegnsett */
+#define TS_UKJENT 0 /* Ukjent tegnsett */
+#define TS_DOSN8 1 /* DOS norsk 8-bits (standardverdi) */
+#define TS_ND7 2 /* Norsk Data 7-bits */
+#define TS_DECM8 4 /* DEC multinasjonal 8-bits */
+#define TS_DECN7 8 /* DEC norsk 7-bits */
+#define TS_ISO8859 16 /* ISO8859-10 (Samisk og norsk mm. ) */
+
+/* Div lengder for filnavn; jfr. stdlib.h */
+#define _MAX_PATH 260 /* max. length of full pathname */
+#define _MAX_DRIVE 3 /* max. length of drive component */
+#define _MAX_DIR 256 /* max. length of path component */
+#define _MAX_FNAME 256 /* max. length of file name component */
+#define _MAX_EXT 256 /* max. length of extension component */
+
+
+/* ----------------------------------------- Makroer */
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Oppdateringstid for fil !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dFTID {
+ unsigned short usAar;
+ unsigned short usMnd;
+ unsigned short usDag;
+ unsigned short usTime;
+ unsigned short usMin;
+ unsigned short usSek;
+} FTID;
+
+typedef FTID *PFTID;
+
+
+/* ----------------------------------------- Prototyper */
+
+SK_EntPnt_UT void UT_makepath(char *pathP,const char *driveP,const char *dirP,const char *nameP,const char *extP);
+SK_EntPnt_UT void UT_splitpath(const char *pathP,char *driveP,char *dirP,char *nameP,char *extP);
+SK_EntPnt_UT short UT_InqPathSize(char *pszPath,long *plSize);
+SK_EntPnt_UT short UT_InqPathSize_i64(char *pszPath,UT_INT64 *n64Size);
+SK_EntPnt_UT short UT_SetPathSize(char *pszPath,long lSize);
+SK_EntPnt_UT short UT_SetPathSize_i64(char *pszPath, UT_INT64 n64Size);
+SK_EntPnt_UT short UT_InqPathTid(char *pszPath,PFTID pFilTid);
+SK_EntPnt_UT short UT_InqAvailSize(char *pszPath,unsigned long *pulLedigPlass);
+SK_EntPnt_UT short UT_FullPath(char *pszBuffer, const char *pszPath, size_t maxlen);
+SK_EntPnt_UT short UT_DeleteFile(char *pszPath);
+SK_EntPnt_UT short UT_DeleteDir(char *pszPath);
+SK_EntPnt_UT short UT_CreateDir(char *pszPath);
+SK_EntPnt_UT short UT_FilnavnCmp(char *pszFil1,char *pszFil2);
+SK_EntPnt_UT short UT_CopyFile(char *pszFraFilnavn,char *pszTilFilnavn,short sFeilHvisEksisterer);
+
+
+/* Framhenting frå streng */
+SK_EntPnt_UT char *UT_GetToken (char *str, short *l_tok);
+SK_EntPnt_UT char UT_StrToken (char *str, short ii, short *iu, short mt, char *token);
+SK_EntPnt_UT char UT_StrWord (char *str, short ii, short *iu, short mw, char *word);
+SK_EntPnt_UT short UT_StrInt (char *str, short ii, short *iu, int *_int);
+SK_EntPnt_UT short UT_StrInt64 (char str[], short ii, short *iu, UT_INT64 *i64);
+SK_EntPnt_UT short UT_StrShort (char *str, short ii, short *iu, short *s);
+SK_EntPnt_UT short UT_StrLong (char *str, short ii, short *iu, long *_long);
+SK_EntPnt_UT short UT_StrUlong (char str[], short ii, short *iu, unsigned long *_ulong);
+SK_EntPnt_UT short UT_StrDbl (char *str, short ii, short *iu, char decpt,double *dbl);
+SK_EntPnt_UT void UT_StrCopy (char *tx_to, const char *tx_from, int tx_len);
+SK_EntPnt_UT short UT_StrCat (char *dst,const char *src, const int maxlen);
+SK_EntPnt_UT int UT_memcpy(void *dest,size_t numberOfElements,const void *src,size_t count);
+SK_EntPnt_UT int UT_strerror(char *buffer,size_t numberOfElements,int errnum);
+SK_EntPnt_UT char *UT_strtok(char *strToken,const char *strDelimit,char **context);
+
+
+/* Konvertering */
+#ifdef OS216
+SK_EntPnt_UT short UT_AtoI (char *str, int *_int);
+SK_EntPnt_UT short UT_AtoS (char str[], short *s);
+SK_EntPnt_UT short UT_AtoL (char str[], long *_long);
+#endif
+SK_EntPnt_UT short UT_AtoD (char *str, char decpt, double *d);
+SK_EntPnt_UT short UT_ItoA (int i, short sl, char *str);
+SK_EntPnt_UT short UT_StoA (short s, short mstr, char *str);
+SK_EntPnt_UT short UT_LtoA (long l, short sl, char *str);
+SK_EntPnt_UT short UT_DtoA (double d, short dec, char decpt, short sl, char *str);
+
+/* Strengmanipulering ellers */
+SK_EntPnt_UT char *UT_ClrCrlf (char *str);
+SK_EntPnt_UT char *UT_ClrTrailsp(char *str);
+SK_EntPnt_UT char *UT_ClrExtrasp(char *str);
+SK_EntPnt_UT void UT_JustStr (char justmode, char fill, short lstr, char *str);
+SK_EntPnt_UT short UT_Index (char *str, char *substr);
+SK_EntPnt_UT void UT_GetSubstr (char ctx[],short fra,short til,char sub[],short maxlen);
+SK_EntPnt_UT char *UT_StrLower (char *tx);
+SK_EntPnt_UT char *UT_StrUpper (char *tx);
+SK_EntPnt_UT int UT_StrCmpi(const char *pszTx1, const char *pszTx2);
+SK_EntPnt_UT int UT_StrColli(const char *pszTx1, const char *pszTx2);
+SK_EntPnt_UT unsigned char *UT_Ascii7to8 (unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_Ascii8to7 (unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_ISO8859toAscii8(unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_Ascii8toISO8859(unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_ISO8859toAscii7(unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_Ascii7toISO8859(unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_KonverterTegnsett(short sFraTegnsett,short sTilTegnsett,
+ unsigned char *pszTx);
+
+
+/* Andre teiknhandterings rutiner */
+SK_EntPnt_UT int UT_IsSpace (char c);
+SK_EntPnt_UT int UT_IsPrint (int ch);
+SK_EntPnt_UT int UT_IsLower (int ch);
+SK_EntPnt_UT int UT_IsUpper (int ch);
+SK_EntPnt_UT int UT_ToUpper (int ch);
+SK_EntPnt_UT int UT_ToLower (int ch);
+
+/* Matematiske funksjonar */
+SK_EntPnt_UT double UT_RoundDD (double d);
+SK_EntPnt_UT double UT_RoundHalfUpDD (double d);
+SK_EntPnt_UT int UT_RoundDI (double d);
+SK_EntPnt_UT unsigned int UT_RoundDUI (double d);
+SK_EntPnt_UT long UT_RoundDL (double d);
+SK_EntPnt_UT long long UT_RoundDLL (double d);
+SK_EntPnt_UT short UT_RoundDS (double d);
+
+/* Kalender/klokke-rutiner */
+SK_EntPnt_UT void UT_InqDate (short *date);
+SK_EntPnt_UT char *UT_InqDateString(void);
+SK_EntPnt_UT char *UT_InqDatetimeString(void);
+SK_EntPnt_UT void UT_InqTime (short *time);
+
+/* Høgnivå */
+SK_EntPnt_UT FILE *UT_OpenFile (const char *filnavn,const char *ftyp,
+ short facc,short exist,short *ierr);
+SK_EntPnt_UT short UT_ReadLine (FILE *pfil,short llin, char clin[]);
+SK_EntPnt_UT short UT_ReadLineCrlf (FILE *pfil,short llin, char clin[]);
+SK_EntPnt_UT short UT_ReadLineNoComm(FILE *pfil,short llin, char *clin);
+SK_EntPnt_UT short UT_WriteLine (FILE *pfil,char clin[]);
+SK_EntPnt_UT short UT_WriteLineCrlf(FILE *pfil,char clin[]);
+SK_EntPnt_UT short UT_SetPos (FILE *fi,long lpos);
+SK_EntPnt_UT short UT_SetPos_i64 (FILE *fi,UT_INT64 n64FilPos);
+SK_EntPnt_UT short UT_GetPos (FILE *fi,long *lpos);
+SK_EntPnt_UT short UT_GetPos_i64(FILE *fi,UT_INT64 *n64FilPos);
+SK_EntPnt_UT short UT_Save (FILE *pfil);
+
+/* Div. rutiner */
+SK_EntPnt_UT void UT_Bell (void);
+SK_EntPnt_UT void UT_Sound (short freq, short dur);
+SK_EntPnt_UT void UT_Pause (short dur);
+SK_EntPnt_UT unsigned long UT_InqFreemem (void);
+SK_EntPnt_UT char *UT_GetEnv (char *var, short mstr, char *str);
+SK_EntPnt_UT char *UT_MakeFysak ( char *str, short mstr, char *filename );
+SK_EntPnt_UT char *UT_MakeFysakPath ( char *str, short mstr, char *path, char *filename );
+SK_EntPnt_UT void UT_SortD(double *db_arr, short size);
+
+SK_EntPnt_UT unsigned long *UT_InitFlag(short sNlin);
+SK_EntPnt_UT void UT_CloseFlag(unsigned long *plFlag);
+SK_EntPnt_UT bool UT_SetFlag(unsigned long *plFlag,short sLine);
+SK_EntPnt_UT short UT_GetFlag(unsigned long *plFlag,short sLine);
+
+SK_EntPnt_UT short UT_StartProsess(char *pszCommandLine,short sVent);
+
+SK_EntPnt_UT short UT_PutAnfTegn(char *pszTx, char cTegn, short sMaksLen);
+
+
+/* --- Makroer -- */
+#define UT_MALLOC malloc
+#define UT_FREE free
+
+#define UT_VENT 1
+#define UT_FORTSETT 2
+
+
+
diff --git a/m4/.keep b/m4/.keep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/m4/.keep
diff --git a/src/FYBA/FYBA.cpp b/src/FYBA/FYBA.cpp
new file mode 100644
index 0000000..02da5ee
--- /dev/null
+++ b/src/FYBA/FYBA.cpp
@@ -0,0 +1,42 @@
+/*
+CH FYBA FYsak-Basesystem
+CD ==================================================================
+CD Rutiner for å lese, endre og skrive SOSI-filer.
+CD ==================================================================
+CD
+CH INSTALLERINGS- OG BRUKS-OPPLYSNINGER:
+CD
+CD Bibliotek..: fybale.lib
+CD Kildefiler.: fyba.c, fylo.c, fyln.c, fylr.c, fyls.c, fylx.c, fyli.c
+CD fylh.c, fyho.c, fyle.c, fyba.h, fybax.h
+CD Versjon....: D01
+CD Eier.......: STATENS KARTVERK / FYSAK-prosjektet
+CD Ansvarlig..: Andreas Røstad, Georg Langerak
+CD
+CD Kompilator.: Microsoft C versjon 6.0
+CD Optioner...: /c /AL /J /FPi /G2t /W4
+CD Memory-mod.: Large
+CD Floating-p.: Emulation
+CD Processor..: 80286
+CD
+CD #include...: fyba.h
+CD Linkes med.: utle.lib >= versjon D
+CD +llibce.lib >= versjon 6.0
+CD
+CD ==================================================================
+*/
+
+#include "stdafx.h"
+
+
+/*
+CH LC_InqVer Identifikasjon
+CD =============================================================================
+CD Formål:
+CD Henter versjons-identifikasjon for dette biblioteket.
+ =============================================================================
+*/
+SK_EntPnt_FYBA char *LC_InqVer(void)
+{
+ return FYBA_IDENT;
+}
diff --git a/src/FYBA/FYBA.sln b/src/FYBA/FYBA.sln
new file mode 100644
index 0000000..c7dc815
--- /dev/null
+++ b/src/FYBA/FYBA.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Express 2012 for Windows Desktop
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FYBA", "FYBA.vcxproj", "{26B83785-CE7C-47A5-8B4F-B830185AFFCF}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ SosiVis Debug|Win32 = SosiVis Debug|Win32
+ SosiVis Release|Win32 = SosiVis Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {26B83785-CE7C-47A5-8B4F-B830185AFFCF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {26B83785-CE7C-47A5-8B4F-B830185AFFCF}.Debug|Win32.Build.0 = Debug|Win32
+ {26B83785-CE7C-47A5-8B4F-B830185AFFCF}.Release|Win32.ActiveCfg = Release|Win32
+ {26B83785-CE7C-47A5-8B4F-B830185AFFCF}.Release|Win32.Build.0 = Release|Win32
+ {26B83785-CE7C-47A5-8B4F-B830185AFFCF}.SosiVis Debug|Win32.ActiveCfg = SosiVis Debug|Win32
+ {26B83785-CE7C-47A5-8B4F-B830185AFFCF}.SosiVis Debug|Win32.Build.0 = SosiVis Debug|Win32
+ {26B83785-CE7C-47A5-8B4F-B830185AFFCF}.SosiVis Release|Win32.ActiveCfg = SosiVis Release|Win32
+ {26B83785-CE7C-47A5-8B4F-B830185AFFCF}.SosiVis Release|Win32.Build.0 = SosiVis Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/FYBA/FYBA.vcxproj b/src/FYBA/FYBA.vcxproj
new file mode 100644
index 0000000..623e620
--- /dev/null
+++ b/src/FYBA/FYBA.vcxproj
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="SosiVis Debug|Win32">
+ <Configuration>SosiVis Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="SosiVis Release|Win32">
+ <Configuration>SosiVis Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{26B83785-CE7C-47A5-8B4F-B830185AFFCF}</ProjectGuid>
+ <RootNamespace>FYBA</RootNamespace>
+ <SccProjectName>
+ </SccProjectName>
+ <SccAuxPath>
+ </SccAuxPath>
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccProvider>
+ </SccProvider>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>11.0.50727.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <GenerateXMLDocumentationFiles>true</GenerateXMLDocumentationFiles>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Lib>
+ <OutputFile>$(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <Xdcmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Xdcmake>
+ <PostBuildEvent>
+ <Command>copy $(TargetPath) ..\..\Lib\$(ProjectName)D$(TargetExt)</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat />
+ </ClCompile>
+ <Lib>
+ <OutputFile>$(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <PostBuildEvent>
+ <Command>copy $(TargetPath) ..\..\Lib\$(ProjectName)$(TargetExt)</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat />
+ </ClCompile>
+ <Lib>
+ <OutputFile>..\..\Lib\$(ProjectName).lib</OutputFile>
+ </Lib>
+ <PostBuildEvent>
+ <Command>copy $(TargetPath) ..\..\Lib\$(ProjectName)$(TargetExt)</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <GenerateXMLDocumentationFiles>true</GenerateXMLDocumentationFiles>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Lib>
+ <OutputFile>..\..\Lib\$(ProjectName)D.lib</OutputFile>
+ </Lib>
+ <Xdcmake>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Xdcmake>
+ <PostBuildEvent>
+ <Command>copy $(TargetPath) ..\..\Lib\$(ProjectName)D$(TargetExt)</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="FYBA.cpp" />
+ <ClCompile Include="FYHO.cpp" />
+ <ClCompile Include="FYLB.cpp" />
+ <ClCompile Include="FYLD.cpp" />
+ <ClCompile Include="FYLE.cpp" />
+ <ClCompile Include="FYLH.cpp" />
+ <ClCompile Include="FYLI.cpp" />
+ <ClCompile Include="fyln.cpp" />
+ <ClCompile Include="FYLO.cpp" />
+ <ClCompile Include="FYLP.cpp" />
+ <ClCompile Include="FYLR.cpp" />
+ <ClCompile Include="FYLS.cpp" />
+ <ClCompile Include="FYLU.cpp" />
+ <ClCompile Include="FYLX.cpp" />
+ <ClCompile Include="FYTA.cpp" />
+ <ClCompile Include="stdafx.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">Create</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="fyba.h">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) ..\..\Include\*.*
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) ..\..\Include\*.*
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">copy %(FullPath) ..\..\Include\*.*
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">copy %(FullPath) ..\..\Include\*.*
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ </CustomBuild>
+ <ClInclude Include="FYBAX.H" />
+ <ClInclude Include="stdafx.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="FYBA.END" />
+ </ItemGroup>
+ <ItemGroup>
+ <Text Include="ReadMe.txt" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+ <ProjectExtensions>
+ <VisualStudio>
+ <UserProperties DevPartner_IsInstrumented="0" />
+ </VisualStudio>
+ </ProjectExtensions>
+</Project> \ No newline at end of file
diff --git a/src/FYBA/FYBA_DLL.cpp b/src/FYBA/FYBA_DLL.cpp
new file mode 100644
index 0000000..879ab83
--- /dev/null
+++ b/src/FYBA/FYBA_DLL.cpp
@@ -0,0 +1,25 @@
+// FYBA_DLL.cpp : Defines the entry point for the DLL application.
+//
+
+#ifdef WIN32
+
+#include "stdafx.h"
+#include "fyba.h"
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+ )
+{
+ switch (ul_reason_for_call)
+ {
+ case DLL_PROCESS_ATTACH:
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
+#endif
diff --git a/src/FYBA/FYHO.cpp b/src/FYBA/FYHO.cpp
new file mode 100644
index 0000000..64606c4
--- /dev/null
+++ b/src/FYBA/FYHO.cpp
@@ -0,0 +1,1456 @@
+/*
+AR-920214
+CH FYHO "Direkte" hoderutiner
+CD =================================================================
+CD
+CD Eier.......: STATENS KARTVERK / FYSAK-prosjektet
+CD Ansvarlig..: Georg Langerak / Andreas Røstad
+CD
+CD Rutiner for å handtere hodet på SOSI-filer direkte på filen.
+CD ==============================================================
+*/
+
+#include "stdafx.h"
+
+#include <math.h>
+#include <time.h>
+#include <ctype.h>
+#include <fcntl.h>
+
+
+/* --- Globale strukturer ---------------------- */
+extern LC_SYSTEMADM Sys;
+
+extern char retur_str[LC_MAX_SOSI_LINJE_LEN]; /* Returstreng */
+
+// ----- Lokale rutiner -----
+static short ho_TestFyllKommentar(const char *pszTx);
+
+/*
+AR:2000-10-07
+CH HO_GetTransEx Finner .TRANSPAR i hodet
+CD =============================================================================
+CD Formål:
+CD Henter ut innholdet under ..TRANSPAR fra fra filhodet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD unsigned short *pusMaske iu [Inn] Styrer hvilke deler av TRANSPAR som skal hentes
+CD [Ut] Viser hvilke deler av TRANSPAR som er funnet/hentet.
+CD Følgende konstanter er definert:
+CD LC_TR_ALLT - Alle deler av ..TRANSPAR hentes
+CD LC_TR_KOORDSYS - Koordsys
+CD LC_TR_TRANSSYS - Transsys
+CD LC_TR_GEOSYS - Geosys
+CD LC_TR_GEOKOORD - Geokoord
+CD LC_TR_ORIGO - Origo-nø
+CD LC_TR_ENHET - Enhet
+CD LC_TR_ENHETH - Enhet-h
+CD LC_TR_ENHETD - Enhet-d
+CD LC_TR_VERTDATUM - Vert-datum
+CD LC_TR_VERTINT - Vert-int
+CD LC_TR_VERTDELTA - Vert-delta
+CD
+CD LC_TRANSPAR * pTrans iu Peker til struktur som skal motta ..TRANSPAR informasjonen.
+CD short sStatus r Status: UT_TRUE=OK, UT_FALSE=feil (ikke funnet).
+CD
+CD Bruk:
+CD unsigned short usMaske = LC_TR_ALLT;
+CD LC_TRANSPAR Trans;
+CD ist = HO_GetTransEx("Test.sos",&usMaske,&Trans);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short HO_GetTransEx(const char *pszFil,unsigned short *pusMaske, LC_TRANSPAR * pTrans)
+{
+ short sStatus;
+ FILE * pFil;
+
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"SOS",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Hent verdier */
+ sStatus = ho_GetTransEx(pFil,pusMaske,pTrans);
+ fclose (pFil);
+
+ /* Åpningsfeil på kladdefilen */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_GetTransEx)",err().tx);
+ memset(pTrans,0,sizeof(LC_TRANSPAR));
+ *pusMaske = 0;
+ sStatus = UT_FALSE;
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR:2000-10-07
+CH ho_GetTransEx Finner .TRANSPAR i hodet
+CD =============================================================================
+CD Henter ut innholdet under ..TRANSPAR fra fra filhodet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD FILE *pFil i Filpeker til sosi-fil.
+CD unsigned short *pusMaske iu [Inn] Styrer hvilke deler av TRANSPAR som skal hentes
+CD [Ut] Viser hvilke deler av TRANSPAR som er funnet/hentet.
+CD Følgende konstanter er definert:
+CD LC_TR_ALLT - Alle deler av ..TRANSPAR hentes
+CD LC_TR_KOORDSYS - Koordsys
+CD LC_TR_TRANSSYS - Transsys
+CD LC_TR_GEOSYS - Geosys
+CD LC_TR_GEOKOORD - Geokoord
+CD LC_TR_ORIGO - Origo-nø
+CD LC_TR_ENHET - Enhet
+CD LC_TR_ENHETH - Enhet-h
+CD LC_TR_ENHETD - Enhet-d
+CD LC_TR_VERTDATUM - Vert-datum
+CD LC_TR_VERTINT - Vert-int
+CD LC_TR_VERTDELTA - Vert-delta
+CD
+CD LC_TRANSPAR * pTrans iu Peker til struktur som skal motta ..TRANSPAR informasjonen.
+CD short sStatus r Status: UT_TRUE=OK, UT_FALSE=feil (ikke funnet).
+CD
+CD Bruk:
+CD unsigned short usMaske = LC_TR_ALLT;
+CD LC_TRANSPAR Trans;
+CD ist = ho_GetTransEx(pFil,&usMaske,&Trans);
+ =============================================================================
+*/
+short ho_GetTransEx(FILE *pFil,unsigned short *pusMaske, LC_TRANSPAR * pTrans)
+{
+ short lin,itxi;
+ char *cp;
+ short ist = UT_TRUE;
+ unsigned short usMaskeInn = *pusMaske;
+
+
+ /* Nullstiller pTrans */
+ memset(pTrans,0,sizeof(LC_TRANSPAR));
+
+ /* Nullstiller masken */
+ *pusMaske = 0;
+
+ /* Sjekk hvilket tegnsett som skal brukes */
+ ho_GetTegnsett(pFil,&Sys.BufAdm.sTegnsett);
+
+ /* ----- Div. kontroller ----- */
+ /* Transpar */
+ lin=2;
+ if ( ! ho_GetVal(pFil,"..TRANSPAR",&lin)) {
+ LC_Error(14," (HO_GetTrans) "," ");
+ return UT_FALSE;
+ }
+
+ /* ----- Henter verdier ----- */
+
+ /* Koordsys */
+ if ((usMaskeInn & LC_TR_KOORDSYS) != 0) {
+ lin = 2;
+ cp = ho_GetVal(pFil,"...KOORDSYS",&lin);
+ if (cp == NULL) {
+ lin=2;
+ ho_GetVal(pFil,"..KOORDSYS",&lin);
+ }
+ if (cp != NULL) {
+ *pusMaske |= LC_TR_KOORDSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sKoordsys);
+ UT_StrToken(cp,itxi,&itxi,36,pTrans->szKoordsysDatum);
+ UT_StrToken(cp,itxi,&itxi,36,pTrans->szKoordsysProjek);
+ }
+ }
+
+ /* Transsys */
+ if ((usMaskeInn & LC_TR_TRANSSYS) != 0) {
+ lin = 2;
+ if ((cp = ho_GetVal(pFil,"...TRANSSYS",&lin)) != NULL) {
+ *pusMaske |= LC_TR_TRANSSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sTranssysTilsys);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstA1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstB1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstA2);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstB2);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstC1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstC2);
+ }
+ }
+
+ /* Geosys */
+ if ((usMaskeInn & LC_TR_GEOSYS) != 0) {
+ lin = 2;
+ if ((cp = ho_GetVal(pFil,"...GEOSYS",&lin)) != NULL) {
+ *pusMaske |= LC_TR_GEOSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sGeosysDatum);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sGeosysProj);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sGeosysSone);
+ }
+ }
+
+ /* Geokoord */
+ if ((usMaskeInn & LC_TR_GEOKOORD) != 0) {
+ lin = 2;
+ if ((cp = ho_GetVal(pFil,"...GEOKOORD",&lin)) != NULL) {
+ *pusMaske |= LC_TR_GEOKOORD;
+ UT_StrShort(cp,0,&itxi,&pTrans->sGeoKoord);
+ }
+ }
+
+ /* Origo */
+ if ((usMaskeInn & LC_TR_ORIGO) != 0) {
+ lin = 2;
+ if ((cp = ho_GetVal(pFil,"...ORIGO-NØ",&lin)) != NULL) {
+ *pusMaske |= LC_TR_ORIGO;
+ UT_StrDbl(cp,0,&itxi,'.',&pTrans->Origo.dNord);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->Origo.dAust);
+ }
+ }
+
+ /* Enhet */
+ if ((usMaskeInn & LC_TR_ENHET) != 0) {
+ lin = 2;
+ if ((cp = ho_GetVal(pFil,"...ENHET",&lin)) != NULL) {
+ *pusMaske |= LC_TR_ENHET;
+ pTrans->dEnhet = strtod(cp,&cp);
+ }
+ }
+
+ /* Enhet-h */
+ if ((usMaskeInn & LC_TR_ENHETH) != 0) {
+ lin=2;
+ if ((cp = ho_GetVal(pFil,"...ENHET-H",&lin)) == NULL) {
+ pTrans->dEnhet_h = pTrans->dEnhet;
+ } else {
+ *pusMaske |= LC_TR_ENHETH;
+ pTrans->dEnhet_h = strtod(cp,&cp);
+ }
+ }
+
+ /* Enhet-d */
+ if ((usMaskeInn & LC_TR_ENHETD) != 0) {
+ /* Enhet-d */
+ lin=2;
+ if ((cp = ho_GetVal(pFil,"...ENHET-D",&lin)) == NULL) {
+ pTrans->dEnhet_d = pTrans->dEnhet;
+ } else {
+ *pusMaske |= LC_TR_ENHETD;
+ pTrans->dEnhet_d = strtod(cp,&cp);
+ }
+ }
+
+ /* Vert-datum */
+ if ((usMaskeInn & LC_TR_VERTDATUM) != 0) {
+ lin = 2;
+ if ((cp = ho_GetVal(pFil,"...VERT-DATUM",&lin)) != NULL) {
+ *pusMaske |= LC_TR_VERTDATUM;
+ UT_StrToken(cp,0,&itxi,7,pTrans->szVertdatHref);
+ UT_StrToken(cp,itxi,&itxi,6,pTrans->szVertdatDref);
+ UT_StrToken(cp,itxi,&itxi,6,pTrans->szVertdatFref);
+ UT_StrToken(cp,itxi,&itxi,2,pTrans->szVertdatHtyp);
+ }
+ }
+
+ /* Vert-int */
+ if ((usMaskeInn & LC_TR_VERTINT) != 0) {
+ lin = 2;
+ if ((cp = ho_GetVal(pFil,"...VERT-INT",&lin)) != NULL) {
+ *pusMaske |= LC_TR_VERTINT;
+ UT_StrShort(cp,0,&itxi,&pTrans->sVertintHref);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVertintDref);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVertintFref);
+ }
+ }
+
+ /* Vert-delta */
+ if ((usMaskeInn & LC_TR_VERTDELTA) != 0) {
+ lin = 2;
+ if ((cp = ho_GetVal(pFil,"...VERT-DELTA",&lin)) != NULL) {
+ *pusMaske |= LC_TR_VERTDELTA;
+ UT_StrShort(cp,0,&itxi,&pTrans->sVdeltaMin);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVdeltaMax);
+ }
+ }
+
+
+ /* ----- Div. sluttkontroll ----- */
+
+ /* Kontroller at det er funnet Koordsys, Transsys eller Geosys */
+ if ((usMaskeInn & LC_TR_KOORDSYS) != 0 ||
+ (usMaskeInn & LC_TR_TRANSSYS) != 0 ||
+ (usMaskeInn & LC_TR_GEOSYS) != 0 ) {
+ if ((*pusMaske & LC_TR_KOORDSYS) == 0 &&
+ (*pusMaske & LC_TR_TRANSSYS) == 0 &&
+ (*pusMaske & LC_TR_GEOSYS) == 0 ) {
+ /* Ikke noe koordinatsystem funnet */
+ LC_Error(15,"(ho_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+ }
+
+ /* Kontroller at det er funnet Origo */
+ if ((usMaskeInn & LC_TR_ORIGO) != 0 &&
+ (*pusMaske & LC_TR_ORIGO) == 0 ) {
+ /* Origo mangler */
+ LC_Error(16,"(ho_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+
+ /* Kontroller at det er funnet Enhet */
+ if ((usMaskeInn & LC_TR_ENHET) != 0 &&
+ (*pusMaske & LC_TR_ENHET) == 0 ) {
+ /* Enhet mangler */
+ LC_Error(17,"(ho_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+
+
+/*
+AR:1999-07-12
+CH HO_GetTrans Finner .TRANSPAR i hodet
+CD =============================================================================
+CD Formål:
+CD Henter transformasjonsparametrene fra filhodet.
+CD
+CD OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+CD For nye programmer bør HO_GetTransEx benyttes. HO_GetTransEx er
+CD kompatibel med nye versjoner av SOSI.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD short *koosys u Koordinatsystem
+CD double *origo_a u ..ORIGO-AUST
+CD double *origo_n u ..ORIGO-NORD
+CD double *enhet u ...ENHET
+CD double *enhet_h u ...ENHET-H
+CD double *enhet_d u ...ENHET-D
+CD short sStatus r UT_TRUE, eller UT_FALSE.
+CD
+CD Bruk:
+CD sStatus = HO_GetTrans(fil,&koosys,&origo_a,&origo_n,&enhet,&enhet_h,&enhet_d);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short HO_GetTrans(const char *pszFil,short *koosys,double *origo_a,
+ double *origo_n,double *enhet,double *enhet_h,double *enhet_d)
+{
+ short sStatus;
+ FILE * pFil;
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Hent verdier */
+ sStatus = ho_GetTrans(pFil,koosys,origo_a,origo_n,enhet,enhet_h,enhet_d);
+ fclose (pFil);
+
+ /* Åpningsfeil på kladdefilen */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_GetTrans)",err().tx);
+ sStatus = UT_FALSE;
+ }
+
+ return sStatus;
+}
+
+
+/*
+GL-880427
+AR-900314
+CH ho_GetTrans Finner .TRANSPAR i hodet
+CD =============================================================================
+CD Formål:
+CD Henter transformasjonsparametrene fra filhodet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD FILE *pFil i Filpeker til sosi-fil.
+CD short *koosys u Koordinatsystem
+CD double *origo_a u ..ORIGO-AUST
+CD double *origo_n u ..ORIGO-NORD
+CD double *enhet u ...ENHET
+CD double *enhet_h u ...ENHET-H
+CD double *enhet_d u ...ENHET-D
+CD short sStatus r UT_TRUE, eller UT_FALSE.
+CD
+CD Bruk:
+CD ho_GetTrans(pFil,&koosys,&origo_a,&origo_n,&enhet,&enhet_h,&enhet_d);
+ =============================================================================
+*/
+short ho_GetTrans(FILE *pFil,short *koosys,double *origo_a,
+ double *origo_n,double *enhet,double *enhet_h,double *enhet_d)
+{
+ short lin;
+ char *cp;
+
+
+ /* Sjekk hvilket tegnsett som skal brukes */
+ ho_GetTegnsett(pFil,&Sys.BufAdm.sTegnsett);
+
+ lin=2;
+ if ( ! ho_GetVal(pFil,"..TRANSPAR",&lin)) {
+ LC_Error(14," (HO_GetTrans) "," ");
+ return UT_FALSE;
+ }
+
+
+ *koosys=0;
+ lin=2;
+ cp = ho_GetVal(pFil,"...KOORDSYS",&lin);
+ if (cp == NULL) {
+ lin=2;
+ ho_GetVal(pFil,"..KOORDSYS",&lin);
+ }
+ if (cp == NULL) {
+ LC_Error(15," (HO_GetTrans) "," ");
+ return UT_FALSE;
+
+ } else {
+ *koosys = (short)atoi(cp);
+ }
+
+ lin=2;
+ if ((cp = ho_GetVal(pFil,"...ORIGO-NØ",&lin)) == NULL) {
+ LC_Error(16," (HO_GetTrans) "," ");
+ return UT_FALSE;
+
+ } else {
+ *origo_n = strtod(cp,&cp);
+ *origo_a = strtod(cp,&cp);
+ lin=2;
+ if ((cp = ho_GetVal(pFil,"...ENHET",&lin)) == NULL) {
+ LC_Error(17," (HO_GetTrans) "," ");
+ return UT_FALSE;
+ } else {
+ *enhet = strtod(cp,&cp);
+ }
+ lin=2;
+ if ((cp = ho_GetVal(pFil,"...ENHET-H",&lin)) == NULL) {
+ *enhet_h = *enhet;
+ } else {
+ *enhet_h = strtod(cp,&cp);
+ }
+ lin=2;
+ if ((cp = ho_GetVal(pFil,"...ENHET-D",&lin)) == NULL) {
+ *enhet_d = *enhet;
+ } else {
+ *enhet_d = strtod(cp,&cp);
+ }
+ }
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-890823
+CH HO_GetOmr Finner ..OMRÅDE i hodet
+CD =============================================================================
+CD Formål:
+CD Henter områdeangivelsen fra filhodet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD double *nv_a u
+CD double *nv_n u
+CD double *oh_a u
+CD double *oh_n u
+CD short sStatus r UT_TRUE, eller UT_FALSE.
+CD
+CD Bruk:
+CD sStatus = HO_GetOmr(pszFil,&nv_a,&nv_n,&oh_a,&oh_n);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short HO_GetOmr(const char * pszFil,double *nv_a,double *nv_n,double *oh_a,double *oh_n)
+{
+ short sStatus;
+ FILE * pFil;
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Hent verdier */
+ ho_GetOmr(pFil,nv_a,nv_n,oh_a,oh_n);
+ fclose (pFil);
+ sStatus = UT_TRUE;
+
+ /* Åpningsfeil */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_GetOmr)",err().tx);
+ sStatus = UT_FALSE;
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-890823
+CH ho_GetOmr Finner ..OMRÅDE i hodet
+CD =============================================================================
+CD Formål:
+CD Henter områdeangivelsen fra filhodet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD FILE *fil i Filpeker til sosi-fil.
+CD double *nv_a u
+CD double *nv_n u
+CD double *oh_a u
+CD double *oh_n u
+CD short sStatus r UT_TRUE, eller UT_FALSE.
+CD
+CD Bruk:
+CD sStatus = ho_GetOmr(fil,&nv_a,&nv_n,&oh_a,&oh_n);
+ =============================================================================
+*/
+short ho_GetOmr(FILE *fil,double *nv_a,double *nv_n,double *oh_a,double *oh_n)
+{
+ short lin,i;
+ char *cp;
+ short sStatus = UT_TRUE;
+
+
+ /* Sjekk hvilket tegnsett som skal brukes */
+ ho_GetTegnsett(fil,&Sys.BufAdm.sTegnsett);
+
+
+ lin=2;
+ if (ho_GetVal(fil,"..OMRÅDE",&lin) == NULL) {
+ LC_Error(7,"(HO_GetOmr)","");
+ *nv_n = -9999999.0;
+ *nv_a = -9999999.0;
+ *oh_n = 9999999.0;
+ *oh_a = 9999999.0;
+ sStatus = UT_FALSE;
+
+
+ } else {
+ /* Min-NØ */
+ i = lin;
+ if ((cp = ho_GetVal(fil,"...MIN-NØ",&i)) == NULL ) {
+ LC_Error(8,"(HO_GetOmr)","");
+ *nv_n = -9999999.0;
+ *nv_a = -9999999.0;
+ sStatus = UT_FALSE;
+
+ } else {
+ *nv_n = strtod(cp,&cp);
+ *nv_a = strtod(cp,&cp);
+ }
+
+ /* Max-NØ */
+ i = lin;
+ if ((cp = ho_GetVal(fil,"...MAX-NØ",&i)) == NULL) {
+ LC_Error(9,"(HO_GetOmr)","");
+ *oh_n = 999999.0;
+ *oh_a = 9999999.0;
+ sStatus = UT_FALSE;
+
+ } else{
+ *oh_n = strtod(cp,&cp);
+ *oh_a = strtod(cp,&cp);
+ }
+ }
+
+ /* Sjekker at området har utstrekning */
+ //if (*oh_a-*nv_a < 0.001 || *oh_n-*nv_n < 0.001) {
+ // LC_Error(104,"(HO_GetOmr)","");
+ // *nv_n = -9999999.0;
+ // *nv_a = -9999999.0;
+ // *oh_n = 9999999.0;
+ // *oh_a = 9999999.0;
+ //}
+
+ return sStatus;
+}
+
+
+
+
+/*
+AR:1999-07-12
+CH HO_GetKvalitet Finner kvalitetsopplysninger
+CD =============================================================================
+CD Formål:
+CD Finne kvalitetsopplysninger i filhode.
+CD (Ikke aktuellt etter SOSI v. 4.00.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD short *psMetode u Hvordan data er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD long *pLNnoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD short *psSynbarhet u Synbarhet i bilde
+CD KVAL_SYN_UNDEF synbarhet er udefinert.
+CD short *psHoydeMetode u Hvordan høyden er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD long *plHoydeNoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD short ist r Statusvariabel: UT_TRUE - OK, ..KVALITET er funnet
+CD UT_FALSE - ikke funnet
+CD
+CD Bruk:
+CD ist = HO_GetKvalitet(fil,&sMetode,&lNoyaktighet,&sSynbarhet,
+CD &sHoydeMetode,&lHoydeNoyaktighet);
+CD =============================================================================
+*/
+SK_EntPnt_FYBA short HO_GetKvalitet(const char *pszFil,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet)
+{
+ short sStatus;
+ FILE * pFil;
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Hent verdier */
+ sStatus = ho_GetKvalitet(pFil,psMetode,plNoyaktighet,psSynbarhet,psHoydeMetode,plHoydeNoyaktighet);
+ fclose (pFil);
+
+ /* Åpningsfeil */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_GetKvalitet)",err().tx);
+ sStatus = UT_FALSE;
+ }
+
+ return sStatus;
+}
+
+
+
+/*
+OJ-891123
+CH ho_GetKvalitet Finner kvalitetsopplysninger
+CD =============================================================================
+CD Formål:
+CD Finne kvalitetsopplysninger i filhode.
+CD (Ikke aktuellt etter SOSI v. 4.00.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD FILE *pFil i Filpeker til sosi-fil.
+CD short *psMetode u Hvordan data er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD long *pLNnoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD short *psSynbarhet u Synbarhet i bilde
+CD KVAL_SYN_UNDEF synbarhet er udefinert.
+CD short *psHoydeMetode u Hvordan høyden er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD long *plHoydeNoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD short ist r Statusvariabel: UT_TRUE - OK, ..KVALITET er funnet
+CD UT_FALSE - ikke funnet
+CD
+CD Bruk:
+CD ist = ho_GetKvalitet(fil,&sMetode,&lNoyaktighet,&sSynbarhet,
+CD &sHoydeMetode,&lHoydeNoyaktighet);
+CD =============================================================================
+*/
+short ho_GetKvalitet(FILE *pFil,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet)
+{
+ short lin;
+ char *cp;
+ short ist = UT_FALSE;
+
+
+ /* Sjekk hvilket tegnsett som skal brukes */
+ ho_GetTegnsett(pFil,&Sys.BufAdm.sTegnsett);
+
+ lin=2;
+ if ((cp = ho_GetVal(pFil,"..KVALITET",&lin)) != NULL) { /* Kvalitet */
+ ist = UT_TRUE;
+ }
+
+ /* Tolk strengen til tallverdier */
+ LN_TolkKvalitet(cp,psMetode,plNoyaktighet,psSynbarhet,
+ psHoydeMetode,plHoydeNoyaktighet);
+
+
+ /* Handter manglende høyde-kvalitet spesiellt */
+ if (*psHoydeMetode == KVAL_MET_UNDEF) *psHoydeMetode = *psMetode;
+ if (*plHoydeNoyaktighet == KVAL_NOY_UKJENT) *plHoydeNoyaktighet = *plNoyaktighet;
+
+ return ist;
+}
+
+
+
+/*
+AR-920331
+CH HO_GetTegnsett Finner tegnsett
+CD ==========================================================================
+CD Formål:
+CD Finne tegnsett i filhodet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD short *psTegnsett u Tegnsett, konstanter definert:
+CD TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+CD TS_ND7 = Norsk Data 7-bits
+CD TS_DECM8 = DEC multinasjonal 8-bits
+CD TS_ISO8859 = ISO8859-10 Norsk/samisk tegnsett
+CD TS_DECN7 = DEC norsk 7-bits
+CD short sStatus r Status: UT_TRUE = Funnet
+CD UT_FALSE = Ikke funnet
+CD
+CD Bruk:
+CD sStatus = HO_GetTegnsett(pszFil,&sTegnsett);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short HO_GetTegnsett(const char *pszFil,short *psTegnsett)
+{
+ short sStatus;
+ FILE * pFil;
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Hent verdier */
+ sStatus = ho_GetTegnsett(pFil,psTegnsett);
+ fclose (pFil);
+
+ /* Åpningsfeil */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_GetTegnsett)",err().tx);
+ sStatus = UT_FALSE;
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-920331
+CH ho_GetTegnsett Finner tegnsett
+CD ==========================================================================
+CD Formål:
+CD Finne tegnsett i filhodet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD FILE *fil i Filpeker til sosi-fil.
+CD short *psTegnsett u Tegnsett, konstanter definert:
+CD TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+CD TS_ND7 = Norsk Data 7-bits
+CD TS_DECM8 = DEC multinasjonal 8-bits
+CD TS_ISO8859 = ISO8859-10 Norsk/samisk tegnsett
+CD TS_DECN7 = DEC norsk 7-bits
+CD short sStatus r Status: UT_TRUE = Funnet
+CD UT_FALSE = Ikke funnet
+CD
+CD Bruk:
+CD sStatus = ho_GetTegnsett(fil,&sTegnsett);
+CD ==========================================================================
+*/
+short ho_GetTegnsett(FILE *pFil,short *psTegnsett)
+{
+ short lin;
+ char *cp;
+ short ist = UT_FALSE;
+
+ *psTegnsett = TS_DOSN8;
+ lin=2;
+
+ if ((cp = ho_GetVal(pFil,"..TEGNSETT",&lin)) != NULL) { /* Tegnsett */
+ ist = UT_TRUE;
+ UT_StrUpper(cp);
+ if (strcmp(cp,"ISO8859-10") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ISO8859-1") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ANSI") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ND7") == 0) {
+ *psTegnsett = TS_ND7;
+
+ } else if (strcmp(cp,"DECN7") == 0) {
+ *psTegnsett = TS_DECN7;
+
+ } else if (strcmp(cp,"DECM8") == 0) {
+ *psTegnsett = TS_DECM8;
+ }
+ }
+
+ return ist;
+}
+
+
+/*
+AR:1999-07-14
+CH HO_GetVal Finn verdien til et SOSI-navn
+CD =============================================================================
+CD Formål:
+CD Henter parametrene til et SOSI-navn.
+CD Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk strcpy).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD char *sosi_navn i SOSI-navn det skal finnes verdi til
+CD short *sett_nr i/u i: "Sett nummer"(linjenummer) for start søking (min 1)
+CD u: Ved tilslag returneres "Sett nummer" for
+CD tilslaget.
+CD char *para_peker r Peker til parameter-streng avslutta med '\0'.
+CD Hvis SOSI-navnet ikke er funnet returneres NULL.
+CD
+CD Bruk:
+CD para_peker = HO_GetVal(fil,sosi_navn,&sett_nr);
+ =============================================================================
+*/
+SK_EntPnt_FYBA char *HO_GetVal(const char *pszFil,char *sosi_navn,short *sett_nr)
+{
+ short sStatus;
+ FILE * pFil;
+ char *rp = NULL; /* Retur peker */
+
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Hent verdier */
+ rp = ho_GetVal(pFil,sosi_navn,sett_nr);
+ fclose (pFil);
+
+ /* Åpningsfeil */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_GetVal)",err().tx);
+ sStatus = UT_FALSE;
+ }
+
+ return rp;
+}
+
+
+/*
+GL:1988-04-27
+AR:1989-08-23
+CH ho_GetVal Finn verdien til et SOSI-navn
+CD =============================================================================
+CD Formål:
+CD Henter parametrene til et SOSI-navn.
+CD Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk strcpy).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD FILE *pFil i Filpeker til sosi-fil.
+CD char *sosi_navn i SOSI-navn det skal finnes verdi til
+CD short *sett_nr i/u i: "Sett nummer"(linjenummer) for start søking (min 1)
+CD u: Ved tilslag returneres "Sett nummer" for
+CD tilslaget.
+CD char *para_peker r Peker til parameter-streng avslutta med '\0'.
+CD Hvis SOSI-navnet ikke er funnet returneres NULL.
+CD
+CD Bruk:
+CD para_peker = ho_GetVal(pFil,sosi_navn,&sett_nr);
+ =============================================================================
+*/
+char *ho_GetVal(FILE *pFil,char *sosi_navn,short *sett_nr)
+{
+ UT_INT64 startpos;
+ short ant_par,navn_nr,type;
+ short funnet = 0;
+ short ferdig = 0;
+ short sett = 0;
+ LB_LESEBUFFER * pLb = &(Sys.BufAdm);
+ char *rp = NULL; /* Retur peker */
+
+
+ // Søk fram til .HODE
+ if (ho_FinnHode(pFil, &startpos) == UT_TRUE) {
+ // Finn riktig info
+ // SOSI-navnet
+ LN_PakkNavn(&(Sys.SosiNavn),sosi_navn,&navn_nr,&ant_par);
+
+ /* Sikkrer at ny lesing startes */
+ pLb->sStatus = LESEBUFFER_TOM;
+ //_fseeki64(pFil,startpos,SEEK_SET);
+ UT_SetPos_i64(pFil,startpos);
+
+ do {
+ sett++;
+ /* Hent "sett" */
+ type = LB_GetSet(pFil,pLb,&(Sys.SosiNavn));
+ if (type >= 0 || type == LEST_GINFO) {
+ if (sett > 1 && pLb->cur_niv == 1) {
+ ferdig = 1;
+
+ } else {
+ if (sett >= *sett_nr) {
+ if (pLb->cur_navn[pLb->cur_niv-1] == navn_nr) {
+ funnet = 1;
+ rp = pLb->pp;
+ *sett_nr = sett;
+ }
+ }
+ }
+ }
+ pLb->set_brukt = SET_BRUKT;
+ } while ( ! ferdig && ! funnet); /* Søk etter navnet */
+ }
+
+ pLb->sStatus = LESEBUFFER_TOM;
+ return rp;
+}
+
+
+/*
+GL-880303
+AR-891124
+CH HO_New Lager nytt hode
+CD =========================================================================
+CD Formål:
+CD Genererer et nytt SOSI-filhode.
+CD Hvis område ikke har noen utstrekning justeres
+CD dette med 1 meter i hver retning.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD short koosys i Koordinatsystem
+CD double origo_a i Origo øst
+CD double origo_n i Origo nord
+CD double enhet i Enhet
+CD double enhet_h i Enhet-H
+CD double enhet_d i Enhet-D
+CD double nv_a i Område: Nedre venstre hjørne
+CD double nv_n i
+CD double oh_a i Øvre høyre hjørne
+CD double oh_n i
+CD short sStatus r Status: UT_TRUE = Funnet
+CD UT_FALSE = Ikke funnet
+CD
+CD Bruk:
+CD sStatus = HO_New(fil,koosys,origo_a,origo_n,enhet,enhet_h-enhet_d,
+CD nv_a,nv_n,oh_a,oh_n);
+CD =============================================================================
+*/
+SK_EntPnt_FYBA short HO_New(const char *pszFil,short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+{
+
+ short sStatus = UT_TRUE;
+ FILE * pFil;
+
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"",UT_UPDATE,UT_UNKNOWN,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Skriv nytt hode */
+ ho_New(pFil, koosys, origo_a, origo_n, enhet, enhet_h, enhet_d,
+ nv_a, nv_n, oh_a, oh_n);
+
+ fclose (pFil);
+ sStatus = UT_TRUE;
+
+ /* Åpningsfeil */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_New)",err().tx);
+ sStatus = UT_FALSE;
+ }
+
+ return sStatus;
+}
+
+
+/*
+GL-880303
+AR-891124
+CH ho_New Lager nytt hode
+CD =========================================================================
+CD Formål:
+CD Genererer et nytt SOSI-filhode.
+CD Hvis område ikke har noen utstrekning justeres
+CD dette med 1 meter i hver retning.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD FILE *fil i Filpeker til sosi-fil.
+CD short koosys i Koordinatsystem
+CD double origo_a i Origo øst
+CD double origo_n i Origo nord
+CD double enhet i Enhet
+CD double enhet_h i Enhet-H
+CD double enhet_d i Enhet-D
+CD double nv_a i Område: Nedre venstre hjørne
+CD double nv_n i
+CD double oh_a i Øvre høyre hjørne
+CD double oh_n i
+CD
+CD Bruk:
+CD ho_New(fil,koosys,origo_a,origo_n,enhet,enhet_h-enhet_d,
+CD nv_a,nv_n,oh_a,oh_n);
+CD =============================================================================
+*/
+void ho_New(FILE *fil,short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+{
+ char tx[LC_MAX_SOSI_LINJE_LEN];
+
+
+ //_fseeki64(fil,0,SEEK_SET);
+ UT_SetPos_i64(fil,0);
+
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,".HODE\r\n");
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,"..TEGNSETT ISO8859-10\r\n");
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,"..TRANSPAR\r\n");
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"...KOORDSYS %d\r\n",koosys);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"...ORIGO-NØ %.0f %.0f\r\n",origo_n,origo_a);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+
+ //UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"...ENHET %-.3f\r\n",enhet);
+ LB_FormaterEnhet(tx,LC_MAX_SOSI_LINJE_LEN,"...ENHET",enhet);
+ UT_StrCat(tx,"\r\n",LC_MAX_SOSI_LINJE_LEN);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+
+ if (fabs(enhet-enhet_h)>0.000001) {
+ LB_FormaterEnhet(tx,LC_MAX_SOSI_LINJE_LEN,"...ENHET-H",enhet_h);
+ UT_StrCat(tx,"\r\n",LC_MAX_SOSI_LINJE_LEN);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+ }
+
+ if (fabs(enhet-enhet_d)>0.000001) {
+ LB_FormaterEnhet(tx,LC_MAX_SOSI_LINJE_LEN,"...ENHET-D",enhet_d);
+ UT_StrCat(tx,"\r\n",LC_MAX_SOSI_LINJE_LEN);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+ }
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,"..OMRÅDE\r\n");
+
+ // Hvis nødvendig justeres område
+ if (fabs(oh_n-nv_n) < 0.000001) {
+ nv_n -= 1.0;
+ oh_n += 1.0;
+ }
+ if (fabs(oh_a-nv_a) < 0.000001) {
+ nv_a -= 1.0;
+ oh_a += 1.0;
+ }
+
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"...MIN-NØ %.0f %.0f\r\n",nv_n,nv_a);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"...MAX-NØ %.0f %.0f\r\n",oh_n,oh_a);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"..SOSI-VERSJON %.2f\r\n",((double)FYBA_SOSI_VERSJON)/100.0);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+
+ UT_StrCopy(tx,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n",LC_MAX_SOSI_LINJE_LEN);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,tx);
+ LB_WriteLine(fil,LC_INTERNT_TEGNSETT,".SLUTT\r\n");
+
+ /* chsize(fileno(fil),ftell(fil)-1); */ /* Sett filstørrelse */
+}
+
+
+/*
+AR:1999-07-14
+CH HO_TestSOSI Tester SOSI-filen
+CD =============================================================================
+CD Formål:
+CD Sjekker at filen er en SOSI-fil, og finner posisjonen for .SLUTT.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD UT_INT64 *sluttpos u Posisjon for .SLUTT
+CD short ist r Status: UT_TRUE = OK
+CD UT_FALSE = feil
+CD
+CD Bruk:
+CD ist = HO_TestSOSI(pszFil,&sluttpos);
+CD =============================================================================
+*/
+SK_EntPnt_FYBA short HO_TestSOSI(const char *pszFil,UT_INT64 *sluttpos)
+{
+ short sStatus;
+ FILE * pFil;
+
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Sjekk filen */
+ sStatus = ho_TestSOSI(pFil,sluttpos);
+ fclose (pFil);
+
+ /* Åpningsfeil */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_TestSOSI)",err().tx);
+ sStatus = UT_FALSE;
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-891205
+CH ho_TestSOSI Tester SOSI-filen
+CD =============================================================================
+CD Formål:
+CD Sjekker at filen er en SOSI-fil, og finner posisjonen for .SLUTT.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD FILE *pFil i Filpeker til sosi-fil.
+CD UT_INT64 *sluttpos u Posisjon for .SLUTT
+CD short ist r Status: UT_TRUE = OK
+CD UT_FALSE = feil
+CD
+CD Bruk:
+CD ist = ho_TestSOSI(pFil,&sluttpos);
+CD =============================================================================
+*/
+short ho_TestSOSI(FILE *pFil,UT_INT64 *sluttpos)
+{
+ short ferdig;
+ char tx[LC_MAX_SOSI_LINJE_LEN];
+ UT_INT64 startpos,filpos;
+ double nv_a,nv_n,oh_a,oh_n;
+ short ist = UT_FALSE;
+
+ *sluttpos = 0;
+
+ // ----- Sjekk at filen starter med .HODE og søk fram til .HODE
+ if (ho_FinnHode(pFil, &startpos) == UT_TRUE) {
+ ist = UT_FALSE;
+
+ // Skann siste del av filen for å finne .SLUTT
+ ferdig = 0;
+ _fseeki64(pFil,-200,SEEK_END);
+ UT_GetPos_i64(pFil,&filpos);
+
+ while (!ferdig && UT_ReadLine(pFil,LC_MAX_SOSI_LINJE_LEN,tx) == UT_OK) {
+ if (*tx == '.' && *(tx+1) == 'S') {
+ if (strncmp(tx,".SLUTT",6) == 0) { /* .SLUTT er funnet */
+ *sluttpos = filpos;
+ ferdig = 1;
+ ist = UT_TRUE;
+ }
+ }
+ //UT_GetPos(pFil,&filpos);
+ filpos = _ftelli64(pFil);
+ }
+
+ if (ist == UT_FALSE) {
+ // .SLUTT ikke er funnet, skann hele filen fra hodet
+ ferdig = 0;
+ filpos = startpos;
+ UT_SetPos_i64(pFil,filpos);
+
+ while (!ferdig && UT_ReadLine(pFil,LC_MAX_SOSI_LINJE_LEN,tx) == UT_OK) {
+ if (*tx == '.' && *(tx+1) == 'S') {
+ if (strncmp(tx,".SLUTT",6) == 0) { /* .SLUTT er funnet */
+ *sluttpos = filpos;
+ ferdig = 1;
+ ist = UT_TRUE;
+ }
+ }
+ UT_GetPos_i64(pFil,&filpos);
+ }
+ }
+ }
+
+
+ /* Sjekk at hodet har transpar og fornuftig område */
+ if (ist == UT_TRUE) {
+ unsigned short usMaske = LC_TR_ALLT;
+ LC_TRANSPAR Trans;
+ ist = ho_GetTransEx(pFil,&usMaske,&Trans);
+
+ if (ist == UT_TRUE) {
+ ist = ho_GetOmr(pFil,&nv_a,&nv_n,&oh_a,&oh_n);
+ }
+ }
+
+ return ist;
+}
+
+
+/*
+HT:1998-05-19
+CH HO_SjekkTegnsett Sjekker tegnsett på SOSI-filen
+CD =============================================================================
+CD Formål:
+CD Sjekker faktisk tegnsett i .HODE.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFil i Fullstendig filnavn
+CD short *psTegnsett u Tegnsett, konstanter definert:
+CD TS_UKJENT = Fikk ikke sjekket tegnsett
+CD TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+CD TS_ND7 = Norsk Data 7-bits
+CD TS_DECM8 = DEC multinasjonal 8-bits
+CD TS_ISO8859 = ISO8859-10 Norsk/samisk tegnsett
+CD TS_DECN7 = DEC norsk 7-bits
+CD short sStatus r Status: 0 = Ikke funnet
+CD 1 = Ett tegnsett funnet
+CD 2 = Flere tegnsett funnet
+CD Bruk:
+CD sStatus = HO_SjekkTegnsett(fpek,tegnsett);
+CD =============================================================================
+*/
+SK_EntPnt_FYBA short HO_SjekkTegnsett(const char *pszFil,short *psTegnsett)
+{
+ short sStatus;
+ FILE * pFil;
+
+
+ /* Åpner filen */
+ pFil = UT_OpenFile(pszFil,"",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpnet OK ? */
+ if (sStatus == UT_OK) {
+ /* Sjekk filen */
+ sStatus = ho_SjekkTegnsett(pFil,psTegnsett);
+ fclose (pFil);
+
+ /* Åpningsfeil */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszFil,szError);
+ LC_Error(101,"(HO_SjekkTegnsett)",err().tx);
+ sStatus = 0;
+ }
+
+ return sStatus;
+}
+
+
+/*
+HT-980519
+CH ho_SjekkTegnsett Sjekker tegnsett på SOSI-filen
+CD =============================================================================
+CD Formål:
+CD Sjekker faktisk tegnsett i .HODE.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD FILE *fil i Filpeker til sosi-fil.
+CD short *psTegnsett u Tegnsett, konstanter definert:
+CD TS_UKJENT = Fikk ikke sjekket tegnsett
+CD TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+CD TS_ND7 = Norsk Data 7-bits
+CD TS_DECM8 = DEC multinasjonal 8-bits
+CD TS_ISO8859 = ISO8859-10 Norsk/samisk tegnsett
+CD TS_DECN7 = DEC norsk 7-bits
+CD short sStatus r Status: 0 = Ikke funnet
+CD 1 = Ett tegnsett funnet
+CD 2 = Flere tegnsett funnet
+CD Bruk:
+CD sStatus = ho_SjekkTegnsett(fpek,tegnsett);
+CD =============================================================================
+*/
+short ho_SjekkTegnsett(FILE *fil,short *psTegnsett)
+{
+ char *ch, tx[LC_MAX_SOSI_LINJE_LEN];
+ short tegnsett, lesefeil;
+ short ferdig = 0;
+ short ant = 0;
+
+/* Æ Ø Å æ ø å
+TS_DOSN8 146 157 143 145 155 134
+TS_ND7 91 92 93 123 124 125
+TS_ISO8859 198 216 197 230 248 229 */
+ static unsigned char atab[256] =
+ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 19 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 39 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 59 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 79 */
+ 0,0,0,0,0,0,0,0,0,0,0,TS_ND7,TS_ND7,TS_ND7,0,0,0,0,0,0, /* 99 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 119 */
+ 0,0,0,TS_ND7,TS_ND7,TS_ND7,0,0,0,0,0,0,0,0,TS_DOSN8,0,0,0,0,0, /* 139 */
+ 0,0,0,TS_DOSN8,0,TS_DOSN8,TS_DOSN8,0,0,0,0,0,0,0,0,TS_DOSN8,0,TS_DOSN8,0,0, /* 159 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 179 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,TS_ISO8859,TS_ISO8859,0, /* 199 */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,TS_ISO8859,0,0,0, /* 219 */
+ 0,0,0,0,0,0,0,0,0,TS_ISO8859,TS_ISO8859,0,0,0,0,0,0,0,0,0, /* 239 */
+ 0,0,0,0,0,0,0,0,TS_ISO8859,0,0,0,0,0,0,0 };
+
+
+ tegnsett = TS_UKJENT;
+
+ /* Sjekker hva som faktisk er tegnsettet i .HODE,
+ starter først på filen og leser */
+ UT_SetPos_i64(fil,0);
+
+ /* Leser første linje i .HODE */
+ lesefeil = UT_ReadLineNoComm(fil,LC_MAX_SOSI_LINJE_LEN,tx);
+ while (!ferdig && ! lesefeil ){
+
+ /* Sjekker tegnsett*/
+ for (ch=tx; *ch; ch++) {
+
+ /* Hvis vi har fått sjekket tegnsettet, og det
+ ikke er funnet tidligere tas det vare på nå */
+ if (atab[(unsigned char)*ch] && !(atab[(unsigned char)*ch] & tegnsett)) {
+ tegnsett |= atab[(unsigned char)*ch];
+ ant++;
+ }
+ }
+
+ /* Leser eventuellt neste linje i .HODE */
+ if (!ferdig) lesefeil = UT_ReadLineNoComm(fil,LC_MAX_SOSI_LINJE_LEN,tx);
+
+ /* Slutt på .HODE? */
+ ferdig = *(tx+1) != '.';
+ }
+
+ *psTegnsett = tegnsett;
+
+ return ant;
+}
+
+
+/*
+AR:2004-05-05
+!---------------------------------------------------------------!
+! ho_TestFyllKommentar - Tester om en streng er fyll/kommentar. !
+! !
+! Retur: UT_TRUE = linjen er fyll/kommentar !
+! UT_FALSE = linjen inneholder annen informasjon !
+! !
+!---------------------------------------------------------------!
+*/
+static short ho_TestFyllKommentar(const char *pszTx)
+{
+ for (; *pszTx; ++pszTx) {
+ if (!UT_IsSpace(*pszTx) && *pszTx != '!') return (UT_FALSE);
+ if (*pszTx == '!') return (UT_TRUE);
+ }
+
+ return (UT_TRUE);
+}
+
+
+/*
+AR:2004-05-05
+!---------------------------------------------------------------------!
+! ho_FinnHode - Finner filposisjonen til .HODE !
+! !
+! Retur: UT_TRUE = Lovlig hode er funnet !
+! UT_FALSE = .HODE er ikke funnet, !
+! eller .HODE er ikke første logiske info i filen. !
+! !
+!---------------------------------------------------------------------!
+*/
+short ho_FinnHode(FILE *pFil, UT_INT64 *lHodepos)
+{
+ char tx[LC_MAX_SOSI_LINJE_LEN], *cp;
+ short ierr;
+
+ *lHodepos = 0L;
+
+ // ----- Sjekk at filen starter med .HODE
+ UT_SetPos_i64(pFil,0);
+
+ do
+ {
+ // Husk filposisjonen
+ *lHodepos = _ftelli64(pFil);
+ // Les
+ if ((ierr = UT_ReadLine(pFil,LC_MAX_SOSI_LINJE_LEN,tx)) != UT_OK) {
+
+ return UT_FALSE; // ===> Retur pga. lesefeil
+ }
+ } while (ho_TestFyllKommentar(tx) == UT_TRUE);
+
+
+ // ----- Har nå funnet en linje som inneholder logisk informasjon
+
+ // Hopp over blanke på starten av linjen
+ cp = &tx[0];
+ while (UT_IsSpace(*cp)) {
+ ++cp;
+ ++(*lHodepos);
+ }
+
+ if (strncmp(cp,".HODE",5) == 0) {
+ return UT_TRUE; // ===> Retur, .HODE er funnet
+ }
+
+ return UT_FALSE; // ===> Retur, .HODE er ikke funnet
+}
diff --git a/src/FYBA/FYLB.cpp b/src/FYBA/FYLB.cpp
new file mode 100644
index 0000000..21c1472
--- /dev/null
+++ b/src/FYBA/FYLB.cpp
@@ -0,0 +1,4646 @@
+/* === 920909 ============================================================ */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fylb.c */
+/* Ansvarlig: Andreas Røstad */
+/* Innhold: Bufferhandteringsrutiner for fysak-pc */
+/* ======================================================================= */
+
+#include "stdafx.h"
+
+#include <time.h>
+#include <math.h>
+#include <float.h>
+#include <ctype.h>
+#include <limits.h>
+#include <errno.h>
+
+
+/* Globale strukturer */
+extern LC_SYSTEMADM Sys;
+extern volatile short fyba_initiert; /* Bryter for å vise at LC_Init er utført */
+
+
+/* Funksjonsdefinisjoner for interne funksjoner */
+static void LB_WriteBlank(FILE *fil,short sTegnsett,UT_INT64 ltilpos);
+static char *LB_GetParameter(LB_LESEBUFFER *plb);
+static short LB_TestFyll(const char *pszTx);
+static void LB_WriteRb(void);
+static short LB_FlyttGrTilSlutt(LC_FILADM *pFil, UT_INT64 start, UT_INT64 *neste);
+static short LB_RensOmkrets(LC_POL_OMKR * pPO,long lAktSnr,long lFraSnr);
+static void LR_TestEndreBuepTilKurve(double dDeltaFi);
+
+
+/*
+AR-911011
+CH LC_GetGrFi Hent gruppe-filnr
+CD =============================================================================
+CD Formål:
+CD Henter peker til FilAdm for aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_FILADM * *ppFil u Peker til FilAdm-peker
+CD short status r UT_TRUE = OK, UT_FALSE = Ingen aktuell gruppe
+CD
+CD Bruk:
+CD status = LC_GetGrFi(&pFil);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_GetGrFi(LC_FILADM **ppFil)
+{
+
+ /* Er det noen aktuell gruppe? */
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ *ppFil = Sys.GrId.pFil;
+ return UT_TRUE;
+ }
+
+ /* Ingen aktuell gruppe */
+ return UT_FALSE;
+}
+
+
+/*
+AR-911008
+CH LC_InitNextFil Initier finn neste fil
+CD ==========================================================================
+CD Formål:
+CD Initierer pFil for bruk i finn neste fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ------------------------------------------------------------------------
+CD LC_FILADM **ppFil u Peker til FilAdm-peker
+CD
+CD Bruk:
+CD LC_InitNextFil(&pFil)
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_InitNextFil(LC_FILADM **ppFil)
+{
+ *ppFil = (LC_FILADM *)-1L;
+}
+
+
+/*
+AR-911008
+CH LC_NextFil Finn neste fil
+CD ==========================================================================
+CD Formål:
+CD Finn neste fil i aktuell base.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM **ppFil iu Peker til FilAdm-peker
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR, LC_BAKGR og /eller LC_SEKV
+CD (Bruk "|" for å kombinere.)
+CD short sStatus r Status UT_TRUE=OK, UT_FALSE=ingen flere funnet
+CD
+CD Bruk:
+CD LC_FILADM *pFil;
+CD Denne løkka går gjennom alle framgrunns-filene i basen
+CD LC_InitNextFil(&pFil)
+CD while (LC_NextFil(&pFil,LC_FRAMGR)) {
+CD pszFilNavn = LC_GetFiNa(pFil);
+CD .
+CD Behandle filnavnet
+CD .
+CD }
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_NextFil(LC_FILADM **ppFil,unsigned short usLag)
+{
+ LC_FILADM *pF;
+
+ /* Første gang */
+ if (*ppFil == (void *)-1L) {
+ pF = Sys.pAktBase->pForsteFil;
+
+ } else {
+ /* LO_TestFilpeker(*ppFil,"LC_NextFil"); */
+ LO_TestFilpeker(*ppFil,"NextFil");
+ pF = (*ppFil)->pNesteFil;
+ }
+
+ /* Er det flere filer i basen? */
+ while (pF != NULL) {
+ /* Er filen i rett lag? */
+ if (pF->usLag & usLag) {
+ *ppFil = pF;
+ return UT_TRUE;
+
+ /* Ikke rett lag, fortsett til neste fil */
+ } else {
+ pF = pF->pNesteFil;
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-911001
+CH LC_InitNextBgr Initier finn neste gruppe
+CD ==========================================================================
+CD Formål:
+CD Initierer Bgr for bruk i finn neste gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ------------------------------------------------------------------------
+CD LC_BGR * pBgr iu Peker til gruppestruktur
+CD
+CD Bruk:
+CD LC_InitNextBgr(&Bgr)
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_InitNextBgr(LC_BGR * pBgr)
+{
+ pBgr->pFil = Sys.pAktBase->pForsteFil;
+ pBgr->lNr = -1L;
+}
+
+
+/*
+AR-911003
+CH LC_NextBgr Finn neste gruppe
+CD ==========================================================================
+CD Formål:
+CD Finn neste gruppe i aktuell base.
+CD Sekvensielle filer blir ikke håndtert.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pBgr iu Peker til gruppestruktur der gruppenummer lagres
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR og /eller LC_BAKGR
+CD (Bruk "|" for å kombinere.)
+CD short sStatus r Status UT_TRUE=OK, UT_FALSE=ingen flere grupper
+CD
+CD Bruk:
+CD LC_BGR Bgr;
+CD Denne løkka går gjennom alle framgrunns-gruppene i basen
+CD LC_InitNextBgr(&Bgr);
+CD while (LC_NextBgr(&Bgr,LC_FRAMGR)) {
+CD gnavn = LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+CD .
+CD Behandle gruppen
+CD .
+CD }
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_NextBgr(LC_BGR * pBgr,unsigned short usLag)
+{
+ LC_GRTAB_LINJE * grtp;
+
+
+ /* Er det noen fil i basen? */
+ while (pBgr->pFil != NULL) {
+ LO_TestFilpeker(pBgr->pFil,"NextBgr");
+ /* Er filen i rett lag? */
+ if (pBgr->pFil->usLag & usLag) {
+ /* Flere grupper i aktuell fil? */
+ while (pBgr->lNr < pBgr->pFil->lAntGr -1) {
+ pBgr->lNr++;
+
+ /*
+ * Sjekk gruppetabellen om gruppen er sletta
+ *
+ * (Permanent sletta, eller vanlig NGIS-modus, og
+ * "NGIS-gruppe" merka som sletta.)
+ */
+
+ grtp = LI_GetGrt(pBgr->pFil,pBgr->lNr);
+ if (! (grtp->ngi == 0 ||
+ (Sys.sNGISmodus == NGIS_NORMAL &&
+ grtp->info & GI_NGIS &&
+ grtp->info & GI_SLETTA))) {
+
+ return UT_TRUE;
+ }
+ }
+ }
+
+ /* Neste fil i basen */
+ pBgr->pFil = pBgr->pFil->pNesteFil;
+ pBgr->lNr = -1L;
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-911003
+CH LC_InqAntFiler Finn antall filer i basen
+CD ==========================================================================
+CD Formål:
+CD Finn antall filer i aktuell base.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -------------------------------------------------------------------
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR og /eller LC_BAKGR
+CD (Bruk "|" for å kombinere.)
+CD short sAntall r Antall filer i aktuell base.
+CD
+CD Bruk:
+CD Finner antall framgrunnsfiler i basen
+CD sAntall = LC_InqAntFiler(LC_FRAMGR);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_InqAntFiler(unsigned short usLag)
+{
+ short sAntall = 0;
+
+ if (fyba_initiert == 1)
+ {
+ if (Sys.pAktBase != NULL)
+ {
+ if (usLag & LC_FRAMGR) sAntall += Sys.pAktBase->sAntFramgrFil;
+ if (usLag & LC_BAKGR) sAntall += Sys.pAktBase->sAntBakgrFil;
+ }
+ }
+
+ return sAntall;
+}
+
+
+/*
+AR-911001
+CH LC_GetGrNr Hent gruppe-nummer
+CD ==========================================================================
+CD Formål:
+CD Henter gruppenummer for aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pBgr iu Peker til gruppestruktur der gruppenummer lagres
+CD short status r Status UT_TRUE=OK, UT_FALSE=ingen aktuell gruppe
+CD
+CD Bruk:
+CD status = LC_GetGrNr(&Bgr)
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetGrNr(LC_BGR * pBgr)
+{
+ pBgr->pFil = Sys.GrId.pFil;
+ pBgr->lNr = Sys.GrId.lNr;
+
+ /* Er det noen aktuell gruppe? */
+ if (Sys.GrId.lNr != INGEN_GRUPPE) return UT_TRUE;
+
+ /* Ingen aktuell gruppe */
+ return UT_FALSE;
+}
+
+
+/*
+AR-911001
+CH LC_GetGrPara Hent gruppe-parametre
+CD ==========================================================================
+CD Formål:
+CD Henter diverse opplysninger om aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD-------------------------------------------------------------------------
+CD short *ngi u Antall linjer GINFO
+CD long *nko u Antall koordinater
+CD short *info u Diverse informasjon. En sum av følgende:
+CD GI_PINFO = gruppen har PINFO
+CD GI_NAH = gruppen har høyde informasjon (..NØH)
+CD GI_NAD = gruppen har dybde informasjon (..NØD)
+CD GI_KP = gruppen har knutepunkt (...KP n)
+CD GI_REF = gruppen har referanser (.. :n)
+CD GI_OY_REF= gruppen har referanser med øy
+CD GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+CD GI_SLETTA = gruppen er sletta (merka som sletta)
+CD GI_READ_ONLY = gruppen kan ikke endres.
+CD
+CD short gnavn r Gruppenavn. (Se under $LENKE<LC_RxGr>)
+CD
+CD Bruk:
+CD gnavn = LC_GetGrPara(&ngi,&nko,&info);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetGrPara(short *ngi,long *nko,unsigned short *info)
+{
+ /* Feil ==> Ingen aktuell gruppe */
+ if (Sys.GrId.lNr == INGEN_GRUPPE) {
+ *ngi = 0;
+ *nko = 0;
+ return INGEN_GRUPPE;
+
+ /* Lovlig gruppe */
+ } else {
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+ return Sys.pGrInfo->gnavn;
+ }
+
+}
+
+
+/*
+AR-900107
+CH LC_GetGrParaBgr Hent gruppe-parametre for gruppe
+CD =============================================================================
+CD Formål:
+CD Henter diverse opplysninger om gitt gruppenummer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD------------------------------------------------------------------------------
+CD LC_BGR * pBgr i Gruppenummer det ønskes opplysninger om.
+CD short *ngi u Antall linjer GINFO (0=sletta eller ulovlig nummer)
+CD long *nko u Antall koordinater
+CD unsigned short *info u Diverse informasjon. En sum av følgende:
+CD GI_PINFO = gruppen har PINFO
+CD GI_NAH = gruppen har høyde informasjon (..NØH)
+CD GI_NAD = gruppen har døbde informasjon (..NØD)
+CD GI_KP = gruppen har knutepunkt (...KP n)
+CD GI_REF = gruppen har referanser (.. :n)
+CD GI_OY_REF= gruppen har referanser med øy
+CD GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+CD GI_SLETTA = gruppen er sletta (merka som sletta)
+CD GI_READ_ONLY = gruppen kan ikke endres.
+CD short gnavn r Gruppenavn. (Se under $LENKE<LC_RxGr>)
+CD
+CD Bruk:
+CD gnavn = LC_GetGrParaBgr(pBgr,&ngi,&nko,&info,&snr);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_GetGrParaBgr(LC_BGR * pBgr,short *ngi,long *nko,unsigned short *info)
+{
+ LC_GRTAB_LINJE * grtp;
+
+ /* Aktuell gruppe */
+ if (pBgr->pFil == Sys.GrId.pFil && pBgr->lNr == Sys.GrId.lNr) {
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+ return Sys.pGrInfo->gnavn; /* ==> retur */
+ }
+
+ /* Hent fra gruppetabellen */
+ LO_TestFilpeker(pBgr->pFil,"GetGrParaBgr");
+ grtp = LI_GetGrt(pBgr->pFil,pBgr->lNr);
+
+ /* Sjekk om NGIS-gruppe og merka som sletta */
+ if (Sys.sNGISmodus == NGIS_NORMAL && /* Vanlig modus, og */
+ grtp->info & GI_NGIS && /* oppdater NGIS, og */
+ grtp->info & GI_SLETTA) { /* merka som sletta */
+
+ *ngi = 0;
+ *nko = 0;
+
+ } else {
+ *ngi = grtp->ngi;
+ *nko = grtp->nko;
+ }
+
+ *info = grtp->info;
+
+ return grtp->gnavn; /* ==> retur */
+}
+
+
+/*
+AR-900107
+CH LC_GetObjtypeBgr Hent objekttype
+CD =============================================================================
+CD Formål:
+CD Henter objekttype for gitt gruppenummer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD------------------------------------------------------------------------------
+CD LC_BGR *pBgr i Gruppenummer det ønskes opplysninger om.
+CD char *pszObjtype r OBJTYPE
+CD NULL hvis gruppen ikke finnes
+CD
+CD Bruk:
+CD pszObjtype = LC_GetObjtypeBgr(pBgr);
+=============================================================================
+*/
+SK_EntPnt_FYBA const char *LC_GetObjtypeBgr(LC_BGR * pBgr)
+{
+ LC_GRTAB_LINJE * grtp;
+
+ /* Aktuell gruppe */
+ if (pBgr->pFil == Sys.GrId.pFil && pBgr->lNr == Sys.GrId.lNr) {
+ return Sys.pGrInfo->szObjtype; /* ==> retur */
+ }
+
+ /* Hent fra gruppetabellen */
+ LO_TestFilpeker(pBgr->pFil,"GetObjtypeBgr");
+ grtp = LI_GetGrt(pBgr->pFil,pBgr->lNr);
+
+ /* Sjekk om NGIS-gruppe og merka som sletta */
+ if (Sys.sNGISmodus == NGIS_NORMAL && /* Vanlig modus, og */
+ grtp->info & GI_NGIS && /* oppdater NGIS, og */
+ grtp->info & GI_SLETTA) /* merka som sletta */
+ {
+ return ""; /* ==> retur */
+ }
+
+ return grtp->szObjtype; /* ==> retur */
+}
+
+
+/*
+AR-911001
+CH LC_RsGr Les gruppe sekvensielt
+CD ==========================================================================
+CD Formål:
+CD Leser en datagruppe fra ekstern SOSI-fil inn i aktuell gruppe i ringbuffer.
+CD Rutinen tilsvarer put fra brukerprogram inn i ringbufferet, men rutinen
+CD tildeler selv nødvendig plass..
+CD Gruppen beholder serienummer tildelt i LC_NyGr.
+CD Brukerindeks og geografisk-indeks blir ikke oppdatert.
+CD (Dette skjer først når gruppen skrives til basen.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short *rstat iu Lesestatus
+CD Inn: 1=Les fra starten, 0=Les neste
+CD Ut: 0=OK, -1=slutten av filen er nådd
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short *ngi u Antall linjer GINFO
+CD long *nko u Antall koordinater
+CD unsigned short *info u Diverse informasjon. En "sum" av følgende:
+CD GI_PINFO = gruppen har PINFO
+CD GI_NAH = gruppen har høyde informasjon (..NØH)
+CD GI_NAD = gruppen har dybde informasjon (..NØD)
+CD GI_KP = gruppen har knutepunkt (...KP n)
+CD GI_REF = gruppen har referanser (.. eller ..REF)
+CD GI_OY_REF = gruppen har referanser med øy
+CD GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+CD GI_SLETTA = gruppen er sletta (merka som sletta)
+CD GI_READ_ONLY = gruppen kan ikke endres.
+CD long gml_snr u Serienummer gruppen hadde på ekstern fil
+CD short gnavn r Gruppenavn. (Se under $LENKE<LC_RxGr>)
+CD
+CD Bruk:
+CD gnavn = LC_RsGr(&rstat,pFil,&ngi,&nko,&info,&gml_snr);
+CD if (info & GI_PINFO) (gruppen har PINFO)
+CD ;
+CD if (info & GI_KP) (gruppen har KP)
+CD ;
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_RsGr(short *rstat,LC_FILADM *pFil,short *ngi,long *nko,
+ unsigned short *info,long *gml_snr)
+{
+ short siste;
+ long snr;
+ UT_INT64 slutt;
+
+ /* LO_TestFilpeker(pFil,"LC_RsGr"); */
+ LO_TestFilpeker(pFil,"RsGr");
+
+ if (Sys.GrId.lNr == INGEN_GRUPPE) { /* Feil ==> Ingen aktuell gruppe */
+ LC_Error(31,"(LC_RsGr)","");
+
+ /* Feil ==> Ulovlig ekstern fil */
+ } else if (pFil->usLag != LC_SEKV) {
+ LC_Error(32,"(LC_RsGr)","");
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+
+ } else { /* Lovlig gruppe */
+ Sys.sPibufStatus = LC_PIBUF_TOM;
+ Sys.sGrEndra = END_KOPI;
+ if (*rstat == 1) {
+ pFil->n64AktPos = 0L; /* Sett ny startposisjon */
+ }
+
+ /* Husk snr */
+ snr = LC_GetSn();
+
+ /* Les fra ekstern fil */
+ siste = LB_RGru(pFil,pFil->n64AktPos,&slutt);
+
+ /* Snr fra ekstern fil */
+ *gml_snr = LC_GetSn();
+
+ /* Legg tilbake SNR */
+ LC_PutSn(snr);
+
+ if (siste) {
+ *rstat = -1;
+
+ } else {
+ *rstat = 0;
+ pFil->n64AktPos = slutt;
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+ }
+ }
+ return Sys.pGrInfo->gnavn;
+}
+
+
+/*
+AR-911001
+CH LC_RsHode Les filhode sekvensiellt
+CD ==========================================================================
+CD Formål:
+CD Leser et filhode fra ekstern SOSI-fil inn i aktuell gruppe i ringbuffer.
+CD Rutinen tilsvarer put fra brukerprogram inn i ringbufret, men rutinen
+CD tildeler selv nødvendig plass i RB.
+CD Denne rutinen er stort sett lik LC_RsGr, men LC_RsHode forandrer
+CD ikke aktuell filposisjon på den sekvensielle filen.
+CD Gruppen beholder serienummer hodet hadde på SOSI-filen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short *ngi u Antall linjer GINFO
+CD long *nko u Antall koordinater
+CD unsigned short *info u Diverse informasjon. En "sum" av følgende:
+CD GI_PINFO = gruppen har PINFO
+CD GI_NAH = gruppen har høyde informasjon (..NØH)
+CD GI_NAD = gruppen har dybde informasjon (..NØD)
+CD GI_KP = gruppen har knutepunkt (...KP n)
+CD GI_REF = gruppen har referanser (.. :n)
+CD GI_OY_REF= gruppen har referanser med øy
+CD short gnavn r Gruppenavn. (Se under $LENKE<LC_RxGr>)
+CD
+CD Bruk:
+CD gnavn = LC_RsHode(pFil,&ngi,&nko,&info);
+ =============================================================================
+*/
+short LC_RsHode(LC_FILADM *pFil,short *ngi,long *nko,unsigned short *info)
+{
+ UT_INT64 slutt;
+
+ /* LO_TestFilpeker(pFil,"LC_RsHode"); */
+ LO_TestFilpeker(pFil,"RsHode");
+
+ if (Sys.GrId.lNr == INGEN_GRUPPE){ /* Feil ==> Ingen aktuell gruppe */
+ LC_Error(31,"(LC_RsHode)","");
+
+ /* Feil ==> Ulovlig ekstern fil */
+ } else if (pFil->usLag != LC_SEKV) {
+ LC_Error(32,"(LC_RsHode)","");
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+
+ } else { /* Lovlig gruppe */
+
+ /* Les fra ekstern fil */
+ LB_RGru(pFil,0,&slutt);
+
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+ Sys.sGrEndra = END_KOPI;
+ }
+
+ return Sys.pGrInfo->gnavn;
+}
+
+
+/*
+AR-930610
+CH LC_WsGr Skriv gruppe sekvensiellt
+CD =============================================================================
+CD Formål:
+CD Skriver aktuell gruppe til ekstern, sekvensiell SOSI-fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD LC_WsGr(pFil);
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_WsGr(LC_FILADM *pFil)
+{
+ UT_INT64 neste = LLONG_MAX;
+
+ LO_TestFilpeker(pFil,"WsGr");
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Feil ==> Ulovlig ekstern fil */
+ if (pFil->usLag != LC_SEKV) {
+ LC_Error(33,"(LC_WsGr)","");
+
+ /* Feil ==> Ikke skriveaksess */
+ //} else if (pFil->sAccess != UT_UPDATE || pFil->lNgisLag == LC_NGIS_LES) {
+ } else if (pFil->sAccess != UT_UPDATE || strcmp(pFil->szNgisLag,"0") == 0 ) {
+ LC_Error(34,"(LC_WsGr)","");
+
+ /* OK ==> Skriv */
+ } else {
+ /* Sjekk at SOSI-filen har hode */
+ if ((pFil->TransMaske & LC_TR_ENHET) == 0 && Sys.pGrInfo->gnavn != L_HODE) {
+ LC_Error(141,"(LC_WsGr)",pFil->pszNavn);
+ }
+
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Oppdater filtabellen */
+ LO_BeFt(pFil);
+ }
+
+ LB_WGru(SKRIV_SISTE,1,Sys.pGrInfo->nko,pFil,pFil->n64AktPos,&neste);
+ pFil->n64AktPos = neste;
+
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_WsGr)","");
+ }
+}
+
+
+/*
+AR-930610
+CH LC_WsGrPart Skriv del av gruppe sekvensiellt
+CD ==========================================================================
+CD Formål:
+CD Skriver en del av aktuell gruppe til ekstern, sekvensiell SOSI-fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long fra_punkt i Punktnummer for første koordinat som skal skrives.
+CD (Lovlig: 1 <= fra_punkt <= nko)
+CD long antall i Antall koordinatlinjer som skal skrives.
+CD (Lovlig: 0 <= antall <= nko)
+CD
+CD Bruk:
+CD LC_WsGrPart(pFil,fra_punkt,antall);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_WsGrPart(LC_FILADM *pFil,long fra_punkt,long antall)
+{
+ UT_INT64 neste = LLONG_MAX;
+
+ LO_TestFilpeker(pFil,"WsGrPart");
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Feil ==> Ulovlig ekstern fil */
+ if (pFil->usLag != LC_SEKV) {
+ LC_Error(33,"(LC_WsGr)","");
+
+ /* Feil ==> Ikke skriveaksess */
+ //} else if (pFil->sAccess != UT_UPDATE || pFil->lNgisLag == LC_NGIS_LES) {
+ } else if (pFil->sAccess != UT_UPDATE || strcmp(pFil->szNgisLag,"0") == 0 ) {
+
+ LC_Error(34,"(LC_WsGr)","");
+
+ /* OK ==> Skriv */
+ } else{
+ /* Sjekker at punktnummer er lovlig */
+ fra_punkt = min( max(1,fra_punkt), max(1,Sys.pGrInfo->nko) );
+ antall = min( max(antall,0), (Sys.pGrInfo->nko-fra_punkt+1) );
+
+ /* Skriver */
+ LB_WGru(SKRIV_SISTE,fra_punkt,antall,pFil,pFil->n64AktPos,&neste);
+ pFil->n64AktPos = neste;
+
+ if (Sys.pGrInfo->gnavn == L_HODE){ /* Oppdater filtabellen */
+ LO_BeFt(pFil);
+ }
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_WsGr)","");
+ }
+}
+
+
+/*
+AR:2000-10-17
+CH LC_EndreHode Endre hodet på eksisterende SOSI-fil
+CD =============================================================================
+CD Formål:
+CD Skriver aktuell gruppe til starten av sekvensiell SOSI-fil.
+CD Det er en forutsetning at aktuell gruppe er et filhode.
+CD Denne rutinen er stort sett lik LC_WsGr, men LC_EndreHode forandrer ikke
+CD aktuell filposisjon på den sekvensielle filen.
+CD OBS!
+CD Det må være nok ledig plass før neste gruppe for tilbakeskrivingen.
+CD Det er ikke mulig å forandre koordinatsystem, enhet eller origo på fil
+CD som inneholder data.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short oppdatert r Skrivestatus (1=OK, 0=Det er ikke plass
+CD til å skrive hodet)
+CD
+CD Bruk:
+CD ist = LC_EndreHode(pFil);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_EndreHode(LC_FILADM *pFil)
+{
+ short tegnsett,siste,oppdatert=0;
+ UT_INT64 neste;
+ char* pszNgisLag;
+ unsigned short Maske = LC_TR_ALLT;
+ LC_TRANSPAR Trans;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* LO_TestFilpeker(pFil,"LC_EndreHode"); */
+ LO_TestFilpeker(pFil,"EndreHode");
+
+ /* Feil ==> Ulovlig ekstern fil */
+ if (pFil->usLag != LC_SEKV) {
+ LC_Error(33,"(LC_EndreHode)","");
+
+ /* Feil ==> Ikke skriveaksess */
+ } else if (pFil->sAccess != UT_UPDATE || strcmp(pFil->szNgisLag,"0") == 0 ) {
+ LC_Error(34,"(LC_EndreHode)","");
+
+ /* OK */
+ } else {
+ /* Sjekk at aktuell gruppe er filhode */
+ if (Sys.pGrInfo->gnavn != L_HODE) {
+ /* Feil ==> Ikke filhode */
+ LC_Error(98,"(LC_EndreHode)","");
+
+ } else { /* OK ==> Skriv */
+ /* Finn ledig plass for å skrive */
+ siste = LB_Plass(pFil,0,&neste);
+ /* Sjekk mot ledig plass */
+ if (LB_WGru(KONTROLLER_PLASS,1,Sys.pGrInfo->nko,pFil,0,&neste)) {
+ /* Det er plass nok */
+
+ /* Hent hode-opplysninger det ikke er lov til å endre når det er data i filen */
+ LC_GetTransEx(&Maske,&Trans);
+ LC_GetTegnsett(&tegnsett);
+ pszNgisLag = LH_GetNgisLag();
+
+ /* Skriv hvis siste gruppe, eller transpar, tegnsett og NGIS-lag er uendret */
+ if (siste || (memcmp(&pFil->TransPar,&Trans,sizeof(LC_TRANSPAR)) == 0 &&
+ pFil->sTegnsett == tegnsett)) {
+
+ if ( strcmp(pFil->szNgisLag,pszNgisLag) == 0) {
+ LO_BeFt(pFil);
+ LB_WGru(SKRIV_VANLIG,1,Sys.pGrInfo->nko,pFil,0,&neste);
+ oppdatert = 1;
+
+ } else {
+ /* Koord.sys, enhet, origo eller tegnsett er endret */
+ LC_Error(96,"(LC_EndreHode)","");
+ }
+
+ } else {
+ /* Koord.sys, enhet, origo eller tegnsett er endret */
+ LC_Error(96,"(LC_EndreHode)","");
+ }
+
+ } else { /* Det er ikke plass til å skrive hodet */
+ LC_Error(97,"(LC_EndreHode)","");
+ }
+ }
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_EndreHode)","");
+ }
+
+ return oppdatert;
+}
+
+
+/*
+AR-920810
+CH LC_RxGr Les gruppe fra base
+CD ==========================================================================
+CD Formål:
+CD Velger en gruppe som aktiv gruppe, og leser den fra SOSI-filen hvis den
+CD ikke er i RB fra før. (Styres også av les_sosi.)
+CD Hvis gruppen ikke finnes (sletta eller ulovlig gruppenummer) returneres
+CD ngi=0 og nko=0.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pBgr i Peker til fil- og gruppenummer.
+CD short les_sosi i Lesemetode: Følgende konstanter er definert:
+CD LES_OPTIMALT (0 = Les mest effektivt base/SOSI)
+CD LES_SOSI (1 = Les alltid fra SOSI-filen)
+CD short *ngi u Antall linjer GINFO
+CD long *nko u Antall koordinater
+CD unsigned short *info u Diverse informasjon. En sum av følgende:
+CD GI_PINFO = gruppen har PINFO
+CD GI_NAH = gruppen har høyde informasjon (..NØH)
+CD GI_NAD = gruppen har dybde informasjon (..NØD)
+CD GI_KP = gruppen har knutepunkt (...KP n)
+CD GI_REF = gruppen har referanser (.. eller ..REF)
+CD GI_OY_REF = gruppen har referanser med øy
+CD GI_NGIS = gruppen er tatt ut fra NGIS for oppdat.
+CD GI_SLETTA = gruppen er sletta (merka som sletta)
+CD GI_READ_ONLY = gruppen kan ikke endres.
+CD short gnavn r Gruppenavn - Følgende konstanter er definert:
+CD INGEN_GRUPPE = Gruppen finnes ikke, ikke lest.
+CD L_SLUTT = (.SLUTT)
+CD L_PUNKT = (.PUNKT)
+CD L_LINJE = (.LINJE)
+CD L_KURVE = (.KURVE)
+CD L_BUE = (.BUE)
+CD L_BUEP = (.BUEP)
+CD L_SIRKEL = (.SIRKEL)
+CD L_SIRKELP = (.SIRKELP)
+CD L_KLOTOIDE = (.KLOTOIDE)
+CD L_SVERM = (.SVERM)
+CD L_TEKST = (.TEKST)
+CD L_TRASE = (.TRASE)
+CD L_FLATE = (.FLATE)
+CD L_BEZIER = (.BEZIER)
+CD L_RASTER = (.RASTER)
+CD L_DEF = (.DEF)
+CD L_OBJDEF = (.OBJDEF)
+CD L_MLINJE = (.MLINJE)
+CD L_STRUKTUR = (.STRUKTUR)
+CD L_OBJEKT = (.OBJEKT)
+CD L_SYMBOL = (.SYMBOL)
+CD L_HODE = (.HODE)
+CD
+CD
+CD Bruk:
+CD gnavn = LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+CD if (info & GI_PINFO) (gruppen har PINFO)
+CD ;
+CD if (info & GI_KP) (gruppen har KP)
+CD ;
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_RxGr(LC_BGR * pBgr,short les_sosi,short *ngi,long *nko,unsigned short *info)
+{
+ UT_INT64 slutt;
+ short sNyGruppe = UT_TRUE;
+
+ LO_TestFilpeker(pBgr->pFil,"RxGr");
+
+ // Har aktuell gruppe
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ sNyGruppe = Sys.GrId.pFil != pBgr->pFil || Sys.GrId.lNr != pBgr->lNr;
+
+ // Hvis aktuell gruppe er endret, skriv den
+ if (Sys.sGrEndra != END_UENDRA) {
+ if (!(!sNyGruppe && les_sosi == LES_SOSI)) {
+ if (LC_WxGr(SKRIV_OPTIMALT) == UT_FALSE) {
+ // "Kan ikke lese ny gruppe. Du har ikke skriveaksess for å lagre aktuell gruppe som er endret. Fil :"
+ LC_Error(163, "(LC_RxGr)", Sys.GrId.pFil->pszNavn);
+ }
+ }
+ }
+ }
+
+ Sys.sGrEndra = END_UENDRA;
+ Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Lovlig gruppe */
+ if (pBgr->lNr >= 0L && pBgr->lNr < pBgr->pFil->lAntGr) {
+ Sys.GrId = *pBgr;
+ /* Hent fra gruppe-tabellen */
+ Sys.pGrInfo = LI_GetGrt(pBgr->pFil,pBgr->lNr);
+ /* Sjekk om gruppen er sletta */
+ if (Sys.pGrInfo->ngi == 0 || /* Permanent sletta, eller */
+ (Sys.sNGISmodus == NGIS_NORMAL && /* Vanlig modus, og */
+ Sys.pGrInfo->info & GI_NGIS && /* oppdater NGIS, og */
+ Sys.pGrInfo->info & GI_SLETTA)) { /* merka som sletta */
+
+ /* Gruppen er sletta */
+ ;
+ Sys.GrId.lNr = INGEN_GRUPPE;
+ Sys.pGrInfo = NULL;
+ *ngi = 0;
+ *nko = 0;
+ return -1; /* retur ===> */
+
+ } else { /* Gruppen er OK */
+ /* Tvungen les fra SOSI-filen av samme gruppe */
+ if (les_sosi == LES_SOSI) {
+ /* Les fra SOSI-filen */
+ LB_RGru(pBgr->pFil,Sys.pGrInfo->sosi_st,&slutt);
+ if (!sNyGruppe) {
+ Sys.sGrEndra = END_ENDRA;
+ }
+ LC_OppdaterEndret(O_GINFO);
+
+ /* Hent fra buffer-fil */
+ } else if (sNyGruppe) {
+ Sys.GrId = *pBgr;
+
+ LI_ReadRb(pBgr->pFil,Sys.pGrInfo->rb_st,Sys.Ginfo.pszTx,Sys.pGrInfo->ulGiLen, Sys.pdAust,
+ Sys.pdNord, Sys.pInfo, Sys.pGrInfo->nko, Sys.pszPinfo,
+ Sys.pGrInfo->ulPiLen);
+ LX_CreGiPeker(&Sys.Ginfo,Sys.pGrInfo->ngi);
+ }
+
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+ return Sys.pGrInfo->gnavn; /* retur ===> */
+ }
+ }
+
+ /* Ulovlig gruppe */
+ Sys.GrId.lNr = INGEN_GRUPPE;
+ Sys.pGrInfo = NULL;
+ *ngi = 0;
+ *nko = 0;
+ return -1; /* retur ===> */
+}
+
+
+/*
+AR-911001
+CH LC_WxGr Skriv gruppe til base
+CD ==========================================================================
+CD Formål:
+CD Skriver aktuell gruppe til tilhørende SOSI-fil.
+CD Brukerindeks og geografisk indeks oppdateres straks, uavhengig av kø.
+CD Ledig plass fram til neste gruppe blir blanket.
+CD Filhode blir ALLTID skrevet direkte til SOSI-filen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ------------------------------------------------------------------------
+CD short k_stat i Skrivemetode: Følgende konstanter er definert:
+CD SKRIV_OPTIMALT = Skriv mest effektivt kø/SOSI
+CD SKRIV_SOSI = Skriv direkte til SOSI-filen
+CD short status r Status: UT_TRUE = OK
+CD UT_FALSE = Ikke utført, pga. feil.
+CD
+CD Bruk:
+CD LC_WxGr(k_stat)
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_WxGr(short k_stat)
+{
+ short pnr,nivaa;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) /* Aktuell gruppe OK */
+ {
+ if (Sys.sGrEndra != END_UENDRA) /* Gruppen er endra, må skrive */
+ {
+ /* Har skriveaksess? */
+ //if (Sys.GrId.pFil->sAccess == UT_UPDATE &&
+ // (Sys.GrId.pFil->szNgisLag[0] == '\0' || strcmp(Sys.GrId.pFil->szNgisLag,"0") != 0 ) ) {
+
+ //if (Sys.GrId.pFil->sAccess == UT_UPDATE &&
+ // (Sys.GrId.pFil->szNgisLag[0] == '\0' || Sys.sNGISmodus == NGIS_SPESIAL) ) {
+
+ if (Sys.GrId.pFil->sAccess != UT_UPDATE ||
+ ((Sys.sNGISmodus == NGIS_NORMAL) && (strcmp(Sys.GrId.pFil->szNgisLag,"0")) == 0) )
+ {
+ /* Ikke skriveaksess */
+ LC_Error(34,"(LC_WxGr)",Sys.GrId.pFil->pszNavn);
+
+ return UT_FALSE; // ===> Retur ved feil
+
+ } else {
+
+ /* Sjekk at SOSI-filen har hode */
+ if ((Sys.GrId.pFil->TransMaske & LC_TR_ENHET) == 0 && Sys.pGrInfo->gnavn != L_HODE) {
+ LC_Error(141,"(LC_WxGr)",Sys.GrId.pFil->pszNavn);
+ }
+
+ if (Sys.sGrEndra == (short)END_ENDRA) {
+ // Kontroller prikknivå i egenskaper ?
+
+ // Oppdater ..NGIS-FLAGG
+ LC_OppdaterEndret(O_ENDRET);
+ }
+
+ Sys.sGrEndra = END_UENDRA;
+
+ // Filhode som ligger som første gruppe på filen
+ // Oppdater filtabellen
+ if (Sys.pGrInfo->gnavn == L_HODE && Sys.GrId.lNr == 0) {
+ LO_BeFt(Sys.GrId.pFil);
+
+ // Ajourfører gruppetabellen med kvalitet og enhet
+ } else {
+ nivaa = 2;
+ pnr = 1;
+ LC_GetCurKvalitet(Sys.GrId.pFil,&nivaa,pnr,
+ &Sys.pGrInfo->Kvalitet.sMetode,
+ &Sys.pGrInfo->Kvalitet.lNoyaktighet,
+ &Sys.pGrInfo->Kvalitet.sSynbarhet,
+ &Sys.pGrInfo->Kvalitet.sHoydeMetode,
+ &Sys.pGrInfo->Kvalitet.lHoydeNoyaktighet);
+
+ nivaa = 2;
+ LC_GetCurEnhet(Sys.GrId.pFil, &nivaa, &Sys.pGrInfo->dEnhet,
+ &Sys.pGrInfo->dEnhetHoyde, &Sys.pGrInfo->dEnhetDybde);
+
+ /* Avrund buffer til riktig enhet */
+ LC_RoundKoord();
+ }
+
+ /* Skriv til buffer-fil */
+ LB_WriteRb();
+
+ /* Skriv direkte, eller filhode */
+ if (k_stat == SKRIV_SOSI || Sys.pGrInfo->gnavn == L_HODE) {
+ LB_Swap();
+
+ /* Legg inn i skrivekøa */
+ } else {
+ Sys.lAntSkriv++;
+ LI_SetBt (Sys.GrId.pFil, Sys.GrId.lNr, BT_SKRKO);
+
+ /* Tøm køa hvis den er full */
+ if (Sys.lAntSkriv > Sys.lMaxSkriv) {
+ LC_Save();
+ }
+ }
+
+ /* ----------------------------- Oppdater indekser */
+ LS_Indx(); /* Serienummer */
+
+ LR_Indx(); /* Primær geografisk */
+
+ if (Sys.pGrInfo->gnavn == L_FLATE) {
+ LR_IndxFlate(); /* Flate geografisk */
+ }
+
+ Sys.pGrInfo->ulPrior[0] = 0UL; /* Prioritetstabell */
+ Sys.pGrInfo->ulPrior[1] = 0UL;
+ Sys.pGrInfo->ulPrior[2] = 0UL;
+ Sys.pGrInfo->ulPrior[3] = 0UL;
+
+ //} else { /* Ikke skriveaksess */
+ // LC_Error(34,"(LC_WxGr)","");
+ }
+ }
+ }
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-930907
+CH LB_WriteRb Skriv aktuell gruppe til buffer-filen
+CD ===========================================================================
+CD Formål:
+CD Skriv aktuell gruppe til buffer-filen.
+CD
+CD Parametre: ingen
+CD
+CD Bruk:
+CD LB_WriteRb();
+==============================================================================
+*/
+static void LB_WriteRb(void)
+{
+ LC_GRTAB_LINJE *pForrigeGrInfo, *pNesteGrInfo;
+ long lLen;
+
+
+ lLen = LI_BerBufferLen(Sys.pGrInfo->ulGiLen,Sys.pGrInfo->nko,Sys.pGrInfo->ulPiLen);
+
+ /* Er ikke på filen fra før, tildel ny plass */
+ if (Sys.pGrInfo->rb_st == NY_RB_ST) {
+ Sys.pGrInfo->rb_st = Sys.GrId.pFil->n64NesteLedigRbPos;
+ Sys.GrId.pFil->n64NesteLedigRbPos += (UT_INT64)lLen;
+ /* Oppdater kjeden */
+ pForrigeGrInfo = LI_GetGrt (Sys.GrId.pFil, Sys.GrId.pFil->lSisteGrRb);
+ pForrigeGrInfo->rb_neste_gr = Sys.GrId.lNr;
+ Sys.pGrInfo->rb_forrige_gr = Sys.GrId.pFil->lSisteGrRb;
+ Sys.pGrInfo->rb_neste_gr = INGEN_GRUPPE;
+ Sys.GrId.pFil->lSisteGrRb = Sys.GrId.lNr;
+
+
+ /* Er på filen, sjekk om det er nok ledig plass */
+ } else {
+ /* Siste gruppe i buffer-filen */
+ if (Sys.pGrInfo->rb_neste_gr == INGEN_GRUPPE) {
+ Sys.GrId.pFil->n64NesteLedigRbPos = Sys.pGrInfo->rb_st + (UT_INT64)lLen;
+
+ /* Inne i buffer-filen */
+ } else {
+ pNesteGrInfo = LI_GetGrt(Sys.GrId.pFil,Sys.pGrInfo->rb_neste_gr);
+
+ /* Det er ikke plass, må flytte gruppen til slutten av filen */
+ if (Sys.pGrInfo->rb_st + lLen > pNesteGrInfo->rb_st) {
+ /* Tett "hullet" i kjeden */
+ pNesteGrInfo->rb_forrige_gr = Sys.pGrInfo->rb_forrige_gr;
+ if (Sys.pGrInfo->rb_forrige_gr != INGEN_GRUPPE) {
+ pForrigeGrInfo = LI_GetGrt(Sys.GrId.pFil,Sys.pGrInfo->rb_forrige_gr);
+ pForrigeGrInfo->rb_neste_gr = Sys.pGrInfo->rb_neste_gr;
+ }
+
+ /* Legg til på slutten */
+ Sys.pGrInfo->rb_st = Sys.GrId.pFil->n64NesteLedigRbPos;
+ Sys.GrId.pFil->n64NesteLedigRbPos += (UT_INT64)lLen;
+
+ pForrigeGrInfo = LI_GetGrt (Sys.GrId.pFil, Sys.GrId.pFil->lSisteGrRb);
+ pForrigeGrInfo->rb_neste_gr = Sys.GrId.lNr;
+ Sys.pGrInfo->rb_forrige_gr = Sys.GrId.pFil->lSisteGrRb;
+ Sys.pGrInfo->rb_neste_gr = INGEN_GRUPPE;
+ Sys.GrId.pFil->lSisteGrRb = Sys.GrId.lNr;
+ }
+
+ }
+ }
+
+ LI_WriteRb(Sys.GrId.pFil,Sys.pGrInfo->rb_st,Sys.Ginfo.pszTx,Sys.pGrInfo->ulGiLen,
+ Sys.pdAust, Sys.pdNord, Sys.pInfo, Sys.pGrInfo->nko,
+ Sys.pszPinfo, Sys.pGrInfo->ulPiLen);
+}
+
+
+/*
+AR-930608
+CH LC_RoundKoord Endre koordinatene i buffer til riktig enhet
+CD ===========================================================================
+CD Formål:
+CD Endrer koordinatene i aktuell gruppe i buffer til valgt enhet.
+CD (Rutinen blir utført fra LC_WxGr.)
+CD
+CD Parametre: ingen
+CD
+CD Bruk:
+CD LC_RoundKoord();
+==============================================================================
+*/
+SK_EntPnt_FYBA void LC_RoundKoord(void)
+{
+ short iniv;
+ long pt;
+ double enhet,enhet_h,enhet_d,tall;
+
+ /* Lovlig gruppe */
+ if (Sys.GrId.lNr != INGEN_GRUPPE){
+
+ /* Kan gruppen endres (ikke READ_ONLY) */
+ //if ((Sys.pGrInfo->info & GI_READ_ONLY) == 0 ) {
+ if ((Sys.pGrInfo->info & GI_READ_ONLY) == 0 || Sys.sNGISmodus == NGIS_SPESIAL ) {
+
+ /* Finn aktuell enhet */
+ iniv = 2;
+ LC_GetCurEnhet(Sys.GrId.pFil,&iniv,&enhet,&enhet_h,&enhet_d);
+
+ /* Avrund koordinatene */
+ for (pt=0; pt<Sys.pGrInfo->nko; pt++) {
+ /* Nord */
+ tall = UT_RoundDD(*(Sys.pdNord+pt) / enhet);
+ *(Sys.pdNord+pt) = tall * enhet;
+ /* Øst */
+ tall = UT_RoundDD(*(Sys.pdAust+pt) / enhet);
+ *(Sys.pdAust+pt) = tall * enhet;
+
+ /* Høyde */
+ if (Sys.pGrInfo->info & GI_NAH) {
+ if ((Sys.pInfo+pt)->dHoyde != HOYDE_MANGLER) {
+ tall = UT_RoundDD((Sys.pInfo+pt)->dHoyde / enhet_h);
+ (Sys.pInfo+pt)->dHoyde = tall * enhet_h;
+ }
+
+ /* Dybde */
+ } else if (Sys.pGrInfo->info & GI_NAD) {
+ if ((Sys.pInfo+pt)->dHoyde != HOYDE_MANGLER) {
+ tall = UT_RoundDD((Sys.pInfo+pt)->dHoyde / enhet_d);
+ (Sys.pInfo+pt)->dHoyde = tall * enhet_d;
+ }
+ }
+ }
+ }
+ }
+}
+
+
+/*
+AR-911001
+CH LC_OppdaterEndret Oppdater ..NGIS-FLAGG
+CD ==========================================================================
+CD Formål:
+CD Oppdaterer ..NGIS-FLAGG i GINFO og ajourfører interne tabeller.
+CD Hvis endring = O_GINFO oppateres tabellene i forhold til
+CD eksisterende GINFO.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD endring short i Kode for endring:
+CD O_GINFO (0) = Oppdater interne tabeller i fht. GINFO
+CD O_ENDRET (1) = Merk for endret og oppdat. tab.
+CD O_SLETTET (2) = Merk for slettet og oppdat. tab.
+CD
+CD Bruk:
+CD LC_OppdaterEndret(O_ENDRET);
+=============================================================================
+*/
+SK_EntPnt_FYBA void LC_OppdaterEndret(short endring)
+{
+ short gilin;
+ char *gp;
+ char szFlagg[80];
+
+ /* Finn aktuell parameter */
+ gilin=2;
+ gp = LC_GetGP("..NGIS-FLAGG",&gilin,Sys.pGrInfo->ngi);
+ if (gp == NULL){
+ Sys.pGrInfo->info &= (unsigned short)(~GI_NGIS); /* Ikke NGIS-oppdatering */
+ Sys.pGrInfo->info &= (unsigned short)(~GI_READ_ONLY); /* Ikke READ_ONLY */
+
+ } else {
+ /* Tolk gammel parameter */
+ UT_StrCopy(szFlagg,gp,80);
+
+ /*
+ * Oppdater ..NGIS-FLAGG i GINFO hvis
+ * det er NGIS-standardmodus, og ikke
+ * intern tabelloppdatering.
+ */
+
+ if (Sys.sNGISmodus == NGIS_NORMAL && endring != O_GINFO) {
+ /* Kode */
+ if (endring == O_SLETTET) {
+ szFlagg[0] = 'S';
+
+ } else if (endring == O_ENDRET) {
+ if (szFlagg[0] == 'V') {
+ szFlagg[0] = 'E';
+ }
+ }
+
+ /* Bygg opp ny ginfo */
+ LC_UpdateGP(gilin,"..NGIS-FLAGG",szFlagg);
+ }
+
+
+ /* ---------- Oppdater interne tabeller --------- */
+
+ /* NGIS-oppdatering */
+ Sys.pGrInfo->info |= GI_NGIS;
+
+ /* Flagg for sletting */
+ if (szFlagg[0] == 'S') {
+ Sys.pGrInfo->info |= GI_SLETTA; /* Sletta */
+ } else {
+ Sys.pGrInfo->info &= (unsigned short)(~GI_SLETTA); /* Ikke sletta */
+ }
+
+ /* Flagg for lese/skrive aksess */
+ if (szFlagg[0] == 'R' || szFlagg[0] == 'H') {
+ Sys.pGrInfo->info |= GI_READ_ONLY; /* Bare leseaksess */
+ } else {
+ Sys.pGrInfo->info &= (unsigned short)(~GI_READ_ONLY); /* Både lese- og skriveaksess */
+ }
+ }
+}
+
+
+/*
+AR-911001
+CH LC_FiLastGr Finn siste gruppe i filen
+CD ==========================================================================
+CD Formål:
+CD Finner gruppenummer for siste gruppe i filen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD bgr long r Gruppenummer
+CD
+CD Bruk:
+CD bgr = LC_FiLastGr(pFil);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA long LC_FiLastGr(LC_FILADM *pFil)
+{
+ /* LO_TestFilpeker(pFil,"LC_FiLastGr"); */
+ LO_TestFilpeker(pFil,"FiLastGr");
+
+ return pFil->lAntGr - 1;
+}
+
+
+/*
+AR-930608
+CH LC_CopyGr Kopier gruppe
+CD ==========================================================================
+CD Formål:
+CD Kopierer fra en annen gruppe inn i aktuell gruppe i buffer.
+CD Rutinen tilsvarer put fra brukerprogram inn i bufret, men rutinen
+CD tildeler selv nødvendig plass.
+CD Gruppen beholder serienummer tildelt i LC_NyGr.
+CD Geografisk-indeks blir ikke oppdatert før gruppen skrives til basen.
+CD Enhet blir oppdatert slik at opprinnelig enhet blir bevart. Om nødvendig
+CD legges det inn ..ENHET i GINFO.
+CD Kvalitet og dato blir oppdatert hvis SOSI-VERSJON < 4.00.
+CD Hvis det er filhode som kopieres skjer det ingen endring av egenskaper.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR *pBgr i Gruppenummer det skal kopieres fra.
+CD short ngis i Behandling for ..NGIS-FLAGG:
+CD OPPDATER_NGIS (0) = ..NGIS-FLAGG oppdateres i henhold
+CD til hodet i filen det kopieres til.
+CD BEVAR_NGIS (1) = ..NGIS-FLAGG bevares uforandret i kopien
+CD short ngi u Antall linjer GINFO
+CD long nko u Antall koordinater
+CD unsigned short info u Diverse informasjon. (Se under $LENKE<LC_RxGr>)
+CD short gnavn r Gruppenavn. (Se under $LENKE<LC_RxGr>)
+CD
+CD Bruk:
+CD gnavn = LC_CopyGr(&Bgr,ngis,&ngi,&nko,&info)
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_CopyGr (LC_BGR * pBgr,short ngis,short *ngi,long *nko,unsigned short *info)
+{
+ short gilin;
+ long snr,rb_forrige_gr,rb_neste_gr;
+ UT_INT64 rb_st,sosi_st;
+ LC_GRTAB_LINJE * grtp;
+ char *cp,szTx[256];
+ LC_R_LEAF * pRL; /* Peker inn i geografisk søketre */
+
+
+ LO_TestFilpeker(pBgr->pFil,"CopyGr");
+
+ grtp = LI_GetGrt(pBgr->pFil,pBgr->lNr);
+
+ if (Sys.GrId.lNr == INGEN_GRUPPE) { /* Feil ==> Ingen aktuell gruppe */
+ LC_Error(31,"(LC_CopyGr)","");
+
+ /* Gruppen er sletta */
+ } else if (grtp->ngi == 0 || /* Permanent sletta, eller */
+ (Sys.sNGISmodus == NGIS_NORMAL && /* Vanlig modus, og */
+ grtp->info & GI_NGIS && /* oppdater NGIS, og */
+ grtp->info & GI_SLETTA)){ /* merka som sletta */
+ LC_Error(35,"(LC_CopyGr)","");
+
+ /* Kopierer seg selv */
+ } else if (pBgr->pFil == Sys.GrId.pFil && pBgr->lNr == Sys.GrId.lNr) {
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+
+ } else { /* Lovlig gruppe */
+
+ Sys.sGrEndra = END_KOPI;
+ Sys.sPibufStatus = LC_PIBUF_TOM;
+ snr = LC_GetSn(); /* Husk serienummer */
+
+ /* Husk viktige data fra akt.gr. */
+ sosi_st = Sys.pGrInfo->sosi_st;
+ rb_st = Sys.pGrInfo->rb_st;
+ rb_forrige_gr = Sys.pGrInfo->rb_forrige_gr;
+ rb_neste_gr = Sys.pGrInfo->rb_neste_gr;
+ pRL = Sys.pGrInfo->pRL; /* Peker inn i geografisk søketre */
+
+ /* Kopier data om gruppen det kopieres fra */
+ *Sys.pGrInfo = *grtp;
+
+ /* Legg tilbake data om akt.gr. */
+ Sys.pGrInfo->sosi_st = sosi_st;
+ Sys.pGrInfo->rb_st = rb_st;
+ Sys.pGrInfo->rb_forrige_gr = rb_forrige_gr;
+ Sys.pGrInfo->rb_neste_gr = rb_neste_gr;
+ Sys.pGrInfo->pRL = pRL;
+
+ /* Les fra buffer-filen */
+ LI_ReadRb(pBgr->pFil,grtp->rb_st,Sys.Ginfo.pszTx,grtp->ulGiLen,
+ Sys.pdAust, Sys.pdNord, Sys.pInfo, grtp->nko,
+ Sys.pszPinfo, grtp->ulPiLen);
+ LX_CreGiPeker(&Sys.Ginfo,grtp->ngi);
+
+ /* Legg tilbake rett SNR */
+ LX_PutSn(snr);
+
+ // Hvis det er filhode som kopieres skjer det ingen endring av egenskaper.
+ if (pBgr->lNr != 0)
+ {
+ // ----- Handter NGIS oppdateringsflagg
+ // Søk etter ..NGIS-FLAGG, og fjern den
+ gilin=2;
+ if (LC_GetGP("..NGIS-FLAGG",&gilin,Sys.pGrInfo->ngi) != NULL)
+ {
+ if ( ngis == OPPDATER_NGIS)
+ {
+ // NGIS-flagg
+ if (*Sys.GrId.pFil->szNgisLag != '\0' && strcmp(Sys.GrId.pFil->szNgisLag,"0") != 0 )
+ {
+ // Skriv navnet med hermetegn hvis det er blanke i navnet
+ if (strchr(Sys.GrId.pFil->szNgisLag,' ') != NULL) {
+ UT_SNPRINTF(szTx,256,"..NGIS-FLAGG N \"%s\"",Sys.GrId.pFil->szNgisLag);
+ } else {
+ UT_SNPRINTF(szTx,256,"..NGIS-FLAGG N %s",Sys.GrId.pFil->szNgisLag);
+ }
+
+ LC_PutGi(gilin,szTx);
+ Sys.pGrInfo->info |= GI_NGIS;
+
+ } else {
+ LC_DelGiL(gilin,1);
+ Sys.pGrInfo->info &= (unsigned short)(~GI_NGIS); /* Ikke NGIS-oppdatering */
+ }
+
+ } else {
+ // Flagget skal bevares
+ }
+
+ } else {
+ /* NGIS-flagg */
+ //if (Sys.GrId.pFil->lNgisLag > 0) {
+ if (*Sys.GrId.pFil->szNgisLag != '\0' && strcmp(Sys.GrId.pFil->szNgisLag,"0") != 0 ) {
+
+ // Skriv navnet med hermetegn hvis det er blanke i navnet
+ if (strchr(Sys.GrId.pFil->szNgisLag,' ') != NULL) {
+ UT_SNPRINTF(szTx,256,"..NGIS-FLAGG N \"%s\"",Sys.GrId.pFil->szNgisLag);
+ } else {
+ UT_SNPRINTF(szTx,256,"..NGIS-FLAGG N %s",Sys.GrId.pFil->szNgisLag);
+ }
+
+ LC_PutGi(LC_AppGiL(),szTx);
+ Sys.pGrInfo->info |= GI_NGIS;
+ }
+ }
+
+ /* ------------ Legg inn div. standardopplysninger */
+ /* ENHET */
+ LC_UpdateGiEnhet(Sys.GrId.pFil,grtp->dEnhet, grtp->dEnhetHoyde, grtp->dEnhetDybde);
+
+ // Bare hvis filen er eldre enn SOSI v 4.0
+ if (Sys.GrId.pFil->sSosiVer < 400)
+ {
+ // Det skal aldri legges ut kvalitet på .FLATE eller .OBJEKT
+ if (Sys.pGrInfo->gnavn != L_FLATE && Sys.pGrInfo->gnavn != L_OBJEKT) {
+ // ..KVALITET
+ LC_UpdateGiKvalitet(Sys.GrId.pFil,grtp->Kvalitet.sMetode,
+ grtp->Kvalitet.lNoyaktighet,
+ grtp->Kvalitet.sSynbarhet,
+ grtp->Kvalitet.sHoydeMetode,
+ grtp->Kvalitet.lHoydeNoyaktighet);
+ }
+
+ // NGIS-fil, oppdater DATO
+ if (*Sys.GrId.pFil->szNgisLag != '\0' && strcmp(Sys.GrId.pFil->szNgisLag,"0") != 0 )
+ {
+ if (*Sys.GrId.pFil->szDato != '\0' &&
+ *Sys.GrId.pFil->szDato != '*' &&
+ *Sys.GrId.pFil->szDato < '4')
+ {
+ // ..DATO fra fil-hodet
+ gilin=2;
+ if ((cp = LC_GetGP("..DATO",&gilin,Sys.pGrInfo->ngi)) == NULL) {
+ UT_SNPRINTF(szTx,256,"..DATO %s",pBgr->pFil->szDato);
+ LC_PutGi(LC_AppGiL(),szTx);
+ }
+ }
+ }
+
+ // SOSI-VERSJON
+ //gilin=2;
+ //if ((cp = LC_GetGP("..SOSI-VERSJON",&gilin,Sys.pGrInfo->ngi)) == NULL) {
+ // UT_SNPRINTF(szTx,256,"..SOSI-VERSJON %.2f",((double)(pBgr->pFil->sSosiVer))/100.0);
+ // LC_PutGi(LC_AppGiL(),szTx);
+ //}
+ }
+ }
+
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+ }
+
+
+ return Sys.pGrInfo->gnavn;
+}
+
+
+/*
+AR-930707
+CH LC_CopyCoord Kopier koordinater fra annen gruppe
+CD ===========================================================================
+CD Formål:
+CD Kopierer koordinater fra en annen gruppe inn i aktuell gruppe i ringbuffer.
+CD De kopierte koordinatene kommer som en utvidelse av gruppen.
+CD Rutinen tilsvarer put fra brukerprogram inn i ringbufret, men rutinen
+CD tildeler selv nødvendig plass i RB.
+CD Geografisk-indeks blir ikke oppdatert før gruppen skrives til basen.
+CD Kvalitet og enhet blir automatisk oppdatert slik at gruppene ikke
+CD mister informasjon.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_BGR *pBgr i Gruppenummer det skal kopieres fra.
+CD short retning i Buffer-retning:
+CD HENT_FORRFRA ( 1) = vanlig,
+CD HENT_BAKFRA (-1) = buffer skal snues.
+CD long til_linje i Linjenummer linjen skal skytes inn forran.
+CD (Lovlig: 1 til nko+1)
+CD short ngi u Antall GINFO-linjer
+CD long nko u Antall koordinater
+CD short info u Diverse informasjon. (Se under $LENKE<LC_RxGr>)
+CD short sStatus r Status: UT_TRUE=OK, UT_FALSE=ikke utført.
+CD
+CD Bruk:
+CD sStatus = LC_CopyCoord(bgr,retning,til_linje,&ngi,&nko,&info);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_CopyCoord(LC_BGR * pBgr,short retning,long til_linje,short *ngi,
+ long *nko,unsigned short *info)
+{
+ long l,ko,pnr,fra_pt,til_pt;
+ unsigned short in;
+ unsigned long ulPiLen,ulGiLen;
+ short metode,hoydemetode,synbarhet,met,hmet,syn,nivaa,gi_met,gi_hmet,gi_syn;
+ long noyaktighet,hoydenoyaktighet,noy,hnoy,gi_noy,gi_hnoy;
+ UT_INT64 rb_st;
+ double *pdAust, *pdNord;
+ LB_INFO * pInfo;
+ char *pszPinfo;
+ LC_GRTAB_LINJE * grtp;
+ short sStatus = UT_TRUE;
+
+
+ LO_TestFilpeker(pBgr->pFil,"CopyCoord");
+
+ grtp = LI_GetGrt(pBgr->pFil,pBgr->lNr);
+
+ if (Sys.GrId.lNr == INGEN_GRUPPE){ /* Feil ==> Ingen aktuell gruppe */
+ LC_Error(31,"(LC_CopyCoord)","");
+ sStatus = UT_FALSE;
+
+ /* Gruppen er sletta */
+ } else if (grtp->ngi == 0 || /* Permanent sletta, eller */
+ (Sys.sNGISmodus == NGIS_NORMAL && /* Vanlig modus, og */
+ grtp->info & GI_NGIS && /* oppdater NGIS, og */
+ grtp->info & GI_SLETTA)){ /* merka som sletta */
+ LC_Error(35,"(LC_CopyCoord)","");
+ sStatus = UT_FALSE;
+
+ } else if (pBgr->pFil == Sys.GrId.pFil && pBgr->lNr == Sys.GrId.lNr) {
+ /* Kopierer seg selv */
+ LC_Error(99,"(LC_CopyCoord)","");
+ sStatus = UT_FALSE;
+
+ } else { /* Lovlig gruppe */
+
+ /* Husk diverse opplysninger */
+ ko = grtp->nko;
+ in = grtp->info;
+ metode = grtp->Kvalitet.sMetode;
+ noyaktighet = grtp->Kvalitet.lNoyaktighet;
+ synbarhet = grtp->Kvalitet.sSynbarhet;
+ hoydemetode = grtp->Kvalitet.sHoydeMetode;
+ hoydenoyaktighet = grtp->Kvalitet.lHoydeNoyaktighet;
+
+ rb_st = grtp->rb_st;
+ ulGiLen = grtp->ulGiLen;
+ ulPiLen = grtp->ulPiLen;
+
+ /* Tildel plass for koordinatene */
+ l = Sys.pGrInfo->nko;
+ LC_InsKoL(til_linje,ko);
+ if (Sys.pGrInfo->nko > l) { /* Har det blitt lagt inn flere linjer */
+ Sys.sGrEndra = (short)END_ENDRA;
+ Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Alloker midlertidig buffer */
+ pdAust = (double*)UT_MALLOC(ko * sizeof(double));
+ pdNord = (double*)UT_MALLOC(ko * sizeof(double));
+ pInfo = (LB_INFO *)UT_MALLOC(ko * sizeof(LB_INFO));
+ pszPinfo = (char*)UT_MALLOC(ulPiLen * sizeof(char));
+
+ /* Les fra buffer-filen */
+ LI_ReadCoordRb(pBgr->pFil, rb_st, ulGiLen,pdAust, pdNord, pInfo, ko,
+ pszPinfo, ulPiLen);
+
+ /* Regn posisjoner */
+ til_pt = til_linje - 1;
+ if (retning == HENT_FORRFRA) {
+ fra_pt = 0;
+ retning = 1;
+ } else{
+ fra_pt = ko - 1;
+ retning = -1;
+ }
+
+ for (l = 0; l < ko; l++) { /* Koordinater og PINFO */
+ *(Sys.pdAust+til_pt) = *(pdAust+fra_pt);
+ *(Sys.pdNord+til_pt) = *(pdNord+fra_pt);
+ (Sys.pInfo+til_pt)->dHoyde = (pInfo+fra_pt)->dHoyde;
+ (Sys.pInfo+til_pt)->sKp = (pInfo+fra_pt)->sKp;
+ if ((pInfo+fra_pt)->ulPiOfset != LC_INGEN_PINFO) {
+ LC_PutPi(til_pt+1, pszPinfo+((pInfo+fra_pt)->ulPiOfset));
+ }
+
+ til_pt++;
+ fra_pt += retning;
+ }
+
+ Sys.pGrInfo->info |= in;
+
+ /* Frigi midlertidig buffer */
+ UT_FREE(pdAust);
+ UT_FREE(pdNord);
+ UT_FREE(pInfo);
+ UT_FREE(pszPinfo);
+
+ // ----- Oppdater Kvalitet i de kopierte punktene
+ if (Sys.GrId.pFil->sSosiVer < 400)
+ {
+ // Husk kvalitet i GINFO på aktuell gruppe
+ nivaa = 2;
+ pnr = 1;
+ LC_GetCurKvalitet(Sys.GrId.pFil,&nivaa,pnr,&gi_met,&gi_noy,&gi_syn,&gi_hmet,&gi_hnoy);
+
+ // Oppdater punktene
+ for (pnr=til_linje; ko>0; pnr++,ko--) {
+ nivaa = 3;
+ LC_GetCurKvalitet(Sys.GrId.pFil,&nivaa,pnr,&met,&noy,&syn,&hmet,&hnoy);
+ // Funnet punkt uten kvalitet i PINFO
+ if (nivaa < 3) {
+ LC_UpdatePiKvalitet(Sys.GrId.pFil,pnr,
+ metode,noyaktighet,synbarhet,hoydemetode,hoydenoyaktighet);
+
+ // Funnet punkt med samme kvalitet som aktuell GINFO
+ } else if (met == gi_met && noy == gi_noy && syn == gi_syn &&
+ hmet == gi_hmet && hnoy == gi_hnoy) {
+ LC_UpdatePiKvalitet(Sys.GrId.pFil,pnr,met,noy,syn,hmet,hnoy);
+ }
+ }
+ }
+
+ *ngi = Sys.pGrInfo->ngi;
+ *nko = Sys.pGrInfo->nko;
+ *info = Sys.pGrInfo->info;
+
+ } else { /* For mange koordinater */
+ sStatus = UT_FALSE;
+ }
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-940208
+CH LC_SnuGr Snu gruppe
+CD ===========================================================================
+CD Formål:
+CD Snur en gruppe.
+CD Rutinen tilsvarer put fra brukerprogram inn i ringbufret.
+CD Både koordinater, høyde, KP og PINFO blir behandlet.
+CD For .BUE blir fortegnet på radius endret.
+CD Fortegnet på referanser til gruppen blir oppdatert.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LC_SnuGr();
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SnuGr(void)
+{
+ short ngi,sGiLin,Endret;
+ long fra_pt,til_pt;
+ long nko;
+ unsigned short info;
+ double *pdAust,*pdNord;
+ LB_INFO * pInfo;
+ char *pszPinfo,szRadius[30];
+ double nva,nvn,oha,ohn;
+ LC_GEO_STATUS GeoStat;
+ LC_BGR Bgr,FlateBgr;
+ LC_POLYGON Polygon;
+ LC_POL_ELEMENT * pPE;
+ LC_OY_ELEMENT * pOE;
+
+
+ /* Feil ==> Ingen aktuell gruppe */
+ if (Sys.GrId.lNr == INGEN_GRUPPE){
+ LC_Error(31,"(LC_CopyCoord)","");
+
+ /* Lovlig gruppe */
+ } else if (Sys.pGrInfo->nko > 1) {
+
+ /* Husk diverse opplysninger */
+ nko = Sys.pGrInfo->nko;
+
+ /* Tildel plass for koordinatene */
+ Sys.sGrEndra = (short)END_ENDRA;
+ Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Lag en midlertidig kopi av original-bufferet */
+ pdAust = (double*)UT_MALLOC(nko * sizeof(double));
+ UT_memcpy(pdAust,nko * sizeof(double),Sys.pdAust,nko * sizeof(double));
+
+ pdNord = (double*)UT_MALLOC(nko * sizeof(double));
+ UT_memcpy(pdNord,nko * sizeof(double),Sys.pdNord,nko * sizeof(double));
+
+ pInfo = (LB_INFO *)UT_MALLOC(nko * sizeof(LB_INFO));
+ UT_memcpy(pInfo,nko * sizeof(LB_INFO),Sys.pInfo,nko * sizeof(LB_INFO));
+
+ pszPinfo = (char*)UT_MALLOC(Sys.pGrInfo->ulPiLen * sizeof(char));
+ UT_memcpy(pszPinfo,Sys.pGrInfo->ulPiLen * sizeof(char),Sys.pszPinfo,Sys.pGrInfo->ulPiLen * sizeof(char));
+
+ /* Tømmer gruppen for gammelt innhold */
+ LC_DelKoL(1,nko);
+ LC_InsKoL(1,nko);
+
+ /* Legger inn koordinater og PINFO */
+ for (til_pt=0,fra_pt=nko-1; til_pt<nko; til_pt++,fra_pt--) {
+ *(Sys.pdAust+til_pt) = *(pdAust+fra_pt);
+ *(Sys.pdNord+til_pt) = *(pdNord+fra_pt);
+ (Sys.pInfo+til_pt)->dHoyde = (pInfo+fra_pt)->dHoyde;
+ (Sys.pInfo+til_pt)->sKp = (pInfo+fra_pt)->sKp;
+ if ((pInfo+fra_pt)->ulPiOfset != LC_INGEN_PINFO) {
+ LC_PutPi(til_pt+1, pszPinfo+((pInfo+fra_pt)->ulPiOfset));
+ }
+ }
+
+ /* Frigi midlertidig buffer */
+ UT_FREE(pdAust);
+ UT_FREE(pdNord);
+ UT_FREE(pInfo);
+ UT_FREE(pszPinfo);
+
+ /* ====== Hvis gruppen er .BUE ==> skift fortegn på radius ==== */
+ if (Sys.pGrInfo->gnavn == L_BUE) {
+ sGiLin = 2;
+ pszPinfo = LC_GetGP("..RADIUS",&sGiLin,Sys.pGrInfo->ngi);
+
+ if (*pszPinfo == '-') {
+ UT_StrCopy(szRadius,pszPinfo+1,30);
+ } else {
+ szRadius[0] = '-';
+ UT_StrCopy(szRadius+1,pszPinfo,29);
+ }
+
+ LC_UpdateGP(sGiLin,"..RADIUS",szRadius);
+ }
+
+
+ /* ========= Oppdater referanser til gruppen */
+ /* Husk gruppen */
+ Bgr = Sys.GrId;
+
+ LC_POL_InitPolygon(&Polygon);
+
+ LC_GetGrWin(&Sys.GrId,&nva,&nvn,&oha,&ohn);
+ LC_SBFlate(&GeoStat,LC_FRAMGR,nva,nvn,oha,ohn);
+ if (LC_FFFlate(&GeoStat,&FlateBgr)) {
+ do {
+ if (FlateBgr.pFil == Bgr.pFil) {
+ /* Funnet flate i rett fil, sjekk referansene */
+ LC_RxGr(&FlateBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ LC_POL_GetRef(&Polygon);
+ Endret = UT_FALSE;
+
+ /* Omkretsen */
+ for(pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ if ((memcmp(&pPE->Bgr,&Bgr,sizeof(LC_BGR))) == 0) {
+ pPE->sRetning = (pPE->sRetning == LC_MED_DIG)?
+ LC_MOT_DIG : LC_MED_DIG;
+ Endret = UT_TRUE;
+ }
+ }
+
+ /* Øyer */
+ for (pOE = Polygon.OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ if ((memcmp(&pPE->Bgr,&Bgr,sizeof(LC_BGR))) == 0) {
+ pPE->sRetning = (pPE->sRetning == LC_MED_DIG)?
+ LC_MOT_DIG : LC_MED_DIG;
+ Endret = UT_TRUE;
+ }
+ }
+ }
+
+ /* Lagre de oppdaterte referansene */
+ if (Endret) {
+ LC_POL_PutRef(&Polygon);
+ LC_WxGr(SKRIV_OPTIMALT);
+ }
+
+ /* Frigi allokerte kjeder */
+ LC_POL_FrigiPolygon(&Polygon);
+
+ }
+ } while (LC_FNFlate(&GeoStat,&FlateBgr));
+ }
+ LC_AvsluttSok(&GeoStat);
+
+
+ /* ========= Les inn igjen opprinnelig gruppe */
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+}
+
+
+/*
+AR-911001
+CH LC_DelGr Slett gruppe
+CD ==========================================================================
+CD Formål:
+CD Fjerner aktuell gruppe fra basen.
+CD Grupper som er tatt ut fra NGIS for oppdatering blir ikke sletta fra
+CD SOSI-filen, men de blir merka som sletta. (LC_SetNgisModus avgjør da om
+CD disse kan leses.)
+CD Det er ikke mulig å slette grupper fra sekvensielle filer, eller grupper
+CD som er brukt i flater.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short sStatus r Status: UT_TRUE = OK
+CD UT_FALSE = feil, ikke sletta
+CD
+CD Bruk:
+CD sStatus = LC_DelGr();
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_DelGr(void)
+{
+ UT_INT64 neste;
+ char *gp;
+ short gilin = 2;
+ short sStatus = UT_TRUE;
+ long lSnr = LC_GetSn();
+ char *pszNgisFlagg;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ /* Ikke filhode, eller kladdebase */
+ //if (Sys.pGrInfo->gnavn != L_HODE && Sys.GrId.pFil->pBase->sType == LC_BASE) {
+ if (Sys.GrId.lNr != 0 && Sys.GrId.pFil->pBase->sType == LC_BASE) {
+ if ( ! (Sys.pGrInfo->info & GI_SLETTA)) { /* Ikke sletta fra før */
+ if (Sys.GrId.pFil->usLag & LC_FRAMGR) { /* Har skriveaksess */
+
+ // Finn og ta vare på NGIS-flagg
+ gp = LC_GetGP("..NGIS-FLAGG",&gilin,Sys.pGrInfo->ngi);
+ if (gp) {
+ pszNgisFlagg = (char*)malloc(strlen(gp)+1);
+ UT_StrCopy(pszNgisFlagg, gp, strlen(gp)+1);
+ } else {
+ pszNgisFlagg = NULL;
+ }
+
+ // Ny gruppe - ikke lagret til SOSI, eller
+ // ikke NGIS-oppdatering, eller
+ // ny NGIS-gruppe, eller
+ // vanlig NGIS-grupppe
+ if (Sys.pGrInfo->sosi_st == NY_SOSI_ST ||
+ pszNgisFlagg == NULL ||
+ *pszNgisFlagg == 'N' ||
+ *pszNgisFlagg == 'V' ||
+ *pszNgisFlagg == 'E' ||
+ *pszNgisFlagg == 'S' ) {
+
+ if (Sys.pGrInfo->gnavn == L_LINJE ||
+ Sys.pGrInfo->gnavn == L_KURVE ||
+ Sys.pGrInfo->gnavn == L_BUE ||
+ Sys.pGrInfo->gnavn == L_BUEP ||
+ Sys.pGrInfo->gnavn == L_SIRKEL ||
+ Sys.pGrInfo->gnavn == L_SIRKELP ||
+ Sys.pGrInfo->gnavn == L_KLOTOIDE ||
+ Sys.pGrInfo->gnavn == L_TRASE ) {
+
+ if (Sys.pGrInfo->nko > 0) {
+ // Sjekk om det finnes referanser til gruppen
+ if (LC_ErReferert()) sStatus = UT_FALSE;
+ }
+ }
+
+ // Det finnes ikke referanser til gruppen
+ if (sStatus == UT_TRUE) {
+
+ /* Ikke NGIS-oppdatering, eller ny NGIS-gruppe, fjerner fysisk fra SOSI-filen */
+ if (Sys.pGrInfo->sosi_st == NY_SOSI_ST ||
+ pszNgisFlagg == NULL ||
+ *pszNgisFlagg == 'N' ) {
+
+ if (Sys.pGrInfo->sosi_st != NY_SOSI_ST) { /* Ikke ny gruppe */
+ LB_Plass(Sys.GrId.pFil,Sys.pGrInfo->sosi_st,&neste);
+ /* Posisjoner og blank ut området */
+ _fseeki64(Sys.GrId.pFil->pBase->pfSos,Sys.pGrInfo->sosi_st,SEEK_SET);
+ LB_WriteBlank(Sys.GrId.pFil->pBase->pfSos,Sys.GrId.pFil->sTegnsett,neste);
+ fflush(Sys.GrId.pFil->pBase->pfSos);
+ }
+ Sys.pGrInfo->ngi = 0;
+ Sys.pGrInfo->nko = 0;
+
+ /* Vanlig NGIS-grupppe, merker som slettet */
+ } else if (*pszNgisFlagg == 'V' ||
+ *pszNgisFlagg == 'E' ||
+ *pszNgisFlagg == 'S' ) {
+ LC_OppdaterEndret(O_SLETTET);
+ LC_WxGr(SKRIV_SOSI);
+ }
+
+ /* Fjerner fra snr.tab */
+ LS_PutSn(Sys.GrId.pFil,INGEN_GRUPPE,lSnr);
+
+ /* Fjerner fra geogr. søketabell */
+ LR_R_Delete(Sys.pGrInfo->pRL);
+ Sys.pGrInfo->pRL = NULL;
+
+
+ Sys.pGrInfo->info |= GI_SLETTA; /* Gruppen sletta */
+ LI_PutBt(Sys.GrId.pFil,Sys.GrId.lNr,0L); /* Fjerner all merking */
+
+ Sys.GrId.lNr = INGEN_GRUPPE; /* Ingen aktuell gruppe */
+ Sys.sGrEndra = END_UENDRA;
+
+ /* Brukt i flate */
+ /*} else {
+ LC_Error(44,"(LC_DelGr)","");*/
+ }
+
+ /* Bare leseaksess */
+ } else if (*pszNgisFlagg == 'R' || *pszNgisFlagg == 'H' ) {
+ LC_Error(91,"(LC_DelGr)","");
+ sStatus = UT_FALSE;
+
+ /* Ukjent NGIS endringsflagg */
+ } else {
+ LC_Error(91,"(LC_DelGr)","");
+ sStatus = UT_FALSE;
+ }
+
+ // Frigir alloker minne
+ if (pszNgisFlagg) free(pszNgisFlagg);
+
+ } else { /* Ikke skriveaksess */
+ LC_Error(91,"(LC_DelGr)","");
+ sStatus = UT_FALSE;
+ }
+ }
+
+ } else { /* Filhode, eller kladdebase */
+ sStatus = UT_FALSE;
+
+ if (Sys.GrId.pFil->pBase->sType != LC_BASE) {
+ /* Slett gruppe ulovlig ved kladdebase */
+ LC_Error(95,"(LC_DelGr)","");
+ } else {
+ /* Kan ikke slette filhodet */
+ LC_Error(48,"(LC_DelGr)","");
+ }
+ }
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-920129
+CH LC_SplittGr Splitt gruppe
+CD ==========================================================================
+CD Formål:
+CD Splitter aktuell gruppe i to deler.
+CD Første del av gruppen beholdes som aktuell gruppe. Denne blir ikke
+CD skrevet til SOSI-filen, men buffer er oppdatert.
+CD Siste del av gruppen legges som en ny gruppe på samme fil som
+CD opprinnelig gruppe. Denne blir skrevet til basen.
+CD Den delen av gruppen som ligger mellom P1 og P2 blir fjernet.
+CD
+CD Hvis gruppen er BUEP og en av delene får bare to koordinater
+CD blir det lagt inn et nytt punkt midt på buen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long sP1 i Punktnummer 1. (Må være større enn 1)
+CD long sP2 i Punktnummer 2. (Må være mindre enn nko)
+CD LC_BGR * pBgr2 u Nytt gruppenummer for siste del av gruppen.
+CD short sStatus r Status: UT_TRUE = OK
+CD UT_FALSE = feil, ikke splittet
+CD
+CD Bruk:
+CD sStatus = LC_SplittGr(sP1,sP2,&Bgr2);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_SplittGr (long sP1,long sP2,LC_BGR * pBgr2)
+{
+ short ngi,Endret,s;
+ long nko;
+ long l;
+ unsigned short info;
+ LC_FILADM *pFil;
+ LC_BGR Bgr,FlateBgr;
+ long lGmlSnr,lNyttSnr;
+ double nva,nvn,oha,ohn;
+ double a1,n1,a2,n2,as1,ns1,as2,ns2,r,fi,dfi,fi2,dfi2;
+ LC_GEO_STATUS GeoStat;
+ long lAntRef;
+ long lNyAntRef;
+ short sGiLin,sRefPos;
+ long *plRefArray,*plNyRefArray,*plRef,*plNyRef;
+ double fiNy,dfiNy,dA_ny,dN_ny;
+ double ax,nx;
+ bool bStorbue = false; /* Viser om opprinnelig gruppe var OK storbue */
+ short sStatus = UT_FALSE;
+
+ /* Har aktuell gruppe med koordinater, og lovlige punktnummer */
+ if (Sys.GrId.lNr != INGEN_GRUPPE &&
+ Sys.pGrInfo->nko > 0 &&
+ sP1 > 1 &&
+ sP2 < Sys.pGrInfo->nko) {
+
+ /* Husk at beregning er utført */
+ sStatus = UT_TRUE;
+
+ /* Husk gruppen */
+ pFil = Sys.GrId.pFil;
+ Bgr = Sys.GrId;
+ lGmlSnr = LC_GetSn();
+ LC_GetGrWin(&Bgr,&nva,&nvn,&oha,&ohn);
+
+
+ if (Sys.pGrInfo->gnavn == L_BUE ||
+ Sys.pGrInfo->gnavn == L_BUEP ||
+ Sys.pGrInfo->gnavn == L_SIRKELP )
+ {
+ // Tar vare på bueparametrene for opprinnelig "bue"
+ LC_GetBuePar(HENT_FORRFRA,&as1,&ns1,&r,&fi,&dfi,&s);
+ bStorbue = (fabs(dfi) > PI);
+ }
+
+ // ========= Lag ny gruppe, og kopier hele den opprinnelige gruppen
+ LC_NyGr(pFil,".LINJE",pBgr2,&lNyttSnr);
+ LC_CopyGr(&Bgr,OPPDATER_NGIS,&ngi,&nko,&info);
+
+ /* Samme brukttabell som opprinnelig gruppe */
+ for (s=BT_MIN_USER; s<=BT_MAX_USER; s++) {
+ if (LC_GetBt(&Bgr,s) != 0) {
+ LC_SetBt(pBgr2,s);
+ }
+ }
+
+ // SIRKELP konverteres til BUEP
+ if (Sys.pGrInfo->gnavn == L_SIRKELP )
+ {
+ LC_PutGi(1,".BUEP");
+ double a,n;
+ LC_GetTK(1,&a,&n);
+ nko = LC_AppKoL();
+ LC_PutTK(nko,a,n);
+ LC_PutKp(nko,LC_GetKp(1));
+ }
+
+ /* Fjern første del av gruppen */
+ if (sP2 > sP1){
+ nko = LC_DelKoL(1, sP2-1);
+ } else if (nko > 1) {
+ nko = LC_DelKoL(1, sP1-1);
+ }
+
+ /* Sjekk om storbue er blitt liten bue */
+ if (Sys.pGrInfo->gnavn == L_BUE && bStorbue)
+ {
+ LC_GetBue(HENT_FORRFRA,&a1,&n1,&a2,&n2,&r,&s);
+ GM_KonvBue(a1,n1,a2,n2,r,s,&as2,&ns2,&fi2,&dfi2);
+
+ /* Buen skal ikke være storbue lenger hvis sentrum er flyttet.
+ * Dette er tilfelle når linjen fra gammelt til nytt senter
+ * skjærer linjen fra nytt start til sluttpunkt.
+ */
+ if (GM_sLinLin(a1,n1,a2,n2,as1,ns1,as2,ns2,&ax,&nx)) {
+ LC_PutGP("..STORBUE","0",&s);
+ }
+ }
+
+ // Sjekk at .BUEP har tre koordinater
+ if (Sys.pGrInfo->gnavn == L_BUEP)
+ {
+ if (nko == 2)
+ {
+ // --- Legger inn nytt punkt på buen mellom de to endepunktene.
+ // Åpningsvinkel til starten av den nye buen
+ LC_GetTK(1,&a1,&n1);
+ GM_PktBue(as1,ns1,fi,dfi,a1,n1,&dfiNy);
+
+ // Midtpunktet
+ fiNy = fi + (dfiNy+((dfi-dfiNy)/2.0));
+ dA_ny = as1 + fabs(r)*cos(fiNy);
+ dN_ny = ns1 + fabs(r)*sin(fiNy);
+
+ nko = LC_InsKoL(2,1);
+ LC_PutTK(2,dA_ny,dN_ny);
+ }
+
+ // Endre til .KURVE hvis buen blir ulovlig
+ LR_TestEndreBuepTilKurve(dfi);
+ }
+
+ // Lagre
+ LC_WxGr(SKRIV_OPTIMALT);
+
+ // ========= Oppdater referanser til gruppen
+ LC_SBFlate(&GeoStat,LC_FRAMGR,(double)nva,(double)nvn,
+ (double)oha,(double)ohn);
+ if (LC_FFFlate(&GeoStat,&FlateBgr)) {
+ do {
+ if (FlateBgr.pFil == pFil) {
+ /* Funnet flate i rett fil, sjekk referansene */
+ LC_RxGr(&FlateBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ lAntRef = LC_InqAntRef();
+ plRefArray = (long *) UT_MALLOC(lAntRef * sizeof(long));
+ plNyRefArray = (long *) UT_MALLOC((lAntRef+2) * sizeof(long));
+ sGiLin = 2;
+ sRefPos = 0;
+ LC_GetRef(plRefArray,lAntRef,&sGiLin,&sRefPos);
+
+ lNyAntRef = lAntRef;
+ Endret = UT_FALSE;
+ plRef = plRefArray;
+ plNyRef = plNyRefArray;
+ for (l=0; l<lAntRef; l++) {
+ if (labs(*plRef) == lGmlSnr) {
+ if (*plRef > 0) {
+ *plNyRef++ = *plRef++;
+ *plNyRef++ = lNyttSnr;
+
+ } else {
+ *plNyRef++ = -lNyttSnr;
+ *plNyRef++ = *plRef++;
+ }
+ Endret = UT_TRUE;
+ lNyAntRef++;
+
+ } else {
+ *plNyRef++ = *plRef++;
+ }
+ }
+
+ if (Endret) {
+ LC_PutRef(plNyRefArray,lNyAntRef);
+ LC_WxGr(SKRIV_OPTIMALT);
+ }
+ UT_FREE(plRefArray);
+ UT_FREE(plNyRefArray);
+ }
+ } while (LC_FNFlate(&GeoStat,&FlateBgr));
+ }
+ LC_AvsluttSok(&GeoStat);
+
+ // ========= Oppdater opprinnelig gruppe
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ /* Fjern siste del av gruppen */
+ if (nko > 1) {
+ nko = LC_DelKoL(sP1+1, nko-sP1);
+ }
+
+ // SIRKELP må konverteres til BUEP
+ if (Sys.pGrInfo->gnavn == L_SIRKELP )
+ {
+ LC_PutGi(1,".BUEP");
+ }
+
+ /* Sjekk om storbue er blitt liten bue */
+ if (Sys.pGrInfo->gnavn == L_BUE && bStorbue)
+ {
+ LC_GetBue(HENT_FORRFRA,&a1,&n1,&a2,&n2,&r,&s);
+ GM_KonvBue(a1,n1,a2,n2,r,s,&as2,&ns2,&fi2,&dfi2);
+
+ /* Buen skal ikke være storbue lenger hvis sentrum er flyttet.
+ * Dette er tilfelle når linjen fra gammelt til nytt senter
+ * skjærer linjen fra nytt start til sluttpunkt.
+ */
+ if (GM_sLinLin(a1,n1,a2,n2,as1,ns1,as2,ns2,&dA_ny,&dN_ny)) {
+ LC_PutGP("..STORBUE","0",&s);
+ }
+ }
+
+ // Sjekk at .BUEP har tre koordinater
+ if (Sys.pGrInfo->gnavn == L_BUEP)
+ {
+ if (nko == 2)
+ {
+ // --- Legger inn nytt punkt på buen mellom de to endepunktene.
+ // Åpningsvinkel til slutten av den nye buen
+ LC_GetTK(2,&a2,&n2);
+ GM_PktBue(as1,ns1,fi,dfi,a2,n2,&dfiNy);
+ // Midtpunktet
+ fiNy = fi + (dfiNy/2.0);
+ dA_ny = as1 + fabs(r)*cos(fiNy);
+ dN_ny = ns1 + fabs(r)*sin(fiNy);
+
+ LC_InsKoL(2,1);
+ LC_PutTK(2,dA_ny,dN_ny);
+ }
+
+ // Endre til .KURVE hvis buen blir ulovlig
+ LR_TestEndreBuepTilKurve(dfi);
+ }
+ }
+
+ return sStatus;
+}
+
+/*
+AR-930803
+CH LR_TestEndreBuepTilKurve Sammenføy grupper
+CD ==========================================================================
+CD Formål:
+CD Sjekk om BUEP blir ugyldeig etter splitting.
+CD Konverterer eventuellt til .KURVE
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD double dDeltaFi i Åpningsvinkel for opprinnelig BUEP
+CD
+CD Bruk:
+CD LR_TestEndreBuepTilKurve(dDeltaFi);
+ =============================================================================
+*/
+static void LR_TestEndreBuepTilKurve(double dDeltaFi)
+{
+ double as,ns,r,fi,dfi;
+ double dAMidt,dNMidt,dAFotP,dNFotP;
+ double a1,n1,a2,n2;
+ short s;
+
+ // Avrund buffer til riktig enhet
+ LC_RoundKoord();
+
+ // Bueparametrene for oppdatert "bue"
+ if (LC_GetBuePar(HENT_FORRFRA,&as,&ns,&r,&fi,&dfi,&s) )
+ {
+ // Buen er snudd krumming (åpningsvinkelen har skiftet fortegn)
+ if (dDeltaFi * dfi < 0.0)
+ {
+ LC_PutGi(1,".KURVE");
+ }
+ else
+ {
+ // Sjekk at buen ikke har blitt en rett linje etter avrunding til aktuell enhet.
+ LC_GetTK(1,&a1,&n1);
+ LC_GetTK((Sys.pGrInfo->nko+1)/2,&dAMidt,&dNMidt);
+ LC_GetTK(Sys.pGrInfo->nko,&a2,&n2);
+ GM_fotp(a1,n1,a2,n2,dAMidt,dNMidt,&dAFotP,&dNFotP);
+ // Avstand fra fotpunktet til punktet på buen må være minst en enhet
+ if(GM_Avstand(dAMidt,dNMidt,dAFotP,dNFotP) < Sys.pGrInfo->dEnhet) {
+ LC_PutGi(1,".KURVE");
+ }
+ }
+ }
+ else
+ {
+ LC_PutGi(1,".KURVE");
+ }
+}
+
+
+/*
+AR-930803
+CH LC_SammenfoyGr Sammenføy grupper
+CD ==========================================================================
+CD Formål:
+CD Sammenføye to grupper.
+CD Kopierer koordinater fra gitt gruppe inn i aktuell gruppe.
+CD De kopierte koordinatene kommer som en utvidelse av gruppen.
+CD Rutinen tildeler selv nødvendig plass i buffer.
+CD Kvalitet og enhet blir automatisk oppdatert slik at gruppene ikke
+CD mister informasjon.
+CD Gruppen det kopieres fra blir slettet.
+CD Eventuelle referanser til gruppene blir oppdatert.
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_BGR * pFraBgr i Gruppenummer det skal kopieres fra.
+CD short retning i Buffer-retning:
+CD HENT_FORRFRA ( 1) = vanlig,
+CD HENT_BAKFRA (-1) = buffer skal snues.
+CD short plassering i Forteller hvor pFraBgr skal plasseres i
+CD aktuell gruppe.
+CD LC_SG_FORRAN = Heng den andre gruppen inn
+CD forran første koordinat.
+CD LC_SG_BAK = Heng den andre gruppen inn
+CD etter siste koordinat.
+CD short metode i Forteller hva som skal skje med sammenføingspunktene.
+CD LC_SG_BEHOLD = Begge punktene beholdes.
+CD LC_SG_FJERN = Bare det ene av punktene beholdes.
+CD short ngi u Antall GINFO-linjer
+CD long nko u Antall koordinater
+CD unsigned short info u Diverse informasjon. (Se under $LENKE<LC_RxGr>)
+CD short sStatus r Status: UT_TRUE=OK, UT_FALSE=ikke utført.
+CD
+CD Bruk:
+CD sStatus = LC_SammenfoyGr(bgr,retning,plassering,metode,&ngi,&nko,&info);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_SammenfoyGr(LC_BGR * pFraBgr,short retning,short plassering,short metode,
+ short *ngi,long *nko,unsigned short *info)
+{
+ short Endret,gnavn;
+ long FraNko,sTilPkt;
+ LC_BGR AktBgr,FlateBgr;
+ long lAktSnr,lFraSnr;
+ double nva,nvn,oha,ohn;
+ LC_GEO_STATUS GeoStat;
+ LC_POLYGON Pol;
+ LC_OY_ELEMENT * pOE;
+ short sStatus = UT_TRUE;
+
+
+ if (Sys.GrId.lNr == INGEN_GRUPPE){ /* Feil ==> Ingen aktuell gruppe */
+ LC_Error(31,"(LC_SammenfoyGr)","");
+ sStatus = UT_FALSE;
+
+ } else {
+ /* Husk aktuell gruppe */
+ AktBgr = Sys.GrId;
+ lAktSnr = LC_GetSn();
+ sTilPkt = (plassering == LC_SG_FORRAN)? 1 : (Sys.pGrInfo->nko+1);
+
+ /* ========= Kopier */
+ if (LC_CopyCoord(pFraBgr,retning,sTilPkt,ngi,nko,info)) {
+ LC_WxGr(SKRIV_OPTIMALT);
+
+ /* ========= Oppdater referanser */
+ LC_RxGr(pFraBgr,LES_OPTIMALT,ngi,&FraNko,info);
+ lFraSnr = LC_GetSn();
+
+ LC_GetGrWin(&AktBgr,&nva,&nvn,&oha,&ohn);
+
+ LC_SBFlate(&GeoStat,LC_FRAMGR,(double)nva,(double)nvn,
+ (double)oha,(double)ohn);
+ if (LC_FFFlate(&GeoStat,&FlateBgr)) {
+ do {
+ if (FlateBgr.pFil == AktBgr.pFil) { /* På samme fil ? */
+
+ /* Funnet flate i rett fil, sjekk referansene */
+ gnavn = LC_RxGr(&FlateBgr,LES_OPTIMALT,ngi,nko,info);
+
+ if ( gnavn == L_FLATE) {
+ /* Hent referansene */
+ LC_POL_InitPolygon(&Pol);
+ LC_POL_GetRef(&Pol);
+
+ /* Ytre avgrensning */
+ Endret = LB_RensOmkrets(&Pol.HovedPO,lAktSnr,lFraSnr);
+
+ /* Øyer */
+ for (pOE = Pol.OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ /* Sjkker en og en øy */
+ Endret |= LB_RensOmkrets(&pOE->PO,lAktSnr,lFraSnr);
+ }
+
+ /* Lagre oppdatert referanse */
+ if (Endret == UT_TRUE) {
+ *ngi = LC_POL_PutRef(&Pol);
+ LC_WxGr(SKRIV_OPTIMALT);
+ }
+
+ /* Frigi allokerte kjeder */
+ LC_POL_FrigiPolygon(&Pol);
+ }
+ }
+ } while (LC_FNFlate(&GeoStat,&FlateBgr));
+ }
+ LC_AvsluttSok(&GeoStat);
+
+ /* ========= Fjern den kopierte gruppen fra basen */
+ LC_RxGr(pFraBgr,LES_OPTIMALT,ngi,&FraNko,info);
+ lFraSnr = LC_GetSn();
+ LC_DelGr();
+
+ /* ========= Les inn opprinnelig gruppe igjen */
+ LC_RxGr(&AktBgr,LES_OPTIMALT,ngi,nko,info);
+
+ /* ========= Fjerner punkt og fjerner KP fra koblingspunktet */
+ if (metode == LC_SG_FJERN) {
+ if (plassering == LC_SG_BAK) {
+ LC_PutKp(sTilPkt,0);
+ *nko = LC_DelKoL(sTilPkt-1,1);
+ } else {
+ LC_PutKp(FraNko,0);
+ *nko = LC_DelKoL(FraNko+1,1);
+ }
+
+ } else {
+ if (plassering == LC_SG_BAK) {
+ LC_PutKp(sTilPkt,0);
+ LC_PutKp(sTilPkt-1,0);
+ } else {
+ LC_PutKp(FraNko,0);
+ LC_PutKp(FraNko+1,0);
+ }
+ }
+
+ } else { /* For mange koordinater */
+ sStatus = UT_FALSE;
+ }
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-930803
+CH LB_RensOmkrets Fjerner overflødige referanser
+CD ==========================================================================
+CD Formål:
+CD Fjerner overflødige referanser ved sammenføining av to grupper.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD
+CD
+CD
+CD Bruk:
+CD Endret = LB_RensOmkrets(&Pol.HovedPO,lAktSnr,lFraSnr);
+ =============================================================================
+*/
+static short LB_RensOmkrets(LC_POL_OMKR * pPO,long lAktSnr,long lFraSnr)
+{
+ LC_POL_ELEMENT * pPE;
+
+
+ if (pPO != NULL) {
+ /* Tilslag på første og siste gruppe */
+ if (pPO->pForstePE->lSnr == lAktSnr &&
+ pPO->pSistePE->lSnr == lFraSnr) {
+ /* Overser siste referansen (kopiert gruppe) */
+ LC_POL_FjernGruppeOmkrets(pPO, pPO->pSistePE);
+ return UT_TRUE;
+
+ } else if (pPO->pForstePE->lSnr == lFraSnr &&
+ pPO->pSistePE->lSnr == lAktSnr) {
+
+ /* Overser første referansen (kopiert gruppe) */
+ LC_POL_FjernGruppeOmkrets(pPO, pPO->pForstePE);
+ return UT_TRUE;
+ }
+
+ /* Resten av referansene */
+ for(pPE = pPO->pForstePE; pPE->pNestePE != NULL; pPE = pPE->pNestePE) {
+
+ if (pPE->lSnr == lAktSnr &&
+ pPE->pNestePE->lSnr == lFraSnr) {
+ /* Overser siste referansen (kopiert gruppe) */
+ LC_POL_FjernGruppeOmkrets(pPO, pPE->pNestePE);
+ return UT_TRUE;
+
+ } else if (pPE->lSnr == lFraSnr &&
+ pPE->pNestePE->lSnr == lAktSnr) {
+
+ /* Overser første referansen (kopiert gruppe) */
+ LC_POL_FjernGruppeOmkrets(pPO, pPE);
+ return UT_TRUE;
+ }
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR:2000-07-28
+CH LC_NyGr Ny gruppe i basen
+CD ==========================================================================
+CD Formål:
+CD Lager en ny gruppe i basen, og tildeler serienummer.
+CD Sjekker at gruppenavnet er lovlig i denne versjon av FYBA.
+CD Ved feil navn vil ".LINJE" bli valgt.
+CD Legger inn gruppenavn i buffer.
+CD Gruppen blir "aktuell" gruppe.
+CD Sjekker ledig plass både for indeks-fil og sosi-fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD char *sosi i Gruppenavn (Eks. ".KURVE")
+CD LC_BGR * pBgr iu Tildelt gruppenummer i basen
+CD (Bgr.lNr=INGEN_GRUPPE = Feil, ikke oppretta)
+CD long snr u Tildelt serienummer
+CD gnavn short r Gruppenavn. (Se under $LENKE<LC_RxGr>)
+CD INGEN_GRUPPE hvis det ikke er opprettet noen ny gruppe.
+CD
+CD Bruk:
+CD gnavn = LC_NyGr (pFil,sosi,&Bgr,&snr);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_NyGr (LC_FILADM *pFil,char *sosi,LC_BGR * pBgr,long *snr)
+{
+ short navn_nr,gilin;
+ unsigned long ulLedigPlass;
+ char szTx[256];
+ char szSosiNavn[LC_MAX_SOSINAVN_LEN];
+ short sMetode, sSynbarhet, sHoydeMetode,sNivaa;
+ long lNoyaktighet, lHoydeNoyaktighet;
+
+
+ /* Test lovlig filpeker */
+ LO_TestFilpeker(pFil,"NyGr");
+
+ /* Preparer SOSI-navnet */
+ UT_StrCopy(szSosiNavn,sosi,LC_MAX_SOSINAVN_LEN);
+ UT_StrUpper(szSosiNavn);
+
+ /* Vanlig base */
+ if (pFil->pBase->sType == LC_BASE) {
+
+ // Har aktuell gruppe
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ // Er forrige gruppe endra?
+ if (Sys.sGrEndra != END_UENDRA) {
+ LC_WxGr(SKRIV_OPTIMALT);
+ }
+ }
+
+ /* Setter: 'ingen aktuell gruppe' */
+ pBgr->lNr = Sys.GrId.lNr = INGEN_GRUPPE;
+
+ /* Sjekk om lovlig filnummer */
+ if (pFil->usLag == LC_SEKV) {
+ LC_Error(37,"(LC_NyGr)","");
+ Sys.pGrInfo->gnavn = INGEN_GRUPPE;
+
+ /* Ikke skriveaksess */
+ //} else if (pFil->sAccess != UT_UPDATE || pFil->lNgisLag == LC_NGIS_LES) {
+ //} else if (pFil->sAccess != UT_UPDATE || strcmp(pFil->szNgisLag,"0") == 0 ) {
+ } else if (pFil->sAccess != UT_UPDATE ||
+ ((Sys.sNGISmodus == NGIS_NORMAL) && (strcmp(pFil->szNgisLag,"0")) == 0) ) {
+
+ LC_Error(38,"(LC_NyGr)","");
+ Sys.pGrInfo->gnavn = INGEN_GRUPPE;
+
+ } else {
+ if (pFil->lAntGr < LC_MAX_GRU) {
+ /* Sjekk ledig diskplass for SOSI-filer */
+ UT_InqAvailSize(pFil->pszNavn,&ulLedigPlass);
+ if (ulLedigPlass < ((unsigned long)LC_MAX_KOORD * (unsigned long)120)) {
+ /* Disken er snart full */
+ LC_Error(93,"(LB_NyGr)",pFil->pszNavn);
+ }
+ /* Sjekk om navnet finnes */
+ if (LN_FinnNavn(&pFil->SosiNavn,szSosiNavn,&navn_nr) != 1) {
+ navn_nr = L_LINJE; /* Ukjent gruppenavn ==> Velg ".LINJE" */
+ }
+
+ pBgr->pFil = Sys.GrId.pFil = pFil; /* Fil */
+ pBgr->lNr = Sys.GrId.lNr = pFil->lAntGr++; /* Ant. grupper i basen */
+
+ Sys.pGrInfo = LI_AppGrt(pBgr->pFil,pBgr->lNr);
+
+ LB_ClGr();
+ Sys.pGrInfo->gnavn = navn_nr; /* Gruppenavn */
+ Sys.pGrInfo->sosi_st = NY_SOSI_ST; /* Setter start SOSI til ny */
+ Sys.pGrInfo->rb_st = NY_RB_ST;
+ Sys.pGrInfo->dEnhet = pFil->TransPar.dEnhet; /* Enhet */
+ Sys.pGrInfo->dEnhetHoyde = pFil->TransPar.dEnhet_h; /* Enhet-H */
+ Sys.pGrInfo->dEnhetDybde = pFil->TransPar.dEnhet_d; /* Enhet-D */
+ Sys.pGrInfo->ulPrior[0] = 0UL; /* Prioritetstabell */
+ Sys.pGrInfo->ulPrior[1] = 0UL;
+ Sys.pGrInfo->ulPrior[2] = 0UL;
+ Sys.pGrInfo->ulPrior[3] = 0UL;
+
+ /* Nuller brukttabellen */
+ LI_PutBt(pFil,pBgr->lNr,0L);
+
+ /* Fjerner fra geogr. søketabell */
+ Sys.pGrInfo->pRL = NULL;
+
+ /* Nytt serienummer */
+ *snr = pFil->lMaxSnr + 1L;
+
+ /* Legg inn gruppenavn */
+ LC_AppGiL();
+ LC_PutGi(1,LN_GetNavn(&pFil->SosiNavn,navn_nr));
+ LC_PutSn(*snr);
+
+ /* NGIS-flagg */
+ //if (pFil->lNgisLag > 0) {
+ if (*pFil->szNgisLag != '\0' && strcmp(pFil->szNgisLag,"0") != 0 ) {
+
+ // Skriv navnet med hermetegn hvis det er blanke i navnet
+ if (strchr(Sys.GrId.pFil->szNgisLag,' ') != NULL) {
+ UT_SNPRINTF(szTx,256,"..NGIS-FLAGG N \"%s\"",pFil->szNgisLag);
+ } else {
+ UT_SNPRINTF(szTx,256,"..NGIS-FLAGG N %s",pFil->szNgisLag);
+ }
+
+ gilin = LC_AppGiL();
+ LC_PutGi(gilin,szTx);
+ }
+
+ /* ------------ Legg inn div. standardopplysninger */
+ if (*Sys.GrId.pFil->szNgisLag != '\0' && strcmp(Sys.GrId.pFil->szNgisLag,"0") != 0 ) {
+
+ /* ..KVALITET */
+ sNivaa = 1;
+ LC_GetCurKvalitet(pFil,&sNivaa,1,&sMetode,&lNoyaktighet,
+ &sSynbarhet,&sHoydeMetode,&lHoydeNoyaktighet);
+ UT_SNPRINTF(szTx,256,"..KVALITET %s",
+ LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,
+ sHoydeMetode,lHoydeNoyaktighet) );
+ LC_PutGi(LC_AppGiL(),szTx);
+
+ // ..DATO
+ if (*Sys.GrId.pFil->szDato != '\0' &&
+ *Sys.GrId.pFil->szDato != '*' &&
+ *Sys.GrId.pFil->szDato < '4')
+ {
+ UT_SNPRINTF(szTx,256,"..DATO %s",pFil->szDato);
+ LC_PutGi(LC_AppGiL(),szTx);
+ }
+
+ // ..SOSI-VERSJON
+ //UT_SNPRINTF(szTx,256,"..SOSI-VERSJON %.2f",((double)(pFil->sSosiVer))/100.0);
+ //LC_PutGi(LC_AppGiL(),szTx);
+ }
+
+ /* PINFO-buffer */
+ Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ } else{ /* For mange grupper, tab. sprengt */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %ld",pFil->lAntGr);
+ LC_Error(39,"(LC_NyGr)",err().tx);
+ Sys.pGrInfo->gnavn = INGEN_GRUPPE;
+ }
+ }
+
+ } else{ /* Kladdebase */
+ /* Rens bort gammelt innhold i buffergruppen */
+ LC_DelKoL(1,Sys.pGrInfo->nko);
+ LC_DelGiL(2,(short)(Sys.pGrInfo->ngi-1));
+
+ /* Sjekk om navnet finnes */
+ if (LN_FinnNavn(&Sys.GrId.pFil->SosiNavn,sosi,&navn_nr) != 1) {
+ LC_PutGi(1,".LINJE"); /* Ukjent gruppenavn ==> Velg ".LINJE" */
+
+ } else {
+ LC_PutGi(1,szSosiNavn);
+ }
+
+ /* Nytt serienummer */
+ *snr = NYTT_SNR;
+
+ /* Nullstill info */
+ Sys.pGrInfo->info = 0;
+ }
+
+ return (Sys.pGrInfo->gnavn);
+}
+
+
+/*
+AR-911001
+CH LB_FormaterEnhet Lag GINFO for enhet
+CD =============================================================================
+CD Formål:
+CD Legger inn enhet med høvelig antall siffer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *streng i Peker til streng hvor ginfo skal legges
+CD char *sosi i SOSI-navn som skal legges først i strengen
+CD double enhet i Aktuell enhet
+CD char *ginfo r Peker til oppbygd streng
+CD
+CD Bruk:
+CD LB_FormaterEnhet(streng,sStrengMaxLen,"..ENHET",enhet);
+ =============================================================================
+*/
+char *LB_FormaterEnhet(char *streng,short sStrengMaxLen,char *SosiNavn,double enhet)
+{
+ char enhet_buffer[20],*cp;
+ short sAntDes = max(1,UT_RoundDS(fabs(min(1.0,log10(enhet)))));
+
+ UT_StrCopy(streng,SosiNavn,sStrengMaxLen);
+ UT_StrCat(streng," ",sStrengMaxLen);
+
+ UT_DtoA(enhet,sAntDes,'.',20,enhet_buffer);
+
+ cp = enhet_buffer;
+ while (*cp == ' ')
+ cp++;
+
+ UT_StrCat(streng,cp,sStrengMaxLen);
+
+ return(streng);
+}
+
+
+/*
+AR-930611
+CH LC_InsGiL Skyt inn GINFO-linjer
+CD =============================================================================
+CD Formål:
+CD Skyter inn linjer GINFO-delen i en gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short linje i Linjenummer linjen skal skytes inn forran.
+CD (Lovlig: 1 til ngi+1)
+CD short antall i Antall linjer som skal skytest inn.
+CD short ngi r Antall GINFO-linjer i gruppen etter innskuddet.
+CD
+CD Bruk:
+CD ngi = LC_InsGiL(linje, antall);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_InsGiL(short linje, short antall)
+{
+ short s,len;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (linje > 0 && linje <= (Sys.pGrInfo->ngi + 1)) {
+
+ /* På slutten av GINFO */
+ if (linje == (Sys.pGrInfo->ngi + 1)) {
+ for ( ; antall > 0; antall--) {
+ LC_AppGiL();
+ }
+
+ /* Inni GINFO */
+ } else {
+ Sys.sGrEndra = (short)END_ENDRA;
+ /* Må flytte resten av buffer for å gi plass til de nye linjene */
+ memmove(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[linje-1] + antall,
+ Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[linje-1],
+ Sys.pGrInfo->ulGiLen - Sys.Ginfo.ulOfset[linje-1]);
+
+ /* Ny total GINFO-lengde; */
+ Sys.pGrInfo->ulGiLen += antall;
+
+ /* Antall GINFO-linjer etter utvidelsen */
+ Sys.pGrInfo->ngi += antall;
+
+ /* Oppdater offset for resten av GINFO */
+ for (s=Sys.pGrInfo->ngi; s>=linje+antall; s--) {
+ Sys.Ginfo.ulOfset[s-1] = Sys.Ginfo.ulOfset[s-1-antall] + antall;
+ }
+
+ /* Blank ut de nye linjene */
+ for (s=0; s<antall; s++) {
+ /* Beregn ofset og blank ut linjen */
+ if (linje == 1) {
+ Sys.Ginfo.ulOfset[0] = 0;
+ *Sys.Ginfo.pszTx = '\0';
+ } else {
+ /* Førte posisjon etter forrige linje */
+ len = (short)strlen(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[linje-2]);
+ Sys.Ginfo.ulOfset[linje-1] = Sys.Ginfo.ulOfset[linje-2] + len + 1;
+ *(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[linje-1]) = '\0';
+ }
+
+ linje++;
+ }
+ }
+
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %d",linje);
+ LC_Error(40,"(LC_InsGiL)",err().tx);
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_InsGiL)","");
+ }
+
+ return(Sys.pGrInfo->ngi);
+}
+
+
+/*
+AR-930610
+CH LC_AppGiL Heng på en GINFO-linje
+CD =============================================================================
+CD Formål:
+CD Henger på en linje i GINFO-delen i en gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short ngi r Antall GINFO-linjer i gruppen etter utvidelsen.
+CD (Linjenumret på den tilføyde linjen.)
+CD
+CD Bruk:
+CD ngi = LC_AppGiL();
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_AppGiL()
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ Sys.sGrEndra = (short)END_ENDRA;
+ Sys.pGrInfo->ngi++; /* Antall GINFO-linjer etter utvidelsen */
+
+ /* Blank ut den nye linjen */
+ Sys.pGrInfo->ulGiLen++;
+ Sys.Ginfo.ulOfset[Sys.pGrInfo->ngi - 1] = Sys.pGrInfo->ulGiLen - 1;
+ *(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[Sys.pGrInfo->ngi - 1]) = '\0';
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_InsGiL)","");
+ }
+
+ return(Sys.pGrInfo->ngi);
+}
+
+
+/*
+AR-930611
+CH LC_InsKoL Skyt inn koordinatlinjer
+CD ==========================================================================
+CD Formål:
+CD Skyter inn linjer koordinatdelen i en gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long linje i Linjenummer linjen skal skytes inn forran.
+CD (Lovlig: 1 til nko+1)
+CD long antall i Antall linjer som skal skytest inn.
+CD long nko r Antall koordinater i gruppen etter innskuddet.
+CD
+CD Bruk:
+CD nko = LC_InsKoL(linje, antall);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA long LC_InsKoL(long linje, long antall)
+{
+ double *pdAust = Sys.pdAust + linje - 1;
+ double *pdNord = Sys.pdNord + linje - 1;
+ LB_INFO * pInfo = Sys.pInfo + linje - 1;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* AKtuell gruppe OK */
+ if (Sys.pGrInfo->nko + antall < LC_MAX_KOORD) {
+ if (linje > 0 && linje <= (Sys.pGrInfo->nko + 1)) {
+ Sys.sGrEndra = (short)END_ENDRA;
+ if (linje <= Sys.lPibufPnr) Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Utfør flyttingen */
+ memmove(pdAust+antall, pdAust, (Sys.pGrInfo->nko-linje+1) * (sizeof(double)));
+ memmove(pdNord+antall, pdNord, (Sys.pGrInfo->nko-linje+1) * (sizeof(double)));
+ memmove(pInfo+antall, pInfo, (Sys.pGrInfo->nko-linje+1) * (sizeof(LB_INFO)));
+
+ /* Antall koordinater etter utvidelsen */
+ Sys.pGrInfo->nko += antall;
+
+ /* Blank ut det nye området */
+ while (antall > 0) {
+ *pdAust = 0.0;
+ *pdNord = 0.0;
+ pInfo->dHoyde = HOYDE_MANGLER;
+ pInfo->sKp = 0;
+ pInfo->ulPiOfset = LC_INGEN_PINFO;
+ pdAust++;
+ pdNord++;
+ pInfo++;
+ antall--;
+ }
+
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %ld",linje);
+ LC_Error(41,"(LC_InsKoL)",err().tx);
+ }
+
+ } else { /* For mange koordinater */
+ LC_Error(162,"(LC_InsKoL)",LX_GetGi(1));
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_InsKoL)","");
+ }
+
+ return(Sys.pGrInfo->nko);
+}
+
+
+/*
+AR-911001
+CH LC_AppKoL Heng på en koordinatlinje
+CD ==========================================================================
+CD Formål:
+CD Henger på en linje i koordinatdelen i en gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long nko r Antall koordinater i gruppen etter utvidelsen.
+CD
+CD Bruk:
+CD nko = LC_AppKoL();
+ ==========================================================================
+*/
+SK_EntPnt_FYBA long LC_AppKoL()
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* AKtuell gruppe OK */
+ if (Sys.pGrInfo->nko + 1 < LC_MAX_KOORD) {
+ Sys.sGrEndra = (short)END_ENDRA;
+ Sys.pGrInfo->nko++; /* Antall koordinater etter utvidelsen */
+
+ /* Blank ut den nye linjen */
+ *(Sys.pdAust+Sys.pGrInfo->nko - 1) = 0.0;
+ *(Sys.pdNord+Sys.pGrInfo->nko - 1) = 0.0;
+ (Sys.pInfo+Sys.pGrInfo->nko - 1)->dHoyde = HOYDE_MANGLER;
+ (Sys.pInfo+Sys.pGrInfo->nko - 1)->sKp = 0;
+ (Sys.pInfo+Sys.pGrInfo->nko - 1)->ulPiOfset = LC_INGEN_PINFO;
+
+ } else { /* For mange koordinater */
+ LC_Error(162,"(LC_AppKoL)",LX_GetGi(1));
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_AppKoL)","");
+ }
+
+ return(Sys.pGrInfo->nko);
+}
+
+
+
+
+/*
+AR-930611
+CH LC_DelGiL Fjern GINFO-linjer
+CD =============================================================================
+CD Formål:
+CD Fjerner linjer i GINFO-delen i en gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short linje i Første linjenummer som skal fjernes.
+CD (Lovlig: 2 til ngi)
+CD short antall i Antall linjer som skal fjernes.
+CD short ngi r Antall GINFO-linjer i gruppen etter setting.
+CD
+CD Bruk:
+CD ngi = LC_DelGiL(linje, antall);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_DelGiL(short linje, short antall)
+{
+ short start;
+ char *pszTil, *pszFra;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* AKtuell gruppe OK */
+ if (antall > 0) {
+ Sys.sGrEndra = (short)END_ENDRA;
+
+ start = max(linje,2); /* 2 er første lovlige linje */
+ antall -= (start-linje); /* Juster antall tilsvarende */
+
+ /* Max antall er resten av GINFO */
+ antall = min(start+antall-1,Sys.pGrInfo->ngi) - start + 1;
+
+ if (start+antall <= Sys.pGrInfo->ngi) {
+ /* Beregn forflytting */
+ pszTil = Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[start-1];
+ pszFra = Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[start+antall-1];
+
+ /* Utfør flyttingen */
+ memmove(pszTil, pszFra, Sys.pGrInfo->ulGiLen - Sys.Ginfo.ulOfset[start+antall-1] + 1);
+
+ /* Antall GINFO-linjer etter slettingen */
+ Sys.pGrInfo->ngi -= antall;
+
+ /* Ny total GINFO-lengde; */
+ Sys.pGrInfo->ulGiLen -= (unsigned long)(pszFra - pszTil);
+
+ /* Oppdater offset for resten av GINFO */
+ LX_CreGiPeker(&Sys.Ginfo,Sys.pGrInfo->ngi);
+
+ /* Fjerner fram til slutten av GINFO */
+ } else {
+ /* Antall GINFO-linjer etter slettingen */
+ Sys.pGrInfo->ngi -= antall;
+ /* Ny total GINFO-lengde; */
+ Sys.pGrInfo->ulGiLen = Sys.Ginfo.ulOfset[start-1];
+ }
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_DelGiL)","");
+ }
+
+ return (Sys.pGrInfo->ngi);
+}
+
+
+/*
+AR:2008-04-09
+CH LC_DelGiNavn Fjerner egenskap fra GINFO
+CD ==========================================================================
+CD Formål:
+CD Fjerner alle forekomster av gitt egenskap (SOSI-navn) fra GINFO.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char *pszEgenskapNavn i SOSI-navn som skal slettes
+CD short ngi r Antall GINFO-linjer i gruppen etter setting
+CD
+CD Bruk:
+CD ngi = LC_DelGiNavn("..RADIUS");
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_DelGiNavn(char *pszEgenskapNavn)
+{
+ short sGiLinje = 2;
+ while (LC_GetGP(pszEgenskapNavn,&sGiLinje,Sys.pGrInfo->ngi) != NULL)
+ {
+ LC_DelGiL(sGiLinje,1);
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+AR-930611
+CH LC_DelKoL Fjern koordinatlinjer
+CD =============================================================================
+CD Formål:
+CD Fjerner linjer koordinatdelen i en gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD long linje i Første linje som skal fjernes.
+CD (Lovlig: 1 til nko)
+CD long antall i Antall linjer som skal fjernes.(Max resten av gruppen)
+CD long nko r Antall koordinater i gruppen etter blanking.
+CD
+CD Bruk:
+CD nko = LC_DelKoL(linje, antall);
+ =============================================================================
+*/
+SK_EntPnt_FYBA long LC_DelKoL(long linje, long antall)
+{
+ long start,s;
+ double *pdAust, *pdNord;
+ LB_INFO * pInfo,*pI;
+ unsigned long ulP1,ulP2,ulDelta;
+
+
+ /* UT_FPRINTF(stderr,"DelKoL: %hd - %hd (%hd) \n",linje,antall,Sys.GrInfo.nko); */
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* AKtuell gruppe OK */
+ Sys.sGrEndra = (short)END_ENDRA;
+ if (linje <= Sys.lPibufPnr) Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ start = max(linje,1); /* 1 er første lovlige linje */
+ antall -= (start-linje); /* Juster antall tilsvarende */
+
+ /* Max antall er resten av punktene */
+ antall = min(start+antall-1,Sys.pGrInfo->nko) - start + 1;
+
+ /* UT_FPRINTF(stderr," %hd - %hd\n",start,antall); */
+
+ if (antall > 0) {
+ pdAust = Sys.pdAust + start - 1;
+ pdNord = Sys.pdNord + start - 1;
+ pInfo = Sys.pInfo + start - 1;
+
+
+ /* Pakk PINFO-bufferet */
+
+ /* Har gruppen PINFO */
+ if (Sys.pGrInfo->ulPiLen > 0) {
+ /* Er det PINFO på de punktene som er slettet? */
+ pI = pInfo;
+ ulP1 = LC_INGEN_PINFO;
+ for (s=0; s<antall && ulP1==LC_INGEN_PINFO; s++,pI++) {
+ if (pI->ulPiOfset != LC_INGEN_PINFO) {
+ ulP1 = pI->ulPiOfset;
+ }
+ }
+
+ /* Er det funnet PINFO ? */
+ if (ulP1 != LC_INGEN_PINFO) {
+ /* Sjekk om det er PINFO i resten av gruppen */
+ pI = pInfo+antall;
+ ulP2 = LC_INGEN_PINFO;
+ for (s=start+antall; s<=Sys.pGrInfo->nko && ulP2==LC_INGEN_PINFO; s++,pI++) {
+ if (pI->ulPiOfset != LC_INGEN_PINFO) {
+ ulP2 = pI->ulPiOfset;
+ }
+ }
+
+
+ /* Er det funnet PINFO ? */
+ if (ulP2 != LC_INGEN_PINFO) {
+ /* Oppdater ofset */
+ ulDelta = ulP2 - ulP1;
+ pI = pInfo+antall;
+ for (s=start+antall; s <= Sys.pGrInfo->nko; s++,pI++) {
+ if (pI->ulPiOfset != LC_INGEN_PINFO) {
+ pI->ulPiOfset -= ulDelta;
+ }
+ }
+
+ /* Pakk buffer */
+ memmove(Sys.pszPinfo+ulP1, Sys.pszPinfo+ulP2, (Sys.pGrInfo->ulPiLen-ulP2) * (sizeof(char)));
+ Sys.pGrInfo->ulPiLen -= ulDelta;
+
+ /* Det er ikke PINFO i resten av gruppen */
+ } else {
+ /* Oppdater total PINFO-lengde */
+ Sys.pGrInfo->ulPiLen = ulP1;
+ }
+ }
+ }
+
+ /* Utfør flyttingen */
+ memmove(pdAust, pdAust+antall, (Sys.pGrInfo->nko-start-antall+1) * (sizeof(double)));
+ memmove(pdNord, pdNord+antall, (Sys.pGrInfo->nko-start-antall+1) * (sizeof(double)));
+ memmove(pInfo, pInfo+antall, (Sys.pGrInfo->nko-start-antall+1) * (sizeof(LB_INFO)));
+
+ /* Antall koordinater etter sletting */
+ Sys.pGrInfo->nko -= antall;
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_DelKoL)","");
+ }
+
+ return(Sys.pGrInfo->nko);
+}
+
+
+
+/*
+AR-930803
+CH LB_ClGr Nullstill aktuell gruppe
+CD ==========================================================================
+CD Formål:
+CD Nullstill aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LB_ClGr ();
+ =============================================================================
+*/
+void LB_ClGr (void)
+{
+ Sys.pGrInfo->ngi = 0;
+ Sys.pGrInfo->nko = 0;
+ Sys.pGrInfo->info = 0;
+ Sys.pGrInfo->ulGiLen = 0;
+ Sys.pGrInfo->ulPiLen = 0;
+ Sys.pGrInfo->szObjtype[0] = '\0';
+}
+
+
+/*
+AR-930610
+CH LB_RGru Les gruppe
+CD ==========================================================================
+CD Formål:
+CD Leser en datagruppe fra SOSI-fil inn i aktuell gruppe.
+CD Eventuelle gamle pekere må være frgitt utenfor denne rutinen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD UT_INT64 start i Startposisjon på SOSI-filen
+CD UT_INT64 slutt u Sluttposisjon på SOSI-filen
+CD short siste_gr r Siste gruppe (0=ikke siste, 1=siste på filen)
+CD
+CD Bruk:
+CD siste_gr = LB_RGru(pFil,start,&slutt);
+ ==========================================================================
+*/
+short LB_RGru(LC_FILADM *pFil,UT_INT64 start,UT_INT64 *slutt)
+{
+ short type,siste,npinf;
+ long snr;
+ char *cp,tx[LC_MAX_SOSI_LINJE_LEN];
+ LB_LESEBUFFER *pLb = &pFil->pBase->BufAdm;
+ LC_FILADM *pAktFil = Sys.GrId.pFil;
+ LB_INFO *pInfo = NULL;
+ double d;
+ short sLagreNavn; /* Flagg som viser om sosi-navnet skal skrives til buffer */
+ short sRefFunnet = UT_FALSE; /* Flagg som viser om referanse av ny type (..REF) er funnet i gruppen */
+
+ double dEnhet = 0.0;
+ double dEnhet_h = 0.0;
+ double dEnhet_d = 0.0;
+ double dOrigoAust = pFil->TransPar.Origo.dAust; /* Origo til lokale variabler */
+ double dOrigoNord = pFil->TransPar.Origo.dNord;
+
+
+ /* PINFO-buffer er ødelagt */
+ Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Angi hvilket tegnsett som skal brukes */
+ pLb->sTegnsett = pFil->sTegnsett;
+
+ /* Sett filposisjon */
+ LO_ReopenSos(pFil);
+ _fseeki64(pFil->pBase->pfSos,start,SEEK_SET);
+ pLb->sStatus = LESEBUFFER_TOM;
+
+ type = LB_GetSet(pFil->pBase->pfSos,pLb,&(pAktFil->SosiNavn));
+
+ if (pLb->cur_navn[pLb->cur_niv-1] != L_SLUTT) { /* Ikke lest ".SLUTT" */
+ /* Sjekk at gruppen har lovlig gruppenavn */
+ if (type < 0) {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," \"%s %s\"",LN_GetNavn(&(pAktFil->SosiNavn),
+ pLb->cur_navn[pLb->cur_niv-1]),pLb->pp);
+ LC_Error(47,"(LB_RGru)",err().tx);
+ exit (2);
+ }
+
+ siste = 0;
+
+ /* Nullstiller gruppen */
+ LB_ClGr();
+
+ /* Legg inn gruppenavnet med serienummer */
+ Sys.pGrInfo->gnavn = pLb->cur_navn[0];
+ Sys.pGrInfo->ngi = 1;
+ snr = strtol(pLb->pp,&cp,10);
+ if (Sys.pGrInfo->gnavn != L_HODE) {
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"%s %ld:",LN_GetNavn(&pAktFil->SosiNavn,pLb->cur_navn[0]),snr);
+ } else {
+ UT_StrCopy(tx,LN_GetNavn(&pAktFil->SosiNavn,pLb->cur_navn[0]),LC_MAX_SOSI_LINJE_LEN);
+ }
+ UT_StrCopy(Sys.Ginfo.pszTx,tx,LC_MAX_SOSI_LINJE_LEN);
+ *Sys.Ginfo.ulOfset = 0;
+ Sys.pGrInfo->ulGiLen = (unsigned long)strlen(tx) + 1;
+
+ pLb->set_brukt = SET_BRUKT;
+
+ /* Leser resten av GINFO */
+ type = LB_GetSet(pFil->pBase->pfSos,pLb,&(pAktFil->SosiNavn));
+
+ while (type < LEST_KOORD && pLb->cur_niv > 1) {
+ if (type != LEST_BLANK) {
+ sLagreNavn = UT_TRUE;
+
+ /* GINFO */
+ if (type == LEST_GINFO) {
+ /* Referanse */
+ if (pLb->cur_navn[pLb->cur_niv-1] == L_REF1 ||
+ pLb->cur_navn[pLb->cur_niv-1] == L_REF2) {
+ Sys.pGrInfo->info |= GI_REF;
+ if (LN_TestOy(pLb->pp)) Sys.pGrInfo->info |= GI_OY_REF;
+
+ /* ..REF skal skrives bare på første linje med referanser */
+ if (pLb->cur_navn[pLb->cur_niv-1] == L_REF2 && sRefFunnet == UT_TRUE) {
+ sLagreNavn = UT_FALSE;
+ }
+
+#ifdef UTGAAR
+ /* Gruppen har høyde informasjon */
+ } else if (pLb->cur_navn[pLb->cur_niv-1] == L_HOYDE) {
+ Sys.pGrInfo->info |= GI_NAH; /* Husk at gruppen har høyde */
+#endif
+
+ /* Spesiell "..ENHET" */
+ } else if (pLb->cur_navn[pLb->cur_niv-1] == L_ENHET2) {
+ dEnhet = strtod(pLb->pp,&cp);
+
+ /* Spesiell "..ENHET-H" */
+ } else if (pLb->cur_navn[pLb->cur_niv-1] == L_ENHET2H) {
+ dEnhet_h = strtod(pLb->pp,&cp);
+
+ /* Spesiell "..ENHET-D" */
+ } else if (pLb->cur_navn[pLb->cur_niv-1] == L_ENHET2D) {
+ dEnhet_d = strtod(pLb->pp,&cp);
+
+ /* Spesiell "...ENHET" */
+ } else if (pLb->cur_navn[pLb->cur_niv-1] == L_ENHET3) {
+ dEnhet = strtod(pLb->pp,&cp);
+
+ /* Spesiell "...ENHET-H" */
+ } else if (pLb->cur_navn[pLb->cur_niv-1] == L_ENHET3H) {
+ dEnhet_h = strtod(pLb->pp,&cp);
+
+ /* Spesiell "...ENHET-D" */
+ } else if (pLb->cur_navn[pLb->cur_niv-1] == L_ENHET3D) {
+ dEnhet_d = strtod(pLb->pp,&cp);
+ }
+
+ /* Bygg opp GINFO-strengen for denne linjen */
+ if (sLagreNavn == UT_TRUE) {
+ UT_StrCopy(tx,LN_GetNavn(&pAktFil->SosiNavn,pLb->cur_navn[pLb->cur_niv-1]),LC_MAX_SOSI_LINJE_LEN);
+ } else {
+ *tx = '\0';
+ }
+ if (sLagreNavn == UT_TRUE && *(pLb->pp) != '\0') {
+ UT_StrCat(tx," ",LC_MAX_SOSI_LINJE_LEN);
+ }
+ if (*(pLb->pp) != '\0') {
+ UT_StrCat(tx,pLb->pp,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ /* Husk at det er funnet ny type referanse */
+ if (pLb->cur_navn[pLb->cur_niv-1] == L_REF2) {
+ sRefFunnet = UT_TRUE; /* Viser at referanse av ny type (..REF) er funnet */
+ }
+
+ // Husk OBJTYPE
+ if (pLb->cur_navn[pLb->cur_niv-1] == L_OBJTYPE) {
+ UT_StrCopy(Sys.pGrInfo->szObjtype,pLb->pp,LC_MAX_OBJTYPE_LEN);
+ }
+
+ /* Kommentar */
+ } else {
+ UT_StrCopy(tx,pLb->pp,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ /* GINFO og kommentar-linje lagres */
+ if (Sys.pGrInfo->ngi >= LC_MAX_GINFO) {
+ LC_Error(149,"(LB_RGru)",Sys.Ginfo.pszTx);
+
+ } else if ((Sys.pGrInfo->ulGiLen + strlen(tx) + 1) >= LC_MAX_GINFO_BUFFER) {
+ LC_Error(150,"(LB_RGru)",Sys.Ginfo.pszTx);
+
+ } else {
+ Sys.pGrInfo->ngi++;
+ UT_StrCopy(Sys.Ginfo.pszTx + Sys.pGrInfo->ulGiLen, tx,LC_MAX_SOSI_LINJE_LEN);
+ Sys.Ginfo.ulOfset[Sys.pGrInfo->ngi - 1] = Sys.pGrInfo->ulGiLen;
+ Sys.pGrInfo->ulGiLen += (unsigned long)strlen(tx) + 1;
+ }
+ }
+
+ // Hent neste linje
+ pLb->set_brukt = SET_BRUKT;
+ type = LB_GetSet(pFil->pBase->pfSos,pLb,&(pAktFil->SosiNavn));
+ }
+
+ // Enhet er ikke gitt i GINFO, bruk filhodets enhet
+ if (dEnhet == 0.0) dEnhet = pFil->TransPar.dEnhet;
+
+ // Enhet-H er ikke gitt i GINFO brukes enhet-H fra filhodet
+ if (dEnhet_h == 0.0) dEnhet_h = pFil->TransPar.dEnhet_h;
+
+ // Enhet-D er ikke gitt i GINFO brukes enhet-D fra filhodet
+ if (dEnhet_d == 0.0) dEnhet_d = pFil->TransPar.dEnhet_d;
+
+ /* Husk aktuell ENHET */
+ Sys.pGrInfo->dEnhet = dEnhet;
+ Sys.pGrInfo->dEnhetHoyde = dEnhet_h;
+ Sys.pGrInfo->dEnhetDybde = dEnhet_d;
+
+ /* Koordinatdelen */
+ while (pLb->cur_niv >= 2) {
+ if (type != LEST_BLANK && type != LEST_KOM) {
+ /* Sjekk at det ikke kommer GINFO innimellom koordinatene */
+ /* Ikke NØ eller NØH */
+ if (pLb->cur_niv == 2 &&
+ pLb->cur_navn[pLb->cur_niv-1] != L_NAH &&
+ pLb->cur_navn[pLb->cur_niv-1] != L_NAD &&
+ pLb->cur_navn[pLb->cur_niv-1] != L_NA)
+ {
+ char szMelding[256];
+ UT_SNPRINTF(szMelding,256,"Egenskap \"%s\" i \"%s\"",pLb->tx,Sys.Ginfo.pszTx);
+ LC_Error(144,"(LB_RGru)",szMelding);
+ }
+
+ /* Sjekk at det ikke blir for mange koordinater */
+ if (Sys.pGrInfo->nko >= LC_MAX_KOORD)
+ {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," \"%s %ld:\"",LN_GetNavn(&pAktFil->SosiNavn,pLb->cur_navn[0]),snr);
+ LC_Error(148,"(LB_RGru)",err().tx);
+ }
+
+ if (*pLb->pp != '\0')
+ {
+ Sys.pGrInfo->nko++;
+ pInfo = Sys.pInfo + Sys.pGrInfo->nko - 1;
+
+ /* Regn om til basekoordinater og legg inn i buffer */
+
+ /* Nord-koordinaten */
+ d = strtod(pLb->pp,&cp);
+ *(Sys.pdNord + Sys.pGrInfo->nko - 1) = dOrigoNord + (d * dEnhet);
+
+ /* Øst-koordinaten */
+ d = strtod(cp,&cp);
+ *(Sys.pdAust + Sys.pGrInfo->nko - 1) = dOrigoAust + (d * dEnhet);
+
+ /* ..NØH */
+ if (pLb->cur_navn[pLb->cur_niv-1] == L_NAH)
+ {
+ Sys.pGrInfo->info |= GI_NAH; /* Husk at gruppen har høyde */
+
+ /* Regn om høyden */
+ d = strtod(cp,&cp);
+ pInfo->dHoyde = d * dEnhet_h;
+ }
+
+ /* ..NØD */
+ else if (pLb->cur_navn[pLb->cur_niv-1] == L_NAD)
+ {
+ Sys.pGrInfo->info |= GI_NAD; /* Husk at gruppen har dybde */
+
+ /* Regn om dybden (Lagres som terrengverdi i mm) */
+ d = strtod(cp,&cp);
+ pInfo->dHoyde = d * dEnhet_d;
+ }
+
+ else
+ {
+ pInfo->dHoyde = HOYDE_MANGLER;
+ }
+ }
+
+ pLb->set_brukt = SET_BRUKT;
+
+ /* Neste sett */
+ type = LB_GetSet(pFil->pBase->pfSos,pLb,&(pAktFil->SosiNavn));
+
+
+ /* PINFO */
+ if (Sys.pGrInfo->nko > 0)
+ {
+ pInfo->sKp = 0;
+ pInfo->ulPiOfset = LC_INGEN_PINFO;
+ npinf = 0;
+ *tx = '\0';
+ while (pLb->cur_niv > 2)
+ {
+ if (type != LEST_BLANK && type != LEST_KOM)
+ {
+ if (pLb->cur_navn[pLb->cur_niv-1] == L_KP)
+ { /* Knutepunkt */
+ /* Sjekk om det er flere kp i samme punkt */
+ if (pInfo->sKp != 0)
+ {
+ //UT_SNPRINTF(err().tx,LC_ERR_LEN," \"%s\"",pLb->pp);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," \"%s\" pnr.: %ld ",LX_GetGi(1), Sys.pGrInfo->nko);
+ LC_Error(145,"(LB_RGru)",err().tx);
+ }
+ else
+ {
+ pInfo->sKp = (short)strtol(pLb->pp,&cp,10);
+ Sys.pGrInfo->info |= GI_KP;
+ }
+
+ } else { /* Annen PINFO */
+ npinf++;
+ if (npinf > 1) UT_StrCat(tx," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(tx, LN_GetNavn(&(pAktFil->SosiNavn),pLb->cur_navn[pLb->cur_niv-1]),
+ LC_MAX_SOSI_LINJE_LEN);
+ if (*(pLb->pp) != '\0'){
+ UT_StrCat(tx," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(tx,pLb->pp,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ if (strlen(tx) > LC_MAX_SOSI_LINJE_LEN) {
+ tx[30] = '\0';
+ LC_Error(143,"(LB_RGru)",tx);
+ tx[0] = '\0';
+ npinf = 0;
+ }
+ }
+ }
+
+ pLb->set_brukt = SET_BRUKT;
+
+ /* Neste sett */
+ type = LB_GetSet(pFil->pBase->pfSos,pLb,&(pAktFil->SosiNavn));
+ }
+
+ /* Lagre PINFO */
+ if (*tx != '\0') {
+ if (Sys.pGrInfo->ulPiLen == 0) {
+ pInfo->ulPiOfset = 0;
+ } else {
+ pInfo->ulPiOfset = Sys.pGrInfo->ulPiLen;
+ }
+
+ if ((Sys.pGrInfo->ulPiLen + strlen(tx) + 1) >= LC_MAX_PINFO_BUFFER) {
+ LC_Error(161,"(LB_RGru)",Sys.Ginfo.pszTx);
+
+ } else {
+ UT_StrCopy(Sys.pszPinfo + pInfo->ulPiOfset, tx, LC_MAX_PINFO_BUFFER-pInfo->ulPiOfset);
+ Sys.pGrInfo->ulPiLen += (unsigned long)strlen(tx) + 1;
+ }
+
+ Sys.pGrInfo->info |= GI_PINFO;
+ }
+ }
+
+ } else { /* Fyll-linje er lest */
+ pLb->set_brukt = SET_BRUKT;
+ /* Neste sett */
+ type = LB_GetSet(pFil->pBase->pfSos,pLb,&(pAktFil->SosiNavn));
+
+ }
+ }
+
+ } else { /* ".SLUTT" */
+ siste = 1;
+ }
+
+ if (Sys.pGrInfo->gnavn == L_HODE && !siste ) { /* Oppdater filtabellen */
+ LO_BeFt(pFil);
+ }
+
+ *slutt = pLb->startpos; /* Slutt - filposisjon */
+ return(siste);
+}
+
+
+/*
+AR-911001
+CH LB_Save Tøm skrivekøa for 1 fil
+CD ==========================================================================
+CD Formål:
+CD Skriver gruppene som ligger i skrivekø ut til SOSI-fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD LB_Save(pFil);
+ ==========================================================================
+*/
+void LB_Save(LC_FILADM *pFil)
+{
+ LC_BGR Bgr,AktBgr;
+ long lNr;
+ short ngi;
+ long nko;
+ unsigned short info;
+
+ Bgr.pFil = pFil;
+
+ if (Sys.lAntSkriv > 0L) { /* Er det noen i kø ? */
+ AktBgr = Sys.GrId;
+ for (lNr=0L; lNr<pFil->lAntGr; lNr++) {
+ if (LI_InqBt(pFil,lNr,BT_SKRKO)) { /* I kø ? */
+ Bgr.lNr = lNr;
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ LB_Swap();
+ }
+ }
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ } else {
+ Sys.GrId = AktBgr;
+ }
+ }
+}
+
+
+/*
+AR-911001
+CH LC_Save Tøm skrivekøa
+CD ==========================================================================
+CD Formål:
+CD Skriver gruppene som ligger i skrivekø ut til SOSI-fil.
+CD
+CD Parametre: ingen
+CD
+CD Bruk:
+CD LC_Save();
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_Save(void)
+{
+ LC_BASEADM * pBase;
+ LC_FILADM *pFil;
+
+ if (Sys.lAntSkriv > 0L) { /* Er det noen i kø ? */
+ /* Skanner alle baser og alle filer */
+ for (pBase=Sys.pForsteBase; pBase!=NULL; pBase=pBase->pNesteBase) {
+ for (pFil=pBase->pForsteFil; pFil!=NULL; pFil=pFil->pNesteFil) {
+ LB_Save(pFil);
+ }
+ LO_CloseSos(pBase);
+ }
+
+ Sys.lAntSkriv = 0L;
+ }
+}
+
+
+/*
+AR-930610
+CH LB_Swap Dump gruppe fra buffer til SOSI
+CD ==========================================================================
+CD Formål:
+CD Skriver en gruppe fra buffer tilbake til SOSI-fil. Ledig plass fram til
+CD neste gruppe blir blanket. Hvis det ikke er plass blir gruppen flyttet
+CD til slutten av filen. Fjerner gruppen fra skrivekøa.
+CD
+CD Parametre: ingen
+CD
+CD Bruk:
+CD LB_Swap()
+ ==========================================================================
+*/
+void LB_Swap(void)
+{
+ short siste;
+ long nko;
+ UT_INT64 start,neste;
+
+ /* Filnummer og posisjon */
+ start = Sys.pGrInfo->sosi_st;
+ nko = Sys.pGrInfo->nko;
+
+ if (start == NY_SOSI_ST){ /* Ny gruppe? */
+ siste = 1; /* På slutten */
+ start = Sys.GrId.pFil->n64AktPos;
+ } else{
+ siste = LB_Plass(Sys.GrId.pFil,start,&neste); /* Finn ledig plass */
+ }
+
+ /* Ikke siste gruppe */
+ if ( ! siste ) {
+ /* Skriver */
+ if ( ! LB_WGru(SKRIV_VANLIG,1,nko,Sys.GrId.pFil,start,&neste)) {
+ /* For lite plass, blank ut "gammelt" området på SOSI-filen */
+ _fseeki64(Sys.GrId.pFil->pBase->pfSos,start,SEEK_SET);
+ Sys.GrId.pFil->pBase->BufAdm.sStatus = LESEBUFFER_TOM;
+ LB_WriteBlank(Sys.GrId.pFil->pBase->pfSos,Sys.GrId.pFil->sTegnsett,neste); /* Blank ut området */
+
+ /* Gruppen skrives på slutten av SOSI-filen */
+ siste = 1;
+ start = Sys.GrId.pFil->n64AktPos;
+ }
+ }
+
+ /* Siste gruppe på SOSI-filen */
+ if ( siste ) {
+ Sys.pGrInfo->sosi_st = start; /* Ny filposisjon */
+ neste = LLONG_MAX;
+ /* Skriver */
+ LB_WGru (SKRIV_SISTE,1,nko,Sys.GrId.pFil,start,&neste);
+
+ Sys.GrId.pFil->n64AktPos = neste; /* Ny slutt-posisjon */
+ }
+
+ LI_ClrBt(Sys.GrId.pFil,Sys.GrId.lNr,BT_SKRKO); /* Fjern fra skrivekø */
+}
+
+
+/*
+AR-930610
+CH LB_WGru Skriv gruppe til SOSI-fil
+CD ==========================================================================
+CD Formål:
+CD Skriver aktuell gruppe fra buffer til en SOSI-fil.
+CD Sjekker ikke om buffer er endret i fht. SOSI. (Skriver alltid.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short strategi i Skrivestrategi: Følgende konstanter er definert:
+CD KONTROLLER_PLASS = Bare kontroller plass,
+CD (ikke skriv til SOSI).
+CD SKRIV_VANLIG = Skriv til SOSI, vanlig.
+CD SKRIV_SISTE = Skriv til SOSI, med .SLUTT
+CD og sett filstørrelse.
+CD long fra_punkt i Punktnummer for første koordinat som skal skrives.
+CD (Lovlig: 1 <= fra_punkt <= nko)
+CD long antall i Antall koordinatlinjer som skal skrives.
+CD (Lovlig: 0 <= antall <= nko)
+CD (Ved skriv av annet enn aktuell gruppe skrives
+CD alltid hele gruppen.)
+CD LC_FILADM *pFil i Peker til FilAdm for fil det skal skrives til
+CD UT_INT64 ffipos i Startposisjon på SOSI-filen
+CD UT_INT64 *lfipos iu inn: Første pos i neste gruppe (må ikke overskrives)
+CD ut : Første pos etter gruppen (etter event. utrop.)
+CD short ist r Status: 1 = Skrevet OK
+CD 0 = Ikke plass, må flyttes til slutten
+CD
+CD Bruk:
+CD ok = LB_WGru (strategi,fra_punkt,antall,pFil,ffipos,&lfipos);
+=============================================================================
+*/
+short LB_WGru (short strategi,long fra_punkt,long antall,
+ LC_FILADM *pFil,UT_INT64 ffipos,UT_INT64 *lfipos)
+{
+ short i,gnavn,ngi,skriv_nah,nah,forrige_nah;
+ long pt,l;
+ unsigned long ulOfset;
+ char tx[LC_MAX_SOSI_LINJE_LEN],*cp,szOrd[60];
+ char szError[256];
+ double dN,dA;
+ short sFilMindre;
+ UT_INT64 Size;
+ char szKp[50];
+ FILE *pfSos = NULL;
+ double dEnhet = 0.0;
+ double dEnhetHoyde = 0.0;
+ double dEnhetDybde = 0.0;
+ double dOrigoNord = pFil->TransPar.Origo.dNord;
+ double dOrigoAust = pFil->TransPar.Origo.dAust;
+ UT_INT64 fpos;
+ UT_INT64 nfipos; /* Neste filposisjon (første etter linjen) */
+ UT_INT64 afipos = ffipos; /* Aktuell filposisjon */
+
+
+#ifdef test
+ SH_OutTx(1,1,"WGru:");
+ SH_OutShort(0,1,1,strategi);
+ SH_OutShort(0,1,3,fra_punkt);
+ SH_OutShort(0,1,4,antall);
+ SH_OutLong(0,1,5,pBgr->lNr);
+ SH_OutTx(0,1,pBgr->pFil->pszNavn);
+ SH_OutTx(0,1,pFil->pszNavn);
+ SH_OutTx(2,1,"ffipos:");SH_OutLong(0,0,10,ffipos);
+ SH_OutTx(0,1,"lfipos:");SH_OutLong(0,0,10,*lfipos);
+ SH_WaitKb();
+ SH_ErLine(SH_SCR,1);
+ SH_ErLine(SH_SCR,2);
+#endif
+
+/* printf("\nWGru:fra: %s : %ld nko:%ld til %s",
+ strrchr(pBgr->pFil->pszNavn,'\\')+1,
+ pBgr->lNr,
+ antall,
+ strrchr(pFil->pszNavn,'\\')+1); */
+
+ /* Hent diverse opplysninger om gruppen */
+ gnavn = Sys.pGrInfo->gnavn;
+ ngi = Sys.pGrInfo->ngi;
+ /* antall = Sys.pGrInfo->nko; (Ant.koord kommer inn i kallet) */
+ /* info = Sys.pGrInfo->info; */
+
+ if (strategi != KONTROLLER_PLASS) {
+ LO_ReopenSos(pFil); /* Aktiviser SOSI-filen */
+ pfSos = pFil->pBase->pfSos;
+ _fseeki64 (pfSos, afipos, SEEK_SET);
+ pFil->pBase->BufAdm.sStatus = LESEBUFFER_TOM;
+ }
+
+ /* Skriv GINFO */
+ for (i = 1; i <= ngi; i++) {
+ UT_StrCopy(tx,LX_GetGi(i),LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(tx,"\r\n",LC_MAX_SOSI_LINJE_LEN);
+
+ /* Spesiell ..ENHET */
+ if (LN_Enhet(&(Sys.GrId.pFil->SosiNavn),tx)) {
+ cp = tx;
+ while(!UT_IsSpace(*cp)){
+ cp++;
+ }
+ dEnhet = strtod(cp,&cp);
+ }
+
+ /* Spesiell ..ENHET-H */
+ if (LN_EnhetHoyde(&(Sys.GrId.pFil->SosiNavn),tx)) {
+ cp = tx;
+ while(!UT_IsSpace(*cp)){
+ cp++;
+ }
+ dEnhetHoyde = strtod(cp,&cp);
+ }
+
+ /* Spesiell ..ENHET-D */
+ if (LN_EnhetDybde(&(Sys.GrId.pFil->SosiNavn),tx)) {
+ cp = tx;
+ while(!UT_IsSpace(*cp)){
+ cp++;
+ }
+ dEnhetDybde = strtod(cp,&cp);
+ }
+
+ /* GINFO, og kommentar-linje lagres */
+ /*
+ * Sjekk om plassen er oppbrukt.
+ * (Overskriver neste guppe.)
+ */
+ nfipos = afipos + (long)strlen(tx);
+ while (nfipos > *lfipos) {
+ if (gnavn == L_HODE) {
+ /* Prøver å flytte gruppen til slutten */
+ if (!LB_FlyttGrTilSlutt(pFil,*lfipos,lfipos)) {
+ LC_Error(146,"(LB_WGru)",pFil->pszNavn);
+ return 1;
+ }
+
+ } else {
+ return 0;
+ }
+ }
+
+ /* Skriv til SOSI */
+ if (strategi != KONTROLLER_PLASS) {
+ LB_WriteLine(pfSos,pFil->sTegnsett,tx);
+ }
+ afipos = nfipos;
+ }
+
+ /* Enhet er ikke gitt i GINFO, bruk filhodets enhet */
+ if (dEnhet == 0.0) dEnhet = pFil->TransPar.dEnhet;
+
+ // Enhet-H er ikke gitt i GINFO, bruk enhet-H fra filhodet
+ if (dEnhetHoyde == 0.0) dEnhetHoyde = pFil->TransPar.dEnhet_h;
+
+ // Enhet-D er ikke gitt i GINFO, bruk enhet-D fra filhodet
+ if (dEnhetDybde == 0.0) dEnhetDybde = pFil->TransPar.dEnhet_d;
+
+
+ /* Hopp fram til første koordinat som skal skrives */
+ pt = fra_punkt - 1;
+
+ forrige_nah = -1;
+ skriv_nah = 1; /* Skriv ..NØ(H) før første koordinat linje */
+
+ /* =====> Skriv koordinater og PINFO */
+ for (l=0; l<antall; l++,pt++) {
+ nah = ((Sys.pInfo + pt)->dHoyde != HOYDE_MANGLER);
+
+ /* Må skrive ..NØ eller ..NØH ved skifte mellom disse */
+ if (forrige_nah != nah) {
+ skriv_nah = 1;
+ }
+
+ if (skriv_nah) { /* Skriv ..NØ / ..NØH / ..NØD */
+ if (nah) {
+
+ if ((Sys.pGrInfo->info & GI_NAH) != 0) {
+ UT_StrCopy(tx,"..NØH\r\n",LC_MAX_SOSI_LINJE_LEN);
+ } else {
+ UT_StrCopy(tx,"..NØD\r\n",LC_MAX_SOSI_LINJE_LEN);
+ }
+ nfipos = afipos + 7;
+ } else {
+ UT_StrCopy(tx,"..NØ\r\n",LC_MAX_SOSI_LINJE_LEN);
+ nfipos = afipos + 6;
+ }
+ forrige_nah = nah;
+
+ if (nfipos > *lfipos) { /* Sjekk om plassen er oppbrukt */
+ return(0); /* Overskriver neste guppe */
+ }
+
+ if (strategi != KONTROLLER_PLASS) {
+ LB_WriteLine(pfSos,pFil->sTegnsett,tx); /* Skriv til SOSI */
+ }
+ afipos = nfipos;
+ skriv_nah = 0;
+ }
+
+ /* -----> Koordinater */
+ dN = UT_RoundDD((*(Sys.pdNord+pt) - dOrigoNord) / dEnhet);
+ dA = UT_RoundDD((*(Sys.pdAust+pt) - dOrigoAust) / dEnhet);
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"%.0f %.0f",dN,dA);
+
+ // ----- Høyde eller dybde
+ if (nah)
+ {
+ // NØH
+ if ((Sys.pGrInfo->info & GI_NAH) != 0)
+ {
+ dA = UT_RoundDD((Sys.pInfo+pt)->dHoyde / dEnhetHoyde);
+ }
+
+ // NØD
+ else
+ {
+ dA = UT_RoundDD((Sys.pInfo+pt)->dHoyde / dEnhetDybde);
+ }
+
+ UT_SNPRINTF(szOrd,60," %.0f",dA);
+ UT_StrCat(tx,szOrd,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ // ----- PINFO
+ ulOfset = (Sys.pInfo+pt)->ulPiOfset;
+
+ if (ulOfset != LC_INGEN_PINFO)
+ {
+ skriv_nah = 1;
+ UT_StrCat(tx," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(tx,Sys.pszPinfo+ulOfset,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ // ----- ...KP n
+ if ((Sys.pInfo+pt)->sKp != 0)
+ {
+ skriv_nah = 1;
+ UT_SNPRINTF(szKp,50," ...KP %hd",(Sys.pInfo+pt)->sKp);
+ UT_StrCat(tx,szKp,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ // Sjekk at linjen ikke er for lang
+ if (strlen(tx) > (LC_MAX_SOSI_LINJE_LEN - 10))
+ {
+ tx[LC_MAX_SOSI_LINJE_LEN -10] = '\0';
+ UT_StrCat(tx, " ?????", LC_MAX_SOSI_LINJE_LEN);
+ LC_Error(134,"(LB_WGru)",LX_GetGi(1));
+ }
+
+ // Legg på linjeslutt
+ UT_StrCat(tx,"\r\n",LC_MAX_SOSI_LINJE_LEN);
+
+ /* Sjekk om plassen er oppbrukt */
+ nfipos = afipos + (long)strlen(tx);
+ if (nfipos > *lfipos) { /* Overskriver neste guppe */
+ /* printf(" (Overskriv)"); */
+ return(0); /* ===> RETUR */
+ }
+
+ if (strategi != KONTROLLER_PLASS){
+ LB_WriteLine(pfSos,pFil->sTegnsett,tx); /* Skriver */
+ }
+
+ afipos = nfipos;
+ }
+
+ if (strategi == SKRIV_SISTE) /* På slutten av filen */
+ {
+ /* Akt.pos + reserveplass */
+ *lfipos = _ftelli64(pfSos) + (UT_INT64)Sys.sResPlass;
+ /* Legg på 200 ekstra etter filhodet */
+ if (ffipos == 0) *lfipos += 200;
+ LB_WriteBlank(pfSos,pFil->sTegnsett,*lfipos);
+
+ /* Skriver .SLUTT */
+ UT_StrCopy(tx,".SLUTT\r\n",LC_MAX_SOSI_LINJE_LEN);
+ LB_WriteLine(pfSos,pFil->sTegnsett,tx);
+
+ /* Husk akt. filposisjon */
+ fpos = _ftelli64(pfSos);
+ if (fpos == -1) {
+ UT_strerror(szError,256,errno);
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"%s - %s",pFil->pszNavn,szError);
+ LC_Error(142,"(LB_WGru)",tx);
+ }
+
+ // Sjekk om filstørrelsen er redusert
+ sFilMindre = UT_FALSE;
+ if (Sys.sUtvidModus != LC_UTVID_SIKKER) {
+ if (UT_InqPathSize_i64(pFil->pszNavn,&Size) == 0) {
+ if (fpos <= Size) sFilMindre = UT_TRUE;
+ }
+ }
+
+ // Filstørrelsen er redusert, eller sikker utvidingsmodus
+ if (sFilMindre == UT_TRUE || Sys.sUtvidModus == LC_UTVID_SIKKER) {
+
+ /* Steng filen for å bevare byte-pekeren */
+ LO_CloseSos(pFil->pBase);
+
+ /* Sett filstørrelse */
+ if (fpos != -1) {
+ if ((i = UT_SetPathSize_i64(pFil->pszNavn,fpos-1)) != 0) {
+ UT_SNPRINTF(tx,LC_MAX_SOSI_LINJE_LEN,"(%s, Posisjon:%lld, Se log-fil for detaljert beskrivelse)",pFil->pszNavn,fpos-1);
+ LC_Error(92,"(LB_WGru)",tx);
+ }
+ }
+ }
+ }
+
+ else
+ {
+ if (strategi != KONTROLLER_PLASS) {
+ /* Blank fram til neste gruppe, og tøm buffer */
+ LB_WriteBlank(pfSos,pFil->sTegnsett,*lfipos);
+ }
+ }
+
+/* printf(" (OK)"); */
+
+ return(1);
+}
+
+
+/*
+AR-920309
+CH LB_FlyttGrTilSlutt Flytt gruppe til slutten av filen
+CD ==========================================================================
+CD Formål:
+CD Flytt gruppe til slutten av filen
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD UT_INT64 start i Startposisjon på SOSI-filen (første pos. i gr.)
+CD UT_INT64 *neste u Startposisjon i neste gruppe (første pos. etter gr.)
+CD short status r Status: UT_FALSE = Feil
+CD UT_TRUE = OK
+CD
+CD Bruk:
+CD status = LB_FlyttGrTilSlutt(forste,&neste)
+ ==========================================================================
+*/
+static short LB_FlyttGrTilSlutt(LC_FILADM *pFil, UT_INT64 start, UT_INT64 *neste)
+{
+ UT_INT64 lCurFilpos;
+ long lAntTegn,lNr;
+ char *pszBuffer;
+ LC_GRTAB_LINJE * pGrInfo;
+
+ /* Husk aktuell filposisjon */
+ lCurFilpos = _ftelli64(pFil->pBase->pfSos);
+
+ /* Sjekk gruppetabellen for å finne hvilken gruppe */
+ /* som starter i start posisjonen. */
+ for (lNr=1L; lNr<pFil->lAntGr; lNr++) {
+ pGrInfo = LI_GetGrt(pFil,lNr);
+ if (pGrInfo->ngi != 0) {
+ if (pGrInfo->sosi_st == start) {
+ /* Oppdater startposisjon */
+ pGrInfo->sosi_st = pFil->n64AktPos;
+ break;
+ }
+ }
+ }
+
+ /* Finn starten av neste gruppe */
+ LB_Plass (pFil,start,neste);
+
+ /* Alloker buffer for flyttingen */
+ lAntTegn = (long)(*neste - start);
+ pszBuffer = (char*)UT_MALLOC((size_t)lAntTegn * sizeof(char));
+
+ /* Les inn gruppen */
+ _fseeki64(pFil->pBase->pfSos,start,SEEK_SET);
+ fread(pszBuffer,sizeof(char),(size_t)lAntTegn,pFil->pBase->pfSos);
+
+ /* Skriv gruppen */
+ _fseeki64(pFil->pBase->pfSos,pFil->n64AktPos,SEEK_SET);
+ fwrite(pszBuffer,sizeof(char),(size_t)lAntTegn,pFil->pBase->pfSos);
+
+ /* Ny sluttposisjon */
+ pFil->n64AktPos = _ftelli64(pFil->pBase->pfSos);
+
+ /* Skriver .SLUTT */
+ UT_StrCopy(pszBuffer,".SLUTT\r\n",lAntTegn);
+ LB_WriteLine(pFil->pBase->pfSos,pFil->sTegnsett,pszBuffer);
+ UT_FREE(pszBuffer);
+ /* Posisjoner tilbake til opprinnelig posisjon */
+ _fseeki64(pFil->pBase->pfSos,lCurFilpos,SEEK_SET);
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-920309
+CH LB_Plass Finn tilgjengelig plass
+CD ==========================================================================
+CD Formål:
+CD Scanner SOSI-filen og finner hvor mye plass som er tilgjengelig for
+CD gruppen. (Uten flytting.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD UT_INT64 start i Startposisjon på SOSI-filen (første pos. i gr.)
+CD UT_INT64 *neste u Startposisjon i neste gruppe (første pos. etter gr.)
+CD short siste r Siste gruppe: UT_FALSE = Ikke siste gruppe
+CD UT_TRUE = Siste gruppe
+CD
+CD Bruk:
+CD siste = LB_Plass (pFil,start,&neste)
+ ==========================================================================
+*/
+short LB_Plass (LC_FILADM *pFil, UT_INT64 start, UT_INT64 *neste)
+{
+ LB_LESEBUFFER * pLb = &pFil->pBase->BufAdm;
+
+ LO_ReopenSos(pFil); /* Aktiviser SOSI-filen */
+ _fseeki64(pFil->pBase->pfSos,start,SEEK_SET);
+ pLb->sStatus = LESEBUFFER_TOM;
+
+ /* Gruppenavn på egen gruppe */
+ LB_GetSet(pFil->pBase->pfSos,pLb,&(pFil->SosiNavn));
+
+ /* Scann gruppen sett for sett */
+ do {
+ pLb->set_brukt = SET_BRUKT;
+ LB_GetSet(pFil->pBase->pfSos,pLb,&(pFil->SosiNavn));
+ } while (pLb->cur_niv != 1);
+
+ *neste = pLb->startpos;
+
+ return ((pLb->cur_navn[0] == L_SLUTT)? 1 : 0 ); /* Siste gruppe? */
+}
+
+
+/*
+GL-880119
+AR-911001
+CH LB_WriteBlank Fyller inn "!!!!!!!"
+CD ==========================================================================
+CD Formål:
+CD Fyller området FRA-OG-MED current-posisjon og fram TIL,
+CD (men ikke inklusiv) , ltilpos med !!!!!.
+CD Rutina takler fra 1 til mange posisjoner.
+CD
+CD curr-pos ltilpos
+CD +------------------------------+
+CD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD FILE *fil i Filpeker
+CD short sTegnsett i Tegnsett (Def fra fyut.h)
+CD long ltilpos i Posisjon det skal blankes fram til
+CD
+CD Bruk:
+CD LB_WriteBlank(fil,sTegnsett,ltilpos);
+ ===================================================================
+*/
+static void LB_WriteBlank (FILE *fil,short sTegnsett,UT_INT64 ltilpos)
+{
+ UT_INT64 fpos;
+ long iant;
+ short i;
+ char buffer[LC_MAX_SOSI_LINJE_LEN] = "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n";
+
+ fpos = _ftelli64(fil); /* Skriver fulle linjer */
+ if (ltilpos > fpos){
+ while (fpos < (ltilpos-40)){
+ LB_WriteLine(fil,sTegnsett,buffer);
+ fpos = _ftelli64(fil);
+ }
+ /* Skriver resten */
+ iant = (long)(ltilpos-fpos);
+ if (iant > 2) { /* ant fyll > 2 */
+ for (i=0 ;( i < (iant - 2)) ; i++) {
+ buffer[i] = '!';
+ }
+ buffer[iant-2] = '\r';
+ buffer[iant-1] = '\n';
+ buffer[iant] = '\0';
+ LB_WriteLine(fil,sTegnsett,buffer);
+
+ }else { /* ant fyll = 1 eller 2 */
+ /* blank sist på forrige linje */
+ _fseeki64(fil,-2L,SEEK_CUR);
+ if (iant == 1) UT_StrCopy(buffer, " \r\n", LC_MAX_SOSI_LINJE_LEN);
+ else if (iant == 2) UT_StrCopy(buffer, " \r\n", LC_MAX_SOSI_LINJE_LEN);
+ LB_WriteLine(fil,sTegnsett,buffer);
+ }
+ }
+}
+
+
+/*
+AR-911001
+CH LB_WriteLine Lavnivå skriv tekst linje
+CD ==========================================================================
+CD Formål:
+CD Lavnivå overbygning ove write i C-biblioteket for å skrive en linje.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD FILE *fil i Filpeker
+CD short sTegnsett i Tegnsett (Spesifisert i UT)
+CD char *tx i Tekststreng som skal skrives.
+CD short antall r Antall tegn skrevet, eller -1 ved feil.
+CD
+CD Bruk:
+CD antall = LB_WriteLine(fil,sTegnsett,tx);
+ ==========================================================================
+*/
+short LB_WriteLine (FILE *fil,short sTegnsett,char *tx)
+{
+ UT_KonverterTegnsett(LC_INTERNT_TEGNSETT,sTegnsett,(unsigned char*)tx);
+ return (short)fwrite(tx,strlen(tx),1,fil);
+}
+
+
+/*
+AR-920909
+CH LB_FyllBuffer Oppdater lesebuffer fra SOSI-filen
+CD ==========================================================================
+CD Formål:
+CD Les neste linje fra SOSI-filen inn i lesebuffer.
+CD Konverterer til rett internt tegnsett.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD FILE *fil i Filpeker
+CD LB_LESEBUFFER *plb i Peker til bufferstruktur
+CD
+CD Bruk:
+CD LB_FyllBuffer(fil,&lb);
+ ===================================================================
+*/
+void LB_FyllBuffer (FILE *fil,LB_LESEBUFFER *plb)
+{
+ short ierr;
+
+
+ /* Husk filposisjonen */
+ plb->filpos = _ftelli64(fil);
+
+ /* Les */
+ if ((ierr = UT_ReadLine(fil,LC_MAX_SOSI_LINJE_LEN,plb->tx)) != UT_OK) {
+ /* Lesefeil */
+ if (ierr == UT_EOF) {
+ LC_Error(42,"(LB_FyllBuffer)",""); /* EOF */
+ } else {
+ LC_Error(43,"(LB_FyllBuffer)",""); /* Annen lesefeil */
+ }
+ exit(1);
+ }
+
+ /* Konverter til rett tegnsett */
+ UT_KonverterTegnsett(plb->sTegnsett,LC_INTERNT_TEGNSETT,(unsigned char*)plb->tx);
+
+ if (strlen(plb->tx) >= LC_MAX_SOSI_LINJE_LEN-2)
+ {
+ char szMelding[LC_MAX_SOSI_LINJE_LEN + 10];
+ UT_SNPRINTF(szMelding, LC_MAX_SOSI_LINJE_LEN + 10, "\"%s\"", plb->tx);
+ LC_Error(164,"(LB_FyllBuffer)",szMelding);
+ exit(1);
+ }
+
+ /* Nullstill pekere */
+ plb->cp = plb->np = plb->pp = plb->ep = plb->tx;
+ plb->set_brukt = SET_BRUKT;
+ plb->sStatus = LESEBUFFER_OK;
+}
+
+
+/*
+AR-920909
+CH LB_GetSet Hent SOSI-navn og verdi fra buffer
+CD =============================================================================
+CD Formål:
+CD Hen ett SOSI-navn og tilhørende verdi fra lesebuffer.
+CD Inn: Hvis buffer har gyldig innhold peker "plb->np" til posisjon
+CD der tolking skal starte.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD FILE *fil i Filpeker
+CD LB_LESEBUFFER *plb i Peker til bufferstruktur
+CD LC_NAVNETABELL * pNavn i Peker til navnetabell
+CD short type r Hva er hentet: >= 0 : Gruppenavn,linjenr
+CD i navnetab.
+CD LEST_KOORD (-1): Koordinatlinje
+CD LEST_BLANK (-2): Fyll-linje
+CD LEST_GINFO (-3): Annen GINFO
+CD LEST_KOM (-4): Kommentarlinje
+CD
+CD Bruk:
+CD type = LB_GetSet(fil,&lb,pNavn);
+ =============================================================================
+*/
+short LB_GetSet(FILE *fil,LB_LESEBUFFER *plb,LC_NAVNETABELL * pNavn)
+{
+ short navn_nr,gml_niv;
+ char cTmp;
+
+ /* Sjekk at buffer har rett innhold */
+ if (plb->sStatus != LESEBUFFER_OK) {
+ LB_FyllBuffer(fil,plb);
+ }
+
+ /* Henter nytt sett */
+ if (plb->set_brukt == SET_BRUKT) {
+ plb->cp = plb->np;
+
+ do {
+ /* Hopp over ledende blanke */
+ while (UT_IsSpace(*plb->cp)) {
+ (plb->cp)++;
+ }
+ /* Linjen er oppbrukt, les inn ny */
+ if (*plb->cp == '\0') {
+ LB_FyllBuffer(fil,plb);
+ }
+ } while (UT_IsSpace(*plb->cp) || *plb->cp == '\0');
+
+ plb->np = plb->cp;
+
+ if (*plb->cp == '.') { /* --------- SOSI-navn */
+ plb->startpos = plb->filpos + (plb->cp - plb->tx); /* Husk filposisjon */
+ /* Scann over navnet (Ikke \0, mellomrom eller filslutt) */
+ while (*plb->cp && !UT_IsSpace(*plb->cp) && *plb->cp != 26) {
+ (plb->cp)++;
+ }
+ cTmp = *plb->cp;
+ *plb->cp = '\0';
+
+ /* Søk i navnetabellen */
+ gml_niv = plb->cur_niv;
+ plb->cur_niv = LN_PakkNavn(pNavn,plb->np,&navn_nr,&(plb->cur_ant_par));
+ plb->cur_navn[plb->cur_niv - 1] = navn_nr;
+
+ *plb->cp = cTmp;
+
+ /* Sjekk mot sprang i prikknivå */
+ if ((plb->cur_niv - gml_niv) > 1) {
+ LC_Error(147,"(LB_GetSet)",plb->np);
+ }
+
+ /* Handter parameter */
+ if (navn_nr != L_SLUTT) {
+ do {
+ /* Hopp over ledende blanke */
+ while (UT_IsSpace(*plb->cp)) {
+ (plb->cp)++;
+ }
+ /* Linjen er oppbrukt, les inn ny */
+ if (*plb->cp == '\0') {
+ LB_FyllBuffer(fil,plb);
+ }
+ } while (UT_IsSpace(*plb->cp) || *plb->cp == '\0');
+ plb->np = plb->cp;
+
+ LB_GetParameter(plb);
+ }
+
+ if (plb->cur_niv == 1) { /* Gruppenavn */
+ plb->cur_type = navn_nr;
+
+ } else if (navn_nr == L_NA ||
+ navn_nr == L_NAH ||
+ navn_nr == L_NAD ) { /* Koordinat */
+ plb->cur_type = LEST_KOORD;
+
+ } else { /* Annen GINFO / PINFO */
+ plb->cur_type = LEST_GINFO;
+ }
+
+ } else { /* Parameter, kommentar eller fyll */
+ if (LB_TestFyll(plb->cp)) { /* ------------------ Fyll */
+ /* Marker at linjen er oppbrukt */
+ *plb->cp = '\0';
+
+ plb->cur_type = LEST_BLANK;
+ plb->np = plb->cp;
+
+ /* Fyll er alltid nivå 2 eller 3 */
+ if (plb->cur_niv == 1) {
+ plb->cur_niv = 2;
+ }
+
+ } else if (*plb->cp == '!') { /* ------------------ Kommentar */
+ plb->pp = plb->np;
+ /* Resten av linjen er kommentar */
+ plb->np = strchr(plb->cp,'\0');
+ plb->cur_type = LEST_KOM;
+ //plb->cur_niv = 2; /* Kommentar er bare lovlig i ginfo */ // Fjernet 24/7-02.
+ if (plb->cur_niv < 2) plb->cur_niv = 2; // Endret 22/8-02.
+
+ } else { /* ------------------ Parameter */
+ LB_GetParameter(plb);
+ if (plb->cur_navn[plb->cur_niv - 1] == L_NA ||
+ plb->cur_navn[plb->cur_niv - 1] == L_NAH ||
+ plb->cur_navn[plb->cur_niv - 1] == L_NAD ) { /* Koordinat */
+ plb->cur_type = LEST_KOORD;
+
+ } else { /* Annen GINFO / PINFO */
+ plb->cur_type = LEST_GINFO;
+ }
+ }
+ }
+ }
+
+ plb->set_brukt = SET_UBRUKT;
+
+ return plb->cur_type;
+}
+
+
+/*
+AR-920909
+CH LB_GetParameter Hent parameter fra buffer
+CD ==========================================================================
+CD Formål:
+CD Hent parameter fra lesebuffer.
+CD Forutsetter at det ikke er blanke forran parameteren.
+CD Inn: "plb->np" peker til første posisjon i parameteren. (Der tolking
+CD skal starte.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LB_LESEBUFFER *plb i Peker til bufferstruktur
+CD
+CD Bruk:
+CD param = LB_GetParameter(&lb)
+ ==========================================================================
+*/
+static char *LB_GetParameter(LB_LESEBUFFER *plb)
+{
+ short npar = (plb->cur_ant_par == LC_ANT_PAR_UKJENT)? 9999 : plb->cur_ant_par;
+
+ plb->pp = plb->cp = plb->ep = plb->np;
+
+ for ( ; npar > 0; npar--) {
+ /* Neste sett er funnet */
+ if (*plb->cp == '\0' || *plb->cp == '.' || *plb->cp == '!') {
+ break;
+
+ /* Vanlig ord */
+ } else if (*plb->cp != '"') {
+ while (*plb->cp && !UT_IsSpace(*plb->cp)) {
+ (plb->cp)++;
+ }
+ plb->ep = plb->cp;
+
+ /* "Ord" i hermetegn */
+ } else {
+ (plb->cp)++; /* Start-hermetegn */
+ while (*plb->cp && *plb->cp != '"') { /* "Ordet" */
+ (plb->cp)++;
+ }
+ if (*plb->cp == '"') {
+ (plb->cp)++;
+ }
+ plb->ep = plb->cp;
+ }
+
+ if (npar > 1) { /* Skann fram til neste parameter */
+ while (UT_IsSpace(*plb->cp)) {
+ (plb->cp)++;
+ }
+ }
+ }
+
+ /* Avslutt strengen */
+ if (plb->ep > plb->pp) { /* Vanlig */
+ plb->cp = plb->ep;
+ (plb->cp)++;
+ plb->np = plb->cp;
+ *plb->ep = '\0';
+ } else { /* Tom parameter */
+ plb->np = plb->ep;
+ plb->pp = plb->ep - 1;
+ *plb->pp = '\0';
+ }
+
+ return plb->pp;
+}
+
+
+/*
+AR-920626
+!-------------------------------------------------------------!
+! LB_TestFyll - Tester om en streng er fyll-linje. !
+! !
+! Retur: UT_TRUE = linjen er fyll !
+! UT_FALSE = linjen inneholder annen informasjon !
+! !
+!-------------------------------------------------------------!
+*/
+static short LB_TestFyll(const char *pszTx)
+{
+ for (; *pszTx; ++pszTx) {
+ if (!UT_IsSpace(*pszTx) && *pszTx != '!') return (UT_FALSE);
+ }
+
+ return (UT_TRUE);
+}
+
+
+/*
+AR/TU:2008-09-11
+CH LC_ErstattReferanse Erstatt referanse
+CD ==========================================================================
+CD Formål:
+CD Erstatt referanse i alle grupper i gitt fil.
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Fil som skal behandles
+CD long lGmlSnr i Gruppe som skal byttes ut
+CD long lNyttSnr i Ny gruppe
+CD Verdien 0 fører til gammelt serienummer
+CD fjernes uten at det legges inn noe nytt.
+CD bool bSammeRetning i Gruppene er digitalisert i samme retning
+CD
+CD Bruk:
+CD sStatus = LC_ErstattReferanse(pFil, lGmlSnr, lNyttSnr, bSammeRetning);
+==========================================================================
+*/
+SK_EntPnt_FYBA void LC_ErstattReferanse (LC_FILADM *pFil,long lGmlSnr,long lNyttSnr, bool bSammeRetning)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_BGR BgrGml,Bgr;
+ long lAntRef;
+ short sGiLin,sRefPos;
+ long *plRefArray,*plRef,l;
+ bool bEndret;
+
+
+ // Husk gruppen
+ BgrGml = Sys.GrId;
+
+
+ lGmlSnr = labs(lGmlSnr);
+ lNyttSnr = labs(lNyttSnr);
+
+
+ LC_InitNextBgr(&Bgr);
+ Bgr.pFil = pFil;
+ while (LC_NextBgr(&Bgr,LC_FRAMGR))
+ {
+ if (Bgr.pFil == pFil)
+ {
+ LC_GetGrParaBgr(&Bgr,&ngi,&nko,&info);
+ if ((info&GI_REF) != 0)
+ {
+ // Gruppen er på rett fil og har referanser, Bytt serienummer
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ lAntRef = LC_InqAntRef();
+ plRefArray = (long *) UT_MALLOC(lAntRef * sizeof(long));
+ sGiLin = 2;
+ sRefPos = 0;
+ LC_GetRef(plRefArray,lAntRef,&sGiLin,&sRefPos);
+
+ bEndret = false;
+ plRef = plRefArray;
+ for (l=0; l<lAntRef; ++l,++plRef)
+ {
+ if (labs(*plRef) == lGmlSnr)
+ {
+ // Skal bytte serienummer
+ if (lNyttSnr != 0)
+ {
+ if (*plRef > 0 && bSammeRetning)
+ {
+ *plRef = lNyttSnr;
+ }
+ else if (*plRef > 0 && !bSammeRetning)
+ {
+ *plRef = -lNyttSnr;
+ }
+ else if (*plRef < 0 && bSammeRetning)
+ {
+ *plRef = -lNyttSnr;
+ }
+ else if (*plRef < 0 && !bSammeRetning)
+ {
+ *plRef = lNyttSnr;
+ }
+ }
+
+ // Skal fjerne serienummer
+ else
+ {
+ memmove(plRef, plRef+1, (lAntRef-l-1) * sizeof(long));
+
+ --l;
+ --plRef;
+ --lAntRef;
+ }
+
+ bEndret = true;
+ }
+ }
+
+ if (bEndret) {
+ LC_PutRef(plRefArray,lAntRef);
+ LC_WxGr(SKRIV_OPTIMALT);
+ }
+ UT_FREE(plRefArray);
+ }
+ }
+ }
+
+ // ========= Leser inn opprinnelig gruppe
+ LC_RxGr(&BgrGml,LES_OPTIMALT,&ngi,&nko,&info);
+}
diff --git a/src/FYBA/FYLD.cpp b/src/FYBA/FYLD.cpp
new file mode 100644
index 0000000..57eacfd
--- /dev/null
+++ b/src/FYBA/FYLD.cpp
@@ -0,0 +1,111 @@
+/* === 920413 ============================================================= */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fyld.c */
+/* Innhold: Lagring og henting av indekstabeller */
+/* ======================================================================== */
+
+#include "stdafx.h"
+
+#include <stdlib.h>
+
+
+
+
+/* Globale strukturer for fyba */
+extern LC_SYSTEMADM Sys;
+
+
+
+/*
+AR:2004-05-04
+CH LC_DelIdx Sletter indeksfilene
+CD ==========================================================================
+CD Formål:
+CD Sletter indeksfilene for gitt SOSI-fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char *szSosFil i SOSI-filnavn
+CD
+CD Bruk:
+CD LC_DelIdx(szSosFil);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_DelIdx(char *szSosFil)
+{
+ char fil[_MAX_PATH],sdir[_MAX_PATH];
+ char drive1[_MAX_DRIVE],dir1[_MAX_DIR],fname1[_MAX_FNAME],ext1[_MAX_EXT];
+ char drive2[_MAX_DRIVE],dir2[_MAX_DIR],fname2[_MAX_FNAME],ext2[_MAX_EXT];
+
+
+ // Bygg opp fullstendig filnavn
+ UT_FullPath(fil,szSosFil,_MAX_PATH);
+
+ // Splitt filnavnet
+ UT_splitpath(fil,drive1,dir1,fname1,ext1);
+
+ // Lag subdirectory navn
+ if ( *Sys.szIdxPath != 0) {
+ // Gitt sti for indeksfilene
+ UT_splitpath(Sys.szIdxPath,drive2,dir2,fname2,ext2);
+ UT_makepath(sdir,drive2,dir2,fname1,"");
+ } else {
+ // Ikke gitt sti.
+ UT_makepath(sdir,drive1,dir1,fname1,"");
+ }
+
+ /* Lag sti til filer på sub-directory */
+ UT_splitpath(sdir,drive2,dir2,fname2,ext2);
+ UT_StrCat(dir2,fname1,_MAX_DIR);
+ UT_StrCat(dir2,UT_STR_SLASH,_MAX_DIR);
+
+ //
+ // Fjern indeks filene
+ //
+
+ // Administrasjonstabeller
+ UT_makepath(fil,drive2,dir2,"Adm",".Idx");
+ UT_DeleteFile(fil);
+ UT_makepath(fil,drive2,dir2,"admin",".idx"); /* FYBA - C */
+ UT_DeleteFile(fil);
+
+ // Ringbuffer
+ UT_makepath(fil,drive2,dir2,"Rb",".Idx");
+ UT_DeleteFile(fil);
+
+ // Inf
+ UT_makepath(fil,drive2,dir2,"Inf",".Idx"); /* FYBA - D */
+ UT_DeleteFile(fil);
+ UT_makepath(fil,drive2,dir2,"info",".idx"); /* FYBA - C */
+ UT_DeleteFile(fil);
+
+ // Gruppetabell
+ UT_makepath(fil,drive2,dir2,"Grt",".Idx");
+ UT_DeleteFile(fil);
+ UT_makepath(fil,drive2,dir2,"grtab",".idx"); /* FYBA - C */
+ UT_DeleteFile(fil);
+
+ // Serienummer-tabell */
+ UT_makepath(fil,drive2,dir2,"Snr",".Idx");
+ UT_DeleteFile(fil);
+
+ // Brukt-tabell
+ UT_makepath(fil,drive2,dir2,"Bt",".Idx");
+ UT_DeleteFile(fil);
+ UT_makepath(fil,drive2,dir2,"btab",".idx"); /* FYBA - C */
+ UT_DeleteFile(fil);
+
+ // Geografisk søketabell
+ UT_makepath(fil,drive2,dir2,"Geo",".Idx");
+ UT_DeleteFile(fil);
+
+ // Flate geografisk søketabell
+ UT_makepath(fil,drive2,dir2,"flate",".idx"); /* FYBA - C */
+ UT_DeleteFile(fil);
+
+ //
+ // Fjern subdirectory
+ //
+ UT_DeleteDir(sdir);
+}
diff --git a/src/FYBA/FYLE.cpp b/src/FYBA/FYLE.cpp
new file mode 100644
index 0000000..8f0add6
--- /dev/null
+++ b/src/FYBA/FYLE.cpp
@@ -0,0 +1,494 @@
+#include "stdafx.h"
+#include "fyba_strings.h"
+
+/*
+AR-940110
+CH LC_StrError Feilmeldingstekst
+CD ==========================================================================
+CD Formål:
+CD Henter feilmeldingstekst og nivå for et feilmeldingsnummer.
+CD Strengen legges i en egen feilmeldingsstruktur for feil-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "feil-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short feil_nr i Feilmeldingsnummer
+CD char **feilmelding u Peker til feilmeldingstekst avslutta med '\0'.
+CD short *strategi r Feilnivå (0-4)
+CD 0 = Ikke i bruk. (Utkoblet, testmeldinger mm.)
+CD 1 = Lite alvorlig. Vises kort.
+CD 2 = Normal feilmelding. Vises ca. 1 sekund.
+CD 3 = Alvorlig. Krev tastetrykk for å fortsette.
+CD 4 = Svært alvorlig. Programmet bør avbrytes.
+CD
+CD Bruk:
+CD strategi = LC_StrError(ckap,feil_nr,&feilmeldingspeker);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_StrError(short feil_nr,char **feilmelding)
+{
+#define MAX_FEIL_LEN 200
+ static char feil[MAX_FEIL_LEN]; /* Feilmeldings-streng */
+ short strategi = 0;
+
+
+ switch(feil_nr) { /* Finn riktig melding */
+/* --------------------- LO --------------------------- */
+ case 1:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_BASE_UNKNOWN_TYPE,MAX_FEIL_LEN);
+ break;
+ case 2:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_BASE_TOO_MANY_GROUPS,MAX_FEIL_LEN);
+ break;
+ case 3:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_FILE_NOT_FOUND,MAX_FEIL_LEN);
+ break;
+ case 4:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_BASE_FYBA_NOT_INITD,MAX_FEIL_LEN);
+ break;
+ case 5:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_BASE_NOT_OPEN,MAX_FEIL_LEN);
+ break;
+ case 6:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_FILE_OPEN_FAILED,MAX_FEIL_LEN);
+ break;
+ case 7:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_FILE_OMRAADE_MISSING,MAX_FEIL_LEN);
+ break;
+ case 8:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_FILE_MIN_NOE_MISSING,MAX_FEIL_LEN);
+ break;
+ case 9:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_FILE_MAX_NOE_MISSING,MAX_FEIL_LEN);
+ break;
+ case 10:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_BASE_INDEX_ABORTED,MAX_FEIL_LEN);
+ break;
+ case 13:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_FILE_PERM_DENIED,MAX_FEIL_LEN);
+ break;
+ case 101:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_BASE_OPEN_FAILED,MAX_FEIL_LEN);
+ break;
+ case 102:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_FILE_NEW_HEADER,MAX_FEIL_LEN);
+ break;
+ case 103:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_FILE_NOT_SOSI,MAX_FEIL_LEN);
+ break;
+ case 104:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_FILE_OMRAADE_INVALID,MAX_FEIL_LEN);
+ break;
+
+ case 105:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_SAVE_INVALID_FILEPTR,MAX_FEIL_LEN);
+ break;
+
+ case 106:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_OPEN_BASE_IS_KLADDE,MAX_FEIL_LEN);
+ break;
+
+/* --------------------- HO --------------------------- */
+ case 12:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_FILE_READ_ERROR_HODE,MAX_FEIL_LEN);
+ break;
+ case 14:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_FILE_TRANSPAR_MISSING,MAX_FEIL_LEN);
+ break;
+ case 15:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_FILE_KOORDSYS_MISSING,MAX_FEIL_LEN);
+ break;
+ case 16:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_FILE_ORIGO_MISSING,MAX_FEIL_LEN);
+ break;
+ case 17:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_FILE_ENHET_MISSING,MAX_FEIL_LEN);
+ break;
+/* --------------------- LN --------------------------- */
+ case 21:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_NAME_TABLE_FULL,MAX_FEIL_LEN);
+ break;
+
+ case 22:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_GROUP_NAME,MAX_FEIL_LEN);
+ break;
+
+/* --------------------- LB --------------------------- */
+ case 31:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_FILE_NO_CURRENT_GROUP,MAX_FEIL_LEN);
+ break;
+ case 32:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_OPEN_INVALID_EXTERN,MAX_FEIL_LEN);
+ break;
+ case 33:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_SAVE_INVALID_EXTERN,MAX_FEIL_LEN);
+ break;
+ case 34:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_SAVE_NO_WRITE_ACCESS,MAX_FEIL_LEN);
+ break;
+ case 35:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_GROUP_DELETED,MAX_FEIL_LEN);
+ break;
+ case 36:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_FILE_INVALID_GROUP_NR,MAX_FEIL_LEN);
+ break;
+ case 37:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_NEW_INVALID_FILE,MAX_FEIL_LEN);
+ break;
+ case 38:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_NEW_NO_WRITE_ACCESS,MAX_FEIL_LEN);
+ break;
+ case 39:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_NEW_TOO_MANY_GROUPS,MAX_FEIL_LEN);
+ break;
+ case 40:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_NEW_INVALID_LINE_GI,MAX_FEIL_LEN);
+ break;
+ case 41:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_NEW_INVALID_LINE_COO,MAX_FEIL_LEN);
+ break;
+ case 42:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_SLUTT_MISSING,MAX_FEIL_LEN);
+ break;
+ case 43:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_READ_ERROR,MAX_FEIL_LEN);
+ break;
+ case 44:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_GROUP_REFERRED_TO,MAX_FEIL_LEN);
+ break;
+ case 47:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_GI_LINE_1,MAX_FEIL_LEN);
+ break;
+ case 48:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_CANT_REMOVE_HEADER,MAX_FEIL_LEN);
+ break;
+ case 49:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_NO_CURRENT_GROUP,MAX_FEIL_LEN);
+ break;
+ case 50:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_DEL_UNKNOWN_FLAG,MAX_FEIL_LEN);
+ break;
+ case 91:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_DEL_NO_WRITE_ACCESS,MAX_FEIL_LEN);
+ break;
+ case 92:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_ERR_FILESIZE_CHANGE,MAX_FEIL_LEN);
+ break;
+ case 93:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_DISK_SOON_FULL,MAX_FEIL_LEN);
+ break;
+ case 94:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_NOT_A_HEADER,MAX_FEIL_LEN);
+ break;
+ case 95:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_DEL_NOT_SEQUENTIAL,MAX_FEIL_LEN);
+ break;
+ case 96:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_NO_CHANGE_HEADERS,MAX_FEIL_LEN);
+ break;
+ case 97:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_CANT_REWRITE_HEADER,MAX_FEIL_LEN);
+ break;
+ case 98:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_SAVE_NOT_A_HEADER,MAX_FEIL_LEN);
+ break;
+ case 99:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_CANT_COPY_COORD,MAX_FEIL_LEN);
+ break;
+ case 100:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_CANT_COPY_COORD_ROOM,MAX_FEIL_LEN);
+ break;
+ case 141:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_ENHET_NOT_SET,MAX_FEIL_LEN);
+ break;
+ case 142:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_CANT_READ_FILE_SIZE,MAX_FEIL_LEN);
+ break;
+ case 143:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_PINFO_LONG_OR_NO_NOE,MAX_FEIL_LEN);
+ break;
+ case 144:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_LOGIC_FAIL,MAX_FEIL_LEN);
+ break;
+ case 145:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_MAX_1_KP_OR_NO_NOE,MAX_FEIL_LEN);
+ break;
+ case 146:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_NO_ROOM_IN_HEADER,MAX_FEIL_LEN);
+ break;
+ case 147:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_GAP,MAX_FEIL_LEN);
+ break;
+ case 148:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_TOO_MANY_COORDINATES,MAX_FEIL_LEN);
+ break;
+ case 149:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_TOO_MANY_GINFO,MAX_FEIL_LEN);
+ break;
+ case 150:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_TOO_MUCH_GINFO,MAX_FEIL_LEN);
+ break;
+ case 161:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_TOO_MUCH_PINFO,MAX_FEIL_LEN);
+ break;
+ case 162:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_CANT_EXTEND_GROUP,MAX_FEIL_LEN);
+ break;
+ case 163:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_READ_NO_WRITE_ACCESS,MAX_FEIL_LEN);
+ case 164:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_READ_LINE_TOO_LONG,MAX_FEIL_LEN);
+ break;
+
+
+/* --------------------- LX --------------------------- */
+ case 51:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_POINT,MAX_FEIL_LEN);
+ break;
+ case 52:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_GINFO,MAX_FEIL_LEN);
+ break;
+ case 53:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_NODE,MAX_FEIL_LEN);
+ break;
+ case 54:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_GROUP_NAME,MAX_FEIL_LEN);
+ break;
+ case 55:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_PINFO_TOO_LONG,MAX_FEIL_LEN);
+ break;
+ case 56:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_REF,MAX_FEIL_LEN);
+ break;
+ case 57:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_CANT_CHANGE_ENHET ,MAX_FEIL_LEN);
+ break;
+ case 58:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_CANT_CHANGE_NGIS_LAG,MAX_FEIL_LEN);
+ break;
+ case 59:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_BUE,MAX_FEIL_LEN);
+ break;
+ case 60:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_CANT_CHANGE_ORIGO_NOE,MAX_FEIL_LEN);
+ break;
+ case 131:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_PROB_TOO_LONG_PINFO,MAX_FEIL_LEN);
+ break;
+ case 132:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_NO_HOEYDE_WITH_NAD,MAX_FEIL_LEN);
+ break;
+ case 133:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_NO_HOEYDE_WITH_NAH,MAX_FEIL_LEN);
+ break;
+ case 134:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_LINE_TOO_LONG,MAX_FEIL_LEN);
+ break;
+
+
+/* --------------------- LS --------------------------- */
+ case 61:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_SERIAL,MAX_FEIL_LEN);
+ break;
+
+/* --------------------- LI --------------------------- */
+ case 71:
+ strategi = 2;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_LINE_NR,MAX_FEIL_LEN);
+ break;
+ case 72:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_GROUP_NR,MAX_FEIL_LEN);
+ break;
+ case 73:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_READING_BUFFER,MAX_FEIL_LEN);
+ break;
+ case 74:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_WRITING_BUFFER,MAX_FEIL_LEN);
+ break;
+ case 75:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_MUST_INIT_INDEX,MAX_FEIL_LEN);
+ break;
+ case 79:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_READING_SEARCHT,MAX_FEIL_LEN);
+ break;
+ case 80:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_WRITING_SEARCHT,MAX_FEIL_LEN);
+ break;
+ case 111:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_READING_GROUPT,MAX_FEIL_LEN);
+ break;
+ case 112:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_WRITING_GROUPT,MAX_FEIL_LEN);
+ break;
+ case 113:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_READING_SERIALT,MAX_FEIL_LEN);
+ break;
+ case 114:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_WRITING_SERIALT,MAX_FEIL_LEN);
+ break;
+ case 115:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_READING_INFOT,MAX_FEIL_LEN);
+ break;
+ case 116:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_WRITING_INFOT,MAX_FEIL_LEN);
+ break;
+ case 117:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_INFOT_FULL,MAX_FEIL_LEN);
+ break;
+ case 118:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_READING_BRUKT,MAX_FEIL_LEN);
+ break;
+ case 119:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_ERR_WRITING_BRUKT,MAX_FEIL_LEN);
+ break;
+ case 120:
+ strategi = 4;
+ UT_StrCopy(feil,FYBA_STRING_NO_BLANKS_FILENAME,MAX_FEIL_LEN);
+ break;
+
+
+/* --------------------- LR --------------------------- */
+
+/* --------------------- LU --------------------------- */
+ case 121:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_TOO_MANY_CHOICES,MAX_FEIL_LEN);
+ break;
+ case 122:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_MISPLACED_CHOICE,MAX_FEIL_LEN);
+ break;
+ case 123:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_GROUP_CHOICE_MISSING,MAX_FEIL_LEN);
+ break;
+ case 124:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_INVALID_CHOICE,MAX_FEIL_LEN);
+ break;
+ case 125:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_NO_COMPLEX_CHOICE,MAX_FEIL_LEN);
+ break;
+ case 126:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_GAP_IN_LEVEL,MAX_FEIL_LEN);
+ break;
+ case 127:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_TOO_MANY_PRIORITIES,MAX_FEIL_LEN);
+ break;
+ case 128:
+ strategi = 3;
+ UT_StrCopy(feil,FYBA_STRING_DUPLICATE_DEFINITION,MAX_FEIL_LEN);
+ break;
+
+/* --------- Standard melding ved ukjent nr. ------------------- */
+ default:
+ strategi = 3;
+ UT_SNPRINTF(feil,MAX_FEIL_LEN,FYBA_STRING_UNKNOWN_ERROR,feil_nr);
+ break;
+ }
+
+ *feilmelding = feil;
+
+ return strategi;
+}
diff --git a/src/FYBA/FYLH.cpp b/src/FYBA/FYLH.cpp
new file mode 100644
index 0000000..93fafd5
--- /dev/null
+++ b/src/FYBA/FYLH.cpp
@@ -0,0 +1,1035 @@
+/*
+CH FYLH AR-900503 BIBLIOTEK
+CD =================================================================
+CD
+CD Eier.......: STATENS KARTVERK / FYSAK-prosjektet
+CD Ansvarlig..: Georg Langerak / Andreas Røstad
+CD
+CD Rutiner for å handtere hodet på SOSI-filer når dette ligger
+CD som ginfo i RB.
+CD ==============================================================
+*/
+
+#include "stdafx.h"
+
+#include <math.h>
+#include <time.h>
+#include <ctype.h>
+#include <fcntl.h>
+
+/* Globale variabler */
+extern LC_SYSTEMADM Sys;
+
+
+
+/*
+AR:2000-10-07
+CH LC_PutTransEx Legger inn ..TRANSPAR i hodet
+CD ==========================================================================
+CD Formål:
+CD Legger inn innholdet under ..TRANSPAR i ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode versjon 3.x.
+CD
+CD Må velge mellom KOORDSYS, TRANSSYS eller GEOSYS.
+CD Kun en av disse kan benyttes i filhodet.
+CD KOORDSYS er den mest vanlige måte å definere referansesystem.
+CD
+CD GEOKOORD skal benyttes for GEOSYS og for TRANSSYS
+CD
+CD Må velge mellom VERT-DATUM eller VERT-INT.
+CD VERT-DATUM er den mest vanlige beskrivelsesmåten.
+CD
+CD Følgende kompaktifisering brukes:
+CD ..TRANSPAR
+CD ...KOORDSYS <SYSKODE> <DATUM> <PROJEK>
+CD ...TRANSSYS <TILSYS> <KONSTA1> <KONSTB1> <KONSTA2> <KONSTB2> <KONSTC1> <KONSTC2>
+CD ...GEOSYS <GEO-DATUM> <GEO-PROJ> <GEO-SONE>
+CD ...GEOKOORD <GEOKOORD>
+CD ...ORIGO-NØ <ORIGO-N> <ORIGO-Ø>
+CD ...ENHET <ENHET>
+CD ...ENHET-H <ENHET-H>
+CD ...ENHET-D <ENHET-D>
+CD ...VERT-DATUM <HØYDE-REF> <DYBDE-REF> <FRISEIL-REF> <HØYDE-TYPE>
+CD ...VERT-INT <H-REF-INT> <D-REF-INT> <F-REF-INT>
+CD ...VERT-DELTA <V-DELTA-MIN> <V-DELTA-MAX>
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD unsigned short usMaske i Maske som styrer hvilke deler av TRANSPAR som brukt
+CD Følgende konstanter er definert:
+CD LC_TR_KOORDSYS - Koordsys
+CD LC_TR_TRANSSYS - Transsys
+CD LC_TR_GEOSYS - Geosys
+CD LC_TR_GEOKOORD - Geokoord
+CD LC_TR_ORIGO - Origo-nø
+CD LC_TR_ENHET - Enhet
+CD LC_TR_ENHETH - Enhet-h
+CD LC_TR_ENHETD - Enhet-d
+CD LC_TR_VERTDATUM - Vert-datum
+CD LC_TR_VERTINT - Vert-int
+CD LC_TR_VERTDELTA - Vert-delta
+CD
+CD LC_TRANSPAR * pTrans i Peker til struktur med ..TRANSPAR informasjonen.
+CD short ngi r Antall GINFO-linjer etter oppdateringen.
+CD
+CD Bruk:
+CD LC_TRANSPAR Trans;
+CD unsigned short usMaske = LC_TR_KOORDSYS | LC_TR_ORIGO | LC_TR_ENHET;
+CD Trans.sKoordsys = 32;
+CD Trans.dOrigoAust = 0.0;
+CD Trans.dOrigoNord = 0.0;
+CD Trans.dEnhet = 1.0;
+CD ngi = LC_PutTransEx(usMaske,&Trans);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutTransEx(unsigned short usMaske, LC_TRANSPAR * pTrans)
+{
+ short i,lin,ngi;
+ long nko;
+ unsigned short info;
+ char *cp = NULL;
+ char szGiLin[LC_MAX_SOSI_LINJE_LEN];
+
+
+ /* Ingen aktuell gruppe */
+ if (Sys.GrId.lNr == INGEN_GRUPPE) {
+ LC_Error(49,"(LC_PutTrans)","");
+ return Sys.pGrInfo->ngi;
+ }
+
+ /* Aktuell gruppe er ikke .HODE */
+ if (Sys.pGrInfo->gnavn != L_HODE) {
+ LC_Error(94,"(LC_PutTrans)","");
+ return Sys.pGrInfo->ngi;
+ }
+
+
+ /* ----- Fjerner gammel transpar ----- */
+ LC_GetGrPara(&ngi,&nko,&info);
+ lin=2;
+ if (LC_GetGP("..TRANSPAR",&lin,ngi) != NULL) {
+ i = lin;
+ do {
+ i++;
+ if (i <= ngi) cp = LC_GetGi(i);
+ } while ( i <= ngi && cp[2] == '.' );
+ /* i peker nå til første linje etter hele ..TRANSPAR med undernivåer */
+
+ LC_DelGiL(lin,(short)(i-lin));
+ }
+
+ /* ----- Legger inn ny transpar ----- */
+ LC_PutGi(LC_AppGiL(),"..TRANSPAR");
+
+ /* Koordsys */
+ if ((usMaske & LC_TR_KOORDSYS) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...KOORDSYS %hd %s %s",pTrans->sKoordsys,pTrans->szKoordsysDatum,pTrans->szKoordsysProjek);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Transsys */
+ if ((usMaske & LC_TR_TRANSSYS) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...TRANSSYS %hd %f %f %f %f %f %f", pTrans->sTranssysTilsys,
+ pTrans->dTranssysKonstA1, pTrans->dTranssysKonstB1,
+ pTrans->dTranssysKonstA2, pTrans->dTranssysKonstB2,
+ pTrans->dTranssysKonstC1, pTrans->dTranssysKonstC2);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Geosys */
+ if ((usMaske & LC_TR_GEOSYS) != 0) {
+ if (pTrans->sGeosysProj != LC_TR_GEOSYS_INGEN_VERDI)
+ {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...GEOSYS %hd %hd %hd", pTrans->sGeosysDatum,
+ pTrans->sGeosysProj, pTrans->sGeosysSone);
+ }
+ else
+ {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...GEOSYS %hd", pTrans->sGeosysDatum);
+ }
+
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Geokoord */
+ if ((usMaske & LC_TR_GEOKOORD) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...GEOKOORD %hd", pTrans->sGeoKoord);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Origo */
+ if ((usMaske & LC_TR_ORIGO) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...ORIGO-NØ %.0f %.0f", pTrans->Origo.dNord, pTrans->Origo.dAust);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Enhet */
+ if ((usMaske & LC_TR_ENHET) != 0) {
+ LC_PutGi(LC_AppGiL(),LB_FormaterEnhet(szGiLin,LC_MAX_SOSI_LINJE_LEN, "...ENHET", pTrans->dEnhet));
+ }
+
+ /* Enhet-h */
+ if ((usMaske & LC_TR_ENHETH) != 0) {
+ /*
+ * Hvis enhet og enhet_h er like
+ * skal det ikke legges inn ENHET-H
+ */
+ if (fabs(pTrans->dEnhet-pTrans->dEnhet_h) > 0.0000001) {
+ LC_PutGi(LC_AppGiL(),LB_FormaterEnhet(szGiLin,LC_MAX_SOSI_LINJE_LEN,"...ENHET-H",pTrans->dEnhet_h));
+ }
+ }
+
+ /* Enhet-d */
+ if ((usMaske & LC_TR_ENHETD) != 0) {
+ /*
+ * Hvis enhet og enhet_d er like
+ * skal det ikke legges inn ENHET-D
+ */
+ if (fabs(pTrans->dEnhet-pTrans->dEnhet_d) > 0.0000001) {
+ LC_PutGi(LC_AppGiL(),LB_FormaterEnhet(szGiLin,LC_MAX_SOSI_LINJE_LEN,"...ENHET-D",pTrans->dEnhet_d));
+ }
+ }
+
+ /* Vert-datum */
+ if ((usMaske & LC_TR_VERTDATUM) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...VERT-DATUM %s %s %s %s", pTrans->szVertdatHref,
+ pTrans->szVertdatDref, pTrans->szVertdatFref, pTrans->szVertdatHtyp);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Vert-int */
+ if ((usMaske & LC_TR_VERTINT) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...VERT-INT %hd %hd %hd", pTrans->sVertintHref,
+ pTrans->sVertintDref, pTrans->sVertintFref);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ /* Vert-delta */
+ if ((usMaske & LC_TR_VERTDELTA) != 0) {
+ UT_SNPRINTF(szGiLin, LC_MAX_SOSI_LINJE_LEN, "...VERT-DELTA %hd %hd", pTrans->sVdeltaMin, pTrans->sVdeltaMax);
+ LC_PutGi(LC_AppGiL(),szGiLin);
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+AR-910920
+CH LC_PutTrans Legger inn ..TRANSPAR i hodet
+CD ==========================================================================
+CD Formål:
+CD Legger inn transformasjonsparametrene i ginfo i aktuell gruppe.
+CD Forutsetter at aktuell gruppe er et SOSI-filhode versjon 3.x.
+CD
+CD OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+CD For nye programmer bør LC_PutTransEx benyttes. LC_PutTransEx er
+CD kompatibel med nye versjoner av SOSI.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short koosys i Koordinatsystem
+CD double origo_a i Origo øst
+CD double origo_n i Origo nord
+CD double enhet i Enhet
+CD double enhet_h i Enhet-H
+CD double enhet_d i Enhet-D
+CD short ngi r Antall GINFO-linjer etter oppdateringen.
+CD
+CD Bruk:
+CD ngi = LC_PutTrans(koosys,origo_a,origo_n,enhet,enhet_h,enhet_d);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutTrans(short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d)
+{
+ short i,ngi,linje_enhet;
+ char c[80];
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ UT_SNPRINTF(c,80,"%d",koosys);
+ ngi = LC_PutGP("...KOORDSYS",c,&i);
+ UT_SNPRINTF(c,80," %.0f %.0f",origo_n,origo_a);
+ ngi = LC_PutGP("...ORIGO-NØ",c,&i);
+ linje_enhet = 2;
+ LC_GetGP("...ENHET",&linje_enhet,ngi);
+ LC_PutGi(linje_enhet,LB_FormaterEnhet(c,80,"...ENHET",enhet));
+
+ /*
+ * Hvis enhet og enhet_h er like
+ * skal det ikke legges inn ENHET-H,
+ * eventuell gammel linje fjernes.
+ */
+
+ if (fabs(enhet-enhet_h) < 0.0000001) {
+ i = 2;
+ if (LC_GetGP("...ENHET-H",&i,ngi) != NULL) {
+ LC_DelGiL(i,1);
+ }
+
+ } else {
+
+ i = 2;
+ if (LC_GetGP("...ENHET-H",&i,ngi) == NULL) {
+ i = linje_enhet + 1;
+ ngi = LC_InsGiL(i,1); /* Ikke funnet, tildel ny linje */
+ }
+ LC_PutGi(i,LB_FormaterEnhet(c,80,"...ENHET-H",enhet_h));
+ }
+
+ /*
+ * Hvis enhet og enhet_d er like
+ * skal det ikke legges inn ENHET-D,
+ * eventuell gammel linje fjernes.
+ */
+ if (fabs(enhet-enhet_d) < 0.000001) {
+ i = 2;
+ if (LC_GetGP("...ENHET-D",&i,ngi) != NULL) {
+ LC_DelGiL(i,1);
+ }
+
+ } else {
+ i = 2;
+ if (LC_GetGP("...ENHET-D",&i,ngi) == NULL) {
+ i = linje_enhet + 1;
+ ngi = LC_InsGiL(i,1); /* Ikke funnet, tildel ny linje */
+ }
+ LC_PutGi(i,LB_FormaterEnhet(c,80,"...ENHET-D",enhet_d));
+
+ }
+
+ } else{ /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_PutTrans)","");
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutTrans)","");
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+AR:2000-10-07
+CH LC_GetTransEx Henter ..TRANSPAR fra hodet
+CD ==========================================================================
+CD Formål:
+CD Henter ut innholdet under ..TRANSPAR fra ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD Må velge mellom KOORDSYS, TRANSSYS eller GEOSYS. Kun en av disse kan benyttes i filhodet.
+CD KOORDSYS er den mest vanlige måte å definere referansesystem.
+CD
+CD GEOKOORD skal benyttes for GEOSYS og for TRANSSYS
+CD
+CD Må velge mellom VERT-DATUM eller VERT-INT.
+CD VERT-DATUM er den mest vanlige beskrivelsesmåten.
+CD
+
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD unsigned short *pusMaske iu [Inn] Styrer hvilke deler av TRANSPAR som skal hentes
+CD [Ut] Viser hvilke deler av TRANSPAR som er funnet/hentet.
+CD Følgende konstanter er definert:
+CD LC_TR_ALLT - Alle deler av ..TRANSPAR hentes
+CD LC_TR_KOORDSYS - Koordsys
+CD LC_TR_TRANSSYS - Transsys
+CD LC_TR_GEOSYS - Geosys
+CD LC_TR_GEOKOORD - Geokoord
+CD LC_TR_ORIGO - Origo-nø
+CD LC_TR_ENHET - Enhet
+CD LC_TR_ENHETH - Enhet-h
+CD LC_TR_ENHETD - Enhet-d
+CD LC_TR_VERTDATUM - Vert-datum
+CD LC_TR_VERTINT - Vert-int
+CD LC_TR_VERTDELTA - Vert-delta
+CD
+CD LC_TRANSPAR * pTrans iu Peker til struktur som skal motta ..TRANSPAR informasjonen.
+CD short sStatus r Status: UT_TRUE=OK, UT_FALSE=feil (ikke funnet).
+CD
+CD Bruk:
+CD unsigned short usMaske = LC_TR_ALLT;
+CD LC_TRANSPAR Trans;
+CD ist = LC_GetTransEx(&usMaske,&Trans);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetTransEx(unsigned short *pusMaske, LC_TRANSPAR * pTrans)
+{
+ short lin,ngi,itxi;
+ long nko;
+ unsigned short us;
+ char *cp;
+ short ist = UT_TRUE;
+ unsigned short usMaskeInn = *pusMaske;
+
+
+ /* Nullstiller pTrans */
+ memset(pTrans,0,sizeof(LC_TRANSPAR));
+
+ /* Nullstiller masken */
+ *pusMaske = 0;
+
+ LC_GetGrPara(&ngi,&nko,&us);
+
+
+ /* ----- Div. kontroller ----- */
+
+ /* Ingen aktuell gruppe */
+ if (Sys.GrId.lNr == INGEN_GRUPPE) {
+ LC_Error(49,"(LC_GetTransEx)","");
+ return UT_FALSE;
+ }
+ /* Gruppen er ikke filhode */
+ if (Sys.pGrInfo->gnavn != L_HODE) {
+ LC_Error(94,"(LC_GetTransEx)","");
+ return UT_FALSE;
+ }
+ /* Transpar */
+ lin=2;
+ if (LC_GetGP("..TRANSPAR",&lin,ngi) == NULL) {
+ LC_Error(14,"(LC_GetTransEx)","");
+ return UT_FALSE;
+ }
+
+
+ /* ----- Henter verdier ----- */
+
+ /* Koordsys */
+ if ((usMaskeInn & LC_TR_KOORDSYS) != 0) {
+ lin = 2;
+ cp = LC_GetGP("...KOORDSYS",&lin,ngi);
+ if (cp == NULL) {
+ lin=2;
+ cp = LC_GetGP("..KOORDSYS",&lin,ngi);
+ }
+ if (cp != NULL) {
+ *pusMaske |= LC_TR_KOORDSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sKoordsys);
+ UT_StrToken(cp,itxi,&itxi,36,pTrans->szKoordsysDatum);
+ UT_StrToken(cp,itxi,&itxi,36,pTrans->szKoordsysProjek);
+ }
+ }
+
+ /* Transsys */
+ if ((usMaskeInn & LC_TR_TRANSSYS) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...TRANSSYS",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_TRANSSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sTranssysTilsys);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstA1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstB1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstA2);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstB2);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstC1);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->dTranssysKonstC2);
+ }
+ }
+
+ /* Geosys */
+ if ((usMaskeInn & LC_TR_GEOSYS) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...GEOSYS",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_GEOSYS;
+ UT_StrShort(cp,0,&itxi,&pTrans->sGeosysDatum);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sGeosysProj);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sGeosysSone);
+ }
+ }
+
+ /* Geokoord */
+ if ((usMaskeInn & LC_TR_GEOKOORD) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...GEOKOORD",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_GEOKOORD;
+ UT_StrShort(cp,0,&itxi,&pTrans->sGeoKoord);
+ }
+ }
+
+ /* Origo */
+ if ((usMaskeInn & LC_TR_ORIGO) != 0) {
+ //pTrans->dOrigoAust = 0.0;
+ //pTrans->dOrigoNord = 0.0;
+ lin = 2;
+ if ((cp = LC_GetGP("...ORIGO-NØ",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_ORIGO;
+ UT_StrDbl(cp,0,&itxi,'.',&pTrans->Origo.dNord);
+ UT_StrDbl(cp,itxi,&itxi,'.',&pTrans->Origo.dAust);
+ }
+ }
+
+ /* Enhet */
+ if ((usMaskeInn & LC_TR_ENHET) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...ENHET",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_ENHET;
+ pTrans->dEnhet = strtod(cp,&cp);
+ }
+ }
+
+ /* Enhet-h */
+ if ((usMaskeInn & LC_TR_ENHETH) != 0) {
+ lin=2;
+ if ((cp = LC_GetGP("...ENHET-H",&lin,ngi)) == NULL) {
+ pTrans->dEnhet_h = pTrans->dEnhet;
+ } else {
+ *pusMaske |= LC_TR_ENHETH;
+ pTrans->dEnhet_h = strtod(cp,&cp);
+ }
+ }
+
+ /* Enhet-d */
+ if ((usMaskeInn & LC_TR_ENHETD) != 0) {
+ lin=2;
+ if ((cp = LC_GetGP("...ENHET-D",&lin,ngi)) == NULL) {
+ pTrans->dEnhet_d = pTrans->dEnhet;
+ } else {
+ *pusMaske |= LC_TR_ENHETD;
+ pTrans->dEnhet_d = strtod(cp,&cp);
+ }
+ }
+
+ /* Vert-datum */
+ if ((usMaskeInn & LC_TR_VERTDATUM) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...VERT-DATUM",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_VERTDATUM;
+ UT_StrToken(cp,0,&itxi,7,pTrans->szVertdatHref);
+ UT_StrToken(cp,itxi,&itxi,6,pTrans->szVertdatDref);
+ UT_StrToken(cp,itxi,&itxi,6,pTrans->szVertdatFref);
+ UT_StrToken(cp,itxi,&itxi,2,pTrans->szVertdatHtyp);
+ }
+ }
+
+ /* Vert-int */
+ if ((usMaskeInn & LC_TR_VERTINT) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...VERT-INT",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_VERTINT;
+ UT_StrShort(cp,0,&itxi,&pTrans->sVertintHref);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVertintDref);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVertintFref);
+ }
+ }
+
+ /* Vert-delta */
+ if ((usMaskeInn & LC_TR_VERTDELTA) != 0) {
+ lin = 2;
+ if ((cp = LC_GetGP("...VERT-DELTA",&lin,ngi)) != NULL) {
+ *pusMaske |= LC_TR_VERTDELTA;
+ UT_StrShort(cp,0,&itxi,&pTrans->sVdeltaMin);
+ UT_StrShort(cp,itxi,&itxi,&pTrans->sVdeltaMax);
+ }
+ }
+
+
+ /* ----- Div. sluttkontroll ----- */
+
+ /* Kontroller at det er funnet Koordsys, Transsys eller Geosys */
+ if ((usMaskeInn & LC_TR_KOORDSYS) != 0 ||
+ (usMaskeInn & LC_TR_TRANSSYS) != 0 ||
+ (usMaskeInn & LC_TR_GEOSYS) != 0 ) {
+ if ((*pusMaske & LC_TR_KOORDSYS) == 0 &&
+ (*pusMaske & LC_TR_TRANSSYS) == 0 &&
+ (*pusMaske & LC_TR_GEOSYS) == 0 ) {
+ /* Ikke noe koordinatsystem funnet */
+ LC_Error(15,"(LC_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+ }
+
+ /* Kontroller at det er funnet Origo */
+ if ((usMaskeInn & LC_TR_ORIGO) != 0 &&
+ (*pusMaske & LC_TR_ORIGO) == 0 ) {
+ /* Origo mangler */
+ LC_Error(16,"(LC_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+
+ /* Kontroller at det er funnet Enhet */
+ if ((usMaskeInn & LC_TR_ENHET) != 0 &&
+ (*pusMaske & LC_TR_ENHET) == 0 ) {
+ /* Enhet mangler */
+ LC_Error(17,"(LC_GetTransEx)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+
+/*
+GL-880427
+AR-910920
+CH LC_GetTrans Finner ..TRANSPAR i hodet
+CD ==========================================================================
+CD Formål:
+CD Henter ut transformasjonsparametrene fra ginfo i aktuell gruppe.
+CD Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD OBS! Denne rutinen opprettholdes bare for bakoverkompatibilitet.
+CD For nye programmer bør LC_GetTransEx benyttes. LC_GetTransEx er
+CD kompatibel med nye versjoner av SOSI.
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short *koosys u Koordinatsystem
+CD double *origo_a u Origo øst
+CD double *origo_n u Origo nord
+CD double *enhet u Enhet
+CD double *enhet_h u ...ENHET-H
+CD double *enhet_d u ...ENHET-D
+CD short ist r status: UT_TRUE=OK, UT_FALSE=feil (navn er ikke funnet)
+CD
+CD Bruk:
+CD ist = LC_GetTrans(&koosys,&origo_a,&origo_n,&enhet,&enhet_h,&enhet_d);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetTrans(short *koosys,double *origo_a,double *origo_n,double *enhet,
+ double *enhet_h,double *enhet_d)
+{
+
+ short lin,ngi;
+ long nko;
+ unsigned short us;
+ char *cp;
+ short ist = UT_TRUE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ LC_GetGrPara(&ngi,&nko,&us);
+
+ lin=2;
+ if (LC_GetGP("..TRANSPAR",&lin,ngi) == NULL) { /* Transpar */
+ LC_Error(14,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ } else{
+ *koosys=0; /* Koordsys */
+ lin=2;
+ cp = LC_GetGP("...KOORDSYS",&lin,ngi);
+ if (cp == NULL){
+ lin=2;
+ cp = LC_GetGP("..KOORDSYS",&lin,ngi);
+ }
+ if (cp == NULL){
+ LC_Error(15,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ } else{
+ *koosys = atoi(cp);
+ *origo_a = 0.0; /* Origo */
+ *origo_n = 0.0;
+ lin = 2;
+ cp = LC_GetGP("...ORIGO-NØ",&lin,ngi);
+ if (cp == NULL) {
+ LC_Error(16,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ } else{
+ *origo_n=strtod(cp,&cp);
+ *origo_a=strtod(cp,&cp);
+
+ *enhet = 1.0; /* Enhet */
+ lin = 2;
+ cp = LC_GetGP("...ENHET",&lin,ngi);
+ if (cp == NULL){
+ LC_Error(17,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ } else{
+ *enhet = strtod(cp,&cp);
+ }
+ lin=2;
+ cp = LC_GetGP("...ENHET-H",&lin,ngi);
+ if (cp == NULL){
+ *enhet_h = *enhet;
+ } else {
+ *enhet_h = strtod(cp,&cp);
+ }
+ lin=2;
+ cp = LC_GetGP("...ENHET-D",&lin,ngi);
+ if (cp == NULL){
+ *enhet_d = *enhet;
+ } else{
+ *enhet_d = strtod(cp,&cp);
+ }
+ }
+ }
+ }
+
+ } else{ /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_GetTrans)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+/*
+AR-920401
+CH LC_GetTegnsett Finner tegnsett
+CD ==========================================================================
+CD Formål:
+CD Finne tegnsett i ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short *psTegnsett u Tegnsett, konstanter definert:
+CD TS_DOSN8 = DOS norsk 8-bits(standardverdi)
+CD TS_ND7 = Norsk Data 7-bits
+CD TS_ISO8859 = ISO8859-10 norsk/samisk
+CD TS_DECM8 = DEC multinasjonal 8-bits
+CD TS_DECN7 = DEC norsk 7-bits
+CD short sStatus r Status: UT_TRUE = Funnet
+CD UT_FALSE = Ikke funnet
+CD
+CD Bruk:
+CD sStatus = LC_GetTegnsett(&sTegnsett);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetTegnsett(short *psTegnsett)
+{
+ short lin,ngi;
+ long nko;
+ unsigned short us;
+ char *cp;
+ short ist = UT_FALSE;
+
+ *psTegnsett = TS_DOSN8;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ LC_GetGrPara(&ngi,&nko,&us);
+ lin=2;
+ if ((cp = LC_GetGP("..TEGNSETT",&lin,ngi)) != NULL) { /* Tegnsett */
+ ist = UT_TRUE;
+ UT_StrUpper(cp);
+ if (strcmp(cp,"ISO8859-10") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ISO8859-1") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ANSI") == 0) {
+ *psTegnsett = TS_ISO8859;
+
+ } else if (strcmp(cp,"ND7") == 0) {
+ *psTegnsett = TS_ND7;
+
+ } else if (strcmp(cp,"DECN7") == 0) {
+ *psTegnsett = TS_DECN7;
+
+ } else if (strcmp(cp,"DECM8") == 0) {
+ *psTegnsett = TS_DECM8;
+ }
+ }
+
+ } else { /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_GetTegnsett)","");
+ ist = UT_FALSE;
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_GetTegnsett)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+
+/*
+AR-920401
+CH LH_GetNgisLag Finner NGIS-LAG
+CD ==========================================================================
+CD Formål:
+CD Finne NGIS-LAG i ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char* pszNgisLag r NGIS-lag.
+CD Tom streng = ..NGIS-LAG er ikke funnet eller parameter mangler
+CD ..NGIS-LAG 0 = Bare leseaksess
+CD
+CD Bruk:
+CD pszNgisLag = LH_GetNgisLag();
+CD ==========================================================================
+*/
+char* LH_GetNgisLag(void)
+{
+ char *cp;
+ short lin = 2;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ if ((cp = LC_GetGP("..NGIS-LAG",&lin,Sys.pGrInfo->ngi)) != NULL) {
+ return cp;
+ } else {
+ return "";
+ }
+
+ } else { /* Gruppen er ikke filhode */
+ LC_Error(94,"(LH_GetNgisLag)","");
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LH_GetNgisLag)","");
+ }
+
+ return "";
+}
+
+
+/*
+AR-910920
+CH LC_PutOmr Legger inn ..OMRÅDE i hodet
+CD ==========================================================================
+CD Formål:
+CD Legger inn område i ginfo i aktuell gruppe.
+CD Hvis område ikke har noen utstrekning justeres
+CD dette med 1 meter i hver retning.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode av ny type.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double nv_a i Område
+CD double nv_n i
+CD double oh_a i
+CD double oh_n i
+CD short ist r status: UT_TRUE=OK, UT_FALSE=feil
+CD
+CD Bruk:
+CD ist = LC_PutOmr(nv_a,nv_n,oh_a,oh_n);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutOmr(double nv_a,double nv_n,double oh_a,double oh_n)
+{
+ short i;
+ char c[80];
+ short ist = UT_FALSE;
+ double dNV_N, dNV_A, dOH_A, dOH_N;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+
+ //UT_SNPRINTF(c,80," %ld %ld",UT_RoundDL(floor(nv_n)),UT_RoundDL(floor(nv_a)));
+ dNV_N = UT_RoundDD(floor(nv_n));
+ dNV_A = UT_RoundDD(floor(nv_a));
+
+ dOH_N = UT_RoundDD(ceil(oh_n));
+ dOH_A = UT_RoundDD(ceil(oh_a));
+
+ // Hvis nødvendig justeres område
+ if (fabs(dOH_N-dNV_N) < 0.00000001) {
+ dNV_N -= 1.0;
+ dOH_N += 1.0;
+ }
+ if (fabs(dOH_A-dOH_A) < 0.00000001) {
+ dNV_A -= 1.0;
+ dOH_A += 1.0;
+ }
+
+ UT_SNPRINTF( c,80, " %.0f %.0f", dNV_N, dNV_A );
+ if (LC_PutGP("...MIN-NØ",c,&i)) {
+
+ UT_SNPRINTF( c, 80, " %.0f %.0f", dOH_N, dOH_A );
+ if (LC_PutGP("...MAX-NØ",c,&i)){
+ ist = UT_TRUE;
+ }
+ }
+
+ } else{ /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_PutOmr)","");
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutOmr)","");
+ }
+
+ return ist;
+}
+
+
+/*
+AR-910920
+CH LC_GetOmr Finner ..OMRÅDE i hodet
+CD ==========================================================================
+CD Formål:
+CD Henter ut område fra ginfo i aktuell gruppe.
+CD OBS! Forutsetter at aktuell gruppe er et SOSI-filhode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double *nv_a u Område
+CD double *nv_n u
+CD double *oh_a u
+CD double *oh_n u
+CD short ist r status: UT_TRUE=OK, UT_FALSE=feil (navn er ikke funnet)
+CD
+CD Bruk:
+CD ist = LC_GetOmr(&nv_a,&nv_n,&oh_a,&oh_n);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetOmr(double *nv_a,double *nv_n,double *oh_a,double *oh_n)
+{
+ short lin,i,ngi;
+ long nko;
+ unsigned short info;
+ char *cp;
+ short ist = UT_TRUE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_HODE) { /* Aktuell gruppe .HODE */
+ LC_GetGrPara(&ngi,&nko,&info);
+ lin=2;
+ if (LC_GetGP("..OMRÅDE",&lin,ngi) == NULL) {
+ LC_Error(7,"(LC_GetOmr)","");
+ *nv_n = -9999999.0;
+ *nv_a = -9999999.0;
+ *oh_n = 9999999.0;
+ *oh_a = 9999999.0;
+ ist = UT_FALSE;
+ } else {
+ /* Min-NØ */
+ i = lin;
+ cp = LC_GetGP("...MIN-NØ",&i,ngi);
+ if (cp == NULL){
+ LC_Error(8,"(LC_GetOmr)","");
+ ist = UT_FALSE;
+ *nv_n = -9999999.0;
+ *nv_a = -9999999.0;
+ } else{
+ *nv_n = strtod(cp,&cp);
+ *nv_a = strtod(cp,&cp);
+ /* Max-NØ */
+ i = lin;
+ cp = LC_GetGP("...MAX-NØ",&i,ngi);
+ if (cp == NULL){
+ LC_Error(9,"(LC_GetOmr)","");
+ ist = UT_FALSE;
+ *oh_n = 9999999.0;
+ *oh_a = 9999999.0;
+
+ } else{
+ *oh_n = strtod(cp,&cp);
+ *oh_a = strtod(cp,&cp);
+ }
+ }
+ }
+
+ } else{ /* Gruppen er ikke filhode */
+ LC_Error(94,"(LC_GetOmr)","");
+ ist = UT_FALSE;
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_GetOmr)","");
+ ist = UT_FALSE;
+ }
+
+ return ist;
+}
+
+
+/*
+AR-910920
+CH LC_NyttHode Lager nytt hode
+CD ==========================================================================
+CD Formål:
+CD Legger inn et standard SOSI-filhode i ginfo i aktuell gruppe.
+CD
+CD Parametre:
+CD ingen
+CD
+CD Bruk:
+CD LC_NyttHode();
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_NyttHode(void)
+{
+ short ngi;
+ long nko;
+ unsigned short us;
+ char szTx[100];
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Tildel plass */
+ LC_GetGrPara(&ngi,&nko,&us);
+ if (ngi < 10){
+ LC_InsGiL((short)(ngi+1),(short)(10-ngi));
+ } else if (ngi > 10){
+ LC_DelGiL(11,(short)(ngi-10));
+ }
+
+ Sys.pGrInfo->gnavn = L_HODE; /* Aktuell gruppe .HODE */
+
+ /* Generer nytt hode */
+ LC_PutGi(1,".HODE");
+ LC_PutGi(2,"..TEGNSETT ISO8859-10");
+ LC_PutGi(3,"..TRANSPAR");
+ LC_PutGi(4,"...KOORDSYS 0");
+ LC_PutGi(5,"...ORIGO-NØ 0 0");
+ LC_PutGi(6,"...ENHET 0.01");
+ LC_PutGi(7,"..OMRÅDE");
+ LC_PutGi(8,"...MIN-NØ -99999 -99999");
+ LC_PutGi(9,"...MAX-NØ 1999999 1999999");
+
+ //LC_PutGi(10,"..SOSI-VERSJON 3.0");
+ UT_SNPRINTF(szTx,100,"..SOSI-VERSJON %.2f",((double)FYBA_SOSI_VERSJON)/100.0);
+ LC_PutGi(10,szTx);
+
+ LC_PutSn(0L); /* Standard serienummer 0 for hodet*/
+ }
+}
+
+
+/*
+AR-910920
+CH LC_TestHode Tester SOSI-hodet
+CD ==========================================================================
+CD Formål:
+CD Sjekker at ginfo i aktuell gruppe er et lovlig SOSI-filhode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short ist r status: UT_TRUE=OK, UT_FALSE=feil
+CD
+CD Bruk:
+CD ist = LC_TestHode();
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_TestHode(void)
+{
+ double d;
+ short ist;
+ unsigned short usMaske = LC_TR_ALLT;
+ LC_TRANSPAR Trans;
+
+
+ ist = LC_GetTransEx(&usMaske,&Trans);
+
+ if (ist == UT_TRUE) {
+ ist = LC_GetOmr(&d,&d,&d,&d);
+ }
+
+ return ist;
+}
+
diff --git a/src/FYBA/FYLI.cpp b/src/FYBA/FYLI.cpp
new file mode 100644
index 0000000..5814574
--- /dev/null
+++ b/src/FYBA/FYLI.cpp
@@ -0,0 +1,2297 @@
+/* === 910828 ============================================================= */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fyli.c */
+/* Innhold: Lagring og henting av indekstabeller */
+/* ======================================================================== */
+
+#include "stdafx.h"
+
+#include <limits.h>
+
+#ifdef WIN32
+# include <process.h>
+#endif
+
+/* Div. styrevariabler */
+
+/* Konstanter for ModusXxx */
+#define NY 0
+#define LES 1
+#define SKRIV 2
+
+
+/* Globale strukturer for fyba */
+extern LC_SYSTEMADM Sys;
+
+
+/* Lokale rutiner */
+static FILE *LI_OpenIdxFil(LC_FILADM *pFil, const char *pszNavn, const char *pszType);
+static FILE *LI_OpenAdm(LC_FILADM *pFil);
+static FILE *LI_OpenGrt(LC_FILADM *pFil);
+static FILE *LI_OpenGeo(LC_FILADM *pFil);
+static FILE *LI_OpenSnr(LC_FILADM *pFil);
+static FILE *LI_OpenBt(LC_FILADM *pFil);
+static void LI_OpenRb(LC_FILADM *pFil,UT_INT64 n64FilPos,short sModus);
+static short LI_ReadAdm(LC_FILADM *pFil);
+static void LI_CreateIdx(LC_FILADM *pFil);
+static void LI_FrigiIdx(LC_FILADM *pFil);
+
+
+/*
+AR-910928
+CH LI_TestIdx Sjekk at indeksfilene eksisterer
+CD ==========================================================================
+CD Formål:
+CD Sjekk at indeksfilene eksisterer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char *szSosFil i SOSI-fil
+CD short status r Status
+CD UT_TRUE = OK
+CD UT_FALSE = Fil mangler
+CD
+CD Bruk:
+CD status = LI_TestIdx(szSosFil);
+ ==========================================================================
+*/
+short LI_TestIdx(char *szSosFil)
+{
+ UT_INT64 Size;
+ char fil[_MAX_PATH];
+ char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+
+
+ // Hvis det er valgt spesiell indekskatalog skal indeksen alltid bygges opp på nytt
+ if (*Sys.szIdxPath != '\0') return UT_FALSE;
+
+ /*
+ * Lag sti til indeksfilene
+ */
+ UT_splitpath(szSosFil,drive,dir,fname,ext);
+ /* Lag navn på sub-directory */
+ UT_StrCat(dir,fname,_MAX_DIR);
+ UT_StrCat(dir,UT_STR_SLASH,_MAX_DIR);
+
+ /* Sjekk at indeksfilene finnes */
+ /* -------------- Adm ------------- */
+ UT_makepath(fil,drive,dir,"Adm",".Idx");
+ if (UT_InqPathSize_i64(fil,&Size) != 0) return UT_FALSE;
+
+ /* -------------- Gruppetabell ------------- */
+ UT_makepath(fil,drive,dir,"Grt",".Idx");
+ if (UT_InqPathSize_i64(fil,&Size) != 0) return UT_FALSE;
+
+ /* -------------- RB ------------- */
+ UT_makepath(fil,drive,dir,"Rb",".Idx");
+ if (UT_InqPathSize_i64(fil,&Size) != 0) return UT_FALSE;
+
+ /* -------------- SNR ------------- */
+ UT_makepath(fil,drive,dir,"Snr",".Idx");
+ if (UT_InqPathSize_i64(fil,&Size) != 0) return UT_FALSE;
+
+ /* -------------- BT -------------- */
+ UT_makepath(fil,drive,dir,"Bt",".Idx");
+ if (UT_InqPathSize_i64(fil,&Size) != 0) return UT_FALSE;
+
+ /* -------------- GEO ------------- */
+ UT_makepath(fil,drive,dir,"Geo",".Idx");
+ if (UT_InqPathSize_i64(fil,&Size) != 0) return UT_FALSE;
+
+ /* printf("\nIndeksfilene finnes."); */
+ return UT_TRUE;
+}
+
+
+/*
+AR-910929
+CH LI_OpenInit Åpner og nullstiller indeksfilene
+CD ==========================================================================
+CD Formål:
+CD Åpner indeksfilene og nullstiller tabellene.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short status r Status
+CD UT_TRUE = OK
+CD UT_FALSE = Ikke åpnet OK
+CD
+CD Bruk:
+CD status = LI_OpenInit(pFil);
+ ==========================================================================
+*/
+short LI_OpenInit(LC_FILADM *pFil)
+{
+ char fil[_MAX_PATH];
+ char drive1[_MAX_DRIVE],dir1[_MAX_DIR],fname1[_MAX_FNAME],ext1[_MAX_EXT];
+ char drive2[_MAX_DRIVE],dir2[_MAX_DIR],fname2[_MAX_FNAME],ext2[_MAX_EXT];
+ FILE *pF;
+
+
+ // ----- Alloker overordnet struktur for indekstabeller
+ LI_CreateIdx(pFil);
+
+ // ----- Splitt filnavnet
+ UT_splitpath(pFil->pszNavn,drive1,dir1,fname1,ext1);
+
+ // Gitt sti for indeksfilene
+ if ( *Sys.szIdxPath != 0) {
+ UT_splitpath(Sys.szIdxPath,drive2,dir2,fname2,ext2);
+ UT_makepath(fil,drive2,dir2,fname1,"");
+
+ } else {
+ UT_makepath(fil,drive1,dir1,fname1,"");
+ }
+
+ // ----- Lag subdirectory hvis det ikke finnes fra før
+ // Sjekk at navnet er lovlig (ikke blanke siste i navnet)
+ if (fil[strlen(fil)-1] == ' ')
+ {
+ LC_Error(120,"(LI_OpenInit)",pFil->pszNavn);
+ exit(99);
+ }
+
+ // Opprett katalogen
+ UT_CreateDir(fil);
+
+
+ // ----- Åpner indeksfilene
+
+ /* -------------- Adm ------------- */
+ pF = LI_OpenAdm(pFil);
+
+ /* Marker at basen er åpnet */
+ UT_StrCopy(pFil->szBaseVer, FYBA_IDENT, LC_BASEVER_LEN);
+ UT_StrCopy(pFil->szIdxVer, FYBA_INDEKS_VERSJON, 5);
+ pFil->ulPid = 0;
+ pFil->sIdxOpen = UT_TRUE;
+ pFil->ulPid = UT_GETPID();
+ //pFil->ulPid = GetCurrentProcessId(); // Bruke _getpid() i stede?
+
+ if (fwrite(pFil,sizeof(*pFil),1,pF) != 1) {
+ LC_Error(112,"(LI_OpenInit)","");
+ exit(99);
+ }
+
+ fclose(pF);
+
+ /* -------------- Gruppetabell ------------- */
+ pF = LI_OpenGrt(pFil);
+ fclose(pF);
+
+ /* -------------- RB ------------- */
+ LI_OpenRb(pFil,0L,SKRIV);
+ pFil->pBase->n64FilPosRb = 0L;
+
+ /* -------------- SNR ------------- */
+ pF = LI_OpenSnr(pFil);
+ fclose(pF);
+
+ /* -------------- BT -------------- */
+ pF = LI_OpenBt(pFil);
+ fclose(pF);
+
+ /* -------------- GEO ------------- */
+ /* (Geografisk søk er uaktuellt ved kladdebase) ?????? */
+ pF = LI_OpenGeo(pFil);
+ fclose(pF);
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-910930
+CH LI_OpenRead Åpner og leser indeksfilene
+CD ==========================================================================
+CD Formål:
+CD Åpner indeksfilene og leser inn tabellene.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short status r Status
+CD UT_OK (0): Lest OK
+CD LI_LESEFEIL: Feil ved les fra Adm.idx
+CD LI_OPPTATT: Filen er åpen i et annet program
+CD LI_FEIL_INDEKSVERSJON: Feil indeksversjon
+CD LI_FEIL_STORRELSE: Feil størrelse på SOSI-filen
+CD LI_FEIL_OPPDATTID: Feil oppdateringstid på SOSI-filen
+CD
+CD Bruk:
+CD status = LI_OpenRead(pFil);
+ ==========================================================================
+*/
+short LI_OpenRead(LC_FILADM *pFil)
+{
+ FILE *pF;
+ long linje;
+ long lSnr;
+ long lGrNr;
+ unsigned long bt;
+ LC_GRTAB_LINJE * pGrt;
+ LC_BOKS Boks;
+ short sStatus;
+
+
+ /* -------------- Admin ------------- */
+ // Her sjekkes det også mot feil versjon, lesefeil
+ // og om filen er åpen i annet program.
+ if ((sStatus = LI_ReadAdm(pFil)) != UT_OK)
+ {
+ return sStatus;
+ }
+
+ // Alloker overordnet struktur for indekstabeller
+ LI_CreateIdx(pFil);
+
+ /* -------------- RB ------------- */
+ LI_OpenRb(pFil,0L,SKRIV);
+ pFil->pBase->n64FilPosRb = 0L;
+
+ /* -------------- Gruppetabell ------------- */
+ pF = LI_OpenGrt(pFil);
+ for (linje = 0; linje<pFil->lAntGr; linje++) {
+ pGrt = LI_AppGrt(pFil,linje);
+ if (fread(pGrt,sizeof(*pGrt),1,pF) != 1) { /* Les */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s : %ld",pFil->pszNavn,linje);
+ LC_Error(111,"(LI_OpenRead): ",err().tx);
+ exit(99);
+ }
+ }
+ fclose(pF);
+
+ /* -------------- SNR ------------- */
+ pF = LI_OpenSnr(pFil);
+ lSnr = 0;
+ while (fread(&lGrNr,sizeof(lGrNr),1,pF) == 1) {
+ if (lGrNr != INGEN_GRUPPE) LI_PutSnr(pFil,lSnr,lGrNr);
+ lSnr++;
+ }
+ if (! feof(pF)) {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %ld",lSnr);
+ LC_Error(111,"(LI_OpenRead): ",err().tx);
+ exit(99);
+ }
+ fclose(pF);
+
+
+ /* -------------- BT -------------- */
+ pF = LI_OpenBt(pFil);
+ for (linje = 0; linje<pFil->lAntGr; linje++) {
+ if (fread(&bt,sizeof(bt),1,pF) != 1) { /* Les */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s : %ld",pFil->pszNavn,linje);
+ LC_Error(111,"(LI_OpenRead): ",err().tx);
+ exit(99);
+ }
+ LI_PutBt(pFil,linje,bt);
+ }
+ fclose(pF);
+
+ /* -------------- GEO ------------- */
+ pF = LI_OpenGeo(pFil);
+ for (linje = 0; linje<pFil->lAntGr; linje++) {
+ if (fread(&Boks,sizeof(Boks),1,pF) != 1) { /* Les */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s : %ld",pFil->pszNavn,linje);
+ LC_Error(111,"(LI_OpenRead): ",err().tx);
+ exit(99);
+ }
+
+ if (Boks.dMaxAust != (double)LONG_MAX) {
+ /* Lagre omskrevet boks i søketreet */
+ pGrt = LI_GetGrt(pFil,linje);
+ pGrt->pRL = LR_InsertGeo(pFil,linje,&Boks);
+ }
+ }
+ fclose(pF);
+
+ return UT_OK;
+}
+
+
+/*
+AR-930809
+CH LI_CreateIdx Allokerer Idx struktur i minne
+CD ==========================================================================
+CD Formål:
+CD Allokerer Idx struktur i minne
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD LI_CreateIdx(pFil);
+ ==========================================================================
+*/
+static void LI_CreateIdx(LC_FILADM *pFil)
+{
+ pFil->pIdx = (LC_IDX_TABELL *) UT_MALLOC(sizeof(LC_IDX_TABELL));
+ memset(pFil->pIdx,'\0',sizeof(LC_IDX_TABELL));
+}
+
+
+/*
+AR-930809
+CH LI_FrigiIdx Frigi Idx struktur i minne
+CD ==========================================================================
+CD Formål:
+CD Frigi Idx struktur i minne
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD LI_FrigiIdx(pFil);
+ ==========================================================================
+*/
+static void LI_FrigiIdx(LC_FILADM *pFil)
+{
+ int i;
+ LC_GRTAB_LINJE * *ppGt = pFil->pIdx->GtAdm;
+ long **pplSnr;
+ unsigned long **ppulBt;
+
+
+ if (pFil->pIdx != NULL) {
+ ppGt = pFil->pIdx->GtAdm;
+ pplSnr = pFil->pIdx->SnrAdm;
+ ppulBt = pFil->pIdx->BtAdm;
+
+ for (i=0; i<LC_ANT_IDX_BLOKK; i++) {
+ /* Gruppetabellen */
+ if (*ppGt != NULL) {
+ UT_FREE(*ppGt);
+ }
+ ppGt++;
+
+ /* SNR-tabellen */
+ if (*pplSnr != NULL) {
+ UT_FREE(*pplSnr);
+ }
+ pplSnr++;
+
+ /* Brukt-tabellen */
+ if (*ppulBt != NULL) {
+ UT_FREE(*ppulBt);
+ }
+ ppulBt++;
+
+ }
+
+ /* Frigi GEO-tabellen */
+ if (pFil->pGeoRN != NULL) {
+ LR_R_FrigiGren(pFil->pGeoRN);
+ }
+
+ /* Frigir topp-blokken */
+ UT_FREE(pFil->pIdx);
+
+ pFil->pIdx = NULL;
+ }
+}
+
+
+/*
+AR-910830
+CH LI_Close Stenger indeksfilene
+CD ==========================================================================
+CD Formål:
+CD Skriver adm. opplysning og stenger indeksfilene.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short s_stat i Slutt-status (brukes foreløpig ikke)
+CD (RESET_IDX) = Fjern indeksfilene
+CD (SAVE_IDX ) = Lagrer indeksfilene
+CD
+CD Bruk:
+CD LI_Close(pFil,SAVE_IDX);
+ ==========================================================================
+*/
+void LI_Close(LC_FILADM *pFil,short s_stat)
+{
+ long lGrNr,lSnr;
+ unsigned long flag;
+ FILE *pF;
+ LC_R_LEAF * pRL;
+ LC_BOKS Boks;
+
+
+ /* RB */
+ if (pFil->pBase->pCurRb != NULL) {
+ fclose(pFil->pBase->pfRb);
+ pFil->pBase->pCurRb = NULL;
+ }
+
+ if (s_stat == SAVE_IDX && pFil->pIdx != NULL && *Sys.szIdxPath == '\0') {
+
+ /* Gruppetabellen */
+ pF = LI_OpenGrt(pFil); /* Åpne og posisjoner */
+ for (lGrNr=0; lGrNr<pFil->lAntGr; lGrNr++) {
+ if (fwrite(LI_GetGrt(pFil,lGrNr),sizeof (LC_GRTAB_LINJE),1,pF) != 1) {
+ LC_Error(112,"(LI_Close)","");
+ exit(99);
+ }
+ }
+ fclose(pF);
+
+ /* Brukttabellen */
+ pF = LI_OpenBt(pFil); /* Åpne og posisjoner */
+ for (lGrNr=0; lGrNr<pFil->lAntGr; lGrNr++) {
+ flag = LI_GetBt(pFil,lGrNr);
+ if (fwrite(&flag,sizeof flag,1,pF) != 1) {
+ LC_Error(112,"(LI_Close)","");
+ exit(99);
+ }
+ }
+ fclose(pF);
+
+ /*Serienummertabellen */
+ pF = LI_OpenSnr(pFil); /* Åpne og posisjoner */
+ for (lSnr=0; lSnr<=pFil->lMaxSnr; lSnr++) {
+ lGrNr = LI_GetSnr(pFil,lSnr);
+ if (fwrite(&lGrNr,sizeof lGrNr,1,pF) != 1) {
+ LC_Error(112,"(LI_Close)","");
+ exit(99);
+ }
+ }
+ fclose(pF);
+
+ /* Geografisk søketabell */
+ pF = LI_OpenGeo(pFil); /* Åpne og posisjoner */
+ for (lGrNr=0; lGrNr<pFil->lAntGr; lGrNr++) {
+ pRL = LI_GetGeo(pFil,lGrNr);
+
+ if (pRL == NULL) {
+ Boks.dMaxAust = (double)LONG_MAX;
+ if (fwrite(&Boks,sizeof (LC_BOKS),1,pF) != 1) {
+ LC_Error(112,"(LI_Close)","");
+ exit(99);
+ }
+
+ } else {
+ if (fwrite(&(pRL->Boks),sizeof (LC_BOKS),1,pF) != 1) {
+ LC_Error(112,"(LI_Close)","");
+ exit(99);
+ }
+ }
+ }
+ fclose(pF);
+
+ /* Lagre adm. blokken */
+ LI_SaveAdm(pFil);
+
+ } else {
+ /* Fjern indeks filene */
+ LC_DelIdx(pFil->pszNavn);
+ }
+
+ /*
+ * Frigi overordnet struktur for indekstabeller
+ */
+ LI_FrigiIdx(pFil);
+
+}
+
+
+/*
+AR-910929
+CH LI_OpenIdxFil Åpne indeksfil
+CD ==========================================================================
+CD Formål:
+CD Åpner indeksfil på rett katalog
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD const char *pszNavn i Filnavn
+CD const char *pszType i Filtype
+CD
+CD Bruk:
+CD pF = LI_OpenIdxFil(pFil,"Adm",".Idx");
+ ==========================================================================
+*/
+static FILE *LI_OpenIdxFil(LC_FILADM *pFil, const char *pszNavn, const char *pszType)
+{
+ short ierr;
+ char fil[_MAX_PATH];
+ char drive1[_MAX_DRIVE],dir1[_MAX_DIR],fname1[_MAX_FNAME],ext1[_MAX_EXT];
+ char drive2[_MAX_DRIVE],dir2[_MAX_DIR],fname2[_MAX_FNAME],ext2[_MAX_EXT];
+
+ FILE *pF;
+
+ // ----- Bygg opp fullt filnavn til filen
+ // Splitt SOSI-filnavnet
+ UT_splitpath(pFil->pszNavn,drive1,dir1,fname1,ext1);
+
+ // Gitt sti for indeksfilene
+ if ( *Sys.szIdxPath != 0) {
+ UT_splitpath(Sys.szIdxPath,drive2,dir2,fname2,ext2);
+ UT_StrCat(dir2,fname1,_MAX_DIR);
+ UT_StrCat(dir2,UT_STR_SLASH,_MAX_DIR);
+ // Bygg opp filnavn
+ UT_makepath(fil,drive2,dir2,pszNavn,pszType);
+
+ } else {
+ UT_StrCat(dir1,fname1,_MAX_DIR);
+ UT_StrCat(dir1,UT_STR_SLASH,_MAX_DIR);
+ // Bygg opp filnavn
+ UT_makepath(fil,drive1,dir1,pszNavn,pszType);
+ }
+
+ // Åner filen
+ pF = UT_OpenFile(fil,"",UT_UPDATE,UT_UNKNOWN,&ierr);
+ if (ierr != UT_OK){
+ char szError[256];
+ UT_strerror(szError,256,ierr);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",fil,szError);
+ LC_Error(6,"(LI_OpenIdxFil)",err().tx);
+ exit(2);
+ }
+
+ /* Posisjoner hvis nødvendig */
+ //fseek(pF,0L,SEEK_SET); // OBS! Er denne nødvendig? AR:2004-05-14 Fjernet
+
+ return pF;
+}
+
+
+/*
+AR-910929
+CH LI_OpenAdm Åpne og posisjoner, Adm
+CD ==========================================================================
+CD Formål:
+CD Sjekker at rett Adm-fil er åpen, og posisjoner
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD pF = LI_OpenAdm(pFil);
+ ==========================================================================
+*/
+static FILE *LI_OpenAdm(LC_FILADM *pFil)
+{
+ FILE *fi = LI_OpenIdxFil(pFil,"Adm",".Idx");
+ fseek(fi,0L,SEEK_SET);
+
+ return fi;
+}
+
+
+/*
+AR-910929
+CH LI_OpenGrt Åpne og posisjoner, Grt
+CD ==========================================================================
+CD Formål:
+CD Sjekker at rett Grt-fil er åpen, og posisjoner
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD pF = LI_OpenGrt(pFil);
+ ==========================================================================
+*/
+static FILE *LI_OpenGrt(LC_FILADM *pFil)
+{
+ FILE *fi = LI_OpenIdxFil(pFil,"Grt",".Idx");
+ fseek(fi,0L,SEEK_SET);
+
+ return fi;
+}
+
+
+/*
+AR-910929
+CH LI_OpenGeo Åpne og posisjoner, Geo
+CD ==========================================================================
+CD Formål:
+CD Sjekker at rett Geo-fil er åpen, og posisjoner
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD pF = LI_OpenGeo(pFil);
+ ==========================================================================
+*/
+static FILE *LI_OpenGeo(LC_FILADM *pFil)
+{
+ FILE *fi = LI_OpenIdxFil(pFil,"Geo",".Idx");
+ fseek(fi,0L,SEEK_SET);
+
+ return fi;
+}
+
+
+/*
+AR-910929
+CH LI_OpenSnr Åpne og posisjoner, Snr
+CD ==========================================================================
+CD Formål:
+CD Sjekker at rett Snr-fil er åpen, og posisjoner
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD pF = LI_OpenSnr(pFil);
+ ==========================================================================
+*/
+static FILE *LI_OpenSnr(LC_FILADM *pFil)
+{
+ FILE *fi = LI_OpenIdxFil(pFil,"Snr",".Idx");
+ fseek(fi,0L,SEEK_SET);
+
+ return fi;
+}
+
+
+/*
+AR-910929
+CH LI_OpenBt Åpne og posisjoner, Bt
+CD ==========================================================================
+CD Formål:
+CD Åpne Bt-fil, og posisjoner
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD pF = LI_OpenBt(pFil);
+ ==========================================================================
+*/
+static FILE *LI_OpenBt(LC_FILADM *pFil)
+{
+ FILE *fi = LI_OpenIdxFil(pFil,"Bt",".Idx");
+ fseek(fi,0L,SEEK_SET);
+
+ return fi;
+}
+
+
+/*
+AR-930810
+CH LI_GetGeo Get geo-linje
+CD ==========================================================================
+CD Formål:
+CD Henter en linje fra geografisk søketabell.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long linje i Linjenummer i geo-tabellen (gruppenummer)
+CD LC_GEOTABELL *geop r Peker til geo-tabell-struktur
+CD
+CD Bruk:
+CD geop = LI_GetGeo(pFil,linje);
+ ==========================================================================
+*/
+LC_R_LEAF * LI_GetGeo(LC_FILADM *pFil,long linje)
+{
+ LC_GRTAB_LINJE * pGT;
+
+ pGT = LI_GetGrt(pFil,linje);
+
+ return pGT->pRL; /* Peker til element søketreet */
+}
+
+
+/*
+AR-930810
+CH LI_GetSnr Get snr-linje
+CD ==========================================================================
+CD Formål:
+CD Henter en linje fra serienummer-tabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long lSnr i Serienummer
+CD long lGrNr r Gruppenummer
+CD
+CD Bruk:
+CD lGrNr = LI_GetSnr(pFil,lSnr);
+ ==========================================================================
+*/
+long LI_GetSnr(LC_FILADM *pFil,long lSnr)
+{
+ long **pplGrNr;
+
+ if (pFil->pIdx != NULL) {
+ /* Lovlig serienummer? */
+ if (lSnr <= pFil->lMaxSnr) {
+ /* Finner starten av aktuell blokk */
+ pplGrNr = pFil->pIdx->SnrAdm + (lSnr / LC_IDX_LIN_BLOKK);
+ /* Er denne blokken brukt? */
+ if (*pplGrNr != NULL) {
+ /* Hent aktuell linje i denne blokken */
+ return *(*pplGrNr + (lSnr % LC_IDX_LIN_BLOKK));
+ }
+ }
+ }
+
+ return INGEN_GRUPPE;
+}
+
+
+/*
+AR-930810
+CH LI_PutSnr Put snr-linje
+CD ==========================================================================
+CD Formål:
+CD Legger inn en linje i serienummer-tabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long lSnr i Serienummer
+CD long lGrNr i Gruppenummer
+CD
+CD Bruk:
+CD LI_PutSnr(pFil,lSnr,lGrNr);
+ ==========================================================================
+*/
+void LI_PutSnr(LC_FILADM *pFil,long lSnr,long lGrNr)
+{
+ long **pplGrNr,*pL;
+ int antall;
+
+ if (pFil->pBase->sType == LC_BASE) {
+ if (pFil->pIdx != NULL) {
+ if (lSnr < LC_MAX_GRU) {
+ /* Finner starten av aktuell blokk */
+ pplGrNr = pFil->pIdx->SnrAdm + (lSnr / LC_IDX_LIN_BLOKK);
+
+ /* Blokken finnes ikke, lag ny blokk */
+ if (*pplGrNr == NULL)
+ {
+ *pplGrNr = (long *) UT_MALLOC(sizeof(long)*LC_IDX_LIN_BLOKK);
+
+ for (pL=*pplGrNr,antall=0; antall<LC_IDX_LIN_BLOKK; pL++,antall++) {
+ *pL = INGEN_GRUPPE;
+ }
+ }
+
+ /* Legg inn aktuell linje i blokken */
+ *(*pplGrNr + (lSnr % LC_IDX_LIN_BLOKK)) = lGrNr;
+
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"%ld",lSnr);
+ LC_Error(61,"(LI_PutSnr): ",err().tx);
+ exit(99);
+ }
+
+ } else {
+ LC_Error(75,"(LI_PutSnr): ","");
+ exit(99);
+ }
+ }
+}
+
+
+/*
+AR-930810
+CH LI_GetGrt Get grt-linje
+CD ==========================================================================
+CD Formål:
+CD Henter en linje fra gruppetabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long linje i Linjenummer i grt-tabellen (gruppenummer)
+CD LC_GRTAB_LINJE *grtp r Peker til grt-tabell-linje
+CD
+CD Bruk:
+CD grtp = LI_GetGrt(pFil,linje);
+ ==========================================================================
+*/
+LC_GRTAB_LINJE * LI_GetGrt(LC_FILADM *pFil,long linje)
+{
+ LC_GRTAB_LINJE * *ppGt;
+
+ if (pFil->pIdx != NULL) {
+ /* Finner starten av aktuell blokk */
+ ppGt = pFil->pIdx->GtAdm + (linje / LC_IDX_LIN_BLOKK);
+ /* Er denne blokken brukt? */
+ if (*ppGt != NULL) {
+ /* Hent aktuell linje i denne blokken */
+ return (*ppGt + (linje % LC_IDX_LIN_BLOKK));
+ }
+ }
+
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s : %ld",pFil->pszNavn,linje);
+ LC_Error(111,"(LI_GetGrt): ",err().tx);
+ exit(99);
+
+ return NULL;
+}
+
+
+/*
+AR-930810
+CH LI_AppGrt Ny grt-linje
+CD ==========================================================================
+CD Formål:
+CD Legger inn en NY linje i gruppetabell.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long linje i Linjenummer i grt-tabellen (gruppenummer)
+CD LC_GEOTABELL *grtp r Peker til grt-tabell-struktur
+CD
+CD Bruk:
+CD pgrt = LI_AppGrt(pFil,linje,geop);
+ ==========================================================================
+*/
+LC_GRTAB_LINJE * LI_AppGrt(LC_FILADM *pFil,long linje)
+{
+ LC_GRTAB_LINJE * *ppGt;
+
+ if (pFil->pIdx != NULL) {
+ /* Finner starten av aktuell blokk */
+ ppGt = pFil->pIdx->GtAdm + (linje / LC_IDX_LIN_BLOKK);
+ if (*ppGt == NULL) {
+ /* Blokken finnes ikke, lag ny blokk */
+ *ppGt = (LC_GRTAB_LINJE *)UT_MALLOC(sizeof(LC_GRTAB_LINJE)*LC_IDX_LIN_BLOKK);
+ memset(*ppGt,'\0',sizeof(LC_GRTAB_LINJE)*LC_IDX_LIN_BLOKK);
+ }
+
+ /* Finn aktuell linje i blokken */
+ return (*ppGt + (linje % LC_IDX_LIN_BLOKK)); /* Funnet ===> */
+
+ } else {
+ LC_Error(75,"(LI_PutGrt): ",err().tx);
+ exit(99);
+ }
+
+ return NULL;
+}
+
+
+/*
+AR-930810
+CH LI_GetBt Get bt-linje
+CD ==========================================================================
+CD Formål:
+CD Henter en linje fra brukt-tabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long linje i Linjenummer i bt-tabellen (gruppenummer)
+CD unsigned long bt_val r Hentet bit-mønster
+CD
+CD Bruk:
+CD bt_val = LI_GetBt(pFil,linje);
+ ==========================================================================
+*/
+unsigned long LI_GetBt(LC_FILADM *pFil,long linje)
+{
+ unsigned long **ppulFlag;
+
+ if (pFil->pIdx != NULL) {
+ /* Finner starten av aktuell blokk */
+ ppulFlag = pFil->pIdx->BtAdm + (linje / LC_IDX_LIN_BLOKK);
+ /* Er denne blokken brukt? */
+ if (*ppulFlag != NULL) {
+ /* Hent aktuell linje i denne blokken */
+ return *(*ppulFlag + (linje % LC_IDX_LIN_BLOKK));
+ }
+ }
+
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s : %ld",pFil->pszNavn,linje);
+ LC_Error(111,"(LI_GetBt): ",err().tx);
+ exit(99);
+
+ return 0L;
+}
+
+
+/*
+AR-930810
+CH LI_PutBt Put bt-linje
+CD ==========================================================================
+CD Formål:
+CD Legger inn en linje i brukt-tabell.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long linje i Linjenummer i bt-tabellen (gruppenummer)
+CD unsigned long bt_val i Bit mønster som skal lagres
+CD
+CD Bruk:
+CD LI_PutBt(pFil,linje,bt_val);
+ ==========================================================================
+*/
+void LI_PutBt(LC_FILADM *pFil,long linje,unsigned long bt_val)
+{
+ unsigned long **ppulFlag;
+
+ if (pFil->pIdx != NULL) {
+ /* Finner starten av aktuell blokk */
+ ppulFlag = pFil->pIdx->BtAdm + (linje / LC_IDX_LIN_BLOKK);
+
+ /* Blokken finnes ikke, lag ny blokk */
+ if (*ppulFlag == NULL)
+ {
+ *ppulFlag = (unsigned long *) UT_MALLOC(sizeof(unsigned long)*LC_IDX_LIN_BLOKK);
+ memset(*ppulFlag,'\0',sizeof(unsigned long)*LC_IDX_LIN_BLOKK);
+ }
+
+ /* Legg inn aktuell linje i blokken */
+ *(*ppulFlag + (linje % LC_IDX_LIN_BLOKK)) = bt_val;
+
+ } else {
+ LC_Error(75,"(LI_PutBt): ",err().tx);
+ exit(99);
+ }
+}
+
+
+/*
+AR-881123
+CH LC_SetBt Sett merke i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Legg inn merke i brukttabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pGr i Gruppenummer
+CD short kolonne i Kolonne som skal merkes.
+CD (Lovlig BT_MIN_USER - BT_MAX_USER)
+CD
+CD Bruk:
+CD LC_SetBt(pGr,kolonne);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_SetBt(LC_BGR * pGr,short kolonne)
+{
+ /* LO_TestFilpeker(pGr->pFil,"LC_SetBt"); */
+ LO_TestFilpeker(pGr->pFil,"SetBt");
+
+ /* Lovlig gruppe */
+ if (pGr->lNr >= 0L && pGr->lNr < pGr->pFil->lAntGr) {
+ /* Lovlig kolonne */
+ if (kolonne >= BT_MIN_USER && kolonne <= BT_MAX_USER) {
+ /* Merk */
+ LI_SetBt(pGr->pFil,pGr->lNr,kolonne);
+ }
+
+ } else{ /* Ulovlig gruppe */
+ char errtx[50];
+ UT_SNPRINTF(errtx,50," %ld",pGr->lNr);
+ LC_Error(72,"(LC_SetBt)",errtx);
+ }
+}
+
+
+/*
+AR-881123
+CH LC_ClrBt Slett merke i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Fjern merke i brukttabellen.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pGr i Gruppenummer
+CD kolonne short i Kolonne som skal merkes.
+CD (Lovlig BT_MIN_USER - BT_MAX_USER)
+CD
+CD Bruk:
+CD LC_ClrBt(pGr,kolonne);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_ClrBt(LC_BGR * pGr,short kolonne)
+{
+ /* LO_TestFilpeker(pGr->pFil,"LC_ClrBt"); */
+ LO_TestFilpeker(pGr->pFil,"ClrBt");
+
+ /* Lovlig gruppe */
+ if (pGr->lNr >= 0L && pGr->lNr < pGr->pFil->lAntGr) {
+ /* Lovlig kolonne */
+ if (kolonne >= BT_MIN_USER && kolonne <= BT_MAX_USER) {
+ /* Fjern merkingen */
+ LI_ClrBt(pGr->pFil,pGr->lNr,kolonne);
+ }
+
+ } else{ /* Ulovlig gruppe */
+ char errtx[50];
+ UT_SNPRINTF(errtx,50," %ld",pGr->lNr);
+ LC_Error(72,"(LC_ClrBt)",errtx);
+ }
+}
+
+
+/*
+AR-881123
+CH LC_GetBt Hent merke i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Hent merke i brukttabellen.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pGr i Gruppenummer
+CD kolonne short i Kolonne som skal brukes.
+CD (Lovlig BT_MIN_BT - BT_MAX_BT)
+CD merke short r UT_FALSE = ikke marka, UT_TRUE = merka
+CD
+CD Bruk:
+CD merke = LC_GetBt(pGr,kolonne);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetBt(LC_BGR * pGr,short kolonne)
+{
+ /* LO_TestFilpeker(pGr->pFil,"LC_GetBt"); */
+ LO_TestFilpeker(pGr->pFil,"GetBt");
+
+ /* Lovlig gruppe */
+ if (pGr->lNr >= 0L && pGr->lNr < pGr->pFil->lAntGr) {
+ /* Lovlig kolonne */
+ if (kolonne >= BT_MIN_BT && kolonne <= BT_MAX_BT) {
+ /* Returner verdi */
+ return (LI_InqBt(pGr->pFil,pGr->lNr,kolonne));
+ }
+
+ } else{ /* Ulovlig gruppe */
+ char errtx[50];
+ UT_SNPRINTF(errtx,50," %ld",pGr->lNr);
+ LC_Error(72,"(LC_GetBt)",errtx);
+ }
+
+ return UT_FALSE; /* Retur ved feil */
+}
+
+
+/*
+AR-881123
+CH LC_EraseBt Slett område i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Blanker en eller flere kolonner i brukttabellen i aktuell base.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD fra_kol short i Første kolonne som skal blankes.
+CD (Lovlig BT_MIN_USER - BT_MAX_USER)
+CD til_kol short i Siste kolonne som skall blankes.
+CD (Lovlig BT_MIN_USER - BT_MAX_USER)
+CD
+CD Bruk:
+CD LC_EraseBt(fra_kol,til_kol);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_EraseBt(short fra_kol,short til_kol)
+{
+ /* Beregner lovlige kolonner */
+ fra_kol = max(fra_kol,BT_MIN_USER);
+ til_kol = min(til_kol,BT_MAX_USER);
+
+ LI_EraseBt(fra_kol,til_kol);
+}
+
+
+/*
+AR-891120
+CH LI_SetBt Sett merke i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Legg inn merke i brukttabellen.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long lGrNr i Gruppenummer
+CD kolonne short i Kolonne som skal merkes.
+CD (Lovlig BT_MIN_BT - BT_MAX_BT)
+CD
+CD Bruk:
+CD LI_SetBt(pFil,lGrNr,kolonne);
+ ==========================================================================
+*/
+void LI_SetBt(LC_FILADM *pFil,long lGrNr,short kolonne)
+{
+ LI_PutBt (pFil,lGrNr,LI_GetBt(pFil,lGrNr) | (0x1UL << kolonne));
+}
+
+
+/*
+AR-891120
+CH LI_ClrBt Slett merke i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Fjern merke i brukttabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long lGrNr i Gruppenummer
+CD kolonne short i Kolonne som skal merkes.
+CD (Lovlig BT_MIN_BT - BT_MAX_BT)
+CD
+CD Bruk:
+CD LI_ClrBt(pFil,lGrNr,kolonne);
+ ==========================================================================
+*/
+void LI_ClrBt(LC_FILADM *pFil,long lGrNr,short kolonne)
+{
+ LI_PutBt(pFil,lGrNr,LI_GetBt(pFil,lGrNr) & (~ (0x1UL << kolonne) ));
+}
+
+
+/*
+AR-910828
+CH LI_InqBt Hent merke i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Hent merke i brukttabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long lGrNr i Gruppenummer
+CD kolonne short i Kolonne som skal brukes.
+CD (Lovlig BT_MIN_BT - BT_MAX_BT)
+CD merke short r UT_TRUE = marka, UT_FALSE = ikke merka.
+CD
+CD Bruk:
+CD merke = LI_InqBt(pFil,lGrNr,kolonne);
+ ==========================================================================
+*/
+short LI_InqBt(LC_FILADM *pFil,long lGrNr,short kolonne)
+{
+ return ((LI_GetBt(pFil,lGrNr) & (0x1UL << kolonne)) == 0)? UT_FALSE : UT_TRUE;
+}
+
+
+/*
+AR-910827
+CH LI_EraseBt Slett område i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Blanker en eller flere kolonner i brukttabellen i aktuell base.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short fra_kol i Første kolonne som skal blankes. (Lovlig 0 - BT_MAX_BT)
+CD short til_kol i Siste kolonne som skal blankes. (Lovlig 0 - BT_MAX_BT)
+CD
+CD Bruk:
+CD LI_EraseBt(fra_kol,til_kol);
+ ==========================================================================
+*/
+void LI_EraseBt(short fra_kol,short til_kol)
+{
+ long lNr;
+ unsigned long maske;
+ LC_FILADM *pFil;
+
+ /* Beregner lovlige områder */
+ fra_kol = max(fra_kol,BT_MIN_BT);
+ til_kol = min(til_kol,BT_MAX_BT);
+
+ maske = 0x0000; /* Lager slettemaske */
+ for ( ; fra_kol <= til_kol; fra_kol++){
+ maske |= (0x1UL << fra_kol); /* Merker bit som skal blankes */
+ }
+ maske = ~ maske; /* Inverterer masken */
+
+ /*
+ * Fjerner merkingen
+ */
+ for (pFil=Sys.pAktBase->pForsteFil; pFil != NULL; pFil=pFil->pNesteFil) {
+ for (lNr=0L; lNr<pFil->lAntGr; lNr++) {
+ LI_PutBt(pFil,lNr,(maske & LI_GetBt(pFil,lNr)));
+ }
+ }
+}
+
+
+/*
+AR-910827
+CH LC_CopyBt Kopier kolonne i brukttabellen
+CD ==========================================================================
+CD Formål:
+CD Kopier kolonne i brukttabellen.
+CD Samtidig er det mulig å utføre logiske operasjoner mellom de to kolonnene.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short fra_kol i Kolonne det skal kopieres fra. (Lovlig 0 - BT_MAX_BT)
+CD short til_kol i Kolonne det skal kopieres til. (Lovlig 1 - BT_MAX_USER)
+CD short operasjon i Logisk operasjon mellom kolonnene.
+CD BC_COPY = Overskriv gammelt innhold.
+CD BC_AND = Logisk AND mellom de to kolonnene.
+CD BC_OR = Logisk OR mellom de to kolonnene.
+CD BC_INVERT = Overskriv gammelt innhold med
+CD invertert verdi.
+CD BC_EXCHANGE = Bytter innholdet i de to kolonnene.
+CD
+CD Bruk:
+CD LC_CopyBt(fra_kol,til_kol,operasjon);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_CopyBt(short fra_kol,short til_kol,short operasjon)
+{
+ long lNr;
+ unsigned long maske_fra,maske_til;
+ LC_FILADM *pFil = Sys.pAktBase->pForsteFil;
+ unsigned long merke;
+ unsigned long ul;
+
+ /* Beregner lovlige områder */
+ fra_kol = min(max(fra_kol,0),BT_MAX_BT);
+ til_kol = min(max(til_kol,0),BT_MAX_USER);
+
+ /* Returner verdi */
+ maske_fra = 0x00000001UL << fra_kol;
+ maske_til = 0x00000001UL << til_kol;
+
+
+ /* Går gjennom alle grupper */
+ for (; pFil != NULL; pFil=pFil->pNesteFil) {
+ for (lNr=1L; lNr<pFil->lAntGr; lNr++) {
+ merke = LI_GetBt(pFil,lNr);
+ switch (operasjon){
+ case BC_AND: /* AND */
+ if ((merke & maske_fra) && (merke & maske_til)){
+ merke |= maske_til; /* Sett */
+ } else{
+ merke &= ( ~ maske_til); /* Blank */
+ }
+ break;
+
+ case BC_OR: /* OR */
+ if ((merke & maske_fra) || (merke & maske_til)){
+ merke |= maske_til; /* Sett */
+ } else{
+ merke &= ( ~ maske_til); /* Blank */
+ }
+ break;
+
+ case BC_INVERT: /* INVERT (Invertert kopi)*/
+ if (merke & maske_fra) {
+ merke &= ( ~ maske_til); /* Blank */
+ } else{
+ merke |= maske_til; /* Sett */
+ }
+ break;
+
+ case BC_EXCHANGE: /* BYTT */
+ /* Husk innholdet i "til-kolonnen" */
+ ul = merke & maske_til;
+ /* Oppdater "til-kolonnen" */
+ if (merke & maske_fra) {
+ merke |= maske_til; /* Sett */
+ } else{
+ merke &= ( ~ maske_til); /* Blank */
+ }
+ /* Oppdater "fra-kolonnen" */
+ if (ul) {
+ merke |= maske_fra; /* Sett */
+ } else{
+ merke &= ( ~ maske_fra); /* Blank */
+ }
+ break;
+
+ default:
+ case BC_COPY: /* COPY */
+ if (merke & maske_fra) {
+ merke |= maske_til; /* Sett */
+ } else{
+ merke &= ( ~ maske_til); /* Blank */
+ }
+ break;
+ }
+
+ /* Skriv tilbake */
+ LI_PutBt(pFil,lNr,merke);
+ }
+ }
+}
+
+
+/*
+AR-891120
+CH LI_SaveAdm Skriv globale variabler til indeksfil
+CD ==========================================================================
+CD Formål:
+CD Skriver globale variabler til indeksfilen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD
+CD Bruk:
+CD LI_SaveAdm(pFil);
+ ==========================================================================
+*/
+void LI_SaveAdm(LC_FILADM *pFil)
+{
+ UT_INT64 Size;
+ FTID FilTid;
+ FILE *pF;
+
+ /* Åpner Adm-fil, og posisjonerer */
+ pF = LI_OpenAdm(pFil);
+
+ /* Filstørrelse for SOSI-filen */
+ UT_InqPathSize_i64(pFil->pszNavn,&Size);
+ pFil->SosiBytes = Size;
+
+ /* Oppdateringstid for SOSI-filen */
+ UT_InqPathTid(pFil->pszNavn,&FilTid);
+ pFil->SosiTid.usAar = FilTid.usAar;
+ pFil->SosiTid.usMnd = FilTid.usMnd;
+ pFil->SosiTid.usDag = FilTid.usDag;
+ pFil->SosiTid.usTime = FilTid.usTime;
+ pFil->SosiTid.usMin = FilTid.usMin;
+ pFil->SosiTid.usSek = FilTid.usSek;
+
+
+ pFil->sIdxOpen = UT_FALSE;
+ pFil->ulPid = 0;
+ if (fwrite(pFil,sizeof(*pFil),1,pF) != 1) {
+ LC_Error(112,"(LI_SaveAdm)","");
+ exit(99);
+ }
+
+ fclose(pF);
+}
+
+
+/*
+AR-891120
+CH LI_ReadAdm Les globale variabler fra indeksfil
+CD ==========================================================================
+CD Formål:
+CD Åpner Adm-filen, og henter "globale" variabler fra indeksfilen.
+CD
+CD Parametre: ingen
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short status r Status:
+CD UT_OK (0): Lest OK
+CD LI_LESEFEIL: Feil ved lesing av
+CD LI_OPPTATT: Filen er åpen i et annet program
+CD LI_FEIL_INDEKSVERSJON: Feil indeksversjon
+CD LI_FEIL_STORRELSE: Feil størrelse på SOSI-filen
+CD LI_FEIL_OPPDATTID: Feil oppdateringstid på SOSI-filen
+CD
+CD Bruk:
+CD sStatus = LI_ReadAdm(pFil);
+ ==========================================================================
+*/
+static short LI_ReadAdm(LC_FILADM *pFil)
+{
+ unsigned short usLag;
+ FTID SosiTid;
+ UT_INT64 SosiSize;
+ short sAccess;
+ short sTegnsett;
+ char *pszNavn;
+ LC_IDX_TABELL *pIdx;
+ LC_FILADM *pNesteFil;
+ LC_BASEADM *pBase;
+ FILE *pF;
+ LC_R_NODE *pGeoRN;
+ short sStatus = UT_OK;
+
+
+ /* Åpner Adm-fil, og posisjonerer */
+ pF = LI_OpenAdm(pFil);
+
+ /* Tar vare på div. adm som ikke må bli overskrevet av adm fra filen */
+ pszNavn = pFil->pszNavn;
+ sAccess = pFil->sAccess;
+ usLag = pFil->usLag;
+ pBase = pFil->pBase;
+ pIdx = pFil->pIdx;
+ pGeoRN = pFil->pGeoRN;
+ pNesteFil = pFil->pNesteFil;
+ pBase = pFil->pBase;
+ sTegnsett = pFil->sTegnsett;
+
+ /* Hent div. opplysninger om SOSI-filen */
+ UT_InqPathSize_i64(pszNavn,&SosiSize);
+ UT_InqPathTid(pszNavn,&SosiTid);
+
+ /* Leser adm */
+ if (fread(pFil,sizeof(*pFil),1,pF) != 1)
+ {
+ /* printf("\nFeil lengde lest."); */
+ sStatus = LI_LESEFEIL;
+ }
+
+ // lest OK
+ else
+ {
+ /*
+ // Sjekk om filen er åpen i et annet program
+ if (pFil->sIdxOpen == UT_TRUE)
+ {
+ // Sjekk om dette programmet er aktivt nå, eller om det har krasjet
+ // (ulPid er prosessID for programmet som åpnet filen)
+ if (pFil->ulPid != 0)
+ {
+ HANDLE hProgram = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, pFil->ulPid );
+ if (hProgram != NULL)
+ {
+ // Programmet finnes / er aktivt nå
+ CloseHandle(hProgram);
+ // printf("\nFilen er åpen i et annet program.");
+ sStatus = LI_OPPTATT;
+ }
+ }
+ }
+ */
+
+ // Ikke åpen i annet program som er aktivt nå
+ if (sStatus == UT_OK)
+ {
+ /* Sjekk versjonsnummer */
+ if (strcmp(FYBA_INDEKS_VERSJON,pFil->szIdxVer) != 0) {
+ /* printf("\nFeil indeksversjon"); */
+ sStatus = LI_FEIL_INDEKSVERSJON;
+
+ /* Sjekk størrelse for SOSI-filen */
+ } else if (pFil->SosiBytes != SosiSize) {
+ /* printf("\nFeil størrelse på SOSI-filen."); */
+ sStatus = LI_FEIL_STORRELSE;
+
+ /* Sjekk oppdateringstid for SOSI-filen */
+ } else if (memcmp(&pFil->SosiTid,&SosiTid,sizeof(FTID)) != 0) {
+ /* printf("\nFeil oppdateringstid"); */
+ sStatus = LI_FEIL_OPPDATTID;
+ }
+ }
+ }
+
+ /* Legg inn igjen diverse adm. */
+ pFil->pszNavn = pszNavn;
+ pFil->sAccess = sAccess;
+ pFil->usLag = usLag;
+ pFil->pBase = pBase;
+ pFil->pIdx = pIdx;
+ pFil->pGeoRN = pGeoRN;
+ pFil->pNesteFil = pNesteFil;
+ pFil->pBase = pBase;
+ pFil->sTegnsett = sTegnsett;
+ UT_StrCopy(pFil->szBaseVer,FYBA_IDENT,LC_BASEVER_LEN);
+ UT_StrCopy(pFil->szIdxVer,FYBA_INDEKS_VERSJON,5);
+
+
+ // Retur hvis feil
+ if (sStatus != UT_OK)
+ {
+ fclose(pF);
+ return sStatus;
+ }
+
+ // Marker at basen er åpnet
+ pFil->sIdxOpen = UT_TRUE;
+#ifdef LINUX
+ pFil->ulPid = getpid();
+#else
+ pFil->ulPid = _getpid();
+#endif
+
+ // Skriv
+ fseek(pF,0L,SEEK_SET);
+ if (fwrite(pFil,sizeof(*pFil),1,pF) != 1)
+ {
+ LC_Error(112,"(LI_ReadAdm)","");
+ exit(99);
+ }
+
+ // Stenger filen
+ fclose(pF);
+
+ return sStatus;
+}
+
+
+/*
+AR-930824
+CH LI_WriteRb Skriv gruppe til bufferfil
+CD ==========================================================================
+CD Formål:
+CD Skriv gruppe fra buffer i minne til buffer-fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD UT_INT64 n64FilPos i Startposisjon i buffer-filen.
+CD char *pszGi iu Ginfo-buffer
+CD unsigned long ulGiLen i Ant tegn som skal skrives
+CD double *pdAust iu Koord
+CD double *pdNord iu Koord
+CD LB_INFO * pInfo iu Høyde, KP og PINFO-ofsett
+CD long lNko i Ant koord
+CD char *pszPi iu Pinfo-buffer
+CD unsigned long ulPiLen i Ant tegn som skal skrives
+CD
+CD Bruk:
+CD LI_WriteRb(pFil,lFilPos,Sys.Ginfo.pszTx,Sys.pGrInfo->ulGiLen,
+CD Sys.pdAust, Sys.pdNord, Sys.pInfo, Sys.pGrInfo->nko,
+CD Sys.pszPinfo, Sys.pGrInfo->ulPiLen);
+ ==========================================================================
+*/
+void LI_WriteRb(LC_FILADM *pFil, UT_INT64 n64FilPos,
+ char *pszGi, unsigned long ulGiLen,
+ double *pdAust, double *pdNord,
+ LB_INFO * pInfo, long lNko,
+ char *pszPi, unsigned long ulPiLen)
+{
+ short sSkrivefeil = UT_FALSE;
+ FILE *pF;
+
+ /* Åpner RB-fil, og posisjonerer */
+ LI_OpenRb(pFil,n64FilPos,SKRIV);
+ pF = pFil->pBase->pfRb;
+
+ /* GINFO */
+ if (ulGiLen > 0) {
+ if (fwrite(pszGi,(sizeof(char))*ulGiLen,1,pF) != 1) {
+ sSkrivefeil = UT_TRUE;
+ }
+ }
+
+ if (lNko > 0) {
+ /* Øst koordinat */
+ if (fwrite(pdAust,(sizeof(double))*lNko,1,pF) != 1) {
+ sSkrivefeil = UT_TRUE;
+ }
+
+ /* Nord koordinat */
+ if (fwrite(pdNord,(sizeof(double))*lNko,1,pF) != 1) {
+ sSkrivefeil = UT_TRUE;
+ }
+
+ /* Høyde, KP mm. */
+ if (fwrite(pInfo,(sizeof(LB_INFO)) * lNko,1,pF) != 1) {
+ sSkrivefeil = UT_TRUE;
+ }
+
+ /* PINFO */
+ if (ulPiLen > 0) {
+ if (fwrite(pszPi,(sizeof(char))*ulPiLen,1,pF) != 1) {
+ sSkrivefeil = UT_TRUE;
+ }
+ }
+ }
+
+ if (sSkrivefeil == UT_TRUE) {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s : %lld",pFil->pszNavn,n64FilPos);
+ LC_Error(74,"(LI_WriteRb): ",err().tx);
+ exit(99);
+ }
+
+ pFil->pBase->n64FilPosRb = _ftelli64(pF);
+}
+
+
+/*
+AR-930823
+CH LI_ReadRb Les gruppe fra buffer-fil
+CD ==========================================================================
+CD Formål:
+CD Les gruppe fra buffer-fil til buffer i minne.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm for filen det skal leses fra.
+CD UT_INT64 n64FilPos i Startposisjon i buffer-filen.
+CD char *pszGi iu Ginfo-buffer
+CD unsigned long ulGiLen i Ant tegn som skal leses til buffer
+CD double *pdAust iu Koord
+CD double *pdNord iu Koord
+CD LB_INFO * pInfo iu Høyde, KP og PINFO-ofsett
+CD long lNko i Ant koord
+CD char *pszPi iu Pinfo-buffer
+CD unsigned long ulPiLen i Ant tegn som skal leses til buffer
+CD
+CD Bruk:
+CD LI_ReadRb(pFil,lFilPos,Sys.Ginfo.pszTx,Sys.pGrInfo->ulGiLen,
+CD Sys.pdAust, Sys.pdNord, Sys.pInfo, Sys.pGrInfo->nko,
+CD Sys.pszPinfo, Sys.pGrInfo->ulPiLen);
+ ==========================================================================
+*/
+void LI_ReadRb(LC_FILADM *pFil, UT_INT64 n64FilPos,
+ char *pszGi, unsigned long ulGiLen,
+ double *pdAust, double *pdNord,
+ LB_INFO * pInfo, long lNko,
+ char *pszPi, unsigned long ulPiLen)
+{
+ short sLesefeil = UT_FALSE;
+ FILE *pF;
+
+ /* Åpner RB-fil, og posisjonerer */
+ LI_OpenRb(pFil,n64FilPos,LES);
+ pF = pFil->pBase->pfRb;
+
+ /* Leser GINFO */
+ if (ulGiLen > 0) {
+ if (fread(pszGi,(sizeof(char))*ulGiLen,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+ // AR:2004-05-14 - Test
+ /*
+ int antall = fread(pszGi,(sizeof(char))*ulGiLen,1,pF);
+ if (antall != 1) {
+ sLesefeil = UT_TRUE;
+ // Bygger streng for feilvisning
+ char szError[256];
+ strerror_s(szError,256,errno);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"%s",szError);
+ if (feof(pF)) {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"Filslutt");
+ }
+ }
+ */
+ }
+
+ if (lNko > 0) {
+ /* Leser øst koordinat */
+ if (fread(pdAust,(sizeof(double))*lNko,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+
+ /* Leser nord koordinat */
+ if (fread(pdNord,(sizeof(double))*lNko,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+
+ /* Leser høyde, KP mm. */
+ if (fread(pInfo,(sizeof(LB_INFO)) * lNko,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+
+ /* Leser PINFO */
+ if (ulPiLen > 0) {
+ if (fread(pszPi,(sizeof(char))*ulPiLen,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+ }
+ }
+
+ if (sLesefeil == UT_TRUE) {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s : %lld",pFil->pszNavn,n64FilPos);
+
+ LC_Error(73,"(LI_ReadRb): ",err().tx);
+ exit(99);
+ }
+
+ pFil->pBase->n64FilPosRb = _ftelli64(pF);
+}
+
+
+/*
+AR-930825
+CH LI_ReadCoordRb Les koordinater fra buffer-fil
+CD ==========================================================================
+CD Formål:
+CD Les koordinatene for en gruppe fra buffer-fil til buffer i minne.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm for filen det skal leses fra.
+CD UT_INT64 n64FilPos i Startposisjon for gruppen i buffer-filen.
+CD unsigned long ulGiLen i Ant tegn GINFO
+CD double *pdAust iu Koord
+CD double *pdNord iu Koord
+CD LB_INFO * pInfo iu Høyde, KP og PINFO-ofsett
+CD long lNko i Ant koord
+CD char *pszPi iu Pinfo-buffer
+CD unsigned long ulPiLen i Ant tegn som skal leses til buffer
+CD
+CD Bruk:
+CD LI_ReadCoordRb(pFil,lFilPos,Sys.pGrInfo->ulGiLen,
+CD Sys.pdAust, Sys.pdNord, Sys.pInfo, Sys.pGrInfo->nko,
+CD Sys.pszPinfo, Sys.pGrInfo->ulPiLen);
+ ==========================================================================
+*/
+void LI_ReadCoordRb(LC_FILADM *pFil, UT_INT64 n64FilPos, unsigned long ulGiLen,
+ double *pdAust, double *pdNord,
+ LB_INFO * pInfo, long lNko,
+ char *pszPi, unsigned long ulPiLen)
+{
+ short sLesefeil = UT_FALSE;
+ FILE *pF;
+
+ /* Åpner RB-fil, og posisjonerer */
+ LI_OpenRb(pFil,n64FilPos+(UT_INT64)ulGiLen,LES);
+ pF = pFil->pBase->pfRb;
+
+ if (lNko > 0) {
+ /* Leser øst koordinat */
+ if (fread(pdAust,(sizeof(double))*lNko,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+
+ /* Leser nord koordinat */
+ if (fread(pdNord,(sizeof(double))*lNko,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+
+ /* Leser høyde, KP mm. */
+ if (fread(pInfo,(sizeof(LB_INFO))*lNko,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+
+ /* Leser PINFO */
+ if (ulPiLen > 0) {
+ if (fread(pszPi,(sizeof(char))*ulPiLen,1,pF) != 1) {
+ sLesefeil = UT_TRUE;
+ }
+ }
+ }
+
+ if (sLesefeil == UT_TRUE) {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s : %lld",pFil->pszNavn,n64FilPos);
+ LC_Error(73,"(LI_ReadCoordRb): ",err().tx);
+ exit(99);
+ }
+
+ pFil->pBase->n64FilPosRb = _ftelli64(pF);
+}
+
+
+
+/*
+AR-930823
+CH LI_BerBufferLen Beregn bufferlengde
+CD ==========================================================================
+CD Formål:
+CD Beregn nødvendig plass for å skrive gitt gruppe til RB.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD unsigned long ulGiLen i Ant tegn som skal leses til buffer
+CD long lNko i Ant koord
+CD unsigned long ulPiLen i Ant tegn som skal leses til buffer
+CD long lLen r Ant byte for å lagre gruppen
+CD
+CD Bruk:
+CD lLen = LI_BerBufferLen(Sys.pGrInfo->ulGiLen,Sys.pGrInfo->nko,
+CD Sys.pGrInfo->ulPiLen);
+ ==========================================================================
+*/
+long LI_BerBufferLen(unsigned long ulGiLen,long lNko,unsigned long ulPiLen)
+{
+ /* GINFO */
+ /* Koordinat Ø og N */
+ /* Høyde, KP og PINFO-ofsett */
+ /* PINFO */
+ return ((long)sizeof(char) * (long)ulGiLen) +
+ (2L * (long)sizeof(double) * lNko) +
+ ((long)sizeof(LB_INFO) * lNko) +
+ ((long)sizeof(char) * (long)ulPiLen);
+
+
+#ifdef TEST
+ long lLen;
+
+ /* GINFO */
+ lLen = (sizeof(char)) * ulGiLen;
+
+ /* Koordinat Ø og N */
+ lLen += 2L * (sizeof(double)) * lNko;
+
+ /* Høyde, KP og PINFO-ofsett */
+ lLen += (sizeof(LB_INFO)) * lNko;
+
+ /* PINFO */
+ lLen += (sizeof(char)) * ulPiLen;
+
+ return lLen;
+#endif
+}
+
+
+/*
+AR-910929
+CH LI_OpenRb Åpne og posisjoner, Rb
+CD ==========================================================================
+CD Formål:
+CD Sjekker at rett Rb-fil er åpen, og posisjoner
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD UT_INT64 n64FilPos i Filposisjon i byte fra filstart
+CD short sModus i Modus (LES / SKRIV)
+CD
+CD Bruk:
+CD void LI_OpenRb(pFil,lFilPos);
+ ==========================================================================
+*/
+static void LI_OpenRb(LC_FILADM *pFil,UT_INT64 n64FilPos,short sModus)
+{
+ if (pFil->pBase->pCurRb != pFil) {
+ // ----- Feil fil er åpen, stenger denne og åpner rett fil
+
+ // Stenger forrige fil
+ if (pFil->pBase->pCurRb != NULL) {
+ fclose(pFil->pBase->pfRb);
+ }
+
+ // Byggr opp fullt filnavn til Rb-filen og åpner filen
+ pFil->pBase->pfRb = LI_OpenIdxFil(pFil, "Rb", ".Idx");
+
+ // Husk current filnummer
+ pFil->pBase->pCurRb = pFil;
+ pFil->pBase->sModusRb = NY;
+ }
+
+ // Posisjoner hvis nødvendig
+ if (pFil->pBase->sModusRb == NY || sModus != pFil->pBase->sModusRb || n64FilPos != pFil->pBase->n64FilPosRb) {
+ //_fseeki64(pFil->pBase->pfRb,n64FilPos,SEEK_SET);
+ UT_SetPos_i64(pFil->pBase->pfRb,n64FilPos);
+
+ pFil->pBase->sModusRb = sModus;
+ }
+}
+
+
+
+/*
+AR-930927
+CH LC_SetModusMerk Setter flag for merking av referert gruppe.
+CD ==========================================================================
+CD Formål:
+CD Setter flag for merking av referert gruppe.
+CD Har innvirkning for virkemåten til:
+CD LC_FAGeo, LC_FASn, og LC_FAGiQuery
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD unsigned short modus i 0 = Ikke merk referert gruppe.
+CD 1 = Merk referert gruppe.
+CD
+CD Bruk:
+CD LC_SetModusMerk(1);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_SetModusMerk(unsigned short usModus)
+{
+ Sys.usMerkRefGr = usModus;
+}
+
+
+/*
+AR-881123
+CH LC_MerkGr Merk en gruppe brukttabellen
+CD ==========================================================================
+CD Formål:
+CH Merk aktuell gruppe i brukttabellen. Hvis flag for merking av referert
+CD gruppe er satt, blir også eventuelle refererte grupper merket.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short sKolonne i Kolonne som skal merkes.
+CD (Lovlig BT_MIN_USER - BT_MAX_USER)
+CD short sBryter i Bryter 1=på, 0=av
+CD long lAntall r Antall grupper merket.
+CD
+CD Bruk:
+CD lAntall = LC_MerkGr(sKolonne,sBryter);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA long LC_MerkGr(short sKolonne,short sBryter)
+{
+ LC_BGR AktBgr,Bgr;
+ long lAntRef;
+ short sGiLin,sRefPos;
+ long l;
+ short ngi;
+ long nko;
+ unsigned short info;
+ long *plRefArr;
+ long lAntall = 0L;
+
+
+ /* Lovlig gruppe */
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ /* Lovlig kolonne */
+ if (sKolonne >= BT_MIN_BT && sKolonne <= BT_MAX_BT) {
+ /* Merk denne gruppen */
+ if (sBryter) {
+ LI_SetBt(Sys.GrId.pFil,Sys.GrId.lNr,sKolonne);
+
+ } else {
+ LI_ClrBt(Sys.GrId.pFil,Sys.GrId.lNr,sKolonne);
+ }
+ lAntall++;
+
+ /* Er det referanser på gruppen og rekursiv merking er aktivisert? */
+ if ((Sys.pGrInfo->info & GI_REF) && Sys.usMerkRefGr) {
+ /* Husk aktuell gruppe */
+ AktBgr = Sys.GrId;
+
+ /* Hent og merk refererte grupper */
+ lAntRef = LC_InqAntRef();
+ plRefArr = (long *) UT_MALLOC(lAntRef * sizeof(long));
+ sGiLin = 2;
+ sRefPos = 0;
+ LC_GetRef(plRefArr,lAntRef,&sGiLin,&sRefPos);
+ for (l=0; l<lAntRef; l++) {
+ if (plRefArr[l] != START_OY && plRefArr[l] != SLUTT_OY) {
+ if (LC_FiSn(AktBgr.pFil,labs(plRefArr[l]),&Bgr)) {
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ lAntall += LC_MerkGr(sKolonne,sBryter);
+ }
+ }
+ }
+ UT_FREE(plRefArr);
+
+ /* Les tilbake aktuell gruppe */
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+ }
+ }
+
+ return lAntall;
+}
+
+
+/*
+AR-931101
+CH LC_ClrPrioritet Slett prioritets-bit
+CD ==========================================================================
+CD Formål:
+CD Slett prioritets-bit.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pGr i Gruppenummer
+CD kolonne short i Kolonne som skal merkes.
+CD (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+CD
+CD Bruk:
+CD LC_ClrPrioritet(pGr,kolonne);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_ClrPrioritet(LC_BGR * pGr,short kolonne)
+{
+ short s;
+ LC_GRTAB_LINJE * pGrt;
+
+ LO_TestFilpeker(pGr->pFil,"ClrPrioritet");
+
+ /* Lovlig gruppe */
+ if (pGr->lNr >= 0L && pGr->lNr < pGr->pFil->lAntGr) {
+ /* Lovlig kolonne */
+ if (kolonne >= 0 && kolonne < LC_MAX_ANT_PRIOR) {
+
+ pGrt = LI_GetGrt(pGr->pFil,pGr->lNr);
+
+ /* Fjern merkingen */
+ s = kolonne / 32;
+ pGrt->ulPrior[s] &= (~ (0x1UL << (kolonne % 32)) );
+
+ }
+
+ } else{ /* Ulovlig gruppe */
+ char errtx[50];
+ UT_SNPRINTF(errtx,50," %ld",pGr->lNr);
+ LC_Error(72,"(LC_ClrPrioritet)",errtx);
+ }
+}
+
+
+/*
+AR-931101
+CH LC_SetPrioritet Sett prioritets-bit
+CD ==========================================================================
+CD Formål:
+CD Sett prioritets-bit.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pGr i Gruppenummer
+CD kolonne short i Kolonne som skal merkes.
+CD (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+CD
+CD Bruk:
+CD LC_SetPrioritet(pGr,kolonne);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_SetPrioritet(LC_BGR * pGr,short kolonne)
+{
+ short s;
+ LC_GRTAB_LINJE * pGrt;
+
+ LO_TestFilpeker(pGr->pFil,"SetPrioritet");
+
+ /* Lovlig gruppe */
+ if (pGr->lNr >= 0L && pGr->lNr < pGr->pFil->lAntGr) {
+ /* Lovlig kolonne */
+ if (kolonne >= 0 && kolonne < LC_MAX_ANT_PRIOR) {
+
+ pGrt = LI_GetGrt(pGr->pFil,pGr->lNr);
+
+ /* Fjern merkingen */
+ s = kolonne / 32;
+ pGrt->ulPrior[s] |= (0x1UL << (kolonne % 32));
+ }
+
+ } else { /* Ulovlig gruppe */
+ char errtx[50];
+ UT_SNPRINTF(errtx,50," %ld",pGr->lNr);
+ LC_Error(72,"(LC_SetPrioritet)",errtx);
+ }
+}
+
+
+/*
+AR-931101
+CH LC_InqPrioritet Hent prioritets-bit
+CD ==========================================================================
+CD Formål:
+CD Hent prioritets-bit.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pGr i Gruppenummer
+CD kolonne short i Kolonne som skal hentes.
+CD (Lovlig 0 til LC_MAX_ANT_PRIOR-1)
+CD short sAvPaa r Av eller På (UT_TRUE = På, UT_FALSE = Av)
+CD
+CD Bruk:
+CD sAvPaa = LC_InqPrioritet(pGr,kolonne);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_InqPrioritet(LC_BGR * pGr,short kolonne)
+{
+ short s;
+ LC_GRTAB_LINJE * pGrt;
+
+ LO_TestFilpeker(pGr->pFil,"InqPrioritet");
+
+ /* Lovlig gruppe */
+ if (pGr->lNr >= 0L && pGr->lNr < pGr->pFil->lAntGr) {
+ /* Lovlig kolonne */
+ if (kolonne >= 0 && kolonne < LC_MAX_ANT_PRIOR) {
+
+ pGrt = LI_GetGrt(pGr->pFil,pGr->lNr);
+
+ /* Returner aktuellt bit */
+ s = kolonne / 32;
+ return ((pGrt->ulPrior[s] & (0x1UL << (kolonne % 32))) == 0UL)? UT_FALSE : UT_TRUE;
+ }
+
+ } else { /* Ulovlig gruppe */
+ char errtx[50];
+ UT_SNPRINTF(errtx,50," %ld",pGr->lNr);
+ LC_Error(72,"(LC_SetPrioritet)",errtx);
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-931101
+CH LC_ErasePrioritet Blank ut prioritets-bit
+CD ==========================================================================
+CD Formål:
+CD Blank ut prioritets-bit.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pGr i Gruppenummer
+CD
+CD Bruk:
+CD LC_ErasePrioritet(pGr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_ErasePrioritet(LC_BGR * pGr)
+{
+ LC_GRTAB_LINJE * pGrt;
+
+ LO_TestFilpeker(pGr->pFil,"ErasePrioritet");
+
+ /* Lovlig gruppe */
+ if (pGr->lNr >= 0L && pGr->lNr < pGr->pFil->lAntGr) {
+
+ pGrt = LI_GetGrt(pGr->pFil,pGr->lNr);
+
+ /* Blank ut alle bit */
+ pGrt->ulPrior[0] = 0x0UL;
+ pGrt->ulPrior[1] = 0x0UL;
+ pGrt->ulPrior[2] = 0x0UL;
+ pGrt->ulPrior[3] = 0x0UL;
+
+ } else { /* Ulovlig gruppe */
+ char errtx[50];
+ UT_SNPRINTF(errtx,50," %ld",pGr->lNr);
+ LC_Error(72,"(LC_SetPrioritet)",errtx);
+ }
+}
+
+
+/*
+AR-931101
+CH LC_EraseAllPrioritet Blank ut ALLE prioritets-bit
+CD ==========================================================================
+CD Formål:
+CD Blank ut alle prioritets-bit på alle gruppene i denne filen.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Filpeker
+CD
+CD Bruk:
+CD LC_EraseAllPrioritet(pFil);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_EraseAllPrioritet(LC_FILADM *pFil)
+{
+ LC_GRTAB_LINJE * pGrt;
+ long lNr;
+
+ LO_TestFilpeker(pFil,"EraseAllPrioritet");
+
+ for (lNr=0L; lNr<pFil->lAntGr; lNr++) {
+
+ pGrt = LI_GetGrt(pFil,lNr);
+
+ /* Blank ut alle bit */
+ pGrt->ulPrior[0] = 0x0UL;
+ pGrt->ulPrior[1] = 0x0UL;
+ pGrt->ulPrior[2] = 0x0UL;
+ pGrt->ulPrior[3] = 0x0UL;
+
+ } /* endfor */
+}
+
+/*
+AR:2005-06-20
+CH LC_DumpBt Dump brukttabellen til stderr
+CD ==========================================================================
+CD Formål:
+CD Dump brukttabellen til stderr
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LC_DumpBt();
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_DumpBt(const char *pszMelding)
+{
+ short ngi,s;
+ long nko;
+ unsigned short info;
+ LC_BGR Bgr,AktBgr;
+ char szTx[1024],szOrd[30];
+ LC_FILADM *pAktuellFil = NULL;
+
+
+ LC_GetGrNr(&AktBgr);
+
+ UT_FPRINTF(stderr,"\n=================================================\n");
+ UT_FPRINTF(stderr,"Dump av brukt-tabellen i FYBA: %s\n", pszMelding);
+ UT_FPRINTF(stderr,"=================================================\n");
+
+ UT_StrCopy(szTx,"\n Snr ",1024);
+
+ for (s=BT_MIN_BT; s<=BT_MAX_BT; ++s)
+ {
+ UT_SNPRINTF(szOrd,30,"%3hd",s);
+ UT_StrCat(szTx,szOrd,1024);
+ }
+ UT_FPRINTF(stderr,"%s\n",szTx);
+
+ UT_FPRINTF(stderr,"---------------------------------------------------------------------------------------------------------\n");
+
+ LC_InitNextBgr(&Bgr);
+
+ /* Alle gruppene i framgrunn */
+ while (LC_NextBgr(&Bgr,LC_FRAMGR)) {
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ // Filnavn
+ if (Bgr.pFil != pAktuellFil)
+ {
+ UT_FPRINTF(stderr,"%s\n",Bgr.pFil->pszNavn);
+ pAktuellFil = Bgr.pFil;
+ }
+ // Snr
+ UT_SNPRINTF(szTx,1024,"%7ld: ", LC_GetSn());
+
+ for (s=BT_MIN_BT; s<=BT_MAX_BT; ++s)
+ {
+ UT_SNPRINTF(szOrd,30,"%3hd",LC_GetBt(&Bgr,s));
+ UT_StrCat(szTx,szOrd,1024);
+ }
+
+ UT_FPRINTF(stderr,"%s\n",szTx);
+ }
+
+ UT_FPRINTF(stderr,"\n=================================================\n");
+
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+}
diff --git a/src/FYBA/FYLO.cpp b/src/FYBA/FYLO.cpp
new file mode 100644
index 0000000..eafbda7
--- /dev/null
+++ b/src/FYBA/FYLO.cpp
@@ -0,0 +1,2529 @@
+/* === AR-920210 ========================================================= */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fylo.c */
+/* Innhold: Åpningsrutiner for FYSAK-PC */
+/* ======================================================================= */
+
+#include "stdafx.h"
+
+#include <math.h>
+#include <fcntl.h>
+
+#include <errno.h>
+#include <ctype.h>
+#include <limits.h>
+
+
+/* --- Lokale rutiner -------------------------- */
+static LC_BASEADM * LO_AppBaseAdm(void);
+static short LO_DelBaseAdm(LC_BASEADM * pBase);
+static LC_FILADM * LO_AppFilAdm(LC_BASEADM * pBase);
+static void LO_DelFilAdm(LC_FILADM *pFil);
+static short LO_OpenKladd(LC_BASEADM * pBase);
+static short LO_InklSos(LC_FILADM *pFil,short vising);
+
+/* --- Globale strukturer ---------------------- */
+LC_SYSTEMADM Sys;
+
+LC_FEILMELDING& err() { /* Feilmeldingsstruktur - construct on first use to prevent */
+ /* it from being uninitialized */
+ static LC_FEILMELDING* err = new LC_FEILMELDING;
+ return *err;
+}
+char retur_str[LC_MAX_SOSI_LINJE_LEN]; /* Returstreng */
+
+volatile short fyba_initiert = 0; /* Bryter for å vise at LC_Init er utført */
+
+
+void (*LC_ErrorAdr)(short ifeilnr, const char* logtx, const char* vartx) = NULL;
+void (*LC_StartMessageAdr)(const char *cfil) = NULL;
+void (*LC_ShowMessageAdr)(double prosent) = NULL;
+void (*LC_EndMessageAdr)(void) = NULL;
+short (*LC_CancelAdr)(void) = NULL;
+
+
+
+/*
+AR-910920
+CH LC_Init Initierer FYBA
+CD =============================================================================
+CD Formål:
+CD Initierer FYBA.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LC_Init();
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_Init(void)
+{
+ fyba_initiert = 1; /* FYBA er initiert */
+
+ /* Husker aktuelle versjonsnummer */
+ UT_StrCopy(Sys.szBaseVer,FYBA_IDENT,LC_BASEVER_LEN);
+ UT_StrCopy(Sys.szIdxVer,FYBA_INDEKS_VERSJON,5);
+
+ /* Ingen aktuell gruppe */
+ Sys.GrId.lNr = INGEN_GRUPPE;
+ Sys.sGrEndra = END_UENDRA;
+
+ Sys.sResPlass = 0;
+ Sys.lMaxSkriv = 0L;
+ Sys.lAntSkriv = 0L;
+ Sys.sNGISmodus = NGIS_NORMAL;
+ Sys.sUtvidModus = LC_UTVID_SIKKER;
+
+ /* Allokerer buffer */
+ Sys.Hode.pszTx = (char*)UT_MALLOC(LC_MAX_GINFO_BUFFER * sizeof(char));
+ Sys.Ginfo.pszTx = (char*)UT_MALLOC(LC_MAX_GINFO_BUFFER * sizeof(char));
+ Sys.pszPinfo = (char*)UT_MALLOC(LC_MAX_PINFO_BUFFER * sizeof(char));
+ Sys.pdAust = (double *)UT_MALLOC(LC_MAX_KOORD * sizeof(double));
+ Sys.pdNord = (double *)UT_MALLOC(LC_MAX_KOORD * sizeof(double));
+ Sys.pInfo = (LB_INFO *)UT_MALLOC(LC_MAX_KOORD * sizeof(LB_INFO));
+
+ /* Initierer lesebuffer for HO-rutinene */
+ Sys.BufAdm.sStatus = LESEBUFFER_TOM;
+
+ /* Initierer navnetabell for HO-rutinene */
+ LN_InitTab(&(Sys.SosiNavn));
+
+ Sys.usMerkRefGr = 0;
+
+ /* Ingen base er åpnet */
+ Sys.pForsteBase = NULL;
+ Sys.pAktBase = NULL;
+}
+
+
+/*
+AR-910920
+CH LC_Close Stenger ned FYBA
+CD =============================================================================
+CD Formål:
+CD Stenger ned FYBA.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LC_Close();
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_Close(void)
+{
+ LC_BASEADM *pBase, *pNesteBase;
+
+ /* Ingen aktuell gruppe */
+ Sys.GrId.lNr = INGEN_GRUPPE;
+
+ if (fyba_initiert != 0) {
+ fyba_initiert = 0; /* FYBA er ikke initiert */
+
+ /* Frigir buffer */
+ UT_FREE(Sys.Hode.pszTx);
+ UT_FREE(Sys.Ginfo.pszTx);
+ UT_FREE(Sys.pszPinfo);
+ UT_FREE(Sys.pdAust);
+ UT_FREE(Sys.pdNord);
+ UT_FREE(Sys.pInfo);
+
+ /* Initierer navnetabell for HO-rutinene */
+ LN_InitTab(&(Sys.SosiNavn));
+
+ /* Stenger eventuelle åpne baser. */
+ for (pBase=Sys.pForsteBase; pBase!=NULL; pBase=pNesteBase) {
+ pNesteBase = pBase->pNesteBase;
+ LC_CloseBase(pBase,RESET_IDX);
+ }
+
+ /* Ingen base er åpnet */
+ Sys.pForsteBase = NULL;
+ Sys.pAktBase = NULL;
+
+ }
+}
+
+
+
+
+
+/*
+AR-910920
+CH LC_SetDefLpfi Ledig plass mellom grupper
+CD ==========================================================================
+CD Formål:
+CD Legger inn standardverdi for antall tegn ledig plass bak gruppe
+CD på .SOS-fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short ant_tegn i Antall tegn ledig plass.
+CD
+CD Bruk:
+CD LC_SetDefLpfi(ant_tegn);
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SetDefLpfi(short ant_tegn)
+{
+ Sys.sResPlass = ant_tegn;
+}
+
+
+/*
+AR-911003
+CH LC_InqDefLpfi Hent ledig plass mellom grupper
+CD ==========================================================================
+CD Formål:
+CD Henter ut standardverdi for antall tegn ledig plass bak gruppe
+CD på .SOS-fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short ant_tegn r Antall tegn ledig plass.
+CD
+CD Bruk:
+CD ant_tegn = LC_InqDefLpfi();
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_InqDefLpfi(void)
+{
+ return Sys.sResPlass;
+}
+
+
+/*
+AR-911021
+CH LC_InqLag Finn hvilet lag aktuell gruppe tilhører
+CD ==========================================================================
+CD Formål:
+CD Finn hvilket lag aktuell gruppe tilhører.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD unsigned short *usLag u "Lag": LC_FRAMGR eller LC_BAKGR
+CD short status r UT_TRUE = OK, UT_FALSE = Ingen aktuell gruppe
+CD
+CD Bruk:
+CD status = LC_InqLag(&usLag);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_InqLag(unsigned short *usLag)
+{
+ /* Er det noen aktuell gruppe? */
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ *usLag = Sys.GrId.pFil->usLag;
+ return UT_TRUE;
+ }
+
+ /* Ingen aktuell gruppe */
+ return UT_FALSE;
+}
+
+
+/*
+AR-920221
+CH LC_InqFilLag Finn hvilet lag en fil tilhører
+CD ==========================================================================
+CD Formål:
+CD Finn hvilket lag en fil tilhører.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Filpeker
+CD unsigned short usLag r "Lag": LC_FRAMGR eller LC_BAKGR
+CD
+CD Bruk:
+CD usLag = LC_InqFilLag(pFil);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA unsigned short LC_InqFilLag(LC_FILADM *pFil)
+{
+ /* LO_TestFilpeker(pFil,"LC_InqFilLag"); */
+ LO_TestFilpeker(pFil,"InqFilLag");
+ return pFil->usLag;
+}
+
+
+/*
+AR-920221
+CH LC_SetFilLag Velg hvilet lag en fil tilhører
+CD ==========================================================================
+CD Formål:
+CD Velg hvilket lag en fil tilhører.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Filpeker
+CD unsigned short usLag i "Lag": LC_FRAMGR eller LC_BAKGR
+CD
+CD Bruk:
+CD LC_SetFilLag(pFil,LC_FRAMGR);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_SetFilLag(LC_FILADM *pFil,unsigned short usLag)
+{
+ short ostat;
+
+ LO_TestFilpeker(pFil,"SetFilLag");
+
+ /* Må lagre aktuell gruppe hvis den er på denne filen og er endret */
+ //if (pFil == Sys.GrId.pFil && Sys.sGrEndra != END_UENDRA) {
+ if (pFil == Sys.GrId.pFil && Sys.GrId.lNr != INGEN_GRUPPE && Sys.sGrEndra != END_UENDRA) {
+ LC_WxGr(SKRIV_OPTIMALT);
+ Sys.sGrEndra = END_UENDRA;
+ }
+
+ /* Tømmer skrivekøa for denne filen */
+ LB_Save(pFil);
+
+ /* Steng eventuell åpen fil */
+ LO_CloseSos(pFil->pBase);
+
+ if ( usLag == LC_FRAMGR) {
+ /* Sjekk at filen kan åpnes med den ønskede aksessen */
+ pFil->pBase->pfSos = UT_OpenFile(pFil->pszNavn,"",UT_UPDATE,UT_OLD,&ostat);
+
+ /* Åpningsfeil */
+ if (ostat != UT_OK) {
+ char szError[256];
+ UT_strerror(szError,256,ostat);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pFil->pszNavn,szError);
+ LC_Error(101,"(LC_SetFilLag)",err().tx);
+
+ } else {
+ // Husk current filnummer mm
+ pFil->pBase->pCurSos = pFil;
+ pFil->sAccess = UT_UPDATE;
+ pFil->usLag = LC_FRAMGR;
+
+ // Husk antall filer i framgrunn/bakgrunn
+ pFil->pBase->sAntFramgrFil++;
+ pFil->pBase->sAntBakgrFil--;
+ }
+
+ } else {
+ pFil->sAccess = UT_READ;
+ pFil->usLag = LC_BAKGR;
+
+ // Husk antall filer i framgrunn/bakgrunn
+ pFil->pBase->sAntBakgrFil++;
+ pFil->pBase->sAntFramgrFil--;
+ }
+}
+
+
+/*
+AR-971114
+CH LC_Backup Lag backup av gitt SOSI-fil
+CD ==========================================================================
+CD Formål:
+CD Lag backup av gitt SOSI-fil.
+CD Kopien legges på en underkatlog med navn "Backup" under den katalogen
+CD SOSI-filen ligger på. Kopien navnes "Filnavn.nnn" der nnn er et
+CD fortløpende nummer fra 000 og oppover. Det første ledige numret blir brukt.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Filpeker
+CD char *pszBackupPath i Katalognavn for lagring av backup.
+CD short sStatus r UT_TRUE = OK
+CD UT_FALSE = Feil.
+CD
+CD Bruk:
+CD sStatus = LC_Backup(pFil, szBackupPath);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_Backup(LC_FILADM *pFil, const char *pszBackupPath)
+{
+ char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ char szBakFil[_MAX_PATH];
+ char szBakKatalog[_MAX_PATH];
+ short sIdx;
+ UT_INT64 Size;
+
+ LO_TestFilpeker(pFil,"Backup");
+
+ /* Må lagre aktuell gruppe hvis den er på denne filen og er endret */
+ //if (pFil == Sys.GrId.pFil && Sys.sGrEndra != END_UENDRA) {
+ if (pFil == Sys.GrId.pFil && Sys.GrId.lNr != INGEN_GRUPPE && Sys.sGrEndra != END_UENDRA) {
+ LC_WxGr(SKRIV_OPTIMALT);
+ Sys.sGrEndra = END_UENDRA;
+ }
+
+ /* Tømmer skrivekøa for denne filen */
+ LB_Save(pFil);
+
+ /* Steng eventuell åpen fil */
+ LO_CloseSos(pFil->pBase);
+
+
+ UT_splitpath(pFil->pszNavn,drive,dir,fname,ext);
+
+ /* Opprett katalogen */
+ if (pszBackupPath != NULL && *pszBackupPath != '\0') {
+ UT_StrCopy(szBakKatalog,pszBackupPath,_MAX_PATH);
+ } else {
+ UT_makepath(szBakKatalog,drive,dir,"Backup","");
+ }
+ UT_CreateDir(szBakKatalog);
+
+ /* Lag standard navn */
+ for (sIdx=0; sIdx<100; sIdx++) {
+
+ UT_SNPRINTF(ext,_MAX_EXT,".b%02hd",sIdx);
+ UT_makepath(szBakFil,"",szBakKatalog,fname,ext);
+
+ /* Kontroller om filen finnes fra før */
+ /* (Gjøres ved å prøve å spørre om filens størrelse) */
+ if (UT_InqPathSize_i64(szBakFil,&Size) != 0) {
+ break; /* Har funnet et ubrukt navn */
+ }
+ }
+
+ /* Kopier */
+ return UT_CopyFile(pFil->pszNavn,szBakFil, UT_FALSE);
+}
+
+
+/*
+AR-910920
+CH LC_MaxSkriv Max skriv før lagring
+CD ==========================================================================
+CD Formål:
+CD Setter max antall skriv uten lagring til SOSI-filen.
+CD (0 = allt skrives direkte til SOSI-filen.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD long antall i Max antall skriv uten lagring til SOSI-filen
+CD
+CD Bruk:
+CD LC_MaxSkriv(antall);
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_MaxSkriv(long antall)
+{
+ Sys.lMaxSkriv = labs(antall);
+}
+
+
+/*
+AR-910920
+CH LC_InqMaxSkriv Max skriv før lagring
+CD ==========================================================================
+CD Formål:
+CD Spørr etter max antall skriv uten lagring til SOSI-filen.
+CD (0 = allt skrives direkte til SOSI-filen.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD long antall i Max antall skriv uten lagring til SOSI-filen
+CD
+CD Bruk:
+CD antall = LC_InqMaxSkriv();
+ =============================================================================
+*/
+SK_EntPnt_FYBA long LC_InqMaxSkriv(void)
+{
+ return Sys.lMaxSkriv;
+}
+
+
+/*
+AR-900924
+CH LC_SetNgisModus Velg NGIS modus
+CD ==========================================================================
+CD Formål:
+CD Velger handteringsmåte for grupper som er merket for oppdatering av NGIS.
+CD Standardverdi fra LC_Init er NGIS_NORMAL.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short modus i Behandlingsmåte:
+CD NGIS_NORMAL (0) = Vanlig handtering
+CD NGIS_SPESIAL (1) = Spesialmodus der det er mulig å lese
+CD grupper som er merka som sletta.
+CD
+CD Bruk:
+CD LC_SetNgisModus(NGIS_NORMAL);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_SetNgisModus(short modus)
+{
+ if (modus == NGIS_SPESIAL){
+ Sys.sNGISmodus = NGIS_SPESIAL;
+ } else{
+ Sys.sNGISmodus = NGIS_NORMAL;
+ }
+}
+
+
+/*
+AR-2003-03-31
+CH LC_GetNgisModus Hent NGIS modus
+CD ==========================================================================
+CD Formål:
+CD Henter handteringsmåte for grupper som er merket for oppdatering av NGIS.
+CD Standardverdi fra LC_Init er NGIS_NORMAL.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short modus r Behandlingsmåte:
+CD NGIS_NORMAL (0) = Vanlig handtering
+CD NGIS_SPESIAL (1) = Spesialmodus der det er mulig å lese
+CD grupper som er merka som sletta.
+CD
+CD Bruk:
+CD modus = LC_GetNgisModus();
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetNgisModus(void)
+{
+ return Sys.sNGISmodus;
+}
+
+
+/*
+AR-900924
+CH LC_GetNgisLag Hent NGIS-LAG
+CD ==========================================================================
+CD Formål:
+CD Henter NGIS-LAG for gitt fil.
+CD Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk strcpy).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Fil det ønskes opplsninger om.
+CD char* pszNgisLag r NGIS-lag.
+CD Tom streng = ..NGIS-LAG er ikke funnet
+CD "0" = Bare leseaksess (..NGIS-LAG 0)
+CD
+CD
+CD Bruk:
+CD pszNgisLag = LC_GetNgisLag(pFil);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA char* LC_GetNgisLag(LC_FILADM *pFil)
+{
+ LO_TestFilpeker(pFil,"LC_GetNgisLag");
+
+ UT_StrCopy(retur_str,pFil->szNgisLag,LC_MAX_SOSI_LINJE_LEN);
+
+ return retur_str;
+}
+
+
+/*
+AR-970109
+CH LC_SetUtvidModus Velg utvis modus
+CD ==========================================================================
+CD Formål:
+CD Velger handteringsmåte for utvidelse av SOSI-filer.
+CD Standardverdi fra LC_Init er LC_UTVID_SIKKER.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short modus i Behandlingsmåte:
+CD LC_UTVID_SIKKER (0) = SOSI-filen stenges og filstørrelsen
+CD oppdateres etter hver gruppe som er
+CD skrevet på slutten av filen.
+CD LC_UTVID_RASK (1) = SOSI-filen stenges IKKE etter hver
+CD gruppe som er skrevet på slutten
+CD av filen.
+CD (Må bare brukes i spesielle tilfeller.)
+CD
+CD Bruk:
+CD LC_SetUtvidModus(LC_UTVID_SIKKER);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_SetUtvidModus(short modus)
+{
+ if (modus == LC_UTVID_SIKKER) {
+ Sys.sUtvidModus = LC_UTVID_SIKKER;
+ } else{
+ Sys.sUtvidModus = LC_UTVID_RASK;
+ }
+}
+
+
+/*
+AR-970109
+CH LC_GetUtvidModus Hent utvis modus
+CD ==========================================================================
+CD Formål:
+CD Henter valgt handteringsmåte for utvidelse av SOSI-filer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short modus r Behandlingsmåte:
+CD LC_UTVID_SIKKER (0) = SOSI-filen stenges og filstørrelsen
+CD oppdateres etter hver gruppe som er
+CD skrevet på slutten av filen.
+CD LC_UTVID_RASK (1) = SOSI-filen stenges IKKE etter hver
+CD gruppe som er skrevet på slutten
+CD av filen.
+CD (Må bare brukes i spesielle tilfeller.)
+CD
+CD Bruk:
+CD short sModus = LC_GetUtvidModus();
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetUtvidModus(void)
+{
+ return Sys.sUtvidModus;
+}
+
+
+/*
+AR-910922
+CH LO_AppBaseAdm Legg til ny BaseAdm
+CD ==========================================================================
+CD Formål:
+CD Allokerer en ny BasAdm-tabell.
+CD Legger tabellen inn i kjeden av base-adm-tabeller.
+CD Velg basen som aktuell base.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BASEADM * pBase r Basepeker.
+CD
+CD Bruk:
+CD pBase = LO_AppBaseAdm();
+ =============================================================================
+*/
+static LC_BASEADM * LO_AppBaseAdm(void)
+{
+ LC_BASEADM * pBase;
+
+ /*
+ * Allokerer og nullstiller minne til blokken
+ */
+ pBase = (LC_BASEADM *) UT_MALLOC(sizeof(LC_BASEADM));
+ memset(pBase,'\0',sizeof(LC_BASEADM));
+
+ /*
+ * Legger blokken inn i kjeden av baser
+ */
+ pBase->pNesteBase = Sys.pForsteBase;
+ Sys.pForsteBase = pBase;
+
+ /* Velg basen som aktuell base */
+ Sys.pAktBase = pBase;
+
+ return pBase;
+}
+
+
+/*
+AR-931110
+CH LC_InqCurBase Aktuell base
+CD ==========================================================================
+CD Formål:
+CD Spørr etter aktuell base.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BASEADM * pBase r Basepeker.
+CD
+CD Bruk:
+CD pBase = LC_InqCurBase();
+ =============================================================================
+*/
+SK_EntPnt_FYBA LC_BASEADM * LC_InqCurBase(void)
+{
+ return Sys.pAktBase;
+}
+
+
+/*
+AR-910924
+CH LO_DelBaseAdm Fjern en BaseAdm
+CD ==========================================================================
+CD Formål:
+CD Fjerner tabellen fra kjeden av base-adm-tabeller og frigir minnet.
+CD OBS! All aktivitet mot basen må være avsluttet før dette kallet.
+CD (Alle sosi-filer må være stengt!)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BASEADM * pBase i Peker til baseadministrasjonsblokk.
+CD short sStatus r UT_TRUE=OK, UT_FALSE=Basen har åpne filer.
+CD
+CD Bruk:
+CD sStatus = LO_DelBaseAdm(pBase);
+ =============================================================================
+*/
+static short LO_DelBaseAdm(LC_BASEADM * pBase)
+{
+ LC_BASEADM * pB;
+
+ /*
+ * Sjekk at basen er tom
+ */
+ if (pBase->pForsteFil != NULL) return UT_FALSE;
+
+ /*
+ * Sjekk at alle filer er stengt
+ */
+ if (pBase->pCurSos != NULL) fclose(pBase->pfSos);
+ if (pBase->pCurRb != NULL) fclose(pBase->pfRb);
+
+ /*
+ * Fjern blokken fra kjeden av Baser
+ */
+
+ /* Første base i systemet */
+ if (Sys.pForsteBase != NULL) {
+ if (Sys.pForsteBase == pBase) {
+ Sys.pForsteBase = pBase->pNesteBase;
+
+ } else {
+ /* Skanner til basen forran den aktuelle */
+ pB = Sys.pForsteBase;
+ while ((pB->pNesteBase != pBase) && (pB->pNesteBase != NULL)) {
+ pB = pB->pNesteBase;
+ }
+
+ /* Heng sammen kjeden */
+ pB->pNesteBase = pBase->pNesteBase;
+ }
+ }
+
+ /*
+ * Frigi minne som var brukt av blokken
+ */
+ UT_FREE(pBase);
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-910922
+CH LC_OpenBase Åpner ny base
+CD ==========================================================================
+CD Formål:
+CD Åpner en base, nullstiller tabellene.
+CD
+CD Hvis basen er kladdebase opprettes en SOSI-fil med en gruppe i basen,
+CD denne brukes som buffer for les / skriv.
+CD Kladdefilen legges på current directory.
+CD Kladdebase brukes bare når alle SOSI-filer åpnes med sekvensiell les/skriv.
+CD
+CD Den nye basen velges som aktuell base.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short sBaseType i Basetype. Konstanter definert:
+CD LC_BASE = Vanlig base.
+CD LC_KLADD = Kladdebase. Brukes bare i spesielle
+CD tilfeller hvis ingen fil åpnes
+CD som LC_BASE_xx.
+CD LC_BASEADM * pBase r Basepeker.
+CD
+CD Bruk:
+CD pBase = LC_OpenBase(sBaseType);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA LC_BASEADM * LC_OpenBase(short sBaseType)
+{
+ LC_BASEADM * pBase;
+
+ /*
+ * Sjekk at FYBA er initiert og at det er gitt lovlig sBaseType
+ */
+ if (fyba_initiert != 1){
+ LC_Error(4,"(LC_OpenBase)","");
+ exit(2);
+ }
+ if (sBaseType != LC_BASE && sBaseType != LC_KLADD) {
+ LC_Error(1,"(LC_OpenBase)","");
+ exit(2);
+ }
+
+ /*
+ * Legg til ny baseadm og sett denne som aktuell base
+ */
+ pBase = LO_AppBaseAdm();
+
+ /*
+ * Initierer
+ */
+ pBase->sType = sBaseType;
+ pBase->lAntGr = 0L;
+ pBase->sAntFramgrFil = 0;
+ pBase->sAntBakgrFil = 0;
+ pBase->pForsteFil = NULL;
+ pBase->pCurSos = NULL;
+ pBase->pfSos = NULL;
+
+ /* Initierer lesebuffer for les mot SOSI-fil */
+ pBase->BufAdm.sStatus = LESEBUFFER_TOM;
+
+ /*
+ * Kladdebase ==> Opprett kladde-SOSI-fil og opprett en gruppe i denne
+ */
+ if (sBaseType == LC_KLADD) {
+ if (! LO_OpenKladd(pBase)) {
+
+ /*
+ * Frigir BaseAdm og returnerer hvis det ikke kan Åpnes kladdebase.
+ */
+ LO_DelBaseAdm(pBase);
+ return NULL;
+ }
+ }
+
+ return pBase;
+}
+
+
+/*
+AR-911003
+CH LC_SelectBase Velg aktuell base
+CD ==========================================================================
+CD Formål:
+CD Velger ny aktuell base.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BASEADM * pBase i Peker til BasAdm.
+CD
+CD Bruk:
+CD LC_SelectBase(pBase);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_SelectBase(LC_BASEADM * pBase)
+{
+ Sys.pAktBase = pBase;
+}
+
+
+/*
+AR-910922
+CH LO_OpenKladd Åpne kladdebase
+CD ==========================================================================
+CD Formål:
+CD Initierer en base for bruk som kladdebase for bare sekvensielle filer,
+CD Nullstiller tabellene.
+CD Oppretter en gruppe i basen, denne brukes som buffer for les / skriv.
+CD Kladdefilen legges på samme directory som indeksfilene.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BASEADM * pBase i Basepeker.
+CD short status r Status. UT_TRUE=OK, UT_FALSE=Feil ved åpning
+CD
+CD Bruk:
+CD status = LO_OpenKladd(pBase);
+ ==========================================================================
+*/
+static short LO_OpenKladd(LC_BASEADM * pBase)
+{
+ short status = UT_TRUE;
+ short o_stat;
+ long snr;
+ FILE *kladdefil;
+ LC_BGR Bgr;
+ char fil[] = "FyKladd.Sos";
+
+ /*
+ * Åpner kladde-sosi-filen
+ */
+ kladdefil = UT_OpenFile(fil,"",UT_UPDATE,UT_UNKNOWN,&o_stat);
+
+ /* Åpnet OK */
+ if (o_stat == UT_OK){
+ ho_New(kladdefil,0,0.0,0.0,0.001,0.001,0.001,-199999.0,-199999.0,1999999.0,1999999.0);
+ fclose(kladdefil);
+ /* Nuller styrevariablene */
+ pBase->sType = LC_BASE; /* Åpner midlertidig som base */
+
+ /* Åpner kladde filen */
+ if (LC_OpenSos(fil,LC_BASE_FRAMGR,LC_NY_IDX,LC_INGEN_STATUS,
+ &(Bgr.pFil),&o_stat)) {
+
+ LC_NyGr(Bgr.pFil,".LINJE",&Bgr,&snr);
+
+ /* Merke for at dette er åpen kladdebase */
+ pBase->sType = LC_KLADD;
+
+ /* Åpningsfeil */
+ } else {
+ UT_DeleteFile(fil);
+ char szError[256];
+ UT_strerror(szError,256,o_stat);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",fil,szError);
+ LC_Error(101,"(LC_OpenKladd)",err().tx);
+ status = UT_FALSE;
+ }
+
+ /* Åpningsfeil på kladdefilen */
+ } else {
+ char szError[256];
+ UT_strerror(szError,256,o_stat);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",fil,szError);
+ LC_Error(101,"(LO_OpenKladd)",err().tx);
+ status = UT_FALSE;
+ }
+
+ return status;
+}
+
+
+/*
+AR-891204
+CH LC_CloseBase Steng base
+CD ==========================================================================
+CD Formål:
+CD Stenger alle filer i basen, og frigir baseadministrasjonsblokken.
+CD Hvis aktuell base blir stengt blir første base i systemet valgt som ny
+CD aktuell base.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD PLCBASEADM pBase i Peker tilBaseAdm
+CD short s_stat i Slutt-status
+CD RESET_IDX = Fjern indeksfilene
+CD SAVE_IDX = Lagrer indeksfilene.
+CD ABORT = Fjerner indeksfilene (ved avbrutt
+CD indeks oppbygging).
+CD
+CD Bruk:
+CD LC_CloseBase(pBase,s_stat);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_CloseBase(LC_BASEADM * pBase,short s_stat)
+{
+ short sAktBaseSletta = (pBase == Sys.pAktBase);
+
+ if (pBase == NULL) {
+ LC_Error(101,"(LC_CloseBase)","LC_CloseBase fikk NULL-peker");
+ return;
+ }
+
+ /*
+ * Steng SOSI-filene
+ */
+ while (pBase->pForsteFil != NULL) {
+ LC_CloseSos(pBase->pForsteFil,s_stat);
+ }
+
+ /*
+ * Kladdebase ==> Slett kladdefilen
+ */
+ if (pBase->sType == LC_KLADD) {
+ UT_DeleteFile("FyKladd.Sos");
+ }
+
+ /*
+ * Frigi base-administrasjonsblokken
+ */
+ LO_DelBaseAdm(pBase);
+
+ /* Aktuell base er sletta, velg første base som ny aktuell base */
+ if (sAktBaseSletta) {
+ Sys.pAktBase = Sys.pForsteBase;
+ }
+}
+
+
+/*
+AR-910922
+CH LO_AppFilAdm Legg til ny FilAdm
+CD ==========================================================================
+CD Formål:
+CD Allokerer en ny FilAdm-tabell.
+CD Legger tabellen inn i kjeden av fil-adm-tabeller.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BASEADM * pBase i Base der filen skal ligge.
+CD LC_FILADM *pFil r Peker til filadministrasjonsblokk.
+CD
+CD Bruk:
+CD pFil = LO_AppFilAdm();
+ =============================================================================
+*/
+static LC_FILADM *LO_AppFilAdm(LC_BASEADM * pBase)
+{
+ LC_FILADM *pFil;
+
+ /*
+ * Allokerer minne til blokken
+ */
+ pFil = (LC_FILADM *) UT_MALLOC(sizeof(LC_FILADM));
+ memset(pFil,'\0',sizeof(LC_FILADM));
+
+ /*
+ * Legger blokken inn i kjeden av filer
+ */
+ if (pBase->pForsteFil == NULL) {
+ pBase->pForsteFil = pFil;
+ } else {
+ pBase->pSisteFil->pNesteFil = pFil;
+ }
+
+ pBase->pSisteFil = pFil;
+ pFil->pNesteFil = NULL;
+
+ /*
+ * Husker hvilken base filen tilhører
+ */
+ pFil->pBase = pBase;
+
+ return pFil;
+}
+
+
+/*
+AR-910924
+CH LO_DelFilAdm Fjern en FilAdm
+CD ==========================================================================
+CD Formål:
+CD Fjerner en fil fra kjeden av fil-adm-tabeller og frigir minnet.
+CD OBS! All aktivitet mot filen og indeksfilene må være avsluttet før dette
+CD kallet.
+CD szBaseVer settes til '\0', slik at dette kan brukes for å sjekke om en
+CD filpeker er lovlig.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til filadministrasjonsblokk.
+CD
+CD Bruk:
+CD LO_DelFilAdm(pFil);
+ =============================================================================
+*/
+static void LO_DelFilAdm(LC_FILADM *pFil)
+{
+ LC_FILADM *pF;
+ LC_BASEADM * pBase = pFil->pBase;
+
+
+ /*
+ * Fjern blokken fra kjeden av filer
+ */
+
+ /* Første fil i basen */
+ if (pBase->pForsteFil == pFil) {
+ pBase->pForsteFil = pFil->pNesteFil;
+ if (pBase->pSisteFil == pFil) {
+ pBase->pSisteFil = NULL;
+ }
+
+ } else {
+ /* Skanner til filen forran den aktuelle */
+ pF = pBase->pForsteFil;
+ while (pF->pNesteFil != pFil) {
+ pF = pF->pNesteFil;
+ }
+
+ /* Heng sammen kjeden */
+ pF->pNesteFil = pFil->pNesteFil;
+ if (pBase->pSisteFil == pFil) {
+ pBase->pSisteFil = pF;
+ }
+ }
+
+ /*
+ * Marker at blokken er frigitt.
+ */
+ pFil->szBaseVer[0] = '\0';
+
+
+ //UT_FPRINTF(stderr,"Frigir minne til FilAdm for: %s\n",pFil->pszNavn);
+
+ /*
+ * Frigi minne som var brukt av blokken
+ */
+ if (pFil->pszNavn != NULL)
+ {
+ UT_FREE(pFil->pszNavn);
+ pFil->pszNavn = NULL;
+ }
+
+ // OBS! midlertidig? AR:2004-05-19
+ //memset(pFil,'\0',sizeof(LC_FILADM));
+
+ UT_FREE(pFil);
+}
+
+
+/*
+AR-920508
+CH LC_OpenSos Åpner og sjekker SOSI-fil
+CD ==========================================================================
+CD Formål:
+CD Åpner en ny fil i aktuell base.
+CD Allokerer minne til ny filadministrasjonsblokk og initierer denne.
+CD Åpner SOSI-filen og legger navn mm. inn i fil-adm.
+CD Leser hodet og tolker det inn i filtabellen.
+CD Hode blir ikke generert for nye filer. Dette kan lages med LC_PutGi, eller
+CD LC_NyttHode eller kopieres fra annen fil, og skrives med LC_WsGr
+CD eller LC_WxGr.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------
+CD char *fil i Filnavn inkl. sti og fil-type
+CD (Hvis fil-type mangler forutsettes .SOS)
+CD short sModus i Filmodus
+CD LC_BASE_FRAMGR = Framgrunnsfil
+CD LC_BASE_BAKGR = Bakgrunnsfil (Bare les)
+CD LC_SEKV_LES = Sekvensiell, les
+CD LC_SEKV_SKRIV = Sekvensiell, skriv
+CD LC_SEKV_UTVID = Sekvensiell, utvid gammel fil
+CD short sNyIdx i Indeksgenerering:
+CD LC_NY_IDX = Tvungen nygenerering
+CD LC_GML_IDX = Bruk gammel .idx hvis den er OK
+CD short sVisStatus i Vis indeksoppbygging
+CD LC_VIS_STATUS = Vis status
+CD LC_INGEN_STATUS = Ikke vis status
+CD LC_FILADM **pFil u Peker til FilAdm blokk.
+CD short *o_stat u Detaljert åpningsstatus:
+CD 0: Åpning og hode OK
+CD >0: Åpningsfeil feilmelding
+CD -1: Åpning OK, tom fil / ikke SOSI-fil
+CD -2: Ikke åpnet, kan ikke bruke append på
+CD tom fil / ikke sosi-fil
+CD -3: (LC_CANCEL): Ikke åpnet,
+CD indeksoppbygging avbrutt med [Esc],
+CD eller feil på filen.
+CD -4: (LC_DUBLIKAT): Filen er i basen fra før (pFil)
+CD -5: (LC_OPPTATT): Filen er åpen i annet program
+CD short status r Åpningsstatus: UT_TRUE = OK
+CD UT_FALSE = Feil, (o_stat gir detalj)
+CD
+CD Bruk:
+CD ist=LC_OpenSos(fil,LC_BASE_FRAMGR,LC_NY_IDX,LC_VIS_STATUS,&pFil,&o_stat);
+CD ist=LC_OpenSos(fil,LC_SEKV_LES,LC_NY_IDX,LC_INGEN_STATUS,&pFil,&o_stat);
+ ==========================================================================
+*/
+
+/// <summary><c>LC_OpenSos</c> Åpner og sjekker SOSI-fil <c>FYBA</c> biblioteket.
+/// </summary>
+/// <param name="fil">Filnavn inkl. sti og fil-type (Hvis fil-type mangler forutsettes .SOS)</param>
+SK_EntPnt_FYBA short LC_OpenSos(const char *fil,short sModus,short sNyIdx,short sVisStatus,
+ LC_FILADM **pFil, short *o_stat)
+{
+ short sAccess;
+ UT_INT64 sluttpos;
+ double nv_a,nv_n,oh_a,oh_n;
+ char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ char szSosFil[_MAX_PATH];
+ LC_FILADM *pFi;
+ UT_INT64 Size;
+ short sStatus;
+
+ /*
+ * Sjekk at FYBA er initiert
+ */
+ if (fyba_initiert != 1) {
+ LC_Error(4,"(LC_OpenSos)","");
+ exit(2);
+ }
+ if (Sys.pForsteBase == NULL) {
+ LC_Error(5,"(LC_OpenSos)","");
+ exit(2);
+ }
+
+ if (Sys.pAktBase->sType == LC_KLADD) {
+ if (sModus == LC_BASE_FRAMGR || sModus == LC_BASE_BAKGR) {
+ LC_Error(106,"(LC_OpenSos)",fil);
+ exit(2);
+ }
+ }
+
+ *o_stat = 0;
+ LO_CloseSos(Sys.pAktBase); /* Steng eventuell åpen fil */
+
+ /*
+ * Bygg opp fullstendig filnavn
+ */
+ UT_FullPath(szSosFil,fil,_MAX_PATH);
+ UT_splitpath(szSosFil,drive,dir,fname,ext);
+ if (*ext == '\0') UT_StrCopy(ext, ".sos",_MAX_EXT);
+ UT_makepath(szSosFil,drive,dir,fname,ext);
+ /* UT_StrUpper(szSosFil); */
+
+ /* UT_FPRINTF(stderr,"Åpner: %s\n",szSosFil); */
+
+ /* Sjekk om filen er i basen fra før */
+ if ((*pFil = LC_GetFiNr(szSosFil)) != NULL) {
+ *o_stat = LC_DUBLIKAT;
+ return UT_FALSE;
+ }
+
+ /*
+ * Tolk aksess for UT_OpenFile
+ */
+ if (sModus == LC_BASE_BAKGR || sModus == LC_SEKV_LES) {
+ sAccess = UT_READ;
+ } else {
+ sAccess = UT_UPDATE;
+ }
+
+ /*
+ * Fil som bare skal leses må finnes fra før.
+ */
+ if (sModus == LC_SEKV_LES || sModus == LC_BASE_BAKGR) {
+ if (UT_InqPathSize_i64(szSosFil,&Size) != UT_OK) {
+ *o_stat=-2;
+ return UT_FALSE;
+ }
+ }
+
+ /*
+ * Sekvensiell utvid krever at filen finnes og at det er lov å skrive.
+ */
+ if (sModus == LC_SEKV_UTVID) {
+ if (UT_InqPathSize_i64(szSosFil,&Size) != UT_OK) {
+ *o_stat=-2;
+ return UT_FALSE;
+ }
+ }
+
+ /*
+ * Basefil og gammel indeks, krever at filene finnes.
+ */
+ if ((sModus == LC_BASE_FRAMGR && sNyIdx == LC_GML_IDX) ||
+ (sModus == LC_BASE_BAKGR && sNyIdx == LC_GML_IDX)) {
+ /* Må også sjekke lovlig aksess ? */
+ if (UT_InqPathSize_i64(szSosFil,&Size) != UT_OK) {
+ sNyIdx = LC_NY_IDX;
+ } else {
+ if (! LI_TestIdx(szSosFil)) {
+ sNyIdx = LC_NY_IDX;
+ }
+ }
+ }
+
+ /*
+ * Legg til ny Filadm
+ */
+ pFi = *pFil = LO_AppFilAdm(Sys.pAktBase);
+
+ /*
+ * Initierer
+ */
+ UT_StrCopy(pFi->szBaseVer,FYBA_IDENT,LC_BASEVER_LEN);
+ UT_StrCopy(pFi->szIdxVer,FYBA_INDEKS_VERSJON,5);
+ pFi->sSosiVer = FYBA_SOSI_VERSJON;
+ UT_StrCopy(pFi->szDato,"*",LC_DATO_LEN);
+ pFi->SosiNiv[0] = 0;
+ pFi->SosiNiv[1] = 0;
+ pFi->pszNavn = (char*)UT_MALLOC(strlen(szSosFil)+1);
+ UT_StrCopy(pFi->pszNavn,szSosFil,strlen(szSosFil)+1);
+ pFi->sAccess = sAccess;
+ pFi->lMaxSnr = NYTT_SNR; /* Ikke noe akt. snr */
+ pFi->lAntGr = 0L;
+ pFi->sTegnsett = TS_DOSN8; /* Standard når ikke annet er gitt */
+ pFi->n64NesteLedigRbPos = 0;
+ *pFi->szNgisLag = '\0';
+
+ pFi->pIdx = NULL;
+ pFi->pGeoRN=NULL;
+
+ if (sModus == LC_BASE_FRAMGR) {
+ pFi->usLag = LC_FRAMGR;
+ } else if (sModus == LC_BASE_BAKGR) {
+ pFi->usLag = LC_BAKGR;
+ } else {
+ pFi->usLag = LC_SEKV;
+ }
+
+ /* Åpner .SOS-filen */
+ pFi->pBase->pfSos = UT_OpenFile(pFi->pszNavn,"",sAccess,UT_OLD,o_stat);
+
+ /* Ukjent fil med skriveaksess ==> opprett filen */
+ if (*o_stat == ENOENT && sAccess == UT_UPDATE){
+ pFi->pBase->pfSos = UT_OpenFile(pFi->pszNavn,"",sAccess,UT_UNKNOWN,o_stat);
+ }
+ pFi->pBase->pCurSos = pFi;
+
+
+ if (*o_stat == UT_OK) { /* Gammel file er åpnet OK */
+ /* Sjekk at SOSI-filen er OK */
+ if (ho_TestSOSI(pFi->pBase->pfSos,&sluttpos) == UT_FALSE){
+ *o_stat = -1; /* Tom fil */
+ }
+
+ } else {
+ /* Åpningsfeil på SOSI-filen ==> avbryter */
+ char szError[256];
+ UT_strerror(szError,256,*o_stat);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pFi->pszNavn,szError);
+ LC_Error(101,"(LC_OpenSos)",err().tx);
+ pFi->pBase->pCurSos = NULL;
+ LO_DelFilAdm(pFi);
+ *pFil = NULL;
+ return UT_FALSE;
+ }
+
+
+ /* Eksisterende fil er åpnet OK, hent tegnsett */
+ if (*o_stat == UT_OK) {
+ ho_GetTegnsett(pFi->pBase->pfSos,&(pFi->sTegnsett));
+
+ /* Tom fil, pr. def. DOSN8 når ikke gitt annet tegnsett */
+ } else if (*o_stat == -1) {
+ pFi->sTegnsett = TS_DOSN8;
+ }
+
+ /* Område */
+ if (*o_stat == UT_OK) {
+ /* Eksisterende fil er åpnet OK, hent område */
+ ho_GetOmr(pFi->pBase->pfSos,&nv_a,&nv_n,&oh_a,&oh_n);
+ pFi->Omraade.dMinAust = nv_a;
+ pFi->Omraade.dMinNord = nv_n;
+ pFi->Omraade.dMaxAust = oh_a;
+ pFi->Omraade.dMaxNord = oh_n;
+
+ } else {
+ /* Tom fil, pr. def. ingen utstrekning */
+ pFi->Omraade.dMinAust = pFi->Omraade.dMinNord = (double)LONG_MAX;
+ pFi->Omraade.dMaxAust = pFi->Omraade.dMaxNord = (double)LONG_MIN;
+ }
+
+ /* Filen er åpnet OK */
+ if (*o_stat == UT_OK || *o_stat == -1) {
+
+ /* Sett aktuell filposisjon mm. */
+ if (sModus == LC_SEKV_UTVID) {
+ if (*o_stat == -1) { /* Kan ikke utvide tom fil */
+ *o_stat=-2;
+ return UT_FALSE;
+ }
+
+ /* Aktuell posisjon settes til slutten av filen */
+ pFi->n64AktPos = sluttpos;
+
+ /* ----- Oppdater filtabellen ----- */
+
+ /* ..TRANSPAR */
+ pFi->TransMaske = LC_TR_ALLT;
+ ho_GetTransEx(pFi->pBase->pfSos,&(pFi->TransMaske),&(pFi->TransPar));
+
+ /* Ikke noe akt. snr */
+ pFi->lMaxSnr = NYTT_SNR;
+
+ /* Kvalitet */
+ ho_GetKvalitet(pFi->pBase->pfSos,&(pFi->Kvalitet.sMetode),
+ &(pFi->Kvalitet.lNoyaktighet),
+ &(pFi->Kvalitet.sSynbarhet),
+ &(pFi->Kvalitet.sHoydeMetode),
+ &(pFi->Kvalitet.lHoydeNoyaktighet));
+
+
+ } else { /* Annen aksess */
+ /* Aktuell posisjon settes til starten av filen */
+ pFi->n64AktPos = 0L;
+ /* I dette tilfellet oppdateres filtabellen */
+ /* når hodet leses/skrives fra/til SOSI-filen */
+ /* Denne brukes senere for å sjekke at hode er skrevet til filen */
+ pFi->TransPar.dEnhet = 0.0;
+ }
+ }
+
+ /*
+ * Basefil, handter indeks.
+ */
+ if (sModus == LC_BASE_FRAMGR || sModus == LC_BASE_BAKGR) {
+
+ if (sNyIdx == LC_GML_IDX) {
+ // Lagret indeks, les inn indeksfilene
+ sStatus = LI_OpenRead(pFi);
+
+ if (sStatus == UT_OK) {
+ // Åpnet OK, nullstill prioritetstabellen
+ LC_EraseAllPrioritet(pFi);
+
+ } else if (sStatus == LI_OPPTATT) {
+ // Filen er åpen i et annet program
+ LO_CloseSos(Sys.pAktBase); // Steng eventuell åpen fil
+ LO_DelFilAdm(*pFil); // Frigir filadministrasjonsblokken
+ *pFil = NULL;
+ *o_stat = LC_OPPTATT;
+ return UT_FALSE;
+
+ } else {
+ // Feil indeksversjon, størrelse eller oppdateringstid på SOSI-filen
+ // - Må bygge ny indeks
+ LI_Close(pFi,RESET_IDX);
+ sNyIdx = LC_NY_IDX;
+
+ /*
+ * Må initiere deler av fil-adm på nytt.
+ */
+ pFi->lAntGr = 0L;
+ pFi->n64NesteLedigRbPos = 0;
+ pFi->lMaxSnr = NYTT_SNR; /* Ikke noe akt. snr */
+ pFi->SosiNiv[0] = 0;
+ pFi->SosiNiv[1] = 0;
+ }
+ }
+
+
+ if (sNyIdx == LC_NY_IDX) {
+ LI_OpenInit(pFi); /* Initierer LI-systemet */
+ LN_InitTab(&(pFi->SosiNavn)); /* Initierer navne-systemet */
+
+ if (*o_stat != -1) { /* Filen har innhold */
+ /* Bygg indekser for filen, m. vising av status */
+ pFi->usDataFeil = 0;
+ if (! LO_InklSos(pFi,sVisStatus)) {
+ /* Indeksoppbygging er avbrutt */
+ /* Steng filen */
+ LC_CloseSos(pFi,RESET_IDX);
+ *pFil = NULL;
+ *o_stat = LC_CANCEL;
+ return UT_FALSE;
+ }
+
+ /* Gi melding om ulovlig referanse */
+ if ((pFi->usDataFeil & LC_DATAFEIL_REF) != 0) {
+ LC_Error(56,"(LC_OpenSos)",pFi->pszNavn);
+ }
+
+ /* Gi melding om ulovlig bue */
+ if ((pFi->usDataFeil & LC_DATAFEIL_BUE) != 0) {
+ LC_Error(59,"(LC_OpenSos)",pFi->pszNavn);
+ }
+ }
+ }
+
+ /*
+ * Sekvensiell fil, initier navnesystemet.
+ */
+ } else {
+ LN_InitTab(&(pFi->SosiNavn));
+ }
+
+
+ // Husk antall filer i framgrunn/bakgrunn
+ if (pFi->usLag & LC_FRAMGR) pFi->pBase->sAntFramgrFil++;
+ else if (pFi->usLag & LC_BAKGR) pFi->pBase->sAntBakgrFil++;
+
+
+ // Initierer filtype
+ LC_SetFilType(pFi,LC_FILTYPE_UKJENT);
+ return UT_TRUE;
+}
+
+
+/*
+AR-910925
+CH LO_ReopenSos Reåpne SOSI-fil
+CD ==========================================================================
+CD Formål:
+CD Åpner på nytt en av filene i filtabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm-blokk
+CD
+CD Bruk:
+CD LO_ReopenSos(pFil);
+ ==========================================================================
+*/
+void LO_ReopenSos(LC_FILADM *pFil)
+{
+ short ostat;
+
+ if (pFil->pBase->pCurSos != pFil) {
+ if (pFil->pBase->pCurSos != NULL){ /* Stenger forrige fil */
+ fclose(pFil->pBase->pfSos);
+ }
+
+ /* Åner filen */
+ pFil->pBase->pfSos = UT_OpenFile(pFil->pszNavn,"",pFil->sAccess,UT_OLD,&ostat);
+
+ /* Åpningsfeil */
+ if (ostat != UT_OK) {
+ LC_Error(6,"(LO_ReopenSos)",pFil->pszNavn);
+ exit(2);
+ }
+
+ /* Husk current filnummer */
+ pFil->pBase->pCurSos = pFil;
+ }
+}
+
+
+/*
+AR-881027
+CH LC_CloseSos Steng SOSI-fil
+CD ==========================================================================
+CD Formål:
+CD Stenger en SOSI-fil, og fjerner den fra basen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm-blokk
+CD short s_stat i Slutt-status
+CD RESET_IDX = Fjern indeksfilene
+CD SAVE_IDX = Lagrer indeksfilene.
+CD
+CD Bruk:
+CD LC_CloseSos(pFil,SAVE_IDX);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_CloseSos(LC_FILADM *pFil,short s_stat)
+{
+ LC_BGR Bgr,AktBgr;
+ short ngi,linje_nr;
+ long nko;
+ unsigned short info;
+ char szSosiNiv[10];
+ LC_BOKS * pB;
+
+
+ /* LO_TestFilpeker(pFil,"LC_CloseSos"); */
+ LO_TestFilpeker(pFil,"CloseSos");
+
+ /*
+ * Hvis aktuell gruppe er på denne filen
+ */
+ if (Sys.GrId.lNr != INGEN_GRUPPE && Sys.GrId.pFil == pFil) {
+
+ if (pFil->pBase->sType == LC_BASE) {
+ /* Hvis gruppen er endra, skriv den til filen */
+ if (Sys.sGrEndra != END_UENDRA) {
+ if (LC_WxGr(SKRIV_SOSI) == UT_FALSE) {
+ // Indeksfilene ikke er brukbare
+ s_stat = RESET_IDX;
+ }
+ }
+ }
+ /* Vis at det ikke er noen aktuell gruppe lenger */
+ Sys.GrId.lNr = INGEN_GRUPPE;
+ }
+
+ // Husk antall filer i framgrunn/bakgrunn
+ if (pFil->usLag & LC_FRAMGR) pFil->pBase->sAntFramgrFil--;
+ else if (pFil->usLag & LC_BAKGR) pFil->pBase->sAntBakgrFil--;
+
+ /*
+ * Sikrer oppdatering av sosi-filen
+ */
+ if (pFil->pBase->sType == LC_BASE) {
+ LB_Save(pFil);
+ }
+
+ /* Oppdater ..SOSI-NIVÅ i fil-hodet */
+ if (pFil->SosiNiv[1] > pFil->SosiNiv[0]) {
+ AktBgr = Sys.GrId;
+ Bgr.pFil = pFil;
+ Bgr.lNr = 0;
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ UT_SNPRINTF (szSosiNiv, 10, "%d", (int)pFil->SosiNiv[1]);
+ ngi = LC_PutGP("..SOSI-NIVÅ", szSosiNiv, &linje_nr);
+ LC_WxGr(SKRIV_SOSI);
+
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ } else {
+ Sys.GrId = AktBgr;
+ }
+ }
+
+ /* UT_FPRINTF(stderr,"Stenger: %s\n",pFil->pszNavn); */
+ LO_CloseSos(pFil->pBase);
+
+ /*
+ * Indeks skal alltid fjernes for kladdefilen i kladdebase
+ */
+ if (pFil->pBase->sType == LC_KLADD && (pFil->usLag & LC_FRAMGR)) {
+ s_stat = RESET_IDX;
+ }
+
+ /*
+ * Fjern indeksfilene / lagre indeks og steng filer
+ */
+ if (pFil->usLag != LC_SEKV) {
+ LI_Close(pFil,s_stat);
+ }
+
+ /*
+ * Frigi fil-administrasjonsblokken
+ */
+ LO_DelFilAdm(pFil);
+
+ /* Oppdaterer omskrevet boks for basen */
+ if (Sys.pAktBase != NULL) { /* er basen fortsatt aapent? */
+ pFil = Sys.pAktBase->pForsteFil;
+ pB = &(Sys.pAktBase->Omraade);
+ pB->dMinAust = pB->dMinNord = (double)LONG_MAX;
+ pB->dMaxAust = pB->dMaxNord = (double)LONG_MIN;
+ while (pFil != NULL) {
+ /* Er filen i rett lag? (Hoper over sekvensielle filer) */
+ if (pFil->usLag & (LC_FRAMGR | LC_BAKGR)) {
+ /* Filen inneholder data */
+ if (pFil->pGeoRN != NULL) {
+ pB->dMinAust = min(pB->dMinAust,pFil->Omraade.dMinAust);
+ pB->dMinNord = min(pB->dMinNord,pFil->Omraade.dMinNord);
+ pB->dMaxAust = max(pB->dMaxAust,pFil->Omraade.dMaxAust);
+ pB->dMaxNord = max(pB->dMaxNord,pFil->Omraade.dMaxNord);
+ }
+ }
+ pFil = pFil->pNesteFil;
+ }
+ }
+}
+
+
+/*
+AR:2009-03-20
+CH LC_FcloseSos Steng åpen SOSI-fil i filsystemet
+CD ==========================================================================
+CD Formål:
+CD Denne rutinen brukes til å sikre at en fil er oppdatert og stengt i filsystemet,
+CD slik at SOSI-filen kan leses fra andre program.
+CD
+CD OBS!
+CD Stenger bare filen i filsystemet.
+CD Filen er fortsatt åpen i basen.
+CD FYBA åpner automatisk filen på nytt når det er behov for dette.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm-blokk
+CD
+CD Bruk:
+CD LC_FcloseSos(pFil);
+==========================================================================
+*/
+SK_EntPnt_FYBA void LC_FcloseSos(LC_FILADM *pFil)
+{
+ LO_TestFilpeker(pFil,"LC_FcloseSos");
+
+ // Må lagre aktuell gruppe hvis den er på denne filen og er endret
+ if (pFil == Sys.GrId.pFil && Sys.GrId.lNr != INGEN_GRUPPE && Sys.sGrEndra != END_UENDRA) {
+ LC_WxGr(SKRIV_OPTIMALT);
+ Sys.sGrEndra = END_UENDRA;
+ }
+
+ // Tømmer skrivekøa for denne filen
+ LB_Save(pFil);
+
+ // Steng eventuell åpen fil
+ LO_CloseSos(pFil->pBase);
+}
+
+
+/*
+AR-911001
+CH LO_CloseSos Steng current SOSI-fil
+CD ==========================================================================
+CD Formål:
+CD Stenger current SOSI-fil i basen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BASEADM * pBase i Peker til BaseAdm-blokk
+CD
+CD Bruk:
+CD LO_CloseSos(pBase);
+ ==========================================================================
+*/
+void LO_CloseSos(LC_BASEADM * pBase)
+{
+ if (pBase->pCurSos != NULL) {
+ fclose(pBase->pfSos);
+ pBase->pCurSos = NULL;
+ }
+}
+
+
+/*
+AR-890510
+CH LO_BeFt Beregn omregnings-parametre
+CD ==========================================================================
+CD Formål:
+CD Oppdaterer filtabellen med hodeinformasjoner fra aktuell gruppe,
+CD som må være SOSI-filens hode.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm-blokk
+CD
+CD Bruk:
+CD LO_BeFt(pFil);
+ ==========================================================================
+*/
+void LO_BeFt(LC_FILADM *pFil)
+{
+ double nva,nvn,oha,ohn;
+ short lin;
+ char *cp;
+
+
+ /* Transformasjonsparametre */
+ pFil->TransMaske = LC_TR_ALLT;
+ LC_GetTransEx(&(pFil->TransMaske),&(pFil->TransPar));
+
+ /* Område */
+ LC_GetOmr(&nva,&nvn,&oha,&ohn);
+ pFil->Omr.dMinAust = nva;
+ pFil->Omr.dMinNord = nvn;
+ pFil->Omr.dMaxAust = oha;
+ pFil->Omr.dMaxNord = ohn;
+
+ /* Kvalitet */
+ LC_GetKvalitet(&(pFil->Kvalitet.sMetode),
+ &(pFil->Kvalitet.lNoyaktighet),
+ &(pFil->Kvalitet.sSynbarhet),
+ &(pFil->Kvalitet.sHoydeMetode),
+ &(pFil->Kvalitet.lHoydeNoyaktighet));
+
+ /* Tegnsett */
+ LC_GetTegnsett(&(pFil->sTegnsett));
+
+ /* SOSI-VERSJON */
+ lin=2;
+ if ((cp = LC_GetGP("..SOSI-VERSJON",&lin,Sys.pGrInfo->ngi)) != NULL) {
+ pFil->sSosiVer = (short)(strtod(cp,&cp)*100.0);
+ } else {
+ pFil->sSosiVer = FYBA_SOSI_VERSJON;
+ }
+
+ // DATO
+ lin=2;
+ if ((cp = LC_GetGP("..DATO",&lin,Sys.pGrInfo->ngi)) != NULL) {
+ UT_StrCopy(pFil->szDato,cp,LC_DATO_LEN);
+ } else {
+ UT_StrCopy(pFil->szDato,"*",LC_DATO_LEN);
+ }
+
+ /* SOSI-NIVÅ */
+ lin=2;
+ if ((cp = LC_GetGP("..SOSI-NIVÅ",&lin,Sys.pGrInfo->ngi)) != NULL) {
+ pFil->SosiNiv[0] = (char)(strtol(cp,&cp,10));
+ } else {
+ pFil->SosiNiv[0] = 0;
+ }
+
+ /* ..NGIS-LAG */
+ UT_StrCopy(pFil->szNgisLag,LH_GetNgisLag(),LC_NGISLAG_LEN);
+}
+
+
+/*
+AR-911003
+CH LC_GetBaOm Hent baseområde
+CD ==========================================================================
+CD Formål:
+CD Henter baseområdet for aktuell base (Sum av filhodene).
+CD Sekvensielle filer regnes ikke med.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR og /eller LC_BAKGR
+CD (Bruk "|" for å kombinere.)
+CD double *nva u Nedre venstre øst
+CD double *nvn u Nedre venstre nord
+CD double *oha u Øvre høyre øst
+CD double *ohn u Øvre høyre nord
+CD short sStatus r UT_TRUE=OK, UT_FALSE=ingen fil
+CD
+CD Bruk:
+CD sStatus = LC_GetBaOm(LC_FRAMGR,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetBaOm(unsigned short usLag,double *nva,double *nvn,double *oha,
+ double *ohn)
+{
+ double na,nn,oa,on;
+ LC_FILADM *pFil;
+ short sAntall = 0;
+
+ *nvn = LONG_MAX;
+ *nva = LONG_MAX;
+ *ohn = LONG_MIN;
+ *oha = LONG_MIN;
+
+ LC_InitNextFil(&pFil);
+ while (LC_NextFil(&pFil,usLag)) {
+ sAntall++;
+ if (LC_GetFiOm(pFil,&na,&nn,&oa,&on)) {
+ *nva = min (*nva, na);
+ *nvn = min (*nvn, nn);
+ *oha = max (*oha, oa);
+ *ohn = max (*ohn, on);
+ }
+ }
+
+ return (sAntall > 0);
+}
+
+
+/*
+AR-910928
+CH LC_GetFiOm Hent område fra fil-hode
+CD ==========================================================================
+CD Formål:
+CD Hent område for en SOSI-fil i basen.
+CD Fungerer ikke mot sekvensielle filer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD double nva u Nedre venstre øst
+CD double nvn u Nedre venstre nord
+CD double oha u Øvre høyre øst
+CD double ohn u Øvre høyre nord
+CD short ist r Status (UT_TRUE=OK, UT_FALSE=sekvensiell fil)
+CD
+CD Bruk:
+CD ist = LC_GetFiOm(pFil,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetFiOm(LC_FILADM *pFil,double *nva,double *nvn,double *oha,double *ohn)
+{
+ /* LO_TestFilpeker(pFil,"LC_GetFiOm"); */
+ LO_TestFilpeker(pFil,"LC_GetFiOm");
+
+ if (pFil->usLag != LC_SEKV) {
+ *nva = pFil->Omr.dMinAust;
+ *nvn = pFil->Omr.dMinNord;
+ *oha = pFil->Omr.dMaxAust;
+ *ohn = pFil->Omr.dMaxNord;
+ return UT_TRUE;
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-911001
+CH LO_InklSos Inkluder SOSI-fil i base
+CD ==========================================================================
+CD Formål:
+CD Hjelperutine for LC_OpenSos.
+CD Bygger indeks og klargjør filen for basen.
+CD Prosessen kan avbrytes med <ESC>, og rutinen returnerer da UT_FALSE.
+CD Aktuell gruppe blir brukt under prosessen, og etterpå er det ingen
+CD aktuell gruppe tilgjengelig.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short sVisStatus i Vis indeksoppbygging
+CD LC_VIS_STATUS = Vis status
+CD LC_INGEN_STATUS = Ikke vis status
+CD short sStatus r Status: UT_TRUE=OK, UT_FALSE=avbrutt eller feil
+CD
+CD Bruk:
+CD ant_bgr = LO_InklSos(pFil,LC_VIS_STATUS);
+ ==========================================================================
+*/
+static short LO_InklSos(LC_FILADM *pFil,short sVisStatus)
+{
+ unsigned long ulLedigPlass;
+ short siste,ngi,nivaa;
+ long nko;
+ unsigned short info;
+ UT_INT64 pos,fpos;
+ long lGrNr;
+ LC_BGR Bgr;
+ LC_GRTAB_LINJE *pForrigeGrInfo,*pGrInfo;
+ LC_BOKS * pB;
+ short avbrutt = 0;
+ double lengde_faktor = 0.0;
+ short sStatus = UT_TRUE;
+ short pnr = 1;
+
+ // Hvis aktuell gruppe er endret, skriv den
+ if (Sys.GrId.lNr != INGEN_GRUPPE && Sys.sGrEndra != END_UENDRA) {
+ LC_WxGr(SKRIV_OPTIMALT);
+ }
+
+ LO_ReopenSos(pFil); // Sikkrer at filen er åpen - Kan ha blitt stengt i LC_WxGr
+
+ Sys.GrId.pFil = pFil;
+
+ // ----- Søk fram til .HODE
+ if (ho_FinnHode(pFil->pBase->pfSos, &pos) == UT_TRUE) {
+
+ // ----- Bygg indeks
+ /* Sikkrer at ny lesing startes */
+ _fseeki64(pFil->pBase->pfSos,pos,SEEK_SET);
+
+ /* Ledetekst */
+ if (sVisStatus == LC_VIS_STATUS) {
+ LC_StartMessage(pFil->pszNavn);
+ fpos = _ftelli64(pFil->pBase->pfSos);
+ _fseeki64(pFil->pBase->pfSos,-1,SEEK_END);
+ lengde_faktor = 100.0 / (double)_ftelli64(pFil->pBase->pfSos);
+ _fseeki64(pFil->pBase->pfSos,fpos,SEEK_SET);
+ }
+
+ pForrigeGrInfo = NULL;
+
+ do {
+ if (pFil->lAntGr < LC_MAX_GRU) { /* Klargjør for lesing */
+
+ /* Sjekk ledig diskplass for SOSI-filer */
+
+ if (pFil->sAccess == UT_UPDATE) {
+ UT_InqAvailSize(pFil->pszNavn,&ulLedigPlass);
+ if (ulLedigPlass < ((unsigned long)LC_MAX_KOORD * (unsigned long)120)) {
+ /* Disken er snart full */
+ LC_Error(93,"(LO_InklSos)",pFil->pszNavn);
+ }
+ }
+
+ Sys.GrId.lNr = pFil->lAntGr++; /* (Nr er 1 mindre enn antall) */
+
+ Sys.pGrInfo = LI_AppGrt(pFil,Sys.GrId.lNr);
+
+
+ Sys.pGrInfo->sosi_st = pos;
+
+
+
+ /* Les gruppen */
+ siste = LB_RGru(pFil,pos,&pos);
+
+ /* Buffer for GetPP er ødelagt */
+ Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Grafisk vising av mengde lest */
+ if (sVisStatus == LC_VIS_STATUS) {
+ LC_ShowMessage((double)pos * lengde_faktor);
+ }
+
+ /* Gruppe lest OK */
+ if ( ! siste) {
+ LC_OppdaterEndret(O_GINFO);
+ nivaa = 2;
+ LC_GetCurKvalitet(Sys.GrId.pFil,&nivaa,pnr,
+ &Sys.pGrInfo->Kvalitet.sMetode,
+ &Sys.pGrInfo->Kvalitet.lNoyaktighet,
+ &Sys.pGrInfo->Kvalitet.sSynbarhet,
+ &Sys.pGrInfo->Kvalitet.sHoydeMetode,
+ &Sys.pGrInfo->Kvalitet.lHoydeNoyaktighet);
+
+ /* Oppdater buffer-fil */
+ Sys.GrId.pFil->lSisteGrRb = Sys.GrId.lNr;
+ Sys.pGrInfo->rb_st = Sys.GrId.pFil->n64NesteLedigRbPos;
+ Sys.pGrInfo->rb_forrige_gr = Sys.GrId.lNr - 1L;
+ Sys.pGrInfo->rb_neste_gr = INGEN_GRUPPE;
+ Sys.pGrInfo->ulPrior[0] = 0UL;
+ Sys.pGrInfo->ulPrior[1] = 0UL;
+ Sys.pGrInfo->ulPrior[2] = 0UL;
+ Sys.pGrInfo->ulPrior[3] = 0UL;
+
+ if (pForrigeGrInfo != NULL) {
+ pForrigeGrInfo->rb_neste_gr = Sys.GrId.lNr;
+ }
+
+ LI_WriteRb(Sys.GrId.pFil,Sys.pGrInfo->rb_st,Sys.Ginfo.pszTx,Sys.pGrInfo->ulGiLen,
+ Sys.pdAust, Sys.pdNord, Sys.pInfo, Sys.pGrInfo->nko,
+ Sys.pszPinfo, Sys.pGrInfo->ulPiLen);
+
+ Sys.GrId.pFil->n64NesteLedigRbPos +=
+ (UT_INT64)LI_BerBufferLen(Sys.pGrInfo->ulGiLen,Sys.pGrInfo->nko,Sys.pGrInfo->ulPiLen);
+
+ pForrigeGrInfo = Sys.pGrInfo;
+
+ /* Nuller merking */
+ LI_PutBt(pFil,Sys.GrId.lNr,0L);
+
+ LS_Indx(); /* Serienummer tabeller */
+ LR_Indx(); /* Geografisk indeks */
+
+ /* ".SLUTT" er lest */
+ } else {
+ pFil->n64AktPos = pos;
+ pFil->lAntGr--;
+ }
+
+ } else { /* For mange grupper, tab. sprengt */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %ld",pFil->lAntGr+1L);
+ LC_Error(2,"(LO_InklSos)",err().tx);
+ exit(99);
+ }
+
+ avbrutt = LC_Cancel(); /* <ESC> avbryter lesing */
+ } while ( !siste && !avbrutt);
+
+
+ /* Bygg indeks for grupper med referanser */
+ if (! avbrutt) { /* Lesing er avbrutt */
+ lengde_faktor = 100.0 / (double)pFil->lAntGr;
+
+ Bgr.pFil = pFil;
+ for (lGrNr=0; lGrNr<pFil->lAntGr && !avbrutt; lGrNr++) {
+ if (sVisStatus == LC_VIS_STATUS) {
+ LC_ShowMessage((double)lGrNr * lengde_faktor);
+ }
+
+ /* Sjekk om gruppen har referanser */
+ pGrInfo = LI_GetGrt(pFil,lGrNr);
+ if ((pGrInfo->info & GI_REF) != 0) {
+ /* Les inn og beregn omskreven boks medregnet refererte grupper */
+ Bgr.lNr = lGrNr;
+ if (LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info) != INGEN_GRUPPE) {
+ LR_IndxFlate();
+ }
+ }
+
+ avbrutt = LC_Cancel(); /* <ESC> avbryter lesing */
+ }
+ }
+
+ Sys.GrId.lNr = INGEN_GRUPPE; /* Ingen aktuell gruppe */
+ Sys.sGrEndra = END_UENDRA;
+
+ /* Oppdaterer omskrevet boks for basen */
+ if ( ! avbrutt) { /* Lesing er avbrutt */
+ pFil = Sys.pAktBase->pForsteFil;
+ pB = &(Sys.pAktBase->Omraade);
+ pB->dMinAust = pB->dMinNord = (double)LONG_MAX;
+ pB->dMaxAust = pB->dMaxNord = (double)LONG_MIN;
+ while (pFil != NULL) {
+ /* Er filen i rett lag? (Hoper over sekvensielle filer) */
+ if (pFil->usLag & (LC_FRAMGR | LC_BAKGR)) {
+ /* Filen inneholder data */
+ if (pFil->pGeoRN != NULL) {
+ pB->dMinAust = min(pB->dMinAust,pFil->Omraade.dMinAust);
+ pB->dMinNord = min(pB->dMinNord,pFil->Omraade.dMinNord);
+ pB->dMaxAust = max(pB->dMaxAust,pFil->Omraade.dMaxAust);
+ pB->dMaxNord = max(pB->dMaxNord,pFil->Omraade.dMaxNord);
+ }
+ }
+ pFil = pFil->pNesteFil;
+ }
+ }
+
+ if (avbrutt) { /* Lesing er avbrutt */
+ LC_Error(10,"(LO_InklSos)","");
+ pFil->lAntGr = 0L;
+ sStatus = UT_FALSE;
+ }
+
+ if (sVisStatus == LC_VIS_STATUS) {
+ LC_EndMessage();
+ }
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-911001
+CH LC_GetFiNr Get fil nummer
+CD ==========================================================================
+CD Formål:
+CD Sjekker alle filer i aktuell base om noen av den har det gitte filnavnet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char fil_navn i Filnavn
+CD LC_FILADM *pFil r Peker til FilAdm for filen. (NULL = ukjent fil)
+CD
+CD Bruk:
+CD pFil = LC_GetFiNr(fil_navn);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA LC_FILADM *LC_GetFiNr(const char *fil_navn)
+{
+ LC_FILADM *pFil;
+ char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ char szSosFil[_MAX_PATH];
+
+
+ /*
+ * Bygg opp fullstendig filnavn
+ */
+ UT_FullPath(szSosFil,fil_navn,_MAX_PATH);
+ UT_splitpath(szSosFil,drive,dir,fname,ext);
+ if (*ext == '\0') UT_StrCopy(ext,".sos",_MAX_EXT);
+ UT_makepath(szSosFil,drive,dir,fname,ext);
+
+ for (pFil=Sys.pAktBase->pForsteFil; pFil!=NULL; pFil=pFil->pNesteFil) {
+ /* Rett filnavn? ==> */
+ if (UT_FilnavnCmp(pFil->pszNavn,szSosFil) == 0) return pFil;
+ }
+
+ return NULL;
+}
+
+
+/*
+AR-911001
+CH LC_GetFiNa Hent filnavn
+CD ==========================================================================
+CD Formål:
+CD Henter filnavnet for en fil i basen. Fungerer både for basefiler
+CD og for sekvensielle filer.
+CD OBS! Hvis du skal endre på filnavnet må du først kopiere det
+CD til en lokale varialel.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD char *fil_navn r Peker til filnavn
+CD
+CD Bruk:
+CD fil_navn = LC_GetFiNa(pFil);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA char *LC_GetFiNa(LC_FILADM *pFil)
+{
+ /* LO_TestFilpeker(pFil,"LC_GetFiNa"); */
+ LO_TestFilpeker(pFil,"GetFiNa");
+
+ return pFil->pszNavn;
+}
+
+
+/*
+AR-920729
+CH LO_TestFilpeker Sjekk at en filpeker er gyldig
+CD ==========================================================================
+CD Formål:
+CD Sjekk at en filpeker er gyldig.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM * pFil i Peker til FilAdm
+CD char *pszRutineNavn i Melding (rutinenavnet for kallende rutine)
+CD
+CD Bruk:
+CD LO_TestFilpeker(pFil,"LC_OpenBase");
+ ==========================================================================
+*/
+void LO_TestFilpeker(LC_FILADM *pFil,char *pszRutineNavn)
+{
+ char szTx[100];
+
+
+ if (pFil == NULL || *(pFil->szBaseVer) != 'F') {
+
+ UT_SNPRINTF(szTx,100," %s, (Filpeker: %p)",pszRutineNavn,pFil);
+ LC_Error(105,"(TestFilpeker)",szTx);
+ }
+}
+
+
+/*
+AR-921008
+CH LC_ErFilBase Sjekker om en fil er i basen
+CD ==========================================================================
+CD Formål:
+CD Sjekker om en fil er i basen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------
+CD char *fil i Filnavn inkl. sti og fil-type
+CD (Hvis fil-type mangler forutsettes .SOS)
+CD short status r Status: UT_TRUE = Filen er med i basen.
+CD UT_FALSE = Filen er IKKE med i basen.
+CD
+CD Bruk:
+CD ist = LC_ErFilBase(fil);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_ErFilBase(const char *fil)
+{
+ char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ char szSosFil[_MAX_PATH];
+
+ /*
+ * Bygg opp fullstendig filnavn
+ */
+ UT_FullPath(szSosFil,fil,_MAX_PATH);
+ UT_splitpath(szSosFil,drive,dir,fname,ext);
+ if (*ext == '\0') UT_StrCopy(ext,".sos",_MAX_EXT);
+ UT_makepath(szSosFil,drive,dir,fname,ext);
+
+ /* Sjekk om filen er i basen fra før */
+ if (LC_GetFiNr(szSosFil) != NULL) return UT_TRUE; /* Er i basen */
+
+ return UT_FALSE; /* Er ikke i basen */
+}
+
+
+
+/*
+AR-940923
+CH LC_ErKoordsysLik Sjekker KOORDSYS
+CD =======================================================================
+CD Formål:
+CD Sjekk at alle filene i basen har samme koordinatsystem.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD short status r Status: UT_TRUE = KOORDSYS er lik.
+CD UT_FALSE = KOORDSYS er IKKE lik.
+CD
+CD Bruk:
+CD ist = LC_ErKoordsysLik();
+ =======================================================================
+*/
+SK_EntPnt_FYBA short LC_ErKoordsysLik(void)
+{
+ short sKoSys = 0;
+ short sFilNr = 0;
+ LC_FILADM *pFil;
+
+ /* Sjekk at alle filene i basen har samme koordinatsystem */
+ LC_InitNextFil(&pFil);
+
+ while (LC_NextFil(&pFil,LC_FRAMGR | LC_BAKGR))
+ {
+ sFilNr++;
+ if (sFilNr == 1)
+ {
+ sKoSys = pFil->TransPar.sKoordsys;
+ }
+
+ else if (pFil->TransPar.sKoordsys != sKoSys)
+ {
+ LC_FILADM *pF;
+
+ // Skriv filnavn og koordinatsystem til loggfilen
+
+ UT_FPRINTF(stderr,"Det er funnet filer med ulikt koordinatsystem:\n");
+
+ LC_InitNextFil(&pF);
+ while (LC_NextFil(&pF,LC_FRAMGR | LC_BAKGR))
+ {
+ UT_FPRINTF(stderr," \"%s\" : %hd\n",pF->pszNavn,pF->TransPar.sKoordsys);
+ }
+ return UT_FALSE;
+ }
+ }
+
+ return UT_TRUE;
+}
+
+
+
+/*
+AR-940923
+CH LC_ErVertdatumLik Sjekker VERT-DATUM
+CD =======================================================================
+CD Formål:
+CD Sjekk at alle filene i basen har samme VERT-DATUM.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD short status r Status: UT_TRUE = VERT-DATUM er lik.
+CD UT_FALSE = VERT-DATUM er IKKE lik.
+CD
+CD Bruk:
+CD ist = LC_ErVertdatumLik();
+ =======================================================================
+*/
+SK_EntPnt_FYBA short LC_ErVertdatumLik(void)
+{
+ char szVertdatHref[7];
+ char szVertdatDref[6];
+ char szVertdatFref[6];
+ char szVertdatHtyp[2];
+
+ bool bForsteFil = true;
+ LC_FILADM *pFil;
+
+ /* Sjekk at alle filene i basen har samme VERT-DATUM */
+ LC_InitNextFil(&pFil);
+
+ while (LC_NextFil(&pFil,LC_FRAMGR | LC_BAKGR))
+ {
+ // Sjekker bare filer med VERT-DATUM gitt i filhodet
+ // (Overser standardverdien)
+ if (strlen(pFil->TransPar.szVertdatHref) > 0)
+ {
+ if ( bForsteFil)
+ {
+ UT_StrCopy(szVertdatHref, pFil->TransPar.szVertdatHref, 7);
+ UT_StrCopy(szVertdatDref, pFil->TransPar.szVertdatDref, 6);
+ UT_StrCopy(szVertdatFref, pFil->TransPar.szVertdatFref, 6);
+ UT_StrCopy(szVertdatHtyp, pFil->TransPar.szVertdatHtyp, 2);
+ bForsteFil = false;
+ }
+
+ else if (UT_StrCmpi(pFil->TransPar.szVertdatHref,szVertdatHref) != 0 ||
+ UT_StrCmpi(pFil->TransPar.szVertdatDref,szVertdatDref) != 0 ||
+ UT_StrCmpi(pFil->TransPar.szVertdatFref,szVertdatFref) != 0 ||
+ UT_StrCmpi(pFil->TransPar.szVertdatHtyp,szVertdatHtyp) != 0 )
+ {
+ LC_FILADM *pF;
+
+ // Skriv filnavn og VERT-DATUM til loggfilen
+
+ UT_FPRINTF(stderr,"Det er funnet filer med ulikt VERT-DATUM:\n");
+
+ LC_InitNextFil(&pF);
+ while (LC_NextFil(&pF,LC_FRAMGR | LC_BAKGR))
+ {
+ UT_FPRINTF(stderr," \"%s\" : \"%s %s %s %s\"\n",
+ pF->pszNavn,
+ pF->TransPar.szVertdatHref,
+ pF->TransPar.szVertdatDref,
+ pF->TransPar.szVertdatFref,
+ pF->TransPar.szVertdatHtyp);
+ }
+ return UT_FALSE;
+ }
+ }
+ }
+
+ return UT_TRUE;
+}
+
+
+/*
+AR:2000-11-30
+CH LC_SetEndringsstatus Setter endringsstatus for aktuell gruppe
+CD ==========================================================================
+CD Formål:
+CD Setter endringsstatus for aktuell gruppe.
+CD
+CD NB! Denne rutinen bør normalt ikke brukes av vanlige klient-program!
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short sStatus i Kode for endring:
+CD END_UENDRA 0 Ikke endra
+CD END_KOPI 1 Endra ved totalkopi fra annen gruppe
+CD END_ENDRA 2 Endra ved normal Put fra program
+CD
+CD Bruk:
+CD LC_dg_SetEndringsstatus(END_KOPI);
+=============================================================================
+*/
+SK_EntPnt_FYBA void LC_SetEndringsstatus(short sStatus)
+{
+ Sys.sGrEndra = sStatus;
+}
+
+/*
+JAØ:2001-03-06
+CH LC_SetFilType Setter filtype for en sosifil
+CD ==========================================================================
+CD Formål:
+CD Setter filtype for en fil.
+CD
+CD Denne rutinen er primært tenkt brukt i GabEdit hvor det er behov for å
+CD definere flere typer arbeidsfil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM * pFil i Peker til filen
+CD short type i Filtypen som skal settes
+CD LC_FILTYPE_UKJENT
+CD LC_FILTYPE_INAKTIV
+CD LC_FILTYPE_GAB_EIENDOM
+CD LC_FILTYPE_GAB_ADRESSE
+CD LC_FILTYPE_GAB_BYGNING
+CD LC_FILTYPE_BYGG
+CD LC_FILTYPE_DEK
+CD LC_FILTYPE_DEK_ENDRING
+CD LC_FILTYPE_GRUNNKRETS
+CD LC_FILTYPE_POSTKRETS
+CD LC_FILTYPE_SKOLEKRETS
+CD LC_FILTYPE_KIRKESOGN
+CD LC_FILTYPE_TETTSTED
+CD LC_FILTYPE_VALGKRETS
+CD
+CD Bruk:
+CD LC_SetFilType(pFil,type);
+=============================================================================
+*/
+SK_EntPnt_FYBA void LC_SetFilType(LC_FILADM *pFil, short sType)
+{
+ LO_TestFilpeker(pFil,"SetFilType");
+ pFil->sFilType = sType;
+}
+
+/*
+JAØ:2001-03-06
+CH LC_GetFilType Henter filtype for en sosifil
+CD ==========================================================================
+CD Formål:
+CD Finner filtypen for en fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM * pFil i Peker til filen
+CD short type r Filtypen som skal settes
+CD LC_FILTYPE_UKJENT
+CD LC_FILTYPE_INAKTIV
+CD LC_FILTYPE_GAB_EIENDOM
+CD LC_FILTYPE_GAB_ADRESSE
+CD LC_FILTYPE_GAB_BYGNING
+CD LC_FILTYPE_BYGG
+CD LC_FILTYPE_DEK
+CD LC_FILTYPE_DEK_ENDRING
+CD LC_FILTYPE_GRUNNKRETS
+CD LC_FILTYPE_POSTKRETS
+CD LC_FILTYPE_SKOLEKRETS
+CD LC_FILTYPE_KIRKESOGN
+CD LC_FILTYPE_TETTSTED
+CD LC_FILTYPE_VALGKRETS
+CD
+CD Bruk:
+CD type = LC_GetFilType(pFil);
+=============================================================================
+*/
+SK_EntPnt_FYBA short LC_GetFilType(LC_FILADM *pFil)
+{
+ LO_TestFilpeker(pFil,"GetFilType");
+ return pFil->sFilType;
+}
+
+
+/*
+AR:2004-05-03
+CH LC_GetIdxPath Hent katalog for ny indeksfil
+CD ==========================================================================
+CD Formål:
+CD Hent katalognavn for ny indeks. For detaljer se under LC_SetIdxPath.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD const char *pszIdxPath r Katalog for indeks
+CD
+CD Bruk:
+CD const char *pszIdxPath = LC_GetIdxPath();
+ ==========================================================================
+*/
+SK_EntPnt_FYBA const char *LC_GetIdxPath(void)
+{
+ return Sys.szIdxPath;
+}
+
+
+/*
+AR:2011-05-31
+CH LC_SetIdxPath Velg katalog for ny indeksfil
+CD ==========================================================================
+CD Formål:
+CD Velg katalognavn for ny indeks. Indeksfilene for en SOSI-fil legges som
+CD en underkatalog under den gitte katalogen. Underkatalogen har samme navn
+CD som SOSI-filen. Hvis det er valgt spesiell plassering av indeksfilene blir
+CD disse alltid slettet når SOSI-filen stenges.
+CD OBS! Ingen SOSI-filer kan være åpne når indekskatalog velges.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD const char *pszIdxPath i Katalog for indeks
+CD "" = Tom streng betyr at indeksfilene legges på en
+CD underkatalog under katalogen der SOSI-filen ligger
+CD (default).
+CD "katalognavn" = Indeksfilene legges på en
+CD underkatalog under denne katalogen.
+CD short status r Status: UT_TRUE = OK
+CD UT_FALSE = Feil, feilmelding er gitt.
+CD
+CD Bruk:
+CD status = LC_SetIdxPath("C:\\kart\\test");
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_SetIdxPath(const char *pszIdxPath)
+{
+ if (LC_InqAntFiler(LC_FRAMGR|LC_BAKGR) == 0)
+ {
+ // Handter TEMP spesielt
+ /*
+ CD "TEMP" = Indeksfilene legges på brukerens temp-katalog.
+ // 2011-05-31: Handtering av "TEMP" er fjernet.
+ if (_strcmpi(pszIdxPath,"TEMP") == 0)
+ {
+ char szBuffer[_MAX_PATH];
+ size_t returnValue;
+ // Hent katalognavn fra environment
+ getenv_s( &returnValue, szBuffer, _MAX_PATH, "TEMP");
+ if(returnValue == 0)
+ {
+ getenv_s( &returnValue, szBuffer, _MAX_PATH, "TMP");
+ }
+ if(returnValue == 0)
+ {
+ Sys.szIdxPath[0] = '\0';
+ return UT_FALSE;
+ }
+ else
+ {
+ UT_StrCopy(Sys.szIdxPath,szBuffer,_MAX_PATH);
+ if (Sys.szIdxPath[strlen(Sys.szIdxPath)-1] != UT_SLASH) UT_StrCat(Sys.szIdxPath,UT_STR_SLASH,_MAX_PATH);
+ }
+ }
+ else
+ */
+ if (*pszIdxPath == '\0')
+ {
+ Sys.szIdxPath[0] = '\0';
+ }
+
+ else
+ {
+ UT_StrCopy(Sys.szIdxPath,pszIdxPath,_MAX_PATH);
+ if (Sys.szIdxPath[strlen(Sys.szIdxPath)-1] != UT_SLASH) UT_StrCat(Sys.szIdxPath,UT_STR_SLASH,_MAX_PATH);
+
+ // Opprett katalogen hvis den ikke finnes fra før
+ UT_CreateDir(Sys.szIdxPath);
+ }
+
+ return UT_TRUE;
+ }
+
+ return UT_FALSE;
+}
diff --git a/src/FYBA/FYLP.cpp b/src/FYBA/FYLP.cpp
new file mode 100644
index 0000000..a5ecf76
--- /dev/null
+++ b/src/FYBA/FYLP.cpp
@@ -0,0 +1,1169 @@
+/* === AR-970929 ========================================================= */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fylp.c */
+/* Innhold: Polygonhandtering for FYSAK-PC */
+/* ======================================================================= */
+
+#include "stdafx.h"
+
+#include <ctype.h>
+#include <memory.h>
+#include <limits.h>
+
+
+/* Globale variabler for FYBA */
+extern LC_SYSTEMADM Sys; /* Systemadministrasjon */
+
+
+/*
+AR-970929
+CH LC_POL_LeggTilGruppeOmkrets Legg til eit element
+CD =======================================================================
+CD Bruk:
+CD LC_POL_OMKR YtrePolygon;
+CD pElement = LC_POL_LeggTilGruppeOmkrets(YtrePolygon,pBgr,sRetning,lSnr);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POL_OMKR * pPO I/U Peikar til polygonadministrasjonsblokka
+CD LC_BGR * pBgr I Gruppenummer
+CD short sRetning I Nøsteretning (LC_MED_DIG eller LC_MOT_DIG)
+CD long lSnr I Serienummer
+CD LC_POL_ELEMENT * pElement R Peker til innlagt element
+CD
+CD Legg til eit element i kjeden av polygonelement.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA LC_POL_ELEMENT * LC_POL_LeggTilGruppeOmkrets(LC_POL_OMKR *pPO,LC_BGR *pBgr,
+ short sRetning, long lSnr)
+{
+ LC_POL_ELEMENT * pPE;
+ pPE = (LC_POL_ELEMENT *) UT_MALLOC(sizeof(LC_POL_ELEMENT));
+ pPE->pForrigePE = pPO->pSistePE;
+ pPE->pNestePE = NULL;
+
+ if(pPO->pForstePE == NULL) {
+ pPO->pForstePE = pPE;
+
+ } else {
+ pPO->pSistePE->pNestePE = pPE;
+
+ }
+
+ pPO->pSistePE = pPE;
+
+ pPE->Bgr = *pBgr;
+ pPE->sRetning = sRetning;
+ pPE->lSnr = lSnr;
+
+ return pPE;
+}
+
+
+/*
+SJM-930921
+CH LC_POL_FjernSisteGruppeOmkrets Fjernar siste element
+CD =======================================================================
+CD Bruk:
+CD LC_POL_OMKR YtrePolygon;
+CD LC_POL_FjernSisteGruppeOmkrets(&YtrePolygon);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POL_OMKR * pPO I/U Peikar til polygonadministrasjonsblokka
+CD
+CD Fjernar siste element i kjeden av polygonelement.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_FjernSisteGruppeOmkrets(LC_POL_OMKR *pPO)
+{
+ LC_POL_ELEMENT *pPE = pPO->pSistePE;
+
+ if (pPE != NULL) {
+ pPO->pSistePE = pPE->pForrigePE;
+ if(pPE->pForrigePE == NULL) {
+ pPO->pForstePE = NULL;
+
+ } else {
+ pPE->pForrigePE->pNestePE = NULL;
+ }
+ UT_FREE(pPE);
+ }
+}
+
+
+/*
+AR-971112
+CH LC_POL_FjernGruppeOmkrets Fjernar element
+CD =======================================================================
+CD Bruk:
+CD LC_POL_OMKR YtrePolygon;
+CD LC_POL_FjernGruppeOmkrets(&YtrePolygon,);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POL_OMKR *pPO I/U Peikar til polygonadministrasjonsblokka
+CD LC_POL_ELEMENT *pPE I Peker til element som skal fjernes
+CD
+CD Fjernar et element i kjeden av polygonelement.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_FjernGruppeOmkrets(LC_POL_OMKR *pPO, LC_POL_ELEMENT *pPE)
+{
+ /* Oppdaterer pekeren til neste element */
+ if (pPE->pForrigePE != NULL) {
+ /* Inne i kjeden */
+ pPE->pForrigePE->pNestePE = pPE->pNestePE;
+ } else {
+ /* Starten av kjeden */
+ pPO->pForstePE = pPE->pNestePE;
+ }
+
+ /* Oppdaterer pekeren til forrige element */
+ if (pPE->pNestePE != NULL) {
+ /* Inne i kjeden */
+ pPE->pNestePE->pForrigePE = pPE->pForrigePE;
+ } else {
+ /* Slutten av kjeden */
+ pPO->pSistePE = pPE->pForrigePE;
+ }
+ UT_FREE(pPE);
+}
+
+
+/*
+SJM-930921
+CH LC_POL_FrigiAlleOyer Frigjer minne som er allokert til kjede av øyelement
+CD =======================================================================
+CD Bruk:
+CD LC_OY_ADM OyKjede;
+CD LC_POL_FrigiAlleOyer(OyKjede);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_OY_ADM *pOA I/U Peikar til øyadministrasjonsblokka
+CD
+CD Frigjer minne som er allokert til kjede av øy (i polygon) - element.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_FrigiAlleOyer(LC_OY_ADM *pOA)
+{
+ LC_OY_ELEMENT *pOE,*pNesteOE;
+
+ pOE = pOA->pForsteOE;
+
+ /* Frigir omkretsen av hver øy */
+ while(pOE != NULL) {
+ LC_POL_FrigiOmkrets(&(pOE->PO));
+ pNesteOE = pOE->pNesteOE;
+ UT_FREE(pOE);
+ pOE = pNesteOE;
+ }
+ pOA->pForsteOE = NULL;
+ pOA->pSisteOE = NULL;
+}
+
+
+/*
+SJM-931003
+CH LC_POL_FjernOy Fjernar ei oy frå kjede av øyelement
+CD =======================================================================
+CD Bruk:
+CD LC_OY_ADM OyKjede;
+CD LC_POL_FjernOy(OyKjede,OyElement);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_OY_ADM *pOA I/U Peikar til øyadministrasjonsblokka
+CD LC_OY_ELEMENT *pOE I/U Peikar til kjede av oyar
+CD
+CD Frigjer minne som er allokert til kjede av øy (i polygon) - element.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_FjernOy(LC_OY_ADM *pOA,LC_OY_ELEMENT *pOE)
+{
+ /* UT_FPRINTF(stderr,"LC_POL_FjernOy: Kallar LC_POL_Frigi()\n"); */
+ LC_POL_FrigiOmkrets(&(pOE->PO));
+
+ /* Frigir øykjeda */
+ if (pOE->pForrigeOE != NULL) {
+ pOE->pForrigeOE->pNesteOE = pOE->pNesteOE;
+ } else {
+ pOA->pForsteOE = pOE->pNesteOE;
+ }
+
+ if (pOE->pNesteOE != NULL) {
+ pOE->pNesteOE->pForrigeOE = pOE->pForrigeOE;
+ } else {
+ pOA->pSisteOE = pOE->pForrigeOE;
+ }
+ UT_FREE(pOE);
+}
+
+
+/*
+SJM-930921
+CH LC_POL_LeggTilOy Legg til eit element
+CD =======================================================================
+CD Bruk:
+CD LC_OY_ADM OyKjede;
+CD LC_POL_LeggTilOy(&OyKjede,pPO);
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_OY_ADM *pOyKjede I/U Peikar til kjede av øyelement
+CD LC_POL_OMKR *pPO I Peikar til polygonadministrasjonsblokka
+CD
+CD Legg til eit element i kjeden av øyar (i polygon) - element.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_LeggTilOy(LC_OY_ADM *pOA,LC_POL_OMKR *pPO)
+{
+ LC_OY_ELEMENT *pOE;
+ pOE = (LC_OY_ELEMENT *) UT_MALLOC(sizeof(LC_OY_ELEMENT));
+ pOE->pForrigeOE = pOA->pSisteOE;
+ pOE->pNesteOE = NULL;
+ pOE->PO = *pPO;
+
+ if(pOA->pForsteOE == NULL) {
+ pOA->pForsteOE = pOE;
+
+ } else {
+ pOA->pSisteOE->pNesteOE = pOE;
+
+ }
+
+ pOA->pSisteOE = pOE;
+ /* *********************************************
+ UT_FPRINTF(stderr,"LC_POL_LeggTilOy: Aktuell OE %p\n",pOE);
+ UT_FPRINTF(stderr,"LC_POL_LeggTilOy: OA->førsteOE %p\n" ,pOA->pForsteOE);
+ UT_FPRINTF(stderr,"LC_POL_LeggTilOy: SisteOE->nesteOE %p\n",pOA->pSisteOE->pNesteOE);
+ UT_FPRINTF(stderr,"LC_POL_LeggTilOy: SisteOE %p\n",pOA->pSisteOE);
+ ********************************************* */
+}
+
+
+/*
+SJM-930921
+CH LC_POL_FrigiOmkrets Frigjer minne som er allokert til kjede av polygonelement
+CD =======================================================================
+CD Bruk:
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POL_OMKR *pPO I/U Peikar til polygonadministrasjonsblokka
+CD
+CD Frigir minne som er allokert til kjede av polygonelement.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_FrigiOmkrets(LC_POL_OMKR *pPO)
+{
+ LC_POL_ELEMENT *pPE,*pNestePE;
+
+ pPE = pPO->pForstePE;
+
+ while(pPE != NULL) {
+ /* UT_FPRINTF(stderr,"LC_POL_FrigiOmkrets: pPE = %p\n",pPE); */
+ pNestePE = pPE->pNestePE;
+ UT_FREE(pPE);
+ pPE = pNestePE;
+ }
+ pPO->pForstePE = NULL;
+ pPO->pSistePE = NULL;
+}
+
+
+/*
+AR-931208
+CH LC_POL_FrigiPolygon Frigi minne som er allokert til polygon
+CD =======================================================================
+CD Formål:
+CD Frigir minne som er allokert til polygon. (Både omkrets og hull.)
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POLYGON *pPolygon I Peikar til polygonbeskrivelse
+CD
+CD Bruk:
+CD LC_POLYGON Polygon;
+CD LC_POL_FrigiPolygon(&Polygon);
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_FrigiPolygon(LC_POLYGON *pPolygon)
+{
+ /* Frigir øy-kjeden */
+ LC_POL_FrigiAlleOyer(&(pPolygon->OyOA));
+
+ /* Frigir omkretsen */
+ LC_POL_FrigiOmkrets(&(pPolygon->HovedPO));
+}
+
+
+/*
+SJM-930921
+CH LC_POL_InitOmkrets Initierer polygon-omkrets
+CD =======================================================================
+CD Bruk:
+CD POL_OMKR YtrePolygon;
+CD LC_POL_InitOmkrets(YtrePolygon);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POL_OMKR *pPO I/U Peikar til polygonadministrasjonsblokka
+CD
+CD Initierer administrasjonsblokka for polygonelement
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_InitOmkrets(LC_POL_OMKR *pPO)
+{
+ pPO->pForstePE = NULL;
+ pPO->pSistePE = NULL;
+}
+
+
+/*
+SJM-930921
+CH LC_POL_InitOy Initierer øy-kjeden
+CD =======================================================================
+CD Bruk:
+CD LC_OY_ADM OyKjede;
+CD LC_POL_InitOy(OyKjede);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_OY_ADM *pOA I/U Peikar til øyadministrasjonsblokka
+CD
+CD Initierer øy-kjeden.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_InitOy(LC_OY_ADM *pOA)
+{
+ pOA->pForsteOE = NULL;
+ pOA->pSisteOE = NULL;
+}
+
+
+/*
+AR-931208
+CH LC_POL_InitPolygon Initierer polygon-struktur
+CD =======================================================================
+CD Formål:
+CD Initierer polygon-struktur.
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POLYGON *pPolygon I Peikar til polygonbeskrivelse
+CD
+CD Bruk:
+CD LC_POLYGON Polygon;
+CD LC_POL_InitPolygon(&Polygon);
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_InitPolygon(LC_POLYGON *pPolygon)
+{
+ LC_POL_InitOmkrets(&(pPolygon->HovedPO));
+ LC_POL_InitOy(&(pPolygon->OyOA));
+}
+
+
+/*
+AR-931208
+CH LC_POL_PutRef Legger inn referanser i GINFO
+CD =======================================================================
+CD Formål:
+CD Legger inn referanser i GINFO, ut fra beskrivelse i struktur.
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POLYGON *pPolygon I Polygonbeskrivelse
+CD short ngi r Antall linjer GINFO
+CD
+CD Bruk:
+CD ngi = LC_POL_PutRef(pPolygon);
+CD =======================================================================
+*/
+SK_EntPnt_FYBA short LC_POL_PutRef(LC_POLYGON *pPolygon)
+{
+ #define MAX_LEN 66 /* Ginfolinjen skrives ut når den er lengre en 70 tegn */
+ LC_POL_ELEMENT *pPE;
+ LC_OY_ELEMENT *pOE;
+ short gilin;
+ char temp[LC_MAX_SOSI_LINJE_LEN],*ginfo,*cp;
+ char szOrd[50];
+ short ledig_linje = -1;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+ /* Pakker gammel GINFO */
+ for (gilin=2; gilin <= Sys.pGrInfo->ngi; gilin++) {
+ ginfo = LX_GetGi(gilin);
+
+ /* Gammel type referanse er funnet */
+ if (strncmp(ginfo,".. ",3) == 0) {
+ if (ledig_linje == -1) { /* Første linje med referanse */
+ ledig_linje = gilin;
+ }
+
+ /* Ny type referanse er funnet */
+ } else if (strncmp(ginfo,"..REF ",6) == 0) {
+ if (ledig_linje == -1) { /* Første linje med referanse */
+ ledig_linje = gilin;
+ }
+ /* Søk over resten av referansene */
+ for (gilin++; gilin <= Sys.pGrInfo->ngi; gilin++) {
+ ginfo = LX_GetGi(gilin);
+ if (strncmp(ginfo,"..",2) == 0) { /* Annen GINFO er funnet */
+ gilin--;
+ break; /* Avbryt, alle referanser er funnet*/
+ }
+ }
+
+ /* Annen GINFO */
+ } else {
+ if (ledig_linje != -1) {
+ /* Funnet linje som skal flyttes opp */
+ LC_PutGi(ledig_linje,ginfo);
+ ledig_linje++;
+ }
+ }
+
+
+ }
+
+ if (ledig_linje == -1) ledig_linje = Sys.pGrInfo->ngi + 1;
+
+
+ /* Legger inn referanser */
+ if (pPolygon->HovedPO.pForstePE != NULL) {
+ /* Husk at det finnes flate i filen */
+ if ( Sys.GrId.pFil->SosiNiv[1] < 4) {
+ Sys.GrId.pFil->SosiNiv[1] = 4;
+ }
+
+
+ if (Sys.GrId.pFil->sSosiVer >= 220) {
+ UT_StrCopy(temp,"..REF ",LC_MAX_SOSI_LINJE_LEN);
+ cp = temp + 6;
+ } else {
+ UT_StrCopy(temp,".. ",LC_MAX_SOSI_LINJE_LEN);
+ cp = temp + 3;
+ }
+
+ /* Legger ut hovedpolygonet */
+ for (pPE = pPolygon->HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+
+ /* Strengen er full, skriver ut */
+ if(strlen(temp) > MAX_LEN) {
+ if (ledig_linje > Sys.pGrInfo->ngi) {
+ ledig_linje = LC_AppGiL();
+ }
+ LC_PutGi(ledig_linje,temp);
+ ledig_linje ++;
+
+ if (Sys.GrId.pFil->sSosiVer >= 220) {
+ *temp = '\0';
+ cp = temp;
+ } else {
+ UT_StrCopy(temp,".. ",LC_MAX_SOSI_LINJE_LEN);
+ cp = temp + 3;
+ }
+ }
+
+ /* Skriv ut referansen */
+ if (cp > temp) {
+ if (! UT_IsSpace(*(cp-1)) && *(cp-1) != '(') {
+ *cp++ = ' ';
+ *cp = '\0';
+ }
+ }
+ UT_SNPRINTF(szOrd, 50, ":%ld", ((pPE->sRetning == LC_MED_DIG)? pPE->lSnr : -pPE->lSnr));
+ UT_StrCat(temp, szOrd, LC_MAX_SOSI_LINJE_LEN);
+ cp = strchr(temp,'\0');
+ }
+
+
+ /* Legger ut øyer */
+ for (pOE = pPolygon->OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ /* Strengen er full, skriver ut */
+ if(strlen(temp) >= (MAX_LEN-2)) {
+ if (ledig_linje > Sys.pGrInfo->ngi) {
+ ledig_linje = LC_AppGiL();
+ }
+ LC_PutGi(ledig_linje,temp);
+ ledig_linje ++;
+
+ if (Sys.GrId.pFil->sSosiVer >= 220) {
+ *temp = '\0';
+ cp = temp;
+ } else {
+ UT_StrCopy(temp,".. ",LC_MAX_SOSI_LINJE_LEN);
+ cp = temp + 3;
+ }
+ }
+
+ /* Startparantesen */
+ if (cp > temp) {
+ if (! UT_IsSpace(*(cp-1))) {
+ *cp++ = ' ';
+ }
+ }
+ *cp++ = '(';
+ *cp = '\0';
+
+ /* Legger ut elementa i øyane */
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+
+ /* Strengen er full, skriver ut */
+ if(strlen(temp) >= MAX_LEN) {
+ if (ledig_linje > Sys.pGrInfo->ngi) {
+ ledig_linje = LC_AppGiL();
+ }
+ LC_PutGi(ledig_linje,temp);
+ ledig_linje ++;
+
+ if (Sys.GrId.pFil->sSosiVer >= 220) {
+ *temp = '\0';
+ cp = temp;
+ } else {
+ UT_StrCopy(temp,".. ",LC_MAX_SOSI_LINJE_LEN);
+ cp = temp + 3;
+ }
+ }
+
+ /* Skriv ut referansen */
+ if (cp > temp) {
+ if (! UT_IsSpace(*(cp-1)) && *(cp-1) != '(') {
+ *cp++ = ' ';
+ *cp = '\0';
+ }
+ }
+ UT_SNPRINTF(szOrd, 50, ":%ld", ((pPE->sRetning == LC_MED_DIG)? pPE->lSnr : -pPE->lSnr));
+ UT_StrCat(temp, szOrd, LC_MAX_SOSI_LINJE_LEN);
+ cp = strchr(temp,'\0');
+ }
+
+
+ /* Sluttparantesen */
+ if (cp > temp) {
+ if (*(cp-1) == '.') {
+ *cp++ = ' ';
+ }
+ }
+ *cp++ = ')';
+ *cp = '\0';
+ }
+
+
+ /* Skriver ut resten av strengen */
+ if ((Sys.GrId.pFil->sSosiVer >= 220 && strlen(temp) > 0) ||
+ strlen(temp) > 3) {
+ if (ledig_linje > Sys.pGrInfo->ngi) {
+ ledig_linje = LC_AppGiL();
+ }
+ LC_PutGi(ledig_linje,temp);
+ ledig_linje ++;
+ }
+
+ } else {
+ Sys.pGrInfo->info &= ~((unsigned short)GI_REF);
+ Sys.pGrInfo->info &= ~((unsigned short)GI_OY_REF);
+ }
+
+ /* Sletter 1. ledige og resten */
+ LC_DelGiL(ledig_linje, (short)(Sys.pGrInfo->ngi - ledig_linje + 1));
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+AR-931212
+CH LC_POL_GetRef Hent referanser for flate fra GINFO
+CD ==========================================================================
+CD Formål:
+CD Henter referanser fra GINFO til struktur.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POLYGON *pPolygon I Peker til adm. for polygonbeskrivelse
+CD
+CD
+CD Bruk:
+CD short ngi;
+CD long nko;
+CD unsigned short info;
+CD LC_POLYGON Polygon;
+CD LC_POL_ELEMENT * pPE;
+CD LC_OY_ELEMENT * pOE;
+CD
+CD LC_POL_InitPolygon(&Polygon);
+CD
+CD LC_POL_GetRef(&Polygon);
+CD
+CD . Omkretsen .
+CD for(pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+CD gnavn = LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+CD .
+CD Behandle ytre avgrensing
+CD .
+CD }
+CD
+CD . Øyer .
+CD for (pOE = Polygon.OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+CD for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+CD gnavn = LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+CD .
+CD Behandle indre avgrensing (øy)
+CD .
+CD }
+CD }
+CD
+CD . Frigi allokerte kjeder .
+CD LC_POL_FrigiPolygon(&Polygon);
+CD
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_GetRef(LC_POLYGON *pPolygon)
+{
+ char *gp,ginfo[LC_MAX_SOSI_LINJE_LEN];
+ long lSnr;
+ LC_BGR Bgr;
+ short ngi;
+ long nko;
+ unsigned short info;
+ short sRetning;
+ LC_POL_OMKR OyPO;
+ short sGiLinNr = 2;
+ short sOy = UT_FALSE;
+ LC_BGR AktBgr = Sys.GrId;
+ short sRefLin = UT_FALSE; /* Viser om aktuel linje inneholder referanser */
+
+
+ LC_POL_InitOmkrets(&OyPO);
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ Bgr.pFil = Sys.GrId.pFil;
+
+ /* Finn referanser */
+ while (sGiLinNr <= Sys.pGrInfo->ngi) {
+ gp = LX_GetGi(sGiLinNr);
+
+ /* Handter referanselinjer */
+ if ((sRefLin = LC_ErLinjeRefLin(gp,sRefLin)) == UT_TRUE) {
+ UT_StrCopy(ginfo,gp,LC_MAX_SOSI_LINJE_LEN);
+ gp = ginfo;
+ while (*gp) { /* Tolk en linje */
+ if (*gp == ':') { /* Tall */
+ gp++;
+ /* Husk retning */
+ if (*gp == '-') {
+ sRetning = LC_MOT_DIG;
+ gp++;
+ } else {
+ sRetning = LC_MED_DIG;
+ }
+ /* Hent serienummer og konverter til gruppenummer */
+ if (isdigit(*gp)) {
+ lSnr = strtol(gp,&gp,10);
+ /* Konverter til gruppenummer */
+ if ((Bgr.lNr = LI_GetSnr(Sys.GrId.pFil,lSnr)) != INGEN_GRUPPE) {
+ /* Legg gruppen inn i kjeden */
+ if (sOy == UT_TRUE) {
+ /* Referanse til flate, pakk ut denne */
+ if (LC_GetGrParaBgr(&Bgr,&ngi,&nko,&info) == L_FLATE) {
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ LC_POL_GetRefOmkrets(&OyPO);
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ } else {
+ LC_POL_LeggTilGruppeOmkrets(&OyPO,&Bgr,sRetning,lSnr);
+ }
+
+ } else {
+ LC_POL_LeggTilGruppeOmkrets(&(pPolygon->HovedPO),
+ &Bgr,sRetning,lSnr);
+ }
+
+ } else {
+ UT_FPRINTF(stderr,"Snr. %ld er referert i \"%s : %s\", finnes ikke!\n",lSnr,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+
+ } else {
+ //UT_FPRINTF(stderr,"Ulovlig referanse \"%s\" i \"%s : %s\"\n",ginfo,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ //Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ gp++;
+ }
+
+
+ } else if (*gp == '(') { /* Start øy */
+
+ if (sOy == UT_FALSE) {
+ LC_POL_InitOmkrets(&OyPO);
+ sOy = UT_TRUE;
+
+ } else {
+ /* Øy i øy er ikke lovlig */
+ LC_Error(56,"(LC_POL_GetRef)",Sys.GrId.pFil->pszNavn);
+ UT_FPRINTF(stderr,"Øy i øy i gruppe \"%s : %s\"\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+ gp++;
+
+ } else if (*gp == ')') { /* Slutt øy */
+
+ if (sOy == UT_TRUE) {
+ LC_POL_LeggTilOy(&(pPolygon->OyOA),&OyPO);
+ sOy = UT_FALSE;
+
+ } else {
+ /* Øy i øy er ikke lovlig */
+ LC_Error(56,"(LC_POL_GetRef)",Sys.GrId.pFil->pszNavn);
+ UT_FPRINTF(stderr,"Øy i øy i gruppe \"%s : %s\"\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+ gp++;
+
+ } else { /* Ukjent tegn */
+ gp++;
+ }
+ }
+ }
+
+ sGiLinNr++;
+ }
+ }
+
+ return;
+}
+
+
+/*
+AR-931212
+CH LC_POL_GetRefOmkrets Hent referanser for omkretsen av flate
+CD ==========================================================================
+CD Formål:
+CD Henter referanser fra GINFO til struktur.
+CD Rutinen initierer strukturen pPO, men frigir ikke eventuellt gammelt innhold.
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -------------------------------------------------------------------------
+CD LC_POL_OMKR *pPO; IU Peker til kjede som beskriver omkretsen.
+CD
+CD Bruk:
+CD LC_POL_GetRefOmkrets(&OyPO);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_GetRefOmkrets(LC_POL_OMKR *pPO)
+{
+ char *gp,ginfo[LC_MAX_SOSI_LINJE_LEN];
+ long lSnr;
+ short sRetning;
+ short sGiLinNr = 2;
+ short sFerdig = UT_FALSE;
+ LC_BGR Bgr = Sys.GrId;
+ short sRefLin = UT_FALSE; /* Viser om aktuel linje inneholder referanser */
+
+
+ LC_POL_InitOmkrets(pPO);
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE && Sys.pGrInfo->ngi > 0) {
+ /* Finn referanser */
+ while (sFerdig == UT_FALSE && sGiLinNr <= Sys.pGrInfo->ngi) {
+ gp = LX_GetGi(sGiLinNr);
+
+ /* Handter referanselinjer */
+ if ((sRefLin = LC_ErLinjeRefLin(gp,sRefLin)) == UT_TRUE) {
+ UT_StrCopy(ginfo,gp,LC_MAX_SOSI_LINJE_LEN);
+ gp = ginfo;
+ while (sFerdig == UT_FALSE && *gp) { /* Tolk en linje */
+ if (*gp == ':') { /* Tall */
+ gp++;
+ /* Husk retning */
+ if (*gp == '-') {
+ sRetning = LC_MOT_DIG;
+ gp++;
+ } else {
+ sRetning = LC_MED_DIG;
+ }
+ /* Hent serienummer og konverter til gruppenummer */
+ if (isdigit(*gp)) {
+ lSnr = strtol(gp,&gp,10);
+ /* Konverter til gruppenummer */
+ if ((Bgr.lNr = LI_GetSnr(Sys.GrId.pFil,lSnr)) != INGEN_GRUPPE) {
+ /* Legg gruppen inn i kjeden */
+ LC_POL_LeggTilGruppeOmkrets(pPO,&Bgr,sRetning,lSnr);
+
+ } else {
+ UT_FPRINTF(stderr,"Snr. %ld er referert i \"%s : %s\", finnes ikke!\n",lSnr,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig referanse \"%s\" i \"%s : %s\"\n",ginfo,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+
+ /* Start øy */
+ } else if (*gp == '(') {
+ sFerdig = UT_TRUE;
+ gp++;
+
+ } else { /* Ukjent tegn */
+ gp++;
+ }
+ }
+ }
+
+ sGiLinNr++;
+ }
+ }
+}
+
+
+/*
+SJM-930928
+CH LC_POL_TestBrukt Testar om ei gruppe er brukt i polygonet
+CD =======================================================================
+CD Bruk:
+CD LC_POL_TestBrukt(pPolygon,&Bgr);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POLYGON *pPolygon I Peker til polygonbeskrivelse.
+CD LC_BGR *pBgr I Peikar til gruppe
+CD short status R Status UT_TRUE = gruppe er brukt i polygonet
+CD Status UT_FALSE = gruppe er IKKJE brukt i polygonet
+CD
+CD Testar om ei gruppe er brukt i gitt polygon.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA short LC_POL_TestBrukt(LC_POLYGON *pPolygon,LC_BGR *pBgr)
+{
+ LC_POL_ELEMENT *pPE;
+ LC_OY_ELEMENT *pOE;
+
+ /* Sjekk omkretsen */
+ for(pPE = pPolygon->HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ if (memcmp(pBgr,&pPE->Bgr, sizeof(LC_BGR)) == 0) {
+ return UT_TRUE;
+ }
+ }
+
+ /* Sjekk øyene */
+ for (pOE = pPolygon->OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ if (memcmp(pBgr,&pPE->Bgr, sizeof(LC_BGR)) == 0) {
+ return UT_TRUE;
+ }
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR:2009-03-04
+CH LC_POL_PTst Polygontest
+CD ==========================================================================
+CD Formål:
+CD Sjekker om gitt punkt ligger innenfor polygon angitt av pPolygon.
+CD Forutsetter at pPolygon danner et lukket polygon.
+CD Skifter ikke aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a i Punkt som skal sjekkes
+CD double n i
+CD short ist r status: UT_FALSE = punktet er utenfor flaten
+CD UT_TRUE = punktet ligger inne på flaten
+CD
+CD Bruk:
+CD .
+==========================================================================
+*/
+SK_EntPnt_FYBA short LC_POL_PTst(LC_POLYGON *pPolygon,double a,double n)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_POL_ELEMENT * pPE;
+ LC_OY_ELEMENT * pOE;
+ short sAntSkjaer;
+ LC_BGR Flate = Sys.GrId; /* Husk gruppenummer for flaten */
+ short inni = UT_FALSE; /* Returverdi: 1 = inne på flaten, 0 = utenfor */
+
+
+ // Har ytre avgrensning?
+ if (pPolygon == NULL || pPolygon->HovedPO.pForstePE == NULL) return inni; // ==> Avbryter, har ikke noen ytre avgrensning
+
+
+ double dEnhet = pPolygon->HovedPO.pForstePE->Bgr.pFil->TransPar.dEnhet;
+
+ // Pluss på et lite tillegg for å unngå treff på node
+ a += dEnhet / 1000.0;
+ n += dEnhet / 1000.0;
+
+ // Inndata
+ if (pPolygon) {
+ // ----- Behandle ytre avgrensing (Omkretsen)
+ sAntSkjaer = 0;
+ for(pPE = pPolygon->HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ sAntSkjaer += LR_PTstGruppe(&pPE->Bgr,a,n);
+ }
+ // Sjekk om punktet er innenfor
+ inni = ((sAntSkjaer % 2) == 1)? 1 : 0;
+
+ // ----- Behandler indre avgrensing (øy)
+ for (pOE = pPolygon->OyOA.pForsteOE; inni && (pOE != NULL); pOE = pOE->pNesteOE) {
+ // Behandler en øy
+ sAntSkjaer = 0;
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ sAntSkjaer += LR_PTstGruppe(&pPE->Bgr,a,n);
+ }
+ // Sjekk om punktet er inni øya
+ inni = ((sAntSkjaer % 2) == 1)? UT_FALSE : UT_TRUE;
+ }
+
+ // Les inn flaten igjen
+ LC_RxGr(&Flate,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+
+ return inni;
+}
+
+
+/*
+AR-931213
+CH LC_POL_PTstOmkrets Sjekk om punkt ligger inni polygonomkrets
+CD ==========================================================================
+CD Formål:
+CD Sjekker om gitt punkt ligger innenfor yttergrensen for polygon angitt
+CD av struktur.
+CD Forutsetter at tabellen danner et lukket polygon
+CD Skifter ikke aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_POL_OMKR *pPO I/U Peker til beskrivelse av omkretsen
+CD double a i Punkt som skal sjekkes
+CD double n i
+CD short ist r status: UT_FALSE = punktet er utenfor flaten
+CD UT_TRUE = punktet ligger inne på flaten
+CD
+CD Bruk:
+CD ist = LC_POL_PTstOmkrets(pPO,a,n);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_POL_PTstOmkrets(LC_POL_OMKR *pPO,double a,double n)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_POL_ELEMENT *pPE;
+ short sAntSkjaer = 0;
+ LC_BGR AktBgr = Sys.GrId; /* Husk gruppenummer for aktuell gruppe */
+
+
+ // Har ytre avgrensning?
+ if (pPO == NULL || pPO->pForstePE == NULL) return UT_FALSE; // ==> Avbryter, har ikke noen ytre avgrensning
+
+
+ double dEnhet = pPO->pForstePE->Bgr.pFil->TransPar.dEnhet;
+
+ // Pluss på et lite tillegg for å unngå treff på node
+ a += dEnhet / 1000.0;
+ n += dEnhet / 1000.0;
+
+ /*
+ * Sjekk omkretsen ved å beregne antall skjæringer mellom omkretsen
+ * og en linje fra "test-punktet" til "uendelig øst".
+ */
+
+ for (pPE = pPO->pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ /* Beregn skjæringer med denne gruppen */
+ sAntSkjaer += LR_PTstGruppe(&pPE->Bgr,a,n);
+ }
+
+ /* Les inn opprinnelig gruppe igjen */
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ /*
+ * Sjekk om punktet er innenfor omkretsen.
+ * (Inni hvis antall skjæringspunkt er oddetall.)
+ */
+ return ((sAntSkjaer % 2) == 1)? UT_TRUE : UT_FALSE;
+}
+
+
+/*
+JAØ-20061130
+CH LC_POL_OmkretsSkjaering Finner antall skjæringer med polygonomkrets
+CD ==========================================================================
+CD Formål:
+CD Sjekker om gitt punkt ligger innenfor yttergrensen for polygon angitt
+CD av struktur. Egentlig kopi av LC_POL_PTstOmkrets, men returnerer antall
+CD skjæringer istedet for inni/utenfor.
+CD Forutsetter at tabellen danner et lukket polygon
+CD Skifter ikke aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_POL_OMKR *pPO I/U Peker til beskrivelse av omkretsen
+CD double a i Punkt som skal sjekkes
+CD double n i
+CD short ist r Antall skjæringer med omkrets fra pkt til "uendelig" øst
+CD
+CD Bruk:
+CD ist = LC_POL_PTstOmkrets(pPO,a,n);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_POL_OmkretsSkjaering(LC_POL_OMKR *pPO,double a,double n)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_POL_ELEMENT *pPE;
+ short sAntSkjaer = 0;
+ LC_BGR AktBgr = Sys.GrId; /* Husk gruppenummer for aktuell gruppe */
+
+
+ // Har ytre avgrensning?
+ if (pPO == NULL || pPO->pForstePE == NULL) return 0; // ==> Avbryter, har ikke noen ytre avgrensning
+
+
+ double dEnhet = pPO->pForstePE->Bgr.pFil->TransPar.dEnhet;
+
+ // Pluss på et lite tillegg for å unngå treff på node
+ a += dEnhet / 1000.0;
+ n += dEnhet / 1000.0;
+
+ /*
+ * Sjekk omkretsen ved å beregne antall skjæringer mellom omkretsen
+ * og en linje fra "test-punktet" til "uendelig øst".
+ */
+
+ for (pPE = pPO->pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ /* Beregn skjæringer med denne gruppen */
+ sAntSkjaer += LR_PTstGruppe(&pPE->Bgr,a,n);
+ }
+
+ /* Les inn opprinnelig gruppe igjen */
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ return sAntSkjaer;
+}
+
+
+/*
+AR-950421
+CH LC_POL_Box Henter omskreven boks
+CD =======================================================================
+CD Bruk:
+CD LC_POL_Box(pPA,&nva,&nvn,&oha,&ohn);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_POL_OMKR *pPO I Peikar til polygonadministrasjonsblokka
+CD double *nva U
+CD double *nvn U
+CD double *oha U
+CD double *ohn U
+CD
+CD Henter omskriven boks for polygon.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_POL_Box(LC_POL_OMKR *pPO,double *nva,double *nvn, double *oha,double*ohn)
+{
+ LC_POL_ELEMENT *pPE;
+ double na,nn,oa,on;
+ /* Omskreven boks */
+ double mina = (double)LONG_MAX;
+ double minn = (double)LONG_MAX;
+ double maxa = (double)LONG_MIN;
+ double maxn = (double)LONG_MIN;
+
+ for (pPE = pPO->pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+
+ if (LC_GetGrWin(&pPE->Bgr,&na,&nn,&oa,&on) ) {
+ if (na < mina) mina = na;
+ if (nn < minn) minn = nn;
+ if (oa > maxa) maxa = oa;
+ if (on > maxn) maxn = on;
+ }
+ }
+
+ *nva = mina;
+ *nvn = minn;
+ *oha = maxa;
+ *ohn = maxn;
+}
+
+
+/*
+AR-950421
+CH LC_ErLinjeRefLin Sjekk om linje inneholder referanser
+CD =======================================================================
+CD Bruk:
+CD sRefLin = LC_ErLinjeRefLin(gp,sRefLin);
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD char *pszGinfoLin i Peikar til GINFO-linje
+CD short sRefLin i Flagg som viser om forrige linje inneholdt referanser
+CD short sRefLin r Flagg som viser om aktuell linje inneholdt referanser
+CD
+CD Sjekk om linje er linje med referanser.
+CD =======================================================================
+*/
+short LC_ErLinjeRefLin(char *pszSosiLin, short sRefLin)
+{
+ /* Sjekk om dette er referanselinje */
+ if (strncmp(pszSosiLin,".. ",3) == 0) {
+ return UT_TRUE;
+
+ } else if (strncmp(pszSosiLin,"..REF ",6) == 0) {
+ //if (sRefLin == UT_TRUE) {
+ // UT_FPRINTF(stderr,"Ulovlig SOSI-syntaks \"%s\" i gruppe \"%s : %s\"\n",pszSosiLin,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ // Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ //}
+ return UT_TRUE;
+
+ } else if (sRefLin == UT_TRUE) {
+ /* Annet SOSI-navn */
+ if (*pszSosiLin == '.') {
+ return UT_FALSE;
+
+ } else {
+ return UT_TRUE;
+ }
+
+ } else {
+ return UT_FALSE;
+ }
+}
diff --git a/src/FYBA/FYLR.cpp b/src/FYBA/FYLR.cpp
new file mode 100644
index 0000000..a56879e
--- /dev/null
+++ b/src/FYBA/FYLR.cpp
@@ -0,0 +1,2240 @@
+/* === 911001 ============================================================ */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fylr.c */
+/* Ansvarlig: Andreas Røstad */
+/* Innhold: Rutiner for geografisk søking mm. i fysak-pc */
+/* ======================================================================= */
+
+#include "stdafx.h"
+
+#include <float.h>
+#include <math.h>
+#include <limits.h>
+#include <memory.h>
+
+
+/* Globale variabler */
+extern LC_SYSTEMADM Sys;
+
+/* --- Lokale rutiner */
+static LC_R_LEAF * LR_R_Insert(long lGrNr,LC_BOKS * pB,LC_R_NODE * pFar,LC_R_NODE * pRN,LC_R_NODE * *ppNyRN);
+static LC_R_NODE * LR_R_CreateRNode( LC_R_NODE * pFar,short sSonType);
+static LC_R_LEAF * LR_R_CreateRLeaf(long lGrNr, LC_BOKS * pB,LC_R_NODE * pFar);
+static void LR_R_BoksSum(LC_BOKS * pB1,LC_BOKS * pB2);
+static double LR_BoksDeltaArealSum(LC_BOKS * pB1,LC_BOKS * pB2);
+static void LR_LeggTilKB(LC_GEO_STATUS * pGeoStat,LC_FILADM *pFil,long lNr);
+static short LR_R_BoksTestIntersect(LC_BOKS * pB1,LC_BOKS * pB2);
+static void LR_R_SjekkNode(LC_GEO_STATUS * pGeoStat,LC_BOKS * pB,LC_FILADM *pFil,LC_R_NODE * pRN);
+static void LR_R_SjekkNodeFlate(LC_GEO_STATUS * pGeoStat,LC_BOKS * pB,LC_FILADM *pFil,LC_R_NODE * pRN);
+static void LR_VelgMetode(LC_GEO_STATUS * pGeoStat);
+
+//#ifdef TEST
+//#include <string.h>
+//static void LR_R_DumpNode(LC_R_NODE * pRN, int iNivo);
+static void LR_R_DumpLov(LC_R_LEAF * pRL, LC_FILADM *pDumpFil, int iNivo, double dA, double dN,long *plAntBarn);
+static void LR_R_DumpNode(LC_R_NODE * pRN, LC_FILADM *pDumpFil, int iNivo, double dA, double dN, double dLengde,long *plAntBarn);
+//#endif
+
+
+
+
+#define MAX_REF 25
+
+
+/*
+AR:2000-07-25
+CH LC_GetGrWin Hent omskrevet rektangel for gruppe
+CD ==========================================================================
+CD Formål:
+CD Henter omskrevet rektangel for gitt gruppe.
+CD For flater er refererte grupper medregnet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pBgr i Gruppenummer
+CD double *nva u Omskrevet rektangel for gruppen. Avrundet utover
+CD double *nvn u en enhet.
+CD double *oha u
+CD double *ohn u
+CD short ist r Status. UT_TRUE=OK, UT_FALSE=ulovlig gruppenummer.
+CD
+CD Bruk:
+CD ist = LC_GetGrWin(&Bgr,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetGrWin(LC_BGR * pBgr,double *nva,double *nvn,double *oha,double *ohn)
+{
+ LC_R_LEAF * pRL;
+
+ /* LO_TestFilpeker(pBgr->pFil,"LC_GetGrWin"); */
+ LO_TestFilpeker(pBgr->pFil,"GetGrWin");
+
+ /* Lovlig gruppe */
+ if (pBgr->lNr >= 0L && pBgr->lNr < pBgr->pFil->lAntGr) {
+ pRL = LI_GetGeo(pBgr->pFil,pBgr->lNr);
+
+ if (pRL != NULL) {
+ *nva = pRL->Boks.dMinAust;
+ *nvn = pRL->Boks.dMinNord;
+ *oha = pRL->Boks.dMaxAust;
+ *ohn = pRL->Boks.dMaxNord;
+
+ } else {
+ *nva = *nvn = (double)LONG_MAX;
+ *oha = *ohn = (double)LONG_MIN;
+ }
+
+ return UT_TRUE; /* ======> */
+ }
+
+ /* Ulovlig gruppe */
+ LC_Error(36,"(LC_GetGrWin)","");
+ return UT_FALSE;
+}
+
+
+/*
+AR-930608
+CH LR_Indx Beregn geografiske ruter for gruppe
+CD ==========================================================================
+CD Formål:
+CD Beregner og lagrer omskrevet boks for koordinatene på aktuell gruppe.
+CD
+CD Parametre: ingen
+CD
+CD Bruk:
+CD LR_Indx();
+ ==========================================================================
+*/
+void LR_Indx(void)
+{
+ short sfeil;
+ long pt;
+ double min_n,min_a,max_n,max_a;
+ double radius,aust,nord,fi,dfi;
+ LC_BOKS Boks;
+
+ // UT_FPRINTF(stderr,"Indeks for: %s\n",LX_GetGi(1));
+
+ /* Bygg ny indeks */
+ if (Sys.pGrInfo->nko > 0) {
+
+ /* Nullstill omskreven boks */
+ min_a = min_n = (double)LONG_MAX;
+ max_a = max_n = (double)LONG_MIN;
+
+ /* Handterer "bue" */
+ if (Sys.pGrInfo->gnavn == L_BUE || Sys.pGrInfo->gnavn == L_BUEP ||
+ Sys.pGrInfo->gnavn == L_SIRKEL || Sys.pGrInfo->gnavn == L_SIRKELP) {
+
+ if (LC_GetBuePar(HENT_FORRFRA,&aust,&nord,&radius,&fi,&dfi,&sfeil)) {
+ /* Beregner omskrevet rektangel for "buen" */
+ GM_buebox(aust,nord,radius,fi,dfi,&min_a,&min_n,&max_a,&max_n);
+
+ } else {
+ if (Sys.pGrInfo->gnavn == L_BUE) {
+ /* Ulovlig bue-angivelse */
+ //LC_Error(130,"(LR_Indx)",LX_GetGi(1));
+ UT_FPRINTF(stderr,"Ulovlig forhold mellom koordinater og radius i: %s : %s\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ }
+
+ // Spesialhandtering av ulogiske sirkler og buer. Håndteres som KURVE
+ for (pt=0; pt<Sys.pGrInfo->nko; pt++) {
+ min_a = min(min_a,*(Sys.pdAust + pt));
+ min_n = min(min_n,*(Sys.pdNord + pt));
+ max_a = max(max_a,*(Sys.pdAust + pt));
+ max_n = max(max_n,*(Sys.pdNord + pt));
+ }
+ }
+
+ /* Andre grupper enn "bue" */
+ } else {
+ /* Omskreven firkant */
+ for (pt=0; pt<Sys.pGrInfo->nko; pt++) {
+ min_a = min(min_a,*(Sys.pdAust + pt));
+ min_n = min(min_n,*(Sys.pdNord + pt));
+ max_a = max(max_a,*(Sys.pdAust + pt));
+ max_n = max(max_n,*(Sys.pdNord + pt));
+ }
+ }
+
+ /* Beregn omskreven boks */
+ /* Nedre venstre justeres ut en enhet */
+ Boks.dMinAust = min_a - Sys.pGrInfo->dEnhet;
+ Boks.dMinNord = min_n - Sys.pGrInfo->dEnhet;
+ /* Øvre høyre justeres ut en enhet */
+ Boks.dMaxAust = max_a + Sys.pGrInfo->dEnhet;
+ Boks.dMaxNord = max_n + Sys.pGrInfo->dEnhet;
+
+ // Finnes ikke i treet fra før
+ if (Sys.pGrInfo->pRL == NULL ) {
+ /* Lagre omskrevet boks i søketreet */
+ Sys.pGrInfo->pRL = LR_InsertGeo(Sys.GrId.pFil,Sys.GrId.lNr,&Boks);
+
+ // Sjekk om boksen avviker fra gammel boks
+ } else if (memcmp(&(Sys.pGrInfo->pRL->Boks),&Boks,sizeof(LC_BOKS)) != 0) {
+
+ /* Fjern eventuell gammel forekomst i R-treet */
+ LR_R_Delete(Sys.pGrInfo->pRL);
+
+ /* Lagre omskreven firkant i søketreet */
+ Sys.pGrInfo->pRL = LR_InsertGeo(Sys.GrId.pFil,Sys.GrId.lNr,&Boks);
+ }
+
+ } else if (Sys.pGrInfo->pRL != NULL) {
+ /* Fjern eventuell gammel forekomst i R-treet */
+ LR_R_Delete(Sys.pGrInfo->pRL);
+ Sys.pGrInfo->pRL = NULL;
+ }
+}
+
+
+// ==========================================================================
+SK_EntPnt_FYBA void LC_DumpGeoRtre(LC_FILADM *pFil)
+{
+ short ostat;
+ LC_FILADM *pDumpFil;
+ long lAntBarn = 0;
+
+ // Åpner ny SOSI-fil for dump
+ HO_New("Indeksdump.sos", 99, 0.0, 0.0, 0.001, 0.001, 0.001,
+ -151000, -151000, 151000, 1000);
+ if (LC_OpenSos("Indeksdump.sos",LC_BASE_FRAMGR,LC_NY_IDX,LC_INGEN_STATUS,&pDumpFil,&ostat))
+ {
+ short sUtvidModus = LC_GetUtvidModus();
+ long lMaxSkriv = LC_InqMaxSkriv();
+ LC_SetUtvidModus(LC_UTVID_RASK);
+ LC_MaxSkriv(100000000L);
+
+ if (pFil->pGeoRN != NULL)
+ {
+ LR_R_DumpNode(pFil->pGeoRN,pDumpFil,0, 0.0, 0.0, 100000.0,&lAntBarn);
+ }
+
+ LC_MaxSkriv(lMaxSkriv);
+ LC_Save();
+ LC_SetUtvidModus(sUtvidModus);
+
+ LC_CloseSos(pDumpFil,SAVE_IDX);
+ }
+}
+
+
+// ==========================================================================
+static void LR_R_DumpNode(LC_R_NODE * pRN, LC_FILADM *pDumpFil, int iNivo, double dA, double dN, double dLengde,long *plAntBarn)
+{
+ LC_BGR Bgr;
+ char szTx[100];
+ int i;
+ long lSnr;
+ double dDeltaN;
+ long lBarn = 0;
+
+ iNivo++;
+ /* Rekursiv sjekk av de underliggende løv eller nodene */
+ for (i=0; i<pRN->sSonAnt; i++) {
+ LC_NyGr(pDumpFil,".LINJE",&Bgr,&lSnr);
+ LC_PutGi(LC_AppGiL(), "..LTEMA 1000");
+ LC_PutTK(LC_AppKoL(), dA, dN);
+ dDeltaN = dLengde;
+
+ if (i == 0) {
+ LC_PutTK(LC_AppKoL(), dA-dLengde, dN-dDeltaN);
+ LC_WxGr(SKRIV_OPTIMALT);
+
+ if (pRN->sSonType == LC_LEAF) {
+ LR_R_DumpLov(pRN->Son.pLeaf[i], pDumpFil, iNivo, dA-dLengde, dN-dDeltaN, &lBarn);
+ } else {
+ LR_R_DumpNode(pRN->Son.pNode[i], pDumpFil, iNivo, dA-dLengde, dN-dDeltaN, dLengde / 3.1, &lBarn);
+ }
+
+ } else if (i == 1) {
+ LC_PutTK(LC_AppKoL(), dA, dN-dDeltaN);
+ LC_WxGr(SKRIV_OPTIMALT);
+
+ if (pRN->sSonType == LC_LEAF) {
+ LR_R_DumpLov(pRN->Son.pLeaf[i], pDumpFil, iNivo, dA, dN-dDeltaN, &lBarn);
+ } else {
+ LR_R_DumpNode(pRN->Son.pNode[i], pDumpFil, iNivo, dA, dN-dDeltaN, dLengde / 3.1, &lBarn);
+ }
+
+ } else {
+ LC_PutTK(LC_AppKoL(), dA+dLengde, dN-dDeltaN);
+ LC_WxGr(SKRIV_OPTIMALT);
+
+ if (pRN->sSonType == LC_LEAF) {
+ LR_R_DumpLov(pRN->Son.pLeaf[i], pDumpFil, iNivo, dA+dLengde, dN-dDeltaN, &lBarn);
+ } else {
+ LR_R_DumpNode(pRN->Son.pNode[i], pDumpFil, iNivo, dA+dLengde, dN-dDeltaN, dLengde / 3.1, &lBarn);
+ }
+ }
+ }
+
+ // Skriv ut noden
+ LC_NyGr(pDumpFil,".PUNKT",&Bgr,&lSnr);
+ LC_PutGi(LC_AppGiL(), "..PTEMA 3000");
+ LC_PutGi(LC_AppGiL(), "..NODE 1");
+
+ UT_SNPRINTF(szTx,100,"..NIVÅ %d", iNivo-1);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ UT_SNPRINTF(szTx,100,"..MIN-NØ %f %f", pRN->Boks.dMinNord, pRN->Boks.dMinAust);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ UT_SNPRINTF(szTx,100,"..MAX-NØ %f %lf", pRN->Boks.dMaxNord, pRN->Boks.dMaxAust);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ UT_SNPRINTF(szTx,100,"..DELTA-NØ %f %f",
+ pRN->Boks.dMaxNord - pRN->Boks.dMinNord,
+ pRN->Boks.dMaxAust - pRN->Boks.dMinAust);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ UT_SNPRINTF(szTx,100,"..BARN %ld",lBarn);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ LC_PutTK(LC_AppKoL(), dA, dN);
+ LC_WxGr(SKRIV_OPTIMALT);
+
+ (*plAntBarn) += lBarn;
+
+}
+
+
+// ==========================================================================
+static void LR_R_DumpLov(LC_R_LEAF * pRL, LC_FILADM *pDumpFil, int iNivo, double dA, double dN, long *plAntBarn)
+{
+ LC_BGR Bgr;
+ char szTx[100];
+ long lSnr;
+
+
+ (*plAntBarn)++;
+ // Skriv ut løvet
+ LC_NyGr(pDumpFil,".PUNKT",&Bgr,&lSnr);
+ LC_PutGi(LC_AppGiL(), "..PTEMA 5000");
+ LC_PutGi(LC_AppGiL(), "..LØV 1");
+
+ UT_SNPRINTF(szTx,100,"..NR %ld", pRL->lNr);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ UT_SNPRINTF(szTx,100,"..NIVÅ %d", iNivo);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ UT_SNPRINTF(szTx,100,"..MIN-NØ %f %f", pRL->Boks.dMinNord, pRL->Boks.dMinAust);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ UT_SNPRINTF(szTx,100,"..MAX-NØ %f %f", pRL->Boks.dMaxNord, pRL->Boks.dMaxAust);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ UT_SNPRINTF(szTx,100,"..DELTA-NØ %f %f",
+ pRL->Boks.dMaxNord - pRL->Boks.dMinNord,
+ pRL->Boks.dMaxAust - pRL->Boks.dMinAust);
+ LC_PutGi(LC_AppGiL(), szTx);
+
+ LC_PutTK(LC_AppKoL(), dA, dN);
+ LC_WxGr(SKRIV_OPTIMALT);
+}
+
+
+/*
+AR-900214
+CH LR_IndxFlate Beregn geografisk indeks for flate
+CD =============================================================================
+CD Formål:
+CD Utvider omskrevet boks for aktuell gruppe, slik at den tar hensyn til
+CD referanser.
+CD
+CD Parametre: ingen
+CD
+CD Bruk:
+CD LR_IndxFlate();
+ =============================================================================
+*/
+void LR_IndxFlate(void)
+{
+ long ref_arr[MAX_REF];
+ unsigned char ref_status[MAX_REF];
+ long ant_ref;
+ short s,ngi;
+ long nko;
+ unsigned short info;
+ double min_n,min_a,max_n,max_a;
+ LC_R_LEAF * pRL;
+ LC_FILADM *pFi = Sys.GrId.pFil;
+ LC_GRF_STATUS GrfStat;
+ LC_BOKS Boks;
+ short sRefBrukt = UT_FALSE;
+
+
+ LC_GetGrPara(&ngi,&nko,&info);
+
+ /* Sjekk om gruppen har referanser */
+ if ((info & GI_REF) != 0 || nko >0) {
+
+ /* Nullstill omskreven boks */
+ min_a = min_n = (double)LONG_MAX;
+ max_a = max_n = (double)LONG_MIN;
+
+ /* Koordinater direkte på denne gruppen */
+ if (nko > 0) {
+ pRL = LI_GetGeo(pFi,Sys.GrId.lNr);
+ if (pRL != NULL) {
+ min_a = pRL->Boks.dMinAust;
+ min_n = pRL->Boks.dMinNord;
+ max_a = pRL->Boks.dMaxAust;
+ max_n = pRL->Boks.dMaxNord;
+
+ } else {
+ /* Initier med inverse område fra filhodet */
+ min_a = Sys.GrId.pFil->Omraade.dMaxAust;
+ min_n = Sys.GrId.pFil->Omraade.dMaxNord;
+ max_a = Sys.GrId.pFil->Omraade.dMinAust;
+ max_n = Sys.GrId.pFil->Omraade.dMinNord;
+ }
+
+ } else {
+ /* Initier med inverse område fra filhodet */
+ min_a = Sys.GrId.pFil->Omraade.dMaxAust;
+ min_n = Sys.GrId.pFil->Omraade.dMaxNord;
+ max_a = Sys.GrId.pFil->Omraade.dMinAust;
+ max_n = Sys.GrId.pFil->Omraade.dMinNord;
+ }
+
+ LC_InitGetRefFlate(&GrfStat);
+ /*
+ * Bygger opp omskreven firkant for gruppen ut fra omskreven
+ * firkant for gruppene som inngår.
+ * (Behandle bare ytre avgrensing.)
+ */
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+ do {
+ for (s=0; s<ant_ref; s++) {
+ pRL = LI_GetGeo(pFi,ref_arr[s]);
+ if (pRL != NULL) {
+ min_a = min(min_a, pRL->Boks.dMinAust);
+ min_n = min(min_n, pRL->Boks.dMinNord);
+ max_a = max(max_a, pRL->Boks.dMaxAust);
+ max_n = max(max_n, pRL->Boks.dMaxNord);
+ }
+ }
+
+ if (ant_ref > 0) sRefBrukt = UT_TRUE;
+
+ if (ant_ref < MAX_REF) break;
+
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+ } while (ant_ref > 0);
+
+ /* Lagre omskreven firkant i søketreet */
+ Boks.dMinAust = min_a;
+ Boks.dMinNord = min_n;
+ Boks.dMaxAust = max_a;
+ Boks.dMaxNord = max_n;
+
+ /* Fjern eventuell representasjonspunktet fra R-treet */
+ if (Sys.pGrInfo->pRL != NULL) LR_R_Delete(Sys.pGrInfo->pRL);
+
+ /* Legger inn hele flaten */
+ Sys.pGrInfo->pRL = LR_InsertGeo(Sys.GrId.pFil,Sys.GrId.lNr,&Boks);
+ }
+
+ /* Husk om referanser er brukt */
+ if (sRefBrukt == UT_TRUE) {
+ LI_SetBt(pFi,Sys.GrId.lNr,BT_REFBOX);
+ } else {
+ LI_ClrBt(pFi,Sys.GrId.lNr,BT_REFBOX);
+ }
+}
+
+/*
+AR-911003
+CH LC_SBGeo Sett søkegrense for grov geografisk søk
+CD =============================================================================
+CD Formål:
+CD Definerer geografisk område for geografisk søk.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus.
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR og /eller LC_BAKGR
+CD double nv_a i Koordinat nedre venstre hjørne.
+CD double nv_n i
+CD double oh_a i Koordinat øvre høyre hjørne.
+CD double oh_n i
+CD
+CD Bruk:
+CD LC_GEO_STATUS GeoStat;
+CD .
+CD LC_SBGeo(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+CD if (LC_FFGeo(&GeoStat,&Bgr)) {
+CD do{
+CD . Behandle funnet gruppe
+CD .
+CD } while (LC_FNGeo(&GeoStat,&bgr));
+CD }
+CD LC_AvsluttSok(&GeoStat);
+CD .
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SBGeo(LC_GEO_STATUS * pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+{
+ /* Normaliserer vinduet */
+ GM_NormVindu(&nv_a,&nv_n,&oh_a,&oh_n);
+
+ /* Avrunder ut til nærmeste meter utover */
+ /* Nedre venstre ut til nærneste heltall under */
+ //pGeoStat->nvn = (long)floor(nv_n);
+ //pGeoStat->nva = (long)floor(nv_a);
+ /* Øvre høyre ut til nærneste heltall over */
+ //pGeoStat->ohn = (long)ceil(oh_n);
+ //pGeoStat->oha = (long)ceil(oh_a);
+
+ pGeoStat->nvn = nv_n;
+ pGeoStat->nva = nv_a;
+ pGeoStat->ohn = oh_n;
+ pGeoStat->oha = oh_a;
+
+ /* Husk lag */
+ pGeoStat->usLag = usLag;
+
+ /* Nullstiller resultatpekerne */
+ pGeoStat->pForsteKB = NULL;
+ pGeoStat->pSisteKB = NULL;
+ pGeoStat->pAktuellKB = NULL;
+
+ /* Velg søkemetode */
+ LR_VelgMetode(pGeoStat);
+}
+
+
+/*
+AR-911003
+CH LC_FFGeo Finn første ved geografisk søk
+CD ==========================================================================
+CD Formål:
+CD Finner første gruppe i det definerte området for kombinert geografisk søk.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD LC_BGR * pBgr u Funnet gruppe
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD Se under LC_SBGeo.
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_FFGeo(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+{
+ /* Bruker R-tre */
+ if (pGeoStat->usMetode == LC_GEO_RTRE) {
+ LC_BOKS Boks;
+ LC_FILADM *pFil;
+
+ /* Beregn søkeboksen */
+ Boks.dMinAust = pGeoStat->nva;
+ Boks.dMinNord = pGeoStat->nvn;
+ Boks.dMaxAust = pGeoStat->oha;
+ Boks.dMaxNord = pGeoStat->ohn;
+
+ /* Frigir eventuell gammel resultatkjede */
+ LC_AvsluttSok(pGeoStat);
+
+ /* Sjekker alle filer */
+ LC_InitNextFil(&pFil);
+ while (LC_NextFil(&pFil,pGeoStat->usLag)) {
+ /* Filen inneholder data, må sjekke alle berørte noder */
+ if (pFil->pGeoRN != NULL) {
+ LR_R_SjekkNode(pGeoStat,&Boks,pFil,pFil->pGeoRN);
+ }
+ }
+
+ pGeoStat->pAktuellKB = pGeoStat->pForsteKB;
+ if (pGeoStat->pAktuellKB != NULL) {
+ /* Tilslag */
+ *pBgr = pGeoStat->pAktuellKB->Bgr;
+ return UT_TRUE;
+ }
+
+ /* Sekvensiell gjennomgang av alle grupper */
+ } else {
+ LC_BGR Bgr;
+ LC_R_LEAF * pRL;
+
+ LC_InitNextBgr(&Bgr);
+ while (LC_NextBgr(&Bgr,pGeoStat->usLag)) {
+ pRL = LI_GetGeo(Bgr.pFil,Bgr.lNr);
+ if (pRL != NULL) {
+ /* Sjekk område-tabellen */
+ if (pGeoStat->ohn >= pRL->Boks.dMinNord && pGeoStat->oha >= pRL->Boks.dMinAust &&
+ pGeoStat->nvn <= pRL->Boks.dMaxNord && pGeoStat->nva <= pRL->Boks.dMaxAust) {
+ *pBgr = pGeoStat->Bgr = Bgr; /* Tilslag */
+ return UT_TRUE;
+ }
+ }
+ }
+
+ /* Ikke tilslag */
+ pGeoStat->Bgr = Bgr;
+ }
+
+ /* Ikke tilslag */
+ return UT_FALSE;
+}
+
+
+/*
+AR-911003
+CH LR_R_SjekkNode Sjekker node om overlappende boks
+CD ==========================================================================
+CD Formål:
+CD Sjekker en node og underliggende noder om de har lagret bokser
+CD som overlapper søkerektanglet. De gruppene som blir funnet blir hengt på
+CD kjeden med søkeresultat i pGeoStat.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat i Peker til struktur for søkestatus
+CD LC_BOKS * pB i Søkeboks
+CD LC_FILADM * pFil i Filpeker
+CD LC_R_NODE * pRN i Peker til node som skal sjekkes
+CD
+CD Bruk:
+CD LR_R_SjekkNode(pGeoStat,pB,pFil,pRN->pSon[i]);
+ ==========================================================================
+*/
+static void LR_R_SjekkNode(LC_GEO_STATUS * pGeoStat,LC_BOKS * pB,LC_FILADM *pFil,LC_R_NODE * pRN)
+{
+ int i;
+
+
+ /* Sjekk om denne noden berører søkeboksen */
+ if (LR_R_BoksTestIntersect(&(pRN->Boks),pB)) {
+
+ /* Har kommet til ytterste nivå */
+ if (pRN->sSonType == LC_LEAF) {
+
+ /* Sjekk de gruppene som er lagret under denne noden */
+ for (i=0; i<pRN->sSonAnt; i++) {
+ if (LR_R_BoksTestIntersect(&(pRN->Son.pLeaf[i]->Boks),pB)) {
+ LR_LeggTilKB(pGeoStat,pFil,pRN->Son.pLeaf[i]->lNr);
+ }
+ }
+
+ /* Node */
+ } else {
+
+ /* Rekursiv sjekk av de underliggende nodene */
+ for (i=0; i<pRN->sSonAnt; i++) {
+ LR_R_SjekkNode(pGeoStat,pB,pFil,pRN->Son.pNode[i]);
+ }
+ }
+ }
+}
+
+
+/*
+AR-911003
+CH LR_R_BoksTestIntersect Sjekker om to bokser "berører" hverandre
+CD ==========================================================================
+CD Formål:
+CD Sjekker om to bokser "berører" hverandre.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BOKS * pB1 i Rektangel 1
+CD LC_BOKS * pB2 i Rektangel 2
+CD short sStatus r UT_TRUE=Berører, UT_FALSE=Ikke berøring
+CD
+CD Bruk:
+CD LR_R_BoksTestIntersect(...);
+ ==========================================================================
+*/
+static short LR_R_BoksTestIntersect(LC_BOKS * pB1,LC_BOKS * pB2)
+{
+ if (pB1->dMaxNord >= pB2->dMinNord &&
+ pB1->dMaxAust >= pB2->dMinAust &&
+ pB1->dMinNord <= pB2->dMaxNord &&
+ pB1->dMinAust <= pB2->dMaxAust ) {
+
+ /* Tilslag */
+ return UT_TRUE;
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-911003
+CH LC_FNGeo Finn neste ved geografisk søk
+CD ==========================================================================
+CD Formål:
+CD Finner neste gruppe i det definerte området for geografisk søk.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD LC_BGR * pBgr u Funnet gruppe
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD Se under LC_SBGeo.
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_FNGeo(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+{
+ /* Bruker R-tre */
+ if (pGeoStat->usMetode == LC_GEO_RTRE) {
+ /* Søket er utført og ligger som en kjede */
+ if (pGeoStat->pAktuellKB != NULL) {
+ pGeoStat->pAktuellKB = pGeoStat->pAktuellKB->pNesteKB;
+ if (pGeoStat->pAktuellKB != NULL) {
+ /* Tilslag */
+ *pBgr = pGeoStat->pAktuellKB->Bgr;
+ return UT_TRUE;
+ }
+ }
+
+ /* Sekvensiell gjennomgang av alle grupper */
+ } else {
+ LC_R_LEAF * pRL;
+ LC_BGR Bgr = pGeoStat->Bgr;
+
+ while (LC_NextBgr(&Bgr,pGeoStat->usLag)) {
+ pRL = LI_GetGeo(Bgr.pFil,Bgr.lNr);
+ if (pRL != NULL) {
+ /* Sjekk område-tabellen */
+ if (pGeoStat->ohn >= pRL->Boks.dMinNord && pGeoStat->oha >= pRL->Boks.dMinAust &&
+ pGeoStat->nvn <= pRL->Boks.dMaxNord && pGeoStat->nva <= pRL->Boks.dMaxAust) {
+ *pBgr = pGeoStat->Bgr = Bgr; /* Tilslag */
+ return UT_TRUE;
+ }
+ }
+ }
+
+ /* Ikke tilslag */
+ pGeoStat->Bgr = Bgr;
+ }
+
+ /* Ikke tilslag */
+ return UT_FALSE;
+}
+
+
+/*
+AR-911003
+CH LC_FFGeoFil Finn første ved geografisk søk i en fil
+CD ==========================================================================
+CD Formål:
+CD Finner første gruppe i det definerte området for kombinert geografisk søk.
+CD Søker bare i en gitt fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD LC_FILADM * pOnsketFil i Filpeker til den filen det skal søkes i.
+CD LC_BGR * pBgr u Funnet gruppe
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD Se under LC_SBGeo.
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_FFGeoFil(LC_GEO_STATUS * pGeoStat,LC_FILADM *pOnsketFil,LC_BGR * pBgr)
+{
+ /* Bruker R-tre */
+ if (pGeoStat->usMetode == LC_GEO_RTRE) {
+ LC_BOKS Boks;
+
+ /* Beregn søkeboksen */
+ Boks.dMinAust = pGeoStat->nva;
+ Boks.dMinNord = pGeoStat->nvn;
+ Boks.dMaxAust = pGeoStat->oha;
+ Boks.dMaxNord = pGeoStat->ohn;
+
+ /* Frigir eventuell gammel resultatkjede */
+ LC_AvsluttSok(pGeoStat);
+
+ /* Sjekker den aktuelle filen */
+ if (pOnsketFil->usLag & pGeoStat->usLag) {
+ /* File inneholder data, må sjekke alle berørte noder */
+ if (pOnsketFil->pGeoRN != NULL) {
+ LR_R_SjekkNode(pGeoStat,&Boks,pOnsketFil,pOnsketFil->pGeoRN);
+ }
+ }
+
+ pGeoStat->pAktuellKB = pGeoStat->pForsteKB;
+ if (pGeoStat->pAktuellKB != NULL) {
+ /* Tilslag */
+ *pBgr = pGeoStat->pAktuellKB->Bgr;
+ return UT_TRUE;
+ }
+
+ /* Sekvensiell gjennomgang av alle grupper */
+ } else {
+ LC_BGR Bgr;
+ LC_R_LEAF * pRL;
+
+ LC_InitNextBgr(&Bgr);
+ while (LC_NextBgr(&Bgr,pGeoStat->usLag)) {
+ /* Rett fil? */
+ if (Bgr.pFil == pOnsketFil) {
+ pRL = LI_GetGeo(Bgr.pFil,Bgr.lNr);
+ if (pRL != NULL) {
+ /* Sjekk område-tabellen */
+ if (pGeoStat->ohn >= pRL->Boks.dMinNord && pGeoStat->oha >= pRL->Boks.dMinAust &&
+ pGeoStat->nvn <= pRL->Boks.dMaxNord && pGeoStat->nva <= pRL->Boks.dMaxAust) {
+ *pBgr = pGeoStat->Bgr = Bgr; /* Tilslag */
+ return UT_TRUE;
+ }
+ }
+ }
+ }
+
+ /* Ikke tilslag */
+ pGeoStat->Bgr = Bgr;
+ }
+
+ /* Ikke tilslag */
+ return UT_FALSE;
+}
+
+
+/*
+AR-911003
+CH LC_FNGeoFil Finn neste ved geografisk søk i en fil
+CD ==========================================================================
+CD Formål:
+CD Finner neste gruppe i det definerte området for geografisk søk.
+CD Søker bare i en gitt fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD LC_FILADM * pFil i Filpeker til den filen det skal søkes i.
+CD LC_BGR * pBgr u Funnet gruppe
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD Se under LC_SBGeo.
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_FNGeoFil(LC_GEO_STATUS * pGeoStat,LC_FILADM *pFil,LC_BGR * pBgr)
+{
+ /* Bruker R-tre */
+ if (pGeoStat->usMetode == LC_GEO_RTRE) {
+ if (pGeoStat->pAktuellKB != NULL) {
+ pGeoStat->pAktuellKB = pGeoStat->pAktuellKB->pNesteKB;
+ if (pGeoStat->pAktuellKB != NULL) {
+ /* Tilslag */
+ *pBgr = pGeoStat->pAktuellKB->Bgr;
+ return UT_TRUE;
+ }
+ }
+
+ /* Sekvensiell gjennomgang av alle grupper */
+ } else {
+ LC_R_LEAF * pRL;
+ LC_BGR Bgr = pGeoStat->Bgr;
+
+ while (LC_NextBgr(&Bgr,pGeoStat->usLag)) {
+
+ if (Bgr.pFil == pFil) {
+ pRL = LI_GetGeo(Bgr.pFil,Bgr.lNr);
+ if (pRL != NULL) {
+ /* Sjekk område-tabellen */
+ if (pGeoStat->ohn >= pRL->Boks.dMinNord && pGeoStat->oha >= pRL->Boks.dMinAust &&
+ pGeoStat->nvn <= pRL->Boks.dMaxNord && pGeoStat->nva <= pRL->Boks.dMaxAust) {
+ *pBgr = pGeoStat->Bgr = Bgr; /* Tilslag */
+ return UT_TRUE;
+ }
+ }
+ }
+ }
+
+ /* Ikke tilslag */
+ pGeoStat->Bgr = Bgr;
+ }
+
+ /* Ikke tilslag */
+ return UT_FALSE;
+}
+
+
+/*
+AR-911002
+CH LC_FAGeo Finn alle ved geografisk søk
+CD ==========================================================================
+CD Formål:
+CD Finn alle i geografisk søkeområde.
+CD Tilslag merkes i brukttabellen kolonne BT_GEOSOK (15).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD long lAntall r Antall funnet.
+CD
+CD Bruk:
+CD .
+CD LC_SBGeo(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+CD antall = LC_FAGeo(&Bgr);
+CD .
+ =============================================================================
+*/
+SK_EntPnt_FYBA long LC_FAGeo(LC_GEO_STATUS * pGeoStat)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_BGR AktBgr,Bgr;
+ long lAntall = 0;
+
+
+ /* Husk aktuell gruppe */
+ AktBgr = Sys.GrId;
+
+ /* Blanker brukttabellen */
+ LI_EraseBt(BT_GEOSOK,BT_GEOSOK);
+
+ /* Utfører søket */
+ if (LC_FFGeo(pGeoStat,&Bgr)) {
+ do {
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ lAntall += LC_MerkGr(BT_GEOSOK,1); /* Tilslag */
+ } while (LC_FNGeo(pGeoStat,&Bgr));
+ }
+ LC_AvsluttSok(pGeoStat);
+
+ /* Les tilbake aktuell gruppe */
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+
+ return lAntall;
+}
+
+
+/*
+AR-911003
+CH LC_SBFlate Sett søkegrense for geografisk søk på flate
+CD =============================================================================
+CD Formål:
+CD Definerer punkt for geografisk søk på flate.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR og /eller LC_BAKGR
+CD double nv_a i Koordinat nedre venstre hjørne
+CD double nv_n i
+CD double oh_a i Koordinat øvre høyre hjørne
+CD double oh_n i
+CD
+CD Bruk:
+CD LC_GEO_STATUS GeoStat;
+CD .
+CD LC_SBFlate(&GeoStat,LC_FRAMGR | LC_BAKGR,nv_a,nv_n,oh_a,oh_n);
+CD if (LC_FFFlate(&GeoStat,&Bgr)) {
+CD do{
+CD . Behandle funnet gruppe
+CD .
+CD } while (LC_FNFlate(&GeoStat,&Bgr));
+CD }
+CD LC_AvsluttSok(&GeoStat);
+CD .
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SBFlate(LC_GEO_STATUS * pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n)
+{
+ /* Normaliserer vinduet */
+ GM_NormVindu(&nv_a,&nv_n,&oh_a,&oh_n);
+
+ /* Avrunder ut til nærmeste meter utover */
+ /* Nedre venstre ut til nærneste heltall under */
+ pGeoStat->nvn = (long)floor(nv_n);
+ pGeoStat->nva = (long)floor(nv_a);
+ /* Øvre høyre ut til nærneste heltall over */
+ pGeoStat->ohn = (long)ceil(oh_n);
+ pGeoStat->oha = (long)ceil(oh_a);
+
+ /* Husk lag */
+ pGeoStat->usLag = usLag;
+
+ /* Nullstiller resultatpekerne */
+ pGeoStat->pForsteKB = NULL;
+ pGeoStat->pSisteKB = NULL;
+ pGeoStat->pAktuellKB = NULL;
+
+ /* Velg søkemetode */
+ LR_VelgMetode(pGeoStat);
+}
+
+
+/*
+AR-911003
+CH LC_FFFlate Finn første ved flatesøk
+CD =============================================================================
+CD Formål:
+CD Finner første gruppe i det definerte området for flatesøk.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD LC_BGR * pBgr u Funnet gruppe
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD Se under LC_SBFlate.
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_FFFlate(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+{
+ /* Bruker R-tre */
+ if (pGeoStat->usMetode == LC_GEO_RTRE) {
+ LC_BOKS Boks;
+ LC_FILADM *pFil;
+
+ /* Beregn søkeboksen */
+ Boks.dMinAust = pGeoStat->nva;
+ Boks.dMinNord = pGeoStat->nvn;
+ Boks.dMaxAust = pGeoStat->oha;
+ Boks.dMaxNord = pGeoStat->ohn;
+
+ /* Frigir eventuell gammel resultatkjede */
+ LC_AvsluttSok(pGeoStat);
+
+ /* Sjekker alle filer */
+ LC_InitNextFil(&pFil);
+ while (LC_NextFil(&pFil,pGeoStat->usLag)) {
+
+ /* File inneholder data, må sjekke alle berørte kvadranter */
+ if (pFil->pGeoRN != NULL) {
+ LR_R_SjekkNodeFlate(pGeoStat,&Boks,pFil,pFil->pGeoRN);
+ }
+ }
+
+ pGeoStat->pAktuellKB = pGeoStat->pForsteKB;
+
+ if (pGeoStat->pAktuellKB != NULL) {
+ /* Tilslag */
+ *pBgr = pGeoStat->pAktuellKB->Bgr;
+ return UT_TRUE;
+ }
+
+ /* Sekvensiell gjennomgang av alle grupper */
+ } else {
+ LC_BGR Bgr;
+ LC_R_LEAF * pRL;
+
+ LC_InitNextBgr(&Bgr);
+
+ while (LC_NextBgr(&Bgr,pGeoStat->usLag)) {
+ if (LI_InqBt(Bgr.pFil,Bgr.lNr,BT_REFBOX)) {
+ pRL = LI_GetGeo(Bgr.pFil,Bgr.lNr);
+ if (pRL != NULL) {
+ /* Sjekk område-tabellen */
+ if (pGeoStat->ohn >= pRL->Boks.dMinNord && pGeoStat->oha >= pRL->Boks.dMinAust &&
+ pGeoStat->nvn <= pRL->Boks.dMaxNord && pGeoStat->nva <= pRL->Boks.dMaxAust) {
+ *pBgr = pGeoStat->Bgr = Bgr; /* Tilslag */
+ return UT_TRUE;
+ }
+ }
+ }
+ }
+
+ /* Ikke tilslag */
+ pGeoStat->Bgr = Bgr;
+ }
+
+ /* Ikke tilslag */
+ return UT_FALSE;
+}
+
+
+/*
+AR-980205
+CH LR_R_SjekkNodeFlate Sjekker node om overlappende boks (flate)
+CD ==========================================================================
+CD Formål:
+CD Sjekker en node og underliggende noder om de har lagret bokser
+CD som overlapper søkerektanglet. De gruppene som blir funnet blir hengt på
+CD kjeden med søkeresultat i pGeoStat. Finner bare grupper der det er brukt
+CD referanser for oppbygging av geografisk boks.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat i Peker til struktur for søkestatus
+CD LC_BOKS * pB i Søkeboks
+CD LC_FILADM * pFil i Filpeker
+CD LC_R_NODE * pRN i Peker til node som skal sjekkes
+CD
+CD Bruk:
+CD LR_R_SjekkNodeFlate(pGeoStat,pB,pFil,pRN->pSon[i]);
+ ==========================================================================
+*/
+static void LR_R_SjekkNodeFlate(LC_GEO_STATUS * pGeoStat,LC_BOKS * pB,LC_FILADM *pFil,LC_R_NODE * pRN)
+{
+ int i;
+
+
+ /* Sjekk om denne noden berører søkeboksen */
+ if (LR_R_BoksTestIntersect(&(pRN->Boks),pB)) {
+
+ /* Har kommet til ytterste nivå */
+ if (pRN->sSonType == LC_LEAF) {
+
+ /* Sjekk de gruppene som er lagret under denne noden */
+ for (i=0; i<pRN->sSonAnt; i++) {
+ if (LR_R_BoksTestIntersect(&(pRN->Son.pLeaf[i]->Boks),pB)) {
+ /* Huskes bare hvis det er brukt referanser */
+ if (LI_InqBt(pFil,pRN->Son.pLeaf[i]->lNr,BT_REFBOX)) {
+ LR_LeggTilKB(pGeoStat,pFil,pRN->Son.pLeaf[i]->lNr);
+ }
+ }
+ }
+
+ /* Node */
+ } else {
+
+ /* Rekursiv sjekk av de underliggende nodene */
+ for (i=0; i<pRN->sSonAnt; i++) {
+ LR_R_SjekkNodeFlate(pGeoStat,pB,pFil,pRN->Son.pNode[i]);
+ }
+ }
+ }
+}
+
+
+/*
+AR-911002
+CH LC_FNFlate Finn neste ved flatesøk
+CD ==========================================================================
+CD Formål:
+CD Finner neste gruppe i det definerte området for flatesøk.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD LC_BGR * pBgr u Funnet gruppe
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD Se under LC_SBFlate.
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_FNFlate(LC_GEO_STATUS * pGeoStat,LC_BGR * pBgr)
+{
+ /* Bruker R-tre */
+ if (pGeoStat->usMetode == LC_GEO_RTRE) {
+ if (pGeoStat->pAktuellKB != NULL) {
+ pGeoStat->pAktuellKB = pGeoStat->pAktuellKB->pNesteKB;
+ if (pGeoStat->pAktuellKB != NULL) {
+ /* Tilslag */
+ *pBgr = pGeoStat->pAktuellKB->Bgr;
+ return UT_TRUE;
+ }
+ }
+
+ /* Sekvensiell gjennomgang av alle grupper */
+ } else {
+ LC_R_LEAF * pRL;
+ LC_BGR Bgr = pGeoStat->Bgr;
+
+ while (LC_NextBgr(&Bgr,pGeoStat->usLag)) {
+ if (LI_InqBt(Bgr.pFil,Bgr.lNr,BT_REFBOX)) {
+ pRL = LI_GetGeo(Bgr.pFil,Bgr.lNr);
+ if (pRL != NULL) {
+ /* Sjekk område-tabellen */
+ if (pGeoStat->ohn >= pRL->Boks.dMinNord && pGeoStat->oha >= pRL->Boks.dMinAust &&
+ pGeoStat->nvn <= pRL->Boks.dMaxNord && pGeoStat->nva <= pRL->Boks.dMaxAust) {
+ *pBgr = pGeoStat->Bgr = Bgr; /* Tilslag */
+ return UT_TRUE;
+ }
+ }
+ }
+ }
+
+ /* Ikke tilslag */
+ pGeoStat->Bgr = Bgr;
+ }
+
+ /* Ikke tilslag */
+ return UT_FALSE;
+}
+
+
+/*
+AR-890824
+CH LC_WTst Vindustest
+CD ==========================================================================
+CD Formål:
+CD Sjekk om aktuell gruppe berører gitt vindu.
+CD Tar hensyn til gruppenavnet. Handterer (PUNKT, LINJE, KURVE, BUE,
+CD BUEP, SIRKEL, SIRKELP, SVERM, TRASE ).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double nva i Avgrensing av vinduet
+CD double nvn i
+CD double oha i
+CD double ohn i
+CD short ist r status: 0 = ikke berøring
+CD 1 = skjæring
+CD
+CD Bruk:
+CD .
+CD LC_SBGeo(&GeoStat,nv_a,nv_n,oh_a,oh_n);
+CD if (LC_FFGeo(&GeoStat,&Bgr)){
+CD do{
+CD LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+CD if (LC_WTst(nv_a,nv_n,oh_a,oh_n)) { (Nøyaktig vindustest)
+CD . Behandle funnet gruppe
+CD .
+CD }
+CD } while (LC_FNGeo(&GeoStat,&Bgr));
+CD }
+CD LC_AvsluttSok(&GeoStat);
+CD .
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_WTst(double nva,double nvn,double oha,double ohn)
+{
+ short ngi,gruppenavn,sfeil;
+ long nko,pt;
+ unsigned short info;
+ double radius,aust,nord,fi,dfi;
+ double *pdAust = Sys.pdAust;
+ double *pdNord = Sys.pdNord;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Har aktuell gruppe */
+ gruppenavn = LC_GetGrPara(&ngi,&nko,&info);
+ if (nko > 0){ /* Har koordinater */
+
+ /* .BUE, .BUEP, .SIRKEL eller .SIRKELP */
+ if (gruppenavn == L_BUE || gruppenavn == L_BUEP ||
+ gruppenavn == L_SIRKEL || gruppenavn == L_SIRKELP) {
+
+ if (LC_GetBuePar(HENT_FORRFRA,&aust,&nord,&radius,&fi,&dfi,&sfeil)) {
+ /* Vindustest på buen */
+ if (GM_wtstBue(aust,nord,radius,fi,dfi,nva,nvn,oha,ohn)) {
+ return(1);
+ }
+
+ } else {
+ // Spesialhandtering av ulogiske sirkler og buer
+ // Handteres som punkt/linje
+ // Sjekk første koordinat
+ if (GM_wtst(*pdAust,*pdNord,*pdAust,*pdNord,nva,nvn,oha,ohn)) {
+ return(1);
+ }
+
+ // Sjekk resten av gruppen
+ ++pdAust;
+ ++pdNord;
+ for (pt=1; pt<Sys.pGrInfo->nko; ++pt,++pdAust,++pdNord) {
+ if (GM_wtst(*(pdAust-1),*(pdNord-1),*pdAust,*pdNord,
+ nva,nvn,oha,ohn)) {
+ return(1);
+ }
+ }
+ }
+
+ /* .PUNKT eller .SVERM */
+ } else if (gruppenavn == L_PUNKT || gruppenavn == L_SVERM) {
+ /* Sjekk om noe punkt er innenfor */
+ for (pt=1; pt<=Sys.pGrInfo->nko; ++pt) {
+ LC_GetTK(pt,&aust,&nord);
+ if (aust >= nva && aust <= oha &&
+ nord >= nvn && nord <= ohn ) {
+ return(1);
+ }
+ }
+
+ /* .TRASE */
+ } else if (gruppenavn == L_TRASE) {
+
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_POLYGON Polygon;
+ LC_POL_ELEMENT * pPE;
+ LC_BGR BgrTrase = Sys.GrId; /* Husk gruppenummer for traseen */
+
+
+ /* Initier referansehandtering, og les beskrivelsen */
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+
+ /* Behandle referansene */
+ for (pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (LC_WTst(nva,nvn,oha,ohn)) { /* (Nøyaktig vindustest) */
+ /* Frigi allokerte kjeder */
+ LC_POL_FrigiPolygon(&Polygon);
+
+ /* Les inn traseen igjen */
+ LC_RxGr(&BgrTrase,LES_OPTIMALT,&ngi,&nko,&info);
+
+ return (1);
+ }
+ }
+
+ /* Frigi allokerte kjeder */
+ LC_POL_FrigiPolygon(&Polygon);
+
+ /* Les inn traseen igjen */
+ LC_RxGr(&BgrTrase,LES_OPTIMALT,&ngi,&nko,&info);
+
+
+ /* Andre gruppenavn */
+ } else {
+ /* Sjekk første koordinat */
+ if (GM_wtst(*pdAust,*pdNord,*pdAust,*pdNord,nva,nvn,oha,ohn)) {
+ return(1);
+ }
+
+ /* Sjekk resten av gruppen */
+ ++pdAust;
+ ++pdNord;
+ for (pt=1; pt<Sys.pGrInfo->nko; ++pt,++pdAust,++pdNord) {
+ if (GM_wtst(*(pdAust-1),*(pdNord-1),*pdAust,*pdNord,
+ nva,nvn,oha,ohn)) {
+ return(1);
+ }
+ }
+ }
+ }
+ }
+ return (0);
+}
+
+
+/*
+AR-890824
+CH LC_PTst Polygontest
+CD ==========================================================================
+CD Formål:
+CD Sjekker om gitt punkt ligger innenfor polygon angitt av aktuell gruppe.
+CD Forutsetter at tabellen danner et lukket polygon
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a i Punkt som skal sjekkes
+CD double n i
+CD short ist r status: 0 = punktet er utenfor flaten
+CD 1 = punktet ligger inne på flaten
+CD
+CD Bruk:
+CD .
+CD LC_SBFlate(&GeoStat,a-d,n-d,a+d,n+d);
+CD if (LC_FFFlate(&GeoStat,&Bgr)) {
+CD do{
+CD LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+CD if (LC_PTst(a,n)){ (Nøyaktig polygontest)
+CD . Behandle funnet gruppe
+CD .
+CD }
+CD } while (LC_FNFlate(&GeoStat,&Bgr));
+CD }
+CD LC_AvsluttSok(&GeoStat);
+CD .
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PTst(double a,double n)
+{
+ LC_POLYGON Polygon;
+ short inni = 0; /* Returverdi: 1 = inne på flaten, 0 = utenfor */
+
+ // Sjekk om gruppen er flate
+ if (Sys.pGrInfo->gnavn == L_FLATE)
+ {
+ // Initier flatehandtering, og les flatebeskrivelsen
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+
+ // Utfør selve polygontesten
+ inni = LC_POL_PTst(&Polygon,a,n);
+
+ // Frigi allokerte kjeder
+ LC_POL_FrigiPolygon(&Polygon);
+ }
+
+ return inni;
+}
+
+
+/*
+AR-911002
+CH LC_PTstOmkrets Sjekk om punkt ligger inni polygon
+CD ==========================================================================
+CD Formål:
+CD Sjekker om gitt punkt ligger innenfor yttergrensen for polygon angitt
+CD av aktuell gruppe.
+CD Forutsetter at tabellen danner et lukket polygon
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a i Punkt som skal sjekkes
+CD double n i
+CD short ist r status: 0 = punktet er utenfor flaten
+CD 1 = punktet ligger inne på flaten
+CD
+CD Bruk:
+CD ist = LC_PTstOmkrets(a,n);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PTstOmkrets(double a,double n)
+{
+ long ref_arr[MAX_REF];
+ unsigned char ref_status[MAX_REF];
+ long ant_ref;
+ short ngi,s;
+ long nko;
+ unsigned short info;
+ LC_GRF_STATUS GrfStat;
+ LC_BGR Bgr;
+ short sAntSkjaer = 0;
+ LC_BGR Flate = Sys.GrId; /* Husk gruppenummer for flaten */
+
+ Bgr.pFil = Flate.pFil;
+
+ double dEnhet = Sys.pGrInfo->dEnhet;
+
+ // Pluss på et lite tillegg for å unngå treff på node
+ a += dEnhet / 1000.0;
+ n += dEnhet / 1000.0;
+
+ /* Sjekk om gruppen er flate */
+ if (LC_GetGrPara(&ngi,&nko,&info) == L_FLATE){
+
+ LC_InitGetRefFlate(&GrfStat);
+
+ /* Behandle ytre avgrensing */
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+ do {
+ for (s=0; s<ant_ref; s++) {
+ Bgr.lNr = ref_arr[s];
+ sAntSkjaer += LR_PTstGruppe(&Bgr,a,n);
+ }
+ /* Les inn flaten igjen */
+ LC_RxGr(&Flate,LES_OPTIMALT,&ngi,&nko,&info);
+
+ if (ant_ref < MAX_REF) break;
+
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+ } while (ant_ref > 0);
+ }
+
+ /* Sjekk om punktet er innenfor */
+ return ((sAntSkjaer % 2) == 1)? 1 : 0;
+}
+
+
+/*
+AR-921028
+CH LR_PTstGruppe Sjekk om punkt ligger inni polygon
+CD ==========================================================================
+CD Formål:
+CD Sjekker antall skjæringer mellom gitt gruppe og linje fra gitt punkt
+CD til "uendelig" øst.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pBgr i Peker til datagruppe
+CD double a i Punkt som skal sjekkes
+CD double n i
+CD short sAntSkjaer r Antall skjæringer
+CD
+CD Bruk:
+CD ist = LR_PTstOmkrets(&Bgr,a,n);
+ ==========================================================================
+*/
+short LR_PTstGruppe(LC_BGR * pBgr,double a,double n)
+{
+ double maxa = 99999999999.0; /* "Uendelig" øst */
+ short ngi,gruppenavn,sfeil;
+ long pt,nko;
+ unsigned short info;
+ #define ARR_LEN 50
+ long punkt, antall;
+ double a1,n1,a2,n2,radius,as,ns,fi,dfi;
+ double n_arr[ARR_LEN],a_arr[ARR_LEN];
+ LC_POLYGON Polygon;
+ LC_POL_ELEMENT * pPE;
+ LC_BGR BgrTrase;
+ short sAntSkjaer = 0;
+
+
+ /* Sjekk gruppen */
+ gruppenavn = LC_RxGr(pBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (nko > 0) {
+
+ /* .TRASE */
+ if (gruppenavn == L_TRASE) {
+ BgrTrase = Sys.GrId; /* Husk gruppenummer for traseen */
+
+ /* Initier referansehandtering, og les beskrivelsen */
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+
+ /* Behandle referansene */
+ for (pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ sAntSkjaer += LR_PTstGruppe(&pPE->Bgr,a,n);
+ }
+
+ /* Frigi allokerte kjeder, og les inn traseen igjen */
+ LC_POL_FrigiPolygon(&Polygon);
+ LC_RxGr(&BgrTrase,LES_OPTIMALT,&ngi,&nko,&info);
+
+ /* "bue" */
+ } else if (gruppenavn == L_BUE || gruppenavn == L_BUEP ||
+ gruppenavn == L_SIRKEL || gruppenavn == L_SIRKELP) {
+
+ if (LC_GetBuePar(HENT_FORRFRA,&as,&ns,&radius,&fi,&dfi,&sfeil)) {
+ sAntSkjaer += GM_sLinBue(as,ns,radius,fi,dfi,
+ a,n,maxa,n,&a1,&n1,&a2,&n2);
+ }
+
+ /* Annen gruppe */
+ } else {
+ punkt = 1;
+ do { /* Finn skjæringspunkter */
+ LC_GetArrayTK(HENT_FORRFRA,ARR_LEN,punkt,a_arr,n_arr,&antall);/* Henter */
+ if (antall > 0) {
+ for (pt=1; pt<antall; pt++) {
+ sAntSkjaer += GM_shor(a_arr[pt-1],n_arr[pt-1],
+ a_arr[pt],n_arr[pt],a,n,maxa,n,&a1,&n1);
+ }
+ punkt += (antall-1);
+ }
+ } while (punkt < nko);
+ }
+ }
+
+ return sAntSkjaer;
+}
+
+
+/*
+AR-980108
+CH LR_InsertGeo Legg gruppen inn i geografisk indeks
+CD =======================================================================
+CD Bruk:
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_FILADM * pFil i Filpeker
+CD long lNr i Gruppenummer i filen
+CD LC_BOKS * pB i Boks som skal legges inn i treet
+CD LC_R_LEAF * pRL r Peker inn i geografisk søketre
+CD
+CD Formål:
+CD Legg gruppen inn i geografisk indeks.
+CD Forutsetter at grupen ikke ligger i søketreet fra før.
+CD =======================================================================
+*/
+LC_R_LEAF * LR_InsertGeo(LC_FILADM *pFil,long lNr,LC_BOKS * pB)
+{
+ LC_R_NODE * pNyRN,*pRotRN;
+ LC_R_LEAF * pRL;
+
+
+ /* Lagre omskrevet boks i søketreet */
+ pRL = LR_R_Insert(lNr,pB,NULL,pFil->pGeoRN,&pNyRN);
+
+ /* Hvis rot-noden er splittet må det lages ny rot-node */
+ if (pNyRN != NULL) {
+ if (pFil->pGeoRN != NULL) {
+ /* Lag ny rot-node */
+ pRotRN = LR_R_CreateRNode(NULL,LC_NODE);
+ pRotRN->Son.pNode[0] = pFil->pGeoRN;
+ pRotRN->Son.pNode[1] = pNyRN;
+ pRotRN->sSonAnt = 2;
+
+ /* Oppdater boks */
+ pRotRN->Boks = pFil->pGeoRN->Boks;
+ LR_R_BoksSum(&(pRotRN->Boks),&(pNyRN->Boks));
+
+ /* Oppdater far i sønnene */
+ pFil->pGeoRN->pFar = pRotRN;
+ pNyRN->pFar = pRotRN;
+
+ pFil->pGeoRN = pRotRN;
+
+ } else {
+ pFil->pGeoRN = pNyRN;
+ }
+ }
+
+ return pRL;
+}
+
+
+/*
+AR-980108
+CH LR_R_Insert Insert i R-tre
+CD =======================================================================
+CD Bruk:
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD long lGrNr i Gruppenummer i filen
+CD LC_BOKS *pB i Boks som skal legges inn i treet
+CD LC_R_NODE *pFar i Peker til far i quad-treet
+CD LC_R_NODE *pRN i Peker til node i R-treet
+CD LC_R_NODE **ppNyRN u Peker til peker til nyopprettet node i R-treet
+CD LC_R_LEAF *pRL r Peker til forekomst i R-treet
+CD
+CD Formål:
+CD Leger inn et rektangl i R-treet med rot i node pRN.
+CD Hvis pRN == NULL (Tomt tre) settes *ppNyRN til å peke til et nyt tre.
+CD =======================================================================
+*/
+static LC_R_LEAF * LR_R_Insert(long lGrNr,LC_BOKS *pB,LC_R_NODE *pFar,LC_R_NODE *pRN,LC_R_NODE **ppNyRN)
+{
+ LC_R_NODE *pNyRN,*pKandidatRN[LC_R_MAX_SON+1];
+ LC_R_LEAF *pRL,*pKandidatRL[LC_R_MAX_SON+1];
+ int i,iIdxMin=0,iIdxMax=0;
+ double dDeltaAreal,dMinDeltaAreal;
+ double dMinAust,dMaxAust;
+
+ // Test
+ //static int iNivo;
+ //iNivo++;
+ //UT_FPRINTF(stderr,"LR_R_Insert nivå :%d\n",iNivo);
+
+
+ *ppNyRN = NULL;
+
+
+ /* Treet er tomt, må allokere ny node */
+ if (pRN == NULL) {
+ *ppNyRN = pRN = LR_R_CreateRNode(NULL,LC_LEAF);
+ }
+
+ /* Har kommet til ytterste nivå */
+ if (pRN->sSonType == LC_LEAF) {
+
+ pRL = LR_R_CreateRLeaf(lGrNr,pB,pRN);
+
+ /* Hvis ledig plass */
+ if (pRN->sSonAnt < LC_R_MAX_SON) {
+ /* Legg inn rektanglet */
+ pRN->Son.pLeaf[pRN->sSonAnt] = pRL;
+ (pRN->sSonAnt)++;
+
+ /* Oppdaterer omskrevet boks */
+ LR_R_BoksSum(&(pRN->Boks),pB);
+
+ /* Fullt, må opprett ny node */
+ } else {
+ *ppNyRN = pNyRN = LR_R_CreateRNode(pRN->pFar,LC_LEAF);
+
+ /* Fordel boksene på de to nodene etter lineær kost algoritmen */
+
+ /* Beregn "ekstrem-bokser" */
+ dMinAust = LONG_MAX;
+ dMaxAust = LONG_MIN;
+
+ iIdxMax = 0;
+ for (i=0; i<pRN->sSonAnt; i++) {
+ pKandidatRL[i] = pRN->Son.pLeaf[i];
+ if (pKandidatRL[i]->Boks.dMinAust > dMaxAust) {
+ dMaxAust = pKandidatRL[i]->Boks.dMinAust;
+ iIdxMax = i;
+ }
+ }
+ pKandidatRL[LC_R_MAX_SON] = pRL;
+ if (pB->dMinAust > dMaxAust) {
+ dMaxAust = pB->dMinAust;
+ iIdxMax = LC_R_MAX_SON;
+ }
+
+ for (i=0; i<pRN->sSonAnt; i++) {
+ if (iIdxMax != i) {
+ if (pKandidatRL[i]->Boks.dMaxAust < dMinAust) {
+ dMinAust = pKandidatRL[i]->Boks.dMaxAust;
+ iIdxMin = i;
+ }
+ }
+ }
+ if (iIdxMax != LC_R_MAX_SON && pB->dMaxAust < dMinAust) {
+ dMinAust = pB->dMaxAust;
+ iIdxMin = LC_R_MAX_SON;
+ }
+
+ /* Plasser ut ekstremboksene */
+ pRN->Son.pLeaf[0] = pKandidatRL[iIdxMax];
+ pRN->sSonAnt = 1;
+ pRN->Boks = pKandidatRL[iIdxMax]->Boks;
+ pKandidatRL[iIdxMax]->pFar = pRN;
+ pKandidatRL[iIdxMax] = NULL;
+
+ pNyRN->Son.pLeaf[0] = pKandidatRL[iIdxMin];
+ pNyRN->sSonAnt = 1;
+ pNyRN->Boks = pKandidatRL[iIdxMin]->Boks;
+ pKandidatRL[iIdxMin]->pFar = pNyRN;
+ pKandidatRL[iIdxMin] = NULL;
+
+ /* Resten av boksene plasseres der de fører til minst utvielse av boksen */
+ for (i=0; i<=LC_R_MAX_SON; i++) {
+ if (pKandidatRL[i] != NULL) {
+
+ if (LR_BoksDeltaArealSum(&(pRN->Boks),&(pKandidatRL[i]->Boks)) <
+ LR_BoksDeltaArealSum(&(pNyRN->Boks),&(pKandidatRL[i]->Boks)) ) {
+
+ pRN->Son.pLeaf[pRN->sSonAnt] = pKandidatRL[i];
+ pRN->sSonAnt++;
+ LR_R_BoksSum(&(pRN->Boks),&(pKandidatRL[i]->Boks));
+ pKandidatRL[i]->pFar = pRN;
+
+ } else {
+ pNyRN->Son.pLeaf[pNyRN->sSonAnt] = pKandidatRL[i];
+ pNyRN->sSonAnt++;
+ LR_R_BoksSum(&(pNyRN->Boks),&(pKandidatRL[i]->Boks));
+ pKandidatRL[i]->pFar = pNyRN;
+ }
+ }
+ }
+ }
+
+ /* Node */
+ } else {
+ /* velg den noden som utvides minst ved tillegg av den nye boksen */
+ dMinDeltaAreal = LONG_MAX;
+ iIdxMin = 0;
+ for (i=0; i<pRN->sSonAnt; i++) {
+ /* Beregn hvor mye boksen ville ha blitt utvidet hvis denne ble valget */
+ dDeltaAreal = LR_BoksDeltaArealSum(&(pRN->Son.pNode[i]->Boks),pB);
+ if (dDeltaAreal < dMinDeltaAreal) {
+
+ dMinDeltaAreal = dDeltaAreal;
+ iIdxMin = i;
+ }
+ }
+
+ /* Legger inn rektanglet i den noden med minst utvdelse */
+ pRL = LR_R_Insert(lGrNr,pB,pRN,pRN->Son.pNode[iIdxMin],ppNyRN);
+
+ /* Denne noden har blitt splittet, dette må tas vare på her */
+ if (*ppNyRN != NULL) {
+
+ /* Hvis ledig plass */
+ if (pRN->sSonAnt < LC_R_MAX_SON) {
+ /* Legg inn rektanglet */
+ pRN->Son.pNode[pRN->sSonAnt] = *ppNyRN;
+ (pRN->sSonAnt)++;
+
+ /* Oppdaterer omskrevet boks */
+ LR_R_BoksSum(&(pRN->Boks),pB);
+
+ /* Ingen splitting på nivået over */
+ *ppNyRN = NULL;
+
+ /* Fullt, må opprett ny node */
+ } else {
+ pNyRN = LR_R_CreateRNode(pFar,LC_NODE);
+
+ /* Fordel boksene på de to nodene etter lineær kost algoritmen */
+
+ /* Beregn "ekstrem-bokser" */
+ dMinAust = LONG_MAX;
+ dMaxAust = LONG_MIN;
+
+ for (i=0; i<pRN->sSonAnt; i++) {
+ pKandidatRN[i] = pRN->Son.pNode[i];
+ if (pKandidatRN[i]->Boks.dMinAust > dMaxAust) {
+ dMaxAust = pKandidatRN[i]->Boks.dMinAust;
+ iIdxMax = i;
+ }
+ }
+ pKandidatRN[LC_R_MAX_SON] = *ppNyRN;
+ if (pKandidatRN[i]->Boks.dMinAust > dMaxAust) {
+ dMaxAust = pKandidatRN[i]->Boks.dMinAust;
+ iIdxMax = LC_R_MAX_SON;
+ }
+
+ for (i=0; i<pRN->sSonAnt; i++) {
+ if (iIdxMax != i) {
+ if (pKandidatRN[i]->Boks.dMaxAust < dMinAust) {
+ dMinAust = pKandidatRN[i]->Boks.dMaxAust;
+ iIdxMin = i;
+ }
+ }
+ }
+
+ /* Plasser ut ekstremboksene */
+ pRN->Son.pNode[0] = pKandidatRN[iIdxMax];
+ pRN->sSonAnt = 1;
+ pRN->Boks = pKandidatRN[iIdxMax]->Boks;
+ pKandidatRN[iIdxMax]->pFar = pRN;
+ pKandidatRN[iIdxMax] = NULL;
+
+ pNyRN->Son.pNode[0] = pKandidatRN[iIdxMin];
+ pNyRN->sSonAnt = 1;
+ pNyRN->Boks = pKandidatRN[iIdxMin]->Boks;
+ pKandidatRN[iIdxMin]->pFar = pNyRN;
+ pKandidatRN[iIdxMin] = NULL;
+
+ /* Resten av boksene plasseres der de fører til minst utvielse av boksen */
+ for (i=0; i<=LC_R_MAX_SON; i++) {
+ if (pKandidatRN[i] != NULL) {
+
+ if (LR_BoksDeltaArealSum(&(pRN->Boks),&(pKandidatRN[i]->Boks)) <
+ LR_BoksDeltaArealSum(&(pNyRN->Boks),&(pKandidatRN[i]->Boks)) ) {
+
+ pRN->Son.pNode[pRN->sSonAnt] = pKandidatRN[i];
+ pRN->sSonAnt++;
+ LR_R_BoksSum(&(pRN->Boks),&(pKandidatRN[i]->Boks));
+ pKandidatRN[i]->pFar = pRN;
+
+ } else {
+ pNyRN->Son.pNode[pNyRN->sSonAnt] = pKandidatRN[i];
+ pNyRN->sSonAnt++;
+ LR_R_BoksSum(&(pNyRN->Boks),&(pKandidatRN[i]->Boks));
+ pKandidatRN[i]->pFar = pNyRN;
+ }
+ }
+ }
+
+ /* Husk den nye noden til nivået over */
+ *ppNyRN = pNyRN;
+ }
+
+ } else {
+ /* Oppdater omskrevet boks for noden */
+ LR_R_BoksSum(&(pRN->Boks),pB);
+ }
+ }
+
+
+ // Test
+ //iNivo--;
+
+ return pRL;
+}
+
+
+/*
+AR-980108
+CH LR_R_BoksSum Summerer to bokser
+CD =======================================================================
+CD Formål:
+CD Summerer to bokser ved at boks1 blir utvidet slik at den også dekker
+CD boks2.
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_BOKS * pB1 iu Boks1 som skal utvides
+CD LC_BOKS * pB2 i Boks2 som skal legges til boks1
+CD =======================================================================
+*/
+static void LR_R_BoksSum(LC_BOKS * pB1,LC_BOKS * pB2)
+{
+ pB1->dMinAust = min(pB1->dMinAust,pB2->dMinAust);
+ pB1->dMinNord = min(pB1->dMinNord,pB2->dMinNord);
+ pB1->dMaxAust = max(pB1->dMaxAust,pB2->dMaxAust);
+ pB1->dMaxNord = max(pB1->dMaxNord,pB2->dMaxNord);
+}
+
+
+/*
+AR-980108
+CH LR_BoksDeltaArealSum Bereg arealendring ved sumering
+CD =======================================================================
+CD Formål:
+CD Beregner hvor mye arealet av boks1 blir utvidet hvis den blir
+CD summert med boks2.
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_BOKS * pB1 i Boks1
+CD LC_BOKS * pB2 i Boks2
+CD double dDeltaAreal r Arealendring
+CD =======================================================================
+*/
+static double LR_BoksDeltaArealSum(LC_BOKS * pB1,LC_BOKS * pB2)
+{
+ //long lNy, lGml;
+ //lGml = (pB1->dMaxAust - pB1->dMinAust) * (pB1->dMaxNord - pB1->dMinNord);
+ //return (lNy - lGml);
+
+ double dDeltaAreal = (max(pB1->dMaxAust,pB2->dMaxAust) - min(pB1->dMinAust,pB2->dMinAust)) *
+ (max(pB1->dMaxNord,pB2->dMaxNord) - min(pB1->dMinNord,pB2->dMinNord));
+
+ return dDeltaAreal;
+}
+
+
+/*
+AR-980108
+CH LR_R_Delete Fjern fra "søketreet"
+CD =======================================================================
+CD Bruk:
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_R_LEAF * pRL i Peker til forekomst i R-treet
+CD
+CD Formål:
+CD Fjern et gitt element fra R-treet for geografisk søk.
+CD =======================================================================
+*/
+void LR_R_Delete(LC_R_LEAF * pRL)
+{
+ LC_R_NODE *pFar,*pRN,*pSonRN;
+ int i,iFunnet,iIdx=0,iFerdig;
+
+
+ if (pRL != NULL) {
+ // Husk "far"
+ pFar = pRL->pFar;
+
+ /* Fjerner pekeren fra gruppetabellen */
+ Sys.pGrInfo->pRL = NULL;
+
+ /* Fjern pekeren til løvet */
+ pRN = pFar;
+ iFunnet = UT_FALSE;
+
+ for (i=0; i<pRN->sSonAnt; i++) {
+
+ /* Sjekk om dette er den rette pekeren */
+ if (iFunnet == UT_FALSE) {
+ if (pRN->Son.pLeaf[i] == pRL) {
+ iFunnet = UT_TRUE;
+ iIdx = i;
+ }
+
+ /* Pakk de andre pekerne i denne noden */
+ } else {
+ pRN->Son.pLeaf[iIdx] = pRN->Son.pLeaf[i];
+ }
+ }
+
+ if (iFunnet == UT_TRUE) {
+ (pRN->sSonAnt)--;
+ }
+
+ // Frigir det aktuelle "løvet"
+ UT_FREE((char *)pRL);
+
+ /* Sjekk om det er mere som skal fjernes oppover i treet */
+ iFerdig = UT_FALSE;
+ while ( iFerdig == UT_FALSE) {
+
+ /* Antall sønner er 0, denne noden skal fjernes på nivået over */
+ if (pRN->sSonAnt == 0) {
+
+ // Er ikke på øverste nivå
+ if (pRN->pFar != NULL) {
+
+ /* Husk noden */
+ pSonRN = pRN;
+
+ /* Fjern pekeren til noden */
+ pRN = pSonRN->pFar;
+ iFunnet = UT_FALSE;
+
+ for (i=0; i<pRN->sSonAnt; i++) {
+
+ /* Sjekk om dette er den rette pekeren */
+ if (iFunnet == UT_FALSE) {
+ if (pRN->Son.pNode[i] == pSonRN) {
+ iFunnet = UT_TRUE;
+ iIdx = i;
+ }
+
+ /* Pakk de andre pekerne i denne noden */
+ } else {
+ pRN->Son.pNode[iIdx] = pRN->Son.pNode[i];
+ }
+ }
+
+ if (iFunnet == UT_TRUE) {
+ (pRN->sSonAnt)--;
+ }
+
+ /* Frigir noden */
+ UT_FREE((char *)pSonRN);
+
+
+ /* Har kommet til toppen */
+ } else {
+ iFerdig = UT_TRUE;
+
+ /* Treet er tomt initierer verdier på nytt */
+ pRN->sSonType = LC_LEAF;
+ /* Omskrevet boks initieres til stor invers verdi */
+ pRN->Boks.dMinAust = pRN->Boks.dMinNord = LONG_MAX;
+ pRN->Boks.dMaxAust = pRN->Boks.dMaxNord = LONG_MIN;
+ }
+
+
+ /* Har flere sønner, må beregne omskrevet boks på nytt */
+ } else {
+
+ pRN->Boks.dMinAust = pRN->Boks.dMinNord = LONG_MAX;
+ pRN->Boks.dMaxAust = pRN->Boks.dMaxNord = LONG_MIN;
+
+ if (pRN->sSonType == LC_LEAF) {
+ for (i=0; i<pRN->sSonAnt; i++) {
+ LR_R_BoksSum(&(pRN->Boks),&(pRN->Son.pLeaf[i]->Boks));
+ }
+
+ } else {
+ for (i=0; i<pRN->sSonAnt; i++) {
+ LR_R_BoksSum(&(pRN->Boks),&(pRN->Son.pNode[i]->Boks));
+ }
+ }
+
+ iFerdig = UT_TRUE;
+ }
+ }
+ }
+}
+
+
+/*
+AR-980204
+CH LR_R_CreateRNode Alloker og initier R-tre-node
+CD =======================================================================
+CD Bruk:
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_R_NODE * pFar i Peker til far i R-treet
+CD short sSonType i Hvilken type sønner har denne noden LC_NODE / LC_LEAF
+CD LC_R_NODE * pRN r Peker til ny node i R-tre
+CD
+CD Formål:
+CD Alloker og initier node i R-tre.
+CD =======================================================================
+*/
+static LC_R_NODE * LR_R_CreateRNode( LC_R_NODE * pFar,short sSonType)
+{
+ LC_R_NODE * pRN;
+
+ pRN = (LC_R_NODE *)UT_MALLOC(sizeof(LC_R_NODE));
+
+ pRN->pFar = pFar;
+ pRN->sSonType = sSonType;
+ pRN->sSonAnt = 0;
+
+
+ //for (i=0; i>LC_R_MAX_SON; i++) {
+ // if (sSonType == LC_NODE) {
+ // pRN->Son.pNode[i] = NULL;
+ // } else {
+ // pRN->Son.pLeaf[i] = NULL;
+ // }
+ //}
+
+ /* Omskrevet boks initieres til stor invers boks */
+ pRN->Boks.dMinAust = pRN->Boks.dMinNord = LONG_MAX;
+ pRN->Boks.dMaxAust = pRN->Boks.dMaxNord = LONG_MIN;
+
+ return pRN;
+}
+
+
+/*
+AR-980204
+CH LR_R_CreateRLeaf Alloker og initier R-tre-løv
+CD =======================================================================
+CD Bruk:
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD long lGrNr i Gruppenummer i filen
+CD LC_BOKS * pB i Boks som skal legges inn i treet
+CD LC_R_NODE * pFar i Peker til far i R-treet
+CD LC_R_LEAF * pCL r Peker til ny forekomst
+CD
+CD Formål:
+CD Alloker og initier løv R-tre.
+CD =======================================================================
+*/
+static LC_R_LEAF * LR_R_CreateRLeaf(long lGrNr, LC_BOKS * pB,LC_R_NODE * pFar)
+{
+ LC_R_LEAF * pCL = (LC_R_LEAF *)UT_MALLOC(sizeof(LC_R_LEAF));
+
+ pCL->pFar = pFar;
+ pCL->Boks = *pB;
+ pCL->lNr = lGrNr;
+
+ return pCL;
+}
+
+
+/*
+AR-980113
+CH LR_LeggTilKB Legg til Bgr i søkeresultat-kjede
+CD =======================================================================
+CD Bruk:
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat i Peker til struktur for søkestatus
+CD LC_FILADM * pFil i Filpeker
+CD long lNr i Gruppenummer i filen
+CD
+CD Formål:
+CD Legg til Bgr i kjede med søkeresultat.
+CD =======================================================================
+*/
+static void LR_LeggTilKB(LC_GEO_STATUS * pGeoStat,LC_FILADM *pFil,long lNr)
+{
+ LC_KJEDE_BGR * pKB;
+
+ pKB = (LC_KJEDE_BGR *) UT_MALLOC(sizeof(LC_KJEDE_BGR));
+
+ /* Sosi-gruppe */
+ pKB->Bgr.pFil = pFil;
+ pKB->Bgr.lNr = lNr;
+
+ /* Oppdater pekerne i kjeden */
+ pKB->pNesteKB = NULL;
+
+ if (pGeoStat->pForsteKB == NULL) {
+ pGeoStat->pForsteKB = pKB;
+
+ } else {
+ pGeoStat->pSisteKB->pNesteKB = pKB;
+ }
+
+ pGeoStat->pSisteKB = pKB;
+}
+
+
+/*
+AR-980113
+CH LC_AvsluttSok Avslutter geografisk søk
+CD =======================================================================
+CD Bruk:
+CD
+CD parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat i Peker til struktur for søkestatus
+CD
+CD Formål:
+CD Avslutter geografisk søk, og frigir kjede med søkeresultat.
+CD =======================================================================
+*/
+SK_EntPnt_FYBA void LC_AvsluttSok(LC_GEO_STATUS * pGeoStat)
+{
+ LC_KJEDE_BGR *pKB, *pNesteKB;
+
+
+ pNesteKB = pGeoStat->pForsteKB;
+
+ while (pNesteKB != NULL) {
+ pKB = pNesteKB;
+ pNesteKB = pKB->pNesteKB;
+ UT_FREE(pKB);
+ }
+
+ pGeoStat->pForsteKB = NULL;
+ pGeoStat->pSisteKB = NULL;
+ pGeoStat->pAktuellKB = NULL;
+}
+
+
+/*
+AR-980209
+CH LR_VelgMetode Velg søkemetode for geografisk søk
+CD ==========================================================================
+CD Formål:
+CD Velg søkemetode for geografisk søk. Bruker R-tre hvis utstrekningen av
+CD søkeområdet er mindre enn 10% av baseområdet i nord eller øst retning.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GEO_STATUS * pGeoStat iu Peker til struktur for søkestatus
+CD
+ ==========================================================================
+*/
+static void LR_VelgMetode(LC_GEO_STATUS * pGeoStat)
+{
+ LC_BOKS * pB = &Sys.pAktBase->Omraade;
+
+ if ( pGeoStat->oha - pGeoStat->nva < (pB->dMaxAust - pB->dMinAust) / 10 ||
+ pGeoStat->ohn - pGeoStat->nvn < (pB->dMaxNord - pB->dMinNord) / 10 ) {
+ pGeoStat->usMetode = LC_GEO_RTRE;
+
+ } else {
+ pGeoStat->usMetode = LC_GEO_SEKV;
+ }
+}
+
+
+/*
+AR-980108
+CH LR_R_FrigiGren Frigir en gren fra "søketreet"
+CD =======================================================================
+CD Bruk:
+CD
+CD Parametere:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_R_NODE * pRN i Peker til node i R-treet
+CD
+CD Formål:
+CD Frigir en gren fra R-treet for geografisk søk.
+CD =======================================================================
+*/
+void LR_R_FrigiGren(LC_R_NODE * pRN)
+{
+ int i;
+
+ /* Har kommet til ytterste nivå */
+ if (pRN->sSonType == LC_LEAF) {
+ /* Sjekk løvene som er lagret under denne noden */
+ for (i=0; i<pRN->sSonAnt; i++) {
+ UT_FREE((char *)pRN->Son.pLeaf[i]);
+ }
+
+ /* Node */
+ } else {
+ /* Rekursiv sjekk av de underliggende nodene */
+ for (i=0; i<pRN->sSonAnt; i++) {
+ // Vis alle underliggende nivåer
+ LR_R_FrigiGren(pRN->Son.pNode[i]);
+ }
+ }
+
+ UT_FREE((char *)pRN);
+}
diff --git a/src/FYBA/FYLS.cpp b/src/FYBA/FYLS.cpp
new file mode 100644
index 0000000..e4261fc
--- /dev/null
+++ b/src/FYBA/FYLS.cpp
@@ -0,0 +1,678 @@
+/* == AR 891104 ========================================== */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fyls.c */
+/* Innhold: Serienummer system for fysak-pc */
+/* ======================================================= */
+
+#include "stdafx.h"
+
+#include <ctype.h>
+
+
+/* Globale variabler */
+extern LC_SYSTEMADM Sys;
+
+
+/*
+AR-910930
+CH LS_Indx Oppdater indekstabellen
+CD =============================================================================
+CD Formål:
+CD Oppdater søketabellen for serienummer.
+CD
+CD Parametre: ingen
+CD
+CD Bruk:
+CD LS_Indx();
+================================================================================
+*/
+void LS_Indx(void)
+{
+ long lSnr = LC_GetSn();
+
+ /* Legg inn snr i tabellen og oppdaterer max snr for filen */
+ LS_PutSn(Sys.GrId.pFil,Sys.GrId.lNr,lSnr);
+}
+
+
+/*
+AR-910930
+CH LC_SBSn Sett søkegrense for serienummer
+CD ==========================================================================
+CD Formål:
+CD Setter søkegrenser for serienummersøk.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+CD LC_FILADM * pFil i Peker til FilAdm
+CD long lMinSnr i Fra og med serienummer
+CD long lMaxSnr i Til og med serienummer
+CD
+CD Bruk:
+CD LC_SNR_ADM SnrAdm;
+CD LC_SBSn(&SnrAdm,pFil,lMinSnr,lMaxSnr);
+=============================================================================
+*/
+SK_EntPnt_FYBA void LC_SBSn(LC_SNR_ADM * pSnrAdm,LC_FILADM *pFil,long lMinSnr,long lMaxSnr)
+{
+ /* LO_TestFilpeker(pFil,"LC_SBSn"); */
+ LO_TestFilpeker(pFil,"SBSn");
+
+ pSnrAdm->pFil = pFil;
+ pSnrAdm->lMinSnr = lMinSnr;
+ pSnrAdm->lMaxSnr = lMaxSnr;
+}
+
+
+/*
+AR-911118
+CH LC_FiSn Finn gruppenummer for et serienummer
+CD ==========================================================================
+CD Formål:
+CD Finn gruppenummer for et gitt serienummer i søkeområdet for serienummer.
+CD Endrer IKKE "current gruppe".
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_FILADM * pFil i Peker til FilAdm
+CD long lSnr i Serienummer som skal finnes
+CD LC_BGR * pBgr u Gruppenummer i basen
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FiSn(pFil,lSnr,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_FiSn(LC_FILADM *pFil,long lSnr,LC_BGR * pBgr)
+{
+ /* LO_TestFilpeker(pFil,"LC_FiSn"); */
+ LO_TestFilpeker(pFil,"FiSn");
+
+ pBgr->pFil = pFil;
+ pBgr->lNr = LI_GetSnr(pFil,lSnr);
+
+ /* Ukjent serienummer ==> */
+ if (pBgr->lNr == INGEN_GRUPPE) return UT_FALSE;
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-91118
+CH LC_MoveSn Flytt til gruppenummer for et serienummer
+CD ==========================================================================
+CD Formål:
+CD Finn gruppenummer for et gitt serienummer i søkeområdet for serienummer.
+CD Intern "aktuellt serienummer" blir endret, slik at videre søk med
+CD neste/forrige nå tar utgangspunkt i dette serienummer.
+CD (Bare hvis snr er funnet).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+CD long lSnr i Serienummer som skal finnes
+CD LC_BGR * pBgr u Gruppenummer i basen
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_MoveSn(pSnrAdm,snr,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_MoveSn(LC_SNR_ADM * pSnrAdm,long lSnr,LC_BGR * pBgr)
+{
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_MoveSn"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"MoveSn");
+
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = LI_GetSnr(pSnrAdm->pFil,lSnr);
+
+ /* Ukjent serienummer ==> */
+ if (pBgr->lNr == INGEN_GRUPPE) return UT_FALSE;
+
+ pSnrAdm->lAktSnr = lSnr;
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-910930
+CH LC_FiArraySn Finn gruppenummer for flere serienummer
+CD ==========================================================================
+CD Formål:
+CD Finner gruppenummer for tabell med serienummer.
+CD Endrer IKKE "current gruppe".
+CD Serienummertabellen kan være "rå" slik den kommer fra GetRef. Linjer med
+CD start øy og slutt øy overses.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short antall i Antall linjer brukt i serienummertabellen
+CD long *snr i Tabell med serienummer som skal finnes
+CD long *bgr u Tabell med gruppenummer funnet
+CD (INGEN_GRUPPE = ikke funnet)
+CD
+CD Bruk:
+CD LC_FiArraySn(pFil,antall,snr,bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA void LC_FiArraySn(LC_FILADM *pFil,short antall,long *snr,long *bgr)
+{
+ short s;
+
+ LO_TestFilpeker(pFil,"LC_FiArraySn");
+
+ /* Søk gjennom hele serienummertabellen */
+ for (s=0; s<antall; s++) {
+ if (snr[s] == START_OY || snr[s] == SLUTT_OY) {
+ bgr[s] = INGEN_GRUPPE;
+
+ } else {
+ bgr[s] = LI_GetSnr(pFil,labs(snr[s]));
+ } /* endif */
+ }
+}
+
+
+/*
+AR-911022
+CH LC_FASn Finn alle serienummer
+CD ==========================================================================
+CD Formål:
+CD Finner alle grupper i fil/serienummer søkeområdet og merker i kolonne
+CD BT_SNRSOK i brukttabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm i Peker til statusblokk for serienummersøk
+CD long antall r Antall grupper funnet.
+CD
+CD Bruk:
+CD antall_funnet = LC_FASn(&SnrAdm);
+=============================================================================
+*/
+SK_EntPnt_FYBA long LC_FASn(LC_SNR_ADM * pSnrAdm)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_BGR AktBgr,Bgr;
+ long lSnr,lGrNr;
+ long lAntall = 0;
+ long lMaxSnr = min(pSnrAdm->pFil->lMaxSnr, pSnrAdm->lMaxSnr);
+
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FASn"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FASn");
+
+ /* Husk aktuell gruppe */
+ AktBgr = Sys.GrId;
+
+ /* Blanker brukttabellen */
+ LI_EraseBt(BT_SNRSOK,BT_SNRSOK);
+
+ /* Sjekker alle serienummer i søkeområdet */
+ Bgr.pFil = pSnrAdm->pFil;
+ for (lSnr=pSnrAdm->lMinSnr; lSnr<=lMaxSnr; lSnr++) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ Bgr.lNr = lGrNr;
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ lAntall += LC_MerkGr(BT_SNRSOK,1); /* Tilslag */
+ }
+ }
+
+ /* Les tilbake aktuell gruppe */
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+
+ return lAntall;
+}
+
+
+/*
+AR-911022
+CH LC_FFSn Finn første serienummer
+CD =============================================================================
+CD Formål:
+CD Finner første gruppe i fil/serienummer søkeområdet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+CD LC_BGR * pBgr u Gruppenummer
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FFSn(&SnrAdm,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_FFSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+{
+ long lSnr,lGrNr;
+ long lMaxSnr;
+
+ if (pSnrAdm->pFil == NULL) {
+ LC_Error(5,"(LC_FFSn)","Ingen aktuelt fil.");
+ return UT_FALSE;
+ }
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FFSn"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FFSn");
+
+ lMaxSnr = min(pSnrAdm->pFil->lMaxSnr, pSnrAdm->lMaxSnr);
+
+ /* Sjekker fra starten av søkeområdet */
+ for (lSnr=pSnrAdm->lMinSnr; lSnr<=lMaxSnr; lSnr++) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ /* Tilslag ==> */
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = lGrNr;
+ pSnrAdm->lAktSnr = lSnr;
+ return UT_TRUE;
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-911022
+CH LC_FFSnBt Finn første serienummer med tilleggskrav
+CD ==========================================================================
+CD Formål:
+CD Finner første gruppe som er merka i gitt kolonne i brukttabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm i Peker til statusblokk for serienummersøk
+CD short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+CD LC_BGR * pBgr u Gruppenummer
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FFSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+=============================================================================
+*/
+SK_EntPnt_FYBA short LC_FFSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+{
+ long lSnr,lGrNr;
+ LC_BGR Bgr;
+ long lMaxSnr;
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FFSnBt"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FFSnBt");
+
+ lMaxSnr = min(pSnrAdm->pFil->lMaxSnr, pSnrAdm->lMaxSnr);
+
+ /* Sjekker fra starten av søkeområdet */
+ for (lSnr=pSnrAdm->lMinSnr; lSnr<=lMaxSnr; lSnr++) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ Bgr.pFil = pSnrAdm->pFil;
+ Bgr.lNr = lGrNr;
+ if (LC_GetBt(&Bgr,kolonne)) { /* Merka? */
+ /* Tilslag ==> */
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = lGrNr;
+ pSnrAdm->lAktSnr = lSnr;
+ return UT_TRUE;
+ }
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-911022
+CH LC_FNSn Finn neste serienummer
+CD ==========================================================================
+CD Formål:
+CD Finner neste gruppe i fil/serienummer søkeområdet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+CD LC_BGR * pBgr u Gruppenummer
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FNSn(&SnrAdm,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_FNSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+{
+ long lSnr,lGrNr;
+ long lMaxSnr;
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FNSn"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FNSn");
+
+ lMaxSnr = min(pSnrAdm->pFil->lMaxSnr, pSnrAdm->lMaxSnr);
+
+ /* Sjekker fra aktuellt serienummer */
+ for (lSnr=pSnrAdm->lAktSnr+1L; lSnr<=lMaxSnr; lSnr++) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ /* Tilslag ==> */
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = lGrNr;
+ pSnrAdm->lAktSnr = lSnr;
+ return UT_TRUE;
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-911022
+CH LC_FNSnBt Finn neste serienummer med tilleggskrav
+CD ==========================================================================
+CD Formål:
+CD Finner neste gruppe også er merka i gitt kolonne i brukttabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm i Peker til statusblokk for serienummersøk
+CD short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+CD LC_BGR * pBgr u Gruppenummer
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FNSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_FNSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+{
+ long lSnr,lGrNr;
+ LC_BGR Bgr;
+ long lMaxSnr;
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FNSnBt"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FNSnBt");
+
+ lMaxSnr = min(pSnrAdm->pFil->lMaxSnr, pSnrAdm->lMaxSnr);
+
+ /* Sjekker fra aktuellt serienummer */
+ for (lSnr=pSnrAdm->lAktSnr+1L; lSnr<=lMaxSnr; lSnr++) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ Bgr.pFil = pSnrAdm->pFil;
+ Bgr.lNr = lGrNr;
+ if (LC_GetBt(&Bgr,kolonne)) { /* Merka? */
+ /* Tilslag ==> */
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = lGrNr;
+ pSnrAdm->lAktSnr = lSnr;
+ return UT_TRUE;
+ }
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-911022
+CH LC_FPSn Finn forige serienummer
+CD =============================================================================
+CD Formål:
+CD Finner forrige gruppe i fil/serienummer søkeområdet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+CD LC_BGR * pBgr u Gruppenummer
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FPSn(&SnrAdm,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_FPSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+{
+ long lSnr,lGrNr;
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FPSn"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FPSn");
+
+ /* Sjekker fra aktuellt serienummer */
+ for (lSnr=pSnrAdm->lAktSnr-1L; lSnr>=pSnrAdm->lMinSnr; lSnr--) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ /* Tilslag ==> */
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = lGrNr;
+ pSnrAdm->lAktSnr = lSnr;
+ return UT_TRUE;
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-910930
+CH LC_FPSnBt Finn forige serienummer med tilleggskrav
+CD ==========================================================================
+CD Formål:
+CD Finner forrige gruppe i fil/serienummer søkeområdet, som også er merka i
+CD gitt kolonne i brukttabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm i Peker til statusblokk for serienummersøk
+CD short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+CD LC_BGR * pBgr u Gruppenummer
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FPSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_FPSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+{
+ long lSnr,lGrNr;
+ LC_BGR Bgr;
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FPSnBt"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FPSnBt");
+
+ /* Sjekker fra aktuellt serienummer */
+ for (lSnr=pSnrAdm->lAktSnr-1L; lSnr>=pSnrAdm->lMinSnr; lSnr--) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ Bgr.pFil = pSnrAdm->pFil;
+ Bgr.lNr = lGrNr;
+ if (LC_GetBt(&Bgr,kolonne)) { /* Merka? */
+ /* Tilslag ==> */
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = lGrNr;
+ pSnrAdm->lAktSnr = lSnr;
+ return UT_TRUE;
+ }
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-910930
+CH LC_FLSn Finn siste serienummer
+CD =============================================================================
+CD Formål:
+CD Finner siste gruppe i fil/serienummer søkeområdet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm iu Peker til statusblokk for serienummersøk
+CD LC_BGR * pBgr u Gruppenummer
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FLSn(&SnrAdm,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_FLSn(LC_SNR_ADM * pSnrAdm,LC_BGR * pBgr)
+{
+ long lGrNr;
+ long lSnr;
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FLSn"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FLSn");
+
+ lSnr = min(pSnrAdm->pFil->lMaxSnr, pSnrAdm->lMaxSnr);
+
+ /* Sjekker fra slutten av tabellen */
+ for (; lSnr>=pSnrAdm->lMinSnr; lSnr--) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ /* Tilslag ==> */
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = lGrNr;
+ pSnrAdm->lAktSnr = lSnr;
+ return UT_TRUE;
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-910930
+CH LC_FLSnBt Finn siste serienummer med tilleggskrav
+CD ==========================================================================
+CD Formål:
+CD Finner siste gruppe i fil/serienummer søkeområdet som også er merka i
+CD gitt kolonne i brukttabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_SNR_ADM * pSnrAdm i Peker til statusblokk for serienummersøk
+CD short kolonne i Kolonne i brukt-tabellen som skal sjekkes
+CD LC_BGR * pBgr u Gruppenummer
+CD short sstat r Søkestatus (UT_TRUE=Funnet, UT_FALSE=Ingen funnet)
+CD
+CD Bruk:
+CD sstat = LC_FLSnBt(&SnrAdm,BT_GEOSOK,&Bgr);
+================================================================================
+*/
+SK_EntPnt_FYBA short LC_FLSnBt(LC_SNR_ADM * pSnrAdm,short kolonne,LC_BGR * pBgr)
+{
+ long lGrNr;
+ LC_BGR Bgr;
+ long lSnr;
+
+ /* LO_TestFilpeker(pSnrAdm->pFil,"LC_FLSnBt"); */
+ LO_TestFilpeker(pSnrAdm->pFil,"FLSnBt");
+
+ lSnr = min(pSnrAdm->pFil->lMaxSnr, pSnrAdm->lMaxSnr);
+
+ /* Sjekker fra slutten av tabellen */
+ for (; lSnr>=pSnrAdm->lMinSnr; lSnr--) {
+ if ((lGrNr = LI_GetSnr(pSnrAdm->pFil,lSnr)) != INGEN_GRUPPE) {
+ Bgr.pFil = pSnrAdm->pFil;
+ Bgr.lNr = lGrNr;
+ if (LC_GetBt(&Bgr,kolonne)) { /* Merka? */
+ /* Tilslag ==> */
+ pBgr->pFil = pSnrAdm->pFil;
+ pBgr->lNr = lGrNr;
+ pSnrAdm->lAktSnr = lSnr;
+ return UT_TRUE;
+ }
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-910930
+CH LS_PutSn Legg inn serienummer
+CD ==========================================================================
+CD Formål:
+CD Legg inn snr i tabellen og oppdaterer max snr for filen
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long lGrNr i Gruppenummer
+CD long lSnr i Serienummer
+CD
+CD Bruk:
+CD LS_PutSn(pFil,lGrNr,lSnr);
+=============================================================================
+*/
+void LS_PutSn(LC_FILADM *pFil,long lGrNr,long lSnr)
+{
+ if (lSnr >= 0L) {
+ /* LO_TestFilpeker(pFil,"LC_PutSn"); */
+ LO_TestFilpeker(pFil,"PutSn");
+
+ /* Max snr på filen */
+ if (lSnr > pFil->lMaxSnr) {
+ pFil->lMaxSnr = lSnr;
+ }
+
+ /* Legg inn verdi */
+ LI_PutSnr(pFil,lSnr,lGrNr);
+
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %ld ",lSnr);
+ LC_Error(61,"(LS_PutSn)",err().tx);
+ }
+}
+
+
+/*
+AR-891104
+CH LS_VisSn Vis serienummer-tabellen
+CD =============================================================================
+CD Formål:
+CD Henter en linje fra serienummer-tabellen som formatert streng.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD long lin i Linjenummer i SN-tab som skal hentes
+CD char *tx r Peker til streng med formatert SN-linje
+CD
+CD Bruk:
+CD UT_FPRINTF(stderr,"\nSerienummertabell:\n");
+CD for (lin=0L; lin<100L; lin++) {
+CD UT_FPRINTF(stderr,"%s\n",LS_VisSn(BlaFile,lin));
+CD }
+ =============================================================================
+*/
+char *LS_VisSn(LC_FILADM *pFil,long lin)
+{
+ if (lin >= 0L && lin < pFil->lMaxSnr){
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"%8ld: %8ld",lin,LI_GetSnr(pFil,lin));
+ } else{
+ *err().tx = '\0';
+ }
+ return err().tx;
+}
diff --git a/src/FYBA/FYLU.cpp b/src/FYBA/FYLU.cpp
new file mode 100644
index 0000000..d14fa7a
--- /dev/null
+++ b/src/FYBA/FYLU.cpp
@@ -0,0 +1,2904 @@
+/* === AR-920613 ========================================================== */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fylu.c */
+/* Innhold: Rutiner for utvalg */
+/* ======================================================================== */
+
+#include "stdafx.h"
+
+#include <ctype.h>
+#include <math.h>
+#include <locale>
+
+using namespace std;
+
+#define U_PARA_LEN 128 /* Max lengde av parameterstreng */
+
+
+/* Felles variabler for hele FYBA */
+extern LC_SYSTEMADM Sys;
+
+/* Funksjonsdefinisjoner for interne funksjoner */
+static void LU_FrigiUtvalg(LC_UTVALG *pU);
+static void LU_DelLastQuery(LC_UTVALG_BLOKK *pUB);
+static short LU_TolkUtvalgslinje(LC_UTVALG_ELEMENT * pUE,const char *pszTx);
+static short LU_PiTestDelutvalg(LC_UT_ADM * pUtAdm,LC_UTVALG_ELEMENT * pUE,long lPnr);
+static short LU_PiTestLinje(LC_UTVALG_ELEMENT * pUE,long lPnr);
+//static short LU_GiTestUtvalg(LC_UT_ADM * pUtAdm,LC_UTVALG *pU);
+static short LU_GiTestDelutvalg(LC_UT_ADM * pUtAdm,LC_UTVALG_ELEMENT * pUE);
+static short LU_GiTestLinje(LC_UT_ADM * pUtAdm,LC_UTVALG_ELEMENT * pUE,
+ short *gilin,char **apara);
+static short LU_ParaTest(LC_UTVALG_ELEMENT * pUE,char *para,char *pszAktPara,short sMaxLen);
+static void LU_JustPara(char *para,short ledd,short start,short slutt,
+ char *akt_para,short max_len);
+static short LU_LesULinje(FILE *pKomFil,short sMaxTxLen,char *pszTx,
+ short *psNiv);
+static void LU_AppUtvalg (LC_UTVALG_BLOKK *pUtBlokk,char *pszNavn);
+static void LU_PakkPrioritet(LC_UT_ADM * pUtAdm);
+static void LU_HuskPrior(short *NyPrior,short *sAntPrior,short sPrior);
+static void LU_SjekkDatatype(char *pszVerdi,char szMetode,short *sType);
+
+
+int LU_compare (const void *arg1, const void *arg2);
+
+
+/*
+AR-911003
+CH LC_OpenQuery Initier query
+CD ==========================================================================
+CD Formål:
+CD Initierer query mot GINFO/PINFO.
+CD Tildeler administrasjonsblokk for utvalg.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_UT_ADM *UtAdm r Peker til administrasjonsblokk for utvalg.
+CD
+CD Bruk:
+CD pUtAdm = LC_OpenQuery();
+ ==========================================================================
+*/
+SK_EntPnt_FYBA LC_UT_ADM *LC_OpenQuery(void)
+{
+ LC_UT_ADM *pUtAdm;
+
+ /* Tildeler administrasjonsblokk */
+ pUtAdm = (LC_UT_ADM *) UT_MALLOC(sizeof(LC_UT_ADM));
+ memset(pUtAdm,'\0',sizeof(LC_UT_ADM));
+
+ /* Nullstiller */
+ memset(&(pUtAdm->Gruppe), 0, sizeof(LC_UTVALG_BLOKK));
+ memset(&(pUtAdm->Punkt), 0, sizeof(LC_UTVALG_BLOKK));
+ memset(&(pUtAdm->Pinfo), 0, sizeof(LC_UTVALG_BLOKK));
+
+ return pUtAdm;
+}
+
+
+/*
+AR-910718
+CH LC_CloseQuery Avslutter query
+CD ==========================================================================
+CD Formål:
+CD Avslutter query mot GINFO/PINFO.
+CD Frigir minne brukt til administrasjon og utvalgstabeller.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM *UtAdm i Peker til administrasjonsblokk for utvalg.
+CD
+CD
+CD Bruk:
+CD LC_CloseQuery(pUtAdm);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_CloseQuery(LC_UT_ADM * pUtAdm)
+{
+ LC_UTVALG *pU,*pNesteU;
+ LC_LAG *pLag,*pNesteLag; //JAØ-19980922
+
+
+ if (pUtAdm != NULL)
+ {
+ /*
+ * Frigir GRUPPE-UTVALG.
+ */
+ pU = pUtAdm->Gruppe.pForsteU;
+ while (pU != NULL) {
+ pNesteU = pU->pNesteU;
+ LU_FrigiUtvalg(pU);
+
+ pU = pNesteU;
+ }
+
+ /*
+ * Frigir PUNKT-UTVALG.
+ */
+ pU = pUtAdm->Punkt.pForsteU;
+ while (pU != NULL) {
+ pNesteU = pU->pNesteU;
+ LU_FrigiUtvalg(pU);
+ pU = pNesteU;
+ }
+
+ /*
+ * Frigir PINFO-UTVALG.
+ */
+ pU = pUtAdm->Pinfo.pForsteU;
+ while (pU != NULL) {
+ pNesteU = pU->pNesteU;
+ LU_FrigiUtvalg(pU);
+ pU = pNesteU;
+ }
+
+ /*
+ * Frigir lag. JAØ-19980922
+ */
+ pLag = pUtAdm->pForsteLag;
+ while (pLag != NULL) {
+ pNesteLag = pLag->pNesteLag;
+ if (pLag->pszLagNavn != NULL) UT_FREE(pLag->pszLagNavn);
+ UT_FREE(pLag);
+ pLag = pNesteLag;
+ }
+
+ /*
+ * Frigir Adm.blokken.
+ */
+ UT_FREE(pUtAdm);
+ }
+}
+
+
+/*
+AR-920521
+CH LU_FrigiUtvalg Frigi et utvalg
+CD ==========================================================================
+CD Formål:
+CD Frigir et utvalg med alle underliggende utvalgselementer.
+CD
+CD Parameters:
+CD Type Navn I/O Forklaring
+CD -------------------------------------------------------------------------
+CD LC_UTVALG * pU i Peker til utvalget.
+CD
+CD Bruk:
+CD LU_FrigiUE(pU);
+CD ==========================================================================
+*/
+static void LU_FrigiUtvalg (LC_UTVALG * pU)
+{
+ /* Frigi utvalgs-elementer */
+ if (pU->pForsteUE != NULL) LU_FrigiUE(pU->pForsteUE);
+
+ /* Frigi navn og regel */
+ if (pU->pszNavn != NULL) UT_FREE(pU->pszNavn);
+ if (pU->pszRegel != NULL) UT_FREE(pU->pszRegel);
+
+ /* Frigi toppblokken for utvalget */
+ UT_FREE(pU);
+}
+
+
+/*
+AR-920521
+CH LU_FrigiUE Frigi utvalgselementer
+CD ==========================================================================
+CD Formål:
+CD Frigir alle elementene (utvalgslinjene) på et nivå i kjeden av
+CD utvalgselementer for et utvalg.
+CD
+CD Parameters:
+CD Type Navn I/O Forklaring
+CD -------------------------------------------------------------------------
+CD LC_UTVALG_ELEMENT * pForsteUE i Start utvalgs-kjede på dette nivå.
+CD
+CD Bruk:
+CD LU_FrigiUE(pForsteUE);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA void LU_FrigiUE (LC_UTVALG_ELEMENT * pUE)
+{
+ LC_UTVALG_ELEMENT * pNesteUE;
+
+ /* Går gjennom alle elementene på dette nivå */
+ while (pUE != NULL) {
+ /* Frigi elementer på underliggende nivå under dette objektet */
+ if (pUE->pForsteUE != NULL) LU_FrigiUE(pUE->pForsteUE);
+
+ /* Husk hva som er neste element på dette nivå */
+ pNesteUE = pUE->pNesteUE;
+
+ /* Frigi dette elementet */
+ if (pUE->min != NULL) UT_FREE(pUE->min);
+ if (pUE->max != NULL) UT_FREE(pUE->max);
+
+ UT_FREE((char *)pUE);
+
+ pUE = pNesteUE;
+ }
+}
+
+
+/*
+AR-920527
+CH LC_PutQueryLine Legg inn en query-linje
+CD ==========================================================================
+CD Formål:
+CD Legger inn og tolker en linje med query-tekst.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ------------------------------------------------------------------------
+CD LC_UT_ADM *UtAdm i Peker til administrasjonsblokk for utvalg.
+CD char *qulin i Linje med query-tekst. (Uten prikker på første nivå).
+CD short sType i Gruppe eller Punkt (U_GRUPPE eller U_PUNKT).
+CD short ist r Status (UT_TRUE=OK, UT_FALSE=linjen er ikke OK)
+CD
+CD Bruk:
+CD ist = LC_PutQueryLine(pUtAdm,qulin,sType);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_PutQueryLine(LC_UT_ADM *pUtAdm,const char *qulin,short sType)
+{
+ const char *cp;
+ LC_UTVALG_BLOKK *pUB;
+ short sNiv = 0;
+ short sStatus = UT_FALSE;
+
+ if (pUtAdm != NULL)
+ {
+ /* Preparer strengen */
+ cp = qulin;
+ while (UT_IsSpace(*cp)) {
+ cp++;
+ }
+ /* Tell opp antall prikker */
+ while (*cp == '.') {
+ sNiv++;
+ cp++;
+ }
+
+ /* Første utvalg i blokken, alloker topp-blokk */
+ if (sType == U_GRUPPE) {
+ pUB = &pUtAdm->Gruppe;
+
+ } else { // U_PUNKT
+ pUB = &pUtAdm->Punkt;
+ }
+
+ if (pUB->pForsteU == NULL) {
+ /* Legg til et nytt utvalg */
+ LU_AppUtvalg(pUB,"Query");
+ }
+
+ /* Alloker minne og tolk linjen */
+ sStatus = LU_AppUE(pUB->pSisteU,sNiv,cp);
+
+ // Ta vare på opplysning om HØYDE er brukt
+ if (sStatus != UT_FALSE) {
+ if (strcmp(pUB->pSisteU->pSisteUE->sosi,"HØYDE") == 0) {
+ pUB->sHoydeBrukt = UT_TRUE;
+ }
+ }
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-920522
+CH LC_PutQueryRegel Legg inn et regelnavn
+CD ==========================================================================
+CD Formål:
+CD Legger inn et regelnavn på siste linje i utvalgstabellen.
+CD (Navnet blir intern konvertert til "store" bokstaver.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ------------------------------------------------------------------------
+CD LC_UTVALG *pU i Peker til utvalg
+CD char *navn i Regelnavn.
+CD
+CD Bruk:
+CD LC_PutQueryRegel(pU,navn);
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_PutQueryRegel(LC_UTVALG * pU,const char *navn)
+{
+ /* Frigi eventuell gammel regel */
+ if (pU->pszRegel != NULL) UT_FREE(pU->pszRegel);
+
+ /* Legg inn ny regel */
+ pU->pszRegel = (char*)UT_MALLOC(strlen(navn)+1);
+ UT_StrCopy(pU->pszRegel, navn, strlen(navn)+1);
+ UT_StrUpper(pU->pszRegel);
+}
+
+/*
+JAØ-19980921
+CH LC_PutLag Legg inn peker til lag
+CD ==========================================================================
+CD Formål:
+CD Legger inn peker til det laget utvalget tilhører.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ------------------------------------------------------------------------
+CD LC_UT_ADM *UtAdm i Peker til administrasjonsblokk for utvalg.
+CD LC_UTVALG *pU i Peker til utvalg
+CD char *navn i Lag-navn.
+CD
+CD Bruk:
+CD LC_PutLag(pUB,pU,navn);
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_PutLag(LC_UT_ADM *pUtAdm,LC_UTVALG *pU,const char *navn)
+{
+ LC_LAG * pLag,*pNyttLag;
+ short sFunnet = 0;
+
+
+ if (pUtAdm != NULL)
+ {
+ /* Det er allerede lagt inn lag på dette utvalget ? */
+ if (pU->pLag != NULL) {
+ /* Annet lag enn forrige gang ? */
+ if (strcmp(navn,pU->pLag->pszLagNavn) != 0) {
+ LC_Error(128,"(LU_HuskPrior)",pU->pszNavn);
+ }
+
+ } else {
+ /* Tester om lag-navnet allerede er registrert. */
+ pLag = pUtAdm->pForsteLag;
+ while ((pLag != NULL) && (!sFunnet)) {
+ sFunnet = (strcmp(navn,pLag->pszLagNavn) == 0);
+ if (!sFunnet) pLag = pLag->pNesteLag;
+ }
+
+ if (pLag == NULL) { /* Nytt lag, må opprettes og settes inn i kjeden. */
+ pNyttLag = (LC_LAG *)UT_MALLOC(sizeof(LC_LAG));
+ memset(pNyttLag,0,sizeof(LC_LAG));
+ pNyttLag->sLagAktiv = 1;
+ pNyttLag->pszLagNavn = (char*)UT_MALLOC(strlen(navn)+1);
+ UT_StrCopy(pNyttLag->pszLagNavn,navn,strlen(navn)+1);
+ pNyttLag->pNesteLag = NULL;
+ pU->pLag = pNyttLag;
+
+ if (pUtAdm->pForsteLag == NULL) {
+ pUtAdm->pForsteLag = pNyttLag;
+ } else {
+ pUtAdm->pSisteLag->pNesteLag = pNyttLag;
+ }
+ pUtAdm->pSisteLag = pNyttLag;
+ pUtAdm->pSisteLag->pNesteLag = NULL;
+ } else {
+ pU->pLag = pLag;
+ }
+ }
+ }
+} /* END LC_PutLag */
+
+
+/*
+AR-890308
+CH LC_LesUtvalg Les utvalg i kom.filen
+CD =============================================================================
+CD Formål:
+CD Leser og tolker gruppe og punktutvalg på kommandofilen og legger i tabell.
+CD Forutsetter at filen er åpnet på forhånd.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD FILE *pKomFil i Peker til "handle" for åpnet kommandofil.
+CD short sStatus r UT_TRUE=OK, UT_FALSE=feil i linjen
+CD
+CD Bruk:
+CD sStatus = LC_LesUtvalg(pUtAdm,pKomFil);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_LesUtvalg(LC_UT_ADM *pUtAdm,const char *pszKomFil)
+{
+ FILE * pKomFil;
+ short sFunnet;
+ char szTx[100],ord[60],szNavn[50];
+ short itxi,lesefeil,sNiv;
+ short sForrigeMaxPrioritet,sPrioritet;
+ LC_UTVALG_BLOKK *pUB=NULL;
+ short sStatus;
+
+
+ if (pUtAdm != NULL)
+ {
+ /* Åpner filen */
+ pKomFil = UT_OpenFile(pszKomFil,"",UT_READ,UT_OLD,&sStatus);
+
+ /* Åpningsfeil */
+ if (sStatus != UT_OK) {
+ char szError[256];
+ UT_strerror(szError,256,sStatus);
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s - %s",pszKomFil,szError);
+ LC_Error(101,"(LC_LesUtvalg)",err().tx);
+ return UT_FALSE;
+ }
+
+ /* Starter først på filen og leser */
+ UT_SetPos(pKomFil,0L);
+
+ lesefeil = LU_LesULinje(pKomFil,100,szTx,&sNiv);
+ while (! lesefeil) {
+ sFunnet = UT_FALSE;
+ /* Hent kommandonavn */
+ UT_StrToken(szTx,0,&itxi,60,ord);
+ UT_StrUpper(ord);
+ UT_StrToken(szTx,itxi,&itxi,60,szNavn);
+
+ if (sNiv == 1 && strcmp(ord,"GRUPPE-UTVALG") == 0) {
+ pUB = &pUtAdm->Gruppe;
+ sFunnet = UT_TRUE;
+
+ } else if(sNiv == 1 && strcmp(ord,"PUNKT-UTVALG") == 0) {
+ pUB = &pUtAdm->Punkt;
+ sFunnet = UT_TRUE;
+
+ } else if(sNiv == 1 && strcmp(ord,"PINFO-UTVALG") == 0) {
+ pUB = &pUtAdm->Pinfo;
+ sFunnet = UT_TRUE;
+ }
+
+ if (sFunnet) {
+ sForrigeMaxPrioritet = pUtAdm->sMaxPrior;
+
+ /* Legg til et utvalg */
+ LU_AppUtvalg(pUB,szNavn);
+
+ lesefeil = LU_LesULinje(pKomFil,100,szTx,&sNiv);
+ while (! lesefeil && sNiv > 1) {
+ UT_StrToken(szTx,0,&itxi,60,ord);
+ UT_StrUpper(ord);
+
+ /* PRIORITET */
+ if (sNiv == 2 && strcmp(ord,"PRIORITET") == 0) {
+ UT_StrShort(szTx,itxi,&itxi,&sPrioritet);
+ pUB->pSisteU->sPrioritet = sPrioritet;
+ pUB->pSisteU->sOriginalPrioritet = sPrioritet;
+ if (sPrioritet > pUtAdm->sMaxPrior) pUtAdm->sMaxPrior = sPrioritet;
+
+ /* BRUK-REGEL */
+ } else if (sNiv == 2 && strcmp(ord,"BRUK-REGEL") == 0) {
+ UT_StrToken(szTx,itxi,&itxi,61,ord);
+ LC_PutQueryRegel(pUB->pSisteU,ord);
+
+ /* GRUPPE */ //JAØ-19980921
+ } else if (sNiv == 2 && strcmp(ord,"LAG") == 0) {
+ UT_StrToken(szTx,itxi,&itxi,61,ord);
+ LC_PutLag(pUtAdm,pUB->pSisteU,ord);
+
+ /* Vanlige utvalgslinjer */
+ } else {
+ /* Legg inn linjen */
+ if (LU_AppUE(pUB->pSisteU,(short)(sNiv-2),szTx) == UT_FALSE) {
+
+ // Logisk feil i linjen.
+ LU_DelLastQuery(pUB);
+ pUtAdm->sMaxPrior = sForrigeMaxPrioritet;
+ fclose (pKomFil);
+ return UT_FALSE; // Avbryter tolkingen ==>
+ }
+
+ /* Sjekk om HØYDE er brukt i utvalg */
+ if (strcmp(pUB->pSisteU->pSisteUE->sosi,"HØYDE") == 0) {
+ pUB->sHoydeBrukt = UT_TRUE;
+ }
+
+ /* PUNKT-UTVALG */
+ if (pUB == &pUtAdm->Punkt) {
+ /* "!" er brukt, må sjekke alle punkt */
+ if (pUB->pSisteU->pSisteUE->metode == LC_U_IKKE) {
+ pUB->sTestAllePi = UT_TRUE;
+ }
+ }
+ }
+
+ /* Les neste linje */
+ lesefeil = LU_LesULinje(pKomFil,100,szTx,&sNiv);
+ }
+
+ /* Fjern utvalg som ikker er avsluttet med regel */
+ if (pUB->pSisteU->pszRegel == NULL) {
+ LU_DelLastQuery(pUB);
+ pUtAdm->sMaxPrior = sForrigeMaxPrioritet;
+ }
+
+ } else { /* Hopp over ukjent linje */
+ lesefeil = LU_LesULinje(pKomFil,100,szTx,&sNiv);
+ }
+ }
+
+ fclose (pKomFil);
+
+ /* Pakk prioritetene */
+ LU_PakkPrioritet(pUtAdm);
+
+ return UT_TRUE;
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-920610
+CH LU_AppUE Legg til en ny utvalgslinje
+CD ==========================================================================
+CD Formål:
+CD Legg til et nytt element i kjeden utvalgslinjer.
+CD
+CD Parameters:
+CD Type Navn I/O Forklaring
+CD -----------------------------------------------------------------------
+CD LC_UTVALG *pU i Aktuellt utvalg
+CD short sNiv i Nivå (antall prikker forran navnet)
+CD char *pszTx i Lest linje
+CD short sStatus r UT_TRUE=OK, UT_FALSE=feil i linjen
+CD
+CD Bruk:
+CD sStatus = LU_AppUE(pUB->pSisteU,sNiv,szTx);
+CD =============================================================================
+*/
+SK_EntPnt_FYBA short LU_AppUE (LC_UTVALG *pU,short sNiv,const char *pszTx)
+{
+ LC_UTVALG_ELEMENT *pUE,*pNyUE,*pForrigeUE=NULL;
+ short sAktNiv = 0;
+
+ /* Finn rett posisjon i kjedene */
+ pUE=pU->pSisteUE;
+ while (sAktNiv < sNiv && pUE != NULL) {
+ pForrigeUE = pUE;
+ pUE = pUE->pSisteUE;
+ sAktNiv++;
+ }
+
+ //if (sAktNiv < sNiv-1) {
+ if (sAktNiv < sNiv || sNiv > sAktNiv) {
+ LC_Error(126,"(LU_AppUE)",pszTx);
+ return UT_FALSE; /* ==> Retur når ulovlig sprang i nivå */
+ }
+
+ /* Alloker minne og initier */
+ pNyUE = (LC_UTVALG_ELEMENT *)UT_MALLOC(sizeof(LC_UTVALG_ELEMENT));
+ memset(pNyUE,0,sizeof(LC_UTVALG_ELEMENT));
+ pNyUE->min = NULL;
+ pNyUE->max = NULL;
+
+ pNyUE->pNesteUE = NULL;
+ pNyUE->pForsteUE = NULL;
+ pNyUE->pSisteUE = NULL;
+
+
+ /* Heng inn i kjedene */
+ if (sNiv == 0) {
+ if (pU->pSisteUE == NULL) {
+ pU->pForsteUE = pNyUE;
+ pU->pSisteUE = pNyUE;
+
+ } else {
+ pU->pSisteUE->pNesteUE = pNyUE;
+ pU->pSisteUE = pNyUE;
+ }
+
+ } else {
+ if (pForrigeUE->pSisteUE == NULL) {
+ pForrigeUE->pForsteUE = pNyUE;
+ pForrigeUE->pSisteUE = pNyUE;
+
+ } else {
+ pForrigeUE->pSisteUE->pNesteUE = pNyUE;
+ pForrigeUE->pSisteUE = pNyUE;
+ }
+ }
+
+ /* Tolk linjen */
+ if ( ! LU_TolkUtvalgslinje(pNyUE,pszTx)) {
+ LC_Error(124,"(LU_AppUE)",pszTx);
+ return UT_FALSE; /* ==> Retur når ulovlig utvalgslinje */
+ }
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-910718
+CH LU_DelLastQery Fjern siste utvalg fra tabellen
+CD ==========================================================================
+CD Formål:
+CD Fjerner siste utvalg fra tabellen. (Fram til forrige regelnavn.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ------------------------------------------------------------------------
+CD LC_UTVALG_BLOKK *pUB i Peker til administrasjonsblokk for utvalg.
+CD
+CD Bruk:
+CD LU_DelLastQuery(pUB);
+ =============================================================================
+*/
+static void LU_DelLastQuery(LC_UTVALG_BLOKK *pUB)
+{
+ /* Husk aktuellt utvalg */
+ LC_UTVALG * pU = pUB->pSisteU;
+
+ /*
+ * Ordne pekere
+ */
+
+ /* I toppblokken */
+ pUB->pSisteU = pU->pForrigeU;
+ if (pUB->pSisteU == NULL) pUB->pForsteU = NULL;
+
+ /* I kjeden av utvalg */
+ if (pU->pForrigeU != NULL) {
+ pU->pForrigeU->pNesteU = NULL;
+ }
+
+ /*
+ * Frigi minne
+ */
+ LU_FrigiUtvalg(pU);
+}
+
+
+/*
+ÅE-20040709 Forandret litt for at type skulle ta negative tall.
+AR-920526
+CH LU_TolkUtvalgslinje Tolk utvalgslinje i kom.filen
+CD ==========================================================================
+CD Formål:
+CD Tolker en utvalgslinje fra kommandofilen og legger i tabell.
+CD Forutsetter at linjen er lest.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD LC_UTVALG_ELEMENT * pUE i Peker til utvalgselement
+CD char *pszTx i Linje med query-tekst. (Uten prikker i starten)
+CD short ist r Status (UT_TRUE=OK, UT_FALSE=linjen er ikke OK)
+CD
+CD Bruk:
+CD ist = LU_TolkUtvalgslinje(pUE,pszTx);
+ =============================================================================
+*/
+static short LU_TolkUtvalgslinje(LC_UTVALG_ELEMENT * pUE,const char *pszTx)
+{
+ char tx[100],ord[60];
+ const char *cp;
+ short itxi;
+ short i;
+
+ // ----- Preparer strengen
+ cp = pszTx;
+ while (UT_IsSpace(*cp)){
+ ++cp;
+ }
+ UT_StrCopy(tx,cp,100);
+ UT_StrUpper(tx);
+
+
+ // ----- Hent kommandonavn
+ UT_StrToken(tx,0,&itxi,60,ord);
+
+ if (strcmp(ord,"VELG") == 0) {
+ pUE->kommando = LC_U_ELLER;
+
+ } else if (strcmp(ord,"ELLER") == 0) {
+ pUE->kommando = LC_U_ELLER;
+
+ } else if (strcmp(ord,"OG") == 0) {
+ pUE->kommando = LC_U_OG;
+
+ } else {
+ return UT_FALSE; /* ===> Feil i utvalgslinjen */
+ }
+
+ // ----- Tolk resten av strengen
+ pUE->metode = LC_U_ALLE;
+ pUE->type = LC_U_TALL;
+ pUE->ledd = 0;
+ pUE->start = 0;
+ pUE->slutt = 0;
+
+ // ----- SOSI-navn
+ UT_StrToken(tx,itxi,&itxi,60,ord);
+ if (*ord) {
+ UT_StrCopy(pUE->sosi,ord,LC_MAX_SOSINAVN_LEN);
+ } else {
+ return UT_FALSE; /* ===> Feil i utvalgslinjen */
+ }
+
+ /* Metode */
+ UT_StrToken(tx,itxi,&itxi,60,ord);
+ UT_StrUpper(ord);
+
+ if (*ord) {
+ if (!strcmp(ord,"="))
+ pUE->metode = LC_U_LIK;
+ else if (!strcmp(ord,"<>"))
+ pUE->metode = LC_U_FRATIL;
+ else if (!strcmp(ord,"/"))
+ pUE->metode = LC_U_DELELIG;
+ else if (!strcmp(ord,"!/"))
+ pUE->metode = LC_U_UDELELIG;
+ else if (!strcmp(ord,"()"))
+ pUE->metode = LC_U_CONTEIN;
+ else if (!strcmp(ord,"!()"))
+ pUE->metode = LC_U_IKKECONTEIN;
+ else if (!strcmp(ord,"AL"))
+ pUE->metode = LC_U_ALLE;
+ else if (!strcmp(ord,"!="))
+ pUE->metode = LC_U_IKKELIK;
+ else if (!strcmp(ord,"!"))
+ pUE->metode = LC_U_IKKE;
+ else if (!strcmp(ord,"><"))
+ pUE->metode = LC_U_UTENFOR;
+ else if (!strcmp(ord,"<"))
+ pUE->metode = LC_U_MINDRE;
+ else if (!strcmp(ord,">"))
+ pUE->metode = LC_U_STORRE;
+ else if (! strcmp(ord,"IV"))
+ pUE->metode = LC_U_IKKEVALGT;
+ else if (!strcmp(ord,"FL"))
+ pUE->metode = LC_U_FLERE;
+ else if (!strcmp(ord,"!FL"))
+ pUE->metode = LC_U_IKKEFLERE;
+ else {
+ return UT_FALSE; /* ===> Feil i utvalgslinjen */
+ }
+ }
+
+ // ----- Min
+ UT_StrToken(tx,itxi,&itxi,60,ord);
+ if (*ord) {
+ pUE->min = (char*)UT_MALLOC(strlen(ord)+1);
+ UT_StrCopy(pUE->min,ord,strlen(ord)+1);
+
+ // Sjekk type
+ LU_SjekkDatatype(pUE->min,0,&pUE->type);
+
+ } else {
+ pUE->min = (char*)UT_MALLOC(1);
+ UT_StrCopy(pUE->min,"",1);
+ pUE->type = LC_U_ALFA;
+ }
+
+
+ // ----- Max
+ UT_StrToken(tx,itxi,&itxi,60,ord);
+ if (*ord) {
+ pUE->max = (char*)UT_MALLOC(strlen(ord)+1);
+ UT_StrCopy(pUE->max, ord, strlen(ord)+1);
+
+ // Sjekk type
+ if (pUE->type != LC_U_ALFA) {
+ LU_SjekkDatatype(pUE->max,pUE->metode,&pUE->type);
+ }
+
+ } else {
+ pUE->max = (char*)UT_MALLOC(1);
+ UT_StrCopy(pUE->max,"",1);
+ }
+
+ // ----- Type
+ UT_StrToken(tx,itxi,&itxi,60,ord);
+ if(*ord){
+ if(*ord == 'T'){
+ pUE->type = LC_U_TALL | LC_U_DEFINERT;
+ } else if(*ord == 'A'){
+ pUE->type = LC_U_ALFA | LC_U_DEFINERT;
+ } else if(*ord == 'F'){
+ pUE->type = LC_U_FLYT | LC_U_DEFINERT;
+ } else{
+ return UT_FALSE; /* ===> Feil i utvalgslinjen */
+ }
+
+ char *cp2 = ord + 1;
+ for (i=0; i<2; ++i) {
+ if (*cp2 == '#') {
+ ++cp2;
+ pUE->ledd = (char) strtol(cp2,&cp2,10); /* Ledd-nummer */
+ }else if (*cp2 == '[') {
+ ++cp2;
+ pUE->start = (char) strtol(cp2,&cp2,10); /* Startposisjon */
+ ++cp2;
+ pUE->slutt = (char) strtol(cp2,&cp2,10); /* Sluttposisjon */
+ }
+ }
+ }
+
+
+ // Sikkrer at det er lagt inn strenger for min og max
+ //if (pUE->min == NULL) pUE->min = strcpy(UT_MALLOC(2),"");
+ //if (pUE->max == NULL) pUE->max = strcpy(UT_MALLOC(2),"");
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-881115
+CH LU_SjekkDatatype Sjekk datatype
+CD =============================================================================
+CD Formål:
+CD Finner datatype ut fra utvalgsparameter.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszVerdi i Verdi
+CD char szMetode i Utvalgsmetode
+CD short *psType iu Type, Inn=foreløpig type, Ut=beregnet type
+CD
+CD Bruk:
+CD LU_SjekkDatatype(pszVerdi,szMetode,sType);
+ =============================================================================
+*/
+static void LU_SjekkDatatype(char *pszVerdi,char szMetode,short *psType)
+{
+ char *cp;
+ short i=0;
+
+
+ locale loc ( "Norwegian" );
+
+ /* Sjekk typen */
+ for (cp=pszVerdi; *cp!='\0'; ++cp)
+ {
+ // Første tegn:
+ if (i==0)
+ {
+ if (*cp=='.')
+ {
+ *psType = LC_U_FLYT;
+ }
+ else if (*cp!='+' && *cp!='-' && !isdigit( *cp, loc ))
+ {
+ *psType = LC_U_ALFA;
+ break;
+ }
+ }
+ else if ( ! isdigit( *cp, loc ) )
+ {
+ // Resten av tegnene:
+ if (*cp == '.') // funnet '.' tidligere
+ {
+ if ((*psType == LC_U_FLYT)&&(szMetode != LC_U_FRATIL)&&(szMetode != LC_U_UTENFOR)&&(szMetode != LC_U_DELELIG))
+ {
+ *psType = LC_U_ALFA;
+ break;
+ }
+ else
+ {
+ *psType = LC_U_FLYT;
+ }
+
+ }
+ else
+ {
+ *psType = LC_U_ALFA;
+ break;
+ }
+ }
+ ++i;
+ }
+
+ if (*psType == LC_U_TALL)
+ {
+ // Hvis tallet har for mange siffer til long må det håndteres som tekst
+ long lTall = atol(pszVerdi);
+ if (lTall == LONG_MAX || lTall == LONG_MIN)
+ {
+ *psType = LC_U_ALFA;
+ }
+ }
+}
+
+
+/*
+AR-881115
+CH LC_GetUtRegelNavn Henter regelnavn
+CD =============================================================================
+CD Formål:
+CD Henter regelnavn for at programmet utenfor skal kunne sjekke
+CD at det er tilgjengelig videre behandling av alle definerte navn.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD short *ist iu Status (Inn: 1=start, 0=neste)
+CD (Ut: 0=OK, -1=ferdig);
+CD char *regelpeker r Peker til utvalgsnavn.
+CD
+CD Bruk:
+CD regelpeker = LC_GetUtRegelNavn(pUtAdm,&ist);
+ =============================================================================
+*/
+SK_EntPnt_FYBA char *LC_GetUtRegelNavn(LC_UT_ADM *pUtAdm,short *ist)
+{
+ if (pUtAdm != NULL)
+ {
+ if (*ist == 1) {
+ pUtAdm->pAktUB = &pUtAdm->Gruppe;
+ pUtAdm->pAktUB->pAktU = pUtAdm->pAktUB->pForsteU;
+
+ } else {
+ if (pUtAdm->pAktUB->pAktU != NULL) {
+ pUtAdm->pAktUB->pAktU = pUtAdm->pAktUB->pAktU->pNesteU;
+ }
+ }
+
+ /* Sjekk om dette er et lovlig utvalg */
+ while (pUtAdm->pAktUB->pAktU == NULL) {
+ /* Ferdig med GRUPPE-UTVALG ,sjekk PUNKT-UTVALG */
+ if (pUtAdm->pAktUB == &(pUtAdm->Gruppe)) {
+ pUtAdm->pAktUB = &pUtAdm->Punkt;
+ pUtAdm->pAktUB->pAktU = pUtAdm->pAktUB->pForsteU;
+
+ /* Ferdig med PUNKT-UTVALG ,sjekk PINFO-UTVALG */
+ } else if (pUtAdm->pAktUB == &pUtAdm->Punkt) {
+ pUtAdm->pAktUB = &pUtAdm->Pinfo;
+ pUtAdm->pAktUB->pAktU = pUtAdm->pAktUB->pForsteU;
+
+ } else {
+ /* RETUR når det ikke er tilslag */
+ *ist = -1;
+ return NULL;
+ }
+ }
+
+ /* RETUR ved tilslag */
+ *ist = 0;
+ return pUtAdm->pAktUB->pAktU->pszRegel;
+ }
+
+ *ist = -1;
+ return NULL;
+}
+
+
+/*
+AR-920526
+CH LC_FinnPinfoUtvalg
+CD ==========================================================================
+CD Formål:
+CD Finner et PINFO-UTVALG i kjeden av slike utvalg.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD char *pszNavn i Utvalgsnavn
+CD LC_UTVALG * pUtvalg r Peker til utvalget. (NULL = ikke funnet)
+CD
+CD Bruk:
+CD pUtvalg = LC_FinnPinfoUtvalg(pszNavn);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA LC_UTVALG * LC_FinnPinfoUtvalg(LC_UT_ADM * pUtAdm,const char *pszNavn)
+{
+ LC_UTVALG * pU;
+
+ if (pUtAdm != NULL)
+ {
+ /* Søk i kjeden av pinfo-utvalg */
+ for (pU=pUtAdm->Pinfo.pForsteU; pU != NULL; pU=pU->pNesteU) {
+ if (strcmp(pszNavn,pU->pszRegel) == 0) {
+ return pU; /* ==> Funnet */
+ }
+ }
+ }
+
+ // Ikke funnet
+ return NULL;
+}
+
+
+/*
+AR-881130
+CH LC_PunktUtvalg PUNKT-utvalg
+CD =============================================================================
+CD Formål:
+CD Sjekker PINFO-delen av aktuell gruppe for tilslag på PUNKT-UTVALG.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD short sPrior i Prioritet.
+CD short *psStat iu Søkestatus, Inn: 1=start søk, 0=fortsett søk
+CD Ut : 0=tilslag, -1=ikke tilslag
+CD long lPnr i Punktnummer som skal sjekkes.
+CD char **ppszRegel u Peker til regelnavn
+CD
+CD Bruk:
+CD LC_PunktUtvalg(pUtAdm,sPrior,&psStat,lPnr,&ppszRegel);
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_PunktUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *psStat,long lPnr,char **ppszRegel)
+{
+ LC_UTVALG * pU;
+
+
+ if (pUtAdm != NULL)
+ {
+ if (*psStat == 1) { /* Initier søk */
+ /* Utvalgsmetode "!" (ikke) er brukt, eller
+ punktet har PINFO mm. */
+ if (pUtAdm->Punkt.sTestAllePi == UT_TRUE ||
+ LC_TestPi(lPnr,pUtAdm->Punkt.sHoydeBrukt)) {
+ pU = pUtAdm->Punkt.pForsteU;
+
+ } else {
+ pU = NULL;
+ }
+
+ } else {
+ if (pUtAdm->Punkt.pAktU != NULL) {
+ pU = pUtAdm->Punkt.pAktU->pNesteU;
+ } else {
+ pU = NULL;
+ }
+ }
+
+ /* Søk */
+ while (pU != NULL) {
+ /* Rett prioritet ? */
+ if (sPrior == LC_OVERSE_PRIORITET || pU->sPrioritet == sPrior) {
+ if (LC_PiTestUtvalg(pUtAdm,pU,lPnr)) { /* Tilslag */
+ pUtAdm->Punkt.pAktU = pU;
+ *ppszRegel = pU->pszRegel;
+ *psStat = 0;
+ return; /* ==> Retur ved tilslag */
+ }
+ }
+
+ /* Fortsett med neste utvalg */
+ pU = pU->pNesteU;
+ }
+
+ pUtAdm->Punkt.pAktU = pU;
+ }
+
+ *psStat = -1; /* Ikke tilslag */
+ return;
+}
+
+
+/*
+AR-920929
+CH LC_PiTestUtvalg Sjekk PUNKT/PINFO utvalg
+CD ==========================================================================
+CD Formål:
+CD Sjekk om PINFO i aktuellt punkt tilfredstiller et punkt-utvalg.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Administrasjonsblokk
+CD LC_UTVALG * pU i Peker til utvalg
+CD long lPnr i Punktnummer som skal sjekkes.
+CD short sTilslag r Status: UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+CD
+CD Bruk:
+CD sTilslag = LC_PiTestUtvalg(pUtAdm,pU,lPnr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PiTestUtvalg(LC_UT_ADM * pUtAdm,LC_UTVALG * pU,long lPnr)
+{
+ short sTilslag = UT_FALSE;
+
+
+ if (pUtAdm != NULL)
+ {
+ LC_UTVALG_ELEMENT * pUE = pU->pForsteUE;
+
+ /* Søk */
+ while (pUE != NULL) {
+ /* Linjen må testes i disse tilfeller */
+ /* Har tilslag, og metode er ..OG */
+ /* Har ikke tilslag, og metode er ..ELLER */
+ if (( sTilslag && pUE->kommando == LC_U_OG) ||
+ (!sTilslag && pUE->kommando == LC_U_ELLER)) {
+ sTilslag = LU_PiTestDelutvalg(pUtAdm,pUE,lPnr);
+ }
+
+ pUE = pUE->pNesteUE;
+ }
+ }
+
+ return sTilslag;
+}
+
+
+/*
+AR-920617
+CH LU_PiTestDelutvalg Sjekk en del av et utvalg
+CD ==========================================================================
+CD Formål:
+CD Sjekk om PINFO i aktuellt punkt tilfredstiller en del av et
+CD punkt-utvalg. Sjekker et utvalgselement samt underliggende elementer
+CD under dette.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Administrasjonsblokk
+CD LC_UTVALG_ELEMENT * pUE i Peker til utvalgselement
+CD long lPnr i Punktnummer som skal sjekkes.
+CD short sTilslag r Status: UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+CD
+CD Bruk:
+CD sTilslag = LU_PiTestDelutvalg(pUtAdm,pUE,lPnr);
+ ==========================================================================
+*/
+static short LU_PiTestDelutvalg(LC_UT_ADM * pUtAdm,LC_UTVALG_ELEMENT * pUE,long lPnr)
+{
+ short sTilslag = UT_FALSE;
+ short sForste = UT_TRUE;
+ /* Søk */
+ while (pUE != NULL) {
+ if (sForste) {
+ /*
+ * Første element i delutvalget skal alltid testes.
+ */
+ sTilslag = LU_PiTestLinje(pUE,lPnr);
+
+ pUE = pUE->pForsteUE;
+
+ sForste = UT_FALSE;
+
+ } else {
+ /*
+ * Elementet må testes i disse tilfeller:
+ * - Har tilslag, og metode er ..OG.
+ * - Har ikke tilslag, og metode er ..ELLER.
+ * Elementet kan være toppen av et nytt delutvalg, kaller derfor
+ * LU_PiTestDelutvalg for å teste dette elementet.
+ */
+ if (( sTilslag && pUE->kommando == LC_U_OG) ||
+ (!sTilslag && pUE->kommando == LC_U_ELLER)) {
+
+ sTilslag = LU_PiTestDelutvalg(pUtAdm,pUE,lPnr);
+ }
+
+ pUE = pUE->pNesteUE;
+ }
+ }
+
+ return sTilslag;
+}
+
+
+/*
+AR-920617
+CH LU_PiTestLinje Sjekk en utvalgslinje
+CD ==========================================================================
+CD Formål:
+CD Sjekk om PINFO i aktuellt punkt tilfredstiller en linje punkt-utvalg.
+CD
+CD Parametre
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UTVALG_ELEMENT * pUE i Peker til administrasjonsblokk for utvalg.
+CD long lPnr i Punktnummer som skal sjekkes.
+CD short tilslag r Status: 1=tilslag, 0=ikke tilslag.
+CD
+CD Bruk:
+CD tilslag = LU_PiTestLinje(pUE,lPnr);
+ ==========================================================================
+*/
+static short LU_PiTestLinje(LC_UTVALG_ELEMENT * pUE,long lPnr)
+{
+ char akt_para[U_PARA_LEN];
+ short tilslag;
+ long lMaxAntall;
+ char *para;
+ short sSett = 1;
+ short metode = pUE->metode;
+
+ /* Metode IKKE "!" */
+ if (metode == LC_U_IKKE){
+ /* AR:2002-04-24 */
+ /* if ((para = LC_GetPiVerdi(pUE->sosi,lPnr,&sSett)) == NULL ||
+ *para == '\0') { */
+ if (LC_GetPiVerdi(pUE->sosi,lPnr,&sSett) == NULL) {
+ return UT_TRUE;
+ }
+
+ } else if (metode == LC_U_FLERE) { /* Metode "FL" */
+ /* Teller opp antall av dette SOSI-navnet */
+ tilslag = 0;
+ while (LC_GetPiVerdi(pUE->sosi,lPnr,&sSett) != NULL) {
+ tilslag++;
+ /* Tilslag hvis navnet finnes mer enn 1 gang */
+ if (tilslag > 1) return UT_TRUE;
+ sSett++;
+ }
+
+ } else if (metode == LC_U_IKKEFLERE) { /* Metode "!FL" */
+ /* Teller opp antall av dette SOSI-navnet */
+ lMaxAntall = max(atol(pUE->min),1l);
+ tilslag = 0;
+
+ while (LC_GetPiVerdi(pUE->sosi,lPnr,&sSett) != NULL) {
+ tilslag++;
+ /* Har flere forekomster, avbryter */
+ if (tilslag > lMaxAntall) return UT_FALSE;
+ sSett++;
+ }
+ /* Tilslag, ikke flere forekomster */
+ return UT_TRUE;
+
+ } else if (metode == LC_U_ALLE) { /* Metode "AL" */
+ if (LC_GetPiVerdi(pUE->sosi,lPnr,&sSett) != NULL) {
+ return UT_TRUE;
+ }
+
+ /* Metode IKKE LIK "!=" */
+ } else if (metode == LC_U_IKKELIK) {
+ tilslag = 0;
+ pUE->metode = LC_U_LIK; /* Sjekker først på likhet */
+ /* Hent parameter */
+ while ((para = LC_GetPiVerdi(pUE->sosi,lPnr,&sSett)) != NULL) {
+ if (LU_ParaTest(pUE,para,akt_para,U_PARA_LEN)) { /* Tilslag? */
+ tilslag = 1;
+ break; /* Vet nå at det ikke blir tilslag, hopper ut */
+ }
+ sSett++;
+ }
+ pUE->metode = LC_U_IKKELIK;
+ if (! tilslag) /* Tilslag når "=-testen" ikke ga tilslag */
+ return UT_TRUE;
+
+ /* Metode INNEHOLDER IKKE "!()" */
+ } else if (metode == LC_U_IKKECONTEIN) {
+ tilslag = 0;
+ pUE->metode = LC_U_CONTEIN; /* Sjekker først INNEHOLDER */
+ /* Hent parameter */
+ while ((para = LC_GetPiVerdi(pUE->sosi,lPnr,&sSett)) != NULL) {
+ if (LU_ParaTest(pUE,para,akt_para,U_PARA_LEN)) { /* Tilslag? */
+ tilslag = 1;
+ break; /* Vet nå at det ikke blir tilslag, hopper ut */
+ }
+ sSett++;
+ }
+ pUE->metode = LC_U_IKKECONTEIN;
+ if (! tilslag) /* Tilslag når "()-testen" ikke ga tilslag */
+ return UT_TRUE;
+
+ /* Andre utvalgsmetoder */
+ } else {
+ /* Hent parameter */
+ while ((para = LC_GetPiVerdi(pUE->sosi,lPnr,&sSett)) != NULL) {
+ if (LU_ParaTest(pUE,para,akt_para,U_PARA_LEN)) { /* Tilslag? */
+ return UT_TRUE;
+ }
+ sSett++;
+ }
+ }
+
+ return UT_FALSE; /* Ikke tilslag */
+}
+
+
+/*
+AR-881130
+CH LC_GruppeUtvalg GINFO-utvalg
+CD ==========================================================================
+CD Formål:
+CD Sjekker GINFO-delen av aktuell gruppe mot alle gruppeutvalg fra fil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD short sPrior i Prioritet.
+CD LC_OVERSE_PRIORITET = Tar ikke hensyn til prioritet.
+CD short *sstat iu Søkestatus, Inn: 1=start søk, 0=fortsett søk
+CD Ut : 0=tilslag, -1=ikke tilslag
+CD char **regelnavn u Peker til regelnavn
+CD char *regelnavn u Peker til utvalgsnavn
+CD
+CD Bruk:
+CD pszUtvalgsNavn = LC_GruppeUtvalg(pUtAdm.sPrior,&sstat,&regel);
+ =============================================================================
+*/
+SK_EntPnt_FYBA char *LC_GruppeUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *sstat,char **regelnavn)
+{
+ LC_UTVALG * pU;
+
+ if (pUtAdm != NULL)
+ {
+ if (*sstat == 1) { /* Initier søk */
+ pU = pUtAdm->Gruppe.pForsteU;
+ pUtAdm->sGruppeValgt = UT_FALSE;
+
+ } else {
+ if (pUtAdm->Gruppe.pAktU != NULL) {
+ pU = pUtAdm->Gruppe.pAktU->pNesteU;
+ } else {
+ pU = NULL;
+ }
+ }
+
+ /* Søk */
+ while (pU != NULL) {
+ /* Rett prioritet ? */
+ if (sPrior == LC_OVERSE_PRIORITET || pU->sPrioritet == sPrior) {
+ if (LU_GiTestUtvalg(pUtAdm,pU)) { /* Tilslag */
+ *regelnavn = pU->pszRegel;
+ *sstat = 0;
+ pUtAdm->sGruppeValgt = UT_TRUE;
+ pUtAdm->Gruppe.pAktU = pU;
+
+ return pU->pszNavn; /* ==> Retur ved tilslag */
+ }
+ }
+
+ /* Fortsett med neste utvalg */
+ pU = pU->pNesteU;
+ }
+
+ pUtAdm->Gruppe.pAktU = pU;
+ }
+
+ *sstat = -1; /* Ikke tilslag */
+ return NULL;
+}
+
+
+/*
+AR-881213
+CH LC_GiQuery Query mot aktuell ginfo
+CD =============================================================================
+CD Formål:
+CD Sjekker GINFO-delen av aktuell gruppe mot aktuellt query-oppsett.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD short status r Søkestatus, UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+CD
+CD Bruk:
+CD ist = LC_GiQuery(pUtAdm);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_GiQuery(LC_UT_ADM *pUtAdm)
+{
+ if (pUtAdm != NULL)
+ {
+ pUtAdm->sGruppeValgt = UT_FALSE;
+
+ return LU_GiTestUtvalg(pUtAdm,pUtAdm->Gruppe.pForsteU);
+ }
+
+ return UT_FALSE;
+}
+
+/*
+JAØ-20000512
+CH LC_FAGiKombinertFlateQuery Finn alle ved query mot ginfo i flate og omkrets
+CD =============================================================================
+CD Formål:
+CD Sjekker GINFO-delen av alle flater mot aktuell queryopsett. Finner de flatene
+CD som har tilslag på utvalgsblokken pUtAdmFlate og har har referanser til grupper
+CD som har tilslag på utvalgsblokken pUtAdmOmkrets.
+CD Tilslag merkes i brukttabellen kolonne BT_GISOK (30).
+CD [Esc] avbryter utvalget, antall tilslag settes da til -1.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UT_ADM *pUtAdmFlate i Peker til administrasjonsblokk for utvalg for flata.
+CD LC_UT_ADM *pUtAdmOmkrets i Peker til administrasjonsblokk for utvalg for omkrets.
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR og /eller LC_BAKGR
+CD short sAlle i Flagg for hvorvidt utvalg for omkrets må slå til på
+CD alle gruppene i omkretsen. TRUE/FALSE
+CD short antall r Antall tilslag på utvalget.
+CD
+CD Bruk:
+CD antall = LC_FAGiQuery(pUtAdm, LC_FRAMGR | LC_BAKGR);
+CD
+ =============================================================================
+*/
+SK_EntPnt_FYBA long LC_FAGiKombinertFlateQuery(LC_UT_ADM * pUtAdmFlate,LC_UT_ADM * pUtAdmOmkrets,
+ unsigned short usLag,short sMetode)
+{
+ #define RED_MAX_REF 10
+
+ short ngi,gnavn,tilslag,i,avbryt;
+ long nko;
+ long ant_ref;
+ unsigned short info;
+ LC_BGR Bgr,AktBgr,FlateBgr;
+ short avbrutt = UT_FALSE;
+ long *gs;
+
+ LC_GRF_STATUS GrfStat;
+ long gsnr[RED_MAX_REF];
+ unsigned char ref_status[RED_MAX_REF];
+ long antall = -1L;
+
+
+ if (pUtAdmFlate != NULL && pUtAdmOmkrets != NULL)
+ {
+ antall = 0L;
+
+ LC_GetGrNr(&AktBgr);
+
+ /* Blanker brukttabellen */
+ LI_EraseBt(BT_GISOK,BT_GISOK);
+
+ LC_InitNextBgr(&FlateBgr);
+
+ // Sjekker alle grupper i aktuellt lag
+ while (LC_NextBgr(&FlateBgr,usLag) && !avbrutt) {
+ // Filhodet behandles ikke
+ if (FlateBgr.lNr != 0L) {
+ gnavn = LC_RxGr(&FlateBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (gnavn == L_FLATE) { // Er det en flate ?
+ if (ngi > 0){ // Med koordinat ?
+ if (LC_GiQuery(pUtAdmFlate)){ // Tilslag på flata.
+
+ LC_InitGetRefFlate(&GrfStat);
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE|GRF_INDRE,gsnr,(unsigned char*)ref_status,RED_MAX_REF);
+ Bgr.pFil = FlateBgr.pFil;
+
+ tilslag = 0;
+ avbryt = 0;
+ do {
+ i = 0;
+ gs = gsnr;
+ while ((i < ant_ref) && !avbryt) {
+ if (!((ref_status[i] & GRF_START_OY) || (ref_status[i] & GRF_SLUTT_OY))) {
+ Bgr.lNr = labs(*gs);
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ tilslag = LC_GiQuery(pUtAdmOmkrets);
+ if (sMetode == LC_ALLE) {
+ avbryt = !tilslag;
+ } else if (sMetode == LC_INGEN) {
+ avbryt = tilslag;
+ } else { //(sMetode == LC_NOEN)
+ avbryt = tilslag;
+ }
+ }
+ i++;
+ gs++;
+
+ }
+
+ LC_RxGr(&FlateBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE|GRF_INDRE,gsnr,(unsigned char*)ref_status,RED_MAX_REF);
+ } while (ant_ref>0 && !avbryt);
+
+ if (sMetode == LC_INGEN) tilslag = !tilslag;
+ if (tilslag) {
+ LC_RxGr(&FlateBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ antall += LC_MerkGr(BT_GISOK,1); // Tilslag
+ }
+ }
+ }
+ }
+ }
+ avbrutt = LC_Cancel(); /* <ESC> avbryter lesing */
+ }
+
+ if (avbrutt) antall = -1L;
+
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+ }
+
+ return antall;
+}
+
+/*
+AR-900109
+CH LC_FAGiQuery Finn alle ved query mot ginfo
+CD =============================================================================
+CD Formål:
+CD Sjekker GINFO-delen av alle grupper mot aktuell queryopsett.
+CD Tilslag merkes i brukttabellen kolonne BT_GISOK (14).
+CD [Esc] avbryter utvalget, antall tilslag settes da til -1.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR og /eller LC_BAKGR
+CD short antall r Antall tilslag på utvalget.
+CD
+CD Bruk:
+CD antall = LC_FAGiQuery(pUtAdm, LC_FRAMGR | LC_BAKGR);
+CD
+ =============================================================================
+*/
+SK_EntPnt_FYBA long LC_FAGiQuery(LC_UT_ADM *pUtAdm,unsigned short usLag)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_BGR Bgr,AktBgr;
+ short avbrutt = UT_FALSE;
+ long antall = -1L;
+
+
+ if (pUtAdm != NULL)
+ {
+ antall = 0L;
+
+ LC_GetGrNr(&AktBgr);
+
+ /* Blanker brukttabellen */
+ LI_EraseBt(BT_GISOK,BT_GISOK);
+
+ LC_InitNextBgr(&Bgr);
+
+ /* Sjekker alle grupper i aktuellt lag */
+ while(LC_NextBgr(&Bgr,usLag) && !avbrutt) {
+ /* Filhodet behandles ikke */
+ if (Bgr.lNr != 0L) {
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (ngi > 0){ /* Finnes gruppen ? */
+ if (LC_GiQuery(pUtAdm)){
+ antall += LC_MerkGr(BT_GISOK,1); /* Tilslag */
+ }
+ }
+ }
+ avbrutt = LC_Cancel(); /* <ESC> avbryter lesing */
+ }
+
+ if (avbrutt) antall = -1L;
+
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+ }
+
+ return antall;
+}
+
+/*
+AR-20040705
+ÅE-20040705
+CH LC_FAPiQuery Finn alle grupper ved query mot pinfo
+CD =============================================================================
+CD Formål:
+CD Sjekker PINFO-delen av alle grupper mot aktuell queryopsett.
+CD Tilslag merkes i brukttabellen kolonne BT_GISOK (14).
+CD [Esc] avbryter utvalget, antall tilslag settes da til -1.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD unsigned short usLag i Velg hvilke "lag" det skal søkes i.
+CD LC_FRAMGR og /eller LC_BAKGR
+CD short antall r Antall tilslag på utvalget.
+CD
+CD Bruk:
+CD antall = LC_FAPiQuery(pUtAdm, LC_FRAMGR | LC_BAKGR);
+CD
+ =============================================================================
+*/
+SK_EntPnt_FYBA long LC_FAPiQuery(LC_UT_ADM *pUtAdm,unsigned short usLag)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_BGR Bgr,AktBgr;
+ long lPunkt;
+ short avbrutt = UT_FALSE;
+ short ustat;
+ short sFunnet = UT_FALSE;
+ char *regel;
+ long antall = -1L;
+
+
+ if (pUtAdm != NULL)
+ {
+ antall = 0L;
+
+ LC_GetGrNr(&AktBgr);
+
+ /* Blanker brukttabellen */
+ LI_EraseBt(BT_GISOK,BT_GISOK);
+
+ LC_InitNextBgr(&Bgr);
+
+ /* Sjekker alle grupper i aktuellt lag */
+ while(LC_NextBgr(&Bgr,usLag) && !avbrutt) {
+ /* Filhodet behandles ikke */
+ if (Bgr.lNr != 0L) {
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (nko > 0){ /* Finnes gruppen ? */
+ sFunnet=UT_FALSE;
+ lPunkt=1;
+ // Kontrollerer punkt i gruppa:
+ while (lPunkt<=nko && sFunnet==UT_FALSE && !avbrutt) {
+ ustat = 1;
+ LC_PunktUtvalg(pUtAdm,LC_OVERSE_PRIORITET,&ustat,lPunkt,&regel);
+ if (ustat == 0 && sFunnet==UT_FALSE && !avbrutt) {
+ sFunnet = UT_TRUE;
+ antall += LC_MerkGr(BT_GISOK,1); /* Tilslag */
+ break; // avbryter søk i denne gruppen ved første aktuelle pinfo
+ }
+ lPunkt++;
+ avbrutt = LC_Cancel(); /* <ESC> avbryter lesing */
+ }
+ }
+ }
+ avbrutt = LC_Cancel(); /* <ESC> avbryter lesing */
+ }
+
+ if (avbrutt) antall = -1L;
+
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+ }
+
+ return antall;
+}
+
+
+/*
+AR-890904
+CH LU_GiTestUtvalg Sjekk et utvalg
+CD ==========================================================================
+CD Formål:
+CD Sjekk om GINFO av aktuell gruppe tilfredstiller et gruppe-utvalg.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Administrasjonsblokk
+CD LC_UTVALG * pU i Peker til utvalg
+CD short sTilslag r Status: UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+CD
+CD Bruk:
+CD bTilslag = LU_GiTestUtvalg(pUtAdm,pU);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LU_GiTestUtvalg(LC_UT_ADM * pUtAdm,LC_UTVALG * pU)
+{
+ short sTilslag = UT_FALSE;
+ LC_UTVALG_ELEMENT * pUE = pU->pForsteUE;
+
+ // Hvis utvalgsregelen er med i et lag og dette ikke
+ // skal tegnes ut, returneres FALSE. JAØ-19980922
+ if (pU->pLag != NULL) {
+ if (pU->pLag->sLagAktiv == 0) return 0;
+ }
+ // Innført at også utvalgsregler kan slås av for tegning. JAØ-20020927
+ if (!pU->sTegnes) return 0;
+ /* Søk */
+ while (pUE != NULL) {
+ /* Linjen må testes i disse tilfeller */
+ /* Har tilslag, og metode er ..OG */
+ /* Har ikke tilslag, og metode er ..ELLER */
+ if (( sTilslag && pUE->kommando == LC_U_OG) ||
+ (!sTilslag && pUE->kommando == LC_U_ELLER)) {
+ sTilslag = LU_GiTestDelutvalg(pUtAdm,pUE);
+ }
+
+ pUE = pUE->pNesteUE;
+ }
+
+ return sTilslag;
+}
+
+
+
+/*
+AR-890904
+CH LU_GiTestDelutvalg Sjekk en del av et utvalg
+CD ==========================================================================
+CD Formål:
+CD Sjekk om GINFO av aktuell gruppe tilfredstiller en del av et
+CD gruppe-utvalg. Sjekker et utvalgselement samt underliggende elementer
+CD under dette.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Administrasjonsblokk
+CD LC_UTVALG_ELEMENT * pUE i Peker til utvalgselement
+CD short sTilslag r Status: UT_TRUE=tilslag, UT_FALSE=ikke tilslag
+CD
+CD Bruk:
+CD bTilslag = LU_GiTestDelutvalg(pUtAdm,pUE);
+ ==========================================================================
+*/
+static short LU_GiTestDelutvalg(LC_UT_ADM * pUtAdm,LC_UTVALG_ELEMENT * pUE)
+{
+ char *apara;
+ short gilin;
+ short sTilslag = UT_FALSE;
+ short sForste = UT_TRUE;
+ /* Søk */
+ while (pUE != NULL) {
+ if (sForste) {
+ /*
+ * Første element i delutvalget skal alltid testes.
+ */
+ sTilslag = LU_GiTestLinje(pUtAdm,pUE,&gilin,&apara);
+
+ pUE = pUE->pForsteUE;
+
+#ifdef TEST
+ if (pUE->pForsteUE != NULL) {
+ pUE = pUE->pForsteUE;
+ } else {
+ pUE = pUE->pNesteUE;
+ }
+#endif
+
+ sForste = UT_FALSE;
+
+ } else {
+ /*
+ * Elementet må testes i disse tilfeller:
+ * - Har tilslag, og metode er ..OG.
+ * - Har ikke tilslag, og metode er ..ELLER.
+ * Elementet kan være toppen av et nytt delutvalg, kaller derfor
+ * LU_GiTestDelutvalg for å teste dette elementet.
+ */
+ if (( sTilslag && pUE->kommando == LC_U_OG) ||
+ (!sTilslag && pUE->kommando == LC_U_ELLER)) {
+ sTilslag = LU_GiTestDelutvalg(pUtAdm,pUE);
+ }
+
+ pUE = pUE->pNesteUE;
+ }
+ }
+
+ return sTilslag;
+}
+
+
+/*
+AR-881215
+CH LU_GiTestLinje Sjekk en utvalgslinje
+CD ==========================================================================
+CD Formål:
+CD Sjekk om GINFO av aktuell gruppe tilfredstiller en linje ginfo-utvalg.
+CD
+CD Parametre
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD LC_UTVALG_ELEMENT * pUE i Peker til administrasjonsblokk for utvalg.
+CD char *gilin u GINFO-linje for funnet tilslag.
+CD char **apara u Peker til aktuell del av parameterstreng.
+CD short tilslag r Status: 1=tilslag, 0=ikke tilslag.
+CD
+CD Bruk:
+CD tilslag = LU_GiTestLinje(pUtAdm,pUE,&gilin,&apara);
+ ==========================================================================
+*/
+static short LU_GiTestLinje(LC_UT_ADM * pUtAdm,LC_UTVALG_ELEMENT * pUE,
+ short *gilin,char **apara)
+{
+ static char akt_para[U_PARA_LEN];
+ short metode,tilslag;
+ long lMaxAntall;
+ char *para;
+
+ metode = pUE->metode;
+ *gilin = 1;
+ *apara = akt_para;
+
+ /* Metode IKKE "!" */
+ if (metode == LC_U_IKKE){
+ /* AR:2002-04-24 */
+ /* if ((para = LC_GetGP(pUE->sosi,gilin,9999)) == NULL ||
+ *para == '\0') { */
+ if (LC_GetGP(pUE->sosi,gilin,9999) == NULL) {
+ return UT_TRUE;
+ }
+
+ /* Metode "FL" */
+ } else if (metode == LC_U_FLERE) {
+ /* Teller opp antall av dette SOSI-navnet */
+ tilslag = 0;
+ while ((*apara = LC_GetGP(pUE->sosi,gilin,9999)) != NULL) {
+ tilslag++;
+ /* Tilslag hvis navnet finnes mer enn 1 gang */
+ if (tilslag > 1) return UT_TRUE;
+ (*gilin)++;
+ }
+
+ /* Metode "!FL" */
+ } else if (metode == LC_U_IKKEFLERE) {
+ /* Teller opp antall av dette SOSI-navnet */
+ lMaxAntall = max(atol(pUE->min),1l);
+ tilslag = 0;
+ while ((*apara = LC_GetGP(pUE->sosi,gilin,9999)) != NULL) {
+ tilslag++;
+ /* Har flere forekomster, avbryter */
+ if (tilslag > lMaxAntall) return UT_FALSE;
+ (*gilin)++;
+ }
+ /* Tilslag, ikke flere forekomster */
+ return UT_TRUE;
+
+ /* Metode "AL" */
+ } else if (metode == LC_U_ALLE) {
+ if ((*apara = LC_GetGP(pUE->sosi,gilin,9999)) != NULL) {
+ return UT_TRUE;
+ }
+
+ /* Metode IKKE VALGT "IV" */
+ } else if (metode == LC_U_IKKEVALGT) {
+ if (! pUtAdm->sGruppeValgt)
+ return UT_TRUE;
+
+ /* Metode IKKE LIK "!=" */
+ } else if (metode == LC_U_IKKELIK) {
+ tilslag = 0;
+ pUE->metode = LC_U_LIK; /* Sjekker først på likhet */
+ while ((para = LC_GetGP(pUE->sosi,gilin,9999)) != NULL) { /* Hent parameter */
+ if (LU_ParaTest(pUE,para,akt_para,U_PARA_LEN)) { /* Tilslag? */
+ tilslag = 1;
+ break; /* Vet nå at det ikke blir tilslag, hopper ut */
+ }
+ (*gilin)++;
+ }
+ pUE->metode = LC_U_IKKELIK;
+ if (! tilslag) /* Tilslag når "=-testen" ikke ga tilslag */
+ return UT_TRUE;
+
+ /* Metode INNEHOLDER IKKE "!()" */
+ } else if (metode == LC_U_IKKECONTEIN) {
+ tilslag = 0;
+ pUE->metode = LC_U_CONTEIN; /* Sjekker først INNEHOLDER */
+ while ((para = LC_GetGP(pUE->sosi,gilin,9999)) != NULL) { /* Hent parameter */
+ if (LU_ParaTest(pUE,para,akt_para,U_PARA_LEN)) { /* Tilslag? */
+ tilslag = 1;
+ break; /* Vet nå at det ikke blir tilslag, hopper ut */
+ }
+ (*gilin)++;
+ }
+ pUE->metode = LC_U_IKKECONTEIN;
+ if (! tilslag) /* Tilslag når "=-testen" ikke ga tilslag */
+ return UT_TRUE;
+
+
+ /* Andre utvalgsmetoder */
+ } else {
+ while ((para = LC_GetGP(pUE->sosi,gilin,9999)) != NULL) { /* Hent parameter */
+ if (LU_ParaTest(pUE,para,akt_para,U_PARA_LEN)) { /* Tilslag? */
+ return UT_TRUE;
+ }
+ (*gilin)++;
+ }
+ }
+
+ return 0; /* Ikke tilslag */
+}
+
+
+/*
+AR:2006-08-08
+CH LU_ParaTest Sjekk parameter for tilslag
+CD =============================================================================
+CD Formål:
+CD Sjekk om parameteren tilfredsstiller denne utvalgslinjen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_UTVALG_ELEMENT * pUE i Peker til utvalgslinje
+CD char *para i Peker til parameterstreng
+CD char *akt_para i Aktuell del av parameterstrengen.
+CD short sMaxLen i Maks lengde for akt_para
+CD short tilslag r Status: 1=tilslag, 0=ikke tilslag
+CD
+CD Bruk:
+CD tilslag = LU_ParaTest(pUE,para,&akt_para,sMaxLen);
+ =============================================================================
+*/
+static short LU_ParaTest(LC_UTVALG_ELEMENT * pUE,char *para,char *pszAktPara,short sMaxLen)
+{
+ long heltall;
+ double flyttall,desimal;
+ short metode = pUE->metode;
+
+
+ /* Juster for ledd, og del av streng
+ * når dette er gitt som del av utvalgslinjen
+ * (og ikke som del av SOSI-navnet)
+ */
+ if((pUE->ledd > 0) || (pUE->start > 0) || (pUE->slutt > 0)) { // Ledd eller del av streng er angitt utenfor SOSI-navnet
+ LU_JustPara(para,(short)pUE->ledd,(short)pUE->start,(short)pUE->slutt,
+ pszAktPara,U_PARA_LEN);
+ }
+ else {
+ UT_StrCopy(pszAktPara,para,sMaxLen);
+ }
+
+ // Sjekk først at sammenligningen kan gjøres med aktuell talltype
+ short type = pUE->type;
+ if ((type & LC_U_TALL) == LC_U_TALL)
+ {
+ heltall = atol(pszAktPara); // OBS! Denne brukes i selve sammenligningen lenger nede i koden
+ if (heltall == LONG_MIN || heltall == LONG_MAX)
+ {
+ // Tallet har for mange siffer, må håndtere sammenligningen som tekst
+ type = LC_U_ALFA;
+ }
+ }
+
+ // ----- Utfør testen
+ switch (metode) {
+ case LC_U_LIK: /* Lik "=" */
+ if ((type & LC_U_TALL) == LC_U_TALL){ /* Heltall */
+ if (heltall == atol(pUE->min) )
+ return (1);
+ } else if ((type & LC_U_FLYT) == LC_U_FLYT){ /* Flyttall */
+ if (atof(pszAktPara) == atof(pUE->min) )
+ return (1);
+ } else{ /* Streng */
+ UT_StrUpper(pszAktPara);
+ if (strcmp(pszAktPara,pUE->min) == 0)
+ return (1);
+ }
+ break;
+
+ case LC_U_FRATIL: /* Fra - til "<>" */
+ if ((type & LC_U_TALL) == LC_U_TALL){ /* Heltall */
+ if (heltall >= atol(pUE->min) && heltall <= atol(pUE->max))
+ return (1);
+ } else if ((type & LC_U_FLYT) == LC_U_FLYT){ /* Flyttall */
+ flyttall = atof(pszAktPara);
+ if (flyttall >= atof(pUE->min) && flyttall <= atof(pUE->max))
+ return (1);
+ } else{ /* Streng */
+ UT_StrUpper(pszAktPara);
+ if (strcmp(pszAktPara,pUE->min) >= 0 && strcmp(pszAktPara,pUE->max) <= 0)
+ return (1);
+ }
+ break;
+
+ case LC_U_DELELIG: /* Delelig "/" */
+ // 2001-03-19: Endret slik at algoritmen for desimaltall alltid brukes.
+ //if (type == U_FLYT){ /* Flyttall */
+ desimal = modf(atof(pszAktPara) / atof(pUE->min), &flyttall);
+ if (fabs(fabs(desimal*atof(pUE->min)) - fabs(atof(pUE->max))) < 1.0E-6) {
+ return (1);
+ }
+
+ //} else{ /* Heltall eller streng */
+ // if ((atol(pszAktPara) % atol(pUE->min)) == atol(pUE->max)) {
+ // return (1);
+ // }
+ //}
+ break;
+
+ case LC_U_UDELELIG: /* Ikke delellig "!/" */
+ // 2001-03-19: Endret slik at algoritmen for desimaltall alltid brukes.
+ //if (type == U_FLYT){ /* Flyttall */
+ desimal = modf(atof(pszAktPara) / atof(pUE->min), &flyttall);
+ if (fabs(desimal) >= 1.0E-6)
+ return (1);
+
+ //} else{ /* Heltall eller streng */
+ // if ((atol(pszAktPara) % atol(pUE->min)) != 0L)
+ // return (1);
+ //}
+ break;
+
+ case LC_U_CONTEIN: /* Inneholder "()" */
+ UT_StrUpper(pszAktPara);
+ if (strstr(pszAktPara,pUE->min) != NULL)
+ return (1);
+ break;
+
+ case LC_U_UTENFOR: /* Utenfor "><" */
+ if ((type & LC_U_TALL) == LC_U_TALL){ /* Heltall */
+ if (heltall < atol(pUE->min) || heltall > atol(pUE->max))
+ return (1);
+ } else if ((type & LC_U_FLYT) == LC_U_FLYT){ /* Flyttall */
+ flyttall = atof(pszAktPara);
+ if (flyttall < atof(pUE->min) || flyttall > atof(pUE->max))
+ return (1);
+ } else{ /* Streng */
+ UT_StrUpper(pszAktPara);
+ if (strcmp(pszAktPara,pUE->min) < 0 || strcmp(pszAktPara,pUE->max) > 0)
+ return (1);
+ }
+ break;
+
+ case LC_U_MINDRE: /* Mindre enn "<" */
+ if ((type & LC_U_TALL) == LC_U_TALL){ /* Heltall */
+ if (heltall < atol(pUE->min))
+ return (1);
+ } else if ((type & LC_U_FLYT) == LC_U_FLYT){ /* Flyttall */
+ if (atof(pszAktPara) < atof(pUE->min))
+ return (1);
+ } else{ /* Streng */
+ UT_StrUpper(pszAktPara);
+ if (strcmp(pszAktPara,pUE->min) < 0)
+ return (1);
+ }
+ break;
+
+ case LC_U_STORRE: /* Større enn ">" */
+ if ((type & LC_U_TALL) == LC_U_TALL){ /* Heltall */
+ if (heltall > atol(pUE->min))
+ return (1);
+ } else if ((type & LC_U_FLYT) == LC_U_FLYT){ /* Flyttall */
+ if (atof(pszAktPara) > atof(pUE->min))
+ return (1);
+ } else{ /* Streng */
+ UT_StrUpper(pszAktPara);
+ if (strcmp(pszAktPara,pUE->min) > 0)
+ return (1);
+ }
+ break;
+ }
+
+ return (0); /* Ikke tilslag */
+}
+
+
+/*
+AR-891206
+CH LU_JustPara Juster parameter for ledd og posisjon
+CD =============================================================================
+CD Formål:
+CD Juster parameteren for leddnummer og del av streng.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *para i Parameterstreng som skal behandles
+CD short ledd i Leddnummer
+CD short start i Startposisjon i strengen (0=hele strengen)
+CD short slutt i Sluttposisjon i strengen (0=resten)
+CD char *akt_para iu Ny behandla parameterstreng
+CD short max_len i Max lengde på akt_para
+CD
+CD Bruk:
+CD LU_JustPara(para,ledd,start,slutt,akt_para,max_len);
+ =============================================================================
+*/
+static void LU_JustPara(char *para,short ledd,short start,short slutt,
+ char *akt_para,short max_len)
+{
+ char *cp,*nt;
+ /* Juster for ledd */
+ cp = UT_strtok(para," ",&nt);
+ while(cp != NULL && --ledd > 0){
+ cp = UT_strtok(NULL," ",&nt);
+ }
+
+ /* Juster for delstreng */
+ if (cp != NULL){
+ if (start != 0){
+ if (slutt != 0){
+ slutt = min(slutt,((short)strlen(cp)));
+ *(cp+slutt) = '\0';
+ }
+ start = min(start,((short)strlen(cp)));
+ cp += (start-1);
+ }
+ UT_StrCopy(akt_para,cp,max_len);
+
+ } else{
+ *akt_para = '\0';
+ }
+}
+
+
+/*
+AR-891207
+CH LC_QueryGP Søk i ginfo og finn verdi
+CD =============================================================================
+CD Formål:
+CD Bruker query-tekst for å finne linje der parameter skal hentes.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ---------------------------------------------------------------------------
+CD char *qulin i Linje med query-tekst.
+CD unsigned short iniv i Nivå: Det er definert konstanter som henges
+CD sammen med "|".
+CD LC_GINFO = søk i GINFO på aktuell gruppe
+CD LC_HODE = søk i filhodet
+CD Hvis begge er brukt søkes det først i GINFO.
+CD unsigned short *univ u Nivå: LC_GINFO = parameter er fra GINFO
+CD LC_HODE = parameter er fra filhodet
+CD short *ulin u GINFO-linjenummer for tilslaget.
+CD char **para u Funnet parameter.
+CD short funnet r Status: UT_TRUE=funnet, UT_FALSE=ikke funnet
+CD
+CD Bruk:
+CD funnet = LC_QueryGP(qulin,LC_GINFO | LC_HODE,&univ,&ulin,&para);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_QueryGP(char *qulin,unsigned short iniv,unsigned short *univ,short *ulin,char **para)
+{
+ LC_BGR Bgr,Hode;
+ short ngi;
+ long nko;
+ unsigned short info;
+ short sFunnet = UT_FALSE;
+ LC_UT_ADM *pUtAdm;
+
+ /* Åpne query */
+ pUtAdm = LC_OpenQuery();
+ /* Tolk linjen */
+ if (LC_PutQueryLine(pUtAdm,qulin,U_GRUPPE)) {
+ LC_PutQueryRegel(pUtAdm->Gruppe.pSisteU,"S");
+
+ /* Sjekk GINFO */
+ /* Initier søk */
+ pUtAdm->Gruppe.pAktU = pUtAdm->Gruppe.pForsteU;
+ pUtAdm->sGruppeValgt = UT_FALSE;
+
+ /* Søk */
+ sFunnet = LU_GiTestLinje(pUtAdm,pUtAdm->Gruppe.pForsteU->pForsteUE,ulin,para);
+ *univ = LC_GINFO;
+
+ /*
+ * Ikke funnet, og konstant er satt for at hodet skal sjekkes.
+ * Sjekk hodet.
+ */
+ if ( (! sFunnet) && (iniv & LC_HODE)) {
+ LC_GetGrNr(&Bgr); /* Husk aktuell gruppe */
+ Hode.pFil = Bgr.pFil;
+ Hode.lNr = 0L;
+ /* Les filhode */
+ LC_RxGr(&Hode,LES_OPTIMALT,&ngi,&nko,&info);
+
+ /* Initier søk */
+ pUtAdm->Gruppe.pAktU = pUtAdm->Gruppe.pForsteU;
+ pUtAdm->sGruppeValgt = UT_FALSE;
+
+ /* Søk */
+ sFunnet = LU_GiTestLinje(pUtAdm,pUtAdm->Gruppe.pForsteU->pForsteUE,ulin,para);
+ *univ = LC_HODE;
+
+ /* Les tilbake opprinnelig gruppe */
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+ }
+
+ LC_CloseQuery(pUtAdm);
+ return sFunnet;
+}
+
+
+/*
+AR-920524
+CH LU_LesULinje Les en utvalgs-linje fra kommandofilen
+CD ==========================================================================
+CD Formål:
+CD Les en utvalgs-linje fra kommandofilen.
+CD
+CD Parameters:
+CD Type Name I/O Forklaring
+CD ----------------------------------------------------------------
+CD FILE *pKomFil i Filpeker for beskrivelsesfil
+CD short sMaxTxLen i Max lengde av pszTx
+CD char *pszTx i Lest linje
+CD short *psNiv u Nivå (antall prikker forran navnet)
+CD short lesefeil r Lesefeil fra UT_ReadLine.
+CD
+CD Bruk:
+CD lesefeil = LU_LesULinje(pFil,sMaxTxLen,pszTx,&sNiv);
+CD =============================================================================
+*/
+static short LU_LesULinje(FILE *pKomFil,short sMaxTxLen,char *pszTx,
+ short *psNiv)
+{
+ char szLinje[100],*cp;
+ short lesefeil;
+
+ if (!(lesefeil = UT_ReadLineNoComm(pKomFil,100,szLinje))) {
+
+ cp = szLinje;
+
+ /* Hopp over ledende blanke */
+ while (UT_IsSpace(*cp)) {
+ cp++;
+ }
+
+ /* Tell opp antall prikker */
+ *psNiv = 0;
+ while (*cp == '.') {
+ (*psNiv)++;
+ cp++;
+ }
+
+ /* Kopier ut linjen */
+ UT_StrCopy(pszTx,cp,sMaxTxLen);
+ }
+
+ return lesefeil;
+}
+
+
+/*
+AR-920524
+CH LU_AppUtvalg Legg til et nytt utvalg
+CD ==========================================================================
+CD Formål:
+CD Legg til et nytt utvalg i en av kjedene av utvalg.
+CD
+CD Parametre:
+CD Type Navn I/O Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UTVALG_BLOKK *pUtBlokk i Toppblokk for aktuell utvalgstype.
+CD char *pszNavn i Utvalgsnavn
+CD
+CD Bruk:
+CD LU_AppUtvalg(pUtAdm->pGruppe,szNavn);
+CD =============================================================================
+*/
+static void LU_AppUtvalg (LC_UTVALG_BLOKK *pUB,char *pszNavn)
+{
+ LC_UTVALG * pU;
+
+ /* Alloker minne og initier */
+ pU = (LC_UTVALG *)UT_MALLOC(sizeof(LC_UTVALG));
+ memset(pU, 0, sizeof(LC_UTVALG));
+
+ pU->sPrioritet = 0;
+ pU->sOriginalPrioritet = 0;
+ pU->sStatus = LC_UFORANDRET;
+ pU->sTegnes = 1;
+ pU->pszNavn = (char*)UT_MALLOC(strlen(pszNavn)+1);
+ UT_StrCopy(pU->pszNavn, pszNavn, strlen(pszNavn)+1);
+ pU->pszRegel = NULL;
+
+ pU->pForsteUE = NULL;
+ pU->pSisteUE = NULL;
+ pU->pForrigeU = NULL;
+ pU->pNesteU = NULL;
+
+ /* Første */
+ if (pUB->pForsteU == NULL) {
+ pUB->pForsteU = pU;
+ pUB->pSisteU = pU;
+
+ } else {
+ pU->pForrigeU = pUB->pSisteU;
+ pUB->pSisteU->pNesteU = pU;
+ pUB->pSisteU = pU;
+ }
+
+ return;
+}
+
+
+/*
+AR-920402
+CH LC_InqMaxPrioritet Hent største prioritet
+CD ==========================================================================
+CD Formål:
+CD Henter største prioritet for gitt utvalgstype.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ----------------------------------------------------------------------
+CD LC_UT_ADM * pUA i Peker til administrasjonsblokk for utvalg.
+CD short sMaxPrioritet r Max prioritet
+CD
+CD Bruk:
+CD sMaxPrioritet = LC_InqMaxPrioritet(pUA);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_InqMaxPrioritet(LC_UT_ADM * pUA)
+{
+ if (pUA != NULL)
+ {
+ return pUA->sMaxPrior;
+ }
+
+ return 0;
+}
+
+
+/*
+AR-920814
+CH LC_TestPrioritetBrukt Tester om en prioritet er brukt
+CD ==========================================================================
+CD Formål:
+CD Tester om en prioritet er brukt.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD short sPrioritet i Prioritet som skal testes.
+CD short sBrukt r Status: UT_TRUE=brukt, UT_FALSE=ikke brukt.
+CD
+CD Bruk:
+CD sBrukt = LC_TestPrioritetBrukt(pUtAdm,sPrioritet);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_TestPrioritetBrukt(LC_UT_ADM * pUtAdm,short sPrioritet)
+{
+ LC_UTVALG * pU;
+
+
+ if (pUtAdm != NULL)
+ {
+ /*
+ * Test GRUPPE-UTVALG.
+ */
+ for (pU=pUtAdm->Gruppe.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ if (sPrioritet == pU->sPrioritet) return UT_TRUE; /* ==> Funnet */
+ }
+
+ /*
+ * Test PUNKT-UTVALG.
+ */
+ for (pU=pUtAdm->Punkt.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ if (sPrioritet == pU->sPrioritet) return UT_TRUE; /* ==> Funnet */
+ }
+
+ /*
+ * Test PINFO-UTVALG.
+ */
+ for (pU=pUtAdm->Pinfo.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ if (sPrioritet == pU->sPrioritet) return UT_TRUE; /* ==> Funnet */
+ }
+ }
+
+ return UT_FALSE; /* ==> Ikke funnet */
+}
+
+
+/*
+AR-940110
+CH LU_PakkPrioritet Pakker prioriteten
+CD ==========================================================================
+CD Formål:
+CD Pakker prioriteten.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD
+CD Bruk:
+CD LU_PakkPrioritet(pUtAdm);
+ ==========================================================================
+*/
+static void LU_PakkPrioritet(LC_UT_ADM * pUtAdm)
+{
+ LC_UTVALG * pU;
+ short s,sFerdig;
+ short NyPrior[LC_MAX_ANT_PRIOR];
+ short sAntNyPrior = 0;
+
+
+ if (pUtAdm != NULL)
+ {
+ /*
+ * Bygger opp tabell over hvilke prioriteter som er brukt.
+ */
+
+ /* GRUPPE-UTVALG. */
+ for (pU=pUtAdm->Gruppe.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ LU_HuskPrior(NyPrior,&sAntNyPrior,pU->sPrioritet);
+ }
+ /* PUNKT-UTVALG. */
+ for (pU=pUtAdm->Punkt.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ LU_HuskPrior(NyPrior,&sAntNyPrior,pU->sPrioritet);
+ }
+ /* PINFO-UTVALG. */
+ for (pU=pUtAdm->Pinfo.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ LU_HuskPrior(NyPrior,&sAntNyPrior,pU->sPrioritet);
+ }
+
+ /* Sorter prioritetene */
+ qsort(NyPrior,sAntNyPrior,sizeof(short),LU_compare);
+
+
+ /*
+ * Legg inn nye prioriteter.
+ */
+
+ /* GRUPPE-UTVALG. */
+ for (pU=pUtAdm->Gruppe.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ sFerdig = UT_FALSE;
+ for (s=0; sFerdig==UT_FALSE && s<sAntNyPrior; s++) {
+ if (NyPrior[s] == pU->sPrioritet) {
+ pU->sPrioritet = s;
+ sFerdig = UT_TRUE;
+ }
+ }
+ }
+ /* PUNKT-UTVALG. */
+ for (pU=pUtAdm->Punkt.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ sFerdig = UT_FALSE;
+ for (s=0; sFerdig==UT_FALSE && s<sAntNyPrior; s++) {
+ if (NyPrior[s] == pU->sPrioritet) {
+ pU->sPrioritet = s;
+ sFerdig = UT_TRUE;
+ }
+ }
+ }
+ /* PINFO-UTVALG. */
+ for (pU=pUtAdm->Pinfo.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ sFerdig = UT_FALSE;
+ for (s=0; sFerdig==UT_FALSE && s<sAntNyPrior; s++) {
+ if (NyPrior[s] == pU->sPrioritet) {
+ pU->sPrioritet = s;
+ sFerdig = UT_TRUE;
+ }
+ }
+ }
+
+ /* Oppdaterer max prioritet */
+ pUtAdm->sMaxPrior = sAntNyPrior-1;
+ }
+
+ return;
+}
+
+
+/* ===================================================== */
+int LU_compare (const void *arg1, const void *arg2)
+ {
+ if (*(short*)arg1 == *(short*)arg2) return 0;
+ if (*(short*)arg1 < *(short*)arg2) return -1;
+ return 1;
+ }
+
+
+/*
+AR-940110
+CH LU_HuskPrior Legg inn prioritet i tabellen
+CD ==========================================================================
+CD Formål:
+CD Legg inn prioritet i tabellen
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short *NyPrior iu Tabell over nye prioriteter
+CD short *sAntPrior iu Antall brukt i NyPrior
+CD short sPrior i Prioritet som skal legges inn.
+CD
+CD
+CD Bruk:
+CD LU_HuskPrior(NyPrior,&sAntPrior,pU->sPrioritet);
+ ==========================================================================
+*/
+static void LU_HuskPrior(short *NyPrior,short *sAntPrior,short sPrior)
+{
+ short s;
+ char szTx[10];
+
+ for (s=0; s<*sAntPrior; s++) {
+ if (sPrior == NyPrior[s]) {
+ return; /* ==> Prioriteten er brukt før, returner */
+ }
+ }
+
+ if (*sAntPrior >= LC_MAX_ANT_PRIOR) {
+ UT_SNPRINTF(szTx,10,"%hd",sPrior);
+ LC_Error(127,"(LU_HuskPrior)",szTx);
+
+ } else {
+ /* Ny prioritet, husk denne */
+ NyPrior[*sAntPrior] = sPrior;
+ (*sAntPrior)++;
+ }
+
+ return;
+}
+
+
+/*
+AR: 1999-11-20
+CH LC_LoggPrioritetUtvalg Skriver prioritetsoversikt
+CD ==========================================================================
+CD Formål:
+CD Skriver oversikt over prioriteter og utvalg til log-filen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_UT_ADM * pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD
+CD Bruk:
+CD LC_LoggPrioritetUtvalg(pUtAdm);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_LoggPrioritetUtvalg(LC_UT_ADM * pUtAdm)
+{
+ if (pUtAdm != NULL)
+ {
+ short sMaxPrioritet = LC_InqMaxPrioritet(pUtAdm);
+ short sPrioritet;
+ LC_UTVALG * pU;
+ short sG = 0;
+ short sP = 0;
+
+ UT_FPRINTF(stderr,"\n\n***** Prioriteter og utvalg *****\n");
+
+ for (sPrioritet=0; sPrioritet<sMaxPrioritet; sPrioritet++) {
+
+ UT_FPRINTF(stderr,"\nPrioritet: %hd\n",sPrioritet);
+
+ /* GRUPPE-UTVALG. */
+ for (pU=pUtAdm->Gruppe.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ if (sPrioritet == pU->sPrioritet) {
+ UT_FPRINTF(stderr," Gruppeutvalg: %s (%hd) \n",pU->pszNavn ,pU->sOriginalPrioritet);
+ sG++;
+ }
+ }
+
+ /* PUNKT-UTVALG. */
+ for (pU=pUtAdm->Punkt.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ if (sPrioritet == pU->sPrioritet) {
+ UT_FPRINTF(stderr," Punktutvalg: %s (%hd) \n",pU->pszNavn ,pU->sOriginalPrioritet);
+ sP++;
+ }
+ }
+
+ /* PINFO-UTVALG. */
+ #ifdef TEST
+ for (pU=pUtAdm->Pinfo.pForsteU; pU != NULL; pU = pU->pNesteU) {
+ if (sPrioritet == pU->sPrioritet) {
+ UT_FPRINTF(stderr," Pinfoutvalg: %s (%hd) \n",pU->pszNavn ,pU->sOriginalPrioritet);
+ }
+ }
+ #endif
+ }
+
+ UT_FPRINTF(stderr,"\nTotalt %hd gruppeutvalg, og %hd punktutvalg.\n",sG,sP);
+ }
+}
+
+
+/*
+AR-940110
+CH LC_UtvalgPrioritet Finn brukt prioritet
+CD ==========================================================================
+CD Formål:
+CD Sjekker GINFO og PINFO for å finne hvilke prioriteter som "berører" aktuell
+CD gruppe. Resultatet markeres i Gruppetabellen ulPrior.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ---------------------------------------------------------------------------
+CD LC_UT_ADM *pUtAdm i Peker til administrasjonsblokk for utvalg.
+CD
+CD Bruk:
+CD LC_UtvalgPrioritet(pUtAdm);
+ ===========================================================================
+*/
+SK_EntPnt_FYBA void LC_UtvalgPrioritet(LC_UT_ADM *pUtAdm)
+{
+ long lPnr;
+ short sPrior,sKolonne;
+ LC_UTVALG * pU;
+ unsigned long ulPrioritet[4];
+
+
+ if (pUtAdm != NULL)
+ {
+ ulPrioritet[0] = 0x00000000UL;
+ ulPrioritet[1] = 0x00000000UL;
+ ulPrioritet[2] = 0x00000000UL;
+ ulPrioritet[3] = 0x80000000UL; /* Info er bygd opp */
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+
+ /*
+ * GINFO
+ */
+
+ /* Initier søk */
+ pU = pUtAdm->Gruppe.pForsteU;
+ pUtAdm->sGruppeValgt = UT_FALSE;
+
+ /* Søk */
+ while (pU != NULL) {
+
+ sKolonne = pU->sPrioritet / 32;
+ sPrior = pU->sPrioritet % 32;
+
+ /* Hvis vi har tilslag på denne prioriteten trenger vi ikke å sjekke dette utvalget */
+ if ((ulPrioritet[sKolonne] & (0x1UL << sPrior)) == 0UL) {
+
+ if (LU_GiTestUtvalg(pUtAdm,pU)) {
+ /* Tilslag */
+ pUtAdm->sGruppeValgt = UT_TRUE;
+
+ /* Husk at prioriteten er brukt */
+ ulPrioritet[sKolonne] |= (0x1UL << sPrior);
+ }
+ }
+
+ /* Fortsett med neste utvalg */
+ pU = pU->pNesteU;
+ }
+
+
+ /*
+ * PINFO
+ *
+ * Sjekker bare hvis :
+ * - utvalgsmetode "!" (ikke) er brukt,
+ * - gruppen har PINFO
+ * - gruppen har KP
+ * - gruppen har høyde
+ */
+
+ if (pUtAdm->Punkt.sTestAllePi == UT_TRUE ||
+ Sys.pGrInfo->info & GI_PINFO ||
+ Sys.pGrInfo->info & GI_KP ||
+ Sys.pGrInfo->info & GI_NAH) {
+
+ for (lPnr=1; lPnr<=Sys.pGrInfo->nko; ++lPnr) {
+ /* Initier søk */
+ /* Utvalgsmetode "!" (ikke) er brukt, eller
+ punktet har PINFO mm. */
+ if (pUtAdm->Punkt.sTestAllePi == UT_TRUE ||
+ LC_TestPi(lPnr,pUtAdm->Punkt.sHoydeBrukt)) {
+ pU = pUtAdm->Punkt.pForsteU;
+ } else {
+ pU = NULL;
+ }
+
+ /* Søk */
+ while (pU != NULL) {
+
+ sKolonne = pU->sPrioritet / 32;
+ sPrior = pU->sPrioritet % 32;
+
+ /* Hvis vi har tilslag på denne prioriteten trenger vi ikke å sjekke dette utvalget */
+ if ((ulPrioritet[sKolonne] & (0x1UL << sPrior)) == 0UL) {
+
+ if (LC_PiTestUtvalg(pUtAdm,pU,lPnr)) {
+ /* Tilslag */
+ /* Husk at prioriteten er brukt */
+ ulPrioritet[sKolonne] |= (0x1UL << sPrior);
+ }
+ }
+
+ /* Fortsett med neste utvalg */
+ pU = pU->pNesteU;
+ }
+ }
+ }
+
+ Sys.pGrInfo->ulPrior[0] = ulPrioritet[0];
+ Sys.pGrInfo->ulPrior[1] = ulPrioritet[1];
+ Sys.pGrInfo->ulPrior[2] = ulPrioritet[2];
+ Sys.pGrInfo->ulPrior[3] = ulPrioritet[3];
+ }
+ }
+}
+
+
+/*
+AR:2007-08-23
+CH LC_ErLik_Avrundet Rund av og sjekk om sammenfallende punkt
+CD ==========================================================================
+CD Formål:
+CD Runder av til valgt enhet, og sjekker om de to punktene er sammenfallende.
+CD (Avviket er mindre enn 1/10 enhet både nord og øst)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ---------------------------------------------------------------------------
+CD double dA1 i P1
+CD double dN1 i
+CD double dA2 i P2
+CD double dN2 i
+CD double dEnhet i Enhet som skal brukes i sammenligningen
+CD bool bErLike r Status: true = Samme koordinat
+CD false = Ikke samme koordinat
+CD
+CD Bruk:
+CD bSammenfallende = LC_ErLik(dA1,dN1,dA2,dN2,dEnhet);
+ ===========================================================================
+*/
+SK_EntPnt_FYBA bool LC_ErLik_Avrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet)
+{
+ // 2010-01-25: Endret fra UT_RoundDD til UT_RoundHalfUpDD
+ dA1 = UT_RoundHalfUpDD(dA1 / dEnhet) * dEnhet;
+ dN1 = UT_RoundHalfUpDD(dN1 / dEnhet) * dEnhet;
+ dA2 = UT_RoundHalfUpDD(dA2 / dEnhet) * dEnhet;
+ dN2 = UT_RoundHalfUpDD(dN2 / dEnhet) * dEnhet;
+
+ return ((fabs(dA1-dA2) < dEnhet/10.0) && (fabs(dN1-dN2) < dEnhet/10.0));
+}
+
+
+/*
+AR:2007-08-23
+CH LC_ErLik_IkkeAvrundet Sjekk om sammenfallende punkt (uten avrunding)
+CD ==========================================================================
+CD Formål:
+CD Sjekker om de to punktene er sammenfallende innen gitt nøyaktighet.
+CD Det skjer ingen avrunding av koordinatene før sammenligningen.
+CD (Avviket er mindre enn 1/10 enhet både nord og øst)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ---------------------------------------------------------------------------
+CD double dA1 i P1
+CD double dN1 i
+CD double dA2 i P2
+CD double dN2 i
+CD double dEnhet i Enhet som skal brukes i sammenligningen
+CD bool bErLike r Status: true = Samme koordinat
+CD false = Ikke samme koordinat
+CD
+CD Bruk:
+CD bSammenfallende = LC_ErLik(dA1,dN1,dA2,dN2,dEnhet);
+ ===========================================================================
+*/
+SK_EntPnt_FYBA bool LC_ErLik_IkkeAvrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet)
+{
+ return ((fabs(dA1-dA2) < dEnhet/10.0) && (fabs(dN1-dN2) < dEnhet/10.0));
+}
+
+
+/*
+AR:2007-08-23
+CH LC_ErReferert Sjekk om gruppe er referert
+CD ==========================================================================
+CD Formål:
+CD Sjekker om aktuell gruppe er referert fra andre grupper.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ---------------------------------------------------------------------------
+CD bool bReferert r Det finnes referanser til gruppen
+CD
+CD Bruk:
+CD bReferert = LC_ErReferert();
+===========================================================================
+*/
+SK_EntPnt_FYBA bool LC_ErReferert(void)
+{
+ LC_BGR FlateBgr;
+ double a,n;
+ LC_GEO_STATUS GeoStat;
+ short ngi;
+ long nko;
+ unsigned short info;
+ long lAntRef;
+ short sGiLin,sRefPos;
+ long *plRefArray,*plRef;
+ long l;
+
+ bool bReferert = false;
+
+ /* Husk gruppen */
+ LC_FILADM *pFil = Sys.GrId.pFil;
+ LC_BGR Bgr = Sys.GrId;
+ long lGmlSnr = LC_GetSn();
+
+ LC_GetTK(1,&a,&n);
+ LC_SBFlate(&GeoStat,LC_FRAMGR,a-0.1,n-0.1,a+0.1,n+0.1);
+ if (LC_FFFlate(&GeoStat,&FlateBgr)) {
+ do {
+ if (FlateBgr.pFil == pFil) {
+ /* Funnet flate i rett fil, sjekk referansene */
+ LC_RxGr(&FlateBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ lAntRef = LC_InqAntRef();
+ plRefArray = (long *) UT_MALLOC(lAntRef * sizeof(long));
+ sGiLin = 2;
+ sRefPos = 0;
+ LC_GetRef(plRefArray,lAntRef,&sGiLin,&sRefPos);
+
+ plRef = plRefArray;
+ for (l=0; (!bReferert) && l<lAntRef; l++) {
+ if (labs(*plRef) == lGmlSnr) {
+ bReferert = true;
+ }
+ ++plRef;
+ }
+
+ UT_FREE(plRefArray);
+ }
+ } while ((!bReferert) && LC_FNFlate(&GeoStat,&FlateBgr));
+ }
+ LC_AvsluttSok(&GeoStat);
+
+ // Leser inn opprinnelig gruppe igjen
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ return bReferert;
+}
+
+/*
+AR:2009-04-28
+CH LC_ErReferertFraAntall Tell antall referanser til gruppe
+CD ==========================================================================
+CD Formål:
+CD Tell antall referanser til aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ---------------------------------------------------------------------------
+CD long lAntall r Antall grupper som refererer gruppen
+CD
+CD Bruk:
+CD lAntall = LC_ErReferertFraAntall();
+===========================================================================
+*/
+SK_EntPnt_FYBA long LC_ErReferertFraAntall(void)
+{
+ LC_BGR FlateBgr;
+ double a,n;
+ LC_GEO_STATUS GeoStat;
+ short ngi;
+ long nko;
+ unsigned short info;
+ long lAntRef;
+ short sGiLin,sRefPos;
+ long *plRefArray,*plRef;
+ long l;
+
+ long lAntall = 0;
+
+ /* Husk gruppen */
+ LC_FILADM *pFil = Sys.GrId.pFil;
+ LC_BGR Bgr = Sys.GrId;
+ long lGmlSnr = LC_GetSn();
+
+ LC_GetTK(1,&a,&n);
+ LC_SBFlate(&GeoStat,LC_FRAMGR,a-0.1,n-0.1,a+0.1,n+0.1);
+ if (LC_FFFlate(&GeoStat,&FlateBgr)) {
+ do {
+ if (FlateBgr.pFil == pFil) {
+ /* Funnet flate i rett fil, sjekk referansene */
+ LC_RxGr(&FlateBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ lAntRef = LC_InqAntRef();
+ plRefArray = (long *) UT_MALLOC(lAntRef * sizeof(long));
+ sGiLin = 2;
+ sRefPos = 0;
+ LC_GetRef(plRefArray,lAntRef,&sGiLin,&sRefPos);
+
+ plRef = plRefArray;
+ for (l=0; l<lAntRef; l++) {
+ if (labs(*plRef) == lGmlSnr) {
+ ++lAntall;
+ }
+ ++plRef;
+ }
+
+ UT_FREE(plRefArray);
+ }
+ } while (LC_FNFlate(&GeoStat,&FlateBgr));
+ }
+ LC_AvsluttSok(&GeoStat);
+
+ // Leser inn opprinnelig gruppe igjen
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ return lAntall;
+}
diff --git a/src/FYBA/FYLX.cpp b/src/FYBA/FYLX.cpp
new file mode 100644
index 0000000..7d2418a
--- /dev/null
+++ b/src/FYBA/FYLX.cpp
@@ -0,0 +1,4948 @@
+/* === AR-911003 ============================================================ */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fylx.c */
+/* Innhold: Put og get rutiner til RB */
+/* ========================================================================== */
+
+#include "stdafx.h"
+
+#include <math.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+
+/* Globale variabler for FYBA */
+extern LC_SYSTEMADM Sys; /* Systemadministrasjon */
+extern char retur_str[LC_MAX_SOSI_LINJE_LEN]; /* Returstreng */
+
+/* Statiske variabler */
+
+/* Lokale rutiner */
+static long LX_GetRefOmkrets(LC_GR_STATUS *pGRS,long *ref_array,
+ unsigned char *ref_status,long max_ref);
+static long LX_GetRefOy(LC_GRF_STATUS * pGS,long *ref_array,
+ unsigned char *ref_status,long max_ref);
+static void LX_CreatePibuf(long lPnr);
+static double LX_ArealGruppe(LC_BGR * pBgr,short retning);
+static void LX_PutGi(short lin_nr, const char *szGinfo);
+
+
+/*
+AR-920921
+CH LC_InitGetRefFlate Initierer status for GetRefFlate
+CD ==========================================================================
+CD Formål:
+CD Initierer status for GetRefFlate.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GRF_STATUS * pRefStat iu Struktur med statusopplysninger.
+CD
+CD Bruk:
+CD LC_InitGetRefFlate(pGrfStat,pBgr);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_InitGetRefFlate(LC_GRF_STATUS * pGS)
+{
+ pGS->Omkr.sGiLinNr = 2;
+ pGS->Omkr.sRefPos = 0;
+ pGS->Omkr.sRefLin = UT_FALSE;
+
+ pGS->usOmkretsFerdig = UT_FALSE;
+
+ pGS->Bgr.pFil = NULL;
+ pGS->Bgr.lNr = INGEN_GRUPPE;
+}
+
+
+/*
+AR-920930
+CH LC_GetRefFlate Hent referanser for flate fra GINFO
+CD ==========================================================================
+CD Formål:
+CD Henter ut et array med referanser for flate fra GINFO i aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -------------------------------------------------------------------------
+CD LC_GRF_STATUS * GrfStat iu Struktur med statusopplysninger.
+CD unsigned short usHent i Hva skal hentes:
+CD GRF_YTRE = Ytre avgrensing
+CD GRF_INDRE = Indre avgrensing, øyer
+CD (kan kombineres med | (or).)
+CD long *ref_array u GRUPPENUMMER for refererte grupper.
+CD unsigned char *ref_status u Status for gruppene i ref_array.
+CD LC_MED_DIG = Brukes MED dig retning.
+CD LC_MOT_DIG = Brukes MOT dig retning.
+CD GRF_START_OY = Første gruppe i øy
+CD GRF_SLUTT_OY = Siste gruppe i øy
+CD long max_ref i Max antall linjer i ref_array og ref_status.
+CD long ant_ref r Antall linjer brukt i ref_array.
+CD 0 viser at hele flata er behandla.
+CD
+CD Bruk:
+CD #define MAX_REF 20
+CD long ref_arr[MAX_REF];
+CD char ref_status[MAX_REF];
+CD long ant_ref;
+CD LC_GRF_STATUS GrfStat;
+CD
+CD LC_InitGetRefFlate(&GrfStat);
+CD
+CD ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+CD do {
+CD if (ant_ref > 0) {
+CD .
+CD Behandle ytre avgrensing
+CD .
+CD }
+CD
+CD [if (ant_ref < MAX_REF) break;]
+CD
+CD ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REF);
+CD } while (ant_ref > 0);
+CD
+CD LC_InitGetRefFlate(&GrfStat);
+CD ant_ref = LC_GetRefFlate(&GrfStat,GRF_INDRE,ref_arr,ref_status,MAX_REF);
+CD do {
+CD if (ant_ref > 0) {
+CD .
+CD Behandle indre avgrensing (øy)
+CD .
+CD }
+CD
+CD [if (ant_ref < MAX_REF) break;]
+CD
+CD ant_ref = LC_GetRefFlate(&GrfStat,GRF_INDRE,ref_arr,ref_status,MAX_REF);
+CD } while (ant_ref > 0);
+CD
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA long LC_GetRefFlate(LC_GRF_STATUS * GrfStat,unsigned short usHent,long *ref_array,
+ unsigned char *ref_status,long max_ref)
+{
+ long antall;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ if ((usHent & GRF_YTRE) && GrfStat->usOmkretsFerdig == UT_FALSE) {
+ /* Ytre avgrensning */
+ antall = LX_GetRefOmkrets(&GrfStat->Omkr,ref_array,ref_status,max_ref);
+ if (antall > 0) {
+ return antall;
+ }
+
+ /* Ferdig med behandling av omkretsen */
+ GrfStat->usOmkretsFerdig = UT_TRUE;
+ }
+
+ if (usHent & GRF_INDRE) {
+ /* Indre avgrensning (øy) */
+ return LX_GetRefOy(GrfStat,ref_array,ref_status,max_ref);
+ }
+ }
+
+ return 0;
+}
+
+
+/*
+AR-920930
+CH LX_GetRefOmkrets Hent referanser for omkretsen
+CD ==========================================================================
+CD Formål:
+CD Henter ut et array med referanser for omkretsen av flate.
+CD ant_ref == 0 eller ant_ref < max_ref viser at hele omkretsen er behandla.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GR_STATUS *pGRS iu Struktur med statusopplysninger.
+CD long *ref_array u GRUPPENUMMER for refererte grupper.
+CD unsigned char *ref_status u Status for gruppene i ref_array.
+CD LC_MED_DIG = Brukes MED dig retning
+CD LC_MOT_DIG = Brukes MOT dig retning
+CD long max_ref i Max antall linjer i ref_array.
+CD short ant_ref r Antall linjer brukt i ref_array.
+CD
+CD Bruk:
+CD ant_ref = LX_GetRefOmkrets(&OmkrStat,ref_array,ref_status,max_ref);
+CD ==========================================================================
+*/
+static long LX_GetRefOmkrets(LC_GR_STATUS *pGRS,long *ref_array,
+ unsigned char *ref_status,long max_ref)
+{
+ char *gp,ginfo[LC_MAX_SOSI_LINJE_LEN];
+ long snr,grnr;
+ long ant_ref = 0;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Finn referanser */
+ while (pGRS->sGiLinNr <= Sys.pGrInfo->ngi) {
+ gp = LX_GetGi(pGRS->sGiLinNr);
+
+ /* Handter referanselinjer */
+ if ((pGRS->sRefLin = LC_ErLinjeRefLin(gp,pGRS->sRefLin)) == UT_TRUE) {
+ UT_StrCopy(ginfo,gp,LC_MAX_SOSI_LINJE_LEN);
+ gp = ginfo + pGRS->sRefPos;
+ pGRS->sRefPos = 0;
+ while (*gp){ /* Tolk en linje */
+ if (ant_ref < max_ref) {
+ if (*gp == ':') { /* Tall */
+ ++gp;
+ /* Husk retning */
+ if (*gp == '-') {
+ *ref_status++ = LC_MOT_DIG;
+ ++gp;
+ } else {
+ *ref_status++ = LC_MED_DIG;
+ }
+ /* Hent serienummer og konverter til gruppenummer */
+ if (isdigit(*gp)) {
+ snr = strtol(gp,&gp,10);
+ /* Konverter til gruppenummer */
+ if ((grnr = LI_GetSnr(Sys.GrId.pFil,snr)) != INGEN_GRUPPE) {
+ *ref_array++ = grnr;
+ ++ant_ref;
+
+ } else {
+ UT_FPRINTF(stderr,"Snr. %ld er referert i \"%s : %s\", finnes ikke!\n",snr,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ ref_status--;
+ }
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig referanse \"%s\" i \"%s : %s\"\n",ginfo,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ ref_status--;
+ }
+
+ } else if (*gp == '(') { /* Start øy, ferdig med omkretsen */
+ pGRS->sRefPos = (short)(gp - ginfo);
+ return ant_ref;
+
+ } else { /* Ukjent tegn */
+ ++gp;
+ }
+
+ } else { /* Tabellen er full */
+ pGRS->sRefPos = (short)(gp - ginfo);
+ return ant_ref;
+ }
+ }
+ }
+ pGRS->sGiLinNr++;
+ }
+ }
+ return (ant_ref);
+}
+
+
+/*
+AR-920930
+CH LX_GetRefOy Hent referanser for øyer
+CD ==========================================================================
+CD Formål:
+CD Henter ut et array med referanser for omkretsen av øy.
+CD ant_ref == 0 eller ant_ref < max_ref viser at hele omkretsen er behandla.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -------------------------------------------------------------------------
+CD LC_GRF_STATUS * pGS iu Struktur med statusopplysninger.
+CD long *ref_array u GRUPPENUMMER for refererte grupper.
+CD unsigned char *ref_status u Status for gruppene i ref_array.
+CD LC_MED_DIG = Brukes MED dig retning
+CD LC_MOT_DIG = Brukes MOT dig retning
+CD GRF_START_OY = Første gruppe i øy
+CD GRF_SLUTT_OY = Siste gruppe i øy
+CD long max_ref i Max antall linjer i ref_array.
+CD short ant_ref r Antall linjer brukt i ref_array.
+CD
+CD Bruk:
+CD ant_ref = LX_GetRefOy(&GS,ref_array,ref_status,max_ref);
+CD ==========================================================================
+*/
+static long LX_GetRefOy(LC_GRF_STATUS * pGS,long *ref_array,
+ unsigned char *ref_status,long max_ref)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ char *gp,ginfo[LC_MAX_SOSI_LINJE_LEN];
+ long snr,grnr,antall;
+ unsigned char ucRetning;
+ LC_BGR Bgr,GmlBgr;
+ long ant_ref = 0;
+
+
+ Bgr.pFil = Sys.GrId.pFil;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Husk aktuell gruppe */
+ GmlBgr = Sys.GrId;
+
+ /* Les inn resten av påbegynnt refferert flate */
+ if (pGS->Bgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&(pGS->Bgr),LES_OPTIMALT,&ngi,&nko,&info);
+
+ ant_ref = LX_GetRefOmkrets(&(pGS->Oy),ref_array,ref_status,max_ref);
+ ref_array += ant_ref;
+ ref_status += ant_ref;
+
+ /* Les inn igjen aktuell gruppe */
+ LC_RxGr(&GmlBgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ if (ant_ref < max_ref) {
+ pGS->Bgr.pFil = NULL;
+ pGS->Bgr.lNr = INGEN_GRUPPE;
+ }
+ }
+
+ /* Finn referanser */
+ while (pGS->Omkr.sGiLinNr <= Sys.pGrInfo->ngi) {
+ gp = LX_GetGi(pGS->Omkr.sGiLinNr);
+
+ /* Handter referanselinjer */
+ if ((pGS->Omkr.sRefLin = LC_ErLinjeRefLin(gp,pGS->Omkr.sRefLin)) == UT_TRUE) {
+ UT_StrCopy(ginfo,gp,LC_MAX_SOSI_LINJE_LEN);
+ gp = ginfo + pGS->Omkr.sRefPos;
+ pGS->Omkr.sRefPos = 0;
+ while (*gp) { /* Tolk en linje */
+ if (ant_ref < max_ref) {
+ if (*gp == ':') { /* Tall */
+ ++gp;
+ /* Husk retning */
+ if (*gp == '-') {
+ ucRetning = LC_MOT_DIG;
+ ++gp;
+ } else {
+ ucRetning = LC_MED_DIG;
+ }
+ /* Hent serienummer og konverter til gruppenummer */
+ if (isdigit(*gp)) {
+ snr = strtol(gp,&gp,10);
+ /* Konverter til gruppenummer */
+ if ((grnr = LI_GetSnr(Sys.GrId.pFil,snr)) != INGEN_GRUPPE) {
+ Bgr.lNr = grnr;
+ /* Referanse til flate, pakk ut denne */
+ if (LC_GetGrParaBgr(&Bgr,&ngi,&nko,&info)
+ == L_FLATE) {
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ pGS->Oy.sGiLinNr = 2;
+ pGS->Oy.sRefPos = 0;
+ pGS->Oy.sRefLin = UT_FALSE;
+
+ antall = LX_GetRefOmkrets(&(pGS->Oy),ref_array,
+ ref_status,max_ref-ant_ref);
+ ref_array += antall;
+ ref_status += antall;
+ ant_ref += antall;
+
+ /* Les inn igjen aktuell gruppe */
+ LC_RxGr(&GmlBgr,LES_OPTIMALT,&ngi,&nko,&info);
+
+ if (ant_ref >= max_ref) {
+ pGS->Bgr = Bgr;
+ } else {
+ pGS->Bgr.pFil = NULL;
+ pGS->Bgr.lNr = INGEN_GRUPPE;
+ }
+
+ } else {
+ *ref_status++ = ucRetning;
+ *ref_array++ = grnr;
+ ++ant_ref;
+ }
+
+ } else {
+ UT_FPRINTF(stderr,"Snr. %ld er referert i \"%s : %s\", finnes ikke!\n",snr,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig referanse \"%s\" i \"%s : %s\"\n",ginfo,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+
+ } else if (*gp == '(') { /* Start øy */
+ *ref_array++ = INGEN_GRUPPE;
+ *ref_status++ = GRF_START_OY;
+ ++ant_ref;
+ ++gp;
+
+ } else if (*gp == ')') { /* Slutt øy */
+ *ref_array++ = INGEN_GRUPPE;
+ *ref_status++ = GRF_SLUTT_OY;
+ ++ant_ref;
+ ++gp;
+
+ } else { /* Ukjent tegn */
+ ++gp;
+ }
+
+ } else { /* Tabellen er full */
+ pGS->Omkr.sRefPos = (short)(gp - ginfo);
+ return ant_ref; /* ==> Retur */
+ }
+ }
+ }
+ pGS->Omkr.sGiLinNr++;
+ }
+ }
+
+ return ant_ref;
+}
+
+
+/*
+AR-921012
+CH LC_InqAntRef Spørr om antall referanser
+CD ==========================================================================
+CD Formål:
+CD Spørr om antall referanser i GINFO i aktuell gruppe.
+CD Dette kallet kan brukes til å finne hvor stor array som må allokeres før
+CD kall til LC_GetRef.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long ant_ref r Antall referanser i GINFO.
+CD OBS! Start- og sluttparantes for øy blir regnet
+CD som egne referanser.
+CD
+CD Bruk:
+CD long lAntRef;
+CD short sGiLin,sRefPos;
+CD long *plRefArray;
+CD
+CD lAntRef = LC_InqAntRef();
+CD plRefArray = (long *) UT_MALLOC(lAntRef * sizeof(long));
+CD sGiLin = 2;
+CD sRefPos = 0;
+CD LC_GetRef(plRefArray,lAntRef,&sGiLin,&sRefPos);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA long LC_InqAntRef(void)
+{
+ char *gp,ginfo[LC_MAX_SOSI_LINJE_LEN];
+ long lAntRef = 0;
+ short gilin = 2;
+ short sRefLin = UT_FALSE; /* Viser om aktuel linje inneholder referanser */
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Finn referanser */
+ while (gilin <= Sys.pGrInfo->ngi){
+ gp = LX_GetGi(gilin);
+
+ /* Handter referanselinjer */
+ if ((sRefLin = LC_ErLinjeRefLin(gp,sRefLin)) == UT_TRUE) {
+ UT_StrCopy(ginfo,gp,LC_MAX_SOSI_LINJE_LEN);
+ gp = ginfo;
+ while (*gp) { /* Tolk en linje */
+ if (*gp == ':') { /* Tall */
+ ++gp;
+ if (isdigit(*gp) || *gp == '-') {
+ while (*gp && (!UT_IsSpace(*gp)) && *gp != ')') {
+ ++gp;
+ }
+ ++lAntRef;
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig referanse \"%s\" i gruppe \"%s : %s\"\n",ginfo,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+
+ } else if (*gp == '(' || *gp == ')') { /* Start og slutt øy */
+ ++lAntRef;
+ ++gp;
+
+ } else { /* Ukjent tegn */
+ ++gp;
+ }
+ }
+ }
+ ++gilin;
+ }
+ }
+ return lAntRef;
+}
+
+
+/*
+AR-900213
+OJ-900213
+CH LC_GetRef Hent referanser fra GINFO
+CD ==========================================================================
+CD Formål:
+CD Henter ut et array med referanser fra GINFO i aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long *ref_array u Serienr. for refererte grupper.
+CD Start øy, og slutt øy angis ved fiktive gruppenr.
+CD Følgende konstanter er definert:
+CD START_OY = 9999999L = Start øy.
+CD SLUTT_OY = -9999999L = Slutt øy.
+CD long max_ref i Max antall linjer i ref_array.
+CD short *gilin i/u linje for start referanselesing
+CD short *refpos i/u posisjon i linja for neste innlegging i array.
+CD long ant_ref r Antall linjer brukt i ref_array.
+CD
+CD Bruk:
+CD ant_ref = LC_GetRef(ref_array,max_ref,&gilin,&refpos);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA long LC_GetRef(long *ref_array,long max_ref,short *gilin,short *refpos)
+{
+ char *gp,ginfo[LC_MAX_SOSI_LINJE_LEN];
+ long ant_ref = 0;
+ short sRefLin = UT_FALSE; /* Viser om aktuel linje inneholder referanser */
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+ /* Finn referanser */
+ while (*gilin <= Sys.pGrInfo->ngi){
+ gp = LX_GetGi(*gilin);
+
+ /* Handter referanselinjer */
+ if ((sRefLin = LC_ErLinjeRefLin(gp,sRefLin)) == UT_TRUE) {
+ UT_StrCopy(ginfo,gp,LC_MAX_SOSI_LINJE_LEN);
+ gp = ginfo + *refpos;
+ *refpos = 0;
+ while (*gp){ /* Tolk en linje */
+ if (ant_ref < max_ref){
+ if (*gp == ':'){ /* Tall */
+ ++gp;
+ if (isdigit(*gp) || *gp == '-') {
+ *ref_array++ = strtol(gp,&gp,10);
+ ++ant_ref;
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig referanse \"%s\" i gruppe \"%s : %s\"\n",ginfo,Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_REF;
+ }
+
+ } else if (*gp == '('){ /* Start øy */
+ *ref_array++ = START_OY;
+ ++ant_ref;
+ ++gp;
+ } else if (*gp == ')'){ /* Slutt øy */
+ *ref_array++ = SLUTT_OY;
+ ++ant_ref;
+ ++gp;
+ } else{ /* Ukjent tegn */
+ ++gp;
+ }
+ } else{ /* Tabellen er full */
+ *refpos = (short)(gp - ginfo);
+ return (ant_ref);
+ }
+ }
+ }
+ (*gilin)++;
+ }
+ }
+ return (ant_ref);
+}
+
+
+/*
+OJ-901016
+AR-930930
+CH LC_PutRef Legger inn referanser i GINFO
+CD ==========================================================================
+CD Formål:
+CD Legger inn et array med referanser til GINFO i aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long ref_array i Gruppenummer for refererte grupper.
+CD Start øy, og slutt øy angis ved fiktive gruppenr.
+CD Følgende konstanter er definert:
+CD START_OY = 9999999L = Start øy.
+CD SLUTT_OY = -9999999L = Slutt øy.
+CD long ant_ref i Antall linjer i ref_array.
+CD short *ngi r Antall linjer GINFO
+CD
+CD Bruk:
+CD ngi = LC_PutRef(ref_array,ant_ref);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutRef(long *ref_array,long ant_ref)
+{
+ #define MAX_LEN 66 /* Ginfolinjen skrives ut når den er lengre en 66 tegn */
+ short gilin;
+ long j;
+ char temp[LC_MAX_SOSI_LINJE_LEN],*ginfo,*cp;
+ short ledig_linje = -1;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+ /* Pakker gammel GINFO */
+ for (gilin=2; gilin <= Sys.pGrInfo->ngi; ++gilin) {
+ ginfo = LX_GetGi(gilin);
+
+ /* Gammel type referanse er funnet */
+ if (strncmp(ginfo,".. ",3) == 0) {
+ if (ledig_linje == -1) { /* Første linje med referanse */
+ ledig_linje = gilin;
+ }
+
+ /* Ny type referanse er funnet */
+ } else if (strncmp(ginfo,"..REF ",6) == 0) {
+ if (ledig_linje == -1) { /* Første linje med referanse */
+ ledig_linje = gilin;
+ }
+ /* Søk over resten av referansene */
+ for (++gilin; gilin <= Sys.pGrInfo->ngi; ++gilin) {
+ ginfo = LX_GetGi(gilin);
+ if (strncmp(ginfo,"..",2) == 0) { /* Annen GINFO er funnet */
+ gilin--;
+ break; /* Avbryt, alle referanser er funnet*/
+ }
+ }
+
+ /* Annen GINFO */
+ } else {
+ if (ledig_linje != -1) {
+ /* Funnet linje som skal flyttes opp */
+ LC_PutGi(ledig_linje,ginfo);
+ ++ledig_linje;
+ }
+ }
+ }
+
+ if (ledig_linje == -1) ledig_linje = Sys.pGrInfo->ngi + 1;
+
+ /* Legger inn referanser */
+ if (ant_ref > 0) {
+
+ /* Husk at det finnes flate i filen */
+ if ( Sys.GrId.pFil->SosiNiv[1] < 4) {
+ Sys.GrId.pFil->SosiNiv[1] = 4;
+ }
+
+ if (Sys.GrId.pFil->sSosiVer >= 220) {
+ UT_StrCopy(temp,"..REF ",LC_MAX_SOSI_LINJE_LEN);
+ cp = temp + 6;
+ } else {
+ UT_StrCopy(temp,".. ",LC_MAX_SOSI_LINJE_LEN);
+ cp = temp + 3;
+ }
+
+
+ j=0;
+ while (j < ant_ref) {
+ /* Strengen er full, skriver ut */
+ if (*ref_array != SLUTT_OY && strlen(temp) > MAX_LEN) {
+ if (ledig_linje > Sys.pGrInfo->ngi) {
+ ledig_linje = LC_AppGiL();
+ }
+ LC_PutGi(ledig_linje,temp);
+ ++ledig_linje;
+
+ if (Sys.GrId.pFil->sSosiVer >= 220) {
+ *temp = '\0';
+ cp = temp;
+ } else {
+ UT_StrCopy(temp,".. ",LC_MAX_SOSI_LINJE_LEN);
+ cp = temp + 3;
+ }
+ }
+ /* Bygg opp streng */
+ if (*ref_array == START_OY) {
+ if (! UT_IsSpace(*(cp-1))) {
+ *cp++ = ' ';
+ }
+ *cp++ = '(';
+ *cp = '\0';
+
+ } else if (*ref_array == SLUTT_OY) {
+ if (*(cp-1) == '.') {
+ *cp++ = ' ';
+ }
+ *cp++ = ')';
+ *cp = '\0';
+
+ } else { /* Referanse */
+ if (! UT_IsSpace(*(cp-1)) && *(cp-1) != '(') {
+ *cp++ = ' ';
+ *cp = '\0';
+ }
+ char szOrd[50];
+ UT_SNPRINTF(szOrd,50,":%ld",*ref_array);
+ UT_StrCat(temp,szOrd,LC_MAX_SOSI_LINJE_LEN);
+ cp = strchr(temp,'\0');
+ }
+
+ ++j;
+ ++ref_array;
+ }
+
+ if (ledig_linje > Sys.pGrInfo->ngi) { /* Skriver ut strengen */
+ ledig_linje = LC_AppGiL();
+ }
+ LC_PutGi(ledig_linje,temp);
+ ++ledig_linje;
+
+ } else {
+ Sys.pGrInfo->info &= ~((unsigned short)GI_REF);
+ Sys.pGrInfo->info &= ~((unsigned short)GI_OY_REF);
+ }
+
+ /* Sletter 1. ledige og resten */
+ LC_DelGiL(ledig_linje, (short)(Sys.pGrInfo->ngi - ledig_linje + 1));
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+JEK-920918
+CH LC_SirkelTilBuep Konverterer en "sirkel" til to BUEP
+CD ============================================================================
+CD Formål: fi
+CD Konverterer en SIRKEL/SIRKELP til to BUEP.
+CD Forutsetter at aktuell gruppe er SIRKEL eller SIRKELP.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ----------------------------------------------------------------------------
+CD short buff_retning i Buffer-retning (kun for BUE og BUEP)
+CD HENT_FORRFRA (1) = Vanlig
+CD HENT_BAKFRA (-1) = Buffer skal snues
+CD short *sfeil u Feilstatus, definert dersom ist = 0
+CD 1 = Ulovlig geometritype(ikke bue)
+CD 2 = Feil ved beregning av bueparametre
+CD short ist r Returstatus
+CD UT_TRUE = Alt OK
+CD UT_FALSE = Feil, se returvariabel sfeil
+CD
+CD Bruk:
+CD ist = LC_SirkelTilBuep(buff_retning, &as, &ns, &radius, &fi, &dfi, &sfeil )
+ ============================================================================
+*/
+/*
+SK_EntPnt_FYBA short LC_SirkelTilBuep(short antDelingspunkt,double a1,double n1,double h1,double a2,double n2,double h2,
+ short *ngi, long *nko, LC_BGR *pNyBgr)
+{
+ double as,ns,da,dn,aNy,nNy,r,fi,dfi,dfi2,fiNy;
+ short gnavn,ngi;
+ long nko;
+ unsigned short info;
+ double fi1,a_ny=0.0,n_ny=0.0;
+ long lGmlSnr,lNyttSnr;
+ short sGiLinje;
+ short sfeil;
+
+
+ if (Sys.pGrInfo->gnavn != L_SIRKEL && Sys.pGrInfo->gnavn != L_SIRKELP)
+ return UT_FALSE; // ==> Ikke sirkel
+
+ lGmlSnr = LC_GetSn();
+ LC_GetBuePar(LC_MED_DIG,&as,&ns,&r,&fi,&dfi,&sfeil);
+
+ LC_PutGi(1,".BUEP");
+
+ sGiLinje = 2;
+ if (LC_GetGP("..RADIUS", &sGiLinje, ngi)) ngi = LC_DelGiL(sGiLinje,1);
+
+ // Sikrer at det er tre koordinater i gruppen
+ if (nko > 3) nko = LC_DelKoL(4,nko-3);
+ else if (nko < 3) nko = LC_InsKoL(nko+1,3-nko);
+
+ // Hvis det er bare ett nytt punkt deles sirkelen i to halvsirkler
+ if (antDelingspunkt == 1)
+ {
+ // Beregner et nytt "fiktivt" punkt på motsatt side av sirkelen
+ da = a1 - as;
+ dn = n1 - ns;
+ a2 = as - da;
+ n2 = ns - dn;
+ h2 = HOYDE_MANGLER;
+
+ }
+ else if (antDelingspunkt != 2)
+ {
+ // Ikke gitt noe delingspunkt
+ if (Sys.pGrInfo->gnavn == L_SIRKEL)
+ {
+ a1 = as - r;
+ n1 = n2 = ns;
+ a2 = as + r;
+ h1 = h2 = LC_GetTH(1);
+ }
+ else // L_SIRKELP
+ {
+ LC_GetTK(1,&a1,&n1);
+ h1 = LC_GetTH(1);
+
+
+ }
+
+ a1 = as - r;
+ n1 = n2 = ns;
+ a2 = as + r;
+ h1 = h2 = HOYDE_MANGLER;
+ }
+
+ LC_PutTK(1,a1,n1);
+ LC_PutKp(1,kpdiv.kpnr);
+ if (AntPkt > 1) LC_PutTH(1,h1);
+ GH_DrawMarks(pGA,1,&a1,&n1,FALSE);
+
+ LC_PutTK(3,a2,n2);
+ LC_PutKp(3,kpdiv.kpnr);
+ if (AntPkt > 1) {
+ LC_PutTH(3,h2);
+ GH_DrawMarks(pGA,1,&a2,&n2,FALSE);
+ }
+
+ // Åpningsvinkel for buen fra P1 til P2
+ fi1 = GM_retning(as,ns,a1,n1);
+ GM_PktBue(as,ns,fi1,dfi,a2,n2,&dfi2);
+
+ // Beregner et nytt punkt midt på buen fra P1 til P2
+ fiNy = fi1 + (dfi2 / 2.0);
+ aNy = as + fabs(r)*cos(fiNy);
+ nNy = ns + fabs(r)*sin(fiNy);
+
+ // OBS! Bør legge inn sjekk mot at punktet faller sammen med noen av de andre punktene
+
+ LC_PutTK(2,aNy,nNy);
+ if (AntPkt > 1) {
+ if (h1 != HOYDE_MANGLER && h2 != HOYDE_MANGLER) LC_PutTH(2,(h1+h2)/2.0);
+ }
+
+ LC_WxGr(SKRIV_OPTIMALT);
+
+ // ----- Oppretter og tilpasser den andre delen
+ LC_NyGr(pBgr->pFil,".BUEP",&cur.bgr,&lNyttSnr);
+ gnavn = LC_CopyGr(pBgr,OPPDATER_NGIS,&ngi,&nko,&info);
+
+ LC_PutTK(1,a2,n2);
+ LC_PutKp(1,kpdiv.kpnr);
+ if (AntPkt > 1) LC_PutTH(1,h1);
+
+ LC_PutTK(3,a1,n1);
+ LC_PutKp(3,kpdiv.kpnr);
+ if (AntPkt > 1) LC_PutTH(3,h2);
+
+ // Beregner et nytt punkt på motsatt side av sirkelen av midtpunktet i den andre halvparten av sirkelen
+ da = aNy - as;
+ dn = nNy - ns;
+ aNy = as - da;
+ nNy = ns - dn;
+
+ LC_PutTK(2,aNy,nNy);
+ if (AntPkt > 1) {
+ if (h1 != HOYDE_MANGLER && h2 != HOYDE_MANGLER) LC_PutTH(2,(h1+h2)/2.0);
+ }
+
+ LC_WxGr(SKRIV_OPTIMALT);
+
+ cur.gnavn = LC_RxGr(&cur.bgr,LES_OPTIMALT,&cur.ngi,&cur.nko,&cur.info);
+ TegnGruppe(pGA,T_KOMFIL,VIS_FARGE,1,cur.nko);
+
+ if (Utvalg.bPaa) LC_SetBt(&cur.bgr,UTVALG_1);
+ LC_SetBt(&cur.bgr,TMP_TOT_SK);
+ LC_SetBt(&cur.bgr,TOT_SK);
+ LC_SetBt(&cur.bgr,KLADD1);
+
+ OppdaterReferanser(pBgr->pFil,a1,n1,lGmlSnr,lNyttSnr);
+
+ return UT_TRUE;
+}
+*/
+
+
+
+/*
+JEK-920918
+CH LC_GetBuePar Beregner parametre som definerer sirkelbue
+CD ============================================================================
+CD Formål: fi
+CD Sirkelbue defineres i SOSI ved en av /
+CD geometrielementene .SIRKEL, .SIRKELP, /
+CD .BUE, .BUEP. / \
+CD Denne rutina regner om til en intern as, ns * -radius- ) dfi
+CD bueangivelse med sirkelsentrum, radius \ /
+CD og retning til buens startpunkt samt \
+CD delta for sluttpunktet uansett hvordan \
+CD buen er definert i SOSI.
+CD
+CD NB! Alle retninger i radianer, 0-retning i øst-aksen og positiv
+CD omløpsretning mot urviseren.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD ----------------------------------------------------------------------------
+CD short buff_retning i Buffer-retning (kun for BUE og BUEP)
+CD HENT_FORRFRA (1) = Vanlig
+CD HENT_BAKFRA (-1) = Buffer skal snues
+CD double *as u Øst-koordinat sentrum sirkelbue
+CD double *an u Nord-koordinat sentrum sirkelbue
+CD double *radius u Radius i sirkelbue.
+CD double *fi u Retningsvinkel sentrum -> startpunkt bue
+CD double *dfi u Vinkel mellom fi og sentrum -> sluttpunkt bue
+CD dfi > 0 = Positiv omløpsretning(mot klokka)
+CD dfi < 0 = Negativ omløpsretning(med klokka)
+CD short *sfeil u Feilstatus, definert dersom ist = 0
+CD 1 = Ulovlig geometritype(ikke bue)
+CD 2 = Feil ved beregning av bueparametre
+CD short ist r Returstatus
+CD UT_TRUE = Alt OK
+CD UT_FALSE = Feil, se returvariabel sfeil
+CD
+CD Bruk:
+CD ist = LC_GetBuePar(buff_retning, &as, &ns, &radius, &fi, &dfi, &sfeil )
+ ============================================================================
+*/
+SK_EntPnt_FYBA short LC_GetBuePar(short buff_retning, double *as, double *ns, double *radius,
+ double *fi, double *dfi, short *sfeil)
+{
+ short ist;
+ short storbue;
+ double a,n,a2,n2,a3,n3;
+
+
+ *sfeil = 0;
+ ist = UT_FALSE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* ----- Sjekker geometritype og henter parametre for buen */
+
+ if (Sys.pGrInfo->gnavn == L_BUE) { /* .BUE */
+ if (LC_GetBue(buff_retning,&a,&n,&a2,&n2,&(*radius),&storbue)){
+ if (GM_KonvBue(a,n,a2,n2,*radius,storbue,&(*as),&(*ns),&(*fi),&(*dfi))){
+ ist = UT_TRUE;
+ } else {
+ *sfeil=2;
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\" - mer enn 2*radius mellom endepunktene\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+ }
+
+ } else if (Sys.pGrInfo->gnavn == L_BUEP) { /* .BUEP */
+ if (LC_GetBuep(buff_retning,&a,&n,&a2,&n2,&a3,&n3)) {
+ if (GM_KonvBuep(a,n,a2,n2,a3,n3,&(*as),&(*ns),&(*radius),&(*fi),&(*dfi))){
+ ist = UT_TRUE;
+ } else {
+ *sfeil = 2;
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\" - punktene ligger på rett linje\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+ }
+
+ } else if (Sys.pGrInfo->gnavn == L_SIRKEL) { /* .SIRKEL */
+ if (LC_GetSirkel(&(*as),&(*ns),&(*radius))) {
+ if(GM_KonvSirkel(&(*fi),&(*dfi))) {
+ ist = UT_TRUE;
+ } else {
+ *sfeil = 2;
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\"\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+ }
+
+ } else if (Sys.pGrInfo->gnavn == L_SIRKELP) { /* .SIRKELP */
+ if (LC_GetSirkelp(&a,&n,&a2,&n2,&a3,&n3)) {
+ if (GM_KonvSirkelp(a,n,a2,n2,a3,n3,&(*as),&(*ns),&(*radius),&(*fi),&(*dfi))){
+ ist = UT_TRUE;
+ } else {
+ *sfeil = 2;
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\"\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+ }
+
+ } else { /* Feil geometritype */
+ *sfeil = 1;
+ }
+
+ if (ist == UT_TRUE) {
+ *radius = fabs(*radius);
+ }
+
+ } else { /* Feil geometritype (ingen aktuell gruppe) */
+ *sfeil = 1;
+ }
+
+ return ist;
+}
+
+
+/*
+AR-890824
+CH LC_GetBue Hent bue
+CD ==========================================================================
+CD Formål:
+CD Henter ut nødvendige opplysninger om en bue.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short retning i Buffer-retning:
+CD HENT_FORRFRA ( 1) = vanlig,
+CD HENT_BAKFRA (-1) = buffer skal snues.
+CD double *a1 u Koordinat i første punkt
+CD double *n1 u
+CD double *a2 u Koordinat i siste punkt
+CD double *n2 u
+CD double *radius u Radius
+CD short *storbue u 0=vanlig bue, 1=storbue
+CD short ist r status: UT_TRUE = OK,
+CD UT_FALSE = feil (Gruppen er ikke OK bue)
+CD
+CD Bruk:
+CD ist = LC_GetBue(retning,&a1,&n1,&a2,&n2,&radius,&storbue);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetBue(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *radius,short *storbue)
+{
+ short gilin;
+ char *gp;
+ short ist = UT_FALSE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_BUE && Sys.pGrInfo->nko > 1) {
+ /* Hent koordinater */
+ if (retning == HENT_FORRFRA) {
+ LC_GetTK(1,a1,n1);
+ LC_GetTK(Sys.pGrInfo->nko,a2,n2);
+ } else {
+ LC_GetTK(Sys.pGrInfo->nko,a1,n1);
+ LC_GetTK(1,a2,n2);
+ }
+
+ /* Finn radius og storbue */
+ gilin = 2;
+ if ((gp = LC_GetGP("..RADIUS",&gilin,Sys.pGrInfo->ngi)) != NULL) {
+ *radius = strtod(gp,&gp);
+ if (retning == HENT_BAKFRA) *radius = - *radius;
+ gilin = 2;
+ if ((gp = LC_GetGP("..STORBUE",&gilin,Sys.pGrInfo->ngi)) != NULL) {
+ *storbue = (short)strtol(gp,&gp,10);
+ } else {
+ *storbue = 0;
+ }
+ ist = UT_TRUE; /* Buen er OK */
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\" - mangler ..RADIUS\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\" - for få koordinater\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+ }
+
+ return ist;
+}
+
+
+/*
+AR-911029
+CH LC_GetBuep Hent buep
+CD ==========================================================================
+CD Formål:
+CD Henter ut nødvendige opplysninger om en buep.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short retning i Buffer-retning:
+CD HENT_FORRFRA ( 1) = vanlig,
+CD HENT_BAKFRA (-1) = buffer skal snues.
+CD double *a1 u Koordinat i første punkt
+CD double *n1 u
+CD double *a2 u Koordinat i midtre punkt
+CD double *n2 u
+CD double *a3 u Koordinat i siste punkt
+CD double *n3 u
+CD short ist r status: UT_TRUE = OK,
+CD UT_FALSE = feil (Gruppen er ikke OK buep)
+CD
+CD Bruk:
+CD ist = LC_GetBuep(retning,&a1,&n1,&a2,&n2,&a3,&n3);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetBuep(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3)
+{
+ short ist = UT_FALSE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_BUEP && Sys.pGrInfo->nko > 2) {
+ /* Hent koordinater */
+ LC_GetTK((1+Sys.pGrInfo->nko)/2, a2, n2);
+ if (retning == HENT_FORRFRA) {
+ LC_GetTK(1,a1,n1);
+ LC_GetTK(Sys.pGrInfo->nko,a3,n3);
+ } else {
+ LC_GetTK(1,a3,n3);
+ LC_GetTK(Sys.pGrInfo->nko,a1,n1);
+ }
+
+ ist = UT_TRUE; /* Buen er OK */
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\" - for få koordinater\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+ }
+
+ return ist;
+}
+
+
+/*
+AR-911029
+CH LC_GetSirkel Hent silkel
+CD ==========================================================================
+CD Formål:
+CD Henter ut nødvendige opplysninger om en sirkel.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double *as u Koordinat i sentrum
+CD double *ns u
+CD double *radius u Radius
+CD short ist r status: UT_TRUE = OK,
+CD UT_FALSE = Feil (Gruppen er ikke OK sirkel)
+CD
+CD Bruk:
+CD ist = LC_GetSirkel(&as,&ns,&radius);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetSirkel(double *as,double *ns,double *radius)
+{
+ short gilin;
+ char *gp;
+ short ist = UT_FALSE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_SIRKEL && Sys.pGrInfo->nko > 0) {
+ /* Hent koordinater */
+ LC_GetTK(1,as,ns);
+
+ /* Finn radius */
+ gilin = 2;
+ if ((gp = LC_GetGP("..RADIUS",&gilin,Sys.pGrInfo->ngi)) != NULL) {
+ *radius = strtod(gp,&gp);
+ ist = UT_TRUE; /* Sirkelen er OK */
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\" - mangler ..RADIUS\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\" - mangler koordinat\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+ }
+
+ return ist;
+}
+
+
+/*
+AR-911029
+CH LC_GetSirkelp Hent silkelp
+CD ==========================================================================
+CD Formål:
+CD Henter ut nødvendige opplysninger om en sirkelp.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double *a1 u Koordinat i P1
+CD double *n1 u
+CD double *a2 u Koordinat i P2
+CD double *n2 u
+CD double *a3 u Koordinat i P3
+CD double *n3 u
+CD short ist r status: UT_TRUE = OK,
+CD UT_FALSE = Feil (Gruppen er ikke OK sirkelp)
+CD
+CD Bruk:
+CD ist = LC_GetSirkelp(&a1,&n1,&a2,&n2,&a3,&n3);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetSirkelp(double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3)
+{
+ short ist = UT_FALSE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (Sys.pGrInfo->gnavn == L_SIRKELP && Sys.pGrInfo->nko > 2) {
+ /* Hent koordinater */
+ LC_GetTK(1,a1,n1);
+ LC_GetTK((1+Sys.pGrInfo->nko)/2, a2, n2);
+ LC_GetTK(Sys.pGrInfo->nko,a3,n3);
+
+ ist = UT_TRUE; /* Buen er OK */
+
+ } else {
+ UT_FPRINTF(stderr,"Ulovlig bue: \"%s : %s\" - for få koordinater\n",Sys.GrId.pFil->pszNavn,LX_GetGi(1));
+ Sys.GrId.pFil->usDataFeil |= LC_DATAFEIL_BUE;
+ }
+ }
+
+ return ist;
+}
+
+
+/*
+OJ-891126
+CH LC_GetCurEnhet Hent enhet på angitt nivå
+CD ==========================================================================
+CD Formål:
+CD Henter ut enhet fra filhode eller GINFO
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM * pFil i Peker til FilAdm
+CD short *nivaa iu angir nivå for henting, returnerer aktuelt nivå
+CD 1 = filhode
+CD 2 = GINFO
+CD double *enhet u Aktuell enhet
+CD double *enhet_h u Aktuell enhet-H
+CD double *enhet_d u Aktuell enhet-D
+CD
+CD Bruk:
+CD LC_GetCurEnhet(pFil,&nivaa,&enhet,&enhet_h,&enhet_d);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_GetCurEnhet(LC_FILADM * pFil,short *nivaa, double *enhet,
+ double *enhet_h, double *enhet_d)
+{
+ LO_TestFilpeker(pFil,"GetCurEnhet");
+
+ *enhet = pFil->TransPar.dEnhet;
+ *enhet_h = pFil->TransPar.dEnhet_h;
+ *enhet_d = pFil->TransPar.dEnhet_d;
+
+ /* Enhet fra GINFO */
+ if (*nivaa == 2)
+ {
+ short lin = 2;
+ char *para;
+ double enhet_temp;
+
+ para = LC_GetGP("..ENHET",&lin,Sys.pGrInfo->ngi);
+ if (para == NULL) {
+ *nivaa = 1;
+ } else {
+ UT_AtoD(para,'.',&enhet_temp);
+ if (enhet_temp > LC_ACCY) *enhet = enhet_temp;
+ }
+
+ lin=2;
+ para = LC_GetGP("...ENHET-H",&lin,Sys.pGrInfo->ngi);
+ if (para != NULL) {
+ UT_AtoD(para,'.',&enhet_temp);
+ if (enhet_temp > LC_ACCY) *enhet_h = enhet_temp;
+ }
+
+ lin=2;
+ para = LC_GetGP("...ENHET-D",&lin,Sys.pGrInfo->ngi);
+ if (para != NULL) {
+ UT_AtoD(para,'.',&enhet_temp);
+ if (enhet_temp > LC_ACCY) *enhet_d = enhet_temp;
+ }
+ }
+}
+
+
+/*
+AR-890515
+CH LC_UpdateGiEnhet Oppdater ..ENHET i GINFO
+CD ==========================================================================
+CD Formål:
+CD Setter koordinat-enhet for gruppen.
+CD Oppdaterer ..ENHET / ..ENHET-H / ..ENHET-D i GINFO.
+CD Rutinen handterer selv tildeling eller sletting av GINFO-linje.
+CD Hvis verdien er lik filhodets verdi blir det ikke lagt inn verdi i GINFO.
+CD Enhet = 0.0 = bruk filhodets enhet, og fører til at det ikke legges inn
+CD i GINFO. Eventuell eksisterende linje jgernes.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM * pFil i Peker til FilAdm
+CD double enhet i Grunnriss-enhet
+CD double enhet_h i Høyde-enhet
+CD double enhet_d i Dybde-enhet
+CD ngi short r Antall GINFO-linjer etter oppdatering
+CD
+CD Bruk:
+CD ngi = LC_UpdateGiEnhet(pFil,enhet,enhet_h,enhet_d);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_UpdateGiEnhet(LC_FILADM *pFil,double enhet,double enhet_h,double enhet_d)
+{
+ short linje;
+ char tx[80];
+
+ LO_TestFilpeker(pFil,"UpdateGiEnhet");
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ // ----- ..ENHET
+ linje = 2;
+
+ // Ikke spesiell ..ENHET
+ if (fabs(enhet - pFil->TransPar.dEnhet) < LC_ACCY || fabs(enhet) < LC_ACCY)
+ {
+ if (LC_GetGP("..ENHET",&linje,Sys.pGrInfo->ngi) != NULL)
+ {
+ LC_DelGiL(linje,1); /* Funnet, fjern linjen */
+ }
+ }
+
+ // Spesiell ..ENHET
+ else
+ {
+ if (LC_GetGP("..ENHET",&linje,Sys.pGrInfo->ngi) == NULL)
+ {
+ linje = LC_AppGiL(); /* Ikke funnet, tildel ny linje */
+ }
+ LC_PutGi(linje,LB_FormaterEnhet(tx,80,"..ENHET",enhet));
+ }
+
+ // ----- ..ENHET-H
+ linje = 2;
+
+ // Ikke spesiell ..ENHET-H
+ if (fabs(enhet_h - pFil->TransPar.dEnhet_h) < LC_ACCY || fabs(enhet_h) < LC_ACCY)
+ {
+ if (LC_GetGP("..ENHET-H",&linje,Sys.pGrInfo->ngi) != NULL)
+ {
+ LC_DelGiL(linje,1); /* Funnet, fjern linjen */
+ }
+ }
+
+ // Spesiell ..ENHET-H
+ else
+ {
+ if (LC_GetGP("..ENHET-H",&linje,Sys.pGrInfo->ngi) == NULL)
+ {
+ linje = LC_AppGiL(); /* Ikke funnet, tildel ny linje */
+ }
+ LC_PutGi(linje,LB_FormaterEnhet(tx,80,"..ENHET-H",enhet_h));
+ }
+
+ // ----- ..ENHET-D
+ linje = 2;
+
+ // Ikke spesiell ..ENHET-D
+ if (fabs(enhet_d - pFil->TransPar.dEnhet_d) < LC_ACCY || fabs(enhet_d) < LC_ACCY)
+ {
+ if (LC_GetGP("..ENHET-D",&linje,Sys.pGrInfo->ngi) != NULL)
+ {
+ LC_DelGiL(linje,1); /* Funnet, fjern linjen */
+ }
+ }
+
+ // Spesiell ..ENHET-D
+ else
+ {
+ if (LC_GetGP("..ENHET-D",&linje,Sys.pGrInfo->ngi) == NULL)
+ {
+ linje = LC_AppGiL(); /* Ikke funnet, tildel ny linje */
+ }
+ LC_PutGi(linje,LB_FormaterEnhet(tx,80,"..ENHET-D",enhet_d));
+ }
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+OJ-891123
+CH LC_GetKvalitet Finner kvalitetsopplysninger
+CD ==========================================================================
+CD Formål:
+CD Finne kvalitetsopplysninger i filhode eller vanlig gruppe.
+CD (Tolker aktuell gruppe.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short *psMetode u Hvordan data er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD KVAL_MET_STD standard metode fra nivå over.
+CD long *pLNnoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD KVAL_NOY_STD standard nøyaktighet fra nivå over
+CD short *psSynbarhet u Synbarhet i bilde
+CD KVAL_SYN_UNDEF synbarhet er udefinert.
+CD KVAL_SYN_STD standard metode fra nivå over.
+CD short *psHoydeMetode u Hvordan høyden er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD KVAL_MET_STD standard metode fra nivå over.
+CD long *plHoydeNoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD KVAL_NOY_STD standard nøyaktighet fra nivå over
+CD short ist r Status: UT_TRUE = OK, ..KVALITET er funnet
+CD UT_FALSE = ikke funnet
+CD
+CD Bruk:
+CD ist = LC_GetKvalitet(&sMetode,&lNoyaktighet,&sSynbarhet,
+CD &sHoydeMetode,&lHoydeNoyaktighet);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetKvalitet(short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet)
+{
+ short lin;
+ char *cp;
+ short ist = UT_FALSE;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ lin=2;
+ /* Søk i GINFO */
+ if ((cp = LC_GetGP("..KVALITET",&lin,Sys.pGrInfo->ngi)) != NULL) {
+ ist = UT_TRUE;
+ }
+
+ LN_TolkKvalitet(cp,psMetode,plNoyaktighet,psSynbarhet,
+ psHoydeMetode,plHoydeNoyaktighet);
+ }
+
+ return ist;
+}
+
+
+/*
+OJ-900103
+CH LC_GetCurKvalitet Finner kvalitetsopplysninger på angitt nivå
+CD ==========================================================================
+CD Formål:
+CD Finne kvalitetsopplysninger på angitt nivå, hode ginfo eller pinfo.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM * pFil i Peker til FilAdm
+CD short *nivaa iu Hvor skal det letes.
+CD 0 = ikke funnet
+CD 1 = hode
+CD 2 = ginfo
+CD 3 = pinfo
+CD Returnerer aktuelt nivå.
+CD long pnr i punktnr. ved spørring på pinfo
+CD short *psMetode u Hvordan data er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD long *pLNnoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD short *psSynbarhet u Synbarhet i bilde
+CD KVAL_SYN_UNDEF synbarhet er udefinert.
+CD short *psHoydeMetode u Hvordan høyden er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD long *plHoydeNoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD short ist r Statusvariabel:
+CD UT_TRUE = OK, KVALITET er funnet
+CD UT_FALSE = KVALITET er ikke funnet
+CD
+CD Bruk:
+CD ist = LC_GetCurKvalitet(pFil,&nivaa,pnr,&sMetode,&lNoyaktighet,
+CD &sSynbarhet,&sHoydeMetode,&lHoydeNoyaktighet);
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetCurKvalitet(LC_FILADM *pFil,short *nivaa,long pnr,
+ short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet)
+{
+ short lin;
+ char *cp;
+ short sMetode, sHoydeMetode, sSynbarhet;
+ long lNoyaktighet, lHoydeNoyaktighet;
+ LC_GETPP_STATUS pp_stat;
+ short sFunnetNivaa = 0;
+
+ short sStatus = UT_FALSE;
+
+ LO_TestFilpeker(pFil,"GetCurKvalitet");
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ *psMetode = KVAL_MET_STD;
+ *plNoyaktighet = KVAL_NOY_STD;
+ *psSynbarhet = KVAL_SYN_STD;
+ *psHoydeMetode = KVAL_MET_STD;
+ *plHoydeNoyaktighet = KVAL_NOY_STD;
+
+
+ /* Søk i PINFO */
+ if (*nivaa == 3) {
+ LC_InitPP("...KVALITET",pnr,pnr,&pp_stat);
+ if ((cp = LC_GetPP(&pnr,&pp_stat)) != NULL) {
+ LN_TolkKvalitet(cp,psMetode,plNoyaktighet,psSynbarhet,
+ psHoydeMetode,plHoydeNoyaktighet);
+ sStatus = UT_TRUE;
+ sFunnetNivaa = 3;
+ }
+ }
+
+ /* Søk i GINFO */
+ if (*nivaa >= 2) {
+ lin=2;
+ if ((cp = LC_GetGP("..KVALITET",&lin,Sys.pGrInfo->ngi)) != NULL){ /* Kvalitet */
+ LN_TolkKvalitet(cp,&sMetode,&lNoyaktighet,&sSynbarhet,
+ &sHoydeMetode,&lHoydeNoyaktighet);
+
+ /* Oppdater med kvalitet fra GINFO */
+ if (*psMetode == KVAL_MET_STD) *psMetode = sMetode;
+ if (*plNoyaktighet == KVAL_NOY_STD) *plNoyaktighet = lNoyaktighet;
+ if (*psSynbarhet == KVAL_SYN_STD) *psSynbarhet = sSynbarhet;
+ if (*psHoydeMetode == KVAL_MET_STD) *psHoydeMetode = sHoydeMetode;
+ if (*plHoydeNoyaktighet == KVAL_NOY_STD) *plHoydeNoyaktighet = lHoydeNoyaktighet;
+
+ sStatus = UT_TRUE;
+ if (sFunnetNivaa == 0) sFunnetNivaa = 2;
+ }
+ }
+
+ /* Hent fra hodet */
+ /* Oppdater med kvalitet fra HODE */
+ if (*psMetode == KVAL_MET_STD) *psMetode = pFil->Kvalitet.sMetode;
+ if (*plNoyaktighet == KVAL_NOY_STD) *plNoyaktighet = pFil->Kvalitet.lNoyaktighet;
+ if (*psSynbarhet == KVAL_SYN_STD) *psSynbarhet = pFil->Kvalitet.sSynbarhet;
+ if (*psHoydeMetode == KVAL_MET_STD) *psHoydeMetode = pFil->Kvalitet.sHoydeMetode;
+ if (*plHoydeNoyaktighet == KVAL_NOY_STD) *plHoydeNoyaktighet = pFil->Kvalitet.lHoydeNoyaktighet;
+
+ /* Handter eventuell standardverdi */
+ if (*psMetode == KVAL_MET_STD) *psMetode = KVAL_MET_UNDEF;
+ if (*plNoyaktighet == KVAL_NOY_STD) *plNoyaktighet = KVAL_NOY_UKJENT;
+ if (*psSynbarhet == KVAL_SYN_STD) *psSynbarhet = KVAL_SYN_GOD;
+ if (*psHoydeMetode == KVAL_MET_STD) *psHoydeMetode = KVAL_MET_UNDEF;
+ if (*plHoydeNoyaktighet == KVAL_NOY_STD) *plHoydeNoyaktighet = KVAL_NOY_UKJENT;
+
+ if (*psMetode != KVAL_MET_UNDEF ||
+ *plNoyaktighet != KVAL_NOY_UKJENT ||
+ *psSynbarhet != KVAL_SYN_GOD ||
+ *psHoydeMetode != KVAL_MET_UNDEF ||
+ *plHoydeNoyaktighet != KVAL_NOY_UKJENT ) {
+
+ sStatus = UT_TRUE;
+ if (sFunnetNivaa == 0) sFunnetNivaa = 1;
+ }
+ }
+
+ *nivaa = sFunnetNivaa;
+
+ return sStatus;
+}
+
+
+/*
+CH OJ-891205
+CH LC_UpdateGiKvalitet Oppdaterer ..KVALITET i Ginfo
+CD ==========================================================================
+CD Formål:
+CD Oppdaterer GINFO med ..KVALITET
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD Parametre:
+CD LC_FILADM *pFil i Peker til FilAdm for sosifil kvalitet skal
+CD testes mot.
+CD short sMetode i Metode i ..KVALITET
+CD long lNoyaktighet i Nøyaktighet i ..KVALITET
+CD short sSynbarhet i Synbarhet i ..KVALITET
+CD short sHoydeMetode i HøydeMetode i ..KVALITET
+CD long lHoydeNoyaktighet i HøydeNøyaktighet i ..KVALITET
+CD short ngi r Antall linjer i ginfo.
+CD
+CD Bruk:
+CD ngi = LC_UpdateGiKvalitet(pFil,sMetode,lNoyaktighet,sSynbarhet,
+CD sHoydeMetode,lHoydeNoyaktighet);
+CD
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_UpdateGiKvalitet(LC_FILADM *pFil,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet)
+{
+ // Endret slik at ..KVALITET blir skrevet ut til gruppen bare hvis den er
+ // forskjellig fra kvalitet i filhodet.
+ // Fjerner aldri eksisterende kvalitet fra GINFO.
+
+ short ho_metode,ho_hmetode,ho_synbarhet;
+ long ho_noyaktighet,ho_hnoyaktighet;
+ short linje_nr,nivaa;
+ short pnr = 1;
+ short ngi = Sys.pGrInfo->ngi;
+
+
+ LO_TestFilpeker(pFil,"UpdateGiKvalitet");
+
+ // Hent kvalitet fra hode
+ nivaa = 1;
+ LC_GetCurKvalitet(pFil,&nivaa,pnr,&ho_metode,&ho_noyaktighet,
+ &ho_synbarhet,&ho_hmetode,&ho_hnoyaktighet);
+
+ // Hvis ulik kvalitet i gruppen og filhodet
+ if ((sMetode != ho_metode) ||
+ (lNoyaktighet != ho_noyaktighet) ||
+ (sSynbarhet != ho_synbarhet) ||
+ (sHoydeMetode != ho_hmetode) ||
+ (lHoydeNoyaktighet != ho_hnoyaktighet))
+ {
+ // Formatterer strengen og oppdater GINFO
+ ngi = LC_PutGP("..KVALITET",
+ LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,
+ sHoydeMetode,lHoydeNoyaktighet),&linje_nr);
+ }
+
+ //else
+ //{
+ // // Samme kvalitet som i filhodet, fjern eventuell GI-linje
+ // linje_nr = 2;
+ // if (LC_GetGP("..KVALITET",&linje_nr,ngi) != NULL) {
+ // ngi = LC_DelGiL(linje_nr,1);
+ // }
+ //}
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+OJ-891208
+AR-920312
+CH LC_UpdatePiKvalitet Oppdaterer ...KVALITET i Pinfo
+CD ==========================================================================
+CD Formål:
+CD Oppdaterer PINFO med ...KVALITET
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM * pFil i Peker til FilAdm for sosifil kvalitet
+CD skal testes mot.
+CD long pnr i Punktnummer som skal oppdateres.
+CD short sMetode i Metode i ..KVALITET
+CD long lNoyaktighet i Nøyaktighet i ..KVALITET
+CD short sSynbarhet i Synbarhet i ..KVALITET
+CD short sHoydeMetode i HøydeMetode i ..KVALITET
+CD long lHoydeNoyaktighet i HøydeNøyaktighet i ..KVALITET
+CD short sStatus r UT_TRUE = OK,
+CD UT_FALSE = ikke utført (for lite plass tilgjengelig)
+CD
+CD Bruk:
+CD sStatus = LC_UpdatePiKvalitet(pFil,pnr,sMetode,lNoyaktighet,sSynbarhet,
+CD sHoydeMetode,lHoydeNoyaktighet)
+CD ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_UpdatePiKvalitet(LC_FILADM *pFil,long pnr,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet)
+{
+ char temp[LC_MAX_SOSI_LINJE_LEN],*pp,*neste,*cp;
+ short nivaa;
+ short gi_metode,gi_hmetode,gi_synbarhet;
+ long gi_noyaktighet,gi_hnoyaktighet;
+
+ LO_TestFilpeker(pFil,"UpdatePiKvalitet");
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ /* Fjern eksisterende KVALITET fra PINFO */
+ pp = LC_GetPi(pnr);
+ if ((neste = strstr(pp,"...KVALITET")) != NULL) { /* Finn SOSI-navnet */
+ cp = neste - 1; /* Avslutt første del av pinfo */
+ while (UT_IsSpace(*cp) && cp >= pp) {
+ cp--;
+ }
+ *(cp+1) = '\0';
+ UT_StrCopy(temp,pp,LC_MAX_SOSI_LINJE_LEN);
+
+ /* Hopp over KVALITETen */
+ if ((cp = strstr(neste+3,"...")) != NULL) { /* Neste SOSI-navn */
+ /* Heng på resten av den gamle PINFOen */
+ if (*temp) UT_StrCat(temp," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(temp,cp,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ /* KVALITET er ikke funnet, ta vare på hele strengen */
+ } else {
+ UT_StrCopy(temp,pp,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ /* Hent kvalitet fra ginfo/hode */
+ nivaa = 2;
+ LC_GetCurKvalitet(pFil,&nivaa,pnr,&gi_metode,&gi_noyaktighet,
+ &gi_synbarhet,&gi_hmetode,&gi_hnoyaktighet);
+
+ /* Hvis Kvaliteten avviker fra ginfo/hode, heng den på PINFO */ /* Legg inn endringen */
+ if (sMetode != gi_metode ||
+ lNoyaktighet != gi_noyaktighet ||
+ sSynbarhet != gi_synbarhet ||
+ sHoydeMetode != gi_hmetode ||
+ lHoydeNoyaktighet != gi_hnoyaktighet ) {
+
+ if (*temp) UT_StrCat(temp," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(temp,"...KVALITET ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(temp,LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,sHoydeMetode,lHoydeNoyaktighet),
+ LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ if(strlen(temp) > LC_MAX_SOSI_LINJE_LEN) {
+ LC_Error(131,"(LC_UpdatePiKvalitet)",temp);
+ }
+
+ /* Lagre strengen */
+ return LC_PutPi(pnr,temp);
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-930609
+CH LC_GetGP Get GINFO-parameter
+CD ==========================================================================
+CD Formål:
+CD Henter parametrene til et SOSI-navn.
+CD Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+CD
+CD Leddnummer, delstreng,skilletegn og formateringskode kan inngå som
+CD forlengelse av SOSI-navnet.
+CD
+CD Leddnummer for flerleddet parameter angis ved #n.
+CD Eks: ..GID#2 er bruksnummer.
+CD
+CD Delstreng angis ved: [start:slutt].
+CD NB! 1 er første tegn.
+CD Sluttposisjon 0 betyr at resten av strengen skal brukes.
+CD Eks: ..STRENG[2:0] Posisjon 2 og resten av strengen.
+CD
+CD Skilletegn for flerleddet GINFO. Dette angis ved ^x hvor x er det tegnet
+CD som skal skrives ut mellom leddene.
+CD
+CD Formateringskode. Dette brukes for å angi plassering av komma og antall
+CD desimaler i desimaltall.
+CD Eks: ..AREAL%-3.2 Betyr at ..AREAL fra GINFO skal formateres slik:
+CD Komma flyttes 3 posisjoner til venstre (divisjon med tusen) og resultatet
+CD presenteres avrundet til 2 desimaler.
+CD
+CD Eks: ..DYBDE£-1.2 Betyr at ..DYBDE fra GINFO skal formateres slik:
+CD Komma flyttes 1 posisjon til venstre (divisjon med ti) og resultatet
+CD presenteres med 2 desimaler uten avrunding. Spesielt for dybdeverdier.
+CD
+CD Disse tilleggene kan kombineres, slik at ..GID#2[1:2] betyr at det er
+CD tegn nummer 1 og 2 i det andre leddet (bruksnumret) som skal brukes.
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char sosi_navn i SOSI-navn det skal finnes verdi til.
+CD Leddnummer, posisjon, skilletegn
+CD og formateringskode kan inngå
+CD som forlengelse av navnet.
+CD OBS! Store og små bokstaver er signifikante.
+CD
+CD short *forste_linje iu GINFO-linjenummer for start søking
+CD (1 er første linje i GINFO.)
+CD Ved tilslag returneres linjenummer for tilslaget.
+CD short siste_linje i Siste GINFO-linje det skal søkes i.
+CD char *para_peker r Peker til parameter-streng avslutta med '\0'.
+CD Hvis SOSI-navnet ikke er funnet returneres NULL.
+CD
+CD Bruk:
+CD para_peker = LC_GetGP(sosi_navn,&forste_linje,siste_linje);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA char *LC_GetGP(const char *sosi_navn,short *forste_linje,short siste_linje)
+{
+ short gi_lin,sAntallBlank,sSosiLen,sFortegn,s;
+ char *ginfo,*cp,*nt,*cs,szSosiNavn[LC_MAX_SOSINAVN_LEN];
+ double d;
+ char cSkilleTegn = '\0';
+ short sLedd = 0;
+ short sStart = 0;
+ short sSlutt = 0;
+ short funnet = 0;
+ short sFormater = UT_FALSE;
+ short sFlyttKomma = 0; /* Flytting av komma ( <0 flytt til venstre) */
+ short sAntDes = 2; /* Antall desimaler */
+
+ char *rp = NULL; /* Retur peker */
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Sjekk at det er lovlige linjenummer */
+ if (*forste_linje < 1) *forste_linje = 1;
+ if (siste_linje > Sys.pGrInfo->ngi) siste_linje = Sys.pGrInfo->ngi;
+
+ /* Plukk ut info om ledd, delstreng og formatering */
+ UT_StrCopy(szSosiNavn,sosi_navn,LC_MAX_SOSINAVN_LEN);
+ UT_StrUpper(szSosiNavn);
+
+ if ((cs = strpbrk(szSosiNavn,"#[^%£")) != NULL) {
+ cp = cs;
+ while (*cp != '\0') {
+ if (*cp == '#') {
+ ++cp;
+ sLedd = (short) strtol(cp,&cp,10); /* Ledd-nummer */
+ } else if (*cp == '^') {
+ ++cp;
+ cSkilleTegn = *cp; /* Skilletegn */
+ ++cp;
+ } else if (*cp == '[') {
+ ++cp;
+ sStart = (short) strtol(cp,&cp,10); /* Startposisjon */
+ ++cp;
+ sSlutt = (short) strtol(cp,&cp,10); /* Sluttposisjon */
+ } else if ((*cp == '%') || (*cp == '£')) {
+ if(*cp == '£')
+ sFormater = 2;
+ else
+ sFormater = UT_TRUE;
+ ++cp;
+ if (*cp == '-') {
+ sFortegn = -1;
+ ++cp;
+ } else {
+ sFortegn = 1;
+ }
+ if (isdigit(*cp)) sFlyttKomma = (short) strtol(cp,&cp,10); /* Flytting av komma */
+ sFlyttKomma *= sFortegn;
+ if (*cp == '.') ++cp;
+ if (isdigit(*cp)) sAntDes = (short) strtol(cp,&cp,10); /* Ant. des */
+ } else {
+ ++cp;
+ }
+ }
+ /* Fjern tilleggsinfo fra SOSI-navnet */
+ *cs = '\0';
+ }
+
+ /* Søk etter SOSI-navnet */
+ sSosiLen = (short)strlen(szSosiNavn);
+ gi_lin = *forste_linje;
+ while (gi_lin <= siste_linje) {
+ /* Les ny linje */
+ ginfo = LX_GetGi(gi_lin);
+
+ /* Er dette rett navn? */
+ if ((strncmp(ginfo,szSosiNavn,sSosiLen) == 0) &&
+ ( (UT_IsSpace(*(ginfo+sSosiLen)) || *(ginfo+sSosiLen) == '\0'))) {
+
+ /* Hopp over blanke mellom navn og verdi */
+ cp = ginfo + sSosiLen;
+ while (UT_IsSpace(*cp)) {
+ ++cp;
+ }
+ // Kopier parameter
+ UT_StrCopy(retur_str,cp,LC_MAX_SOSI_LINJE_LEN);
+ rp = retur_str;
+
+ // Har ikke ledd , funnet OK
+ if (sLedd == 0) {
+
+
+ //Fjerner hermetegn " eller ' foran
+ while (*rp == '"' || *rp == '\'')
+ ++rp;
+
+ //Finner enden av strengen
+ cp = strchr(rp+1,'\0');
+
+ //Går framover fra enden og fjerner anførselstegn
+ while (cp-- && (*cp == '"' || *cp == '\'') && cp != NULL)
+ *cp = '\0';
+
+ funnet = 1;
+ // Husk linjenummeret
+ *forste_linje = gi_lin;
+ break; // Funnet, ==> hopp ut av løkken
+
+ // Handter leddnummer
+ } else {
+ s = sLedd;
+ cs = rp+strlen(rp); // Markerer slutten av parameterstrengen
+ while(s > 0) {
+ if(s-- == sLedd) { // Første ledd leses
+ cp = UT_strtok(rp," ",&nt);
+ }
+ else { // Neste ledd leses
+ cp = UT_strtok(NULL," ",&nt);
+ }
+ if (cp != NULL) {
+ // Test på hermetegn
+ if (*cp == '"') {
+ if((cp+strlen(cp)) != cs) { // Dersom ikke slutten av parameterstrengen
+ *(cp+strlen(cp)) = ' '; // Setter tilbake space for NULL
+ }
+ rp = cp+1; // Unngår start-hermetegnet
+ cp = UT_strtok(rp,"\"",&nt); // Leser til slutt-hermetegnet eller \0
+ }
+ else if (*cp == '\'') {
+ if((cp+strlen(cp)) != cs) { // Dersom ikke slutten av parameterstrengen
+ *(cp+strlen(cp)) = ' '; // Setter tilbake space for NULL
+ }
+ rp = cp+1; // Unngår start-hermetegnet
+ cp = UT_strtok(rp,"'",&nt); // Leser til slutt-hermetegnet eller \0
+ }
+ }
+ else { // cp == NULL
+ break;
+ }
+ }
+
+ /* Leddet er funnet */
+ if (cp != NULL) {
+ /* Aktuelt ledd huskes */
+ rp = cp;
+ funnet = 1;
+ /* Husk linjenummeret */
+ *forste_linje = gi_lin;
+ break; /* Funnet, ==> hopp ut av løkken */
+
+ } else {
+ /* AR-950901 */
+ /* rp = NULL; */ /* Det aktuelle leddet finnes ikke */
+ /* Aktuellt ledd huskes */
+ rp = strchr(rp,'\0');
+ funnet = 1;
+ /* Husk linjenummeret */
+ *forste_linje = gi_lin;
+ break; /* Funnet, ==> hopp ut av l›kken */
+ }
+ }
+ }
+
+ ++gi_lin;
+ }
+
+ /* Spesialnavn */
+ if ( ! funnet && (*szSosiNavn != '.' && ((*forste_linje <= siste_linje) || (siste_linje == 1)))) {
+ /* Handter AREAL spesielt*/
+ if (strcmp(szSosiNavn,"AREAL") == 0) {
+ d = LC_BerAreal();
+ d *= pow((double)10.0,(int)sFlyttKomma);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%.*f",sAntDes,d);
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+ sFormater = UT_FALSE; /* Formatering er utført */
+
+ /* Handter LENGDE spesielt */
+ } else if (strcmp(szSosiNavn,"LENGDE") == 0) {
+ if ( ! LC_BerLengde3D(&d)){
+ d = LC_BerLengde();
+ }
+ d *= pow((double)10.0,(int)sFlyttKomma);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%.*f",sAntDes,d);
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+ sFormater = UT_FALSE; /* Formatering er utført */
+
+ /* Handter LENGDE_HORISONTAL spesielt */
+ } else if (strcmp(szSosiNavn,"LENGDE_HORISONTAL") == 0) {
+ d = LC_BerLengde();
+ d *= pow((double)10.0,(int)sFlyttKomma);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%.*f",sAntDes,d);
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+ sFormater = UT_FALSE; /* Formatering er utført */
+
+ /* Handter LENGDE_AVGRENS spesielt */
+ } else if (strcmp(szSosiNavn,"LENGDE_AVGRENS") == 0) {
+ d = LC_BerAvgrensLengde();
+ d *= pow((double)10.0,(int)sFlyttKomma);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%.*f",sAntDes,d);
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+ sFormater = UT_FALSE; /* Formatering er utført */
+
+ /* Handter LENGDE_YTRE_AVGRENS spesielt */
+ } else if (strcmp(szSosiNavn,"LENGDE_YTRE_AVGRENS") == 0) {
+ d = LC_BerYtreAvgrensLengde();
+ d *= pow((double)10.0,(int)sFlyttKomma);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%.*f",sAntDes,d);
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+ sFormater = UT_FALSE; /* Formatering er utført */
+
+ /* Handter LENGDE_INDRE_AVGRENS spesielt */
+ } else if (strcmp(szSosiNavn,"LENGDE_INDRE_AVGRENS") == 0) {
+ d = LC_BerIndreAvgrensLengde();
+ d *= pow((double)10.0,(int)sFlyttKomma);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%.*f",sAntDes,d);
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+ sFormater = UT_FALSE; /* Formatering er utført */
+
+ /* Handter SNR spesielt */
+ } else if (strcmp(szSosiNavn,"SNR") == 0) {
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%ld",LC_GetSn());
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+
+ /* Handter NPT spesielt */
+ } else if (strcmp(szSosiNavn,"NPT") == 0) {
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%ld", Sys.pGrInfo->nko);
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+
+ // Handter REF_FRA spesielt (referert fra antall grupper)
+ } else if (strcmp(szSosiNavn,"REF_FRA") == 0) {
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%ld", LC_ErReferertFraAntall());
+ rp = retur_str;
+
+ // Handter NPT_REF spesielt antall punkt referert
+ } else if (strcmp(szSosiNavn,"NPT_REF") == 0) {
+
+ if(Sys.pGrInfo->info & GI_REF)
+ {
+ // Gruppen har referanser
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_POLYGON Polygon;
+ LC_POL_ELEMENT * pPE;
+ LC_OY_ELEMENT * pOE;
+ long lSumNko = 0;
+
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+
+ // Ytre avgrensning
+ for(pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ LC_GetGrParaBgr(&pPE->Bgr,&ngi,&nko,&info);
+ lSumNko += nko;
+ }
+
+ // Indre avgrensning
+ for (pOE = Polygon.OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ LC_GetGrParaBgr(&pPE->Bgr,&ngi,&nko,&info);
+ lSumNko += nko;
+ }
+ }
+
+ // Frigi allokerte kjeder
+ LC_POL_FrigiPolygon(&Polygon);
+
+ //Lag returstrengen
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%ld", lSumNko);
+ }
+
+ else
+ {
+ // Har ikke referanser
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%hd", 0);
+ }
+
+ *forste_linje = siste_linje + 1;
+ rp = retur_str;
+
+
+ /* Handter KVALITET spesielt */
+ } else if (strcmp(szSosiNavn,"KVALITET") == 0) {
+ short sMetode, sSynbarhet, sHoydeMetode;
+ long lNoyaktighet, lHoydeNoyaktighet;
+ short nivaa = 2;
+ /* Funnet kvalitet? */
+ if (LC_GetCurKvalitet(Sys.GrId.pFil,&nivaa,1,
+ &sMetode,&lNoyaktighet,&sSynbarhet,
+ &sHoydeMetode,&lHoydeNoyaktighet) == UT_TRUE) {
+ /* Formater kvaliteten */
+ UT_StrCopy(retur_str,
+ LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,sHoydeMetode,lHoydeNoyaktighet),
+ LC_MAX_SOSI_LINJE_LEN);
+ rp = retur_str;
+ }
+ *forste_linje = siste_linje + 1;
+ }
+ }
+
+ /* Har funnet navnet */
+ //if (rp != NULL) {
+ if ((rp != NULL) && (*rp != '\0')) { //22.11.2007 AR/ÅE Stopper tom variabel som har adresse
+ /* Handter delstreng */
+ if (sStart != 0) {
+ if (sSlutt != 0 && sSlutt < (short)strlen(rp)) {
+ *(rp+sSlutt) = '\0';
+ }
+ sStart = min(sStart,((short)strlen(rp)));
+ rp += (sStart-1);
+ }
+
+ /* Handter skilletegn */
+ if (cSkilleTegn != '\0') {
+ /* Skann hele strengen */
+ sAntallBlank = 0;
+ cp = cs = rp;
+ while (*cp) {
+ if (*cp == ' ') { /* Funnet blank */
+ if (sAntallBlank == 0) { /* Første i dette mellomrommet */
+ *(cs++) = cSkilleTegn;
+ }
+ ++cp;
+ ++sAntallBlank;
+
+ } else { /* Kopier og pakk strengen */
+ *(cs++) = *(cp++);
+ sAntallBlank = 0;
+ }
+ }
+ *cs = '\0';
+ }
+
+ /* Handter formateringskode */
+ if (sFormater == 2) { // Desimaltallet skal ikke avrundes
+ // Fjerner unødvendige desimaler fra tall for å unngå avrunding
+ cp = rp;
+ short sTeller=-99;
+ while (*cp) {
+ if (*cp == '.') // Funnet skilletegn
+ sTeller = -1;
+ if(sTeller>-99)
+ if(sTeller++==sAntDes) {
+ *cp = '\0';
+ break;
+ }
+ ++cp;
+ }
+ }
+ if (sFormater) {
+ UT_AtoD (rp,'.',&d);
+ d *= pow((double)10.0,(int)sFlyttKomma);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%.*f",sAntDes,d);
+ rp = retur_str;
+ }
+
+ }
+ }
+
+ return rp;
+}
+
+
+/*
+AR-920615
+CH LC_GetPiVerdi Get PINFO-verdi
+CD ==========================================================================
+CD Formål:
+CD Henter parametrene til et SOSI-navn.
+CD Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk UT_StrCopy).
+CD
+CD Leddnummer, delstreng og formateringskode kan inngå som
+CD forlengelse av SOSI-navnet.
+CD
+CD Leddnummer for flerleddet parameter angis ved #n.
+CD Eks: ...KVALITET#2 er nøyaktighet.
+CD
+CD Delstreng angis ved: [start:slutt].
+CD NB! 1 er første tegn.
+CD Sluttposisjon 0 betyr at resten av strengen skal brukes.
+CD Eks: ..STRENG[2:0] Posisjon 2 og resten av strengen.
+CD
+CD Formateringskode kan angi skilletegn for flerleddet PINFO. Dette
+CD angis ved ^x hvor x er det tegnet som skal skrives ut mellom leddene.
+CD
+CD Disse tilleggene kan kombineres, slik at ...KVALITET#2[1:2] betyr at
+CD det er tegn nummer 1 og 2 i det andre leddet (nøyaktigheten) som skal
+CD brukes.
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char pszSosiNavn i SOSI-navn det skal finnes verdi til.
+CD Leddnummer posisjon og formateringskode kan
+CD inngå som forlengelse av navnet.
+CD OBS! Store og små bokstaver er signifikante.
+CD HØYDE er spesialverdi som henter formatert
+CD høyde fra punktet eller GINFO.
+CD KVALITET er spesialverdi som henter formatert
+CD kvalitet fra punktet, GINFO eller hode.
+CD long lPnr i Punktnummer
+CD short *sSettNr iu PINFO-nummer (1 er første sett i PINFO.)
+CD Ved tilslag returneres settnummer for tilslaget.
+CD char *pszVerdi r Peker til verdien avslutta med '\0'.
+CD Hvis SOSI-navnet ikke er funnet returneres NULL.
+CD
+CD Bruk:
+CD pszVerdi = LC_GetPiVerdi(pszSosiNavn,lPnr,&sSettNr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA char *LC_GetPiVerdi(const char *pszSosiNavn,long lPnr,short *sSettNr)
+{
+ short lin,i,sAntallBlank;
+ char *cp,*cs,*nt,szSosiNavn[LC_MAX_SOSINAVN_LEN];
+ short sAntDes,niv;
+ char format[20];
+ double enhet,enhet_h,enhet_d,h;
+ char cSkilleTegn = '\0';
+ short sLedd = 0;
+ short sStart = 0;
+ short sSlutt = 0;
+ short funnet = UT_FALSE;
+ char *rp = NULL; /* Retur peker */
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (lPnr > 0 && lPnr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+ /* Er søkebuffer oppbygd ? */
+ if (Sys.sPibufStatus != LC_PIBUF_OK || Sys.lPibufPnr != lPnr) {
+ LX_CreatePibuf(lPnr);
+ }
+
+ if (Sys.sPibufStatus != LC_PIBUF_OK) {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," \"%s\" pnr: %ld",LX_GetGi(1),lPnr);
+ LC_Error(55,"(LC_GetPiVerdi)",err().tx);
+ return NULL;
+
+ } else {
+
+ /* Sjekk at det er lovlige linjenummer */
+ if (*sSettNr < 1) {
+ *sSettNr = 1;
+ }
+ lin = *sSettNr - 1;
+
+ /* Plukk ut info om ledd, delstreng og formatering */
+ UT_StrCopy(szSosiNavn,pszSosiNavn,LC_MAX_SOSINAVN_LEN);
+ if ((cs = strpbrk(szSosiNavn,"#[^")) != NULL) {
+ cp = cs;
+ for (i=0;i<3;++i) {
+ if (*cp == '#') {
+ ++cp;
+ sLedd = (short) strtol(cp,&cp,10); /* Ledd-nummer */
+ } else if (*cp == '^') {
+ ++cp;
+ cSkilleTegn = *cp; /* Skilletegn */
+ ++cp;
+ } else if (*cp == '[') {
+ ++cp;
+ sStart = (short) strtol(cp,&cp,10); /* Startposisjon */
+ ++cp;
+ sSlutt = (short) strtol(cp,&cp,10); /* Sluttposisjon */
+ }
+ }
+ /* Fjern tilleggsinfo fra SOSI-navnet */
+ *cs = '\0';
+ }
+
+
+ /* -------- Vanlig PINFO */
+ /* Søk etter SOSI-navnet */
+ while (lin < Sys.sPibufAntPi) {
+ if (strcmp(Sys.pcPibufNavn[lin],szSosiNavn) == 0) {
+ funnet = UT_TRUE;
+ /* Kopier parameter */
+ UT_StrCopy(retur_str,Sys.pcPibufVerdi[lin],LC_MAX_SOSI_LINJE_LEN);
+ break; /* Funnet, ==> hopp ut av løkken */
+ }
+ ++lin;
+ }
+
+ /* -------- Knutepunkt */
+ if (!funnet) {
+ if (lin < (Sys.sPibufAntPi+1) &&
+ strcmp(szSosiNavn,"...KP") == 0) {
+ if ((i = LC_GetKp(lPnr)) != 0) { /* Funnet KP */
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%hd",i);
+ funnet = UT_TRUE;
+ }
+ lin = Sys.sPibufAntPi + 1;
+
+ /* -------- Høyde */
+ } else if (lin < (Sys.sPibufAntPi+2) &&
+ strcmp(szSosiNavn,"HØYDE") == 0) {
+ if ((h = LC_GetHoyde(lPnr)) != HOYDE_MANGLER) { /* Funnet høyde */
+
+ /* Hent enhet og formater høyden */
+ niv = 2;
+ LC_GetCurEnhet(Sys.GrId.pFil,&niv,&enhet,&enhet_h,&enhet_d);
+ sAntDes = UT_RoundDS(fabs(min(0.0,log10(enhet_h))));
+ UT_SNPRINTF(format,20,"%%.%dlf",sAntDes);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,format,h);
+ funnet = UT_TRUE;
+ }
+ lin = Sys.sPibufAntPi + 2;
+
+ /* -------- Kvalitet */
+ } else if (lin < (Sys.sPibufAntPi+3) &&
+ strcmp(szSosiNavn,"KVALITET") == 0) {
+ short sMetode, sSynbarhet, sHoydeMetode;
+ long lNoyaktighet, lHoydeNoyaktighet;
+ short nivaa = 3;
+ /* Funnet kvalitet? */
+ if (LC_GetCurKvalitet(Sys.GrId.pFil,&nivaa,lPnr,
+ &sMetode,&lNoyaktighet,&sSynbarhet,
+ &sHoydeMetode,&lHoydeNoyaktighet) == UT_TRUE) {
+ /* Formater kvaliteten */
+ UT_StrCopy(retur_str,
+ LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,sHoydeMetode,lHoydeNoyaktighet),
+ LC_MAX_SOSI_LINJE_LEN);
+ funnet = UT_TRUE;
+ }
+ lin = Sys.sPibufAntPi + 3;
+ }
+ }
+
+ /* Klargjør for retur */
+ *sSettNr = lin+1;
+ if (funnet) {
+ rp = retur_str;
+
+ /* Handter leddnummer */
+ if (sLedd != 0) {
+ cp = UT_strtok(rp," ",&nt);
+ while(cp != NULL && --sLedd > 0){
+ cp = UT_strtok(NULL," ",&nt);
+ }
+ if (cp == NULL) {
+ *rp = '\0';
+ } else {
+ rp = cp;
+ }
+ }
+
+ /* Handter delstreng */
+ if (sStart != 0) {
+ if (sSlutt != 0 && sSlutt < (short)strlen(rp)) {
+ *(rp+sSlutt) = '\0';
+ }
+ sStart = min(sStart,((short)strlen(rp)));
+ rp += (sStart-1);
+ }
+
+ /* Handter skilletegn */
+ if (cSkilleTegn != '\0') {
+ /* Skann hele strengen */
+ sAntallBlank = 0;
+ cp = cs = rp;
+ while (*cp) {
+ if (*cp == ' ') { /* Funnet blank */
+ if (sAntallBlank == 0) { /* Første i dette mellomrommet */
+ *(cs++) = cSkilleTegn;
+ }
+ ++cp;
+ ++sAntallBlank;
+
+ } else { /* Kopier og pakk strengen */
+ *(cs++) = *(cp++);
+ sAntallBlank = 0;
+ }
+ }
+ *cs = '\0';
+ }
+ }
+ }
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),lPnr);
+ LC_Error(51,"(LC_GetPiVerdi)",err().tx);
+ }
+ }
+
+ return rp;
+}
+
+
+/*
+AR-920614
+CH LX_CreatePibuf Generer PINFO-buffer
+CD ==========================================================================
+CD Formål:
+CD Henter PINFO for gitt punkt og legger den inn i et buffer.
+CD Det bygges opp en tabell med pekere til starten av hvert SOSI-navn og
+CD hver verdi.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long lPnr i Punktnummer.
+CD
+CD Bruk:
+CD LX_CreatePibuf(lPnr);
+ ==========================================================================
+*/
+static void LX_CreatePibuf(long lPnr)
+{
+ short sAntPi;
+ char *pp,*cp;
+ char *bp = Sys.cPibuf ;
+
+ *Sys.cPibuf = '\0';
+
+ sAntPi = 0;
+ pp = LC_GetPi(lPnr);
+
+ /* For lang pinfo */
+ if (strlen(pp) > LC_MAX_PIBUF_TEGN) {
+ Sys.sPibufStatus = LC_PIBUF_FULL;
+ return;
+ }
+
+ /* Finn første/neste SOSI-navn */
+ while ((cp = strstr(pp,"...")) != NULL) { /* SOSI-navn */
+ ++sAntPi;
+
+ /* Sjekk om det er nok plass i tabell for peker til PINFO-linje */
+ if (sAntPi > LC_MAX_PIBUF_LIN){
+ Sys.sPibufStatus = LC_PIBUF_FULL;
+ return;
+ }
+
+ pp = cp;
+ Sys.pcPibufNavn[sAntPi-1] = bp;
+ while (!UT_IsSpace(*pp) && *pp != '\0') {
+ *bp++ = *pp++;
+ }
+ *bp++ = '\0';
+
+ /* Hopp over blanke mellom navn og verdi */
+ while (UT_IsSpace(*pp)) {
+ ++pp;
+ }
+
+ /* Ta vare på verdien */
+
+ if (*pp == '"') { /* Hermetegn */
+ if ((cp = strchr(pp+1,'"')) != NULL) { /* Slutt-hermetegn */
+ ++pp;
+ *cp++ = '\0';
+ cp = strstr(cp," ..."); /* Neste SOSI-navn */
+
+ } else {
+ UT_ClrTrailsp(pp); /* Fjern blanke på slutten */
+ }
+
+ } else if ((cp = strstr(pp," ...")) != NULL) { /* SOSI-navn */
+ *cp++ = '\0';
+ UT_ClrTrailsp(pp); /* Fjern blanke på slutten */
+
+ } else if ((cp = strchr(pp,'!')) != NULL) { /* Kommentar */
+ *cp = '\0';
+ UT_ClrTrailsp(pp); /* Fjern blanke på slutten */
+ cp = NULL;
+
+ } else {
+ /* Linjeslutt cp = NULL*/
+ UT_ClrTrailsp(pp); /* Fjern blanke på slutten */
+ }
+
+ /* Kopier strengen */
+ Sys.pcPibufVerdi[sAntPi-1] = bp;
+ while (*pp) {
+ *bp++ = *pp++;
+ }
+ *bp++ = '\0';
+
+ /* Neste sett */
+ if (cp != NULL) {
+ pp = cp;
+ }
+ }
+
+ Sys.lPibufPnr = lPnr;
+ Sys.sPibufAntPi = sAntPi; /* Antall elementer brukt i Pibuf */
+ Sys.sPibufStatus = LC_PIBUF_OK;
+}
+
+
+/*
+AR-891001
+CH LC_PutGP Put GINFO-parameter
+CD ==========================================================================
+CD Formål:
+CD Legger inn et SOSI-navn med verdi.
+CD Denne rutinen kan brukes til å legge inn ginfo med nytt SOSI-navn.
+CD Rutinen kan endre antall ginfo-linjer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char sosi_navn i Sosi-navn det skal legges inn verdi til
+CD char verdi i Streng som skal legges inn.
+CD short *linje_nr u Linjenummer for endringen.
+CD short ngi r Ant. ginfo-linjer etter endringen.
+CD
+CD Bruk:
+CD ngi = LC_PutGP(sosi_navn,verdi,&linje_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutGP(const char *sosi_navn,const char *verdi,short *linje_nr)
+{
+ char temp[LC_MAX_SOSI_LINJE_LEN];
+
+
+
+#ifdef TEST
+
+************************************************************
+ short sLedd = 0;
+ short funnet = 0;
+
+ char *rp = NULL; /* Retur peker */
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ /* Plukk ut info om ledd */
+ UT_StrCopy(szSosiNavn,sosi_navn,LC_MAX_SOSINAVN_LEN);
+ UT_StrUpper(szSosiNavn);
+
+ if ((cs = strchr(szSosiNavn,'#')) != NULL) {
+ cp = cs;
+ ++cp;
+ sLedd = (short) strtol(cp,&cp,10); /* Ledd-nummer */
+ /* Fjern tilleggsinfo fra SOSI-navnet */
+ *cs = '\0';
+ }
+
+ /* Søk etter SOSI-navnet */
+ sSosiLen = strlen(szSosiNavn);
+ gi_lin = *forste_linje;
+ while (gi_lin <= siste_linje) {
+ /* Les ny linje */
+ ginfo = LX_GetGi(gi_lin);
+
+ /* Er dette rett navn? */
+ if ((strncmp(ginfo,szSosiNavn,sSosiLen) == 0) &&
+ ( (UT_IsSpace(*(ginfo+sSosiLen)) || *(ginfo+sSosiLen) == '\0'))) {
+
+ /* Hopp over blanke mellom navn og verdi */
+ cp = ginfo + sSosiLen;
+ while (UT_IsSpace(*cp)) {
+ ++cp;
+ }
+ /* Kopier parameter */
+ rp = strcpy(retur_str,cp);
+
+ /* Fjern hermetegn (") */
+ if (*rp == '"') {
+ if ((cp = strchr(rp+1,'"')) != NULL) { /* Slutt-hermetegn */
+ ++rp;
+ *cp = '\0';
+ }
+ }
+
+ /* Fjern hermetegn (') */
+ if (*rp == '\'') {
+ if ((cp = strchr(rp+1,'\'')) != NULL) { /* Slutt-hermetegn */
+ ++rp;
+ *cp = '\0';
+ }
+ }
+
+ /* Har ikke ledd , funnet OK */
+ if (sLedd == 0) {
+ funnet = 1;
+ /* Husk linjenummeret */
+ *forste_linje = gi_lin;
+ break; /* Funnet, ==> hopp ut av løkken */
+
+ /* Handter leddnummer */
+ } else {
+ cp = strtok(rp," ");
+ s = sLedd;
+ while(cp != NULL && --s > 0){
+ cp = strtok(NULL," ");
+ }
+
+ /* Leddet er funnet */
+ if (cp != NULL) {
+ /* Aktuellt ledd huskes */
+ rp = cp;
+ funnet = 1;
+ /* Husk linjenummeret */
+ *forste_linje = gi_lin;
+ break; /* Funnet, ==> hopp ut av løkken */
+
+ } else {
+ /* AR-950901 */
+ /* rp = NULL; */ /* Det aktuelle leddet finnes ikke */
+ /* Aktuellt ledd huskes */
+ rp = strchr(rp,'\0');
+ funnet = 1;
+ /* Husk linjenummeret */
+ *forste_linje = gi_lin;
+ break; /* Funnet, ==> hopp ut av l›kken */
+ }
+ }
+ }
+
+ ++gi_lin;
+ }
+
+ /* Har funnet navnet */
+ if (rp != NULL) {
+
+ /* Handter delstreng */
+ if (sStart != 0) {
+ if (sSlutt != 0 && sSlutt < (short)strlen(rp)) {
+ *(rp+sSlutt) = '\0';
+ }
+ sStart = min(sStart,((short)strlen(rp)));
+ rp += (sStart-1);
+ }
+
+*****************************************************************
+#endif
+
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+ *linje_nr = 2;
+ if (LC_GetGP(sosi_navn,linje_nr,Sys.pGrInfo->ngi) != NULL){ /* Finn linjen */
+ /* Legg inn endringen */
+ LC_UpdateGP(*linje_nr,sosi_navn,verdi);
+
+ } else{ /* Ikke funnet, ny linje */
+ *linje_nr = LC_AppGiL();
+ UT_StrCopy(temp,sosi_navn,LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCopy(temp," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCopy(temp,verdi,LC_MAX_SOSI_LINJE_LEN);
+ LC_PutGi(*linje_nr,temp);
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutGP)","");
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+AR:2010-02-09
+CH LC_AppGP Legg til GINFO-parameter
+CD ==========================================================================
+CD Formål:
+CD Legger til et SOSI-navn med verdi i GINFO.
+CD Lik LC_PutGP, men legger alltid til ny linje i ginfo.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char sosi_navn i Sosi-navn det skal legges inn verdi til
+CD char verdi i Streng som skal legges inn.
+CD short *linje_nr u Linjenummer for endringen.
+CD short ngi r Ant. ginfo-linjer etter endringen.
+CD
+CD Bruk:
+CD ngi = LC_AppGP(sosi_navn,verdi,&linje_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_AppGP(const char *sosi_navn,const char *verdi,short *linje_nr)
+{
+ char temp[LC_MAX_SOSI_LINJE_LEN];
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+ *linje_nr = LC_AppGiL();
+ UT_StrCopy(temp,sosi_navn,LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCopy(temp," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCopy(temp,verdi,LC_MAX_SOSI_LINJE_LEN);
+ LC_PutGi(*linje_nr,temp);
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_AppGP)","");
+ }
+
+ return Sys.pGrInfo->ngi;
+}
+
+
+/*
+AR-891001
+CH LC_UpdateGP Endre GINFO-parameter
+CD ==========================================================================
+CD Formål:
+CD Legger inn parametren til et SOSI-navn.
+CD Rutinen handterer at det er flere SOSI-navn på samme linje.
+CD OBS! Denne rutinen kan ikke brukes til å legge inn nytt SOSI-navn.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short linje_nr i Linjenummer som skal endres.
+CD char sosi_navn i Sosi-navn det skal legges inn verdi til
+CD char verdi i Streng som skall legges inn
+CD short ist r 1=ok, 0=navnet er ikke funnet
+CD
+CD Bruk:
+CD ist = LC_UpdateGP(linje_nr,sosi_navn,verdi);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_UpdateGP(short linje_nr,const char *sosi_navn,const char *verdi)
+{
+ char temp[LC_MAX_SOSI_LINJE_LEN],*gp,*neste,*cp;
+ short ist=0;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+ gp = LC_GetGi(linje_nr);
+ if ((neste = strstr(gp,sosi_navn)) != NULL){ /* Finn SOSI-navnet */
+
+ cp = neste - 1; /* Avslutt første del av ginfo */
+ while (cp >= gp && UT_IsSpace(*cp)){
+ cp--;
+ }
+ *(cp+1) = '\0';
+
+ neste += strlen(sosi_navn); /* Hopp over SOSI-navnet */
+
+ while (UT_IsSpace(*neste)) /* Ledende blanke */
+ ++neste;
+
+ if (*neste == '"' && (cp = strchr(neste+1,'"')) != NULL){ /* Hermetegn */
+ neste = cp + 1;
+ while (UT_IsSpace(*neste)){ /* Blanke */
+ ++neste;
+ }
+
+ } else if ((cp = strstr(neste-1," ..")) != NULL) { /* SOSI-navn */
+ neste = cp + 1;
+
+ } else if ((cp = strchr(neste,'!')) != NULL) { /* Kommentar */
+ neste = cp;
+
+ } else{ /* Slutten av strengen */
+ neste = strchr(neste,'\0');
+ }
+
+ /* Legg inn endringen */
+ *temp = '\0';
+ if (*gp){ /* Første del */
+ UT_StrCat(temp,gp,LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(temp," ",LC_MAX_SOSI_LINJE_LEN);
+ }
+ UT_StrCat(temp,sosi_navn,LC_MAX_SOSI_LINJE_LEN); /* Aktuellt navn */
+ UT_StrCat(temp," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(temp,verdi,LC_MAX_SOSI_LINJE_LEN);
+ if (*neste){ /* Siste del */
+ UT_StrCat(temp," ",LC_MAX_SOSI_LINJE_LEN);
+ UT_StrCat(temp,neste,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ LC_PutGi(linje_nr,temp);
+ ist = 1;
+ }
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_UpdateGP)","");
+ }
+
+ return ist;
+}
+
+
+/*
+AR-881113
+CH LC_InitPP Initier PINFO-søk
+CD ==========================================================================
+CD Formål:
+CD Initierer søk etter PINFO.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD char sosi_navn i Sosi-navn det skal finnes verdi til
+CD long forste_punkt i Første punkt. (1 er første pkt i gr)
+CD long siste_punkt i Siste punkt det skal søkes i
+CD LC_GETPP_STATUS pp_stat iu Struktur med statusvariabler. Denne er
+CD bare for intern bruk i InitPP / GetPP.
+CD
+CD Bruk:
+CD Se under LC_GetPP.
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_InitPP(char *sosi_navn,long forste_punkt,long siste_punkt,
+ LC_GETPP_STATUS *pp_stat)
+{
+ short itxu;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+
+ UT_StrToken(sosi_navn,0,&itxu,LC_MAX_SOSINAVN_LEN,pp_stat->pinfo_navn); /* SOSI-navnet */
+ UT_StrUpper(pp_stat->pinfo_navn);
+ pp_stat->slutt_punkt = min(siste_punkt,Sys.pGrInfo->nko) + 1;
+
+ /* -------- Knutepunkt */
+ if (strcmp(pp_stat->pinfo_navn,"...KP") == 0){
+ pp_stat->type = LC_GETPP_KP;
+ pp_stat->curr_punkt = max(forste_punkt,1) -1; /* Sjekk punktnummer */
+
+ /* -------- Høyde */
+ } else if (strcmp(pp_stat->pinfo_navn,"HØYDE") == 0) {
+ pp_stat->type = LC_GETPP_HOYDE;
+ pp_stat->curr_punkt = max(forste_punkt,1) -1; /* Sjekk punktnummer */
+
+ /* -------- Kvalitet */
+ } else if (strcmp(pp_stat->pinfo_navn,"KVALITET") == 0) {
+ pp_stat->type = LC_GETPP_KVALITET;
+ pp_stat->curr_punkt = max(forste_punkt,1) -1; /* Sjekk punktnummer */
+
+ /* -------- Annen PINFO */
+ } else {
+ pp_stat->type = LC_GETPP_VANLIG;
+ pp_stat->neste_tegn = 0;
+ pp_stat->curr_punkt = max(forste_punkt,1); /* Sjekk punktnummer */
+ }
+ }
+}
+
+
+/*
+AR-890511
+CH LC_GetPP Utfør PINFO-søk
+CD ==========================================================================
+CD Formål:
+CD Henter parametrene til et SOSI-navn definert i LC_InitPP.
+CD Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk strcpy).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long *punkt u Ved tilslag returneres punktnummer for
+CD tilslaget.
+CD LC_GETPP_STATUS pp_stat iu Struktur med statusvariabler. Denne er
+CD bare for intern bruk i InitPP / GetPP.
+CD char *para_peker r Peker til para.-streng avslutta med '\0'.
+CD Hvis ingenting er funnet returneres NULL.
+CD
+CD Bruk:
+CD .
+CD LC_GETPP_STATUS pp_stat;
+CD .
+CD LC_InitPP(sosi_navn,forste_punkt,siste_punkt,pp_stat);
+CD para_peker = LC_GetPP(&punkt,pp_stat);
+CD .
+ =============================================================================
+*/
+SK_EntPnt_FYBA char *LC_GetPP(long *punkt,LC_GETPP_STATUS *pp_stat)
+{
+ short nt,kp_type,sAntDes,niv;
+ char format[20];
+ char *pinfo,*cp,*parameter;
+ char funnet_sosi[LC_MAX_SOSINAVN_LEN];
+ double enhet,enhet_h,enhet_d,h;
+
+
+ /* -------- Knutepunkt */
+ if (pp_stat->type == LC_GETPP_KP) {
+ pp_stat->curr_punkt++;
+ if (LC_FinnKp(&(pp_stat->curr_punkt), pp_stat->slutt_punkt-1, &kp_type)) { /* Søk */
+ *punkt = pp_stat->curr_punkt;
+ /* Lag parameter */
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,"%hd",kp_type);
+ return retur_str; /* OBS! RETURNERER HER! */
+
+ } else { /* Ikke funnet */
+ return NULL; /* OBS! RETURNERER HER! */
+ }
+
+ /* -------- Høyde */
+ } else if (pp_stat->type == LC_GETPP_HOYDE) {
+ pp_stat->curr_punkt++;
+
+ while (pp_stat->curr_punkt < pp_stat->slutt_punkt) { /* Søk etter navnet */
+ h = LC_GetHoyde(pp_stat->curr_punkt);
+ if (h != HOYDE_MANGLER) { /* Funnet høyde */
+ *punkt = pp_stat->curr_punkt;
+
+ /* Hent enhet og formater høyden */
+ niv = 2;
+ LC_GetCurEnhet(Sys.GrId.pFil,&niv,&enhet,&enhet_h,&enhet_d);
+
+ sAntDes = UT_RoundDS(fabs(min(0.0,log10(enhet_h))));
+ UT_SNPRINTF(format,20,"%%.%dlf",sAntDes);
+ UT_SNPRINTF(retur_str,LC_MAX_SOSI_LINJE_LEN,format,h);
+
+ return retur_str; /* OBS! RETURNERER HER! */
+
+ } else { /* Neste punkt */
+ pp_stat->curr_punkt++;
+ }
+ }
+
+ return NULL; /* Ikke funnet */
+
+ /* -------- Kvalitet */
+ } else if (pp_stat->type == LC_GETPP_KVALITET) {
+ short sMetode, sSynbarhet, sHoydeMetode;
+ long lNoyaktighet, lHoydeNoyaktighet;
+ short nivaa = 3;
+
+ pp_stat->curr_punkt++;
+
+ while (pp_stat->curr_punkt < pp_stat->slutt_punkt) { /* Søk etter navnet */
+
+ /* Funnet kvalitet? */
+ if (LC_GetCurKvalitet(Sys.GrId.pFil,&nivaa,pp_stat->curr_punkt,
+ &sMetode,&lNoyaktighet,&sSynbarhet,
+ &sHoydeMetode,&lHoydeNoyaktighet) == UT_TRUE) {
+ *punkt = pp_stat->curr_punkt;
+
+ /* Formater kvaliteten */
+ UT_StrCopy(retur_str,
+ LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,sHoydeMetode,lHoydeNoyaktighet),
+ LC_MAX_SOSI_LINJE_LEN);
+ return retur_str; /* OBS! RETURNERER HER! */
+
+ } else { /* Neste punkt */
+ pp_stat->curr_punkt++;
+ }
+ }
+
+ return NULL; /* Ikke funnet */
+
+ /* -------- Annen PINFO */
+ } else {
+ nt = pp_stat->neste_tegn;
+ while (pp_stat->curr_punkt < pp_stat->slutt_punkt){ /* Søk etter navnet */
+ pinfo = LC_GetPi(pp_stat->curr_punkt);
+ if (*pinfo){ /* Punktet har PINFO */
+ *punkt = pp_stat->curr_punkt;
+ while (*punkt == pp_stat->curr_punkt){
+ UT_StrToken(pinfo,nt,&nt,LC_MAX_SOSINAVN_LEN,funnet_sosi); /* SOSI-navn */
+ parameter = pinfo + nt;
+
+ if (strcmp(pp_stat->pinfo_navn,funnet_sosi) == 0){ /* Tilslag */
+ /* Finn parameter */
+ while (*parameter == ' ') /* Ledende blanke */
+ ++parameter;
+
+ if (*parameter == '"'){ /* Hermetegn */
+ if ((cp = strchr(parameter+1,'"')) != NULL){ /* Slutt-hermetegn */
+ ++parameter;
+ *cp = '\0';
+ }
+ } else if ((cp = strstr(parameter," ..")) != NULL){ /* SOSI-navn */
+ *cp = '\0';
+ nt = (short)(cp - pinfo + 1);
+
+ } else if ((cp = strchr(parameter,'!')) != NULL){ /* Kommentar */
+ *cp = '\0';
+ pp_stat->curr_punkt++;
+ nt = 0;
+ } else{ /* Linjeslutt */
+ pp_stat->curr_punkt++;
+ nt = 0;
+ }
+
+ pp_stat->neste_tegn = nt; /* Klargjør for retur */
+ return parameter; /* OBS! RETURNERER HER! */
+
+ } else{ /* Ikke tilslag, neste PINFO */
+ if ((cp = strstr(parameter," ..")) != NULL){ /* SOSI-navn */
+ nt = (short)(cp - pinfo + 1);
+ } else{ /* Linjeslutt */
+ pp_stat->curr_punkt++;
+ nt = 0;
+ }
+ }
+ }
+
+ } else {
+ pp_stat->curr_punkt++;
+ }
+ }
+ }
+
+ return NULL; /* Ikke funnet */
+}
+
+
+/*
+AR-930609
+CH LC_FinnKp Finn knutepunkt
+CD ==========================================================================
+CD Formål:
+CD Skanner gruppe, og finner punkt som er knutepunkt.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long *forste_punkt iu Punktnummer for start søking.
+CD (1 er første punkt i gruppen.)
+CD Ved tilslag returneres punktnummer for tilslaget.
+CD long siste_punkt i Siste punkt det skal søkes i.
+CD short *kp u Knutepunkt.
+CD short status r Søkestatus (1=funnet, 0=ikke funnet)
+CD
+CD Bruk:
+CD status = LC_FinnKp(&forste_punkt,siste_punkt,kp);
+ ==========================================================================
+*/
+short LC_FinnKp(long *forste_punkt,long siste_punkt,short *kp)
+{
+ long punkt;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+ if(Sys.pGrInfo->info & GI_KP){ /* Gruppen har knutepunkt */
+ punkt = max(*forste_punkt,1); /* Sjekk punktnummer */
+ siste_punkt = min(siste_punkt,Sys.pGrInfo->nko);
+
+ /* Skann gruppen */
+ for (punkt--; punkt<siste_punkt; ++punkt) {
+ if ((Sys.pInfo+punkt)->sKp != 0) { /* KP ? */
+ *kp = (Sys.pInfo+punkt)->sKp;
+ *forste_punkt = punkt+1;
+ return(1);
+ }
+ }
+ }
+ }
+ return(0);
+}
+
+
+/*
+AR-890520
+CH LC_PutSn Put Serienummer
+CD ==========================================================================
+CD Formål:
+CD Legger inn nytt serienummer på aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long snr i Serienummer
+CD
+CD Bruk:
+CD LC_PutSn(snr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_PutSn(long snr)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+ /* Legger inn SNR og marker for endring */
+ LX_PutSn(snr);
+ Sys.sGrEndra = END_ENDRA;
+
+ } else{ /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutSn)","");
+ }
+}
+
+
+/*
+AR-930609
+CH LX_PutSn Lavnivå Put Serienummer
+CD ==========================================================================
+CD Formål:
+CD Legger inn nytt serienummer på aktuell gruppe, uten å sette flagg for at
+CD aktuell gruppe er oppdatert. Sjekker ikke om det er noen aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long snr i Serienummer
+CD
+CD Bruk:
+CD LX_PutSn(snr);
+ ==========================================================================
+*/
+void LX_PutSn(long snr)
+{
+ char szGinfo[LC_MAX_SOSI_LINJE_LEN],*cp;
+
+ /* Legger ikke inn serienr i hodet */
+ if (Sys.GrId.lNr > 0L) {
+ /* Kobler gml SOSI-navn med nytt SNR */
+ UT_StrCopy(szGinfo,Sys.Ginfo.pszTx,LC_MAX_SOSI_LINJE_LEN);
+
+ cp = szGinfo;
+ while (! UT_IsSpace(*cp) && *cp) {
+ ++cp;
+ }
+ *cp = '\0';
+
+ /* Heng på serienummer */
+ if (snr != 0L) {
+ char szOrd[50];
+ UT_SNPRINTF(szOrd, 50, " %ld:", snr);
+ UT_StrCat(szGinfo,szOrd,LC_MAX_SOSI_LINJE_LEN);
+ }
+
+ /* Linjen lagres */
+ LX_PutGi(1,szGinfo);
+ }
+}
+
+
+/*
+AR-930609
+CH LC_GetSn Get serienummer
+CD ==========================================================================
+CD Formål:
+CD Henter serienummer for aktuell gruppe.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------
+CD long snr r Serienr. (INGEN_GRUPPE = ingen aktuell gruppe)
+CD
+CD Bruk:
+CD snr = LC_GetSn();
+ ==========================================================================
+*/
+SK_EntPnt_FYBA long LC_GetSn(void)
+{
+ char *cp;
+
+ /* Aktuell gruppe OK */
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ cp = strchr(LX_GetGi(1),' ');
+ if (cp != NULL) {
+ return atol(cp); /* ==> */
+ } else {
+ return 0L; /* ==> */
+ }
+ }
+
+ /* Ingen aktuell gruppe */
+ return INGEN_GRUPPE; /* ==> */
+}
+
+
+/*
+AR-930609
+CH LC_PutGi Put GINFO-linje
+CD ==========================================================================
+CD Formål:
+CD Legger inn GINFO-linje rent generellt.
+CD Dette omfatter også nytt gruppenavn (GINFO-linje 1)
+CD Ønsker du å endre serienummer må LC_PutSn benyttes.
+CD Referansenummer legges inn med LC_PutRef.
+CD Blanke på starten og slutten blir skrella vekk, og SOSI-navnet blir
+CD konvertert til "store" bokstaver, .ellers lagres det slik det er.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short lin_nr i Linjenummer i GINFO (1 er første linje)
+CD char *ginfo i GINFO-streng avslutta med '\0'
+CD
+CD Bruk:
+CD LC_PutGi(lin_nr,ginfo);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_PutGi(short lin_nr, const char *pszGinfo)
+{
+ // Aktuell gruppe OK
+ if (Sys.GrId.lNr != INGEN_GRUPPE)
+ {
+ // Lovlig linje ?
+ if (lin_nr > 0 && lin_nr <= Sys.pGrInfo->ngi)
+ {
+ // Gruppestart håndteres spesielt
+ if (lin_nr == 1)
+ {
+ char ginfo[LC_MAX_SOSI_LINJE_LEN];
+ char *ct;
+
+ /* Husk gammelt SNR */
+ long lGmlSnr = LC_GetSn();
+
+ // Fjern ledende blanke og kopier til lokal variabel
+ while (UT_IsSpace(*pszGinfo)) {
+ ++pszGinfo;
+ }
+ UT_StrCopy(ginfo,pszGinfo,LC_MAX_SOSI_LINJE_LEN);
+
+ /* Finn SOSI-navnet */
+ ct = ginfo;
+ while (*ct && ! UT_IsSpace(*ct)) {
+ ++ct;
+ }
+ *ct = '\0';
+
+ /* Heng på serienummer */
+ if (lGmlSnr != 0L) {
+ char szOrd[50];
+ UT_SNPRINTF(szOrd, 50, " %ld:", lGmlSnr);
+ UT_StrCat(ginfo,szOrd,LC_MAX_SOSI_LINJE_LEN);
+ }
+ LX_PutGi(lin_nr,ginfo);
+ }
+
+ else
+ {
+ LX_PutGi(lin_nr,pszGinfo);
+ }
+
+ /* Linjen lagres */
+
+ } else { /* Ulovlig linjenummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %d",lin_nr);
+ LC_Error(52,"(LC_PutGi)",err().tx);
+ }
+ }
+}
+
+
+
+/*
+AR-930609
+CH LX_PutGi Lavnivå put GINFO-linje
+CD ==========================================================================
+CD Formål:
+CD Lavnivå innlegging GINFO-linje rent generellt.
+CD Blanke på starten og slutten blir skrella vekk, og SOSI-navnet blir
+CD konvertert til "store" bokstaver, ellers lagres det slik det er.
+CD Sjekker også at det aktuelle SOSI-navnet er lovlig å oppdatere.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short lin_nr i Linjenummer i GINFO (1 er første linje)
+CD char *ginfo i GINFO-streng avslutta med '\0'
+CD
+CD Bruk:
+CD LX_PutGi(lin_nr,ginfo);
+ ==========================================================================
+*/
+static void LX_PutGi(short lin_nr, const char *szGinfo)
+{
+ short navn_nr,gr_start,dummy,sGmlLen,sNyLen;
+ char *cs,tmp,*ct;
+ double enhet,dNord,dAust;
+ char* pszNgisLag;
+ char ginfo[LC_MAX_SOSI_LINJE_LEN];
+ short sLagre = UT_TRUE;
+
+
+ Sys.sGrEndra = END_ENDRA;
+
+ /* Fjern blanke i starten og på slutten */
+ UT_StrCopy(ginfo,szGinfo,LC_MAX_SOSI_LINJE_LEN);
+ UT_ClrTrailsp(ginfo);
+
+ cs = ginfo;
+ while (UT_IsSpace(*cs))
+ {
+ ++cs;
+ }
+
+ // Sjekk at linjen ikke er for lang
+ if (strlen(cs) > (LC_MAX_SOSI_LINJE_LEN - 10))
+ {
+ *(cs + LC_MAX_SOSI_LINJE_LEN -10) = '\0';
+ UT_StrCat(ginfo, " ?????", LC_MAX_SOSI_LINJE_LEN);
+ LC_Error(134,"(LX_PutGi)",LX_GetGi(1));
+ }
+
+ /* Finn SOSI-navnet */
+ ct = cs;
+ while (*ct && ! UT_IsSpace(*ct))
+ {
+ ++ct;
+ }
+
+ /* Konv. SOSI-navnet til stor-bokstaver og finn navnenummer */
+ tmp = *ct;
+ *ct = '\0';
+ UT_StrUpper(cs);
+ gr_start = LN_FinnNavn(&(Sys.GrId.pFil->SosiNavn),cs,&navn_nr);
+ *ct = tmp;
+
+ /* Gruppestart */
+ if (lin_nr == 1) {
+ if (gr_start == 1) {
+ Sys.pGrInfo->gnavn = navn_nr; /* Husk gruppenavnet */
+
+ } else {
+ /* Melding om ukjent gruppestart */
+ LC_Error(54,"(LC_PutGi)",ginfo);
+ sLagre = UT_FALSE;
+ }
+
+ /* Annen GINFO */
+ } else {
+ if (gr_start > 0) {
+ /* ...ENHET i filhode på fil med data */
+ if (Sys.GrId.lNr == 0L && Sys.GrId.pFil->lAntGr > 1 && navn_nr == L_ENHET3) {
+
+ /* Sjekk at enhet ikke er endret */
+ UT_StrDbl(ct,1,&dummy,'.',&enhet);
+ if (fabs(enhet - Sys.GrId.pFil->TransPar.dEnhet) > LC_ACCY) {
+ LB_FormaterEnhet(err().tx,LC_ERR_LEN,
+ LN_GetNavn(&(Sys.GrId.pFil->SosiNavn),navn_nr),
+ Sys.GrId.pFil->TransPar.dEnhet);
+ LC_Error(57,"(LX_PutGi)",err().tx);
+ sLagre = UT_FALSE;
+ }
+ }
+
+ /* ...ENHET-H i filhode på fil med data */
+ if (Sys.GrId.lNr == 0L && Sys.GrId.pFil->lAntGr > 1 && navn_nr == L_ENHET3H) {
+ /* Sjekk at enhet ikke er endret */
+ UT_StrDbl(ct,1,&dummy,'.',&enhet);
+ if (fabs(enhet - Sys.GrId.pFil->TransPar.dEnhet_h) > LC_ACCY) {
+ LB_FormaterEnhet(err().tx,LC_ERR_LEN,
+ LN_GetNavn(&(Sys.GrId.pFil->SosiNavn),navn_nr),
+ Sys.GrId.pFil->TransPar.dEnhet_h);
+ LC_Error(57,"(LX_PutGi)",err().tx);
+ sLagre = UT_FALSE;
+ }
+ }
+
+ /* ...ENHET-D i filhode på fil med data */
+ if (Sys.GrId.lNr == 0L && Sys.GrId.pFil->lAntGr > 1 && navn_nr == L_ENHET3D) {
+ /* Sjekk at enhet ikke er endret */
+ UT_StrDbl(ct,1,&dummy,'.',&enhet);
+ if (fabs(enhet - Sys.GrId.pFil->TransPar.dEnhet_d) > LC_ACCY) {
+ LB_FormaterEnhet(err().tx,LC_ERR_LEN,
+ LN_GetNavn(&(Sys.GrId.pFil->SosiNavn),navn_nr),
+ Sys.GrId.pFil->TransPar.dEnhet_d);
+ LC_Error(57,"(LX_PutGi)",err().tx);
+ sLagre = UT_FALSE;
+ }
+ }
+
+ /* ..NGIS-LAG i filhode på fil med data */
+ if (Sys.GrId.lNr == 0L && Sys.GrId.pFil->lAntGr > 1 && navn_nr == L_NGISLAG) {
+
+ /* Sjekk at ..NGIS-LAG ikke er endret */
+ pszNgisLag = ct;
+
+ // Filen har ikke NGIS-LAG eller NGIS-LAG er endret
+ //if (lNgisLag != Sys.GrId.pFil->lNgisLag) {
+ if (*(Sys.GrId.pFil->szNgisLag) == '\0' ||
+ strcmp(pszNgisLag,Sys.GrId.pFil->szNgisLag) != 0) {
+
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s %s",
+ LN_GetNavn(&(Sys.GrId.pFil->SosiNavn),navn_nr),
+ Sys.GrId.pFil->szNgisLag);
+ LC_Error(58,"(LX_PutGi)",err().tx);
+ sLagre = UT_FALSE;
+ }
+ }
+
+ /* ..ORIGO-NØ i filhode på fil med data */
+ if (Sys.GrId.lNr == 0L && Sys.GrId.pFil->lAntGr > 1 && navn_nr == L_ORIGONO) {
+
+ /* Sjekk at ..ORIGO-NØ ikke er endret */
+ UT_StrDbl(ct,1,&dummy,'.',&dNord);
+ UT_StrDbl(ct,dummy,&dummy,'.',&dAust);
+
+ if (fabs(dNord - Sys.GrId.pFil->TransPar.Origo.dNord) > 0.1 ||
+ fabs(dAust - Sys.GrId.pFil->TransPar.Origo.dAust) > 0.1 ) {
+
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %s %.0f %.0f",
+ LN_GetNavn(&(Sys.GrId.pFil->SosiNavn),navn_nr),
+ Sys.GrId.pFil->TransPar.Origo.dNord, Sys.GrId.pFil->TransPar.Origo.dAust);
+ LC_Error(60,"(LX_PutGi)",err().tx);
+ sLagre = UT_FALSE;
+ }
+ }
+
+ // ..OBJTYPE
+ if (navn_nr == L_OBJTYPE) {
+ UT_StrCopy(Sys.pGrInfo->szObjtype,ct,LC_MAX_OBJTYPE_LEN);
+ }
+
+ /* Referanser */
+ if (navn_nr == L_REF1 || navn_nr == L_REF2) {
+ Sys.pGrInfo->info |= GI_REF;
+ if (LN_TestOy(ginfo)) Sys.pGrInfo->info |= GI_OY_REF;
+
+#ifdef UTGAAR
+ /* Gruppen har høyde informasjon */
+ } else if (navn_nr == L_HOYDE) {
+ Sys.pGrInfo->info |= GI_NAH; /* Husk at gruppen har høyde */
+#endif
+ }
+ }
+ }
+
+
+ if (sLagre == UT_TRUE) {
+ /* Linjen lagres */
+ sGmlLen = (short)strlen(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr - 1]);
+ sNyLen = (short)strlen(cs);
+
+ /* Samme lengde, trenger ikke å flytte noe i buffer */
+ if (sNyLen == sGmlLen) {
+ //strcpy(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr - 1], cs);
+ UT_memcpy(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr - 1], sNyLen+1, cs, sNyLen+1);
+
+ /* Siste linje i GINFO, trenger ikke å flytte noe i buffer */
+ } else if (lin_nr == Sys.pGrInfo->ngi) {
+ //strcpy(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr - 1],cs);
+ UT_memcpy(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr - 1], sNyLen+1, cs, sNyLen+1);
+
+ /* Oppdater antall tegn brukt i GINFO-buffer */
+ Sys.pGrInfo->ulGiLen = Sys.pGrInfo->ulGiLen - sGmlLen + sNyLen;
+
+ /* Må flytte resten av buffer for å tilpasse plassen */
+ } else {
+ memmove(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr] - sGmlLen + sNyLen,
+ Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr],
+ Sys.pGrInfo->ulGiLen - Sys.Ginfo.ulOfset[lin_nr]);
+ //strcpy(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr - 1],cs);
+ UT_memcpy(Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr - 1], sNyLen+1, cs, sNyLen+1);
+
+ /* Oppdater antall tegn brukt i GINFO-buffer */
+ Sys.pGrInfo->ulGiLen += (sNyLen - sGmlLen);
+ /* Oppdater pekere til GINFO linjene */
+ LX_CreGiPeker(&Sys.Ginfo,Sys.pGrInfo->ngi);
+ }
+ }
+}
+
+/*
+AR-930609
+CH LX_CreGiPeker Bygg opp pekertabell til GINFO
+CD ==========================================================================
+CD Formål:
+CH Bygg opp pekertabell til GINFO buffer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_GINFO *pGinfo i Peker til GINFO struktur
+CD short ngi i Ant. GINFO linjer
+CD
+CD Bruk:
+CD LX_CreGiPeker(&Sys.Ginfo,Sys.pGrInfo->ngi);
+ ==========================================================================
+*/
+void LX_CreGiPeker(LC_GINFO_BUFFER * pGinfo,short ngi)
+{
+ short i;
+ unsigned long *pulOfset = pGinfo->ulOfset;
+ char *cp = pGinfo->pszTx;
+
+ /* Første GINFO starter alltid i posisjon 0 */
+ *pulOfset++ = 0;
+
+ /* Skanner strengen og finner startposisjonen for resten av GINFO */
+ for (i=1; i<ngi; ++i) {
+ cp = strchr(cp,'\0') + 1;
+ *pulOfset++ = (unsigned long) (cp - pGinfo->pszTx);
+ }
+}
+
+
+/*
+AR-930609
+CH LX_GetGi Intern get GINFO-linje
+CD ==========================================================================
+CD Formål:
+CD Henter en GINFO-linje som en streng rent generellt.
+CD Dette omfatter også serienummer og referansenummer.
+CD Returnerer peker til den aktuelle strengen i GINFO-buffer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short lin_nr i Linjenummer i GINFO (1 er første linje)
+CD char *ginfo r Peker til GINFO-streng avslutta med '\0'
+CD
+CD Bruk:
+CD ginfo = LX_GetGi(lin_nr);
+ ==========================================================================
+*/
+char *LX_GetGi(short lin_nr)
+{
+ return Sys.Ginfo.pszTx + Sys.Ginfo.ulOfset[lin_nr - 1];
+}
+
+
+/*
+AR-930609
+CH LC_GetGi Get GINFO-linje
+CD ==========================================================================
+CD Formål:
+CD Henter en GINFO-linje som en streng rent generellt.
+CD Dette omfatter også serienummer og referansenummer.
+CD Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk strcpy).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short lin_nr i Linjenummer i GINFO (1 er første linje)
+CD char *ginfo r Peker til GINFO-streng avslutta med '\0'
+CD
+CD Bruk:
+CD ginfo = LC_GetGi(lin_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA char *LC_GetGi(short lin_nr)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ if (lin_nr > 0 && lin_nr <= Sys.pGrInfo->ngi) { /* Lovlig linje ? */
+
+ UT_StrCopy(retur_str,LX_GetGi(lin_nr),LC_MAX_SOSI_LINJE_LEN);
+
+ } else { /* Ulovlig linjenummer */
+ *retur_str = '\0';
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_GetGi)","");
+ *retur_str = '\0';
+ }
+
+ return retur_str;
+}
+
+
+/*
+AR-910219
+CH LC_PutTK Put koordinat
+CD ==========================================================================
+CD Formål:
+CD Legger inn et punkts koordinater (n,ø) i meter i terreng
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD double aust i Øst-koordinat i meter i terreng
+CD double nord i Nord-koordinat i meter i terreng
+CD
+CD Bruk:
+CD LC_PutTK(punkt_nr,aust,nord);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_PutTK(long punkt_nr,double aust,double nord)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+
+ *(Sys.pdAust + punkt_nr - 1) = aust; /* Øst */
+ *(Sys.pdNord + punkt_nr - 1) = nord; /* Nord */
+
+ Sys.sGrEndra = END_ENDRA;
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_PutTK)",err().tx);
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutTK)","");
+ }
+}
+
+
+/*
+AR-930609
+CH LC_GetTK Get koordinat
+CD ==========================================================================
+CD Formål:
+CD Henter et punkts koordinater (ø,n) i meter i terreng
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD double *aust u Øst-koordinat i meter i terreng
+CD double *nord u Nord-koordinat i meter i terreng
+CD
+CD Bruk:
+CD LC_GetTK(punkt_nr,&aust,&nord);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_GetTK(long punkt_nr,double *aust,double *nord)
+{
+ /* Aktuell gruppe OK? */
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ /* Lovlig punkt ? */
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) {
+ *aust = *(Sys.pdAust + punkt_nr - 1); /* Øst */
+ *nord = *(Sys.pdNord + punkt_nr - 1); /* Nord */
+
+ /* Ulovlig punktnummer */
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_GetTK)",err().tx);
+ }
+ }
+}
+
+
+/*
+AR-930617
+CH LC_GetArrayTK Hent tabell med koordinater
+CD ==========================================================================
+CD Formål:
+CD Henter tabell med koordinater (ø,n) i meter i terreng
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short retning i Buffer-retning:
+CD HENT_FORRFRA ( 1) = vanlig,
+CD HENT_BAKFRA (-1) = buffer skal snues.
+CD long max_antall i Max antall punkt som kan hentes
+CD long fra_punkt i Fra punktnummer (1 eller nko er første punkt)
+CD double *aust u Peker til tab. for øst-koordinater
+CD double *nord u Peker til tab. for nord-koordinater
+CD long *antall u Antall punkt hentet
+CD
+CD Bruk:
+CD LC_GetArrayTK(retning,max_antall,fra_punkt,aust,nord,&lest);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_GetArrayTK(short retning,long max_antall,long fra_punkt,
+ double *aust,double *nord,long *antall)
+{
+ long ant = 0;
+ long pt;
+ double *pdA,*pdN;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ /* Hent bakfra */
+ if (retning == HENT_BAKFRA) {
+ if (fra_punkt > Sys.pGrInfo->nko) fra_punkt = Sys.pGrInfo->nko;
+ pt = fra_punkt - 1;
+ pdA = Sys.pdAust + pt;
+ pdN = Sys.pdNord + pt;
+ while (ant < max_antall && pt >= 0) {
+ ++ant;
+ *aust++ = *pdA--; /* Øst */
+ *nord++ = *pdN--; /* Nord */
+ --pt;
+ }
+
+ /* Hent forrfra */
+ } else {
+ if (fra_punkt < 1) fra_punkt = 1;
+ pt = fra_punkt - 1;
+ pdA = Sys.pdAust + pt;
+ pdN = Sys.pdNord + pt;
+ while (ant < max_antall && pt < Sys.pGrInfo->nko) {
+ ++ant;
+ *aust++ = *pdA++; /* Øst */
+ *nord++ = *pdN++; /* Nord */
+ ++pt;
+ }
+ }
+ }
+
+ *antall = ant;
+}
+
+
+/*
+AR-940630
+CH LC_GetArrayTH Hent tabell med høyder
+CD ==========================================================================
+CD Formål:
+CD Henter tabell med høyder
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short retning i Buffer-retning:
+CD HENT_FORRFRA ( 1) = vanlig,
+CD HENT_BAKFRA (-1) = buffer skal snues.
+CD long max_antall i Max antall punkt som kan hentes
+CD long fra_punkt i Fra punktnummer (1 eller nko er første punkt)
+CD double *aust u Peker til tab. for høyder
+CD long *antall u Antall punkt hentet
+CD
+CD Bruk:
+CD LC_GetArrayTH(retning,max_antall,fra_punkt,hoyde,&lest);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_GetArrayTH(short retning,long max_antall,long fra_punkt,
+ double *hoyde,long *antall)
+{
+ short gilin;
+ char *gp;
+ long pt;
+ double dGiHoyde;
+ long ant = 0;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ /* Hent høyde fra GINFO */
+ gilin = 2;
+ gp = LC_GetGP(LN_GetNavn(&Sys.GrId.pFil->SosiNavn,L_HOYDE),
+ &gilin,Sys.pGrInfo->ngi);
+ if (gp != NULL) {
+ dGiHoyde = strtod(gp,&gp);
+
+ } else {
+ dGiHoyde = HOYDE_MANGLER;
+ }
+
+ /* Hent aktuelle høyder i punktene */
+
+ /* Hent bakfra */
+ if (retning == HENT_BAKFRA) {
+ if (fra_punkt > Sys.pGrInfo->nko) fra_punkt = Sys.pGrInfo->nko;
+ pt = fra_punkt - 1;
+ while (ant < max_antall && pt >= 0) {
+ ++ant;
+
+ if ((Sys.pGrInfo->info & GI_NAH) != 0 &&
+ (Sys.pInfo + pt)->dHoyde != HOYDE_MANGLER) {
+ *hoyde++ = (Sys.pInfo + pt)->dHoyde;
+
+ } else {
+ *hoyde++ = dGiHoyde;
+ }
+
+ pt--;
+ }
+
+ /* Hent forrfra */
+ } else {
+ if (fra_punkt < 1) fra_punkt = 1;
+ pt = fra_punkt - 1;
+ while (ant < max_antall && pt < Sys.pGrInfo->nko) {
+ ++ant;
+
+ if ((Sys.pGrInfo->info & GI_NAH) != 0 &&
+ (Sys.pInfo + pt)->dHoyde != HOYDE_MANGLER) {
+ *hoyde++ = (Sys.pInfo + pt)->dHoyde;
+
+ } else {
+ *hoyde++ = dGiHoyde;
+ }
+
+ ++pt;
+ }
+ }
+ }
+
+ *antall = ant;
+}
+
+
+/*
+AR-940630
+CH LC_PutTH Put høyde
+CD ==========================================================================
+CD Formål:
+CD Legger inn et punkts høyde i meter i terreng
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD double hoyde i Høyde i meter i terreng. Konstanten
+CD HOYDE_MANGLER (-999.999) angir at punktet ikke
+CD har høydeverdi.
+CD
+CD Bruk:
+CD LC_PutTH(punkt_nr,hoyde);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_PutTH(long punkt_nr, double hoyde)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+
+ if ((Sys.pGrInfo->info & GI_NAD) == 0) {
+
+ if (hoyde != HOYDE_MANGLER) Sys.pGrInfo->info |= GI_NAH; // Husker at gruppen har høyde
+
+ (Sys.pInfo + punkt_nr - 1)->dHoyde = hoyde;
+
+ Sys.sGrEndra = END_ENDRA;
+ if (punkt_nr == Sys.lPibufPnr) Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Gruppen har ..NAD fra før og det prøves å legge inne en høyde */
+ } else if (hoyde != HOYDE_MANGLER) {
+ LC_Error(132,"(LC_PutTH)",LC_GetGi(1));
+ }
+
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_PutTH)",err().tx);
+ }
+ }
+}
+
+
+/*
+AR-9930609
+CH LC_GetTH Get høyde
+CD ==========================================================================
+CD Formål:
+CD Henter et punkts høyde i meter i terreng. (Henter BARE FRA PUNKTET.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD double *hoyde r Høyde i meter i terreng. Konstanten
+CD HOYDE_MANGLER (-999.999) angir at punktet ikke
+CD har høydeverdi.
+CD
+CD Bruk:
+CD hoyde = LC_GetTH(punkt_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA double LC_GetTH(long punkt_nr)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+ /* Gruppen har ..NAH */
+ if ((Sys.pGrInfo->info & GI_NAH) != 0) {
+ return (Sys.pInfo + punkt_nr - 1)->dHoyde;
+ }
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_GetTH)",err().tx);
+ }
+ }
+
+ return HOYDE_MANGLER;
+}
+
+
+/*
+AR-940630
+CH LC_GetHoyde Get høyde
+CD ==========================================================================
+CD Formål:
+CD Henter et punkts høyde i meter i terreng. (Henter fra punktet eller fra
+CD GINFO.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD double *hoyde r Høyde i meter i terreng. Konstanten
+CD HOYDE_MANGLER (-999.999) angir at punktet ikke
+CD har høydeverdi.
+CD
+CD Bruk:
+CD hoyde = LC_GetHoyde(punkt_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA double LC_GetHoyde(long punkt_nr)
+{
+ short gilin;
+ char *gp;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+ /* Gruppen har ..NAH */
+ if ((Sys.pGrInfo->info & GI_NAH) != 0) {
+ /* Punktet har høyde */
+ if ((Sys.pInfo + punkt_nr - 1)->dHoyde != HOYDE_MANGLER) {
+ return (Sys.pInfo + punkt_nr - 1)->dHoyde;
+ }
+ }
+
+ /* Punktet har ikke høyde, sjekk GINFO */
+ gilin = 2;
+ gp = LC_GetGP(LN_GetNavn(&Sys.GrId.pFil->SosiNavn,L_HOYDE),
+ &gilin,Sys.pGrInfo->ngi);
+ if (gp != NULL) {
+ return strtod(gp,&gp);
+ }
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_GetHoyde)",err().tx);
+ }
+ }
+
+ return HOYDE_MANGLER;
+}
+
+
+/*
+AR-940630
+CH LC_PutTD Put dybde
+CD ==========================================================================
+CD Formål:
+CD Legger inn et punkts dybde i meter i terreng
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD double hoyde i Dybde i meter i terreng. Konstanten
+CD HOYDE_MANGLER (-999.999) angir at punktet ikke
+CD har dybdeverdi.
+CD
+CD Bruk:
+CD LC_PutTD(punkt_nr,dybde);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_PutTD(long punkt_nr, double dybde)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko){ /* Lovlig punkt ? */
+
+ if ((Sys.pGrInfo->info & GI_NAH) == 0) {
+
+ if (dybde != HOYDE_MANGLER) Sys.pGrInfo->info |= GI_NAD;
+
+ (Sys.pInfo + punkt_nr - 1)->dHoyde = dybde;
+
+ Sys.sGrEndra = END_ENDRA;
+ if (punkt_nr == Sys.lPibufPnr) Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Gruppen har ..NAH fra før og det prøves å legge inn en dybde */
+ } else if (dybde != HOYDE_MANGLER) {
+ LC_Error(133,"(LC_PutTD)",LC_GetGi(1));
+ }
+
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_PutTD)",err().tx);
+ }
+ }
+}
+
+
+/*
+AR-940630
+CH LC_GetTD Get dybde
+CD ==========================================================================
+CD Formål:
+CD Henter et punkts dybde i meter i terreng. (Henter BARE FRA PUNKTET.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD double *dybde r Dybde i meter i terreng. Konstanten
+CD HOYDE_MANGLER (-999.999) angir at punktet ikke
+CD har dybdeverdi.
+CD
+CD Bruk:
+CD dybde = LC_GetTD(punkt_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA double LC_GetTD(long punkt_nr)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+ /* Gruppen har ..NAD */
+ if ((Sys.pGrInfo->info & GI_NAD) != 0) {
+ return (Sys.pInfo + punkt_nr - 1)->dHoyde;
+ }
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_GetTD)",err().tx);
+ }
+ }
+
+ return HOYDE_MANGLER;
+}
+
+
+/*
+AR-940630
+CH LC_GetDybde Get dybde
+CD ==========================================================================
+CD Formål:
+CD Henter et punkts dybde i meter i terreng. (Henter fra punktet eller fra
+CD GINFO.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD double *hoyde r Dybde i meter i terreng. Konstanten
+CD HOYDE_MANGLER (-999.999) angir at punktet ikke
+CD har høydeverdi.
+CD
+CD Bruk:
+CD dybde = LC_GetHoyde(punkt_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA double LC_GetDybde(long punkt_nr)
+{
+ short gilin;
+ char *gp;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+ /* Gruppen har ..NAD */
+ if ((Sys.pGrInfo->info & GI_NAD) != 0) {
+ /* Punktet har dybde */
+ if ((Sys.pInfo + punkt_nr - 1)->dHoyde != HOYDE_MANGLER) {
+ return (Sys.pInfo + punkt_nr - 1)->dHoyde;
+ }
+ }
+
+ /* Punktet har ikke dybde, sjekk GINFO */
+ gilin = 2;
+ gp = LC_GetGP(LN_GetNavn(&Sys.GrId.pFil->SosiNavn,L_DYBDE),
+ &gilin,Sys.pGrInfo->ngi);
+ if (gp != NULL) {
+ return strtod(gp,&gp);
+ }
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_GetHoyde)",err().tx);
+ }
+ }
+
+ return HOYDE_MANGLER;
+}
+
+
+/*
+AR-930609
+CH LC_GetPi Get PINFO
+CD ==========================================================================
+CD Formål:
+CD Henter punktinformasjon i angitte punkt som en streng.
+CD Strengen ligger i et felles "returbuffer" for alle get-rutiner i fyba.
+CD Dette blir ødelagt ved neste kall til en "get-rutine". For å ta vare på
+CD strengen må den kopieres over til egen streng. (Bruk strcpy).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD char *pinfo r Peker til punktinformasjon eksklusiv knutepunkt
+CD
+CD Bruk:
+CD pinfo = LC_GetPi(punkt_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA char *LC_GetPi(long punkt_nr)
+{
+ unsigned long ulOfset;
+
+ *retur_str = '\0';
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+
+ ulOfset = (Sys.pInfo+punkt_nr-1)->ulPiOfset;
+
+ if (ulOfset != LC_INGEN_PINFO) {
+ UT_StrCopy(retur_str,Sys.pszPinfo+ulOfset,LC_MAX_SOSI_LINJE_LEN);
+
+ }
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_GetPi)",err().tx);
+ }
+ }
+
+ return retur_str;
+}
+
+
+/*
+AR-930609
+CH LC_PutPi Put PINFO
+CD ==========================================================================
+CD Formål:
+CD Legger inn hele punktinformasjonen på angitte punkt
+CD Ny verdi skriver over eksisterende verdi.
+CD Verdi "" fjerner eksisterende PINFO.
+CD Knutepunkt legges inn med LC_PutKp.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD char *pinfo i PINFO-streng som skal legges inn
+CD (Knutepunkt regnes ikke som pinfo)
+CD short sStatus r UT_TRUE = OK,
+CD UT_FALSE = ikke utført (for lite plass tilgjengelig)
+CD
+CD Bruk:
+CD sStatus = LC_PutPi(punkt_nr,pinfo);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_PutPi(long punkt_nr, const char *pinfo)
+{
+ short sNyLen, sGmlLen;
+ long pt;
+ unsigned long ulOfset;
+ char *pszBuffer = NULL;
+ short sStatus = UT_FALSE;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+
+ /* Fjern blanke i starten */
+ while (UT_IsSpace(*pinfo)) {
+ ++pinfo;
+ }
+ sNyLen = (short)strlen(pinfo);
+
+ if (sNyLen > 0) {
+ /* Ta kopi av strengen */
+ pszBuffer = (char*)UT_MALLOC(sNyLen+1);
+ UT_StrCopy(pszBuffer,pinfo,sNyLen+1);
+ pinfo = pszBuffer;
+
+ /* Fjern blanke på slutten */
+ UT_ClrTrailsp(pszBuffer);
+ sNyLen = (short)strlen(pszBuffer);
+ }
+
+ /* Gammel lengde av PINFO */
+ ulOfset = (Sys.pInfo+punkt_nr-1)->ulPiOfset;
+ if (ulOfset == LC_INGEN_PINFO) {
+ sGmlLen = 0;
+ } else {
+ sGmlLen = (short)strlen(Sys.pszPinfo+ulOfset);
+ }
+
+ /* --------------------- Blank ut PINFO */
+ if (sNyLen == 0) {
+ /* Punktet har PINFO fra før */
+ if (sGmlLen > 0) {
+ /* Merk at punktet ikke har PINFO */
+ (Sys.pInfo+punkt_nr-1)->ulPiOfset = LC_INGEN_PINFO;
+
+ /* Pakk innholdet i bufferet */
+ memmove(Sys.pszPinfo + ulOfset,
+ Sys.pszPinfo + ulOfset + sGmlLen + 1,
+ Sys.pGrInfo->ulPiLen - ulOfset - sGmlLen - 1);
+
+ /* Oppdater ofset for resten av gruppen */
+ /* if (Sys.pGrInfo->ulPiLen > ulOfset + sGmlLen + 1) { */
+ for (pt=punkt_nr; pt < Sys.pGrInfo->nko; ++pt) {
+ if ((Sys.pInfo+pt)->ulPiOfset != LC_INGEN_PINFO) {
+ (Sys.pInfo+pt)->ulPiOfset -= (sGmlLen + 1);
+ }
+ }
+ /* } */
+
+ /* Ny totallengde av PINFO i denne gruppen */
+ Sys.pGrInfo->ulPiLen -= sGmlLen;
+ }
+
+
+ /* --------------------- Legg inn PINFO */
+ } else {
+
+ /* Sjekk om det blir plass til den nye PINFO'en */
+ if (((long)Sys.pGrInfo->ulPiLen - (long)sGmlLen + (long)sNyLen) < LC_MAX_PINFO_BUFFER) {
+ sStatus = UT_TRUE;
+
+ /* Punktet har ikke PINFO fra før */
+ if (sGmlLen == 0) {
+ /* Søk mot starten av gruppen for å finne slutten av forrige PINFO */
+ ulOfset = 0;
+ for (pt=punkt_nr-2; pt>=0; pt--) {
+ if ((Sys.pInfo+pt)->ulPiOfset != LC_INGEN_PINFO) {
+ /* ulOfset = (strlen(Sys.pszPinfo+(Sys.pInfo+pt)->ulPiOfset) + 1); */
+ ulOfset = (Sys.pInfo+pt)->ulPiOfset +
+ strlen(Sys.pszPinfo+(Sys.pInfo+pt)->ulPiOfset) + 1;
+ break; /* ---> avbryter for-løkka */
+ } /* endif */
+ } /* endfor */
+
+ /* Husk ofset */
+ (Sys.pInfo+punkt_nr-1)->ulPiOfset = ulOfset;
+
+ /* Flytt innholdet i bufferet */
+ memmove(Sys.pszPinfo + ulOfset + sNyLen + 1,
+ Sys.pszPinfo + ulOfset,
+ Sys.pGrInfo->ulPiLen - ulOfset);
+
+ /* Oppdater ofset for resten av gruppen */
+ /* if (Sys.pGrInfo->ulPiLen > ulOfset + sGmlLen + 1) { */
+ for (pt=punkt_nr; pt < Sys.pGrInfo->nko; ++pt) {
+ if ((Sys.pInfo+pt)->ulPiOfset != LC_INGEN_PINFO) {
+ (Sys.pInfo+pt)->ulPiOfset += (sNyLen + 1);
+ }
+ }
+ /* } */
+
+ /* Kopier inn strengen */
+ //strcpy(Sys.pszPinfo+ulOfset, pinfo);
+ UT_memcpy(Sys.pszPinfo+ulOfset, sNyLen+1, pinfo, sNyLen+1);
+
+ /* Ny totallengde */
+ Sys.pGrInfo->ulPiLen += (sNyLen + 1);
+
+ /* Samme lengde, trenger ikke å flytte noe i buffer */
+ } else if (sNyLen == sGmlLen) {
+ //strcpy(Sys.pszPinfo+ulOfset, pinfo);
+ UT_memcpy(Sys.pszPinfo+ulOfset, sNyLen+1, pinfo, sNyLen+1);
+
+ /* Punktet har PINFO, men med annen lengde */
+ } else {
+ /* Flytt innholdet i bufferet */
+ memmove(Sys.pszPinfo + ulOfset + sNyLen + 1,
+ Sys.pszPinfo + ulOfset + sGmlLen + 1,
+ Sys.pGrInfo->ulPiLen - ulOfset - sGmlLen - 1);
+
+ /* Kopier inn strengen */
+ //strcpy(Sys.pszPinfo+ulOfset, pinfo);
+ UT_memcpy(Sys.pszPinfo+ulOfset, sNyLen+1, pinfo, sNyLen+1);
+
+ /* Oppdater ofset for resten av gruppen */
+ /* if (Sys.pGrInfo->ulPiLen > ulOfset + sGmlLen + 1) { */
+ for (pt=punkt_nr; pt < Sys.pGrInfo->nko; ++pt) {
+ if ((Sys.pInfo+pt)->ulPiOfset != LC_INGEN_PINFO) {
+ (Sys.pInfo+pt)->ulPiOfset += (sNyLen - sGmlLen);
+ }
+ }
+ /* } */
+
+ /* Ny totallengde */
+ Sys.pGrInfo->ulPiLen += (sNyLen - sGmlLen);
+ }
+ }
+
+ /* Husk at gruppen har PINFO */
+ Sys.pGrInfo->info |= GI_PINFO;
+ }
+
+ /* Husk at gruppen er endret */
+ Sys.sGrEndra = END_ENDRA;
+ if (punkt_nr == Sys.lPibufPnr) Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Frigir midlertidig buffer */
+ if (pszBuffer != NULL) UT_FREE(pszBuffer);
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_PutPi)",err().tx);
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutPi)","");
+ }
+
+ return sStatus;
+}
+
+
+/*
+AR-930609
+CH LC_TestPi Sjekk om punkt har PINFO
+CD ==========================================================================
+CD Formål:
+CD Sjekker om et punkt har PINFO i en eller annen form.
+CD (PINFO, KP, høyde.)
+CD Høyde handteres ikke foreløpig.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD short sTestHoyde i Bryter for å si om høyde skal regnes med i sjekken.
+CD short sStatus r UT_TRUE=har "pinfo", UT_FALSE=har ikke "pinfo"
+CD
+CD Bruk:
+CD sStatus = LC_TestPi(punkt_nr,UT_TRUE);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_TestPi(long punkt_nr,short sTestHoyde)
+{
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+
+ /* ==> Høyde skal behandles */
+ if (sTestHoyde) {
+ /* if (Sys.pGrInfo->info & GI_NAH) return UT_TRUE; */
+ return UT_TRUE;
+ }
+
+ /* ==> Har PINFO */
+ if ((Sys.pInfo+punkt_nr-1)->ulPiOfset != LC_INGEN_PINFO) {
+ return UT_TRUE;
+
+ /* ==> Har KP */
+ } else if ((Sys.pInfo+punkt_nr-1)->sKp != 0) {
+ return UT_TRUE;
+ }
+
+ } else { /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_GetPi)",err().tx);
+ }
+ }
+
+ return UT_FALSE;
+}
+
+
+/*
+AR-930609
+CH LC_GetKp Get knutepunkt
+CD ==========================================================================
+CD Formål:
+CD Henter knutepunktverdi i punktet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD short kp_type r Knutepunkttype (1-4095)
+CD (0 = punktet har ikke knutepunkt)
+CD
+CD Bruk:
+CD kp = LC_GetKp(punkt_nr);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA short LC_GetKp(long punkt_nr)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE){ /* Aktuell gruppe OK */
+
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko){ /* Lovlig punkt ? */
+ return (Sys.pInfo+punkt_nr-1)->sKp;
+
+ } else{ /* Ulovlig punktnummer */
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_GetKp)",err().tx);
+ }
+ }
+
+ return (0);
+}
+
+
+/*
+AR-930609
+CH LC_PutKp Put knutepunkt
+CD ==========================================================================
+CD Formål:
+CD Legger inn knutepunktverdi i punktet. Ny verdi skrives over eksisterende
+CD verdi. (Multiple KP er ikke mulig.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long punkt_nr i Punktnummer (1 er første punkt)
+CD short kp i Knutepunkt (lovlig verdi 0 - SHRT_MAX)
+CD kp == 0 fjerner knutepunkt.
+CD
+CD Bruk:
+CD LC_PutKp(punkt_nr,kp);
+ ==========================================================================
+*/
+SK_EntPnt_FYBA void LC_PutKp(long punkt_nr, short kp)
+{
+ if (Sys.GrId.lNr != INGEN_GRUPPE) { /* Aktuell gruppe OK */
+ if (punkt_nr > 0 && punkt_nr <= Sys.pGrInfo->nko) { /* Lovlig punkt ? */
+ if (kp >= 0 && kp < SHRT_MAX) {
+ if (kp != 0) Sys.pGrInfo->info |= GI_KP; /* Merk at gruppen har KP */
+
+ (Sys.pInfo+punkt_nr-1)->sKp = kp;
+
+ Sys.sGrEndra = END_ENDRA;
+ if (punkt_nr == Sys.lPibufPnr) Sys.sPibufStatus = LC_PIBUF_TOM;
+
+ /* Husk at det finnes KP i filen */
+ if (kp > 0) {
+ if ( Sys.GrId.pFil->SosiNiv[1] < 3) {
+ Sys.GrId.pFil->SosiNiv[1] = 3;
+ }
+ }
+
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN," %d",kp);
+ LC_Error(53,"(LC_PutKp)",err().tx);
+ }
+
+ } else {
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"(%s) %ld",LC_GetGi(1),punkt_nr);
+ LC_Error(51,"(LC_PutKp)",err().tx);
+ }
+
+ } else { /* Ingen aktuell gruppe */
+ LC_Error(49,"(LC_PutKp)","");
+ }
+}
+
+
+/*
+AR-911106
+CH LC_BerAreal Beregn areal av aktuell FLATE
+CD ==========================================================================
+CD Formål:
+CD Beregner arealet av aktuell gruppe hvis denne er flate.
+CD Referansene brukes for arealberegningen.
+CD Tar hensyn til fradrag for øyer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double areal u Beregnet areal
+CD
+CD Bruk:
+CD areal = LC_BerAreal();
+ =============================================================================
+*/
+SK_EntPnt_FYBA double LC_BerAreal(void)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ #define MAX_REFERANSE 20
+ long ref_arr[MAX_REFERANSE];
+ unsigned char ref_status[MAX_REFERANSE];
+ long ant_ref;
+ short s,retning;
+ LC_GRF_STATUS GrfStat;
+ LC_BGR BgrFlate,Bgr;
+
+ double dTotalAreal = 0.0;
+ double dDelAreal = 0.0;
+
+ /* Husk gruppenummer for flaten */
+ LC_GetGrNr(&BgrFlate);
+ Bgr.pFil = BgrFlate.pFil;
+
+
+ /* Behandle ytre avgrensing */
+ LC_InitGetRefFlate(&GrfStat);
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REFERANSE);
+ do {
+ for (s=0; s<ant_ref; ++s) {
+ Bgr.lNr = ref_arr[s];
+ retning = (ref_status[s] & LC_MED_DIG)?
+ HENT_FORRFRA : HENT_BAKFRA;
+ dTotalAreal += LX_ArealGruppe(&Bgr,retning);
+ }
+ /* Les inn flaten igjen */
+ LC_RxGr(&BgrFlate,LES_OPTIMALT,&ngi,&nko,&info);
+
+ if (ant_ref < MAX_REFERANSE) break;
+
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_YTRE,ref_arr,ref_status,MAX_REFERANSE);
+ } while (ant_ref > 0);
+
+ /* Beregn endelig areal innenfor yttergrensen */
+ dTotalAreal = fabs(dTotalAreal / 2.0);
+
+
+ /* Behandler indre avgrensing (øy) */
+ LC_InitGetRefFlate(&GrfStat);
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_INDRE,ref_arr,ref_status,MAX_REFERANSE);
+ do {
+ for (s=0; s<ant_ref; ++s) {
+ if (ref_status[s] & GRF_START_OY) {
+ dDelAreal = 0.0;
+
+ } else if (ref_status[s] & GRF_SLUTT_OY) {
+ /* Beregn endelig areal innenfor yttergrensen */
+ dTotalAreal -= fabs(dDelAreal / 2.0);
+
+ } else {
+ Bgr.lNr = ref_arr[s];
+ retning = (ref_status[s] & LC_MED_DIG)?
+ HENT_FORRFRA : HENT_BAKFRA;
+ dDelAreal += LX_ArealGruppe(&Bgr,retning);
+ }
+ }
+ /* Les inn flaten igjen */
+ LC_RxGr(&BgrFlate,LES_OPTIMALT,&ngi,&nko,&info);
+
+ if (ant_ref < MAX_REFERANSE) break;
+
+ ant_ref = LC_GetRefFlate(&GrfStat,GRF_INDRE,ref_arr,ref_status,MAX_REFERANSE);
+ } while (ant_ref > 0);
+
+ return dTotalAreal;
+}
+
+
+/*
+AR-900731
+CH LX_BerArealGruppe Beregn areal "arealandel" av aktuell gruppe
+CD ==========================================================================
+CD Formål:
+CD Beregner areal av polygon angitt av yttergrensen av aktuell gruppe.
+CD Forutsetter .FLATE og det er referansene som brukes i arealberegningen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_BGR * pBgr i Gruppepeker
+CD short retning i HENT_FORRFRA eller HENT_BAKFRA
+CD double areal u Beregnet areal
+CD
+CD Bruk:
+CD areal = LX_ArealGruppe(&Bgr,retning);
+ =============================================================================
+*/
+static double LX_ArealGruppe(LC_BGR * pBgr,short retning)
+{
+ #define ARR_LEN 50
+ short ngi, gruppenavn;
+ long nko, pt, antall, punkt;
+ unsigned short info;
+ short storbue;
+ double a1,n1,a2,n2,a3,n3,radius,as,ns,fi,dfi;
+ double n_arr[ARR_LEN],a_arr[ARR_LEN];
+ double a_forrige=0.0, n_forrige=0.0, a, n;
+ short forste;
+ double areal_seg = 0.0;
+ double areal_poly = 0.0;
+
+ gruppenavn = LC_RxGr(pBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ if (nko > 0) {
+ if (gruppenavn == L_BUE) { /* .BUE */
+ if (LC_GetBue(retning,&a1,&n1,&a2,&n2,&radius,&storbue)){
+ areal_poly += (a1 - a2) * (n1 + n2);
+ /* Sektoren */
+ if (GM_KonvBue(a1,n1,a2,n2,radius,storbue,
+ &as,&ns,&fi,&dfi)){
+ areal_seg += (radius*radius*(dfi-sin(dfi)));
+ }
+ }
+
+ } else if (gruppenavn == L_BUEP){ /* .BUEP */
+ if (LC_GetBuep(retning,&a1,&n1,&a2,&n2,&a3,&n3)) {
+ areal_poly += (a1 - a3) * (n1 + n3);
+ /* Sektoren */
+ if (GM_KonvBuep(a1,n1,a2,n2,a3,n3,
+ &as,&ns,&radius,&fi,&dfi)) {
+ areal_seg += (radius*radius*(dfi-sin(dfi)));
+ }
+ }
+
+ } else if (gruppenavn == L_SIRKEL) { /* .SIRKEL */
+ if (LC_GetSirkel(&as,&ns,&radius)) {
+ /* Dobbelt areal av sirkelen */
+ areal_seg = 2.0 * PI * radius * radius;
+ }
+
+ } else if (gruppenavn == L_SIRKELP) { /* .SIRKELP */
+ if (LC_GetSirkelp(&a1,&n1,&a2,&n2,&a3,&n3)) {
+ if (GM_KonvSirkelp(a1,n1,a2,n2,a3,n3,
+ &as,&ns,&radius,&fi,&dfi)) {
+ /* Dobbelt areal av sirkelen */
+ areal_seg = 2.0 * PI * radius * radius;
+ }
+ }
+
+ } else { /* Annen gruppe */
+ punkt = (retning == HENT_FORRFRA)? 1 : nko;
+ forste = UT_TRUE;
+
+ do { /* Beregn areal */
+ LC_GetArrayTK(retning,ARR_LEN,punkt,a_arr,n_arr,&antall);/* Henter */
+ if (antall > 0) {
+ if (forste) {
+ a_forrige = a_arr[0];
+ n_forrige = n_arr[0];
+ forste = UT_FALSE;
+ }
+ for (pt=1; pt<antall; ++pt) {
+ a = a_arr[pt];
+ n = n_arr[pt];
+ areal_poly += (a_forrige - a) * (n_forrige + n);
+ a_forrige = a;
+ n_forrige = n;
+ }
+
+ if (retning == HENT_FORRFRA) {
+ punkt += (antall-1);
+ if (punkt >= nko) antall = 0;
+ } else{
+ punkt -= (antall-1);
+ if (punkt <= 1) antall = 0;
+ }
+ }
+ } while (antall == ARR_LEN);
+ }
+ }
+
+ return (areal_poly + areal_seg);
+}
+
+
+/*
+AR-911106
+CH LC_BerLengde Beregn horisontal lengde av aktuell gruppe
+CD ==========================================================================
+CD Formål:
+CD Beregn horisontal lengde av aktuell gruppe.
+CD Tar ikke hensyn til høyde/dybde.
+CD Referansene brukes IKKE i beregningen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double lengde u Beregnet lengde
+CD
+CD Bruk:
+CD areal = LC_BerLengde();
+=============================================================================
+*/
+SK_EntPnt_FYBA double LC_BerLengde(void)
+{
+ short sfeil;
+ long l;
+ double a1,n1,a2,n2,rx,as,ns,fi,dfi;
+ double lengde = 0.0;
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE) {
+ if (Sys.pGrInfo->gnavn == L_LINJE || Sys.pGrInfo->gnavn == L_KURVE) {
+ for (l=2; l<=Sys.pGrInfo->nko; ++l) {
+ LC_GetTK(l-1,&a1,&n1);
+ LC_GetTK(l,&a2,&n2);
+ lengde += sqrt((n2-n1)*(n2-n1)+(a2-a1)*(a2-a1));
+ }
+
+ // Handterer "bue"
+ } else if (Sys.pGrInfo->gnavn == L_BUE || Sys.pGrInfo->gnavn == L_BUEP ||
+ Sys.pGrInfo->gnavn == L_SIRKEL || Sys.pGrInfo->gnavn == L_SIRKELP) {
+
+ if (LC_GetBuePar(HENT_FORRFRA,&as,&ns,&rx,&fi,&dfi,&sfeil)) {
+ lengde = fabs (rx * dfi);
+ }
+ }
+ }
+
+ return lengde;
+}
+
+
+/*
+AR-911106
+CH LC_BerLengde3D Beregn skrå lengde av aktuell gruppe
+CD ==========================================================================
+CD Formål:
+CD Beregn skrå lengde av aktuell gruppe.
+CD Krever at det finnes høyde/dybde i alle punkt.
+CD Referansene brukes IKKE i beregningen.
+CD Beregner bare for LINJE og KURVE.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double lengde u Beregnet lengde
+CD bool beregnet r Status som viser om lengde er beregnet
+CD
+CD Bruk:
+CD beregnet = LC_BerLengde3D(&skraa_lengde);
+=============================================================================
+*/
+SK_EntPnt_FYBA bool LC_BerLengde3D(double *skraa_lengde)
+{
+ long s;
+ double a1,n1,a2,n2,h1,h2,da,dn,dh;
+
+ bool beregnet = false;
+
+ *skraa_lengde = 0.0;
+
+
+ if (Sys.GrId.lNr != INGEN_GRUPPE)
+ {
+
+ // Beregn skrå lengde
+ if (Sys.pGrInfo->gnavn == L_LINJE || Sys.pGrInfo->gnavn == L_KURVE)
+ {
+ // Husk om gruppen har høyde/dybde
+ beregnet = ((Sys.pGrInfo->info & GI_NAH) || (Sys.pGrInfo->info & GI_NAD))? true : false;
+
+ for (s=2; beregnet && s<=Sys.pGrInfo->nko; s++)
+ {
+ LC_GetTK(s-1,&a1,&n1);
+ if (Sys.pGrInfo->info & GI_NAD)
+ {
+ h1 = LC_GetDybde(s-1);
+ }
+ else
+ {
+ h1 = LC_GetHoyde(s-1);
+ }
+
+ LC_GetTK(s,&a2,&n2);
+ if (Sys.pGrInfo->info & GI_NAD)
+ {
+ h2 = LC_GetDybde(s);
+ }
+ else
+ {
+ h2 = LC_GetHoyde(s);
+ }
+
+
+ if (h1 != HOYDE_MANGLER && h2 != HOYDE_MANGLER)
+ {
+ da = a2 - a1;
+ dn = n2 - n1;
+ dh = h2 - h1;
+ (*skraa_lengde) += sqrt(dn*dn + da*da + dh*dh);
+ }
+ else
+ {
+ beregnet = false;
+ }
+ }
+ }
+ }
+
+ return beregnet;
+}
+
+
+/*
+AR:2009-04-28
+CH LC_BerAvgrensLengde Beregn lengden av avgrensning av FLATE
+CD ==========================================================================
+CD Formål:
+CD Beregn lengden av avgrensningen av aktuell gruppe hvis denne er flate.
+CD Både indre og ytre avgrensning beregnes.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double lengde u Beregnet areal
+CD
+CD Bruk:
+CD lengde = LC_BerAvgrensLengde();
+=============================================================================
+*/
+SK_EntPnt_FYBA double LC_BerAvgrensLengde(void)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_BGR BgrFlate;
+ double dSumLengde = 0.0;
+
+ if (Sys.pGrInfo->info & GI_REF)
+ {
+ // Husk gruppenummer for flaten
+ LC_GetGrNr(&BgrFlate);
+
+ LC_POLYGON Polygon;
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+
+ LC_POL_ELEMENT * pPE;
+ // Ytre avgrensning
+ for(pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ dSumLengde += LC_BerLengde();
+ }
+
+ // Indre avgrensning
+ LC_OY_ELEMENT * pOE;
+ for (pOE = Polygon.OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ dSumLengde += LC_BerLengde();
+ }
+ }
+
+ // Frigi allokerte kjeder
+ LC_POL_FrigiPolygon(&Polygon);
+
+ // Les inn flaten igjen
+ LC_RxGr(&BgrFlate,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+
+ return dSumLengde;
+}
+
+
+/*
+AR:2009-04-28
+CH LC_BerIndreAvgrensLengde Beregn lengden av indre avgrensning av FLATE
+CD ==========================================================================
+CD Formål:
+CD Beregn lengden av indre avgrensningen av aktuell gruppe hvis denne er flate.
+CD Bare indre avgrensning beregnes.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double lengde u Beregnet lengde
+CD
+CD Bruk:
+CD lengde = LC_BerIndreAvgrensLengde();
+=============================================================================
+*/
+SK_EntPnt_FYBA double LC_BerIndreAvgrensLengde(void)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_BGR BgrFlate;
+ double dSumLengde = 0.0;
+
+ if (Sys.pGrInfo->info & GI_REF)
+ {
+ // Husk gruppenummer for flaten
+ LC_GetGrNr(&BgrFlate);
+
+ LC_POLYGON Polygon;
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+
+ // Indre avgrensning
+ LC_OY_ELEMENT * pOE;
+ LC_POL_ELEMENT * pPE;
+ for (pOE = Polygon.OyOA.pForsteOE; pOE != NULL; pOE = pOE->pNesteOE) {
+ for (pPE = pOE->PO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ dSumLengde += LC_BerLengde();
+ }
+ }
+
+ // Frigi allokerte kjeder
+ LC_POL_FrigiPolygon(&Polygon);
+
+ // Les inn flaten igjen
+ LC_RxGr(&BgrFlate,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+
+ return dSumLengde;
+}
+
+
+
+/*
+AR:2009-04-28
+CH LC_BerYtreAvgrensLengde Beregn lengden av ytre avgrensning av FLATE
+CD ==========================================================================
+CD Formål:
+CD Beregn lengden av ytre avgrensningen av aktuell gruppe hvis denne er flate.
+CD Bare ytre avgrensning beregnes.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double lengde u Beregnet lengde
+CD
+CD Bruk:
+CD lengde = LC_BerYtreAvgrensLengde();
+=============================================================================
+*/
+SK_EntPnt_FYBA double LC_BerYtreAvgrensLengde(void)
+{
+ short ngi;
+ long nko;
+ unsigned short info;
+ LC_BGR BgrFlate;
+ double dSumLengde = 0.0;
+
+ if (Sys.pGrInfo->info & GI_REF)
+ {
+ // Husk gruppenummer for flaten
+ LC_GetGrNr(&BgrFlate);
+
+ LC_POLYGON Polygon;
+ LC_POL_InitPolygon(&Polygon);
+ LC_POL_GetRef(&Polygon);
+
+ LC_POL_ELEMENT * pPE;
+ // Ytre avgrensning
+ for(pPE = Polygon.HovedPO.pForstePE; pPE != NULL; pPE = pPE->pNestePE) {
+ LC_RxGr(&pPE->Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ dSumLengde += LC_BerLengde();
+ }
+
+ // Frigi allokerte kjeder
+ LC_POL_FrigiPolygon(&Polygon);
+
+ // Les inn flaten igjen
+ LC_RxGr(&BgrFlate,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+
+ return dSumLengde;
+}
+
+
+/*
+AR-911106
+CH LC_DumpTab Dump interne tabeller til stderr
+CD ==========================================================================
+CD Formål:
+CD Dump interne tabeller til stderr
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LC_DumpTab();
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_DumpTab(void)
+{
+ short ngi,s;
+ long nko;
+ unsigned short info;
+ LC_BGR Bgr,AktBgr;
+
+ LC_GetGrNr(&AktBgr);
+
+ UT_FPRINTF(stderr,"\n=================================================\n");
+ UT_FPRINTF(stderr,"Dump av interne tabeller i FYBA\n");
+ UT_FPRINTF(stderr,"=================================================\n");
+
+ UT_FPRINTF(stderr,"\nLC_INGEN_PINFO = %lu\n", LC_INGEN_PINFO);
+
+ UT_FPRINTF(stderr,"\n Snr sosi_st rb_st rb_fgr rb_ngr gna ngi nko info GiLen PiLen\n");
+ LC_InitNextBgr(&Bgr);
+
+ /* Alle gruppene i framgrunn */
+ while (LC_NextBgr(&Bgr,LC_FRAMGR)) {
+ LC_RxGr(&Bgr,LES_OPTIMALT,&ngi,&nko,&info);
+ UT_FPRINTF(stderr,"%7ld: %9lld %9lld %7ld %7ld %3hd %3hd %5ld %4hx %8lu %8lu\n",
+ Sys.GrId.lNr,
+ Sys.pGrInfo->sosi_st,
+ Sys.pGrInfo->rb_st,
+ Sys.pGrInfo->rb_forrige_gr,
+ Sys.pGrInfo->rb_neste_gr,
+ Sys.pGrInfo->gnavn,
+ Sys.pGrInfo->ngi,
+ Sys.pGrInfo->nko,
+ Sys.pGrInfo->info,
+ Sys.pGrInfo->ulGiLen,
+ Sys.pGrInfo->ulPiLen);
+ /* List ut PINFO-pekerene */
+ if (ngi > 0) {
+ for (s=1; s<=Sys.pGrInfo->nko; ++s) {
+ if ((Sys.pInfo+s-1)->ulPiOfset != LC_INGEN_PINFO) {
+ UT_FPRINTF(stderr,"PI ofset %4hd: %8lu\n", s, (Sys.pInfo+s-1)->ulPiOfset);
+ }
+ }
+ }
+ }
+
+ if (AktBgr.lNr != INGEN_GRUPPE) {
+ LC_RxGr(&AktBgr,LES_OPTIMALT,&ngi,&nko,&info);
+ }
+}
diff --git a/src/FYBA/FYTA.cpp b/src/FYBA/FYTA.cpp
new file mode 100644
index 0000000..85d5301
--- /dev/null
+++ b/src/FYBA/FYTA.cpp
@@ -0,0 +1,199 @@
+/* === 900607 ============================================================= */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fyta.c */
+/* Innhold: Lagring og henting av "fil"-tabeller */
+/* ======================================================================== */
+
+#include "stdafx.h"
+
+#include <fcntl.h>
+
+
+/* Div. styrevariabler */
+#define NY 0
+#define LES 1
+#define SKRIV 2
+
+/* Tabellsystem */
+static short fytab_open = 0;
+static struct {
+ FILE *fpek;
+ size_t recl;
+ short modus;
+ long cur_lin;
+} fytab;
+
+
+/*
+AR-900105
+CH LC_InitTabel Åpner tabellsystemet
+CD =============================================================================
+CD Formål:
+CD Initierer tabellsystemet og åpner filen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD long n_rec i Antall reckords som skal nullstilles. Disse kan
+CD etterpå brukes til tilfeldig aksess. Utvidelse
+CD av filen kan senere bare skje i fortløpende
+CD rekkefølge.
+CD short rec_len i Reckordlengde. (Bruk sizeof for å finne lengden.)
+CD void *buffer i Peker til buffer som skal brukes for nullstilling.
+CD short ist r Status. (0=OK, -1=feil)
+CD
+CD Bruk:
+CD .
+CD struct{
+CD long snr;
+CD short ngi;
+CD short nko;
+CD } buffer;
+CD .
+CD .
+CD ist = LC_InitTabel(10000L,sizeof buffer,(void *)(&buffer));
+CD .
+CD ist = LC_PutTabel(linje,(void *)&buffer);
+CD .
+CD ist = LC_GetTabel(linje,(void *)&buffer);
+CD .
+CD LC_CloseTabel();
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_InitTabel(long n_rec,short rec_len,void *buffer)
+{
+ short ierr;
+
+ if (fytab_open){ /* Systemet er allerede i bruk */
+ return -1;
+ }
+ /* Åpner tabellfilen */
+ fytab.fpek = UT_OpenFile("fytabell.tmp","",UT_UPDATE,UT_UNKNOWN,&ierr);
+ if (ierr != UT_OK){ /* Åpningsfeil */
+ return -1;
+ }
+
+ fytab.recl = rec_len;
+
+ /* Nullstill tabellen */
+ if (fseek(fytab.fpek,0L,SEEK_SET) != 0){
+ return -1;
+ }
+ for (; n_rec>0; n_rec--){
+ if (fwrite(buffer,fytab.recl,1,fytab.fpek) != 1){
+ return -1;
+ }
+ }
+
+ fytab.modus = NY;
+ fytab_open = 1; /* Merke for at systemet aktivisert */
+
+ return 0;
+}
+
+
+/*
+AR-900106
+CH LC_GetTabel Get tabell-linje
+CD =============================================================================
+CD Formål:
+CD Henter en linje fra tabellfilen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD long linje i Linjenummer som skal hentes. (0 er første linje)
+CD void *buffer i Peker til struktur som skal ta mot lest reckord.
+CD short ist r Status (0=OK, -1=feil)
+CD
+CD Bruk:
+CD ist = LC_GetTabel(linje,(void *)&buffer);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_GetTabel(long linje,void *buffer)
+{
+ if ( ! fytab_open){ /* Systemet er ikke aktivisert */
+ return -1;
+ }
+
+ if (fytab.modus != LES || fytab.cur_lin != linje){ /* Posisjoner */
+ if (fseek(fytab.fpek,(long)(linje * fytab.recl),SEEK_SET) != 0){
+ return -1;
+ }
+ }
+
+ if (fread(buffer,fytab.recl,1,fytab.fpek) != 1){ /* Les */
+ return -1;
+ }
+
+ fytab.modus = LES;
+ fytab.cur_lin = linje + 1L;
+
+ return 0;
+}
+
+
+/*
+AR-900106
+CH LC_PutTabel Put tabell-linje
+CD =============================================================================
+CD Formål:
+CD Legg inn en linje fra tabellfilen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD long linje i Linjenummer som skal legges inn. (0 er første linje)
+CD (Største lovlige er 1 større enn det største hittil.)
+CD void *buffer i Peker til struktur som skal legges inn.
+CD short ist r Status (0=OK, -1=feil)
+CD
+CD Bruk:
+CD ist = LC_PutTabel(linje,(void *)&buffer);
+ =============================================================================
+*/
+SK_EntPnt_FYBA short LC_PutTabel(long linje,void *buffer)
+{
+ if ( ! fytab_open){ /* Systemet er ikke aktivisert */
+ return -1;
+ }
+
+ if (fytab.modus != SKRIV || linje != fytab.cur_lin){ /* Posisjoner */
+ if (fseek(fytab.fpek,(long)(linje * fytab.recl),SEEK_SET) != 0){
+ return -1;
+ }
+ }
+
+ if (fwrite(buffer,fytab.recl,1,fytab.fpek) != 1){ /* Skriv */
+ return -1;
+ }
+
+ fytab.modus = SKRIV;
+ fytab.cur_lin = linje + 1L;
+
+ return 0;
+}
+
+
+/*
+AR-900106
+CH LC_CloseTabel Stenge tabellsystemet
+CD =============================================================================
+CD Formål:
+CD Avslutter tabellsystemet og stenger og sletter filen.
+CD Tabellen kan nå åpnes på nytt for annen bruk.
+CD
+CD Parametre: ingen
+CD
+CD Bruk:
+CD LC_CloseTabel();
+ =============================================================================
+*/
+SK_EntPnt_FYBA void LC_CloseTabel(void)
+{
+ if (fytab_open){
+ fclose(fytab.fpek); /* Stenger tabellfilen */
+ UT_DeleteFile("fytabell.tmp"); /* Sletter tabellfilen */
+ fytab_open = 0; /* Merke for at systemet er stengt */
+ }
+}
diff --git a/src/FYBA/Fyba_Callback.cpp b/src/FYBA/Fyba_Callback.cpp
new file mode 100644
index 0000000..ca7c03d
--- /dev/null
+++ b/src/FYBA/Fyba_Callback.cpp
@@ -0,0 +1,232 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// Fil: Fyba_Callback.cpp
+// Eier: Statens kartverk, FYSAK-prosjektet
+//
+//////////////////////////////////////////////////////////////////////////
+//
+// Denne filen inneholder eksempel på callback-rutiner som kalles
+// av FYBA for feilmeldings-handtering og visning av framdrift under
+// indeksoppbygging.
+//
+// For å få et godt brukergrensesnitt bør disse rutinene endres til
+// det meldings og feilhandteringssystemet som brukes av hovedprogrammet.
+//
+// En tilsvarende enkel feilmeldingshandtering ligger i FYBA_DLL.DLL.
+// Denne (DLL'ens) meldingshandtering blir brukt hvis meldingsingsrutinene
+// ikke blir registrert av hovedprogrammet.
+//
+// Meldingsrutinene registreres med følgende rutiner:
+// - LC_SetErrorHandler
+// - LC_SetStartMessageHandler
+// - LC_SetShowMessageHandler
+// - LC_SetEndMessageHandler
+// - LC_SetCancelHandler
+//
+//////////////////////////////////////////////////////////////////////////
+
+
+#include "stdafx.h"
+
+#include <fyba.h>
+
+#ifdef WIN32
+# include <windows.h>
+#endif
+
+#ifdef LINUX
+
+#include <termios.h>
+#include <stdio.h>
+#include <sys/select.h>
+#include <sys/ioctl.h>
+
+ int _kbhit() {
+ static const int STDIN = 0;
+ static bool bInit = false;
+
+ if (! bInit) {
+ termios term;
+ tcgetattr(STDIN, &term);
+ term.c_lflag &= ~ICANON;
+ tcsetattr(STDIN, TCSANOW, &term);
+ setbuf(stdin, NULL);
+ bInit = true;
+ }
+
+ int bytesWaiting;
+ ioctl(STDIN, FIONREAD, &bytesWaiting);
+ return bytesWaiting;
+ }
+#else
+# include <conio.h>
+#endif
+
+/*
+AR-930907
+CH LC_ErrorHandler Feilmelding
+CD ==========================================================================
+CD Formål:
+CD Feilmelding.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short feil_nr i Feilmeldingsnummer
+CD char *logtx u Peker til feilmeldingstekst avslutta med '\0'.
+CD char *vartx u Peker til feilmeldingstekst avslutta med '\0'.
+CD
+CD Bruk:
+CD LC_SetErrorHandler(LC_ErrorHandler);
+ ==========================================================================
+*/
+void LC_ErrorHandler (short feil_nr, const char logtx[], const char vartx[])
+{
+ short strategi;
+ char *feilmelding;
+
+ /* Hent feilmeldingstekst og strategi */
+ strategi = LC_StrError(feil_nr,&feilmelding);
+
+ /* Meldingen skrives */
+ if (strategi > 0) {
+ printf("\n%s %s\n",feilmelding,vartx);
+ switch(strategi) { /* Velg strategi */
+ case 1:
+ case 2:
+ break;
+ case 3:
+ printf("\aTrykk [Enter] for å fortsette:");
+ if (getchar() == 0) getchar();
+ break;
+ case 4:
+ printf("\aTrykk [Enter] for å avbryte programmet:");
+ if (getchar() == 0) getchar();
+ exit(2);
+ break;
+ }
+ }
+}
+
+
+/*
+AR-900609
+CH LC_StartMessageHandler Starte meldingsvisning
+CD =============================================================================
+CD Formål:
+CD Starter vising av melding om baseoppbygging.
+CD
+CD Her skal brukerprogrammet legge inn sin egen initiering av visning av framdrift
+CD under indeksoppbygging.
+CD
+CD Denne rutinen blir kallt fra FYBA under indeksoppbygging, og den skal
+CD ikke kalles fra brukerprogramvaren.
+CD
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *cfil i Ekstra meldingstekst (filnavn)
+CD
+CD Bruk:
+CD LC_SetStartMessageHandler(LC_StartMessageHandler);
+ =============================================================================
+*/
+void LC_StartMessageHandler(const char *fnam)
+{
+#ifndef LINUX
+ printf("\nLeser: %s ",fnam);
+ printf("\n0%%");
+ fflush(stdout);
+#endif
+}
+
+
+/*
+AR-900609
+CH LC_ShowMessageHandler Vise melding
+CD =============================================================================
+CD Formål:
+CD Vising av melding om baseoppbygging.
+CD
+CD Her skal brukerprogrammet legge inn sin egen av visnig av framdrift
+CD under indeksoppbygging.
+CD
+CD Denne rutinen blir kalt fra FYBA under indeksoppbygging, og den skal
+CD ikke kalles fra brukerprogramvaren.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD double prosent i Prosent ferdig (0.0 - 100.0)
+CD
+CD Bruk:
+CD LC_SetShowMessageHandler(LC_ShowMessageHandler);
+ =============================================================================
+*/
+void LC_ShowMessageHandler(double prosent)
+{
+#ifndef LINUX
+ printf("\r%d%%",(short)prosent);
+ fflush(stdout);
+#endif
+}
+
+
+/*
+AR-900609
+CH LC_EndMessageHandler Avslutt melding
+CD =============================================================================
+CD Formål:
+CD Avslutt melding om baseoppbygging.
+CD
+CD Her skal brukerprogrammet legge inn sin egen avslutning av visning av framdrift
+CD under indeksoppbygging.
+CD
+CD Denne rutinen blir kalt fra FYBA under indeksoppbygging, og den skal
+CD ikke kalles fra brukerprogramvaren.
+CD
+CD Parametre:
+Dette CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LC_SetEndMessageHandler(LC_EndMessageHandler);
+ =============================================================================
+*/
+void LC_EndMessageHandler(void)
+{
+#ifndef LINUX
+ printf("\r100%% ferdig.");
+ fflush(stdout);
+#endif
+}
+
+
+/*
+AR-910402
+CH LC_CancelHandler Sjekk om Esc er trykket
+CD ==========================================================================
+CD Formål:
+CD Sjekk om det er trykt på Esc (Avbryte indeksoppbygging).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short sAvbrutt r UT_TRUE = Cancel
+CD UT_FALSE = ikke avbrudd
+CD
+CD Bruk:
+CD LC_SetCancelHandler(LC_CancelHandler);
+ ==========================================================================
+*/
+short LC_CancelHandler(void)
+{
+ int tast = 0;
+
+ if (_kbhit()) {
+ tast = getchar();
+ }
+ return ((tast == 27)? UT_TRUE : UT_FALSE );
+}
diff --git a/src/FYBA/Fyba_melding.cpp b/src/FYBA/Fyba_melding.cpp
new file mode 100644
index 0000000..bc9d733
--- /dev/null
+++ b/src/FYBA/Fyba_melding.cpp
@@ -0,0 +1,201 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// Fil: Fyba_melding.cpp
+// Eier: Statens kartverk, FYSAK-prosjektet
+//
+//////////////////////////////////////////////////////////////////////////
+//
+// Denne filen inneholder eksempel på callback-rutiner som kalles
+// av FYBA for feilmeldings-handtering og visning av framdrift under
+// indeksoppbygging.
+//
+// For å få et godt brukergrensesnitt bør disse rutinene endres til
+// det meldings og feilhandteringssystemet som brukes av hovedprogrammet.
+//
+// Rutinene må kompileres og linkes sammen med hovedprogrammet når
+// FYBA brukes som LIB.
+//
+//////////////////////////////////////////////////////////////////////////
+
+
+//
+// Innholdet i rutinene må byttes ut med meldingshandtering som er tilpasset
+// det aktuelle hovedprogrammet.
+//////////////////////////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////////////////
+// Fyba_melding.cpp
+//
+// Denne filen inneholder eksempel på rutiner som må linkes inn i
+// hovedprogrammet når FYBA brukes som LIB.
+//
+//////////////////////////////////////////////////////////////////////////
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <fyba.h>
+
+//static short sProsent;
+
+
+/*
+AR-890911
+CH LC_Error Feilmeldingsrutine
+CD =============================================================================
+CD Formål:
+CD Standard feilmeldingsrutine.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short feil_nr i Feil-nummer
+CD char *logtx i Tekst som bare skrives til logfil.
+CD Eks:"(utført i LC_RxGr)"
+CD char *vartx i Denne tekststreng henges etter feilmeldingsteksten.
+CD
+CD Bruk:
+CD LC_Error(35,"(Kallt i LC_Error)","");
+ =============================================================================
+*/
+void LC_Error(short feil_nr,const char *logtx,const char *vartx)
+{
+ char szErrMsg[260];
+ short strategi;
+ char *pszFeilmelding;
+
+
+ // Egen enkel implementasjon av feilhandtering
+ /* Hent feilmeldingstekst og strategi */
+ strategi = LC_StrError(feil_nr,&pszFeilmelding);
+ switch(strategi) {
+ case 2: UT_SNPRINTF(szErrMsg,260,"%s","Observer følgende! \n\n"); break;
+ case 3: UT_SNPRINTF(szErrMsg,260,"%s","Det er oppstått en feil! \n\n"); break;
+ case 4: UT_SNPRINTF(szErrMsg,260,"%s","Alvorlig feil avslutt programmet! \n\n"); break;
+ default: szErrMsg[0]='\0';
+ }
+
+ #ifdef WIN32
+ if (strategi > 2) {
+ Beep(100,500);
+ }
+
+ if (UT_StrCat (szErrMsg,pszFeilmelding, sizeof(szErrMsg))) {
+ if (UT_StrCat (szErrMsg,&vartx[0], sizeof(szErrMsg))) {
+ MessageBox(NULL, szErrMsg, "Melding fra FYBA ", MB_ICONHAND | MB_OK);
+
+ } else {
+ MessageBox(NULL, "Klarer ikke å vise teksten", "Melding fra FYBA ", MB_ICONHAND | MB_OK);
+ }
+
+ } else {
+ MessageBox(NULL, "Klarer ikke å vise teksten", "Melding fra FYBA ", MB_ICONHAND | MB_OK);
+ }
+ #else
+ printf("\nError: %s ",pszFeilmelding);
+ fflush(stdout);
+ #endif
+}
+
+
+/*
+AR-900609
+CH LC_StartMess Vise melding
+CD =============================================================================
+CD Formål:
+CD Starter vising av melding om baseoppbygging.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFilnavn i Ekstra meldingstekst (filnavn)
+CD
+CD Bruk:
+CD LC_StartMess(pszFilnavn);
+ =============================================================================
+*/
+void LC_StartMessage(char const *pszFilnavn)
+{
+#ifndef LINUX
+ printf("\nLeser: %s ",pszFilnavn);
+ printf("\n0%%");
+ fflush(stdout);
+#endif
+}
+
+
+/*
+AR-900609
+CH LC_ShowMess Vise melding
+CD =============================================================================
+CD Formål:
+CD Vising av melding om baseoppbygging.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD double prosent i Prosent ferdig (0.0 - 100.0)
+CD
+CD Bruk:
+CD LC_ShowMess(prosent);
+ =============================================================================
+*/
+void LC_ShowMessage(double prosent)
+{
+#ifndef LINUX
+ printf("\r%d%%",(short)prosent);
+ fflush(stdout);
+#endif
+}
+
+
+/*
+AR-900609
+CH LC_EndMess Avslutt melding
+CD =============================================================================
+CD Formål:
+CD Avslutt melding om baseoppbygging.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LC_EndMess();
+ =============================================================================
+*/
+void LC_EndMessage(void)
+{
+#ifndef LINUX
+ printf("\r100%% ferdig.");
+ fflush(stdout);
+#endif
+}
+
+
+/*
+AR-910402
+CH LC_Cancel Sjekk om Esc er trykket
+CD ==========================================================================
+CD Formål:
+CD Sjekk om det er trykkt på Esc (Avbryte indeksoppbygging).
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short sAvbrutt r UT_TRUE = Cancel
+CD UT_FALSE = ikke avbrudd
+CD
+CD Bruk:
+CD sAvbrutt = LC_Cancel();
+ ==========================================================================
+*/
+short LC_Cancel(void)
+{
+ /* Ikke mulig å avbryte */
+ return UT_FALSE;
+}
+
diff --git a/src/FYBA/Fyba_melding_dll.cpp.bak b/src/FYBA/Fyba_melding_dll.cpp.bak
new file mode 100644
index 0000000..0da5310
--- /dev/null
+++ b/src/FYBA/Fyba_melding_dll.cpp.bak
@@ -0,0 +1,368 @@
+//////////////////////////////////////////////////////////////////////////
+// Fil: fyba_melding_dll.cpp
+//////////////////////////////////////////////////////////////////////////
+#include "stdafx.h"
+
+#include "fyba.h"
+
+extern void (*LC_ErrorAdr) (short ifeilnr, const char *logtx, const char *vartx);
+extern void (*LC_StartMessageAdr)(const char *cfil);
+extern void (*LC_ShowMessageAdr)(double prosent);
+extern void (*LC_EndMessageAdr)(void);
+extern short (*LC_CancelAdr)(void);
+
+static short sProsent;
+
+// Rutiner for å definere callback-rutiner for informasjon til brukeren.
+
+/*
+AR:2006-03-21
+CH LC_SetErrorHandler Registrer feilmeldingsrutine
+CD =============================================================================
+CD Formål:
+CD Registrer feilmeldingsrutine.
+CD Feilmeldingsrutinen blir kallt hvis det oppstår feil.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD void (*f) (short ,char *,char *) i Peker til feilmeldingsrutine
+CD
+CD Bruk:
+CD LC_SetErrorHandler(ErrorHandler);
+CD
+CD
+CD Feilmeldingsrutinen skal ha følgende definisjon:
+CD
+CD void ErrorHandler(short feil_nr,const char *logtx,const char *vartx);
+CD
+CD Med følgende parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short feil_nr i Feil-nummer
+CD char *logtx i Tekst som bare skrives til logfil.
+CD Eks:"(utført i LC_RxGr)"
+CD char *vartx i Denne tekststreng henges etter feilmeldingsteksten.
+CD =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SetErrorHandler(void (*f) (short,const char*,const char*))
+{
+ LC_ErrorAdr = f;
+}
+
+
+/*
+AR:2006-03-21
+CH LC_SetStartMessageHandler Registrer initieringsrutine
+CD =============================================================================
+CD Formål:
+CD Registrer initieringsrutine.
+CD Initieringsrutinen blir kalt for å starte visning av framdrift.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD void (*f)(char*) i Peker til initieringsrutine
+CD
+CD Bruk:
+CD LC_SetStartMessageHandler(StartMessageHandler);
+CD
+CD Initieringsrutinen skal ha følgende definisjon:
+CD
+CD void StartMessageHandler(char *pszFilnavn);
+CD
+CD Med følgende parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFilnavn i Ekstra meldingstekst (filnavn)
+CD =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SetStartMessageHandler(void (*f)(const char*))
+{
+ LC_StartMessageAdr = f;
+}
+
+
+/*
+AR:2006-03-21
+CH LC_SetShowMessageHandler Registrer visningsrutine
+CD =============================================================================
+CD Formål:
+CD Registrer visningsrutine.
+CD Visningsrutine blir kalt for å vise framdrift ved indeks-oppbygging.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD void (*f)(double) i Peker til visningsrutine
+CD
+CD Bruk:
+CD LC_SetShowMessageHandler(ShowMessageHandler);
+CD
+CD Visningsrutinen skal ha følgende definisjon:
+CD
+CD void ShowMessageHandler(double prosent);
+CD
+CD Med følgende parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD double prosent i Prosent ferdig (0.0 - 100.0)
+CD =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SetShowMessageHandler(void (*f)(double))
+{
+ LC_ShowMessageAdr = f;
+}
+
+
+/*
+AR:2006-03-21
+CH LC_SetEndMessageHandler Registrer avslutningsrutine
+CD =============================================================================
+CD Formål:
+CD Registrer avslutningsrutine.
+CD Avslutningsrutinen blir kalt for å avslutte visning av framdrift ved indeksoppbygging.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD void (*f)(void) i Peker til avslutningsrutine
+CD
+CD Bruk:
+CD LC_SetEndMessageHandler(EndMessageHandler);
+CD
+CD Avslutningsrutinen skal ha følgende definisjon:
+CD
+CD void EndMessageHandler(void);
+CD =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SetEndMessageHandler(void (*f)(void))
+{
+ LC_EndMessageAdr = f;
+}
+
+
+/*
+AR:2006-03-21
+CH LC_SetCancelHandler Registrer avbruddsstyring
+CD =============================================================================
+CD Formål:
+CD Registrer avbruddsstyring.
+CD Rutine for avbruddsstyring blir kalt for å sjekke om bruker ønsker
+CD å avbryte beregningen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short (*f)(void) i Peker til rutine for avbruddsstyring.
+CD
+CD Bruk:
+CD LC_SetCancelHandler(CancelHandler);
+CD
+CD Rutine for avbruddsstyring skal ha følgende definisjon:
+CD
+CD short CancelHandler(void);
+CD
+CD Med følgende parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short sAvbrutt r UT_TRUE = Cancel
+CD UT_FALSE = ikke avbrudd
+CD =============================================================================
+*/
+SK_EntPnt_FYBA void LC_SetCancelHandler(short (*f)(void))
+{
+ LC_CancelAdr = f;
+}
+
+
+/*
+AR-890911
+CH LC_Error Feilmeldingsrutine
+CD =============================================================================
+CD Formål:
+CD Standard feilmeldingsrutine.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short feil_nr i Feil-nummer
+CD char *logtx i Tekst som bare skrives til logfil.
+CD Eks:"(utført i LC_RxGr)"
+CD char *vartx i Denne tekststreng henges etter feilmeldingsteksten.
+CD
+CD Bruk:
+CD LC_Error(35,"(Kallt i LC_Xxxx)","");
+CD =============================================================================
+*/
+void LC_Error(short feil_nr,const char *logtx,const char *vartx)
+{
+ char szErrMsg[260];
+ short strategi;
+ char *pszFeilmelding;
+
+
+ // Kaller hovedprogrammets implementasjon av feilhandteringen
+ if (LC_ErrorAdr != NULL) {
+ (*LC_ErrorAdr) (feil_nr,logtx,vartx);
+
+
+ // Egen enkel implementasjon av feilhandtering
+ } else {
+ /* Hent feilmeldingstekst og strategi */
+ strategi = LC_StrError(feil_nr,&pszFeilmelding);
+ switch(strategi) {
+ case 2: UT_SNPRINTF(szErrMsg,260,"%s","Observer følgende! \n\n");break;
+ case 3: UT_SNPRINTF(szErrMsg,260,"%s","Det er oppstått en feil! \n\n");break;
+ case 4: UT_SNPRINTF(szErrMsg,260,"%s","Alvorlig feil avslutt programmet! \n\n");break;
+ default: szErrMsg[0]='\0';
+ }
+
+#ifdef WIN32
+ if (strategi > 2) {
+ Beep(100,500);
+ }
+
+ if (UT_StrCat (szErrMsg,pszFeilmelding, sizeof(szErrMsg))) {
+ if (UT_StrCat (szErrMsg,&vartx[0], sizeof(szErrMsg))) {
+ MessageBox(NULL, szErrMsg, "Melding fra FYBA ", MB_ICONHAND | MB_OK);
+
+ } else {
+ MessageBox(NULL, "Klarer ikke å vise teksten", "Melding fra FYBA ", MB_ICONHAND | MB_OK);
+ }
+
+ } else {
+ MessageBox(NULL, "Klarer ikke å vise teksten", "Melding fra FYBA ", MB_ICONHAND | MB_OK);
+ }
+#endif
+ }
+}
+
+
+/*
+AR-900609
+CH LC_StartMessage Vise melding
+CD =============================================================================
+CD Formål:
+CD Starter vising av melding om baseoppbygging.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszFilnavn i Ekstra meldingstekst (filnavn)
+CD
+CD Bruk:
+CD LC_StartMessage(pszFilnavn);
+CD =============================================================================
+*/
+void LC_StartMessage(const char *pszFilnavn)
+{
+ // Kaller hovedprogrammets implementasjon
+ if (LC_StartMessageAdr != NULL) {
+ (*LC_StartMessageAdr) (pszFilnavn);
+
+ // Egen enkel implementasjon
+ } else {
+#ifndef LINUX
+ printf("\nLeser: %s ",pszFilnavn);
+ printf("\n0%%");
+ fflush(stdout);
+#endif
+ }
+}
+
+
+/*
+AR-900609
+CH LC_ShowMessage Vise melding
+CD =============================================================================
+CD Formål:
+CD Vising av melding om baseoppbygging.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD double prosent i Prosent ferdig (0.0 - 100.0)
+CD
+CD Bruk:
+CD LC_ShowMessage(prosent);
+CD =============================================================================
+*/
+void LC_ShowMessage(double prosent)
+{
+ // Kaller hovedprogrammets implementasjon
+ if (LC_ShowMessageAdr != NULL) {
+ (*LC_ShowMessageAdr) (prosent);
+
+ // Egen enkel implementasjon
+ } else {
+#ifndef LINUX
+ printf("\r%d%%",(short)prosent);
+ fflush(stdout);
+#endif
+ }
+}
+
+
+/*
+AR-900609
+CH LC_EndMessage Avslutt melding
+CD =============================================================================
+CD Formål:
+CD Avslutt melding om baseoppbygging.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD
+CD Bruk:
+CD LC_EndMessage();
+CD =============================================================================
+*/
+void LC_EndMessage(void)
+{
+ // Kaller hovedprogrammets implementasjon
+ if (LC_EndMessageAdr != NULL) {
+ (*LC_EndMessageAdr) ();
+
+ // Egen enkel implementasjon
+ } else {
+#ifndef LINUX
+ printf("\r100%% ferdig.");
+ fflush(stdout);
+#endif
+ }
+}
+
+
+/*
+AR-910402
+CH LC_Cancel Sjekk om Esc er trykket
+CD ==========================================================================
+CD Formål:
+CD Sjekk om det er trykkt på Esc (Avbryte indeksoppbygging).
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short sAvbrutt r UT_TRUE = Cancel
+CD UT_FALSE = ikke avbrudd
+CD
+CD Bruk:
+CD sAvbrutt = LC_Cancel();
+CD ==========================================================================
+*/
+short LC_Cancel(void)
+{
+ // Kaller hovedprogrammets implementasjon
+ if (LC_CancelAdr != NULL) {
+ return (*LC_CancelAdr) ();
+
+ // Egen enkel implementasjon
+ } else {
+ /* Ikke mulig å avbryte */
+ return UT_FALSE;
+ }
+}
+
diff --git a/src/FYBA/LICENSE b/src/FYBA/LICENSE
new file mode 100644
index 0000000..642f5d5
--- /dev/null
+++ b/src/FYBA/LICENSE
@@ -0,0 +1,24 @@
+/******************************************************************************
+* STATENS KARTVERK - FYSAK
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
diff --git a/src/FYBA/Makefile.am b/src/FYBA/Makefile.am
new file mode 100644
index 0000000..0243339
--- /dev/null
+++ b/src/FYBA/Makefile.am
@@ -0,0 +1,9 @@
+AM_CPPFLAGS = --pedantic -Wno-long-long -Wall -O2 -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -Wno-write-strings -I../GM -I../UT
+ACLOCAL_AMFLAGS = -I m5
+
+lib_LTLIBRARIES = libfyba.la
+libfyba_la_SOURCES = fyba.h Fyba_Callback.cpp FYBA_DLL.cpp FYHO.cpp FYLD.cpp FYLH.cpp fyln.cpp FYLP.cpp FYLS.cpp FYLX.cpp stdafx.cpp FYBA.cpp Fyba_melding.cpp FYLB.cpp FYLE.cpp FYLI.cpp FYLO.cpp FYLR.cpp FYLU.cpp FYTA.cpp fyba.h fyba_strings.h fybax.h stdafx.h
+libfyba_la_LDFLAGS = -version-info 0:0:0
+
+library_includedir=$(includedir)/fyba
+library_include_HEADERS = fyba.h
diff --git a/src/FYBA/fyba.h b/src/FYBA/fyba.h
new file mode 100644
index 0000000..c75f19e
--- /dev/null
+++ b/src/FYBA/fyba.h
@@ -0,0 +1,1484 @@
+/******************************************************************************
+*
+* STATENS KARTVERK - FYSAK
+*
+* Filename: fyba.h
+*
+* Content: Prototyper for rutiner for les/skriv av SOSI-fil.
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+#pragma once
+
+//
+// Når FYBA brukes som DLL, defineres FYBA_DLL_IMPORTS
+// Når FYBA brukes som lib er det ikke nødvendig med noen spesiell definisjon.
+// (Når FYBA skal kompileres/lages som DLL defineres FYBA_DLL_EXPORTS)
+//
+
+
+#ifdef WIN32
+#ifdef FYBA_DLL_IMPORTS /* FYBA brukes som DLL */
+# pragma comment (lib, "FYBA_DLL.lib")
+//# ifdef _DEBUG
+//# pragma comment (lib, "FYBA_DLLD.lib")
+//# else
+//# pragma comment (lib, "FYBA_DLL.lib")
+//# endif
+#else
+# ifndef FYBA_DLL_EXPORTS /* FYBA brukes som LIB */
+# ifdef _DEBUG
+# pragma comment (lib, "FYBAD.lib")
+# else
+# pragma comment (lib, "FYBA.lib")
+# endif
+# endif
+#endif
+
+
+# ifndef DllExport
+# define DllExport __declspec(dllexport)
+# define DllImport __declspec(dllimport)
+# endif /* !DllExport */
+#else
+# define DllExport
+# define DLLImport
+# define __cdecl
+#endif
+
+
+#ifndef SK_EntPnt_FYBA
+
+# ifdef FYBA_DLL_EXPORTS /* FYBA kompileres til DLL ==> FYBA_DLL.DLL */
+# define SK_EntPnt_FYBA DllExport
+
+# else
+# ifdef FYBA_DLL_IMPORTS /* FYBA brukes som DLL */
+# define SK_EntPnt_FYBA DllImport
+
+# else /* FYBA kompileres eller brukes som LIB */
+# define SK_EntPnt_FYBA
+# endif
+# endif
+#endif
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <fygm.h>
+#include <fyut.h>
+
+
+/* ======================================================= */
+/* Definerer konstanter */
+/* ======================================================= */
+ /* Max-verdier for basen */
+#define LC_MAX_GRU 10000000 /* Max grupper i en base */
+#define LC_MAX_GINFO 6000 /* Max linjer GINFO i en gruppe */
+#define LC_MAX_GINFO_BUFFER 250000 /* GINFO-buffer */
+#define LC_MAX_KOORD 90000 /* Max antall koordinater i en gruppe */
+#define LC_MAX_PINFO_BUFFER 250000 /* PINFO-buffer */
+#define LC_MAX_ANT_PRIOR 128 /* Max antall prioriteter */
+#define LC_DATO_LEN 9 /* Max lengde dato (inkl. '\0') */
+#define LC_BASEVER_LEN 50 /* Max lengde av szBaseVer (inkl. '\0') */
+#define LC_MAX_SOSINAVN_LEN 50 /* Max lengde for SOSI-navn (inkl. '\0') */
+#define LC_MAX_NAVN 500 /* Max linjer i navnetabellen (pr. fil) */
+#define LC_NGISLAG_LEN 50 /* Max lengde av NGIS-LAG fra filhodet */
+#define LC_MAX_SOSI_LINJE_LEN 1024 /* Max linjelengde for lesing fra SOSI-filen */
+#define LC_MAX_OBJTYPE_LEN 33 // Max lengde av objettypenavn (inkl. '\0')
+
+#define LC_INTERNT_TEGNSETT TS_ISO8859
+
+
+ /* Konstanter for basetype */
+#define LC_KLADD 3 /* Kladdebase */
+#define LC_BASE 1 /* Vanlig base */
+
+ /* Konstanter for åpning av eksisterende base */
+#define UKJENT_BASE -1
+#define FEIL_VERSJON -2
+#define IKKE_STENGT -3
+#define IDX_MANGLER -4
+#define IDX_FEIL_DATO -5
+#define SOS_MANGLER -6
+#define SOS_FEIL_DATO -7
+#define SOS_FEIL_AKSESS -8
+
+ /* Konstanter for LC_CloseBase */
+#define RESET_IDX 0 /* Fjern indeksfilene */
+#define SAVE_IDX 1 /* Lagrer indeksfilene */
+
+ /* Konstanter for LC_OpenSos */
+#define LC_BASE_FRAMGR 1 /* Framgrunnsfil i basen */
+#define LC_BASE_BAKGR 2 /* Bakgrunnsfil i basen (Bare les) */
+#define LC_SEKV_LES 3 /* Sekvensiell, les */
+#define LC_SEKV_SKRIV 4 /* Sekvensiell, skriv */
+#define LC_SEKV_UTVID 5 /* Sekvensiell, utvid gammel fil */
+
+#define LC_NY_IDX 1 /* Tvungen nygenerering */
+#define LC_GML_IDX 0 /* Bruk gammel .idx hvis den er OK */
+
+#define LC_VIS_STATUS 1 /* Vis status under indeksoppbygging */
+#define LC_INGEN_STATUS 0 /* Ikke vis status */
+
+ /* Lag i basen */
+#define LC_SEKV 0x0001 /* Sekvensiell fil */
+#define LC_BAKGR 0x0002 /* Bakgrunnsfil i base */
+#define LC_FRAMGR 0x0004 /* Framgrunnsfil i base */
+
+ /* Status fra LC_OpenSos */
+#define LC_CANCEL -3 // Avbrutt med [Esc], eller lesefeil
+#define LC_DUBLIKAT -4 // Filen er i basen fra før
+#define LC_OPPTATT -5 // Filen er åpen i annet program
+
+ /* Konstanter for LC_SetNgisModus */
+#define NGIS_NORMAL 0 /* Vanlig modus */
+#define NGIS_SPESIAL 1 /* Spesialmodus der det er mulig å finne og
+ lese grupper som er merka som sletta */
+
+ /* Konstanter for LC_SetUtvidModus */
+#define LC_UTVID_SIKKER 0 /* SOSI-filen stenges og filstørrelsen oppdateres */
+ /* etter hver gruppe som er skrevet på slutten av filen */
+#define LC_UTVID_RASK 1 /* SOSI-filen stenges IKKE etter hver oppdatering*/
+
+ /* Konstanter til QueryGP mfl. */
+#define LC_HODE 1
+#define LC_GINFO 2
+#define LC_PINFO 4
+
+/* Konstanter til bruk ved kombinert flatesøk. JAØ-20000516 */
+#define LC_INGEN 0
+#define LC_NOEN 1
+#define LC_ALLE 2
+
+ /* Gruppenummer når det ikke er noen aktuell gruppe */
+#define INGEN_GRUPPE -1L /* bgr når det ikke er noen akt. gruppe */
+
+ /* Lesemetode for LC_RxGr */
+#define LES_OPTIMALT 0 /* Les mest effektivt base/SOSI */
+#define LES_SOSI 1 /* Les alltid fra SOSI-filen */
+
+ /* Skrivemetode for LC_WxGr */
+#define SKRIV_OPTIMALT 0 /* Skriv mest effektivt kø/SOSI */
+#define SKRIV_SOSI 1 /* Skriv direkte til SOSI-filen */
+
+ /* Handteringmetode for NGIS-nøkkel for LC_CopyGr */
+#define OPPDATER_NGIS 0 /* NGIS-nøkkel oppdateres i henhold til hodet i filen det kopieres til */
+#define BEVAR_NGIS 1 /* NGIS-nøkkel bevares uforandret i kopien */
+
+ /* Manglende kvalitetsopplysninger */
+#define KVAL_MET_UNDEF -1 /* Udefinert metode */
+#define KVAL_MET_STD -2 /* Standard metode fra nivå over */
+
+#define KVAL_NOY_UNDEF -1L // Udefinert nøyaktighet. - OBS! Denne skal utgå
+#define KVAL_NOY_STD -2L /* Standard nøyaktighet fra nivå over */
+#define KVAL_NOY_UKJENT 999999L // Ukjent nøyaktighet
+
+
+#define KVAL_SYN_GOD 0 /* Godt synlig */
+#define KVAL_SYN_UNDEF -1 /* Udefinert synbarhet */
+#define KVAL_SYN_STD -2 /* Standard synbarhet fra nivå over */
+
+ /* For LC_GetTH og LC_PutTH */
+ /* Konstant for å si at punktet ikke har høyde */
+ /* OBS! Denne må stemme med definisjonen i filen port.h */
+#ifndef HOYDE_MANGLER
+# define HOYDE_MANGLER -9999.999 /* Høyde mangler i punktet */
+#endif
+
+#define KOORD_MANGLER -9999.999 /* Koordinat mangler i punktet */
+
+ /* Gruppeinformasjon */
+#define GI_PINFO ((unsigned short)0x0001) /* Har PINFO */
+#define GI_NAH ((unsigned short)0x0002) /* Gruppen har høyde informasjon (..NØH) */
+#define GI_KP ((unsigned short)0x0004) /* Har knutepunkt (...KP n) */
+#define GI_REF ((unsigned short)0x0008) /* Har referanser (.. :n) */
+#define GI_OY_REF ((unsigned short)0x0010) /* Har referanser med øy */
+#define GI_SLETTA ((unsigned short)0x0020) /* Er sletta (merka som sletta) */
+#define GI_NGIS ((unsigned short)0x0040) /* Er tatt ut fra NGIS */
+#define GI_NAD ((unsigned short)0x0080) /* Har dybde informasjon (..NØD) */
+#define GI_READ_ONLY ((unsigned short)0x0100) /* Bare leseaksess (kan ikke endres) */
+
+ /* Avgrensing av brukttabellen */
+#define BT_MIN_BT 0 /* Første kolonne i brukttabellen */
+#define BT_MAX_BT 31 /* Siste kolonne i brukttabellen */
+#define BT_MIN_USER 1 /* Første tilgjengelig for brukerprogram */
+#define BT_MAX_USER 26 /* Siste tilgjengelig for brukerprogram */
+ /* Spesielle posisjoner i brukttabellen */
+#define BT_SKRKO 0 /* I skrivekø */
+#define BT_REFBOX 27 /* Referanser er brukt i omskrevet boks */
+#define BT_X 28 /* Reserve systemposisjon */
+#define BT_SNRSOK 29 /* Funnet ved SNR-søk */
+#define BT_GISOK 30 /* Funnet ved GINFO-søk */
+#define BT_GEOSOK 31 /* Funnet ved geografisk søk */
+
+ /* Logiske operasjoner mellom kolonner i brukttabellen */
+#define BC_AND 0
+#define BC_OR 1
+#define BC_COPY 2
+#define BC_INVERT 3
+#define BC_EXCHANGE 4
+
+
+ /* Konstanter for get og put referansenummer */
+#define START_OY 9999999L /* Start øy */
+#define SLUTT_OY -9999999L /* Slutt øy */
+
+ /* Konstanter for GetArrayTK() */
+#define HENT_FORRFRA 1 /* Vanlig */
+#define HENT_BAKFRA -1 /* Snu buferet */
+
+/* UTVALG */
+
+// Utvalgskommandoer
+#define LC_U_OG 1 // ..OG
+#define LC_U_ELLER 2 // ..VELG og ..ELLER
+
+
+ // Utvalgsmetoder
+#define LC_U_IKKE 0 // ! Ikke (Tilslag når SOSI-navnet
+ // ikke finnes. Bare GINFO.)
+#define LC_U_ALLE 1 // AL Alle
+#define LC_U_FRATIL 2 // <> Fra-til
+#define LC_U_UTENFOR 3 // >< Utenfor
+#define LC_U_MINDRE 4 // < Mindre-enn
+#define LC_U_STORRE 5 // > Større-enn
+#define LC_U_DELELIG 6 // / Delelig-med, eventuellt med
+ // sjekk på om restverdi er 2. verdi
+#define LC_U_UDELELIG 7 // !/ Ikke-delelig-med
+#define LC_U_CONTEIN 8 // () Inneholder
+#define LC_U_IKKECONTEIN 9 // !() Inneholder ikke (Tilslag når
+ // denne navn og verdi kombinasjonen
+ // ikke finnes)
+#define LC_U_LIK 10 // = Lik
+#define LC_U_IKKEVALGT 11 // IV Ikke valgt (Tilslag når gruppen
+ // ikke er tegnet ennå. Kombineres
+ // med SOSI-navnet "..*")
+#define LC_U_IKKELIK 12 // != Ikke lik (Tilslag når denne
+ // navn og verdi kombinasjonen ikke
+ // finnes)
+#define LC_U_FLERE 13 // FL Flere (Tilslag når SOSI-navnet
+ // forekommer flere ganger.)
+#define LC_U_IKKEFLERE 14 // !FL Ikke flere enn (Tilslag når
+ // SOSI-navnet IKKE forekommer
+ // flere ganger enn gitt antall.)
+
+
+
+ // Parametertyper
+#define LC_U_TALL 1 // Heltall
+#define LC_U_FLYT 2 // Flyttall
+#define LC_U_ALFA 4 // Tekststreng
+#define LC_U_DEFINERT 8 // Type definert i utvalgsregel
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Kvalitet !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_KVALITET { /* Standard Kvalitet */
+ short sMetode;
+ long lNoyaktighet;
+ short sSynbarhet;
+ short sHoydeMetode;
+ long lHoydeNoyaktighet;
+} LC_KVALITET;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Buffer for lesing av SOSI-fil !
+ *!--------------------------------------------------------------!
+ */
+
+typedef struct dLB_LESEBUFFER {
+ char tx[LC_MAX_SOSI_LINJE_LEN]; /* Lesebuffer */
+ UT_INT64 filpos; /* Filposisjon for starten av bufret */
+ UT_INT64 startpos; /* Startposisjon i filen for aktuellt SOSI-navn */
+ char *cp; /* Peker til aktuell posisjon i bufret */
+ char *pp; /* Peker til start parameter */
+ char *ep; /* Peker til posisjon etter aktuellt ord */
+ char *np; /* Peker til posisjon etter parameter (neste cp) */
+ short cur_navn[6]; /* Aktuellt SOSI-navn på dette nivå */
+ short cur_niv; /* Aktuellt nivå (der cp peker) (Ant. prikker) */
+ short cur_ant_par; /* Antall parametre på aktuellt nivå */
+ short cur_type; /* Viser hva aktuellt set inneholder */
+ short set_brukt; /* Status som viser om aktuellt "sett" er brukt */
+ short sTegnsett; /* SOSI-filens tegnsett */
+ short sStatus; /* Status, viser om buffer har brukbart innhold */
+} LB_LESEBUFFER;
+
+
+/*
+ *!----------------------------------------------------------!
+ *! BUFFER for koordinater og GINFO i minne !
+ *!----------------------------------------------------------!
+*/
+
+/*
+CH SOSI-buffer Binær kopi av SOSI-filen
+CD For å øke hastigheten holder FYBA en binær kopi av SOSI-filen.
+CD Denne kopien ligger delevis i minne og delevis på disk.
+CD
+CD Denne kopien består av gruppeinformasjon, koordinater og punktinformasjon.
+CD
+CD Gruppeinformasjonen for en gruppe handteres som en lang streng med pekere
+CD til startposisjon for hver GINFO-linje.
+CD
+CD !-----------:-----------:----------:----------------------------------!
+CD ! GINFO 1 ! GINFO 2 ! GINFO 3 ! ..... !
+CD !-----------:-----------:----------:----------------------------------!
+CD ! ! !
+CD !---------! ! !
+CD ! ! !
+CD !--------! ! ! !
+CD ! GINFO ! ! ! !
+CD !--------! ! ! !
+CD ! ofset !-! ! !
+CD ! !----- !
+CD ! !-----------------
+CD
+CD Koordinatene lagres i egne array. Punktinformasjonen lagres som
+CD en lang streng for hele gruppen med peker for hvert punkt til startposisjon
+CD for PINFO for hvert punkt på samme måte som GINFO.
+CD
+CD !--------! !--------! !--------:-------:--------!
+CD ! Øst ! ! Nord ! ! Høyde ! KP ! PINFO !
+CD !--------! !--------! !--------!-------!--------!
+CD ! double ! ! double ! ! double ! short ! ushort !
+CD ! m ! ! m ! ! m ! ! ofset !
+*/
+typedef struct d_LB_INFO {
+ double dHoyde; // Høyde
+ short sKp; // Knutepunkt (0=ikke knutepunkt)
+ unsigned long ulPiOfset; // PINFO ofset i eget buffer
+} LB_INFO;
+
+
+# define LC_INGEN_PINFO ULONG_MAX /* Offset ved tom PINFO */
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Navnetabell !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dSOSINAVN { /* Navnetabellen */
+ char szNavn[LC_MAX_SOSINAVN_LEN]; /* Sosi-navn */
+ unsigned char ucAntPar; /* Antall parametre til dette navnet */
+ char cNivo; /* "Prikk-nivå" (1 = Gruppenavn) */
+ bool bBrukt; // Viser om navnet er vært brukt
+} SOSINAVN;
+
+typedef struct dLC_NAVNETABELL {
+ short sAntNavn; /* Antall navn totalt i navnetabellen */
+ SOSINAVN sosi[LC_MAX_NAVN]; /* Navnetabellen */
+} LC_NAVNETABELL;
+
+
+# define LC_ANT_PAR_UKJENT 255 /* Antall parametre til dette navnet er
+ ukjent, ta med fram til neste " ." */
+
+ /* Definerte navn */
+#define L_SLUTT 0
+#define L_PUNKT 1
+#define L_LINJE 2
+#define L_KURVE 3
+#define L_BUE 4
+#define L_BUEP 5
+#define L_SIRKEL 6
+#define L_SIRKELP 7
+#define L_KLOTOIDE 8
+#define L_SVERM 9
+#define L_TEKST 10
+#define L_TRASE 11
+#define L_FLATE 12
+#define L_BEZIER 13
+#define L_RASTER 14
+#define L_DEF 15
+#define L_OBJDEF 16
+#define L_MLINJE 17
+#define L_STRUKTUR 18
+#define L_OBJEKT 19
+#define L_SYMBOL 20
+#define L_HODE 21 /* L_HODE må alltid ligge sist av gruppenavnene */
+
+#define L_NA 22 /* Andre definerte navn */
+#define L_NAH 23
+#define L_REF1 24
+#define L_REF2 25
+#define L_RADIUS 26
+#define L_ENHET2 27
+#define L_ENHET2H 28
+#define L_ENHET2D 29
+#define L_ENHET3 30
+#define L_ENHET3H 31
+#define L_ENHET3D 32
+#define L_ORIGONO 33
+#define L_HOYDE 34
+#define L_DYBDE 35
+#define L_NAD 36
+#define L_NGISFLAGG 37
+#define L_NGISLAG 38
+#define L_OBJTYPE 39
+#define L_KP 40 /* L_KP må alltid ligge sist av de forhåndsdefierte navnene */
+
+
+
+/* ======= INDEKS-TABELLER =================== */
+
+/*
+CH Serienummer-tabell
+CD !-------------*
+CD ! Gruppenummer!
+CD !-------------! Linjenummer i tabellen er serienummer.
+CD ! lGrNr !
+CD ! (long) !
+CD *-------------*
+*/
+
+
+
+/*
+CH Geografisk-søketabell Geografisk søketabell
+CD
+CD Geografisk søk er basert på omskrevet boks.
+CD Boksene organiseres i et R-tre.
+CD
+CD !-----------------------------------*
+CD ! Omskreven boks !
+CD ! !
+CD ! min-N ! min-Ø ! max-N ! max-Ø !
+CD ! ! ! ! !
+CD !--------!--------!--------!--------!
+CD !dMinNord!dMinAust!dMaxNord!dMaxAust!
+CD ! d ! d ! d ! d !
+CD ! ! ! ! !
+CD *-----------------------------------*
+*/
+
+/*
+ *!--------------------------------------------------------------!
+ *! Boks for geografisk søk !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_BOKS{
+ double dMinAust;
+ double dMinNord;
+ double dMaxAust;
+ double dMaxNord;
+} LC_BOKS;
+
+#define LC_R_MAX_SON 3 /* Max antall sønner for hver node i R-treet */
+
+typedef struct dLC_R_NODE{
+ struct dLC_R_NODE *pFar; /* Far i treet (node) */
+ LC_BOKS Boks; /* Sum av omskreven boks for sønnene */
+ short sSonType; /* Hvilken type sønner har denne noden LC_NODE / LC_LEAF */
+ short sSonAnt; /* Antall sønner */
+ union {
+ struct dLC_R_NODE *pNode[LC_R_MAX_SON]; /* Sønner i treet (node) */
+ struct dLC_R_LEAF *pLeaf[LC_R_MAX_SON]; /* Sønner i treet (løv) */
+ } Son;
+} LC_R_NODE;
+
+#define LC_NODE 0
+#define LC_LEAF 1
+
+
+typedef struct dLC_R_LEAF{
+ LC_R_NODE *pFar; /* Far i treet (node) */
+ LC_BOKS Boks; /* Omskreven boks for gruppen */
+ long lNr; /* Gruppenummer i filen */
+} LC_R_LEAF;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Gruppetabel !
+ *!--------------------------------------------------------------!
+ */
+/*
+CH Gruppetabell Gruppetabell
+CD Dette er hovedtabellen med informasjon om hver enkelt gruppe på SOSI-filen.
+CD
+CD !------------------------------:-----------------------------------------------*
+CD !Start !Start !Ant. !Ant. ! Gruppeinnhold !
+CD ! på ! i !tegn !tegn !-----------------------------------------------!
+CD !SOSI- ! RB !GINFO- !PINFO- !Gruppe!ant. !ant. !Kvali- !Enhet ! Div. info !
+CD !fil ! !buffer !buffer !navn !GINFO! NØ ! tet ! ! (bit def.) !
+CD !-------!------!-------!-------!------!-----!-----!--------!------!------------!
+CD !sosi_st!rb_st !ulGiLen!ulPiLen!gnavn !ngi !nko !Kvalitet!dEnhet! info !
+CD ! n64 ! n64 ! ul ! ul ! s ! s ! l ! struct ! d ! us !
+CD ! ! ! ! ! ! ! ! ! !0=i !
+CD ! ! ! ! ! ! ! ! ! !1=H !
+CD ! ! ! ! ! ! ! ! ! !2=KP !
+CD ! ! ! ! ! ! ! ! ! !3=REF !
+CD ! ! ! ! ! ! ! ! ! !4=REF med ØY!
+CD ! ! ! ! ! ! ! ! ! !5=sletta !
+CD ! ! ! ! ! ! ! ! ! !6=NGIS oppd !
+CD *------------------------------------------------------------------------------*
+*/
+typedef struct dLC_GRTAB_LINJE{
+ unsigned long ulPrior[4]; /* Bitfelt for prioriteter. */
+ /* Siste bit viser om feltet er bygd opp. */
+ UT_INT64 sosi_st; /* Startposisjon i SOSI-filen */
+ UT_INT64 rb_st; /* Peker til start av gruppen i buffer-fil */
+ long rb_forrige_gr; /* Forrige gruppe i buffer-filen */
+ long rb_neste_gr; /* Neste gruppe i buffer-filen */
+ short gnavn; /* Gruppenavn. Eks. .HODE, .PUNKT, mm */
+ short ngi; /* Antall GINFO-linjer */
+ long nko; /* Antall koordinater */
+ unsigned short info; /* Info, se under gruppetabellen */
+ LC_KVALITET Kvalitet; /* Aktuell kvalitet fra GINFO */
+ char szObjtype[LC_MAX_OBJTYPE_LEN]; /* ..OBJTYPE fra GINFO */
+ double dEnhet; /* Aktuell enhet for gruppen i bufferet */
+ double dEnhetHoyde; /* Aktuell enhet-H for gruppen i bufferet */
+ double dEnhetDybde; /* Aktuell enhet-D for gruppen i bufferet */
+ unsigned long ulGiLen; /* Antall tegn i GINFO-buffer (inkl. \0) */
+ unsigned long ulPiLen; /* Antall tegn i PINFO-buffer (inkl. \0) */
+ LC_R_LEAF *pRL; /* Peker inn i geografisk søketre */
+
+} LC_GRTAB_LINJE;
+
+
+/*
+CH Brukttabell Merking av grupper
+CD Denne tabellen brukes delevis internt av FYBA, og delevis av brukerprogrammet.
+CD
+CD Følgende bit er definert:
+CD -------------------------------------------------------------------------
+CD 31 Gruppen er funnet ved geografisk søk -----! Brukere kan lese/bruke
+CD 30 Gruppen er funnet ved GINFO-utvalg ! disse, men det er ikke
+CD 29 Gruppen er funnet ved serienummer-søk ! lov til å endre dem.
+CD 28 Gruppen er i ringbufferet !
+CD 27 Referanser er brukt i omskrevet blokk ------!
+CD 26 -----!
+CD . ! Brukere har
+CD . ! full tilgang
+CD 2 ! til disse.
+CD 1 -----!
+CD 0 Gruppen ligger i kø for skriving til SOSI-filen
+*/
+
+
+ /*
+ *!--------------------------------------------------------------!
+ *! Overordnet blokk med pekere til de ulike indekstabellene !
+ *!--------------------------------------------------------------!
+ */
+#define LC_IDX_LIN_BLOKK 5000
+#define LC_ANT_IDX_BLOKK (LC_MAX_GRU / LC_IDX_LIN_BLOKK)
+typedef struct dLC_IDX_TABELL{
+ /* Array med pekere til starten av blokk med Gruppetabell-linjer */
+ LC_GRTAB_LINJE * GtAdm[LC_MAX_GRU / LC_IDX_LIN_BLOKK];
+
+ /* Array med pekere til starten av blokk med Gruppenummer for gitt SNR */
+ long *SnrAdm[LC_MAX_GRU / LC_IDX_LIN_BLOKK];
+
+ /* Array med pekere til starten av blokk med Brukttabell-linjer */
+ unsigned long *BtAdm[LC_MAX_GRU / LC_IDX_LIN_BLOKK];
+
+ /* Array med pekere til starten av blokk med Geo-tabell-linjer */
+ /* LC_GEOSOK_BOKS *GeoAdm[LC_MAX_GRU / LC_IDX_LIN_BLOKK]; */
+} LC_IDX_TABELL;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Koordinat 2D !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_KOORD_2D { /* (ø,n) Koordinatpar */
+ double dAust; /* øst-koordinat */
+ double dNord; /* nord-koordinat */
+} LC_KOORD_2D;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Koordinat 3D !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_KOORD_3D { /* (ø,n,h) Koordinatpar */
+ double dAust; /* øst-koordinat */
+ double dNord; /* nord-koordinat */
+ double dHoyde; /* Høyde */
+} LC_KOORD_3D;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Rektangel !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_REKT {
+ double dMinAust;
+ double dMinNord;
+ double dMaxAust;
+ double dMaxNord;
+} LC_REKT;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Kontanter og struktur for handtering av TRANSPAR i filhodet !
+ *!--------------------------------------------------------------!
+ */
+// Maske som styrer hvilke elementer i LC_TRANSPAR som benyttes
+#define LC_TR_KOORDSYS ((unsigned short)0x0001) /* Koordsys */
+#define LC_TR_TRANSSYS ((unsigned short)0x0002) /* Transsys */
+#define LC_TR_GEOSYS ((unsigned short)0x0004) /* Geosys */
+#define LC_TR_GEOKOORD ((unsigned short)0x0008) /* Geokoord */
+#define LC_TR_ORIGO ((unsigned short)0x0010) /* Origo-nø */
+#define LC_TR_ENHET ((unsigned short)0x0020) /* Enhet */
+#define LC_TR_ENHETH ((unsigned short)0x0040) /* Enhet-h */
+#define LC_TR_ENHETD ((unsigned short)0x0080) /* Enhet-d */
+#define LC_TR_VERTDATUM ((unsigned short)0x0100) /* Vert-datum */
+#define LC_TR_VERTINT ((unsigned short)0x0200) /* Vert-int */
+#define LC_TR_VERTDELTA ((unsigned short)0x0400) /* Vert-delta */
+
+#define LC_TR_ALLT ((unsigned short)0xFFFF) /* Alle deler av ..TRANSPAR */
+
+
+// Definerer struktur for ..TRANSPAR
+typedef struct dLC_TRANSPAR {
+ /* ...KOORDSYS */
+ short sKoordsys;
+ char szKoordsysDatum[36];
+ char szKoordsysProjek[36];
+ /* ...TRANSSYS */
+ short sTranssysTilsys;
+ double dTranssysKonstA1;
+ double dTranssysKonstB1;
+ double dTranssysKonstA2;
+ double dTranssysKonstB2;
+ double dTranssysKonstC1;
+ double dTranssysKonstC2;
+ /* ...GEOSYS */
+ short sGeosysDatum;
+ short sGeosysProj;
+ short sGeosysSone;
+ /*...GEOKOORD */
+ short sGeoKoord;
+ /* ...ORIGO-NØ */
+ LC_KOORD_2D Origo;
+ //double dOrigoAust;
+ //double dOrigoNord;
+ /* ...ENHET */
+ double dEnhet;
+ /* ...ENHET-H */
+ double dEnhet_h;
+ /* ...ENHET-D */
+ double dEnhet_d;
+ /* ...VERT-DATUM */
+ char szVertdatHref[7];
+ char szVertdatDref[6];
+ char szVertdatFref[6];
+ char szVertdatHtyp[2];
+ /* ...VERT-INT */
+ short sVertintHref;
+ short sVertintDref;
+ short sVertintFref;
+ /* ...VERT-DELTA */
+ short sVdeltaMin;
+ short sVdeltaMax;
+} LC_TRANSPAR;
+
+
+#define LC_TR_GEOSYS_INGEN_VERDI -9999 // Brukes for å angi at projeksjon og sone under geosys ikke er gitt
+
+// Konstanter for definering av filtype (primært for bruk i GabEdit) JAØ-20010306
+#define LC_FILTYPE_UKJENT 0
+#define LC_FILTYPE_INAKTIV 1
+#define LC_FILTYPE_GAB_EIENDOM 2
+#define LC_FILTYPE_GAB_ADRESSE 3
+#define LC_FILTYPE_GAB_BYGNING 4
+#define LC_FILTYPE_BYGG 5
+#define LC_FILTYPE_DEK 6
+#define LC_FILTYPE_DEK_ENDRING 7
+#define LC_FILTYPE_GRUNNKRETS 8
+#define LC_FILTYPE_POSTKRETS 9
+#define LC_FILTYPE_SKOLEKRETS 10
+#define LC_FILTYPE_KIRKESOGN 11
+#define LC_FILTYPE_TETTSTED 12
+#define LC_FILTYPE_VALGKRETS 13
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Filadministrasjon !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_FILADM{
+ char szBaseVer[LC_BASEVER_LEN]; // Versjon og dato for aktuell versjon av FYBA
+ char szIdxVer[5]; // Indeksfil-versjon
+ short sIdxOpen; // UT_FALSE/UT_TRUE - Flagg som viser at indeks er åpnet
+ unsigned long ulPid; // Prosess ID for programmet som har åpnet filen
+ short sFilType; // Primært tenkt brukt i GabEdit, definerer hvilken type arbeidsfil dette er.
+ unsigned short usLag; // Lag: (LC_SEKV,LC_FRAMGR,LC_BAKGR)
+ char szNgisLag[LC_NGISLAG_LEN]; // Ngislag i filhodet
+ short sAccess; // Aksess: (READ / UPDATE)
+ /* short sDisk; */ // Disk for SOSI-filen (1=A, 2=B, osv.)
+ char *pszNavn; // Filnavn (SOSI-filens navn, inkl. sti
+ UT_INT64 SosiBytes; // Antall byte i SOSI-filen
+ FTID SosiTid; // Oppdateringstidspunkt for SOSI-filen
+ LC_TRANSPAR TransPar; // Transformasjonsparametre fra filhodet
+ unsigned short TransMaske; // Maske som viser hvilke deler av TransPar som inneholder data
+ LC_REKT Omr; // ..OMRÅDE fra filhodet
+ short sTegnsett; // Tegnsett fra filhodet eller standardverdi
+ char szDato[LC_DATO_LEN]; // ..DATO fra fil-hodet
+ short sSosiVer; // ..SOSI-VERSJON fra fil-hodet * 100
+ char SosiNiv[2]; // ..SOSI-NIVÅ fra fil-hodet
+ // SosiNiv[0] = nivå fra filåpningen
+ // SosiNiv[1] = nivå fra senere handtering
+ // Filhodet oppdateres når filen stenges
+ // short usUlovligRef; // Bryter som viser om det er ulovlige
+ // // referanser i filen (Indeksoppbygging)
+ unsigned short usDataFeil; // Flagg som viser om det er datafeil
+ // i filen (Indeksoppbygging)
+ LC_KVALITET Kvalitet; // Kvalitet fra filhodet
+
+ UT_INT64 n64AktPos; // Aktuell posisjon for sekv. skriv / les
+ UT_INT64 n64NesteLedigRbPos; // Neste ledige posisjon i buffer-filen
+ long lSisteGrRb; // Siste gruppe i buffer-filen
+
+ long lMaxSnr; // Største serienummer brukt i filen
+ long lAntGr; // Antall grupper i filen
+
+ struct dLC_NAVNETABELL SosiNavn; // Navnetabell
+
+ LC_IDX_TABELL *pIdx; // Starten av indekstabellen
+ LC_R_NODE *pGeoRN; // Peker til starten av trestruktur for geografisk søk
+ LC_BOKS Omraade; // Område angitt i filhodet ved åpning
+
+ struct dLC_FILADM *pNesteFil; // Peker til neste fil-adm.
+ struct dLC_BASEADM *pBase; // Peker til base-adm. for denne filen
+} LC_FILADM;
+
+
+/* Konstanter for flagg som viser om det er datafeil i filen (Indeksoppbygging) */
+#define LC_DATAFEIL_REF 1 /* Ulovlig referanse (referanse til gruppe som ikke finnes)*/
+#define LC_DATAFEIL_BUE 2 /* Ulovlige buer i filen */
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Baseadministrasjon !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_BASEADM{
+ short sType; // Basetype: LC_BASE / LC_START_KLADD / LC_KLADD
+
+ long lAntGr; // Antall grupper i basen
+ LC_BOKS Omraade; // Summert område fra filhodene
+ short sAntFramgrFil; // Antall filer i framgrunn
+ short sAntBakgrFil; // Antall filer i bakgrunn
+
+ LB_LESEBUFFER BufAdm; // Vanlig lesebuffer mot SOSI-fil
+
+ LC_FILADM *pCurSos; // Fil-adm for åpen SOSI-fil
+ FILE *pfSos; // Filhandel for åpen SOSI-fil
+
+ LC_FILADM *pCurRb; // Fil-adm for åpen Rb-fil
+ FILE *pfRb; // Filhandel for åpen Rb-fil
+ short sModusRb; // LES eller SKRIV til buffer-filen
+ UT_INT64 n64FilPosRb; // Aktuell posisjon i buffer-filen
+
+ LC_FILADM *pForsteFil; // Peker til første fil-adm.
+ LC_FILADM *pSisteFil; // Peker til siste fil-adm.
+
+ struct dLC_BASEADM *pNesteBase; // Peker til neste base-adm
+} LC_BASEADM;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Gruppenummer !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_BGR {
+ LC_FILADM *pFil; /* Peker til FilAdm for SOSI-fil */
+ long lNr; /* Gruppenummer innen filen */
+} LC_BGR;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Hent flate-referanser, status !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_GR_STAT {
+ short sGiLinNr; /* Aktuell GINFO-linjenummer referanselesing */
+ short sRefPos; /* Aktuell posisjon i GINFO-linja */
+ short sRefLin; /* Viser om aktuel linje inneholder referanser */
+} LC_GR_STATUS;
+
+typedef struct dLC_GRF_STAT {
+ LC_GR_STATUS Omkr;
+ unsigned short usOmkretsFerdig;
+ LC_GR_STATUS Oy;
+ LC_BGR Bgr; /* Aktuell øy-gruppe */
+} LC_GRF_STATUS;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Geografisk søk, status mm. !
+ *!--------------------------------------------------------------!
+ */
+
+/* Kjede med resultatet av søket */
+typedef struct dLC_KJEDE_BGR {
+ LC_BGR Bgr;
+ struct dLC_KJEDE_BGR *pNesteKB;
+} LC_KJEDE_BGR;
+
+/* Søkemetode i basen */
+#define LC_GEO_SEKV 0x0000 /* Søker sekvensiellt gjennom gruppene */
+#define LC_GEO_RTRE 0x0001 /* Bruker R-tre-srukturene i søket */
+
+/* Status */
+typedef struct dLC_GEO_STAT {
+ unsigned short usMetode; /* Søkemetode (LC_GEO_SEKV eller LC_GEO_RTRE) */
+ double nvn,nva,ohn,oha; /* Rektangel for søkeområde. */
+ unsigned short usLag; /* Lag det skal søkes i. (LC_FRAMGR | LC_BAKGR) */
+ LC_BGR Bgr; /* Aktuell gruppe */
+ /* Kjede med resultatet av søket */
+ LC_KJEDE_BGR *pForsteKB;
+ LC_KJEDE_BGR *pSisteKB;
+ LC_KJEDE_BGR *pAktuellKB;
+} LC_GEO_STATUS;
+
+
+/*
+CH Utvalgstabell
+CD .===============================================================================.
+CD !Ginfo/!Utvalgs-!Prio-!SOSI-!Utvalgs-!Para-!Ledd-!Start !Slutt !Min !Max !Regel-!
+CD !Pinfo !kommando!ritet!navn !metode !type !nr !i str !i str ! ! !navn !
+CD !------!--------!-----!-----!--------!-----!-----!------!------!----!----!------!
+CD !gi_pi !kommando!sPri-!sosi !metode !type !ledd !start !slutt !min !max !regel !
+CD ! ! !orit-! ! ! ! ! ! ! ! ! !
+CD ! c ! c !et !c[] ! c ! c ! c ! c ! c !c[] !c[] ! c[] !
+CD ! ! ! ! ! ! ! ! ! ! ! ! !
+CD ! ! ! s ! ! ! ! ! ! ! ! ! !
+CD !Def. se under ! ! !Def. se !se ! ! ! !Def. se nedenfor!
+CD ! ! ! ! !nedenfor!nedf.! ! ! ! ! ! !
+CD *-------------------------------------------------------------------------------*
+*/
+
+ /* Gruppe, punkt eller pinfo-uvalg */
+#define U_GRUPPE 1 /* GRUPPE-UTVALG */
+#define U_PUNKT 2 /* PUNKT-UTVALG */
+#define U_PINFO 3 /* PINFO-UTVALG */
+
+/* Struktur for statusopplysninger for LC_InitPP / LC_GetPP */
+typedef struct {
+ short type; /* LC_GETPP_KP, LC_GETPP_HOYDE, LC_GETPP_KVALITET, LC_GETPP_VANLIG */
+ char pinfo_navn[LC_MAX_SOSINAVN_LEN]; /* Sosi-navn det skal finnes verdi til */
+ long curr_punkt; /* Aktuellt punkt */
+ long slutt_punkt; /* Første punkt etter søkeområdet */
+ short neste_tegn; /* Neste tegn (Ved flere PINFO i punktet) */
+} LC_GETPP_STATUS;
+/* Bruk: LC_GETPP_STATUS pp_stat; */
+
+#define LC_GETPP_VANLIG 0
+#define LC_GETPP_KP 1
+#define LC_GETPP_HOYDE 2
+#define LC_GETPP_KVALITET 3
+
+ /* Konstant for sAktuellPrioritet */
+#define LC_OVERSE_PRIORITET -1
+
+/* Utvalgslinje */
+typedef struct sLC_UTVALG_ELEMENT {
+ char kommando;
+ char sosi[LC_MAX_SOSINAVN_LEN];
+ char metode;
+ //char type;
+ short type;
+ char ledd; /* Ledd-nr for flerleddet parameter */
+ char start; /* Startposisjon i tegnstreng (0=hele) */
+ char slutt; /* Sluttposisjon i tegnstreng (0=resten) */
+ char *min;
+ char *max;
+ struct sLC_UTVALG_ELEMENT *pNesteUE; /* Neste på dette nivå */
+ struct sLC_UTVALG_ELEMENT *pForsteUE; /* Første på nivået under */
+ struct sLC_UTVALG_ELEMENT *pSisteUE; /* Siste på nivået under */
+} LC_UTVALG_ELEMENT;
+
+typedef struct sLC_LAG {
+ char *pszLagNavn; /* Lagnavn */
+ short sLagAktiv; /* Lag aktiv for tegning */
+ struct sLC_LAG *pNesteLag; /* Neste lag */
+} LC_LAG;
+
+#define LC_UFORANDRET 0
+#define LC_ENDRET 1
+#define LC_NY 2
+#define LC_SLETTET 3
+
+typedef struct sLC_UTVALG {
+ char *pszNavn;
+ short sPrioritet;
+ short sOriginalPrioritet;
+ short sStatus;
+ short sTegnes; // Flagg for å styre om utvalgsregelen skal brukes ved tegning
+ LC_UTVALG_ELEMENT *pForsteUE; /* Første utvalgslinje på øverste nivå */
+ LC_UTVALG_ELEMENT *pSisteUE; /* Siste utvalgslinje på øverste nivå */
+
+ struct sLC_UTVALG *pForrigeU; /* Forrige utvalg */
+ struct sLC_UTVALG *pNesteU; /* Neste utvalg */
+ struct sLC_LAG *pLag; /* Lag */
+ char *pszRegel; /* Regel */
+} LC_UTVALG;
+
+/* Toppblokk for GRUPPE-, PUNKT- og PINFO-utvalg */
+typedef struct dLC_UTVALG_BLOKK {
+ short sHoydeBrukt;
+ short sTestAllePi; /* "!" er brukt, må sjekke alle punkt */
+ LC_UTVALG *pForsteU;
+ LC_UTVALG *pSisteU;
+ LC_UTVALG *pAktU;
+} LC_UTVALG_BLOKK;
+
+/* Administrasjonsblokk for utvalg */
+typedef struct dLC_UT_ADM {
+ short sMaxPrior; /* Største prioritet */
+ LC_UTVALG_BLOKK Gruppe;
+ LC_UTVALG_BLOKK Punkt;
+ LC_UTVALG_BLOKK Pinfo;
+ LC_UTVALG_BLOKK *pAktUB;
+ short sGruppeValgt;
+ LC_LAG *pForsteLag;
+ LC_LAG *pSisteLag;
+} LC_UT_ADM;
+
+/* Administrasjonsblokk for serienummersøk */
+typedef struct dLC_SNR_ADM {
+ LC_FILADM *pFil;
+ long lMinSnr;
+ long lMaxSnr;
+ long lAktSnr;
+} LC_SNR_ADM;
+
+/*
+CH Polygonbeskrivelse Strukturer for polygonbeskrivelse.
+CD
+CD Dette er et sett med strukturer som er kjedet sammen til en komplett
+CD beskrielse av en flate. Eksempel på bruk er gitt under $LENKE<LC_POL_GetRef>.
+CD
+CD
+CD !-----------------!
+CD ! LC_POLYGON !
+CD ! ! !-------------------------!
+CD ! !- Omkrets --! ! ! !-----------------! !---------------!
+CD ! !LC_POL_OMKR ! ! ! !-!LC_POL_ELEMENT ! !-!LC_POL_ELEMENT !
+CD ! ! ! ! ! ! ! - Bgr ! ! ! - Bgr !
+CD ! !- Siste !--!-------! ! ! - Snr ! ! ! - Snr !
+CD ! !- Første !--!---------! ! - Retning ! ! ! - Retning !
+CD ! !------------! ! ! - Forrige (NULL)! ! ! - Forrige !
+CD ! !- Hull ------! ! ! - Neste !-! ! - Neste (NULL)!
+CD ! !LC_OY_ADM ! ! !-----------------! !---------------!
+CD ! ! ! !
+CD ! !- Første øy !-!-!
+CD !-!-!- Siste øy ! ! !
+CD ! ! !-------------! ! !
+CD ! !-----------------! !
+CD ! !-----------------!
+CD ! ! !------------------------!
+CD ! ! !------------! ! !-----------------! !---------------!
+CD ! !--------------! !-!LC_POL_OMKR ! ! !-!LC_POL_ELEMENT !!!LC_POL_ELEMENT !
+CD ! !LC_OY_ELEMENT ! ! ! ! ! ! ! - Bgr !!! - Bgr !
+CD ! !- Omkrets !--! !- Siste !-! ! ! - Snr !!! - Snr !
+CD ! !- Neste !-! !- Første !---! ! - Retning !!! - Retning !
+CD ! !--------------! ! !------------! ! - Forrige (NULL)!!! - Forrige !
+CD ! ! ! - Neste !!! - Neste (NULL)!
+CD ! ! !-----------------! !---------------!
+CD ! !
+CD ! !---------------! !--------------------------!
+CD ! ! !------------! ! !-----------------! !---------------!
+CD ! !--------------! !-!LC_POL_OMKR ! ! !-!LC_POL_ELEMENT ! !-!LC_POL_ELEMENT !
+CD !--!LC_OY_ELEMENT ! ! ! ! ! ! ! - Bgr ! ! ! - Bgr !
+CD !- Omkrets !--! !- Siste !-! ! ! - Snr ! ! ! - Snr !
+CD !- Neste (NULL)! !- Første !---! ! - Retning ! ! ! - Retning !
+CD !--------------! !------------! ! - Forrige (NULL)! ! ! - Forrige !
+CD ! - Neste !-! ! - Neste (NULL)!
+CD !-----------------! !---------------!
+*/
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Polygon element (ett for hver gruppe i polygonbeskrivelsen) !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_POL_ELEMENT {
+ LC_BGR Bgr; /* Gruppenummer */
+ short sRetning; /* LC_MED_DIG eller LC_MOT_DIG */
+ long lSnr; /* Serienummer */
+ LC_KOORD_2D Pkt; /* (ø,n) Representasjonspunkt (Brukes ikke av FYBA. Til disp.) */
+ struct dLC_POL_ELEMENT *pNestePE; /* Peker til neste element i polygonet */
+ struct dLC_POL_ELEMENT *pForrigePE; /* Peker til forrige element i polygonet */
+} LC_POL_ELEMENT;
+
+/*
+ *!----------------------------------------------------------------------!
+ *! Adm. blokk for polygon (en for hver lukket "del", omkrets eller øy) !
+ *!----------------------------------------------------------------------!
+ */
+typedef struct dLC_POL_OMKR {
+ LC_POL_ELEMENT *pForstePE;
+ LC_POL_ELEMENT *pSistePE;
+} LC_POL_OMKR;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Øy (i polygon) element (en for hver øy) !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_OY_ELEMENT{
+ LC_POL_OMKR PO; /* Administrasjonsblokk til kjede som beskriv øyavgrensinga */
+ struct dLC_OY_ELEMENT *pNesteOE; /* Peker til neste øyelement i polygonet */
+ struct dLC_OY_ELEMENT *pForrigeOE; /* Peker til forrige øyelement i polygonet */
+} LC_OY_ELEMENT;
+
+/*
+ *!------------------------------------------------------------------------!
+ *! Adm. blokk for øy (i polygon) element (en for alle øyene i en flate) !
+ *!------------------------------------------------------------------------!
+ */
+typedef struct dLC_OY_ADM{
+ LC_OY_ELEMENT *pForsteOE; /* Første øy (hull) */
+ LC_OY_ELEMENT *pSisteOE; /* Siste øy (hull) */
+} LC_OY_ADM;
+
+/*
+ *!--------------------------------------------------------------!
+ *! Adm blokk for Polygon (En for hver flate, inkl øyer) !
+ *!--------------------------------------------------------------!
+ */
+
+typedef struct dLC_POLYGON {
+ LC_POL_OMKR HovedPO; /* Adm blokk for kjede som beskriver ytre avgrensing */
+ LC_OY_ADM OyOA; /* Kjede som beskriver hull i flata */
+} LC_POLYGON;
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyho.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short HO_New(const char *pszFil,short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d,
+ double nv_a,double nv_n,double oh_a,double oh_n);
+SK_EntPnt_FYBA short HO_TestSOSI(const char *pszFil,UT_INT64 *sluttpos);
+SK_EntPnt_FYBA char *HO_GetVal(const char *pszFil,char *sosi_navn,short *sett_nr);
+SK_EntPnt_FYBA short HO_GetKvalitet(const char *pszFil,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet);
+SK_EntPnt_FYBA short HO_GetTrans(const char *pszFil,short *koosys,double *origo_a,
+ double *origo_n,double *enhet,double *enhet_h,double *enhet_d);
+SK_EntPnt_FYBA short HO_GetTransEx(const char *pszFil,unsigned short *pusMaske, LC_TRANSPAR *pTrans);
+SK_EntPnt_FYBA short HO_GetOmr(const char *pszFil,double *nv_a,double *nv_n,double *oh_a,double *oh_n);
+SK_EntPnt_FYBA short HO_GetTegnsett(const char *pszFil,short *psTegnsett);
+SK_EntPnt_FYBA short HO_SjekkTegnsett(const char *pszFil,short *psTegnsett);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylh.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short LC_GetTrans(short *koosys,double *origo_a,double *origo_n,double *enhet,
+ double *enhet_h,double *enhet_d);
+SK_EntPnt_FYBA short LC_GetTransEx(unsigned short *pusMaske, LC_TRANSPAR *pTrans);
+SK_EntPnt_FYBA short LC_PutTrans(short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d);
+SK_EntPnt_FYBA short LC_PutTransEx(unsigned short usMaske, LC_TRANSPAR *pTrans);
+SK_EntPnt_FYBA short LC_GetTegnsett(short *psTegnsett);
+SK_EntPnt_FYBA short LC_GetOmr(double *nv_a,double *nv_n,double *oh_a,double *oh_n);
+SK_EntPnt_FYBA short LC_PutOmr(double nv_a,double nv_n,double oh_a,double oh_n);
+SK_EntPnt_FYBA void LC_NyttHode(void);
+SK_EntPnt_FYBA short LC_TestHode(void);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylo.c */
+/* ======================================================= */
+SK_EntPnt_FYBA void LC_Init(void);
+SK_EntPnt_FYBA void LC_Close(void);
+SK_EntPnt_FYBA LC_BASEADM* LC_OpenBase(short sBaseType);
+SK_EntPnt_FYBA void LC_CloseBase(LC_BASEADM *pBase,short s_stat);
+SK_EntPnt_FYBA short LC_OpenSos(const char *fil,short sModus,short sNyIdx,short sVisStatus,
+ LC_FILADM **ppFil, short *o_stat);
+SK_EntPnt_FYBA void LC_CloseSos(LC_FILADM *pFil,short s_stat);
+SK_EntPnt_FYBA void LC_FcloseSos(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_SetDefLpfi(short ant_tegn);
+SK_EntPnt_FYBA short LC_InqDefLpfi(void);
+SK_EntPnt_FYBA short LC_InqLag(unsigned short *usLag);
+SK_EntPnt_FYBA unsigned short LC_InqFilLag(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_SetFilLag(LC_FILADM *pFil,unsigned short usLag);
+SK_EntPnt_FYBA short LC_Backup(LC_FILADM *pFil,const char *pszBackupPath);
+SK_EntPnt_FYBA void LC_MaxSkriv(long);
+SK_EntPnt_FYBA long LC_InqMaxSkriv(void);
+SK_EntPnt_FYBA void LC_SetNgisModus(short modus);
+SK_EntPnt_FYBA short LC_GetNgisModus(void);
+SK_EntPnt_FYBA void LC_SetUtvidModus(short modus);
+SK_EntPnt_FYBA short LC_GetUtvidModus(void);
+SK_EntPnt_FYBA LC_BASEADM* LC_InqCurBase(void);
+SK_EntPnt_FYBA void LC_SelectBase(LC_BASEADM *pBase);
+SK_EntPnt_FYBA short LC_GetBaOm(unsigned short usLag,double *nva,double *nvn,double *oha,double *ohn);
+SK_EntPnt_FYBA short LC_GetFiOm(LC_FILADM *pFil,double *nva,double *nvn,double *oha,double *ohn);
+SK_EntPnt_FYBA LC_FILADM * LC_GetFiNr(const char *fil_navn);
+SK_EntPnt_FYBA char *LC_GetFiNa(LC_FILADM *pFil);
+SK_EntPnt_FYBA short LC_ErFilBase(const char *fil);
+SK_EntPnt_FYBA short LC_ErKoordsysLik(void);
+SK_EntPnt_FYBA short LC_ErVertdatumLik(void);
+SK_EntPnt_FYBA char* LC_GetNgisLag(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_SetEndringsstatus(short sStatus);
+SK_EntPnt_FYBA void LC_SetFilType(LC_FILADM *pFil, short sType);
+SK_EntPnt_FYBA short LC_GetFilType(LC_FILADM *pFil);
+SK_EntPnt_FYBA short LC_SetIdxPath(const char *pszIdxPath);
+SK_EntPnt_FYBA const char* LC_GetIdxPath(void);
+/* Konstanter for intgt.sEndra (aktuell gruppe er endra) */
+#define END_UENDRA 0 /* Ikke endra */
+#define END_KOPI 1 /* Endra ved totalkopi fra annen gruppe */
+#define END_ENDRA 2 /* Endra ved normal Put fra program */
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylx.c */
+/* ======================================================= */
+#define GRF_YTRE 0x01 /* Ytre avgrensing */
+#define GRF_INDRE 0x02 /* Indre avgrensing, øyer */
+#define LC_MED_DIG 0x01 /* Brukes MED dig retning */
+#define LC_MOT_DIG 0x02 /* Brukes MOT dig retning */
+#define GRF_START_OY 0x04 /* Første gruppe i øy */
+#define GRF_SLUTT_OY 0x08 /* Siste gruppe i øy */
+
+SK_EntPnt_FYBA long LC_InqAntRef(void);
+SK_EntPnt_FYBA void LC_InitGetRefFlate(LC_GRF_STATUS *pGrfStat);
+SK_EntPnt_FYBA long LC_GetRefFlate(LC_GRF_STATUS *RefStat,unsigned short sHent,long *ref_array,
+ unsigned char *ref_status,long max_ref);
+SK_EntPnt_FYBA short LC_PutRef(long *ref_array,long ant_ref);
+SK_EntPnt_FYBA long LC_GetRef(long *ref_array,long max_ref,short *gilin,short *refpos);
+
+SK_EntPnt_FYBA short LC_GetBuePar(short buff_retning, double *as, double *ns, double *radius,
+ double *fi, double *dfi, short *sfeil);
+SK_EntPnt_FYBA short LC_GetBue(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *radius,short *storbue);
+SK_EntPnt_FYBA short LC_GetBuep(short retning,double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3);
+SK_EntPnt_FYBA short LC_GetSirkel(double *as,double *ns,double *radius);
+SK_EntPnt_FYBA short LC_GetSirkelp(double *a1,double *n1,double *a2,double *n2,
+ double *a3,double *n3);
+
+SK_EntPnt_FYBA void LC_GetCurEnhet(LC_FILADM * pFil,short *nivaa, double *enhet,
+ double *enhet_h, double *enhet_d);
+SK_EntPnt_FYBA short LC_UpdateGiEnhet(LC_FILADM *pFil,double enhet,double enhet_h,double enhet_d);
+
+SK_EntPnt_FYBA short LC_GetKvalitet(short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet);
+SK_EntPnt_FYBA short LC_GetCurKvalitet(LC_FILADM *pFil,short *nivaa,long pnr,
+ short *psMetode,long *plNoyaktighet,short *psSynbarhet,
+ short *psHoydeMetode,long *plHoydeNoyaktighet);
+SK_EntPnt_FYBA short LC_UpdateGiKvalitet(LC_FILADM *pFil,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet);
+SK_EntPnt_FYBA short LC_UpdatePiKvalitet(LC_FILADM *pFil,long pnr,short sMetode,long lNoyaktighet,
+ short sSynbarhet,short sHoydeMetode,long lHoydeNoyaktighet);
+
+SK_EntPnt_FYBA char * LC_GetGP(const char *,short *,short);
+SK_EntPnt_FYBA short LC_PutGP(const char *sosi_navn,const char *verdi,short *linje_nr);
+SK_EntPnt_FYBA short LC_AppGP(const char *sosi_navn,const char *verdi,short *linje_nr);
+SK_EntPnt_FYBA short LC_UpdateGP(short linje_nr,const char *sosi_navn,const char *verdi);
+SK_EntPnt_FYBA void LC_InitPP(char *sosi_navn,long forste_punkt,long siste_punkt,
+ LC_GETPP_STATUS *pp_status);
+SK_EntPnt_FYBA char * LC_GetPP(long *punkt,LC_GETPP_STATUS *pp_stat);
+SK_EntPnt_FYBA char * LC_GetPiVerdi(const char *pszSosiNavn,long sPnr,short *sSettNr);
+SK_EntPnt_FYBA short LC_TestPi(long punkt_nr,short sTestHoyde);
+SK_EntPnt_FYBA short LC_FinnKp(long *forste_punkt,long siste_punkt,short *kp);
+SK_EntPnt_FYBA long LC_GetSn(void);
+SK_EntPnt_FYBA void LC_PutSn(long snr);
+SK_EntPnt_FYBA char * LC_GetGi(short gilin);
+SK_EntPnt_FYBA void LC_PutGi(short gilin,const char *ginfo);
+SK_EntPnt_FYBA void LC_GetTK(long pkt,double *aust,double *nord);
+SK_EntPnt_FYBA void LC_GetArrayTK(short retning,long max_antall,long fra_punkt,
+ double *aust,double *nord,long *antall);
+SK_EntPnt_FYBA void LC_GetArrayTH(short retning,long max_antall,long fra_punkt,
+ double *hoyde,long *antall);
+SK_EntPnt_FYBA void LC_PutTK(long punkt_nr,double aust,double nord);
+SK_EntPnt_FYBA double LC_GetTH(long pkt);
+SK_EntPnt_FYBA void LC_PutTH(long pkt,double hoyde);
+SK_EntPnt_FYBA double LC_GetHoyde(long punkt_nr);
+SK_EntPnt_FYBA void LC_PutTD(long punkt_nr, double dybde);
+SK_EntPnt_FYBA double LC_GetTD(long punkt_nr);
+SK_EntPnt_FYBA double LC_GetDybde(long punkt_nr);
+SK_EntPnt_FYBA char * LC_GetPi(long pkt);
+SK_EntPnt_FYBA short LC_PutPi(long pkt,const char *pi);
+SK_EntPnt_FYBA short LC_GetKp(long pkt);
+SK_EntPnt_FYBA void LC_PutKp(long pkt,short kp);
+SK_EntPnt_FYBA double LC_BerAreal(void);
+SK_EntPnt_FYBA double LC_BerLengde(void);
+SK_EntPnt_FYBA bool LC_BerLengde3D(double *skraa_lengde);
+SK_EntPnt_FYBA double LC_BerAvgrensLengde(void);
+SK_EntPnt_FYBA double LC_BerIndreAvgrensLengde(void);
+SK_EntPnt_FYBA double LC_BerYtreAvgrensLengde(void);
+SK_EntPnt_FYBA void LC_DumpTab(void);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylb.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short LC_GetGrFi(LC_FILADM **ppFil);
+SK_EntPnt_FYBA void LC_InitNextFil(LC_FILADM **ppFil);
+SK_EntPnt_FYBA short LC_NextFil(LC_FILADM **ppFil,unsigned short usLag);
+SK_EntPnt_FYBA void LC_InitNextBgr(LC_BGR * pBgr);
+SK_EntPnt_FYBA short LC_NextBgr(LC_BGR * pBgr,unsigned short usLag);
+SK_EntPnt_FYBA short LC_InqAntFiler(unsigned short usLag);
+SK_EntPnt_FYBA short LC_GetGrNr(LC_BGR * pBgr);
+SK_EntPnt_FYBA const char *LC_GetObjtypeBgr(LC_BGR * pBgr);
+SK_EntPnt_FYBA short LC_GetGrPara(short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_GetGrParaBgr(LC_BGR * pBgr,short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_RsGr(short *rstat,LC_FILADM *pFil,short *ngi,long *nko,
+ unsigned short *info,long *gml_snr);
+SK_EntPnt_FYBA short LC_RsHode(LC_FILADM *pFil,short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA void LC_WsGr(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_WsGrPart(LC_FILADM *pFil,long fra_punkt,long antall);
+SK_EntPnt_FYBA short LC_EndreHode(LC_FILADM *pFil);
+SK_EntPnt_FYBA short LC_RxGr(LC_BGR * pBgr,short les_sosi,short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_WxGr(short k_stat);
+SK_EntPnt_FYBA void LC_RoundKoord(void);
+SK_EntPnt_FYBA long LC_FiLastGr(LC_FILADM *pFil);
+SK_EntPnt_FYBA short LC_NyGr (LC_FILADM *pFil,char *sosi,LC_BGR * pBgr,long *snr);
+SK_EntPnt_FYBA short LC_CopyGr (LC_BGR * pBgr,short ngis,short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_CopyCoord(LC_BGR * pBgr,short retning,long til_linje,short *ngi,
+ long *nko,unsigned short *info);
+SK_EntPnt_FYBA short LC_DelGr(void);
+SK_EntPnt_FYBA void LC_SnuGr(void);
+SK_EntPnt_FYBA short LC_SplittGr (long p1,long p2,LC_BGR * pBgr2);
+SK_EntPnt_FYBA short LC_SammenfoyGr(LC_BGR * pFraBgr,short retning,short plassering,short metode,
+ short *ngi,long *nko,unsigned short *info);
+SK_EntPnt_FYBA void LC_ErstattReferanse (LC_FILADM *pFil,long lGmlSnr,long lNyttSnr, bool bSammeRetning);
+
+
+ /* Konstanter for SammenfoyGr() */
+#define LC_SG_FORRAN 1 /* Heng den andre gruppen inn forran første koordinat */
+#define LC_SG_BAK 2 /* Heng den andre gruppen inn etter siste koordinat */
+#define LC_SG_BEHOLD 3 /* Begge sammenføyings-punktene beholdes */
+#define LC_SG_FJERN 4 /* Bare det ene av sammenføyings-punktene beholdes */
+
+
+SK_EntPnt_FYBA short LC_InsGiL (short linje, short antall);
+SK_EntPnt_FYBA short LC_AppGiL (void);
+SK_EntPnt_FYBA short LC_DelGiL (short linje, short antall);
+SK_EntPnt_FYBA short LC_DelGiNavn(char *pszEgenskapNavn);
+SK_EntPnt_FYBA long LC_InsKoL (long linje, long antall);
+SK_EntPnt_FYBA long LC_AppKoL (void);
+SK_EntPnt_FYBA long LC_DelKoL (long linje, long antall);
+SK_EntPnt_FYBA void LC_Save (void);
+SK_EntPnt_FYBA void LC_OppdaterEndret(short endring);
+ #define O_GINFO 0 /* Oppdater tabeller i forhold til GINFO */
+ #define O_ENDRET 1 /* Merk for endret og oppdat. tab. */
+ #define O_SLETTET 2 /* Merk for slettet og oppdat. tab. */
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyli.c */
+/* ======================================================= */
+/* Brukttabellen */
+SK_EntPnt_FYBA void LC_SetBt(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA void LC_ClrBt(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA short LC_GetBt(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA void LC_EraseBt(short fra_kol,short til_kol);
+SK_EntPnt_FYBA void LC_CopyBt(short fra_kol,short til_kol,short operasjon);
+SK_EntPnt_FYBA void LC_SetModusMerk(unsigned short usModus);
+SK_EntPnt_FYBA long LC_MerkGr(short sKolonne,short sBryter);
+SK_EntPnt_FYBA void LC_ClrPrioritet(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA void LC_SetPrioritet(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA short LC_InqPrioritet(LC_BGR * pGr,short kolonne);
+SK_EntPnt_FYBA void LC_ErasePrioritet(LC_BGR * pGr);
+SK_EntPnt_FYBA void LC_EraseAllPrioritet(LC_FILADM *pFil);
+SK_EntPnt_FYBA void LC_DumpBt(const char *pszMelding);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyld.c */
+/* ======================================================= */
+SK_EntPnt_FYBA void LC_DelIdx(char *szSosFil);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyta.c */
+/* ======================================================= */
+/* Tabellsystemet */
+SK_EntPnt_FYBA short LC_InitTabel(long n_rec,short rec_len,void *buffer);
+SK_EntPnt_FYBA short LC_PutTabel(long linje,void *buffer);
+SK_EntPnt_FYBA short LC_GetTabel(long linje,void *buffer);
+SK_EntPnt_FYBA void LC_CloseTabel(void);
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyln.c */
+/* ======================================================= */
+SK_EntPnt_FYBA char *LC_FormatterKvalitet(short sMetode,long lNoyaktighet,short sSynbarhet,
+ short sHoydeMetode,long lHoydeNoyaktighet);
+SK_EntPnt_FYBA short LC_FinnNivo(const char *pszNavn);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyls.c */
+/* ======================================================= */
+SK_EntPnt_FYBA void LC_SBSn(LC_SNR_ADM *pSnrAdm,LC_FILADM *pFil,long lMinSnr,long lMaxSnr);
+SK_EntPnt_FYBA short LC_MoveSn(LC_SNR_ADM *pSnrAdm,long lSnr,LC_BGR * pBgr);
+SK_EntPnt_FYBA short LC_FiSn(LC_FILADM *pFil,long lSnr,LC_BGR * pBgr);
+SK_EntPnt_FYBA void LC_FiArraySn(LC_FILADM *pFil,short antall,long *snr,long *bgr);
+SK_EntPnt_FYBA long LC_FASn(LC_SNR_ADM *pSnrAdm);
+SK_EntPnt_FYBA short LC_FFSn(LC_SNR_ADM *pSnrAdm,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FNSn(LC_SNR_ADM *pSnrAdm,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FPSn(LC_SNR_ADM *pSnrAdm,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FLSn(LC_SNR_ADM *pSnrAdm,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FFSnBt(LC_SNR_ADM *pSnrAdm,short kolonne,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FNSnBt(LC_SNR_ADM *pSnrAdm,short kolonne,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FPSnBt(LC_SNR_ADM *pSnrAdm,short kolonne,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FLSnBt(LC_SNR_ADM *pSnrAdm,short kolonne,LC_BGR *pBgr);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylr.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short LC_GetGrWin(LC_BGR *pBgr,double *nva,double *nvn,double *oha,double *ohn);
+/* Flate-søk */
+SK_EntPnt_FYBA void LC_SBFlate(LC_GEO_STATUS *pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n);
+SK_EntPnt_FYBA short LC_FFFlate(LC_GEO_STATUS *pGeoStat,LC_BGR * pBgr);
+SK_EntPnt_FYBA short LC_FNFlate(LC_GEO_STATUS *pGeoStat,LC_BGR * pBgr);
+/* Geografisk søk primær gruppe */
+SK_EntPnt_FYBA void LC_SBGeo(LC_GEO_STATUS *pGeoStat,unsigned short usLag,
+ double nv_a,double nv_n,double oh_a,double oh_n);
+SK_EntPnt_FYBA short LC_FFGeo(LC_GEO_STATUS *pGeoStat,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FNGeo(LC_GEO_STATUS *pGeoStat,LC_BGR *pBgr);
+SK_EntPnt_FYBA long LC_FAGeo(LC_GEO_STATUS *pGeoStat);
+SK_EntPnt_FYBA short LC_FFGeoFil(LC_GEO_STATUS *pGeoStat,LC_FILADM *pFil,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_FNGeoFil(LC_GEO_STATUS *pGeoStat,LC_FILADM *pFil,LC_BGR *pBgr);
+SK_EntPnt_FYBA void LC_AvsluttSok(LC_GEO_STATUS *pGeoStat);
+
+/* Vindustest mm */
+SK_EntPnt_FYBA short LC_WTst(double nva,double nvn,double oha,double ohn);
+SK_EntPnt_FYBA short LC_PTst(double a,double n);
+SK_EntPnt_FYBA short LC_PTstOmkrets(double a,double n);
+
+/* Debugformål */
+SK_EntPnt_FYBA void LC_DumpGeoRtre(LC_FILADM *pFil);
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylu.c */
+/* ======================================================= */
+SK_EntPnt_FYBA LC_UT_ADM * LC_OpenQuery(void);
+SK_EntPnt_FYBA void LC_CloseQuery(LC_UT_ADM *pUtAdm);
+//SK_EntPnt_FYBA short LC_PutQueryLine(LC_UT_ADM *pUtAdm,char *qulin);
+SK_EntPnt_FYBA short LC_PutQueryLine(LC_UT_ADM *pUtAdm,const char *qulin,short sType);
+SK_EntPnt_FYBA void LC_PutQueryRegel(LC_UTVALG *pU,const char *navn);
+SK_EntPnt_FYBA short LC_LesUtvalg(LC_UT_ADM *pUtAdm,const char *pszKomFil);
+SK_EntPnt_FYBA char *LC_GetUtRegelNavn(LC_UT_ADM *pUtAdm,short *ist);
+SK_EntPnt_FYBA char *LC_GruppeUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *sstat,char **regelnavn);
+SK_EntPnt_FYBA short LU_GiTestUtvalg(LC_UT_ADM *pUtAdm,LC_UTVALG * pU);
+SK_EntPnt_FYBA void LC_PunktUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *psStat,long lPnr,char **ppszRegel);
+SK_EntPnt_FYBA LC_UTVALG *LC_FinnPinfoUtvalg(LC_UT_ADM *pUtAdm,const char *pszNavn);
+SK_EntPnt_FYBA short LC_PiTestUtvalg(LC_UT_ADM *pUtAdm,LC_UTVALG * pU,long lPnr);
+SK_EntPnt_FYBA short LC_GiQuery(LC_UT_ADM *pUtAdm);
+SK_EntPnt_FYBA long LC_FAGiQuery(LC_UT_ADM *pUtAdm,unsigned short usLag);
+SK_EntPnt_FYBA long LC_FAPiQuery(LC_UT_ADM *pUtAdm,unsigned short usLag);
+SK_EntPnt_FYBA long LC_FAGiKombinertFlateQuery(LC_UT_ADM *pUtAdmFlate,LC_UT_ADM *pUtAdmOmkrets,
+ unsigned short usLag,short sMetode);
+SK_EntPnt_FYBA short LC_QueryGP(char *qulin,unsigned short iniv,unsigned short *univ,short *ulin,char **para);
+SK_EntPnt_FYBA short LC_InqMaxPrioritet(LC_UT_ADM *pUA);
+SK_EntPnt_FYBA short LC_TestPrioritetBrukt(LC_UT_ADM *pUtAdm,short sPrioritet);
+SK_EntPnt_FYBA void LC_UtvalgPrioritet(LC_UT_ADM *pUtAdm);
+SK_EntPnt_FYBA void LC_LoggPrioritetUtvalg(LC_UT_ADM *pUtAdm);
+SK_EntPnt_FYBA void LU_FrigiUE(LC_UTVALG_ELEMENT *pUE);
+SK_EntPnt_FYBA short LU_AppUE (LC_UTVALG *pU,short sNiv,const char *pszTx);
+SK_EntPnt_FYBA void LC_PutLag(LC_UT_ADM *pUtAdm,LC_UTVALG *pU,const char *navn);
+SK_EntPnt_FYBA bool LC_ErLik_Avrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet);
+SK_EntPnt_FYBA bool LC_ErLik_IkkeAvrundet(double dA1,double dN1,double dA2, double dN2, double dEnhet);
+SK_EntPnt_FYBA bool LC_ErReferert(void);
+SK_EntPnt_FYBA long LC_ErReferertFraAntall(void);
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylp.c */
+/* ======================================================= */
+SK_EntPnt_FYBA void LC_POL_InitPolygon(LC_POLYGON *pPolygon);
+SK_EntPnt_FYBA void LC_POL_FrigiPolygon(LC_POLYGON *pPolygon);
+
+SK_EntPnt_FYBA void LC_POL_InitOmkrets(LC_POL_OMKR *pPO);
+SK_EntPnt_FYBA LC_POL_ELEMENT * LC_POL_LeggTilGruppeOmkrets(LC_POL_OMKR *pPO,LC_BGR *pBgr,short sRetning,long lSnr);
+SK_EntPnt_FYBA void LC_POL_FjernSisteGruppeOmkrets(LC_POL_OMKR *pPO);
+SK_EntPnt_FYBA void LC_POL_FjernGruppeOmkrets(LC_POL_OMKR *pPO, LC_POL_ELEMENT *pPE);
+SK_EntPnt_FYBA void LC_POL_FrigiOmkrets(LC_POL_OMKR *pPO);
+
+SK_EntPnt_FYBA void LC_POL_InitOy(LC_OY_ADM *pOA);
+SK_EntPnt_FYBA void LC_POL_FrigiAlleOyer(LC_OY_ADM *pOA);
+SK_EntPnt_FYBA void LC_POL_FjernOy(LC_OY_ADM *pOA,LC_OY_ELEMENT *pOE);
+SK_EntPnt_FYBA void LC_POL_LeggTilOy(LC_OY_ADM *pOA,LC_POL_OMKR *pPO);
+
+SK_EntPnt_FYBA short LC_POL_TestBrukt(LC_POLYGON *pPolygon,LC_BGR *pBgr);
+SK_EntPnt_FYBA short LC_POL_PutRef(LC_POLYGON *pPolygon);
+SK_EntPnt_FYBA void LC_POL_GetRef(LC_POLYGON *pPolygon);
+SK_EntPnt_FYBA void LC_POL_GetRefOmkrets(LC_POL_OMKR *pPO);
+SK_EntPnt_FYBA short LC_POL_PTst(LC_POLYGON *pPolygon,double a,double n);
+SK_EntPnt_FYBA short LC_POL_PTstOmkrets(LC_POL_OMKR *pPO,double a,double n);
+SK_EntPnt_FYBA short LC_POL_OmkretsSkjaering(LC_POL_OMKR *pPO,double a,double n);
+SK_EntPnt_FYBA void LC_POL_Box(LC_POL_OMKR *pPO,double *nva,double *nvn, double *oha,double*ohn);
+SK_EntPnt_FYBA short LC_ErLinjeRefLin(char *pszSosiLin, short sRefLin);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyln.c */
+/* ======================================================= */
+SK_EntPnt_FYBA const char *LC_GetElementNavn(LC_FILADM *pFil,short sNavnNr,bool *bBrukt);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyba.c */
+/* ======================================================= */
+SK_EntPnt_FYBA char *LC_InqVer(void);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyle.c */
+/* ======================================================= */
+SK_EntPnt_FYBA short LC_StrError(short feil_nr,char **feilmelding);
+
+SK_EntPnt_FYBA void LC_SetErrorHandler(void (*f) (short,const char*,const char*));
+SK_EntPnt_FYBA void LC_SetStartMessageHandler(void (*f)(const char*));
+SK_EntPnt_FYBA void LC_SetShowMessageHandler(void (*f)(double));
+SK_EntPnt_FYBA void LC_SetEndMessageHandler(void (*f)(void));
+SK_EntPnt_FYBA void LC_SetCancelHandler(short (*f)(void));
+
+//////////////////////////////////////////////////////////////////////////
+//
+// Når FYBA brukes som LIB må følgende funksjoner finnes definert
+//
+//////////////////////////////////////////////////////////////////////////
+void LC_Error (short ifeilnr, const char logtx[], const char vartx[]);
+void LC_StartMessage(const char *cfil);
+void LC_ShowMessage(double prosent);
+void LC_EndMessage(void);
+short LC_Cancel(void);
+
+//////////////////////////////////////////////////////////////////////////
+//
+// Når FYBA brukes som DLL må følgende funksjoner finnes definert.
+// Eksempel finnes i filen Fyba_Callback.cpp
+// Funksjonene aktiveres med LC_SetXxxxxHandler rutinene.
+// Hvis disse ikke blir aktivert brukes enkle rutiner som ligger i DLL-en.
+//
+//////////////////////////////////////////////////////////////////////////
+void LC_ErrorHandler (short ifeilnr, const char* logtx, const char* vartx);
+void LC_StartMessageHandler(const char *cfil);
+void LC_ShowMessageHandler(double prosent);
+void LC_EndMessageHandler(void);
+short LC_CancelHandler(void);
+
+
diff --git a/src/FYBA/fyba_strings.h b/src/FYBA/fyba_strings.h
new file mode 100644
index 0000000..e0c5253
--- /dev/null
+++ b/src/FYBA/fyba_strings.h
@@ -0,0 +1,223 @@
+# ifdef FYBA_STRINGS_EN
+/* =========== ENGLISH FYBA_STRINGS ================== */
+
+#define FYBA_STRING_BASE_UNKNOWN_TYPE "Unknown base type, cannot open base."
+#define FYBA_STRING_BASE_TOO_MANY_GROUPS "Too many groups in base."
+#define FYBA_STRING_FILE_NOT_FOUND "No .sos file found by the name:"
+#define FYBA_STRING_BASE_FYBA_NOT_INITD "Cannot open base - FYBA has not been initialized."
+#define FYBA_STRING_BASE_NOT_OPEN "Cannot open SOSI-file. Base has not been opened."
+#define FYBA_STRING_FILE_PERM_DENIED "Permission denied opening SOSI-file or creating index folder."
+#define FYBA_STRING_FILE_OPEN_FAILED "Error opening file:"
+#define FYBA_STRING_FILE_OMRAADE_MISSING "..OMRÃ…DE missing in file header:"
+#define FYBA_STRING_FILE_MIN_NOE_MISSING "...MIN-NØ missing in file header:"
+#define FYBA_STRING_FILE_MAX_NOE_MISSING "...MAX-NØ missing in file header:"
+#define FYBA_STRING_BASE_INDEX_ABORTED "Index construction aborted."
+#define FYBA_STRING_BASE_OPEN_FAILED "Error opening:"
+#define FYBA_STRING_FILE_NEW_HEADER "New header in:"
+#define FYBA_STRING_FILE_NOT_SOSI "Not a SOSI file:"
+#define FYBA_STRING_FILE_OMRAADE_INVALID "Invalid OMRÃ…DE in file header! (No dimensions.)"
+#define FYBA_STRING_SAVE_INVALID_FILEPTR "Invalid file pointer while saving."
+#define FYBA_STRING_OPEN_BASE_IS_KLADDE "Cannot open SOSI file. Base was opened as KLADDE. This can only be combined with sequential reading/writing."
+#define FYBA_STRING_FILE_READ_ERROR_HODE "Reading error in header line."
+#define FYBA_STRING_FILE_TRANSPAR_MISSING "..TRANSPAR missing in file header."
+#define FYBA_STRING_FILE_KOORDSYS_MISSING "...KOORDSYS missing in file header."
+#define FYBA_STRING_FILE_ORIGO_MISSING "...ORIGO-NØ missing in file header. (Check the encoding!)"
+#define FYBA_STRING_FILE_ENHET_MISSING "...ENHET missing in file header."
+#define FYBA_STRING_NAME_TABLE_FULL "Name table is full."
+#define FYBA_STRING_INVALID_GROUP_NAME "Invalid group name:"
+#define FYBA_STRING_FILE_NO_CURRENT_GROUP "No current group - nothing read."
+#define FYBA_STRING_OPEN_INVALID_EXTERN "Invalid external file - nothing read."
+#define FYBA_STRING_SAVE_INVALID_EXTERN "Invalid external file - nothing written."
+#define FYBA_STRING_SAVE_NO_WRITE_ACCESS "No write access, nothing written to the file:"
+#define FYBA_STRING_GROUP_DELETED "Group is deleted."
+#define FYBA_STRING_FILE_INVALID_GROUP_NR "Invalid group number, nothing read."
+#define FYBA_STRING_NEW_INVALID_FILE "Invalid file, cannot create new group."
+#define FYBA_STRING_NEW_NO_WRITE_ACCESS "No write access, cannot create new group."
+#define FYBA_STRING_NEW_TOO_MANY_GROUPS "Too many groups in base, cannot create new group."
+#define FYBA_STRING_NEW_INVALID_LINE_GI "Invalid line number for new GINFO"
+#define FYBA_STRING_NEW_INVALID_LINE_COO "Invalid line number for new coordinates."
+#define FYBA_STRING_SLUTT_MISSING ".SLUTT missing in SOSI file."
+#define FYBA_STRING_READ_ERROR "Error reading SOSI file."
+#define FYBA_STRING_GROUP_REFERRED_TO "Group is referenced by another group, cannot be deleted."
+#define FYBA_STRING_INVALID_GI_LINE_1 "Invalid GINFO line nr. 1."
+#define FYBA_STRING_CANT_REMOVE_HEADER "You cannot remove the file header."
+#define FYBA_STRING_NO_CURRENT_GROUP "No current group, nothing changed."
+#define FYBA_STRING_DEL_UNKNOWN_FLAG "Group has an unknown NGIS change flag, cannot be removed."
+#define FYBA_STRING_DEL_NO_WRITE_ACCESS "No write access, group cannot be removed."
+#define FYBA_STRING_ERR_FILESIZE_CHANGE "Error changing file size."
+#define FYBA_STRING_DISK_SOON_FULL "Your disk is soon full. Make some room at : "
+#define FYBA_STRING_NOT_A_HEADER "Current group is not a file header - nothing changed."
+#define FYBA_STRING_DEL_NOT_SEQUENTIAL "You cannot delete groups in sequential mode."
+#define FYBA_STRING_NO_CHANGE_HEADERS "Cannot change KOORDSYS, ENHET, ORIGO or NGIS-LAG in a file with data."
+#define FYBA_STRING_CANT_REWRITE_HEADER "No room to write back header."
+#define FYBA_STRING_SAVE_NOT_A_HEADER "Group is not a header, cannot save it as such."
+#define FYBA_STRING_CANT_COPY_COORD "Cannot copy coordinates from current group to another."
+#define FYBA_STRING_CANT_COPY_COORD_ROOM "Cannot copy coordinates: Not enough room in ring buffer."
+#define FYBA_STRING_ENHET_NOT_SET "ENHET is set to 0.0 in the file header, or header is missing:"
+#define FYBA_STRING_CANT_READ_FILE_SIZE "Error while retrieving file size:"
+#define FYBA_STRING_PINFO_LONG_OR_NO_NOE "PINFO too long -OR- ..NØ missing after PINFO:"
+#define FYBA_STRING_LOGIC_FAIL "Logic error in SOSI-file\nLine order error, property among coordinates:\n"
+#define FYBA_STRING_MAX_1_KP_OR_NO_NOE "Max. 1 KP per point -OR- ..NØ missing after KP:"
+#define FYBA_STRING_NO_ROOM_IN_HEADER "No room in header or corrupt:"
+#define FYBA_STRING_INVALID_GAP "Invalid gap in point-indentation:"
+#define FYBA_STRING_TOO_MANY_COORDINATES "Too many coordinates in group:"
+#define FYBA_STRING_TOO_MANY_GINFO "GINFO-line lost. Too many GINFO lines in:"
+#define FYBA_STRING_TOO_MUCH_GINFO "GINFO-line lost. Too much GINFO in:"
+#define FYBA_STRING_TOO_MUCH_PINFO "PINFO lost. Too much PINFO in:"
+#define FYBA_STRING_CANT_EXTEND_GROUP "Cannot extend group (too many coordinates):"
+#define FYBA_STRING_READ_NO_WRITE_ACCESS "Cannot read new group. No write access to save current, changed group. File:"
+#define FYBA_STRING_READ_LINE_TOO_LONG "Cannot read SOSI file. Line too long: "
+#define FYBA_STRING_INVALID_POINT "Invalid point number:"
+#define FYBA_STRING_INVALID_GINFO "Invalid GINFO line number:"
+#define FYBA_STRING_INVALID_NODE "Invalid Node type:"
+#define FYBA_STRING_INVALID_GROUP_NAME "Invalid group name:"
+#define FYBA_STRING_PINFO_TOO_LONG "PINFO too long, cannot fetch value. (Contact support/developers)"
+#define FYBA_STRING_INVALID_REF "Invalid REF in file:"
+#define FYBA_STRING_CANT_CHANGE_ENHET "Cannot change ENHET in a file with data:"
+#define FYBA_STRING_CANT_CHANGE_NGIS_LAG "Cannot change ..NGIS-LAG in a file with data:"
+#define FYBA_STRING_INVALID_BUE "Invalid curve (BUE) in file:"
+#define FYBA_STRING_CANT_CHANGE_ORIGO_NOE "Cannot change ..ORIGO-NØ in a file with data:"
+#define FYBA_STRING_PROB_TOO_LONG_PINFO "PINFO (probably) too long."
+#define FYBA_STRING_NO_HOEYDE_WITH_NAD "Group has ..NAD, cannot store height per point:"
+#define FYBA_STRING_NO_HOEYDE_WITH_NAH "Group has ..NAH, cannot store depth per point: "
+#define FYBA_STRING_LINE_TOO_LONG "SOSI-line too long (max. 1024 characters), line stripped. Group: "
+#define FYBA_STRING_INVALID_SERIAL "Invalid serial number:"
+#define FYBA_STRING_INVALID_LINE_NR "Invalid line number in table to unpack info:" /* check */
+#define FYBA_STRING_INVALID_GROUP_NR "Invalid group number, identifier corrupt:"
+#define FYBA_STRING_ERR_READING_BUFFER "Error reading from ring buffer."
+#define FYBA_STRING_ERR_WRITING_BUFFER "Error writing to ring buffer."
+#define FYBA_STRING_MUST_INIT_INDEX "Must initialize index table before saving."
+#define FYBA_STRING_ERR_READING_SEARCHT "Error reading geographic search table."
+#define FYBA_STRING_ERR_WRITING_SEARCHT "Error writing geographic search table."
+#define FYBA_STRING_ERR_READING_GROUPT "Error reading group table."
+#define FYBA_STRING_ERR_WRITING_GROUPT "Error writing group table."
+#define FYBA_STRING_ERR_READING_SERIALT "Error reading serial number table."
+#define FYBA_STRING_ERR_WRITING_SERIALT "Error writing serial number table."
+#define FYBA_STRING_ERR_READING_INFOT "Error reading info table."
+#define FYBA_STRING_ERR_WRITING_INFOT "Error writing info table."
+#define FYBA_STRING_ERR_INFOT_FULL "Info storage table is full."
+#define FYBA_STRING_ERR_READING_BRUKT "Error reading 'brukt'-table." /* check */
+#define FYBA_STRING_ERR_WRITING_BRUKT "Error writing 'brukt'-table."
+#define FYBA_STRING_NO_BLANKS_FILENAME "Cannot create catalog for index files with spaces in file name.\n"
+#define FYBA_STRING_TOO_MANY_CHOICES "Too many selections, no room for:"
+#define FYBA_STRING_MISPLACED_CHOICE "Misplaced selection line:"
+#define FYBA_STRING_GROUP_CHOICE_MISSING "Included group selection not found:"
+#define FYBA_STRING_INVALID_CHOICE "Invalid selection line:"
+#define FYBA_STRING_NO_COMPLEX_CHOICE "Complex selections (with OG or ELLER) do not work on PINFO."
+#define FYBA_STRING_GAP_IN_LEVEL "Invalid gap in indentation:"
+#define FYBA_STRING_TOO_MANY_PRIORITIES "Too many priorities, ignoring:"
+#define FYBA_STRING_DUPLICATE_DEFINITION "Level is defined twice in:" /* check */
+#define FYBA_STRING_UNKNOWN_ERROR "Unknown error message. Nr.: %d"
+
+# else
+/* =========== NORWEGIAN FYBA_STRINGS (DEFAULT) ======= */
+
+#define FYBA_STRING_BASE_UNKNOWN_TYPE "Ukjent BaseType er gitt, kan derfor ikke åpne base!"
+#define FYBA_STRING_BASE_TOO_MANY_GROUPS "For mange grupper i basen:"
+#define FYBA_STRING_FILE_NOT_FOUND "Finner ingen .SOS fil med navnet:"
+#define FYBA_STRING_BASE_FYBA_NOT_INITD "Kan ikke åpne base, FYBA er ikke initiert!"
+#define FYBA_STRING_BASE_NOT_OPEN "Kan ikke åpne SOSI-fil, fordi det ikke er åpnet noen base!"
+#define FYBA_STRING_FILE_OPEN_FAILED "Åpningsfeil på filen:"
+#define FYBA_STRING_FILE_PERM_DENIED "Tillatelse nektet under åpning av SOSI-fil eller lagring av indeksen."
+#define FYBA_STRING_FILE_OMRAADE_MISSING "..OMRÅDE mangler i filhodet på filen:"
+#define FYBA_STRING_FILE_MIN_NOE_MISSING "...MIN-NØ mangler i filhodet på filen:"
+#define FYBA_STRING_FILE_MAX_NOE_MISSING "...MAX-NØ mangler i filhodet på filen:"
+#define FYBA_STRING_BASE_INDEX_ABORTED "Indeksoppbygging er avbrutt!"
+#define FYBA_STRING_BASE_OPEN_FAILED "Åpningsfeil på:"
+#define FYBA_STRING_FILE_NEW_HEADER "Nytt hode på:"
+#define FYBA_STRING_FILE_NOT_SOSI "Ikke SOSI-fil:"
+#define FYBA_STRING_FILE_OMRAADE_INVALID "Ulovlig OMRÃ…DE-angivelse i filhodet! (Ingen utstrekning.)"
+#define FYBA_STRING_SAVE_INVALID_FILEPTR "Ulovlig filpeker ved kall til lagringssystemet, rutine"
+#define FYBA_STRING_OPEN_BASE_IS_KLADDE "Kan ikke åpne SOSI-fil. Basen er åpnet som kladdebase. Dette kan bare kombineres med sekvensiell les/skriv av SOSI-fil."
+#define FYBA_STRING_FILE_READ_ERROR_HODE "Lesefeil ved lesing av hodelinje."
+#define FYBA_STRING_FILE_TRANSPAR_MISSING "..TRANSPAR mangler i filhodet."
+#define FYBA_STRING_FILE_KOORDSYS_MISSING "...KOORDSYS mangler i filhodet."
+#define FYBA_STRING_FILE_ORIGO_MISSING "...ORIGO-NØ mangler i filhodet. (Feil tegnsett?)"
+#define FYBA_STRING_FILE_ENHET_MISSING "...ENHET mangler i filhodet."
+#define FYBA_STRING_NAME_TABLE_FULL "Navnetabellen er full."
+#define FYBA_STRING_INVALID_GROUP_NAME "Ulovlig gruppenavn:"
+#define FYBA_STRING_FILE_NO_CURRENT_GROUP "Ingen aktuell gruppe, ingenting er lest!"
+#define FYBA_STRING_OPEN_INVALID_EXTERN "Ulovlig ekstern fil, ingenting er lest!"
+#define FYBA_STRING_SAVE_INVALID_EXTERN "Ulovlig ekstern fil, ingenting er skrevet!"
+#define FYBA_STRING_SAVE_NO_WRITE_ACCESS "Du har ikke skriveaksess, ingenting er skrevet til filen:"
+#define FYBA_STRING_GROUP_DELETED "Gruppen er sletta."
+#define FYBA_STRING_FILE_INVALID_GROUP_NR "Ulovlig gruppenummer, ingenting er lest!"
+#define FYBA_STRING_NEW_INVALID_FILE "Ulovlig fil, kan ikke lage ny gruppe!"
+#define FYBA_STRING_NEW_NO_WRITE_ACCESS "Du har ikke skriveaksess, kan ikke lage ny gruppe!"
+#define FYBA_STRING_NEW_TOO_MANY_GROUPS "For mange grupper i basen, kan ikke lage ny gruppe:"
+#define FYBA_STRING_NEW_INVALID_LINE_GI "Ulovlig linjenummer for ny GINFO:"
+#define FYBA_STRING_NEW_INVALID_LINE_COO "Ulovlig linjenummer for ny koordinat:"
+#define FYBA_STRING_SLUTT_MISSING ".SLUTT mangler på SOSI-filen"
+#define FYBA_STRING_READ_ERROR "Lesefeil på SOSI-filen"
+#define FYBA_STRING_GROUP_REFERRED_TO "Gruppen er referert fra annen gruppe, kan ikke slette gruppen!"
+#define FYBA_STRING_INVALID_GI_LINE_1 "Ulovlig GINFO-linje nr 1:"
+#define FYBA_STRING_CANT_REMOVE_HEADER "Det er ikke mulig å slette filhodet!"
+#define FYBA_STRING_NO_CURRENT_GROUP "Det er ingen aktuell gruppe, ingenting er utført!"
+#define FYBA_STRING_DEL_UNKNOWN_FLAG "Gruppen har ukjent NGIS endringsflagg, kan ikke slette gruppen!"
+#define FYBA_STRING_DEL_NO_WRITE_ACCESS "Du har ikke skriveaksess, kan ikke slette gruppen!"
+#define FYBA_STRING_ERR_FILESIZE_CHANGE "Feil ved endring av filstørrelse!"
+#define FYBA_STRING_DISK_SOON_FULL "Disken er snart full. Rydd plass til : "
+#define FYBA_STRING_NOT_A_HEADER "Aktuell gruppe er ikke SOSI-filhode, ingenting er utført"
+#define FYBA_STRING_DEL_NOT_SEQUENTIAL "Det er ikke mulig å slette gruppe på sekvensiell fil!"
+#define FYBA_STRING_NO_CHANGE_HEADERS "Kan ikke endre KOORDSYS, ENHET, ORIGO eller NGIS-LAG på fil med data!"
+#define FYBA_STRING_CANT_REWRITE_HEADER "Det er ikke plass til å skrive tilbake filhodet!"
+#define FYBA_STRING_SAVE_NOT_A_HEADER "Gruppen er ikke filhode, kan ikke lagre den som filhode!"
+#define FYBA_STRING_CANT_COPY_COORD "Kan ikke kopiere koord. fra akt. gruppe til akt.gruppe!"
+#define FYBA_STRING_CANT_COPY_COORD_ROOM "Kan ikke kopiere koordinater: (ikke nok plass i ringbuffer)!"
+#define FYBA_STRING_ENHET_NOT_SET "ENHET er 0.0 i filhodet, eller filhode mangler på filen:"
+#define FYBA_STRING_CANT_READ_FILE_SIZE "Feil ved hent av filstørrelse på filen:"
+#define FYBA_STRING_PINFO_LONG_OR_NO_NOE "For lang PINFO / ..NØ mangler etter PINFO! :"
+#define FYBA_STRING_LOGIC_FAIL "Logisk feil i SOSI-fil.\nNivåfeil, egenskap mellom koordinatene:\n"
+#define FYBA_STRING_MAX_1_KP_OR_NO_NOE "Max. 1 KP pr. punkt / ..NØ mangler etter KP! :"
+#define FYBA_STRING_NO_ROOM_IN_HEADER "Ikke plass til hodet, ødelagt på filen :"
+#define FYBA_STRING_INVALID_GAP "Ulovlig sprang i prikk-nivå!:"
+#define FYBA_STRING_TOO_MANY_COORDINATES "For mange koordinater i gruppe:"
+#define FYBA_STRING_TOO_MANY_GINFO "GINFO-linje mistes! For mange GINFO linjer i:"
+#define FYBA_STRING_TOO_MUCH_GINFO "GINFO-linje mistes! For mye GINFO i:"
+#define FYBA_STRING_TOO_MUCH_PINFO "PINFO mistes! For mye PINFO i:"
+#define FYBA_STRING_CANT_EXTEND_GROUP "Kan ikke utvide gruppe (for mange koordinater):"
+#define FYBA_STRING_READ_NO_WRITE_ACCESS "Kan ikke lese ny gruppe. Du har ikke skriveaksess for å lagre aktuell gruppe som er endret. Fil :"
+#define FYBA_STRING_READ_LINE_TOO_LONG "Kan ikke lese SOSI-fil. For lang SOSI-linje: "
+#define FYBA_STRING_INVALID_POINT "Ulovlig punktnummer:"
+#define FYBA_STRING_INVALID_GINFO "Ulovlig GINFO-linje nummer:"
+#define FYBA_STRING_INVALID_NODE "Ulovlig Knutepunkt-type:"
+#define FYBA_STRING_INVALID_GROUP_NAME "Ulovlig gruppenavn:"
+#define FYBA_STRING_PINFO_TOO_LONG "For lang PINFO, klarer ikke å hente verdi. (Kontakt FYSAK-support)"
+#define FYBA_STRING_INVALID_REF "OBS! Ulovlig ref. i filen:"
+#define FYBA_STRING_CANT_CHANGE_ENHET "Kan ikke endre ENHET på fil med data, bruker:"
+#define FYBA_STRING_CANT_CHANGE_NGIS_LAG "Kan ikke endre ..NGIS-LAG på fil med data, bruker:"
+#define FYBA_STRING_INVALID_BUE "OBS! Ulovlig bue i filen:"
+#define FYBA_STRING_CANT_CHANGE_ORIGO_NOE "Kan ikke endre ..ORIGO-NØ på fil med data, bruker:"
+#define FYBA_STRING_PROB_TOO_LONG_PINFO "Sannsynligvis for lang PINFO !"
+#define FYBA_STRING_NO_HOEYDE_WITH_NAD "Gruppen har ..NAD, kan ikke legge inn høyde på punktnivå i:"
+#define FYBA_STRING_NO_HOEYDE_WITH_NAH "Gruppen har ..NAH, kan ikke legge inn dybde på punktnivå i: "
+#define FYBA_STRING_LINE_TOO_LONG "For lang SOSI-linje (max 1024 tegn), linjen forkortes. Gruppe: "
+#define FYBA_STRING_INVALID_SERIAL "Ulovlig serienummer:"
+#define FYBA_STRING_INVALID_LINE_NR "Ulovlig linjenummer i tabell for upakka info:"
+#define FYBA_STRING_INVALID_GROUP_NR "Ulovlig gruppenummer, merking fungerer ikke :"
+#define FYBA_STRING_ERR_READING_BUFFER "Feil ved les fra ringbuffer!"
+#define FYBA_STRING_ERR_WRITING_BUFFER "Feil ved skriv til ringbuffer!"
+#define FYBA_STRING_MUST_INIT_INDEX "Indekstabellene må initieres før lagring"
+#define FYBA_STRING_ERR_READING_SEARCHT "Feil ved les fra geografisk søketabell!"
+#define FYBA_STRING_ERR_WRITING_SEARCHT "Feil ved skriv til geografisk søketabell!"
+#define FYBA_STRING_ERR_READING_GROUPT "Feil ved les fra gruppetabell!"
+#define FYBA_STRING_ERR_WRITING_GROUPT "Feil ved skriv til gruppetabell!"
+#define FYBA_STRING_ERR_READING_SERIALT "Feil ved les fra serienummer-tabell!"
+#define FYBA_STRING_ERR_WRITING_SERIALT "Feil ved skriv til serienummer-tabell!"
+#define FYBA_STRING_ERR_READING_INFOT "Feil ved les fra info-tabell!"
+#define FYBA_STRING_ERR_WRITING_INFOT "Feil ved skriv til info-tabell!"
+#define FYBA_STRING_ERR_INFOT_FULL "Tabell for upakka info er full!"
+#define FYBA_STRING_ERR_READING_BRUKT "Feil ved les fra brukt-tabell!"
+#define FYBA_STRING_ERR_WRITING_BRUKT "Feil ved skriv til brukt-tabell!"
+#define FYBA_STRING_NO_BLANKS_FILENAME "Kan ikke opprette katalog for indeksfiler når det er blanke sist i filnavnet!\n"
+#define FYBA_STRING_TOO_MANY_CHOICES "For mange utvalg, ikke plass til:"
+#define FYBA_STRING_MISPLACED_CHOICE "Feilplasert utvalgslinje:"
+#define FYBA_STRING_GROUP_CHOICE_MISSING "Inkludert gruppeuvtalg finnes ikke:"
+#define FYBA_STRING_INVALID_CHOICE "Ulovlig utvalgslinje:"
+#define FYBA_STRING_NO_COMPLEX_CHOICE "Komplekse utvalg (..OG og ..ELLER) fungerer ikke for PINFO!"
+#define FYBA_STRING_GAP_IN_LEVEL "Ulovlig sprang i nivå!:"
+#define FYBA_STRING_TOO_MANY_PRIORITIES "For mange prioriteter, mister prioritet :"
+#define FYBA_STRING_DUPLICATE_DEFINITION "Lag er dobbeltdefinert i utvalg :"
+#define FYBA_STRING_UNKNOWN_ERROR "Ukjent feilmelding. Nr.: %d"
+
+# endif
diff --git a/src/FYBA/fybax.h b/src/FYBA/fybax.h
new file mode 100644
index 0000000..92eef6f
--- /dev/null
+++ b/src/FYBA/fybax.h
@@ -0,0 +1,344 @@
+/* == AR-991012 =========================================================== */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fybax.h */
+/* Innhold: Interne prototyper for fysak-pc */
+/* Def. av typer og bufferstørrelser */
+/* Definisjon av filtabellen, ringbuffer mm. */
+/* ======================================================================== */
+
+#pragma once
+
+#include "fyba.h"
+
+
+/* ======================================================= */
+/* Definerer konstanter */
+/* ======================================================= */
+#ifndef _FYBAX_DEFINED
+
+# define FYBA_IDENT "FYBA - G2.0 2011-03-10"
+# define FYBA_INDEKS_VERSJON "G009"
+# define FYBA_SOSI_VERSJON 400
+
+ /* Definerer PI */
+//# ifndef PI
+////# define PI (3.14159265358979324)
+//# define PI (3.14159265358979323846)
+//# endif
+
+/* --- Konstant for testing av likhet på desimaltall -- */
+#define LC_ACCY 1.0E-9
+
+
+ /* Basetype */
+ /* #define LC_START_KLADD 2 */ /* Åpning av kladdebase */
+ /* (LC_BASE og LC_KLADD er definert i FYBA.H) */
+
+ /* Filtabell */
+ /* #define NO_OPEN_SOS -1 */ /* Ingen åpen SOSI-fil */
+
+ /* Kommando til LB_Wgru */
+# define KONTROLLER_PLASS 1 /* Bare kontroller plass, (ikke skriv SOSI) */
+# define SKRIV_VANLIG 2 /* Skriv til SOSI, vanlig */
+# define SKRIV_SISTE 3 /* Skriv til SOSI, med .SLUTT og bytepointer */
+
+ /* Diverse */
+# define NYTT_SNR -1L /* Startverdi for akt.snr i filtabellen */
+
+# define NY_SOSI_ST -1L /* Start.sosi når gruppe ikke er skrevet */
+# define NY_RB_ST -1L /* Start.rb når gruppe ikke er skrevet */
+# define NY_UI_ST -1L /* Start.UI når gruppe ikke er skrevet */
+
+/*
+ * Diverse for intern mellomlagring av hele PINFO
+ */
+ /* Statusverdier */
+# define LC_PIBUF_TOM 0
+# define LC_PIBUF_OK 1
+# define LC_PIBUF_FULL 2
+ /* Ant. tegn i buffer */
+# define LC_MAX_PIBUF_TEGN LC_MAX_SOSI_LINJE_LEN
+ /* Ant linjer i tabell med pekere til startposisjoner i strengen */
+# define LC_MAX_PIBUF_LIN 50
+
+# define LI_LESEFEIL -1 // Filen er åpen i annet program
+# define LI_OPPTATT -2 // Filen er åpen i annet program
+# define LI_FEIL_INDEKSVERSJON -3 // Feil indeksversjon
+# define LI_FEIL_STORRELSE -4 // Feil størrelse på SOSI-filen
+# define LI_FEIL_OPPDATTID -5 // Feil oppdateringstid på SOSI-filen
+
+
+# define _FYBAX_DEFINED
+#endif
+
+
+/* ================================================ */
+/* Definerer data-strukturer */
+/* ================================================ */
+
+/* Lesebuffer */
+/* Konstanter for set_brukt */
+#define SET_UBRUKT 0
+#define SET_BRUKT 1
+
+/* Konstanter for sStatus */
+#define LESEBUFFER_TOM 0 /* (Tom eller ikke ajour) */
+#define LESEBUFFER_OK 1
+
+ /* Verdier for cur_type */
+ /* >= 0 : Gruppenavn,linjenummer i navnetab. */
+#define LEST_KOORD -1 /* Koordinatlinje */
+#define LEST_BLANK -2 /* "blank linje" (!!!, mm) */
+#define LEST_GINFO -3 /* GINFO */
+#define LEST_KOM -4 /* Kommentar-linje */
+
+
+/* Felles streng for feilmeldinger */
+#define LC_ERR_LEN 300
+typedef struct dLC_FEILMELDING {
+ short nr;
+ short strategi;
+ char tx[LC_ERR_LEN];
+} LC_FEILMELDING;
+
+
+/* UTVALG */
+/*
+ // Utvalgskommandoer
+#define U_OG 1 // ..OG
+#define U_ELLER 2 // ..VELG og ..ELLER
+
+
+ // Utvalgsmetoder
+#define U_IKKE 0 // ! Ikke (Tilslag når SOSI-navnet
+ // ikke finnes. Bare GINFO.)
+#define U_ALLE 1 // AL Alle
+#define U_FRATIL 2 // <> Fra-til
+#define U_UTENFOR 3 // >< Utenfor
+#define U_MINDRE 4 // < Mindre-enn
+#define U_STORRE 5 // > Større-enn
+#define U_DELELIG 6 // / Delelig-med, eventuellt med
+ // sjekk på om restverdi er 2. verdi
+#define U_UDELELIG 7 // !/ Ikke-delelig-med
+#define U_CONTEIN 8 // () Inneholder
+#define U_IKKECONTEIN 9 // !() Inneholder ikke (Tilslag når
+ // denne navn og verdi kombinasjonen
+ // ikke finnes)
+#define U_LIK 10 // = Lik
+#define U_IKKEVALGT 11 // IV Ikke valgt (Tilslag når gruppen
+ // ikke er tegnet ennå. Kombineres
+ // med SOSI-navnet "..*")
+#define U_IKKELIK 12 // != Ikke lik (Tilslag når denne
+ // navn og verdi kombinasjonen ikke
+ // finnes)
+#define U_FLERE 13 // FL Flere (Tilslag når SOSI-navnet
+ // forekommer flere ganger.)
+#define U_IKKEFLERE 14 // !FL Ikke flere enn (Tilslag når
+ // SOSI-navnet IKKE forekommer
+ // flere ganger enn gitt antall.)
+
+
+
+ // Parametertyper
+#define U_TALL 1 // Heltall
+#define U_FLYT 2 // Flyttall
+#define U_ALFA 9 // Tekststreng
+*/
+
+ /* GINFO i minne */
+typedef struct dLC_GINFO_BUFFER {
+ char *pszTx; /* GINFO buffer */
+ unsigned long ulOfset[LC_MAX_GINFO]; /* Peker til starten av hver GINFO-linje */
+} LC_GINFO_BUFFER;
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Systemadministrasjon !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dLC_SYSTEMADM {
+ char szBaseVer[LC_BASEVER_LEN]; // Versjon og dato for aktuell versjon av FYBA
+ char szIdxVer[5]; // Indeksfil-versjon
+
+ short sResPlass; // Ant. tegn reserve plass bak ny gruppe
+ long lMaxSkriv; // Max antall skriv uten lagring til SOSI-filen
+ long lAntSkriv; // Antall skriv siden siste lagring til SOSI
+ short sNGISmodus; // Behandlingsmåte for grupper med NGIS-oppdateringsflagg
+ short sUtvidModus; // Handteringsmåte for utvidelse av SOSI-filer.
+ char szIdxPath[_MAX_PATH]; //Katalognavn for ny indeks.
+ LB_LESEBUFFER BufAdm; // Lesebuffer mot SOSI-fil-hode
+
+ LC_NAVNETABELL SosiNavn; // Navnetabell (brukes av HO-rutinene)
+
+ /* Div opplysninger om aktuell gruppe */
+ short sGrEndra; // Er aktuell gruppe endra?
+ LC_BGR GrId; // Gruppens identifikasjon
+ LC_GRTAB_LINJE *pGrInfo; // Peker til gruppetabell-linje
+
+ /* Aktuell gruppe i minne */
+ /* GINFO i minne */
+ LC_GINFO_BUFFER Hode; // Hodebuffer
+ unsigned short usHoLen; // Ant tegn i hodebuffer
+ LC_GINFO_BUFFER Ginfo; // GINFO-buffer
+ double *pdAust; // Øst koordinat
+ double *pdNord; // Nord koordinat
+ LB_INFO * pInfo; // Høyde,KP og PINFO-peker
+ char *pszPinfo; // PINFO buffer
+
+ /* Søkebuffer for PINFO */
+ long lPibufPnr; // Punktnummer for data i buffer
+ short sPibufAntPi; // Antall elementer brukt i PIbuf
+ char cPibuf[LC_MAX_PIBUF_TEGN]; // Kopi av PINFO, (for raskere søking)
+ short sPibufStatus; // Status for bruken av cPibuf
+ /* Peker til startposisjoner i cPibuf for hver PINFO */
+ char *pcPibufNavn[LC_MAX_PIBUF_LIN]; // Peker til SOSI-navn
+ char *pcPibufVerdi[LC_MAX_PIBUF_LIN]; // Peker til verdi
+
+ unsigned short usMerkRefGr; // Flagg for å vise om refererte grupper skal merkes ved utvalg
+
+ LC_BASEADM * pForsteBase; // Peker til første base-adm.
+ LC_BASEADM * pAktBase; // Peker til aktuell base-adm.
+} LC_SYSTEMADM;
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyho.c */
+/* ======================================================= */
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylb.c */
+/* ======================================================= */
+void LB_Save(LC_FILADM *pFil);
+void LB_NyRp(void);
+short LB_RGru(LC_FILADM *pFil,UT_INT64 start,UT_INT64 *slutt);
+void LB_Swap(void);
+char *LB_FormaterEnhet(char *streng,short sStrengMaxLen,char *SosiNavn,double enhet);
+void LB_ClGr (void);
+short LB_WGru (short strategi,long fra_punkt,long antall,
+ LC_FILADM *pFil,UT_INT64 ffipos,UT_INT64 *lfipos);
+short LB_Plass(LC_FILADM *pFil, UT_INT64 start, UT_INT64 *neste);
+short LB_WriteLine (FILE *fil,short sTegnsett,char *tx);
+short LB_GetSet(FILE *fil,LB_LESEBUFFER *plb,LC_NAVNETABELL * pNavn);
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyli.c */
+/* ======================================================= */
+short LI_TestIdx(char *szSosFil);
+short LI_OpenInit(LC_FILADM *pFil);
+short LI_OpenRead(LC_FILADM *pFil);
+void LI_Close(LC_FILADM *pFil,short s_stat);
+void LI_SaveAdm(LC_FILADM *pFil);
+
+LC_R_LEAF * LI_GetGeo(LC_FILADM *pFil,long linje);
+/* void LI_PutGeo(LC_FILADM *pFil,long linje,LC_GEOSOK_BOKS *geop); */
+
+long LI_GetSnr(LC_FILADM *pFil,long lSnr);
+void LI_PutSnr(LC_FILADM *pFil,long lSnr,long lGrNr);
+
+LC_GRTAB_LINJE * LI_GetGrt(LC_FILADM *pFil,long linje);
+LC_GRTAB_LINJE * LI_AppGrt(LC_FILADM *pFil,long linje);
+
+unsigned long LI_GetBt(LC_FILADM *pFil,long linje);
+void LI_PutBt(LC_FILADM *pFil,long linje,unsigned long bt_val);
+
+void LI_SetBt(LC_FILADM *pFil,long lGrNr,short kolonne);
+void LI_ClrBt(LC_FILADM *pFil,long lGrNr,short kolonne);
+short LI_InqBt(LC_FILADM *pFil,long lGrNr,short kolonne);
+void LI_EraseBt(short fra_kol,short til_kol);
+
+void LI_WriteRb(LC_FILADM *pFil, UT_INT64 n64FilPos,
+ char *pszGi, unsigned long ulGiLen,
+ double *pdAust, double *pdNord,
+ LB_INFO * pInfo, long lNko,
+ char *pszPi, unsigned long ulPiLen);
+void LI_ReadRb(LC_FILADM *pFil, UT_INT64 n64FilPos,
+ char *pszGi, unsigned long ulGiLen,
+ double *pdAust, double *pdNord,
+ LB_INFO * pInfo, long lNko,
+ char *pszPi, unsigned long ulPiLen);
+void LI_ReadCoordRb(LC_FILADM *pFil, UT_INT64 n64FilPos, unsigned long ulGiLen,
+ double *pdAust, double *pdNord,
+ LB_INFO * pInfo, long lNko,
+ char *pszPi, unsigned long ulPiLen);
+long LI_BerBufferLen(unsigned long ulGiLen,long lNko,unsigned long ulPiLen);
+
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyln.c */
+/* ======================================================= */
+void LN_InitTab(LC_NAVNETABELL *pLn);
+short LN_Enhet(LC_NAVNETABELL *pLn,char *ginfo_linje);
+short LN_EnhetHoyde(LC_NAVNETABELL *pLn,char *ginfo_linje);
+short LN_EnhetDybde(LC_NAVNETABELL *pLn,char *ginfo_linje);
+short LN_TestOy(char *ginfo_linje);
+short LN_PakkNavn(LC_NAVNETABELL *pLn,char *navn,short *navn_nr,
+ short *ant_par);
+short LN_FinnNavn(LC_NAVNETABELL *pLn,char *navn,short *navn_nr);
+char *LN_GetNavn(LC_NAVNETABELL *pLn,short navn);
+char *LN_VisNavn(LC_NAVNETABELL *pLn,short navn);
+void LN_TolkKvalitet(char *pszParameter,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyls.c */
+/* ======================================================= */
+void LS_Indx(void);
+void LS_PutSn(LC_FILADM *pFil,long lGrNr,long lSnr);
+char * LS_VisSn(LC_FILADM *pFil,long lin);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylr.c */
+/* ======================================================= */
+/* Indeksoppbygging */
+void LR_Indx(void);
+void LR_IndxFlate(void);
+short LR_PTstGruppe(LC_BGR * pBgr,double a,double n);
+void LR_R_Delete(LC_R_LEAF * pCL);
+LC_R_LEAF * LR_InsertGeo(LC_FILADM *pFil,long lNr,LC_BOKS * pB);
+void LR_R_FrigiGren(LC_R_NODE *pRN);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylo.c */
+/* ======================================================= */
+LC_FEILMELDING& err();
+void LO_CloseSos(LC_BASEADM *pBase);
+void LO_ReopenSos(LC_FILADM *pFil);
+void LO_BeFt(LC_FILADM *pFil);
+void LO_TestFilpeker(LC_FILADM *pFil,char *pszRutineNavn);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylx.c */
+/* ======================================================= */
+void LX_PutSn(long snr);
+void LX_CreGiPeker(LC_GINFO_BUFFER *pGinfo,short ngi);
+char *LX_GetGi(short lin_nr);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylp.c */
+/* ======================================================= */
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fylh.c */
+/* ======================================================= */
+char* LH_GetNgisLag(void);
+
+/* ======================================================= */
+/* Funksjonsdefinisjoner for fyho.c */
+/* ======================================================= */
+void ho_New(FILE *fil,short koosys,double origo_a,double origo_n,
+ double enhet,double enhet_h,double enhet_d,
+ double nv_a,double nv_n,double oh_a,double oh_n);
+short ho_TestSOSI(FILE *fil,UT_INT64 *sluttpos);
+char *ho_GetVal(FILE *fil,char *sosi_navn,short *sett_nr);
+short ho_GetKvalitet(FILE *fil,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet);
+short ho_GetTrans(FILE *fil,short *koosys,double *origo_a,
+ double *origo_n,double *enhet,double *enhet_h,double *enhet_d);
+short ho_GetTransEx(FILE *pFil,unsigned short *pusMaske, LC_TRANSPAR * pTrans);
+short ho_GetOmr(FILE *fil,double *nv_a,double *nv_n,double *oh_a,double *oh_n);
+short ho_GetTegnsett(FILE *pfFil,short *psTegnsett);
+short ho_SjekkTegnsett(FILE *fil,short *psTegnsett);
+short ho_FinnHode(FILE *pFil, UT_INT64 *lHodepos);
+
diff --git a/src/FYBA/fyln.cpp b/src/FYBA/fyln.cpp
new file mode 100644
index 0000000..8d8c362
--- /dev/null
+++ b/src/FYBA/fyln.cpp
@@ -0,0 +1,870 @@
+/* == AR 910819 ========================================== */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: fyln.c */
+/* Innhold: Navnesystem for fysak-pc */
+/* ======================================================= */
+
+#include "stdafx.h"
+
+#include <fcntl.h>
+#include <ctype.h>
+#include <limits.h>
+
+
+/*
+AR-890616
+CH LN_InitTab Klargjør navnetabell
+CD ==========================================================================
+CD Formål:
+CD Initierer navnetabellen med kjente navn.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_NAVNETABELL * pLn i Peker til navnetabell
+CD
+CD Bruk:
+CD LN_InitTab(pLn);
+ ==========================================================================
+*/
+void LN_InitTab(LC_NAVNETABELL * pLn)
+{
+ UT_StrCopy(pLn->sosi[L_SLUTT].szNavn, ".SLUTT", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_SLUTT].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_SLUTT].cNivo = 1;
+ pLn->sosi[L_SLUTT].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_PUNKT].szNavn, ".PUNKT", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_PUNKT].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_PUNKT].cNivo = 1;
+ pLn->sosi[L_PUNKT].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_LINJE].szNavn, ".LINJE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_LINJE].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_LINJE].cNivo = 1;
+ pLn->sosi[L_LINJE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_KURVE].szNavn, ".KURVE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_KURVE].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_KURVE].cNivo = 1;
+ pLn->sosi[L_KURVE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_BUE].szNavn, ".BUE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_BUE].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_BUE].cNivo = 1;
+ pLn->sosi[L_BUE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_BUEP].szNavn, ".BUEP", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_BUEP].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_BUEP].cNivo = 1;
+ pLn->sosi[L_BUEP].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_SIRKEL].szNavn, ".SIRKEL", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_SIRKEL].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_SIRKEL].cNivo = 1;
+ pLn->sosi[L_SIRKEL].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_SIRKELP].szNavn, ".SIRKELP", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_SIRKELP].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_SIRKELP].cNivo = 1;
+ pLn->sosi[L_SIRKELP].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_KLOTOIDE].szNavn, ".KLOTOIDE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_KLOTOIDE].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_KLOTOIDE].cNivo = 1;
+ pLn->sosi[L_KLOTOIDE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_BEZIER].szNavn, ".BEZIER", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_BEZIER].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_BEZIER].cNivo = 1;
+ pLn->sosi[L_BEZIER].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_RASTER].szNavn, ".RASTER", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_RASTER].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_RASTER].cNivo = 1;
+ pLn->sosi[L_RASTER].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_TEKST].szNavn, ".TEKST", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_TEKST].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_TEKST].cNivo = 1;
+ pLn->sosi[L_TEKST].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_TRASE].szNavn, ".TRASE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_TRASE].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_TRASE].cNivo = 1;
+ pLn->sosi[L_TRASE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_FLATE].szNavn, ".FLATE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_FLATE].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_FLATE].cNivo = 1;
+ pLn->sosi[L_FLATE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_SVERM].szNavn, ".SVERM", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_SVERM].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_SVERM].cNivo = 1;
+ pLn->sosi[L_SVERM].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_DEF].szNavn, ".DEF", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_DEF].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_DEF].cNivo = 1;
+ pLn->sosi[L_DEF].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_OBJDEF].szNavn, ".OBJDEF", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_OBJDEF].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_OBJDEF].cNivo = 1;
+ pLn->sosi[L_OBJDEF].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_MLINJE].szNavn, ".MLINJE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_MLINJE].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_MLINJE].cNivo = 1;
+ pLn->sosi[L_MLINJE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_STRUKTUR].szNavn, ".STRUKTUR", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_STRUKTUR].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_STRUKTUR].cNivo = 1;
+ pLn->sosi[L_STRUKTUR].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_OBJEKT].szNavn, ".OBJEKT", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_OBJEKT].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_OBJEKT].cNivo = 1;
+ pLn->sosi[L_OBJEKT].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_SYMBOL].szNavn, ".SYMBOL", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_SYMBOL].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_SYMBOL].cNivo = 1;
+ pLn->sosi[L_SYMBOL].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_HODE].szNavn, ".HODE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_HODE].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_HODE].cNivo = 1;
+ pLn->sosi[L_HODE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_NA].szNavn, "..NØ", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_NA].ucAntPar = 2;
+ pLn->sosi[L_NA].cNivo = 2;
+ pLn->sosi[L_NA].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_NAH].szNavn, "..NØH", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_NAH].ucAntPar = 3;
+ pLn->sosi[L_NAH].cNivo = 2;
+ pLn->sosi[L_NAH].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_NAD].szNavn, "..NØD", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_NAD].ucAntPar = 3;
+ pLn->sosi[L_NAD].cNivo = 2;
+ pLn->sosi[L_NAD].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_REF1].szNavn, "..", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_REF1].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_REF1].cNivo = 2;
+ pLn->sosi[L_REF1].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_REF2].szNavn, "..REF", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_REF2].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_REF2].cNivo = 2;
+ pLn->sosi[L_REF2].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_RADIUS].szNavn, "..RADIUS", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_RADIUS].ucAntPar = 1;
+ pLn->sosi[L_RADIUS].cNivo = 2;
+ pLn->sosi[L_RADIUS].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_ENHET2].szNavn, "..ENHET", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_ENHET2].ucAntPar = 1;
+ pLn->sosi[L_ENHET2].cNivo = 2;
+ pLn->sosi[L_ENHET2].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_ENHET2H].szNavn, "..ENHET-H", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_ENHET2H].ucAntPar = 1;
+ pLn->sosi[L_ENHET2H].cNivo = 2;
+ pLn->sosi[L_ENHET2H].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_ENHET2D].szNavn, "..ENHET-D", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_ENHET2D].ucAntPar = 1;
+ pLn->sosi[L_ENHET2D].cNivo = 2;
+ pLn->sosi[L_ENHET2D].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_ENHET3].szNavn, "...ENHET", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_ENHET3].ucAntPar = 1;
+ pLn->sosi[L_ENHET3].cNivo = 3;
+ pLn->sosi[L_ENHET3].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_ENHET3H].szNavn, "...ENHET-H", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_ENHET3H].ucAntPar = 1;
+ pLn->sosi[L_ENHET3H].cNivo = 3;
+ pLn->sosi[L_ENHET3H].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_ENHET3D].szNavn, "...ENHET-D", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_ENHET3D].ucAntPar = 1;
+ pLn->sosi[L_ENHET3D].cNivo = 3;
+ pLn->sosi[L_ENHET3D].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_ORIGONO].szNavn, "...ORIGO-NØ", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_ORIGONO].ucAntPar = 2;
+ pLn->sosi[L_ORIGONO].cNivo = 3;
+ pLn->sosi[L_ORIGONO].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_HOYDE].szNavn, "..HØYDE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_HOYDE].ucAntPar = 1;
+ pLn->sosi[L_HOYDE].cNivo = 2;
+ pLn->sosi[L_HOYDE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_DYBDE].szNavn, "..DYBDE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_DYBDE].ucAntPar = 1;
+ pLn->sosi[L_DYBDE].cNivo = 2;
+ pLn->sosi[L_DYBDE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_NGISFLAGG].szNavn, "..NGIS-FLAGG", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_NGISFLAGG].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_NGISFLAGG].cNivo = 2;
+ pLn->sosi[L_NGISFLAGG].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_NGISLAG].szNavn, "..NGIS-LAG", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_NGISLAG].ucAntPar = LC_ANT_PAR_UKJENT;
+ pLn->sosi[L_NGISLAG].cNivo = 2;
+ pLn->sosi[L_NGISLAG].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_OBJTYPE].szNavn, "..OBJTYPE", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_OBJTYPE].ucAntPar = 1;
+ pLn->sosi[L_OBJTYPE].cNivo = 2;
+ pLn->sosi[L_OBJTYPE].bBrukt = false;
+
+ UT_StrCopy(pLn->sosi[L_KP].szNavn, "...KP", LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[L_KP].ucAntPar = 1;
+ pLn->sosi[L_KP].cNivo = 3;
+ pLn->sosi[L_KP].bBrukt = false;
+
+ pLn->sAntNavn = L_KP + 1; /* Antall navn i navnetabellen */
+}
+
+
+/*
+AR-910919
+CH LN_Enhet Sjekk om det er ..ENHET
+CD ==========================================================================
+CD Formål:
+CD Sjekk om denne ginfo-linjen er ..ENHET.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_NAVNETABELL * pLn i Peker til navnetabell
+CD char *ginfo_linje i Første pos i linjen
+CD short ok r 1=linjen er ..ENHET, 0=ikke ..ENHET
+CD
+CD Bruk:
+CD ok = LN_Enhet(pLn,ginfo_linje);
+ ===========================================================================
+*/
+short LN_Enhet(LC_NAVNETABELL * pLn,char *ginfo_linje)
+{
+ char ord[LC_MAX_SOSINAVN_LEN];
+
+ //JAØ-20000313
+ //Leter etter "..ENHET " istedet for "..ENHET" for ikke å få tilslag på ..ENHET-H eller ..ENHET-D
+ UT_StrCopy(ord,pLn->sosi[L_ENHET2].szNavn,LC_MAX_SOSINAVN_LEN);
+ UT_StrCat(ord, " ", LC_MAX_SOSINAVN_LEN);
+
+ return(strstr(ginfo_linje,ord) != NULL);
+ //return(strstr(ginfo_linje,pLn->sosi[L_ENHET2].szNavn) != NULL);
+}
+
+
+/*
+AR-940704
+CH LN_EnhetHoyde Sjekk om det er ..ENHET-H
+CD ==========================================================================
+CD Formål:
+CD Sjekk om denne ginfo-linjen er ..ENHET-H.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_NAVNETABELL * pLn i Peker til navnetabell
+CD char *ginfo_linje i Første pos i linjen
+CD short ok r 1=linjen er ..ENHET-H, 0=ikke ..ENHET-H
+CD
+CD Bruk:
+CD ok = LN_EnhetHoyde(pLn,ginfo_linje);
+ ===========================================================================
+*/
+short LN_EnhetHoyde(LC_NAVNETABELL * pLn,char *ginfo_linje)
+{
+ char ord[LC_MAX_SOSINAVN_LEN];
+
+ // Leter etter "..ENHET-H " istedet for "..ENHET-H" for ikke å få tilslag på andre navn
+ UT_StrCopy(ord,pLn->sosi[L_ENHET2H].szNavn,LC_MAX_SOSINAVN_LEN);
+ UT_StrCat(ord, " ", LC_MAX_SOSINAVN_LEN);
+
+ //return(strstr(ginfo_linje,pLn->sosi[L_ENHET2H].szNavn) != NULL);
+ return(strstr(ginfo_linje,ord) != NULL);
+}
+
+
+/*
+AR-940704
+CH LN_EnhetDybde Sjekk om det er ..ENHET-D
+CD ==========================================================================
+CD Formål:
+CD Sjekk om denne ginfo-linjen er ..ENHET-D.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_NAVNETABELL * pLn i Peker til navnetabell
+CD char *ginfo_linje i Første pos i linjen
+CD short ok r 1=linjen er ..ENHET-D, 0=ikke ..ENHET-D
+CD
+CD Bruk:
+CD ok = LN_EnhetDybde(pLn,ginfo_linje);
+ ===========================================================================
+*/
+short LN_EnhetDybde(LC_NAVNETABELL * pLn,char *ginfo_linje)
+{
+ char ord[LC_MAX_SOSINAVN_LEN];
+
+ // Leter etter "..ENHET-D " istedet for "..ENHET-D" for ikke å få tilslag på andre navn
+ UT_StrCopy(ord,pLn->sosi[L_ENHET2D].szNavn,LC_MAX_SOSINAVN_LEN);
+ UT_StrCat(ord, " ",LC_MAX_SOSINAVN_LEN);
+
+ //return(strstr(ginfo_linje,pLn->sosi[L_ENHET2D].szNavn) != NULL);
+ return(strstr(ginfo_linje,ord) != NULL);
+}
+
+
+/*
+AR-910315
+CH LN_TestOy Sjekk om referansen inneholder øy
+CD ==========================================================================
+CD Formål:
+CD Sjekk om denne ginfo-linjen inneholder referanse med ØY.
+CD Forutsetter at aktuell linje inneholder referanser.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------
+CD char *ginfo_linje i Første pos i linjen
+CD short ok r 1=linjen har øy-flate, 0=ikke øy
+CD
+CD Bruk:
+CD ok = LN_TestOy(char *ginfo_linje);
+ ===========================================================================
+*/
+short LN_TestOy(char *ginfo_linje)
+{
+ if (strchr(ginfo_linje,'(') != NULL) return 1;
+
+ return 0;
+}
+
+
+/*
+AR-910918
+CH LN_FinnNavn Søk etter et SOSI-navn i navnetabelen
+CD =============================================================================
+CD Formål:
+CD Søker etter navnet i navnetabellen.
+CD (Ukjent navn blir ikke lagt inn i navnetabellen.)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_NAVNETABELL * pLn i Peker til navnetabell
+CD char *streng i Peker til SOSI-navn. Avslutta av '\0'.
+CD short *navn_nr u Navnets linjenummer i navnetabellen
+CD short nivo r Antall prikker (0=ukjent navn, 1=gruppenavn, osv.)
+CD
+CD Bruk:
+CD nivo = LN_FinnNavn(pLn,streng,&neste,&navn_nr);
+ =============================================================================
+*/
+short LN_FinnNavn(LC_NAVNETABELL * pLn,char *navn,short *navn_nr)
+{
+ short nr = 0;
+
+ /* Utfør søket */
+ for (; nr < pLn->sAntNavn; nr++)
+ {
+ if (strncmp(navn,pLn->sosi[nr].szNavn,LC_MAX_SOSINAVN_LEN-1) == 0)
+ {
+ // Legger inn merke om at navnet er brukt
+ pLn->sosi[nr].bBrukt = true;
+
+ // Navnet er funnet, ==> returner
+ *navn_nr = nr;
+ return (pLn->sosi[nr].cNivo); /* Nivå */
+ }
+ }
+
+ return 0; /* Ukjent navn */
+}
+
+
+/*
+AR-910710
+CH LN_PakkNavn Søk etter navn, legg inn ukjent navn
+CD ==========================================================================
+CD Formål:
+CD Finner et SOSI-navn i navnetabellen. (Max LC_MAX_SOSINAVN_LEN tegn.)
+CD Hvis navnet er ukjent, blir det lagt inn i tabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_NAVNETABELL * pLn i Peker til navnetabell
+CD char *navn i SOSI-navn.
+CD short *ant_par u Antall parametre til dette navnet.
+CD LC_ANT_PAR_UKJENT (-1) = Ant. param. er ukjent.
+CD short *navn_nr u Navnenummer.
+CD short nivo r Antall prikker i navnet (1=gruppenavn, osv.)
+CD
+CD Bruk:
+CD type = LN_PakkNavn(pLn,navn,&navn_nr,&ant_par);
+ =============================================================================
+*/
+short LN_PakkNavn (LC_NAVNETABELL * pLn,char *navn,short *navn_nr,short *ant_par)
+{
+ char nivo,*cp;
+ short nr;
+ /* Utfør søket */
+ for (nr=0; nr < pLn->sAntNavn; nr++)
+ {
+ if (strncmp(navn,pLn->sosi[nr].szNavn,LC_MAX_SOSINAVN_LEN-1) == 0)
+ {
+ // Legger inn merke om at navnet er brukt
+ pLn->sosi[nr].bBrukt = true;
+
+ // Navnet er funnet, ==> returner
+ *ant_par = pLn->sosi[nr].ucAntPar;
+ *navn_nr = nr;
+ return (pLn->sosi[nr].cNivo); /* Nivå */
+ }
+ }
+
+ /* Er det plass i tabellen for et nytt navn? */
+ if (pLn->sAntNavn >= LC_MAX_NAVN) {
+ UT_FPRINTF(stderr,"Utskrift av navnetabellen:\n");
+ for (nr=0; nr < pLn->sAntNavn; nr++) {
+ UT_FPRINTF(stderr,"%s\n",LN_VisNavn(pLn,nr));
+ }
+ LC_Error(21,"(LN_PakkNavn)","");
+ exit (2);
+ }
+
+ /* ----- Nytt navn */
+ UT_StrCopy(pLn->sosi[pLn->sAntNavn].szNavn,navn,LC_MAX_SOSINAVN_LEN);
+ pLn->sosi[pLn->sAntNavn].ucAntPar = (unsigned char) LC_ANT_PAR_UKJENT;
+ *ant_par = LC_ANT_PAR_UKJENT;
+
+ /* Finn antall prikker */
+ nivo = 0;
+ cp = navn;
+ while (*cp == '.') {
+ nivo++;
+ cp++;
+ }
+ pLn->sosi[pLn->sAntNavn].cNivo = nivo;
+
+ // Legger inn merke om at navnet er brukt
+ pLn->sosi[pLn->sAntNavn].bBrukt = true;
+
+ *navn_nr = pLn->sAntNavn;
+
+ pLn->sAntNavn++;
+
+ /* Melding om ulovlig gruppestart */
+ if (nivo <= 1) {
+ LC_Error(22,"(LN_PakkNavn)",navn);
+ }
+
+ return (nivo); /* Antall prikker */
+}
+
+
+/*
+AR-910819
+CH LN_GetNavn Hent en linje fra navnetabellen
+CD ==========================================================================
+CD Formål:
+CD Henter et navn fra navnetabellen.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_NAVNETABELL * pLn i Peker til navnetabell
+CD long navn i Linjenummer i navnetabellen
+CD char *tx r Peker til SOSI-navn, NULL=ukjent linje
+CD
+CD Bruk:
+CD cp = LN_GetNavn(pLn,navn_nr);
+ =============================================================================
+*/
+char *LN_GetNavn(LC_NAVNETABELL * pLn,short navn)
+{
+ SOSINAVN *ip;
+
+ if (navn >= 0 && navn < pLn->sAntNavn){
+ ip = pLn->sosi + navn;
+ return ip->szNavn;
+ }
+
+ return NULL;
+}
+
+
+/*
+AR:2009-05-05
+CH LC_GetElementNavn Hent elementnavn
+CD ==========================================================================
+CD Formål:
+CD Hent et elementnavn fra den interne navnetabellen i FYBA.
+CD Denne tabellen inneholder både gruppenavn (.LINJE, .KURVE, ...) og
+CD egenskapsnavn (..OBJTYPE, ..LTEMA, ...)
+CD
+CD Tabellen har tre logiske deler:
+CD - (Linje 0 - L_HODE): Forhåndsdefinerte gruppenavn.
+CD - (Linje L_HODE+1 - L_KP): Forhåndsdefinerte egenskapsnavn.
+CD - (Linje L_KP+1 - n): Andre elementnavn brukt i SOSI-filen etter
+CD indeksoppbygging.
+CD
+CD Selv om egenskapen blir fjernet fra SOSI-filen blir navnet fortsatt
+CD liggende i navnetabellen
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD LC_FILADM *pFil i Peker til FilAdm
+CD short sNavnNr i Linjenummer i navnetabellen (0 - n)
+CD bool *bBrukt Viser om navnet har/er brukt i filen
+CD Hvis det har vært en gruppe som har brukt navnet blir
+CD denne stående "true" selv om gruppen er slettet.
+CD const char *pszNavn r Peker til elementnavn,
+CD NULL = ukjent fil eller ulovlig linjenummer
+CD
+CD
+CD Bruk:
+CD // Går gjennom alle navnene ut over de forhåndsdefinerte navnene.
+CD short sNavnNr = L_KP+1;
+CD while ((pszNavn = LC_GetElementNavn(pFil,sNavnNr)) != NULL)
+CD {
+CD // Gjør noe med navnet
+CD ...
+CD ++sNavnNr;
+CD }
+=============================================================================
+*/
+SK_EntPnt_FYBA const char *LC_GetElementNavn(LC_FILADM *pFil,short sNavnNr,bool *bBrukt)
+{
+ LO_TestFilpeker(pFil,"GetNavn");
+
+ LC_NAVNETABELL *pLn = &(pFil->SosiNavn); //Peker til filens navnetabell
+
+ if (sNavnNr >= 0 && sNavnNr < pLn->sAntNavn)
+ {
+ SOSINAVN *ip = pLn->sosi + sNavnNr;
+
+ *bBrukt = ip->bBrukt;
+
+ return ip->szNavn;
+ }
+
+ return NULL;
+}
+
+
+/*
+AR-910819
+CH LN_VisNavn Hent en linje fra navnetabellen
+CD =============================================================================
+CD Formål:
+CD Henter en linje fra navnetabellen som formatert streng.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD LC_NAVNETABELL * pLn i Peker til navnetabell
+CD long navn i Linjenummer i navnetabellen som skall vises
+CD char *tx r Peker til streng med formatert linje
+CD
+CD Bruk:
+CD for (navn=0,linje=10; navn<10; navn++,linje++){
+CD SH_OutTx(linje,1,LN_VisNavn(pLn,navn));
+CD }
+ =============================================================================
+*/
+char *LN_VisNavn(LC_NAVNETABELL * pLn,short navn)
+{
+ SOSINAVN *ip;
+
+ if (navn < pLn->sAntNavn){
+ ip = pLn->sosi + navn;
+ UT_SNPRINTF(err().tx,LC_ERR_LEN,"%2d %16s", navn,ip->szNavn);
+ } else{
+ *err().tx = '\0';
+ }
+
+ return err().tx;
+}
+
+
+/*
+AR-940413
+CH LN_TolkKvalitet Tolk KVALITET
+CD ==========================================================================
+CD Formål:
+CD Tolk parameterstrengen for KVALITET.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -------------------------------------------------------------------------
+CD char *pszParameter i Peker til '\0'-avslutta streng, eller
+CD NULL hvis KVALITET mangler.
+CD short *psMetode u Hvordan data er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD KVAL_MET_STD standard metode fra nivå over.
+CD long *plNoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD KVAL_NOY_STD standard nøyaktighet fra nivå over.
+CD short *psSynbarhet u Synbarhet i bilde
+CD KVAL_SYN_GOD godt synlig.
+CD KVAL_SYN_UNDEF synbarhet er udefinert.
+CD KVAL_SYN_STD standard metode fra nivå over.
+CD short *psHoydeMetode u Hvordan høyden er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD KVAL_MET_STD standard metode fra nivå over.
+CD long *plHoydeNoyaktighet u Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD KVAL_NOY_STD standard nøyaktighet fra nivå over.
+CD
+CD Bruk:
+CD ist = LN_TolkKvalitet(pszParameter,&sMetode,&lNoyaktighet,&sSynbarhet,
+CD &sHoydeMetode,&lHoydeNoyaktighet);
+CD =============================================================================
+*/
+void LN_TolkKvalitet(char *pszParameter,short *psMetode,long *plNoyaktighet,
+ short *psSynbarhet,short *psHoydeMetode,long *plHoydeNoyaktighet)
+{
+ char ord[32];
+ short i;
+ char szMetode[6] = {"*"};
+ char szNoyaktighet[11] = {"*"};
+ char szSynbarhet[6] = {"0"};
+ char szHoydeMetode[6] = {" "};
+ char szHoydeNoyaktighet[11] = {" "};
+
+ /* Er det noen parameterstreng? */
+ if (pszParameter) {
+ /* Hent strengene */
+ if (UT_StrToken(pszParameter,0,&i,32,ord)) {
+ UT_StrCopy(szMetode,ord,6);
+
+ if (UT_StrToken(pszParameter,i,&i,32,ord)) {
+ UT_StrCopy(szNoyaktighet,ord,10);
+
+ if (UT_StrToken(pszParameter,i,&i,32,ord)) {
+ UT_StrCopy(szSynbarhet,ord,6);
+
+ if (UT_StrToken(pszParameter,i,&i,32,ord)) {
+ UT_StrCopy(szHoydeMetode,ord,6);
+
+ if (UT_StrToken(pszParameter,i,&i,32,ord)) {
+ UT_StrCopy(szHoydeNoyaktighet,ord,10);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* Tolk strengene til tallverdier */
+ if (*szMetode == '*') {
+ *psMetode = KVAL_MET_UNDEF;
+ } else if (*szMetode == '@') {
+ *psMetode = KVAL_MET_STD;
+ } else {
+ UT_StrShort(szMetode,0,&i,psMetode);
+ }
+
+ if (*szNoyaktighet == '*') {
+ *plNoyaktighet = KVAL_NOY_UKJENT;
+ } else if (*szNoyaktighet == '@') {
+ *plNoyaktighet = KVAL_NOY_STD;
+ } else {
+ UT_StrLong(szNoyaktighet,0,&i,plNoyaktighet);
+ }
+
+ if (*szSynbarhet == '*') {
+ *psSynbarhet = KVAL_SYN_UNDEF;
+ } else if (*szSynbarhet == '@') {
+ *psSynbarhet = KVAL_SYN_STD;
+ } else {
+ UT_StrShort(szSynbarhet,0,&i,psSynbarhet);
+ }
+
+ if (*szHoydeMetode == '*') {
+ *psHoydeMetode = KVAL_MET_UNDEF;
+ } else if (*szHoydeMetode == '@') {
+ *psHoydeMetode = KVAL_MET_STD;
+ } else if (*szHoydeMetode == ' ') {
+ *psHoydeMetode = *psMetode;
+ } else {
+ UT_StrShort(szHoydeMetode,0,&i,psHoydeMetode);
+ }
+
+ if (*szHoydeNoyaktighet == '*') {
+ *plHoydeNoyaktighet = KVAL_NOY_UKJENT;
+ } else if (*szHoydeNoyaktighet == '@') {
+ *plHoydeNoyaktighet = KVAL_NOY_STD;
+ } else if (*szHoydeNoyaktighet == ' ') {
+ *plHoydeNoyaktighet = *plNoyaktighet;
+ } else {
+ UT_StrLong(szHoydeNoyaktighet,0,&i,plHoydeNoyaktighet);
+ }
+
+ return;
+}
+
+
+/*
+AR-940413
+CH LC_FormatterKvalitet Formatter KVALITET
+CD ==========================================================================
+CD Formål:
+CD Formater parameterstrengen for KVALITET.
+CD Resultatet legges i en intern streng, og må kopieres over til andre
+CD variabler før endring.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -------------------------------------------------------------------------
+CD short sMetode i Hvordan data er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD KVAL_MET_STD standard metode fra nivå over.
+CD long lNoyaktighet i Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD KVAL_NOY_STD standard nøyaktighet fra nivå over
+CD short sSynbarhet i Synbarhet i bilde
+CD KVAL_SYN_GOD godt synlig.
+CD KVAL_SYN_UNDEF synbarhet er udefinert.
+CD KVAL_SYN_STD standard metode fra nivå over.
+CD short sHoydeMetode i Hvordan data er registrert.
+CD KVAL_MET_UNDEF metode er udefinert.
+CD KVAL_MET_STD standard metode fra nivå over.
+CD long lHoydeNoyaktighet i Registreringsnøyaktighet
+CD KVAL_NOY_UKJENT nøyaktighet er ukjent.
+CD KVAL_NOY_STD standard nøyaktighet fra nivå over
+CD char *pszParameter r Peker til '\0'-avslutta streng.
+CD
+CD Bruk:
+CD pszParameter = LC_FormatterKvalitet(sMetode,lNoyaktighet,sSynbarhet,
+CD sHoydeMetode,lHoydeNoyaktighet);
+CD =============================================================================
+*/
+SK_EntPnt_FYBA char *LC_FormatterKvalitet(short sMetode,long lNoyaktighet,short sSynbarhet,
+ short sHoydeMetode,long lHoydeNoyaktighet)
+{
+ static char szParameter[60];
+ char szMetode[8] = {"*"};
+ char szNoyaktighet[13] = {" *"};
+ char szSynbarhet[8] = {" *"};
+ char szHoydeMetode[8] = {" *"};
+ char szHoydeNoyaktighet[13] = {" *"};
+
+
+ /* Metode */
+ if (sMetode == KVAL_MET_STD) {
+ *szMetode = '@';
+ } else if (sMetode != KVAL_MET_UNDEF) {
+ UT_SNPRINTF(szMetode,8,"%hd",sMetode);
+ }
+
+ /* Nøyaktighet */
+ if (lNoyaktighet == KVAL_NOY_STD) {
+ szNoyaktighet[1] = '@';
+ } else if (lNoyaktighet != KVAL_NOY_UKJENT && lNoyaktighet != KVAL_NOY_UNDEF) {
+ UT_SNPRINTF(szNoyaktighet,13," %ld",lNoyaktighet);
+ }
+
+ /* Synbarhet */
+ if (sSynbarhet == KVAL_SYN_STD) {
+ szSynbarhet[1] = '@';
+ } else if (sSynbarhet != KVAL_SYN_UNDEF) {
+ UT_SNPRINTF(szSynbarhet,8," %hd",sSynbarhet);
+ }
+
+ /* Høyde-metode */
+ if (sHoydeMetode == KVAL_MET_STD) {
+ szHoydeMetode[1] = '@';
+ } else if (sHoydeMetode != KVAL_MET_UNDEF) {
+ UT_SNPRINTF(szHoydeMetode,8," %hd",sHoydeMetode);
+ }
+
+ /* Høyde-nøyaktighet */
+ if (lHoydeNoyaktighet == KVAL_NOY_STD) {
+ szHoydeNoyaktighet[1] = '@';
+ } else if (lHoydeNoyaktighet != KVAL_NOY_UKJENT && lHoydeNoyaktighet != KVAL_NOY_UNDEF) {
+ UT_SNPRINTF(szHoydeNoyaktighet,13," %ld",lHoydeNoyaktighet);
+ }
+
+
+ /* Bygg opp parameterstrengen */
+
+ UT_StrCopy(szParameter,szMetode,60);
+
+ if (szNoyaktighet[1] != '*' ||
+ sSynbarhet != KVAL_SYN_GOD ||
+ sHoydeMetode != sMetode ||
+ lHoydeNoyaktighet != lNoyaktighet) {
+
+ UT_StrCat(szParameter,szNoyaktighet,60);
+
+ if (sSynbarhet != KVAL_SYN_GOD ||
+ sHoydeMetode != sMetode ||
+ lHoydeNoyaktighet != lNoyaktighet) {
+
+ UT_StrCat(szParameter,szSynbarhet,60);
+
+ if (sHoydeMetode != sMetode ||
+ lHoydeNoyaktighet != lNoyaktighet) {
+
+ UT_StrCat(szParameter,szHoydeMetode,60);
+
+ if (lHoydeNoyaktighet != lNoyaktighet) {
+ UT_StrCat(szParameter,szHoydeNoyaktighet,60);
+ }
+ }
+ }
+ }
+
+ return szParameter;
+}
+
+
+/*
+AR: 2000-01-19
+CH LC_FinnNivo Beregn nivå
+CD ==============================================================
+CD Formål:
+CD Teller antall prikker i starten på egenskapsnavn.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD -------------------------------------------------------------
+CD char *pszGinfo i Streng med egenskapsnavn i starten
+CD short sNivo r Antall prikker
+CD
+CD Bruk:
+CD sNivo = LC_FinnNivo(pszGinfo);
+ ================================================================
+*/
+SK_EntPnt_FYBA short LC_FinnNivo(const char * pszNavn)
+{
+ short sNivo = 0;
+
+ while (*pszNavn != '\0' && *pszNavn == '.') {
+ ++pszNavn;
+ ++sNivo;
+ }
+
+ return sNivo;
+}
diff --git a/src/FYBA/make.sh b/src/FYBA/make.sh
new file mode 100755
index 0000000..eebd5cc
--- /dev/null
+++ b/src/FYBA/make.sh
@@ -0,0 +1,5 @@
+gcc -Wall -g -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -DI18N_EN -Wno-write-strings -c -I. -I../include *.cpp &&
+ar rcs libfyba.a *.o &&
+gcc -g -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -DI18N_EN -Wno-write-strings -shared -I. -I../include *.cpp -o ../../lib/libfyba.so
+cp fyba.h ../../include/fyba.h
+
diff --git a/src/FYBA/stdafx.cpp b/src/FYBA/stdafx.cpp
new file mode 100644
index 0000000..cc5aa89
--- /dev/null
+++ b/src/FYBA/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// FYBA.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/src/FYBA/stdafx.h b/src/FYBA/stdafx.h
new file mode 100644
index 0000000..ddc5b6f
--- /dev/null
+++ b/src/FYBA/stdafx.h
@@ -0,0 +1,16 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <../UT/fyut.h>
+#include <../GM/fygm.h>
+
+#include "fyba.h"
+#include "fybax.h"
diff --git a/src/GM/GM.cpp b/src/GM/GM.cpp
new file mode 100644
index 0000000..fabb976
--- /dev/null
+++ b/src/GM/GM.cpp
@@ -0,0 +1,3245 @@
+/* ======= =============================================================== */
+/* STATENS KARTVERK - FYSAK-PC */
+/* Fil: gm.c */
+/* Ansvarlig: Andreas Røstad */
+/* Innhold: Geometrirutiner fysak-pc */
+/* ====================================================================== */
+
+#include "stdafx.h"
+
+#include <math.h>
+#include <stdlib.h>
+#include <memory.h>
+
+#include "../UT/fyut.h"
+
+#include "fygm.h"
+
+/* --- Konstanter -- */
+#define ACCY 1.0E-6
+#define GM_ACCY 1.0E-8
+
+/* --- Makroer -- */
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+
+
+/*
+AR-890723
+CH GM_wtstBue Sjekk om en bue berører et vindu
+CD ==========================================================================
+CD Formål:
+CD Sjekker om en bue berører et vindu.
+CD wmax
+CD !--------------!
+CD ! ...... !
+CD .!... .....!
+CD .... ! !...
+CD ... ! ! x (p2)
+CD (p1) x !--------------!
+CD wmin
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double as i Koordinat i sentrumspunktet
+CD double ns i
+CD double radius i Buens radius
+CD double fi i "Retning" fra sentrum til buens startpunkt.
+CD double dfi i Vinkel mellom fi og retning sentrum - sluttpkt.
+CD double wmina i -!
+CD double wminn i ! Vindu
+CD double wmaxa i !
+CD double wmaxn i -!
+CD short kryss r 0=ikke skjæring, 1=skjæring eller inni
+CD
+CD Bruk:
+CD kryss = GM_wtstBue(as,ns,radius,fi,dfi,wmina,wminn,wmaxa,wmaxn);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_wtstBue(double as,double ns,double radius,double fi,double dfi,
+ double wmina,double wminn,double wmaxa,double wmaxn)
+{
+ double nva,nvn,oha,ohn,as1,ns1,as2,ns2;
+ double r = fabs(radius);
+
+ /* Omskrevet rektangel */
+ GM_buebox(as,ns,r,fi,dfi,&nva,&nvn,&oha,&ohn);
+
+ /* Er hele buen inni? */
+ if (wmaxn >= ohn && wmaxa >= oha && wminn <= nvn && wmina <= nva){
+ return 1;
+ }
+
+ /* Overlapp mellom rektangel og vindu?, må teste videre */
+ if (wmaxn >= nvn && wmaxa >= nva && wminn <= ohn && wmina <= oha){
+ /* Min N */
+ if (GM_sLinBue(as,ns,r,fi,dfi,wmina,wminn,wmaxa,wminn,
+ &as1,&ns1,&as2,&ns2)){
+ return 1;
+ }
+ /* Min A */
+ if (GM_sLinBue(as,ns,r,fi,dfi,wmina,wminn,wmina,wmaxn,
+ &as1,&ns1,&as2,&ns2)){
+ return 1;
+ }
+ /* Max N */
+ if (GM_sLinBue(as,ns,r,fi,dfi,wmina,wmaxn,wmaxa,wmaxn,
+ &as1,&ns1,&as2,&ns2)){
+ return 1;
+ }
+ /* Max a */
+ if (GM_sLinBue(as,ns,r,fi,dfi,wmaxa,wminn,wmaxa,wmaxn,
+ &as1,&ns1,&as2,&ns2)){
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+/*
+AR-881018
+CH GM_wtst Sjekk om en linje berører et vindu
+CD ==========================================================================
+CD Formål:
+CD Sjekker om en linje berører et vindu.
+CD wmax
+CD !--------------!
+CD ! ........!.........
+CD ....!...... ! p2
+CD ......... ! !
+CD p1 ! !
+CD !--------------!
+CD wmin
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double p1a i Koordinat i første punkt
+CD double p1n i
+CD double p2a i Koordinat i andre punkt
+CD double p2n i
+CD double wmina i -!
+CD double wminn i ! Vindu
+CD double wmaxa i !
+CD double wmaxn i -!
+CD short kryss r 0=ikke skjæring, 1=skjæring eller inni
+CD
+CD Bruk:
+CD kryss = GM_wtst(pa1,p1n,p2a,p2n,wmina,wminn,wmaxa,wmaxn);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_wtst(double p1a, double p1n, double p2a, double p2n,
+ double wmina, double wminn, double wmaxa, double wmaxn)
+{
+ unsigned int visa,visb,heltute,inni,kryss;
+ double sn,sa;
+
+ visa = 0;
+ if (p1a < wmina) visa |= (unsigned int)0x1;
+ if (p1a > wmaxa) visa |= (unsigned int)0x2;
+ if (p1n < wminn) visa |= (unsigned int)0x4;
+ if (p1n > wmaxn) visa |= (unsigned int)0x8;
+ inni = (unsigned int)(visa == 0);
+ /* Tester videre når første pkt. er utenfor */
+ if (! inni){
+ visb = 0;
+ if (p2a < wmina) visb |= (unsigned int)0x1;
+ if (p2a > wmaxa) visb |= (unsigned int)0x2;
+ if (p2n < wminn) visb |= (unsigned int)0x4;
+ if (p2n > wmaxn) visb |= (unsigned int)0x8;
+
+ inni = (unsigned int)(visb == 0);
+ if (! inni){
+ /* Når pkt B også er utenfor */
+ heltute = visa & visb;
+ if (! heltute){
+ /* Når det er mulig skjæring med vinduet */
+ /* Min N */
+ kryss = (unsigned int)GM_shor(p1a,p1n,p2a,p2n,
+ wmina,wminn,wmaxa,wminn,&sa,&sn);
+ if (! kryss){ /* Min A */
+ kryss = (unsigned int)GM_sver(p1a,p1n,p2a,p2n,
+ wmina,wminn,wmina,wmaxn,&sa,&sn);
+ }
+ if (! kryss){ /* Max N */
+ kryss = (unsigned int)GM_shor(p1a,p1n,p2a,p2n,
+ wmina,wmaxn,wmaxa,wmaxn,&sa,&sn);
+ }
+ if (! kryss){ /* Max a */
+ kryss = (unsigned int)GM_sver(p1a,p1n,p2a,p2n,
+ wmaxa,wminn,wmaxa,wmaxn,&sa,&sn);
+ }
+ if (kryss) inni = 1;
+ }
+ }
+ }
+ return (short)inni;
+}
+
+/*
+PG-030815
+CH GM_wtstPunkt Sjekker om et punkt ligger inni - eller i kanten av - vindu
+CD ===============================================================================
+CD Formål:
+CD Sjekker om et punkt ligger inni et vindu - gjerne rotert vindu.
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array i/U Merknad
+CD -------------------------------------------------------------------------------
+CD PktA double i Øst-koordinat for sjekkpunkt
+CD PktN double i Nord-koordinat for sjekkpunkt
+CD wa1 double i Øst-koordinat for 1.pkt i vindu
+CD wn1 double i Nord-koordinat for 1.pkt i vindu
+CD wa2 double i Øst-koordinat for 2.pkt i vindu
+CD wn2 double i Nord-koordinat for 2.pkt i vindu
+CD wa3 double i Øst-koordinat for 3.pkt i vindu
+CD wn3 double i Nord-koordinat for 3.pkt i vindu
+CD wa4 double i Øst-koordinat for 4.pkt i vindu
+CD wn4 double i Nord-koordinat for 4.pkt i vindu
+CD inni short r Er punktet innenfor vinduet
+CD
+CD Bruk: inni = GM_wtstPunkt(PktA, PktN, wa1, wn1, wa2, wn2, wa3, wn3, wa4, wn4);
+ ===============================================================================
+*/
+SK_EntPnt_GM short GM_wtstPunkt(double PktA, double PktN, double wa1, double wn1, double wa2, double wn2, double wa3, double wn3,
+ double wa4, double wn4)
+{
+
+ double dPolyMaxA,dPolyMaxN,dPolyMinA,dPolyMinN;
+ double maxA = 99999999999.9; // "Uendelig" øst
+ double as,ns;
+ short sAntSkjaer;
+
+ // Sjekk 1: Ligger punktet utenfor omskrevet rektangel - så ligger det utenfor vinduet
+ dPolyMaxA=max(wa1,wa2); dPolyMaxA=max(dPolyMaxA,wa3); dPolyMaxA=max(dPolyMaxA,wa4);
+ dPolyMaxN=max(wn1,wn2); dPolyMaxN=max(dPolyMaxN,wn3); dPolyMaxN=max(dPolyMaxN,wn4);
+ dPolyMinA=min(wa1,wa2); dPolyMinA=min(dPolyMinA,wa3); dPolyMinA=min(dPolyMinA,wa4);
+ dPolyMinN=min(wn1,wn2); dPolyMinN=min(dPolyMinN,wn3); dPolyMinN=min(dPolyMinN,wn4);
+ if((PktA>dPolyMaxA) || (PktA<dPolyMinA) || (PktN>dPolyMaxN) || (PktN<dPolyMinN))
+ return 0;
+
+ // Sjekk 2: // Ligger punktet innenfor vinduet?
+
+ // Pluss på et lite tillegg for å unngå treff på node
+ PktN += 0.000001;
+
+ // Beregn skjæring med alle sidene
+ sAntSkjaer = GM_shor(wa1,wn1,wa2,wn2,PktA,PktN,maxA,PktN,&as,&ns);
+ sAntSkjaer += GM_shor(wa2,wn2,wa3,wn3,PktA,PktN,maxA,PktN,&as,&ns);
+ sAntSkjaer += GM_shor(wa3,wn3,wa4,wn4,PktA,PktN,maxA,PktN,&as,&ns);
+ sAntSkjaer += GM_shor(wa4,wn4,wa1,wn1,PktA,PktN,maxA,PktN,&as,&ns);
+
+ // Sjekk om punktet er innenfor
+ return ((sAntSkjaer % 2) == 1)? 1 : 0;
+}
+
+/*
+AR-881018
+CH GM_sver Skjæring mellom vertikal- og skrålinje
+CD ==========================================================================
+CD Formål:
+CD Beregner skjæringspunkt mellom en vertikal linje (M-N) og en skrålinje (K-L)
+CD
+CD M* *L
+CD ! /
+CD ! /
+CD *S
+CD / !
+CD / !
+CD K* *N
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double ka i Koordinat i K
+CD double kn i
+CD double la i Koordinat i L
+CD double ln i
+CD double na i Koordinat i N
+CD double nn i
+CD double ma i Koordinat i M
+CD double mn i
+CD double *sa u Koordinat i S
+CD double *sn u
+CD short kryss r 0=ikke skjæring, 1=skjæring
+CD
+CD Bruk:
+CD kryss = GM_sver(ka,kn,la,ln,na,nn,ma,mn,&sa,&sn);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_sver(double ka,double kn,double la,double ln,double na,double nn,
+ double ma,double mn,double *sa,double *sn)
+{
+ unsigned int kryss = 0;
+ double mini,maxi;
+
+ mini = min(ka,la);
+ maxi = max(ka,la);
+
+ if (na >= mini && ma <= maxi){ /* (ma er lik na) */
+ if (fabs(la-ka) > 0.0001){
+ /* Beregn skjæringspunktet */
+ *sa = ma;
+ *sn = kn + ((*sa-ka)*(ln-kn))/(la-ka);
+ mini = min(mn,nn) - ACCY;
+ maxi = max(mn,nn) + ACCY;
+ /* Sjekk om det er skjæring */
+ kryss = (unsigned int)(*sn >= mini && *sn <= maxi);
+ }
+ }
+ return (short)kryss;
+}
+
+
+/*
+AR-881018
+CH GM_shor Skjæring mellom horisontal- og skrålinje
+CD ==========================================================================
+CD Formål:
+CD Beregner skjæringspunkt mellom en horisontal linje (M-N)
+CD og en skrålinje (K-L)
+CD
+CD *L
+CD /
+CD /
+CD M*--------*S--------*N
+CD /
+CD /
+CD K*
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double ka i Koordinat i K
+CD double kn i
+CD double la i Koordinat i L
+CD double ln i
+CD double na i Koordinat i N
+CD double nn i
+CD double ma i Koordinat i M
+CD double mn i
+CD double *sa u Koordinat i S
+CD double *sn u
+CD short kryss r 0=ikke skjæring, 1=skjæring
+CD
+CD Bruk:
+CD kryss = GM_shor(ka,kn,la,ln,na,nn,ma,mn,&sa,&sn);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_shor(double ka,double kn,double la,double ln,double na,double nn,
+ double ma,double mn,double *sa,double *sn)
+{
+ unsigned int kryss = 0;
+ double mini,maxi;
+
+ mini = min(kn,ln);
+ maxi = max(kn,ln);
+
+ if (mn >= mini && nn <= maxi){ /* (mn er lik nn) */
+ if (fabs(ln-kn) > 0.0001){
+ /* Beregn skjæringspunktet */
+ *sn = mn;
+ *sa = ka + ((*sn-kn)*(la-ka))/(ln-kn);
+ mini = min(ma,na) - ACCY;
+ maxi = max(ma,na) + ACCY;
+ /* Sjekk om det er skjæring */
+ kryss = (unsigned int)(*sa >= mini && *sa <= maxi);
+ }
+ }
+ return (short)kryss;
+}
+
+
+/*
+AR-901209
+CH GM_sLinLin Skjæringspunkt mellom 2 linjer
+CD ==========================================================================
+CD Formål:
+CD Beregner skjæringspunkt mellom 2 linjer (M-N) og (K-L)
+CD
+CD M* *L
+CD \ /
+CD \ /
+CD *S
+CD / \
+CD / \
+CD K* *N
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double ka i Koordinat i K
+CD double kn i
+CD double la i Koordinat i L
+CD double ln i
+CD double ma i Koordinat i M
+CD double mn i
+CD double na i Koordinat i N
+CD double nn i
+CD double *sa u Koordinat i S
+CD double *sn u
+CD short kryss r 0=ikke skjæring, 1=skjæring
+CD
+CD Bruk:
+CD kryss = GM_sLinLin(ka,kn,la,ln,ma,mn,na,nn,&sa,&sn);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_sLinLin(double ka,double kn,double la,double ln,double ma,double mn,
+ double na,double nn,double *sa,double *sn)
+{
+ double det,detinv,s,t;
+
+ double alk = la - ka;
+ double nlk = ln - kn;
+ double anm = na - ma;
+ double nnm = nn - mn;
+ double amk = ma - ka;
+ double nmk = mn - kn;
+
+
+ /* Sorterer først ut åpenbare tilfeller der det ikke er skjæring */
+ if (max(ka,la) < min(ma,na)) return 0;
+ if (min(ka,la) > max(ma,na)) return 0;
+ if (max(kn,ln) < min(mn,nn)) return 0;
+ if (min(kn,ln) > max(mn,nn)) return 0;
+
+ det = anm * nlk - nnm * alk;
+
+ /* Parallelle linjer */
+ if (fabs(det) < ACCY) return 0;
+
+ detinv = 1.0 / det;
+ s = (anm*nmk - nnm*amk) * detinv;
+ t = (alk*nmk - nlk*amk) * detinv;
+
+ if (s < 0.0 || s > 1.0 || t < 0.0 || t > 1.0) return 0;
+
+ *sa = ka + alk*s;
+ *sn = kn + nlk*s;
+
+ return 1;
+
+#ifdef UTGAAR
+
+ /*
+ * Beregner skjæring mellom to uendelige vektorer.
+ * Sjekker etterpå om skjæringspunktet ligger på linjebitene.
+ */
+ if (GM_sVektVekt(ka,kn,la,ln,ma,mn,na,nn,sa,sn)){
+ if (*sn <= max(kn,ln)+ACCY && *sn >= min(kn,ln)-ACCY &&
+ *sa <= max(ka,la)+ACCY && *sa >= min(ka,la)-ACCY &&
+ *sn <= max(mn,nn)+ACCY && *sn >= min(mn,nn)-ACCY &&
+ *sa <= max(ma,na)+ACCY && *sa >= min(ma,na)-ACCY) {
+
+ return 1; /* Skjæring funnet ==> returnerer */
+ }
+ }
+
+ return 0; /* Ingen skjæring funnet ==> returnerer */
+#endif
+}
+
+
+
+/*
+AR-901209
+CH GM_Overlapp Overlapp mellom 2 linjer
+CD ==========================================================================
+CD Formål:
+CD Sjekker om to linjer overlapper hverandre helt eller delevis.
+CD
+CD M*
+CD \
+CD \
+CD \ *K
+CD \ \
+CD \ \
+CD *N\
+CD \
+CD \
+CD *L
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double ka i Koordinat i K
+CD double kn i
+CD double la i Koordinat i L
+CD double ln i
+CD double ma i Koordinat i M
+CD double mn i
+CD double na i Koordinat i N
+CD double nn i
+CD double *sa u Koordinat i S
+CD double *sn u
+CD short overlapp r 0=ikke overlapp
+CD 1=tangerer (likt endepunkt)
+CD 2=delevis overlapp
+CD 3=linjene er like
+CD Bruk:
+CD kryss = GM_Overlapp(ka,kn,la,ln,ma,mn,na,nn);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_Overlapp(double ka,double kn,double la,double ln,double ma,double mn,double na,double nn)
+{
+ // Sorterer først ut åpenbare tilfeller der det ikke er skjæring
+ if (max(ka,la) < min(ma,na)) return 0;
+ if (min(ka,la) > max(ma,na)) return 0;
+ if (max(kn,ln) < min(mn,nn)) return 0;
+ if (min(kn,ln) > max(mn,nn)) return 0;
+
+
+ // Linjene er like
+ if (fabs((min(ka,la) - min(ma,na))) < GM_ACCY &&
+ fabs((max(ka,la) - max(ma,na))) < GM_ACCY &&
+ fabs((min(kn,ln) - min(mn,nn))) < GM_ACCY &&
+ fabs((max(kn,ln) - max(mn,nn))) < GM_ACCY)
+ {
+ return 3;
+ }
+
+ // Linjene tangerer i enden
+ if ((fabs(ka-ma)<GM_ACCY && fabs(kn-mn)<GM_ACCY) ||
+ (fabs(la-ma)<GM_ACCY && fabs(ln-mn)<GM_ACCY) ||
+ (fabs(ka-na)<GM_ACCY && fabs(kn-nn)<GM_ACCY) ||
+ (fabs(la-na)<GM_ACCY && fabs(ln-nn)<GM_ACCY))
+ {
+ return 1;
+ }
+
+ double alk = la - ka;
+ double nlk = ln - kn;
+ double anm = na - ma;
+ double nnm = nn - mn;
+ //double amk = ma - ka;
+ //double nmk = mn - kn;
+ double det = anm * nlk - nnm * alk;
+
+ // Parallelle linjer
+ if (fabs(det) < ACCY)
+ {
+ double a,n;
+ if (GM_fotp(ka,kn,la,ln,ma,mn,&a,&n) == 2)
+ {
+ if (fabs(ma-a)<GM_ACCY && fabs(mn-n)<GM_ACCY) return 2;
+ }
+
+ if (GM_fotp(ka,kn,la,ln,na,nn,&a,&n) == 2)
+ {
+ if (fabs(na-a)<GM_ACCY && fabs(nn-n)<GM_ACCY) return 2;
+ }
+
+ if (GM_fotp(ma,mn,na,nn,ka,kn,&a,&n) == 2)
+ {
+ if (fabs(ka-a)<GM_ACCY && fabs(kn-n)<GM_ACCY) return 2;
+ }
+ if (GM_fotp(ma,mn,na,nn,la,ln,&a,&n) == 2) {
+ if (fabs(la-a)<GM_ACCY && fabs(ln-n)<GM_ACCY) return 2;
+ }
+ }
+
+ // Ikke parallelle
+ return 0;
+}
+
+
+/*
+AR-901209
+CH GM_sVektVekt Skjæringspunkt mellom 2 uendelige linjer
+CD ==========================================================================
+CD Formål:
+CD Beregner skjæringspunkt mellom uendelige 2 linjer (M-N) og (K-L)
+CD
+CD M* *L
+CD \ /
+CD \ /
+CD *S
+CD / \
+CD / \
+CD K* *N
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double ka i Koordinat i K
+CD double kn i
+CD double la i Koordinat i L
+CD double ln i
+CD double ma i Koordinat i M
+CD double mn i
+CD double na i Koordinat i N
+CD double nn i
+CD double *sa u Koordinat i S
+CD double *sn u
+CD short kryss r 0=ikke skjæring, 1=skjæring
+CD
+CD Bruk:
+CD kryss = GM_sVektVekt(ka,kn,la,ln,ma,mn,na,nn,&sa,&sn);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_sVektVekt(double ka,double kn,double la,double ln,double ma,double mn,
+ double na,double nn,double *sa,double *sn)
+{
+ double det,detinv,s,t;
+
+ double alk = la - ka;
+ double nlk = ln - kn;
+ double anm = na - ma;
+ double nnm = nn - mn;
+ double amk = ma - ka;
+ double nmk = mn - kn;
+
+
+ /* Sorterer først ut åpenbare tilfeller der det ikke er skjæring */
+ //if (max(ka,la) < min(ma,na)) return 0;
+ //if (min(ka,la) > max(ma,na)) return 0;
+ //if (max(kn,ln) < min(mn,nn)) return 0;
+ //if (min(kn,ln) > max(mn,nn)) return 0;
+
+ det = anm * nlk - nnm * alk;
+
+ /* Parallelle linjer */
+ if (fabs(det) < ACCY) return 0;
+
+ detinv = 1.0 / det;
+ s = (anm*nmk - nnm*amk) * detinv;
+ t = (alk*nmk - nlk*amk) * detinv;
+
+ //if (s < 0.0 || s > 1.0 || t < 0.0 || t > 1.0) return 0;
+
+ *sa = ka + alk*s;
+ *sn = kn + nlk*s;
+
+ return 1;
+
+
+
+#ifdef UTGAAR
+
+ double pa1,pb1,pc1,pa2,pb2,pc2;
+
+ /*
+ * Beregner skjæring mellom to uendelige vektorer.
+ */
+ if (GM_bepa(ka,kn,la,ln,&pa1,&pb1,&pc1)) {
+ if (GM_bepa(ma,mn,na,nn,&pa2,&pb2,&pc2)) {
+ if (GM_cint(pa1,pb1,pc1,pa2,pb2,pc2,sa,sn)) {
+ return 1; /* Skjæring funnet ==> returnerer */
+ }
+ }
+ }
+
+ return 0; /* Ingen skjæring funnet ==> returnerer */
+
+#endif
+}
+
+
+/*
+AR-890722
+CH GM_sLinBue Skjæring mellom linje og bue
+CD ==========================================================================
+CD Formål:
+CD Beregner skjæringspunkt mellom en linje (K-L) og en bue.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double sa i Koordinat i buens sentrum.
+CD double sn i
+CD double radius i Buens radius.
+CD double fi i Retning fra sentrum til buens startpunkt
+CD double dfi i Vinkel mellom retning til buens startpunkt og sluttpunkt
+CD double ka i Koordinat i K.
+CD double kn i
+CD double la i Koordinat i L.
+CD double ln i
+CD double *a1 u Koordinat i skjæringspunkt 1
+CD double *n1 u
+CD double *a2 u Koordinat i skjæringspunkt 2
+CD double *n2 u
+CD short kryss r Antall skjæringspunkter (0, 1 eller 2)
+CD
+CD Bruk:
+CD kryss = GM_sLinBue(sa,sn,radius,fi,dfi,ka,kn,la,ln,&a1,&n1,&a2,&n2);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_sLinBue(double sa,double sn,double radius,double fi,double dfi,
+ double ka,double kn,double la,double ln,
+ double *a1,double *n1,double *a2,double *n2)
+{
+ short kryss;
+ double mina,minn,maxa,maxn;
+
+ /* Beregn først skjæring mellom uendelig vektor og hele sirkelen */
+ kryss = GM_sVektSirk(sa,sn,radius,ka,kn,la,ln,a1,n1,a2,n2);
+
+ /* Sjekk om punktene ligger på linjen */
+ if (kryss > 0){
+ minn = min(kn,ln) - ACCY;
+ mina = min(ka,la) - ACCY;
+ maxn = max(kn,ln) + ACCY;
+ maxa = max(ka,la) + ACCY;
+
+ if (kryss == 2){
+ if (! (*a2 <= maxa && *a2 >= mina &&
+ *n2 <= maxn && *n2 >= minn)){
+ kryss = 1; /* Utenfor linjen */
+ }
+ }
+
+ if (! (*a1 <= maxa && *a1 >= mina && *n1 <= maxn && *n1 >= minn)){
+ /* Utenfor linjen */
+ if (kryss == 2){ /* Flytt ned forrige skjæringspunkt */
+ kryss = 1;
+ *a1 = *a2;
+ *n1 = *n2;
+ } else{
+ kryss = 0; /* Ikke noe skjæringspunkt */
+ }
+ }
+ }
+
+ /* Sjekk om punktene ligger på buen */
+ if (kryss > 0){
+ if (kryss == 2){
+ if ( ! GM_TestPktBue(sa,sn,fi,dfi,*a2,*n2)){
+ kryss = 1; /* Utenfor buen */
+ }
+ }
+
+ if ( ! GM_TestPktBue(sa,sn,fi,dfi,*a1,*n1)){
+ if (kryss == 2){ /* Flytt ned forrige skjæringspunkt */
+ kryss = 1;
+ *a1 = *a2;
+ *n1 = *n2;
+ } else{
+ kryss = 0; /* Ikke noe skjæringspunkt */
+ }
+ }
+ }
+
+ return kryss;
+}
+
+
+/*
+AR-901209
+CH GM_sVektSirk Skjæring mellom uendelig linje og sirkel
+CD ==========================================================================
+CD Formål:
+CD Beregner skjæringspunkt mellom en uendelig linje (K-L) og en sirkel.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double sa i Koordinat i sirkelens sentrum.
+CD double sn i
+CD double radius i Sirkelens radius.
+CD double ka i Koordinat i K.
+CD double kn i
+CD double la i Koordinat i L.
+CD double ln i
+CD double *a1 u Koordinat i skjæringspunkt 1
+CD double *n1 u
+CD double *a2 u Koordinat i skjæringspunkt 2
+CD double *n2 u
+CD short kryss r Antall skjæringspunkter (0, 1 eller 2)
+CD
+CD Bruk:
+CD kryss = GM_sVektSirk(sa,sn,radius,ka,kn,la,ln,&a1,&n1,&a2,&n2);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_sVektSirk(double sa,double sn,double radius,
+ double ka,double kn,double la,double ln,
+ double *a1,double *n1,double *a2,double *n2)
+{
+ short kryss = 0;
+ double f,g,root,fsq,gsq,fgsq,xj0,yj0,fygx,fxgy,t,fginv,t1,t2;
+
+ /* Beregn skjæring mellom uendelig vektor og sirkelen */
+ /* Parametre for K-L */
+ f = la - ka;
+ g = ln - kn;
+ /* Beregn skjæring */
+ fsq = f * f;
+ gsq = g * g;
+ fgsq = fsq + gsq;
+ if (fgsq > ACCY){ /* Linjen er ok */
+ xj0 = sa - ka;
+ yj0 = sn - kn;
+ fygx = f*yj0 - g*xj0;
+ root = radius*radius*fgsq - fygx*fygx;
+ if (root > -ACCY){ /* Linjen berører sirkelen */
+ fxgy = f*xj0 + g*yj0;
+ if (root < ACCY){ /* Linjen tangerer sirkelen */
+ kryss = 1;
+ t = fxgy / fgsq;
+ *a1 = ka + f*t;
+ *n1 = kn + g*t;
+
+ } else{ /* Linjen skjærer sirkelen */
+ kryss = 2;
+ root = sqrt(root);
+ fginv = 1.0 / fgsq;
+ t1 = (fxgy - root) * fginv;
+ t2 = (fxgy + root) * fginv;
+ *a1 = ka + f*t1;
+ *n1 = kn + g*t1;
+ *a2 = ka + f*t2;
+ *n2 = kn + g*t2;
+ }
+ }
+ }
+
+ return kryss;
+}
+
+
+/*
+AR-901209
+CH GM_sBueBue Skjæringspunkt mellom 2 buer
+CD ==========================================================================
+CD Formål:
+CD Beregner skjæringspunkt mellom 2 buer.
+CD NB! Retningen oppgis i radianer, med retning 0 i øst-aksen, og med positiv
+CD omløpsretning mot urviseren. Alle vinkler er i området 0 - 2PI.
+CD Metode: Se Bowyer and Woodwark: AProgrammer's Geometry, side 27-28.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double sa1 i Koordinat i buens sentrum.
+CD double sn1 i
+CD double radius1 i Buens radius.
+CD double fi1 i Retning fra sentrum til buens startpunkt
+CD double dfi1 i Vinkel mellom retning til buens startpunkt og sluttpunkt
+CD double sa2 i Koordinat i buens sentrum.
+CD double sn2 i
+CD double radius2 i Buens radius.
+CD double fi2 i Retning fra sentrum til buens startpunkt
+CD double dfi2 i Vinkel mellom retning til buens startpunkt og sluttpunkt
+CD double *a1 u Koordinat i skjæringspunkt 1
+CD double *n1 u
+CD double *a2 u Koordinat i skjæringspunkt 2
+CD double *n2 u
+CD short kryss r Antall skjæringspunkter (0, 1 eller 2)
+CD
+CD Bruk:
+CD kryss = GM_sBueBue(as1,ns1,fi1,dfi1,as2,ns2,fi2,dfi2,&a1,&n1,&a2,&n2);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_sBueBue(double as1,double ns1,double radius1,double fi1,double dfi1,
+ double as2,double ns2,double radius2,double fi2,double dfi2,
+ double *a1,double *n1,double *a2,double *n2)
+{
+ short kryss;
+
+ /*
+ * Beregner først skjæring mellom to sirkler.
+ * Sjekker etterpå om skjæringspunktene ligger på buene.
+ */
+
+ kryss = GM_sSirkSirk(as1,ns1,radius1,as2,ns2,radius2,a1,n1,a2,n2);
+
+ /* Sjekk om punktene ligger inne på de aktuelle buene */
+ if (kryss > 0){
+ /* Sjekk om skjæringspunkt 2 ligger på bue 1 */
+ if (kryss == 2){
+ if ( ! GM_TestPktBue(as1,ns1,fi1,dfi1,*a2,*n2)){
+ kryss = 1; /* Utenfor buen */
+ }
+
+ /* Sjekk om skjæringspunkt 2 også ligger på bue 2 */
+ if (kryss == 2){
+ if ( ! GM_TestPktBue(as2,ns2,fi2,dfi2,*a2,*n2)){
+ kryss = 1; /* Utenfor buen */
+ }
+ }
+ }
+
+ /* Sjekk om skjæringspunkt 1 ligger på bue 1 */
+ if ( ! GM_TestPktBue(as1,ns1,fi1,dfi1,*a1,*n1)){
+ if (kryss == 2){ /* Flytt ned forrige skjæringspunkt */
+ kryss = 1;
+ *a1 = *a2;
+ *n1 = *n2;
+ } else {
+ kryss = 0; /* Ikke noe skjæringspunkt */
+ }
+ }
+
+ if (kryss > 0){
+ /* Sjekk om skjæringspunkt 1 også ligger på bue 2 */
+ if ( ! GM_TestPktBue(as2,ns2,fi2,dfi2,*a1,*n1)){
+ if (kryss == 2){ /* Flytt ned forrige skjæringspunkt */
+ kryss = 1;
+ *a1 = *a2;
+ *n1 = *n2;
+ } else{
+ kryss = 0; /* Ikke noe skjæringspunkt */
+ }
+ }
+ }
+ }
+
+ return kryss;
+}
+
+
+/*
+AR-901209
+CH GM_sSirkSirk Skjæringspunkt mellom 2 sirkler
+CD ==========================================================================
+CD Formål:
+CD Beregner skjæringspunkt mellom 2 sirkler.
+CD Metode: Se Bowyer and Woodwark: AProgrammer's Geometry, side 27-28.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double sa1 i Koordinat i sirklens sentrum.
+CD double sn1 i
+CD double radius1 i Sirklens radius.
+CD double sa2 i Koordinat i sirklens sentrum.
+CD double sn2 i
+CD double radius2 i Sirklens radius.
+CD double *a1 u Koordinat i skjæringspunkt 1
+CD double *n1 u
+CD double *a2 u Koordinat i skjæringspunkt 2
+CD double *n2 u
+CD short kryss r Antall skjæringspunkter (0, 1 eller 2)
+CD
+CD Bruk:
+CD kryss = GM_sSirkSirk(as1,ns1,as2,ns2,&a1,&n1,&a2,&n2);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_sSirkSirk(double as1,double ns1,double radius1,
+ double as2,double ns2,double radius2,
+ double *a1,double *n1,double *a2,double *n2)
+{
+ double r1sq,r2sq,a21,n21,distsq,dstinv,sumrsq,root,a,n,afac,nfac;
+ double scl,delrsq;
+ short kryss = 0;
+
+ /*
+ * Beregner skjæring mellom to sirkler.
+ */
+
+ r1sq = radius1 * radius1;
+ r2sq = radius2 * radius2;
+ a21 = as2 - as1;
+ n21 = ns2 - ns1;
+
+ /* Beregn kvadrert lengden L-K */
+ distsq = a21*a21 + n21*n21;
+
+ if (distsq > ACCY){ /* Ikke sammenfallende punkt */
+ delrsq = r2sq - r1sq;
+ sumrsq = r1sq + r2sq;
+ root = 2.0*sumrsq*distsq - distsq*distsq - delrsq*delrsq;
+
+ if (root > -ACCY){ /* Sirklene skjærer */
+ dstinv = 0.5 / distsq;
+ scl = 0.5 - delrsq*dstinv;
+ a = as1 + a21*scl;
+ n = ns1 + n21*scl;
+
+ if (root < ACCY){ /* 1 tangeringspunkt */
+ *a1 = a;
+ *n1 = n;
+ kryss = 1;
+
+ } else{ /* 2 skjæringspunkter */
+ root = dstinv * sqrt(root);
+ afac = a21 * root;
+ nfac = n21 * root;
+
+ *a1 = a - nfac;
+ *n1 = n + afac;
+ *a2 = a + nfac;
+ *n2 = n - afac;
+ kryss = 2;
+ }
+ }
+ }
+
+ return kryss;
+}
+
+
+/*
+AR-890904
+JAØ-1999-02-03
+CH GM_fotp Fotpunkt på linje fra punkt
+CD ==========================================================================
+CD Formål:
+CD Beregner fotpunktet på linjen 1-2 fra punktet P.
+CD
+CD *P
+CD !
+CD !
+CD 1*--------*---------*2
+CD F
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a1 i Koordinat i 1
+CD double n1 i
+CD double a2 i Koordinat i 2
+CD double n2 i
+CD double ap i Koordinat i P
+CD double np i
+CD double *af u Koordinat i fotpunktet
+CD double *nf u
+CD short kryss r 0=ikke beregnet (brukes ikke)
+CD 1=beregnet, men punktet er utenfor linjen
+CD 2=bregnet, ok
+CD
+CD Bruk:
+CD kryss = GM_fotp(a1,n1,a2,n2,ap,np,&af,&nf);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_fotp(double a1,double n1,double a2,double n2,double ap,double np,
+ double *af,double *nf)
+{
+ //double pa1,pb1,pc1,pa2,pb2,pc2;
+ double ap1,np1,ap2,np2,retning,a1u,n1u,a2u,n2u;
+ short beregnet = 0;
+
+
+ if (fabs(a2-a1) < ACCY) {
+ /* Punkt 1 og 2 er sammenfallende */
+ if (fabs(n2-n1) < ACCY) {
+ *af = a1;
+ *nf = n1;
+
+ /* Vertikal linje */
+ } else {
+ *af = a1;
+ *nf = np;
+ }
+
+ /* Sjekk at fotpunktet er på linjen */
+ //if ( (*nf <= max(n1,n2)+ACCY) && (*nf >= min(n1,n2)-ACCY) ) {
+ if ( (*nf <= max(n1,n2)) && (*nf >= min(n1,n2)) ) {
+ beregnet = 2;
+ } else {
+ beregnet = 1;
+ }
+
+ /* Horisontal linje */
+ } else if (fabs(n2-n1) < ACCY) {
+ *af = ap;
+ *nf = n1;
+
+ /* Sjekk at fotpunktet er på linjen */
+ //if ( (*af <= max(a1,a2)+ACCY) && (*af >= min(a1,a2)-ACCY) ) {
+ if ( (*af <= max(a1,a2)) && (*af >= min(a1,a2)) ) {
+ beregnet = 2;
+ } else {
+ beregnet = 1;
+ }
+ }
+
+ /* ---------- Skrå linje */
+ if ( ! beregnet) {
+ //JAØ-20001205 Prøver ny metode å beregne fotpunkt, pga avrundingsproblemer ved små verdier.
+ retning = GM_RetnGon(a1,n1,a2,n2);
+ //Utvider linjene "uendelig" for å være sikker på å få kryssing
+ a1u = a1; a2u = a2; n1u = n1; n2u = n2;
+ GM_PolRettv(&a1u,&n1u,retning+200.0,100000000);
+ GM_PolRettv(&a2u,&n2u,retning,100000000);
+ ap1 = ap; ap2 = ap; np1 = np; np2 = np;
+ GM_PolRettv(&ap1,&np1,retning+100.0,100000000);
+ GM_PolRettv(&ap2,&np2,retning-100.0,100000000);
+ GM_sLinLin(a1u,n1u,a2u,n2u,ap1,np1,ap2,np2,af,nf); //Da gikk det bedre!
+
+ //JAØ-20001205 Fjernet gammel måte å beregne fotpunkt, pga avrundingsproblemer ved små verdier.
+ /*
+ // Parametre for 1-2
+ if (GM_bepa(a1,n1,a2,n2,&pa1,&pb1,&pc1)){
+ // Parametre for P-F
+ pa2=pb1;
+ pb2=-pa1;
+ pc2=pa1*np-pb1*ap;
+ // Fotpunktet
+ GM_cint(pa1,pb1,pc1,pa2,pb2,pc2,af,nf);
+ }
+ */
+
+ /* Sjekk at fotpunktet er på linjen */
+ //if (*nf <= (max(n1,n2)+ACCY) && *nf >= (min(n1,n2)-ACCY) &&
+ // *af <= (max(a1,a2)+ACCY) && *af >= (min(a1,a2)-ACCY)){
+ if (*nf <= (max(n1,n2)) && *nf >= (min(n1,n2)) &&
+ *af <= (max(a1,a2)) && *af >= (min(a1,a2))){
+ beregnet = 2; /* På linjen */
+ } else {
+ beregnet = 1; /* Utenfor linjen */
+ }
+ }
+
+ return beregnet;
+}
+
+/*
+IR-2011-05-05
+CH GM_fotp Fotpunkt på line frå punkt
+CD ==========================================================================
+CD Formål:
+CD Bereknar fotpunktet på lina 1-2 frå punktet P (i 2D).
+CD (Ein kan bruke same metoden i 3D, ved å ta med z-koordinatane i tillegg.)
+CD Sjå http://paulbourke.net/geometry/sphereline for dokumentasjon.
+CD
+CD *P
+CD !
+CD !
+CD 1*--------*---------*2
+CD F
+CD
+CD Parametrar:
+CD Type Namn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a1 i Koordinat i 1
+CD double n1 i
+CD double a2 i Koordinat i 2
+CD double n2 i
+CD double ap i Koordinat i P
+CD double np i
+CD double *af u Koordinat i fotpunktet
+CD double *nf u
+CD short kryss r 0=ikkje berekna (blir ikkje brukt)
+CD 1=berekna, men punktet er utanfor lina
+CD 2=berekna, ok
+CD
+CD Bruk:
+CD kryss = GM_fotp(a1,n1,a2,n2,ap,np,&af,&nf);
+ ==========================================================================
+*/
+// SK_EntPnt_GM short GM_fotp_ny(double a1,double n1,double a2,double n2,double ap,double np,
+// double *af,double *nf)
+
+
+
+SK_EntPnt_GM short GM_fotp_ny(double a1, double n1, double a2, double n2, double ap, double np,
+ double *af, double *nf)
+{
+ double da12, dn12, da1p, dn1p, teljar, nemnar, u;
+ short godfot;
+
+ da12 = a2 - a1;
+ dn12 = n2 - n1;
+ da1p = ap - a1;
+ dn1p = np - n1;
+ teljar = da1p * da12 + dn1p * dn12;
+ nemnar = da12 * da12 + dn12 * dn12;
+
+ if (nemnar == 0) // lina 1-2 er nullvektor
+ {
+ *af = a1;
+ *nf = n1;
+ godfot = 2;
+ }
+ else
+ {
+ u = teljar / nemnar;
+ *af = a1 + u * da12;
+ *nf = n1 + u * dn12;
+ if ( (u >= 0) && (u <= 1))
+ {
+ godfot = 2;
+ }
+ else
+ {
+ godfot = 1;
+ }
+ }
+
+ return godfot;
+}
+
+#ifdef TEST
+{
+ //double pa1,pb1,pc1,pa2,pb2,pc2;
+ double retning;
+
+ double ap1=ap;
+ double np1=np;
+ short beregnet = 0;
+ double dn=fabs(n2-n1);
+ double da=fabs(a2-a1);
+
+ if (da < ACCY) {
+ /* Punkt 1 og 2 er sammenfallende */
+ if (dn < ACCY) {
+ *af = a1;
+ *nf = n1;
+
+ /* Vertikal linje */
+ } else {
+ *af = a1;
+ *nf = np;
+ }
+
+ /* Sjekk at fotpunktet er på linjen */
+ if ( (*nf <= max(n1,n2)+ACCY) && (*nf >= min(n1,n2)-ACCY) ) {
+ beregnet = 2;
+ } else {
+ beregnet = 1;
+ }
+
+ /* Horisontal linje */
+ } else if (dn < ACCY) {
+ *af = ap;
+ *nf = n1;
+
+ /* Sjekk at fotpunktet er på linjen */
+ if ( (*af <= max(a1,a2)+ACCY) && (*af >= min(a1,a2)-ACCY) ) {
+ beregnet = 2;
+ } else {
+ beregnet = 1;
+ }
+ }
+
+ /* ---------- Skrå linje */
+ if ( ! beregnet) {
+
+ // AR 2000-12-10
+ // Forslag til ny metode for fotpunktberegning. Endrer ikke de opprinnelige punktene,
+ // og det blir da mulig å gi korrekt tilbakemelding om punktet ligger inne på den gitte linjen.
+ retning = GM_RetnGon(a1,n1,a2,n2);
+ GM_PolRettv(&ap1, &np1, retning+100.0, max(da,dn));
+ GM_sVektVekt(a1,n1,a2,n2,ap,np,ap1,np1,af,nf);
+
+ /* Sjekk at fotpunktet er på linjen */
+ if (*nf <= (max(n1,n2)+ACCY) && *nf >= (min(n1,n2)-ACCY) &&
+ *af <= (max(a1,a2)+ACCY) && *af >= (min(a1,a2)-ACCY)){
+ beregnet = 2; /* På linjen */
+ } else {
+ beregnet = 1; /* Utenfor linjen */
+ }
+ }
+
+ return beregnet;
+}
+#endif
+
+
+/*
+AR-991012
+CH GM_Parallell Parallellforskyver linje
+CD ==========================================================================
+CD Formål:
+CD Parallellforskyver linjen K-L gitt avstand normalt til siden.
+CD
+CD
+CD L1 L L1
+CD *- - - - * - - - - *
+CD !
+CD ! ! !
+CD !
+CD ! ! !
+CD !
+CD ! ! !
+CD !
+CD *- - - - * - - - - *
+CD K1 K K1
+CD
+CD
+CD avstand < 0 avstand > 0
+CD
+CD
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double ka i Koordinat i K
+CD double kn i
+CD double la i Koordinat i L
+CD double ln i
+CD double avstand i Forskyving (>0 = til høyre(K2-L2), <0 = til venstre(K1-L1))
+CD double *ka1 u Koordinat i K1
+CD double *kn1 u
+CD double *la1 u Koordinat i L1
+CD double *ln1 u
+CD bool status s r UT_FALSE = ikke beregnet (K og L har like koordinater)
+CD UT_TRUE = bregnet, ok
+CD
+CD Bruk:
+CD status = GM_Parallell(ka,kn,la,ln,avstand,&ka1,&kn1,&la1,&ln1);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_Parallell(double ka,double kn,double la,double ln,double avstand,
+ double *ka1,double *kn1,double *la1,double *ln1)
+{
+ double fi, da, dn;
+
+
+ /* Punkt 1 og 2 er sammenfallende, klarer ikke å beregne */
+ if (fabs(ka-la) < ACCY && fabs(kn-ln) < ACCY) {
+ *ka1 = ka;
+ *kn1 = kn;
+ *la1 = la;
+ *ln1 = ln;
+ return UT_FALSE;
+ }
+
+ /* Ingen forskyving */
+ if (fabs(avstand) <= ACCY) {
+ *ka1 = ka;
+ *kn1 = kn;
+ *la1 = la;
+ *ln1 = ln;
+ return UT_TRUE;
+ }
+
+ /* Beregner retninger fra K til L */
+ fi = GM_retning(ka,kn,la,ln);
+
+ /* Forskyvingsretning */
+ if ( avstand < ACCY ) { /* Forskyving til venstre */
+ fi += PI/2;
+ } else { /* Forskyving til høyre */
+ fi -= PI/2;
+ }
+
+ /* Beregner nye koordinater */
+ avstand = fabs (avstand);
+ da = avstand * cos(fi);
+ dn = avstand * sin(fi);
+ *ka1 = ka + da;
+ *kn1 = kn + dn;
+ *la1 = la + da;
+ *ln1 = ln + dn;
+
+ return UT_TRUE;
+}
+
+
+/*
+AR-890723
+CH GM_KonvBue Omregning til intern bue-angivelse
+CD ==========================================================================
+CD Formål:
+CD Omregning til intern bue-angivelse med sirkelsentrum, radius og retning
+CD til buens start samt delta for sluttpunktet.
+CD NB! Retningen oppgis i radianer, med retning 0 i øst-aksen, og med positiv
+CD omløpsretning mot urviseren. Alle vinkler er i området 0 - 2PI.
+CD Metode: Se Bowyer and Woodwark: AProgrammer's Geometry,
+CD side 27-28 og 35-36.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a1 i Koordinat i P1
+CD double n1 i
+CD double a2 i Koordinat i P2
+CD double n2 i
+CD double radius i Buens radius (med fortegn)
+CD short storbue i Storbue (1=storbue, 0=ikke storbue)
+CD double *as u Koordinat i sentrumspunktet
+CD double *ns u
+CD double *fi u "Retning" sentrum - punkt 1.
+CD double *dfi u Vinkel mellom fi og retning sentrum - punkt 2.
+CD short beregnet r 0=kan ikke beregne, 1=bregnet ok.
+CD
+CD Bruk:
+CD ok = GM_KonvBue(a1,n1,a2,n2,radius,storbue,&as,&ns,&fi,&dfi);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_KonvBue(double a1,double n1,double a2,double n2,double radius,
+ short storbue,double *as,double *ns,double *fi,double *dfi)
+{
+ double rsq,a21,n21,distsq,dstinv,sumrsq,root,a,n,afac,nfac,fi2,f1;
+ short beregnet = 0;
+
+ rsq = radius * radius;
+ a21 = a2 - a1;
+ n21 = n2 - n1;
+
+ /* Beregn kvadrert lengden L-K */
+ distsq = a21*a21 + n21*n21;
+
+ if (distsq > ACCY) { /* Ikke sammenfallende punkt */
+ sumrsq = rsq + rsq;
+ root = 2.0*sumrsq*distsq - distsq*distsq;
+
+ if (root > -ACCY) { /* Sirklene skjærer eller tangerer */
+ beregnet = 1;
+ dstinv = 0.5 / distsq;
+ a = a21 * 0.5 + a1;
+ n = n21 * 0.5 + n1;
+
+ if (root > ACCY) { /* 2 skjæringspunkter */
+ root = dstinv * sqrt(root);
+ afac = a21 * root;
+ nfac = n21 * root;
+ if ((radius < 0.0 && storbue == 0) ||
+ (radius > 0.0 && storbue == 1) )
+ {
+ *as = a - nfac; /* Bruker 1. skjæringspunkt */
+ *ns = n + afac;
+ } else {
+ *as = a + nfac; /* Bruker 2. skjæringspunkt */
+ *ns = n - afac;
+ }
+
+ } else { /* Tangering */
+ *as = a;
+ *ns = n;
+ }
+
+ /* Beregn retninger fra sentrum til start og sluttpunkt */
+ *fi = GM_retning(*as,*ns,a1,n1); /* S - K */
+ f1 = *fi;
+ fi2 = GM_retning(*as,*ns,a2,n2); /* S - L */
+
+ /* Beregner retningsavvik */
+ if (radius < 0.0)
+ {
+ if (fi2 < f1) fi2 += (PI*2.0);
+ } else {
+ if (f1 < fi2) f1 += (PI*2.0);
+ }
+ *dfi = fi2 - f1;
+ }
+ }
+
+ return beregnet;
+}
+
+
+/*
+AR-890723
+CH GM_KonvBuep Omregning til intern bue-angivelse
+CD ==========================================================================
+CD Formål:
+CD Omregning til intern bue-angivelse med sirkelsentrum, radius og retning
+CD til buens start samt delta for sluttpunktet.
+CD NB! Retningen oppgis i radianer, med retning 0 i øst-aksen, og med positiv
+CD omløpsretning mot urviseren. Alle vinkler er i området 0 - 2PI.
+CD Metode: Se Bowyer and Woodwark: AProgrammer's Geometry,
+CD side 27-28 og 35-36.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a1 i Koordinat i P1 (startpunkt)
+CD double n1 i
+CD double a2 i Koordinat i P2 (punkt på buen)
+CD double n2 i
+CD double a3 i Koordinat i P3 (sluttpunkt)
+CD double n3 i
+CD double *as u Koordinat i sentrumspunktet
+CD double *ns u
+CD double *radius u Buens radius
+CD double *fi u "Retning" sentrum - punkt 1.
+CD double *dfi u Vinkel mellom fi og retning sentrum - punkt 3.
+CD short beregnet r 0=kan ikke beregne, 1=bregnet ok.
+CD
+CD Bruk:
+CD ok = GM_KonvBuep(a1,n1,a2,n2,a3,n3,&as,&ns,&radius,&fi,&dfi);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_KonvBuep(double a1,double n1,double a2,double n2,double a3,double n3,
+ double *as,double *ns,double *radius,double *fi,double *dfi)
+{
+ double ap,np,fi2,fi3,dfi2,dfi3;
+ double pa1,pb1,pc1,pa2,pb2,pc2,pa3,pb3,pc3;
+ short beregnet = 0;
+
+ /* Parametre for linjen 1 - 3 */
+ if(GM_bepa(a1,n1,a3,n3,&pa1,&pb1,&pc1)){
+ /* Midtpunktet mellom 1 og 3 */
+ ap = a1 + (a3-a1) / 2.0;
+ np = n1 + (n3-n1) / 2.0;
+
+ /* Parametre for midtlinjen mellom 1 og 3 */
+ pa3=pb1;
+ pb3=-pa1;
+ pc3=pa1*np-pb1*ap;
+
+ /* Parametre for linjen 1 - 2 */
+ if(GM_bepa(a1,n1,a2,n2,&pa1,&pb1,&pc1)){
+ /* Midtpunktet mellom 1 og 2 */
+ ap = a1 + (a2-a1) / 2.0;
+ np = n1 + (n2-n1) / 2.0;
+
+ /* Parametre for midtlinjen mellom 1 og 2 */
+ pa2=pb1;
+ pb2=-pa1;
+ pc2=pa1*np-pb1*ap;
+
+ /* Sentrum er skjæringspunktet mellom de to linjene */
+ if (GM_cint(pa3,pb3,pc3,pa2,pb2,pc2,as,ns)){
+ *radius = sqrt((*as-a1)*(*as-a1) + (*ns-n1)*(*ns-n1));
+
+ /* Beregn retninger fra sentrum til start og sluttpunkt */
+ *fi = GM_retning(*as,*ns,a1,n1); /* S - P1 */
+ fi2 = GM_retning(*as,*ns,a2,n2); /* S - P2 */
+ fi3 = GM_retning(*as,*ns,a3,n3); /* S - P3 */
+
+ /* Beregner retningsavvik */
+ dfi2 = fi2 - *fi;
+ dfi3 = fi3 - *fi;
+
+ /* Positiv delta ? */
+ if (dfi2 < 0.0) dfi2 += (PI*2.0);
+ if (dfi3 < 0.0) dfi3 += (PI*2.0);
+ if (dfi2 <= dfi3){
+ *dfi = dfi3;
+ } else{
+ /* Negativ delta */
+ if (dfi3 > 0.0) dfi3 -= (PI*2.0);
+ *dfi = dfi3;
+ }
+
+ beregnet = 1;
+ }
+ }
+ }
+
+ return beregnet;
+}
+
+
+/*
+AR-911029
+CH GM_KonvSirkel Omregning til intern bue-angivelse
+CD ==========================================================================
+CD Formål:
+CD Omregning til intern bue-angivelse med sirkelsentrum, radius og retning
+CD til buens start samt delta for sluttpunktet.
+CD NB! Retningen oppgis i radianer, med retning 0 i øst-aksen, og med positiv
+CD omløpsretning mot urviseren. Alle vinkler er i området 0 - 2PI.
+CD Metode: Se Bowyer and Woodwark: AProgrammer's Geometry,
+CD side 27-28 og 35-36.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double *as iu Koordinat i sentrumspunktet
+CD double *ns iu
+CD double *radius iu Buens radius
+CD double *fi u "Startretning" sentrum - punkt 1.
+CD double *dfi u "Åpningsvinkel" (2PI).
+CD short ist r 1 = OK, 0 = ikke beregnet.
+CD
+CD Bruk:
+CD ist = GM_KonvSirkel(&as,&ns,&radius,&fi,&dfi);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_KonvSirkel(double *fi,double *dfi)
+{
+
+ *fi = 0.0;
+ *dfi = 2.0 * PI;
+
+ return 1;
+}
+
+
+/*
+AR-911029
+CH GM_KonvSirkelp Omregning til intern bue-angivelse
+CD ==========================================================================
+CD Formål:
+CD Omregning til intern bue-angivelse med sirkelsentrum, radius og retning
+CD til buens start samt delta for sluttpunktet.
+CD NB! Retningen oppgis i radianer, med retning 0 i øst-aksen, og med positiv
+CD omløpsretning mot urviseren. Alle vinkler er i området 0 - 2PI.
+CD Metode: Se Bowyer and Woodwark: AProgrammer's Geometry,
+CD side 27-28 og 35-36.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a1 i Koordinat i P1 (punkt på buen)
+CD double n1 i
+CD double a2 i Koordinat i P2 (punkt på buen)
+CD double n2 i
+CD double a3 i Koordinat i P3 (punkt på buen)
+CD double n3 i
+CD double *as u Koordinat i sentrumspunktet
+CD double *ns u
+CD double *radius u Buens radius
+CD double *fi u "Retning" sentrum - start av buen (0)
+CD double *dfi u Åpningsvinkel (2*PI)
+CD short beregnet r 1 = OK; 0 = kan ikke beregne.
+CD
+CD Bruk:
+CD ist = GM_KonvSirkelp(a1,n1,a2,n2,a3,n3,&as,&ns,&radius,&fi,&dfi);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_KonvSirkelp(double a1,double n1,double a2,double n2,double a3,double n3,
+ double *as,double *ns,double *radius,double *fi,double *dfi)
+{
+ double ap,np;
+ double pa1,pb1,pc1,pa2,pb2,pc2,pa3,pb3,pc3;
+ short beregnet = 0;
+
+ /* Parametre for linjen 1 - 3 */
+ if(GM_bepa(a1,n1,a3,n3,&pa1,&pb1,&pc1)){
+ /* Midtpunktet mellom 1 og 3 */
+ ap = a1 + (a3-a1)/2.0;
+ np = n1 + (n3-n1)/2.0;
+
+ /* Parametre for midtlinjen mellom 1 og 3 */
+ pa3=pb1;
+ pb3=-pa1;
+ pc3=pa1*np-pb1*ap;
+
+ /* Parametre for linjen 1 - 2 */
+ if(GM_bepa(a1,n1,a2,n2,&pa1,&pb1,&pc1)){
+ /* Midtpunktet mellom 1 og 2 */
+ ap = a1 + (a2-a1)/2.0;
+ np = n1 + (n2-n1)/2.0;
+
+ /* Parametre for midtlinjen mellom 1 og 2 */
+ pa2=pb1;
+ pb2=-pa1;
+ pc2=pa1*np-pb1*ap;
+
+ /* Sentrum er skjæringspunktet mellom de to linjene */
+ if (GM_cint(pa3,pb3,pc3,pa2,pb2,pc2,as,ns)){
+ *radius = sqrt((*as-a1)*(*as-a1) + (*ns-n1)*(*ns-n1));
+
+ /* Beregn retninger fra sentrum til start og sluttpunkt */
+ *fi = GM_retning(*as,*ns,a1,n1);
+ *dfi = 2.0 * PI;
+
+ beregnet = 1;
+ }
+ }
+ }
+
+ return beregnet;
+}
+
+
+/*
+AR-881018
+CH GM_bepa Linjeparametre
+CD ==========================================================================
+CD Formål:
+CD Beregner parametrene for linjen gjennom 1 og 2.
+CD Ligningen for linjen er: (AX+BY+C=0).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a1 i Koordinat i 1
+CD double n1 i
+CD double a2 i Koordinat i 2
+CD double n2 i
+CD double *pa u Parametre for linjen
+CD double *pb u
+CD double *pc u
+CD short ist r 1=beregnet, 0=ikke beregnet (1 og 2 er samme punkt)
+CD
+CD Bruk:
+CD ist = GM_bepa(a1,n1,a2,n2,&pa,&pb,&pc);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_bepa(double a1, double n1, double a2, double n2,
+ double *pa, double *pb, double *pc)
+{
+ double ndif,adif,rinv,atmp,ntmp,dmn,dmx,div;
+
+ adif = a2-a1;
+ atmp = fabs(adif);
+ ndif = n2-n1;
+ ntmp = fabs(ndif);
+
+
+ if(atmp > ACCY || ntmp > ACCY) {
+
+ dmx = max(atmp,ntmp);
+ dmn = min(atmp,ntmp);
+ div = dmn / dmx;
+
+ rinv = 1.0 / (dmx * sqrt(1.0+div*div));
+ *pa = -ndif*rinv;
+ *pb = adif*rinv;
+ //*pc = (a1*n2 - a2*n1) * rinv;
+ {
+ double d1 = a1*n2;
+ double d2 = a2*n1;
+ double d3 = d1 - d2;
+ *pc = d3 * rinv;
+ }
+
+ // -56430.600006104
+
+ return (1);
+ } else {
+ *pa = *pb = *pc = 0.0;
+ return (0);
+ }
+}
+
+
+/*
+AR-940522
+CH GM_bepa3 3D-Linjeparametre
+CD ==========================================================================
+CD Formål:
+CD Beregner 3D parametrene for linjen gjennom 1 og 2.
+CD Ligningen for linjen er: (AX+BY+C=0).
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double a1 i Koordinat i 1
+CD double n1 i
+CD double h1 i
+CD double a2 i Koordinat i 2
+CD double n2 i
+CD double h2 i
+CD double *pf u Parametre for linjen
+CD double *pg u
+CD double *ph u
+CD short ist r 1=beregnet, 0=ikke beregnet (1 og 2 er samme punkt)
+CD
+CD Bruk:
+CD ist = GM_bepa3(a1,n1,h1,a2,n2,h2,&pa,&pb,&pc);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_bepa3(double a1, double n1, double h1,
+ double a2, double n2, double h2,
+ double *pf, double *pg, double *ph)
+{
+ double ndif,adif,hdif,rsq,rinv;
+
+ ndif = n2-n1;
+ adif = a2-a1;
+ hdif = h2-h1;
+ rsq = ndif*ndif + adif*adif + hdif*hdif;
+ if(rsq > ACCY){
+ rinv = 1.0 / sqrt(rsq);
+ *pf = adif * rinv;
+ *pg = ndif * rinv;
+ *ph = hdif * rinv;
+ return (1);
+ } else{
+ *pf = *pg = *ph = 0.0;
+ return (0);
+ }
+}
+
+
+/*
+AR-890717
+CH GM_cint Skjæring mellom to linjer
+CD ==========================================================================
+CD Formål:
+CD Beregner kryssingspunktet mellom to linjer.
+CD Linjene er gitt på implisitt form.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double pa1 i Parametre for linje 1
+CD double pb1 i
+CD double pc1 i
+CD double pa2 i Parametre for linje 2
+CD double pb2 i
+CD double pc2 i
+CD double *as u Koordinat i skjæringspunktet
+CD double *ns u
+CD short kryss r 1=beregnet, 0=ikke beregnet (pralelle linjer)
+CD
+CD Bruk:
+CD kryss = GM_cint(pa1,pb1,pc1,pa2,pb2,pc2,&as,&ns);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_cint(double pa1, double pb1, double pc1, double pa2, double pb2,
+ double pc2, double *as, double *ns)
+{
+ double det,dinv;
+
+ /* Beregner skjæringspunktet mellom linjene på implicit form */
+ det = pa1*pb2 - pa2*pb1;
+ if (fabs(det) > ACCY){
+ dinv = 1.0/det;
+ *as = (pb1*pc2 - pb2*pc1) * dinv;
+ *ns = (pa2*pc1 - pa1*pc2) * dinv;
+ return(1);
+ } else{
+ *ns = *as = 0.0;
+ return(0);
+ }
+}
+
+
+
+/*
+JEK-920514
+CH GM_Vinkel Beregner vinkel mellom to retninger
+CD ==================================================================
+CD Formål:
+CD Beregner positiv vinkel mellom to retninger fi1 og fi2.
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array i/U Merknad
+CD ------------------------------------------------------------------
+CD fi1 double i Retningsvinkel 1
+CD fi2 double i retningsvinkel 2
+CD vinkel double r Positiv vinkel i rad. mellom fi1 og fi2
+CD Alltid i området 0 - 2PI.
+CD
+CD Bruk : vinkel = GM_Vinkel(fi1,fi2);
+ ==================================================================
+*/
+SK_EntPnt_GM double GM_Vinkel(double fi1, double fi2)
+{
+ return GM_RedVinkel(fi2 - fi1);
+}
+
+
+/*
+JEK-920514
+CH GM_RedVinkel Beregner en retn.vinkel i omr. 0-2*PI
+CD ==================================================================
+CD Formål:
+CD Redusere en retningsvinkel til å ligge i området 0 - 2*PI.
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array i/U Merknad
+CD ------------------------------------------------------------------
+CD fi double i Retningsvinkel
+CD vinkel double r Redusert vinkel
+CD
+CD Bruk: red_vinkel = GM_RedVinkel(fi);
+ ==================================================================
+*/
+SK_EntPnt_GM double GM_RedVinkel(double dFi)
+{
+ double topi = 2.0*PI;
+ double vinkel = dFi;
+
+ while ( vinkel < 0.0 || vinkel > topi ) {
+ if ( vinkel < 0.0 ) {
+ vinkel += topi;
+ }
+ if ( vinkel > topi ) {
+ vinkel -= topi;
+ }
+ }
+
+ return vinkel;
+}
+
+
+/*
+AR-901021
+CH GM_retning Retning mellom to punkt
+CD ==========================================================================
+CD Formål:
+CD Beregner retning fra et punkt til et annet (K-L).
+CD (Rutinen er spesiellt beregnet for å beregne retningsvinkler for buer.)
+CD NB! Retningen oppgis i radianer, med retning 0 i øst-aksen, og med positiv
+CD omløpsretning mot urviseren.
+CD
+CD *L
+CD /
+CD /
+CD /
+CD K*
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double ak i Koordinat i K.
+CD double nk i
+CD double al i Koordinat i L.
+CD double nl i
+CD double retning r Retning K-L.
+CD
+CD Bruk:
+CD retning = GM_retning(ak,nk,al,nl);
+ ==========================================================================
+*/
+SK_EntPnt_GM double GM_retning(double ak,double nk,double al,double nl)
+{
+ double retning;
+ double da = al - ak;
+ double dn = nl - nk;
+
+ // Beregner retning
+ if (fabs(da) < ACCY && fabs(dn) < ACCY) {
+ retning = 0.0;
+ } else {
+ retning = atan2(dn,da);
+ }
+
+ // Juster til positiv retningen
+ if (retning < 0.0) {
+ retning += PI * 2.0;
+ }
+
+ return retning;
+}
+
+
+/*
+GL-910709
+CH GM_RetnGon Beregner retningsvinkel mellom 2 punkt
+CD ==========================================================================
+CD Bruk : r = GM_RetnGon(a1,n1,a2,n2)
+CD ==========================================================================
+*/
+SK_EntPnt_GM double GM_RetnGon(double a1 , double n1, double a2, double n2)
+{
+ double r;
+ double da = a2 - a1;
+ double dn = n2 - n1;
+
+ /* Beregner retning */
+ if (fabs(da) < ACCY && fabs(dn) < ACCY) {
+ r = 0.0;
+ } else {
+ r = atan2(da,dn);
+ }
+
+ r = Rad2Gon(r);
+ if (r < 0.0) r += 400.0;
+
+ return r;
+}
+
+
+/*
+GL-910709
+CH GM_RettvPol Beregner polare koord.(retnvinkel og avstand)
+CD ==========================================================================
+CD Bruk : GM_RettvPol(a1,n1,a2,n2,&gon,&avst)
+CD ==========================================================================
+*/
+SK_EntPnt_GM void GM_RettvPol(double a1 , double n1, double a2, double n2,
+ double *gon, double *avst)
+{
+ *gon =GM_RetnGon(a1,n1,a2,n2);
+ *avst=sqrt((a2-a1)*(a2-a1)+(n2-n1)*(n2-n1));
+}
+
+
+/*
+CH GM_Areal Beregner areal av polygon
+CD ==========================================================================
+CD Formål:
+CD Beregner areal av polygon.
+CD Forutsetter at polygonet er lukket. (Første og siste punkt er like.)
+CD
+CD PARAMETERLISTE:
+CD Navn Type I/U Merknad
+CD --------------------------------------------------------------------------
+CD pA *double i Øst-koordinater
+CD pN *double i Nord-koordinater
+CD sNko short i Antall koordinater
+CD dAreal double r Areal m^2
+CD
+CD Bruk: areal = GM_Areal ( pA, pN, sAnt );
+ ==========================================================================
+*/
+SK_EntPnt_GM double GM_Areal(double *pA, double *pN, short sAnt)
+{
+ double dAreal = 0.0;
+ double a_forrige,n_forrige;
+ short s = 1;
+
+ if (sAnt > 2) {
+ a_forrige = *pA;
+ n_forrige = *pN;
+
+ for ( ; s<sAnt; ++s) {
+ dAreal += (a_forrige - pA[s]) * (n_forrige + pN[s]);
+ a_forrige = pA[s];
+ n_forrige = pN[s];
+ }
+ }
+
+ return fabs(dAreal / 2.0);
+}
+
+
+/*
+GL-910704
+CH GM_PolRettv Beregner nye rettvinkla koordinater fra gon+avst
+CD ==========================================================================
+CD Bruk : GM_PolRettv(&a,&n,gon,avst)
+CD ==========================================================================
+*/
+SK_EntPnt_GM void GM_PolRettv(double *a , double *n, double gon, double avst)
+{
+ *n = *n + avst * (double)cos(Gon2Rad(gon));
+ *a = *a + avst * (double)sin(Gon2Rad(gon));
+}
+
+
+/*
+AR-890919
+CH GM_buebox Omskreven boks for bue
+CD ==========================================================================
+CD Formål:
+CD Beregner omskrevet rektangel for bue.
+CD Buen går mot urviseren fra P1 til P2 rundt sirkelen.
+CD NB! Retningen oppgis i radianer, med retning 0 i øst-aksen, og med positiv
+CD omløpsretning mot urviseren.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double as i Koordinat i sirkelsentrum.
+CD double ns i
+CD double radius i Aavstand fra senterpunkt til P1 og P2.
+CD (Fortegn blir ignorert.)
+CD double fi i Retning sentrum - P1
+CD double dfi i Delta retning p1 og p2
+CD double nva u Nedre venstre hjørne av omskrevet rektangel.
+CD double nvn u
+CD double oha u Øvre høyre hjørne av omskrevet rektangel.
+CD double ohn u
+CD
+CD Bruk:
+CD GM_buebox(as,ns,radius,fi,dfi,&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+*/
+SK_EntPnt_GM void GM_buebox(double as,double ns,double radius,double fi,double dfi,
+ double *nva,double *nvn,double *oha,double *ohn)
+{
+ double r = fabs(radius);
+ double a1,n1,a2,n2;
+
+
+ // ----- Hel sirkel
+ if (fabs(dfi) > ((2.0*PI)-ACCY))
+ {
+ *nva = as - r;
+ *nvn = ns - r;
+ *oha = as + r;
+ *ohn = ns + r;
+
+ return; // ==>
+ }
+
+ // ----- Andre buer
+
+ // Starter med omskrevet boks for endepunktene
+ a1 = as + r*cos(fi);
+ n1 = ns + r*sin(fi);
+ a2 = as + r*cos(fi+dfi);
+ n2 = ns + r*sin(fi+dfi);
+
+ *nva = min(a1,a2);
+ *nvn = min(n1,n2);
+ *oha = max(a1,a2);
+ *ohn = max(n1,n2);
+
+ // For hver akse (fra sentrumspunktet) som krysses utvides omskrevet boks
+ radius = fabs(radius);
+ if (GM_TestPktBue(as, ns, fi, dfi, as+radius, ns)) *oha = as+radius;
+ if (GM_TestPktBue(as, ns, fi, dfi, as-radius, ns)) *nva = as-radius;
+
+ if (GM_TestPktBue(as, ns, fi, dfi, as, ns+radius)) *ohn = ns+radius;
+ if (GM_TestPktBue(as, ns, fi, dfi, as, ns-radius)) *nvn = ns-radius;
+}
+
+
+
+/* Gammel versjon
+
+ double r2;
+ double r = fabs(radius);
+ double a1,n1,a2,n2;
+
+
+ // ----- Hel sirkel
+ if (fabs(dfi) > ((2.0*PI)-ACCY))
+ {
+ *nva = as - r;
+ *nvn = ns - r;
+ *oha = as + r;
+ *ohn = ns + r;
+
+ return; // ==>
+ }
+
+ // ----- Andre buer
+
+ a1 = as + r*cos(fi);
+ n1 = ns + r*sin(fi);
+ a2 = as + r*cos(fi+dfi);
+ n2 = ns + r*sin(fi+dfi);
+
+ // Beregn sorterte retninger
+ if (dfi < 0.0){
+ r2 = fi;
+ fi += dfi;
+ } else{
+ r2 = fi + dfi;
+ }
+
+ // Sørg for at alle vinkler ligger i området 0 - 2*PI
+ while (fi < 0.0){ // fi
+ fi += (2.0*PI);
+ }
+ while (fi > (2.0*PI)){
+ fi -= (2.0*PI);
+ }
+ while (r2 < 0.0){ // r2
+ r2 += (2.0*PI);
+ }
+ while (r2 > (2.0*PI)){
+ r2 -= (2.0*PI);
+ }
+
+ // Beregner omskreven firkant for buen
+ // Start i 1. kvadrant
+ if (fi >= 0.0 && fi < PI/2.0){
+ // Slutt i 1. kvadrant
+ if (r2 >= 0.0 && r2 < PI/2.0){
+ *nva = min(a1,a2);
+ *nvn = min(n1,n2);
+ *oha = max(a1,a2);
+ *ohn = max(n1,n2);
+ // Slutt i 2. kvadrant
+ } else if (r2 >= PI/2.0L && r2 < PI){
+ *nva = min(a1,a2);
+ *nvn = min(n1,n2);
+ *oha = max(a1,a2);
+ *ohn = ns + r;
+ // Slutt i 3. kvadrant
+ } else if (r2 >=PI && r2 < PI*3.0L/2.0L){
+ *nva = as - r;
+ *nvn = min(n1,n2);
+ *oha = max(a1,a2);
+ *ohn = ns + r;
+ // Slutt i 4. kvadrant
+ } else{
+ *nva = as - r;
+ *nvn = ns - r;
+ *oha = max(a1,a2);
+ *ohn = ns + r;
+ }
+
+ // Start i 2. kvadrant
+ } else if (fi >= PI/2.0L && fi < PI){
+ // Slutt i 1. kvadrant
+ if (r2 >= 0.0 && r2 < PI/2.0){
+ *nva = as - r;
+ *nvn = ns - r;
+ *oha = as + r;
+ *ohn = max(n1,n2);
+ // Slutt i 2. kvadrant
+ } else if (r2 >= PI/2.0L && r2 < PI){
+ *nva = min(a1,a2);
+ *nvn = min(n1,n2);
+ *oha = max(a1,a2);
+ *ohn = max(n1,n2);
+ // Slutt i 3. kvadrant
+ } else if (r2 >=PI && r2 < PI*3.0L/2.0L){
+ *nva = as - r;
+ *nvn = min(n1,n2);
+ *oha = max(a1,a2);
+ *ohn = max(n1,n2);
+ // Slutt i 4. kvadrant
+ } else{
+ *nva = as - r;
+ *nvn = ns - r;
+ *oha = max(a1,a2);
+ *ohn = max(n1,n2);
+ }
+
+ // Start i 3. kvadrant
+ } else if (fi >=PI && fi < PI*3.0L/2.0L){
+ // Slutt i 1. kvadrant
+ if (r2 >= 0.0 && r2 < PI/2.0){
+ *nva = min(a1,a2);
+ *nvn = ns - r;
+ *oha = as + r;
+ *ohn = max(n1,n2);
+ // Slutt i 2. kvadrant
+ } else if (r2 >= PI/2.0L && r2 < PI){
+ *nva = min(a1,a2);
+ *nvn = ns - r;
+ *oha = as + r;
+ *ohn = ns + r;
+ // Slutt i 3. kvadrant
+ } else if (r2 >=PI && r2 < PI*3.0L/2.0L){
+ *nva = min(a1,a2);
+ *nvn = min(n1,n2);
+ *oha = max(a1,a2);
+ *ohn = max(n1,n2);
+ } else{
+ // Slutt i 4. kvadrant
+ *nva = min(a1,a2);
+ *nvn = ns - r;
+ *oha = max(a1,a2);
+ *ohn = max(n1,n2);
+ }
+
+ // Start i 4. kvadrant
+ } else {
+ // Slutt i 1. kvadrant
+ if (r2 >= 0.0 && r2 < PI/2.0) {
+ *nva = min(a1,a2);
+ *nvn = min(n1,n2);
+ *oha = as + r;
+ *ohn = max(n1,n2);
+ // Slutt i 2. kvadrant
+ } else if (r2 >= PI/2.0L && r2 < PI) {
+ *nva = min(a1,a2);
+ *nvn = min(n1,n2);
+ *oha = as + r;
+ *ohn = ns + r;
+
+ // Slutt i 3. kvadrant
+ } else if (r2 >=PI && r2 < PI*3.0L/2.0L) {
+ *nva = as - r;
+ *nvn = min(n1,n2);
+ *oha = as + r;
+ *ohn = ns + r;
+ // Slutt i 4. kvadrant
+ } else {
+ *nva = min(a1,a2);
+ *nvn = min(n1,n2);
+ *oha = max(a1,a2);
+ *ohn = max(n1,n2);
+ }
+ }
+}
+*/
+
+
+// ++----------------------------------------------------------------------
+// FILE: Arc.cpp - Implementation for class QdiArc
+// ++----------------------------------------------------------------------
+
+// For å finne minste omsluttende rektangel til en bue må en først finne sentrum
+//til buen. Koden for å gjøre dette fantes allerede i geometryutility.dll, men for å
+//unngå gjensidige avhengigheter mellom modellen og geometryutility.dll, kopierte jeg
+//og skrev om koden her.
+//
+//Etter at sentrum er funnet, finner jeg hvor mange akser som buen skjærer. For hver akse
+//buen skjærer, hentes en ekstremalverdi fra minste omsluttende rektangel til en
+//SIRKEL som har sentrum samme sted som buen.
+//
+//Buen kan skjære 0, en, to, tre eller fire akser.
+
+//
+// |
+// |
+// --|-
+// / | \ -
+// 1 | \ -
+// ----------2---|-------
+// | |
+// | 3/
+// |
+//
+//
+//På eksempelfiguren ovenfor skjæres 2 akser (y-aksen en gang og x-aksen en gang.
+//Her vil minste omsluttende rektangel hente LLX fra 1, LLY fra 3, URX fra sirkel
+//og URY fra sirkel. (Med sirkel menes sirkelens senter +/- radius eller minste omsluttende
+//rektangel til en sirkel med samme senter og radius)
+//
+
+/*
+void QdiArc::computeBbox( QdiRectangle *pRectangle )
+{
+//Regner først ut senter av sirkelen
+ bool bMajor = isMajor();
+
+ QdiPosition *pStart= dynamic_cast <QdiPosition*> (getStartPosition()->clone());
+ QdiPosition *pEnd= dynamic_cast <QdiPosition*> (getEndPosition()->clone());
+ double dRadius= getRadius();
+ double dMin= 0.0009;
+
+ QdiPosition2D center1, center2, trueCenter;
+ double dH = 0;
+ double dRadi1= dRadius;
+ double dRadi2= dRadius;
+
+ double dX= pEnd->getX()- pStart->getX();
+ double dY= pEnd->getY()- pStart->getY();
+ double dDist= sqrt((dX*dX) + (dY*dY));
+
+ double dInterX1= (((dRadi1*dRadi1) - (dRadi2*dRadi2))/(dDist*2)) + (dDist/2);
+ double dInterX1Abs= fabs(dInterX1);
+
+ if ( fabs(dInterX1Abs-fabs(dRadi1)) < dMin )
+ dH= 0.0; // Only one intersection point.
+ else
+ dH= sqrt( fabs((dRadi1*dRadi1)- (dInterX1*dInterX1)) );
+
+ double dAspectX= dX/dDist;
+ double dAspectY= dY/dDist;
+
+ center1.setX(pStart->getX() + (dAspectX*dInterX1) + (dAspectY*dH));
+ center1.setY(pStart->getY() + (dAspectY*dInterX1) - (dAspectX*dH));
+ center2.setX(pStart->getX() + (dAspectX*dInterX1) - (dAspectY*dH));
+ center2.setY(pStart->getY() + (dAspectY*dInterX1) + (dAspectX*dH));
+
+
+ if (!bMajor)
+ {
+ if ( dRadi1>= 0 )
+ {
+ trueCenter.setX(center1.getX());
+ trueCenter.setY(center1.getY());
+ }
+ else if ( dRadi1< 0)
+ {
+ trueCenter.setX(center2.getX());
+ trueCenter.setY(center2.getY());
+ }
+ }
+ // Use the "big/major arc" center
+ else
+ {
+ if ( dRadi1< 0 )
+ {
+ trueCenter.setX(center1.getX());
+ trueCenter.setY(center1.getY());
+ }
+ else if ( dRadi1>= 0)
+ {
+ trueCenter.setX(center2.getX());
+ trueCenter.setY(center2.getY());
+ }
+ }
+// Regner ut hvor mange akser som krysses
+
+// 1 startPos
+// 2 trueCenter
+// 3 endPos
+
+ int nStartQuadrant = 0;
+ int nEndQuadrant = 0;
+
+ double dMostLeft;
+ double dMostRight;
+ double dHighest;
+ double dLowest;
+
+// Finner ekstremalverdiene.
+
+ dMostLeft = pStart->getX();
+ if (dMostLeft > pEnd->getX())
+ {
+ dMostLeft = pEnd->getX();
+ }
+
+ dMostRight = pStart->getX();
+ if (dMostRight < pEnd->getX())
+ {
+ dMostRight = pEnd->getX();
+ }
+
+ dHighest = pStart->getY();
+ if (dHighest < pEnd->getY())
+ {
+ dHighest = pEnd->getY();
+ }
+
+ dLowest = pStart->getY();
+ if (dLowest > pEnd->getY())
+ {
+ dLowest = pEnd->getY();
+ }
+
+// Om radius er negativ, byttes start og sluttpunkt
+
+ if (dRadius < 0)
+ {
+ QdiPosition2D midlPos;
+ midlPos.setX(pStart->getX());
+ midlPos.setY(pStart->getY());
+
+ pStart->setX(pEnd->getX());
+ pStart->setY(pEnd->getY());
+
+ pEnd->setX(midlPos.getX());
+ pEnd->setY(midlPos.getY());
+ }
+
+
+
+// Finner hvor mange akser som krysses og hvilke kvadranter punktene ligger i
+
+ if (pStart->getX() > trueCenter.getX())
+ {
+ if (pStart->getY() > trueCenter.getY())
+ {
+ // Kvadrant 4
+ nStartQuadrant = 4;
+ }
+ else
+ {
+ // Kvadrant 1
+ nStartQuadrant = 1;
+ }
+ }
+ else
+ {
+ if (pStart->getY() > trueCenter.getY())
+ {
+ // Kvadrant 3
+ nStartQuadrant = 3;
+ }
+ else
+ {
+ // Kvadrant 2
+ nStartQuadrant = 2;
+ }
+ }
+
+
+ if (pEnd->getX() > trueCenter.getX())
+ {
+ if (pEnd->getY() > trueCenter.getY())
+ {
+ // Kvadrant 4
+ nEndQuadrant = 4;
+ }
+ else
+ {
+ // Kvadrant 1
+ nEndQuadrant = 1;
+ }
+ }
+ else
+ {
+ if (pEnd->getY() > trueCenter.getY())
+ {
+ // Kvadrant 3
+ nEndQuadrant = 3;
+ }
+ else
+ {
+ // Kvadrant 2
+ nEndQuadrant = 2;
+ }
+ }
+
+ int nQuadrants = 0;
+
+
+ if (nStartQuadrant > nEndQuadrant)
+ {
+ nQuadrants = 4 + (nEndQuadrant - nStartQuadrant);
+ }
+ else
+ {
+ nQuadrants = nEndQuadrant - nStartQuadrant;
+ }
+
+
+ if (bMajor)
+ {
+ // Hvis bMajor er sant, så går buen over 4 kvadranter om start og endepunkt er
+ // i samme kvadrant.
+ if (nQuadrants == 0)
+ {
+ nQuadrants = 4;
+ }
+ }
+
+ // Lager først en bounding box av en sirkel.
+
+ QdiPosition2D* llPos = new QdiPosition2D;
+ QdiPosition2D* urPos = new QdiPosition2D;
+
+ llPos->setX(trueCenter.getX() - abs(dRadius));
+ llPos->setY(trueCenter.getY() - abs(dRadius));
+
+ urPos->setX(trueCenter.getX() + abs(dRadius));
+ urPos->setY(trueCenter.getY() + abs(dRadius));
+
+ if (nQuadrants == 4)
+ {
+
+ }
+ else if (nQuadrants == 3)
+ {
+ if (nStartQuadrant == 1)
+ {
+ urPos->setX(dMostRight);
+ }
+ else if (nStartQuadrant == 2)
+ {
+ llPos->setY(dLowest);
+ }
+ else if (nStartQuadrant == 3)
+ {
+ llPos->setX(dMostLeft);
+ }
+ else if (nStartQuadrant == 4)
+ {
+ urPos->setY(dHighest);
+ }
+ }
+ else if (nQuadrants == 2)
+ {
+ if (nStartQuadrant == 1)
+ {
+ urPos->setX(dMostRight);
+ urPos->setY(dHighest);
+ }
+ else if (nStartQuadrant == 2)
+ {
+ llPos->setY(dLowest);
+ urPos->setX(dMostRight);
+ }
+ else if (nStartQuadrant == 3)
+ {
+ llPos->setX(dMostLeft);
+ llPos->setY(dLowest);
+ }
+ else if (nStartQuadrant == 4)
+ {
+ llPos->setX(dMostLeft);
+ urPos->setY(dHighest);
+ }
+ }
+ else if (nQuadrants == 1)
+ {
+ if (nStartQuadrant == 1)
+ {
+ urPos->setX(dMostRight);
+ urPos->setY(dHighest);
+ llPos->setX(dMostLeft);
+ }
+ else if (nStartQuadrant == 2)
+ {
+ llPos->setY(dLowest);
+ urPos->setX(dMostRight);
+ urPos->setY(dHighest);
+ }
+ else if (nStartQuadrant == 3)
+ {
+ llPos->setX(dMostLeft);
+ llPos->setY(dLowest);
+ urPos->setX(dMostRight);
+ }
+ else if (nStartQuadrant == 4)
+ {
+ llPos->setX(dMostLeft);
+ urPos->setY(dHighest);
+ llPos->setY(dLowest);
+ }
+ }
+ else if (nQuadrants == 0)
+ {
+ urPos->setX(dMostRight);
+ urPos->setY(dHighest);
+ llPos->setX(dMostLeft);
+ llPos->setY(dLowest);
+ }
+
+ //pRectangle->setLowerLeft(llPos);
+ pRectangle->expand( llPos );
+ //pRectangle->setUpperRight(urPos);
+ pRectangle->expand( urPos );
+
+ delete pStart;
+ delete pEnd;
+
+ return;
+}
+
+// Get implicitly defined startPosition
+//const QdiPosition* QdiArc::getStartPosition() const { return NULL; } // Dummy
+
+// Get implicitly defined endPosition
+//const QdiPosition* QdiArc::getEndPosition() const { return NULL; } // Dummy
+
+// -------------------------- End of file ---------------------------------
+
+*/
+
+
+
+
+
+
+
+/*
+AR-890903
+CH GM_NormVindu Normaliser vindusangivelse
+CD ==========================================================================
+CD Formål:
+CD Bytter om koordinatene slik at vindusangivelsen blir riktig.
+CD Sjekker også at vinduet har lengde > 0.0001 i både øst og nord retning.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double *nva iu Avgrensing av vinduet
+CD double *nvn iu
+CD double *oha iu
+CD double *ohn iu
+CD short ist r status: 1 = Vinduet er OK
+CD 0 = Vinduet er feil definert.
+CD (Lengde 0.0 i en retning.)
+CD
+CD Bruk:
+CD ist = GM_NormVindu(&nva,&nvn,&oha,&ohn);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_NormVindu(double *nva,double *nvn,double *oha,double *ohn)
+{
+ double temp;
+
+ if (*nva > *oha){ /* Eventuell ombytting av hjørnekoordinater */
+ temp = *nva;
+ *nva = *oha;
+ *oha = temp;
+ }
+ if (*nvn > *ohn){
+ temp = *nvn;
+ *nvn = *ohn;
+ *ohn = temp;
+ }
+ /* Sjekk at lengden av vinduet er > 0.0 i begge retninger */
+ return (short)((*oha-*nva) > ACCY && (*ohn - *nvn) > ACCY);
+}
+
+
+/*
+AR-890903
+CH GM_TestPktBue Sjekk om punkt ligger i sektor gitt av bue
+CD ==========================================================================
+CD Formål:
+CD Sjekk om punkt ligger i sektor gitt av bue.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double as i Koordinat i sirkelsenter
+CD double ns i
+CD double fi i "Retning" sentrum - buens startpunkt.
+CD double dfi i Vinkel mellom fi og retning buens sluttpunkt
+CD double a i Koordinat som skal testes
+CD double n i
+CD short ok r 1=ligger i buens sektor, 0=ikke i buens sektor
+CD
+CD Bruk:
+CD ok = GM_TestPktBue(as,ns,fi,dfi,a,n);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_TestPktBue(double as,double ns,double fi,double dfi,
+ double a,double n)
+{
+ double fi1,d;
+ short ok = 1;
+
+ // Sjekk om punktene ligger på buen
+ fi1 = GM_retning(as,ns,a,n);
+ d = fi1 - fi;
+ if (dfi < 0.0){
+ if (d > 0.0) d -= (PI * 2.0);
+ //if (d < dfi) ok = 0; /* Utenfor buen */
+ if ((d+GM_ACCY) < dfi) ok = 0; /* Utenfor buen */
+
+ } else{
+ if (d < 0.0) d += (PI * 2.0);
+ //if (d > dfi) ok = 0; /* Utenfor buen */
+ if ((d-GM_ACCY) > dfi) ok = 0; /* Utenfor buen */
+ }
+
+ return ok;
+}
+
+
+/*
+AR-890903
+CH GM_PktBue Beregner vinkel til punkt i sektor gitt av bue
+CD ==========================================================================
+CD Formål:
+CD Beregner vinkel til punkt som ligger i sektor gitt av bue.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double as i Koordinat i sirkelsenter
+CD double ns i
+CD double fi i "Retning" sentrum - buens startpunkt.
+CD double dfi i Vinkel mellom fi og retning buens sluttpunkt
+CD double a i Punkt som skal testes
+CD double n i
+CD double *dfiPkt u Vinkel mellom fi og retning til testpunktet
+CD short ok r 1=ligger i buens sektor, 0=ikke i buens sektor
+CD
+CD Bruk:
+CD ok = GM_PktBue(as,ns,fi,dfi,a,n,&dfiPkt);
+ ==========================================================================
+*/
+SK_EntPnt_GM short GM_PktBue(double as,double ns,double fi,double dfi,
+ double a,double n,double *dfiPkt)
+{
+ double fi1;
+ short ok = 1;
+
+//UT_FPRINTF(stderr,"\r\n I GM_PktBue: ns=%.12g, as=%.12g, fi=%.12g, dfi=%.12g",ns,as,fi,dfi);
+//UT_FPRINTF(stderr,"\n I GM_PktBue: n=%.12g, a=%.12g",n,a);
+
+
+ // Sjekk om punktene ligger på buen
+ fi1 = GM_retning(as,ns,a,n);
+
+//UT_FPRINTF(stderr,"\n I GM_PktBue: fi1=%.12g",fi1);
+
+ *dfiPkt = fi1 - fi;
+
+ // Spesialtilfelle for å handtere problemer når vinkelen blir tilnærmet 0.0
+ if (fabs(*dfiPkt) < GM_ACCY)
+ {
+ *dfiPkt = 0.0;
+ return 1; // ==>
+ }
+
+ if (dfi < 0.0){
+ if (*dfiPkt > 0.0) *dfiPkt -= (PI * 2.0);
+ if ((*dfiPkt+GM_ACCY) < dfi) ok = 0; /* Utenfor buen */
+ }
+ else
+ {
+ if (*dfiPkt < 0.0) *dfiPkt += (PI * 2.0);
+ if ((*dfiPkt-GM_ACCY) > dfi) ok = 0; /* Utenfor buen */
+ }
+
+ return ok;
+}
+
+
+/*
+JEK-920520
+CH GM_Avstand Beregner avstand mellom to punkt
+CD ==================================================================
+CD Formål:
+CD Beregner avstand mellom to punkt.
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array i/U Merknad
+CD ------------------------------------------------------------------
+CD a1 double i Øst-koordinat for startpunkt
+CD n1 double i Nord-koordinat for startpunkt
+CD a2 double i Øst-koordinat for endepunkt
+CD n2 double i Nord-koordinat for endepunkt
+CD avstand double r Avstand mellom punktene
+CD
+CD Bruk: avstand = GM_Avstand ( a1, n1, a2, n2 );
+ ==================================================================
+*/
+SK_EntPnt_GM double GM_Avstand(double a1, double n1, double a2, double n2 )
+{
+ double a,n;
+
+ a = a2 - a1;
+ n = n2 - n1;
+ return sqrt( a*a + n*n );
+}
+
+
+/*
+TOU/AR-080521
+CH GM_Avstand Beregner kvadrert avstand mellom to punkt
+CD ==================================================================
+CD Formål:
+CD Beregner kvadrert avstand mellom to punkt.
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array i/U Merknad
+CD ------------------------------------------------------------------
+CD a1 double i Øst-koordinat for startpunkt
+CD n1 double i Nord-koordinat for startpunkt
+CD a2 double i Øst-koordinat for endepunkt
+CD n2 double i Nord-koordinat for endepunkt
+CD avstand2 double r Kvadrert avstand mellom punktene
+CD
+CD Bruk: avstand2 = GM_Avstand2 ( a1, n1, a2, n2 );
+==================================================================
+*/
+SK_EntPnt_GM double GM_Avstand2(double a1, double n1, double a2, double n2 )
+{
+ double a,n;
+
+ a = a2 - a1;
+ n = n2 - n1;
+ return ( a*a + n*n );
+}
+
+
+/*
+JEK-920520
+CH GM_BueTangent Retnv. for tangent til punkt på bue
+CD ==================================================================
+CD Formål:
+CD Beregner retningsvinkel til tangent til punkt på en sirkelbue.
+CD
+CD PARAMETERLISTE:
+CD Navn Type I/U Merknad
+CD -----------------------------------------------------------------
+CD as double i Øst-koordinat for sirkelsentrum
+CD an double i Nord-koordinat for sirkelsentrum
+CD fi double i Retningsvinkel til start bue
+CD dfi double i Retn.endring i radianer.
+CD + = mot klokka, - =med klokka
+CD radius double i radius med fortegn
+CD + = med klokka, - = mot klokka
+CD a double i Øst-koordinat for tangeringspunkt
+CD n double i Nord-koordinat for tangeringspunkt
+CD *buetan double u Retning i radianer(0-2PI) for buetangent
+CD ist short r status: 1 = Beregning ok
+CD 0 = Punkt ikke på buesegment
+CD NB! Tangent beregnes uansett!
+CD
+CD Bruk: ist = GM_BueTangent(as,ns,fi,dfi,radius,a,s,&buetan);
+ ==================================================================
+*/
+SK_EntPnt_GM short GM_BueTangent ( double as, double ns, double fi, double dfi,
+ double radius, double a, double n, double *buetan)
+{
+ short ist;
+
+ ist = 0;
+ if ( GM_TestPktBue ( as, ns, fi, dfi, a, n ) ) {
+ if ( (fabs(radius) - GM_Avstand (as,ns,a,n)) < 0.01 ) ist=1;
+ }
+
+ if ( dfi > 0.0 ){ /* Mot klokka */
+ *buetan = GM_RedVinkel ( GM_retning(as,ns,a,n) + PI/2 );
+ } else { /* Med klokka */
+ *buetan = GM_RedVinkel ( GM_retning(as,ns,a,n) - PI/2 );
+ }
+ return ist;
+}
+
+
+/*
+LS-900607
+AR-921001
+CH GM_BueTilKorder Tilnærm ein sirkelboge med korder
+CD =========================================================================
+CD Formål:
+CD Tilnærm ein sirkelboge med korder.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD double as i Øst-koordinat for sirkelsentrum
+CD double an i Nord-koordinat for sirkelsentrum
+CD double r i Radius i sirkelen
+CD double fi i Retningsvinkel til start bue
+CD double dfi i Retn.endring i radianer.
+CD + = mot klokka, - =med klokka
+CD double delta i Vinkeltoleranse (max vinkel mellom korder i radianer)
+CD short mpu i Max tal på punkt i a_arr og n_arr
+CD double *a_arr u Knekkpunkt før, mellom og etter kordene
+CD double *n_arr u
+CD short npu r Tal på punkt i a_arr og n_arr
+CD
+CD Bruk:
+CD npu = GM_BueTilKorder(as,ns,r,fi,dfi,delta,mpu,a_arr,n_arr);
+CD =========================================================================
+*/
+SK_EntPnt_GM short GM_BueTilKorder (double as,double ns,double r,double fi,double dfi,
+ double delta,short mpu,double *a_arr,double *n_arr)
+{
+ double intdel;
+ short nk,npu;
+
+ r = fabs(r);
+ /* Bestem presisjon (tal på korder) */
+ if (dfi < 0.0) delta = -delta;
+ modf (dfi/delta, &intdel);
+ nk = (short)(UT_RoundDS(intdel) + 1);
+ if (nk >= mpu) { /* For mange korder - reduser kravet */
+ nk = (short)(mpu - 1);
+ delta = dfi/(double)nk;
+ }
+ npu = (short)(nk + 1);
+
+ /* Startpunktet */
+ *a_arr = as + r*cos(fi);
+ *n_arr = ns + r*sin(fi);
+
+ /* Sluttpunkt */
+ *(a_arr+nk) = as + r*cos(fi+dfi);
+ *(n_arr+nk) = ns + r*sin(fi+dfi);
+
+ /* Korde-løkke */
+ for (nk--,a_arr++,n_arr++,fi+=delta; nk; nk--,a_arr++,n_arr++,fi+=delta) {
+ *a_arr = as + r*cos(fi);
+ *n_arr = ns + r*sin(fi);
+ }
+
+ return npu;
+}
+
+
+/*
+LS-900607
+AR-921001
+CH GM_PktTilOktagon Beregner en åttekant rundt gitt punkt.
+CD =========================================================================
+CD Formål:
+CD Beregner en åttekant med gitt areal rundt gitt punkt.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD double dAs i Øst-koordinat for sentrum
+CD double dNns i Nord-koordinat for sentrum
+CD double dAreal i Ønsket areal
+CD double *a_arr u Hjørnepunkt (Må ha plass til 8 punkt.)
+CD double *n_arr u
+CD
+CD Bruk:
+CD GM_PktTilOktagon(dAs,dNs,dAreal,a_arr,n_arr);
+CD =========================================================================
+*/
+SK_EntPnt_GM void GM_PktTilOktagon (double dAs,double dNs,double dAreal,double *a_arr,double *n_arr)
+{
+ double dS,dS2,dX;
+ double d2Rot = sqrt(2.0);
+
+ // 1 2
+ // +------------+ - - - - -
+ // / \ |
+ // / \ dX
+ // / \ |
+ // / \ _
+ // 8+ +3
+ // | |
+ // | |
+ // | + | dS
+ // | s |
+ // | |
+ // 7+ +4 _
+ // \ /
+ // \ /
+ // \ /
+ // \ /
+ // +------------+
+ // 6 5
+
+ // Beregner sidelengde mm.
+ dS = sqrt( dAreal / ( (2.0 * d2Rot) + 2.0));
+ dS2 = dS / 2.0;
+ dX = dS2 * d2Rot;
+
+ // Beregner koordineter
+ // 1
+ *a_arr++ = dAs - dS2;
+ *n_arr++ = dNs + dS2 + dX;
+ // 2
+ *a_arr++ = dAs + dS2;
+ *n_arr++ = dNs + dS2 + dX;
+ // 3
+ *a_arr++ = dAs + dS2 + dX;
+ *n_arr++ = dNs + dS2;
+ // 4
+ *a_arr++ = dAs + dS2 + dX;
+ *n_arr++ = dNs - dS2;
+ // 5
+ *a_arr++ = dAs + dS2;
+ *n_arr++ = dNs - dS2 - dX;
+ // 6
+ *a_arr++ = dAs - dS2;
+ *n_arr++ = dNs - dS2 - dX;
+ // 7
+ *a_arr++ = dAs - dS2 - dX;
+ *n_arr++ = dNs - dS2;
+ // 8
+ *a_arr = dAs - dS2 - dX;
+ *n_arr = dNs + dS2;
+}
+
+
+/*
+AR:2008-08-12
+CH GM_TynnDared
+CD ==========================================================================
+CD Formål:
+CD Tynning med pilhøyde og maks avstand.
+CD Samme som SiTynnDared, men noe forenklet:
+CD - Koordinatene kommer inn i NØ buffer.
+CD - Handterer ikke høyde
+CD - Tar ikke hensyn til knutepunkt
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD double dMaxAvst i Max distanse mellom punkta
+CD double dMaxPil i Max pilhøyde
+CD long *nko iu Antall koordinater
+CD double *pA iu Øst-koordinater
+CD double *pN iu Nord-koordinater
+CD bool bBeregnet r Status.
+CD Bruk:
+CD bBeregnet = GM_TynnDared(dMaxAvst,dPilhoyde,&nko,pA,pN);
+==========================================================================
+*/
+SK_EntPnt_GM void GM_TynnDared(double dMaxAvst,double dMaxPil,long *nko, double *pA,double *pN)
+{
+ long lTeller,lStorPnr=0;
+ bool bNyttFastpunktFunnet;
+ double a,n,a1,n1,a2,n2,ap,np,da,dn,dAvst2;
+ double pa,pb,pc;
+ double dPil,dStorPil;
+ long lLagre = 2; // Peker for lagring av punkt (første ledig)
+ long lForste = 1; // Starten av aktuelt segment
+ long lSiste; // Siste punkt i segmentet
+ double dMaxAvst2 = dMaxAvst * dMaxAvst;
+ double dPil2 = dMaxPil * dMaxPil;
+ bool bBeregnet = true;
+
+
+ // Ta kopi av opprinnelige koordinater
+ double *pdAust = (double*) malloc((sizeof(double))*(*nko));
+ UT_memcpy(pdAust, (sizeof(double))*(*nko), pA, (sizeof(double))*(*nko));
+
+ double *pdNord = (double*) malloc((sizeof(double))*(*nko));
+ UT_memcpy(pdNord, (sizeof(double))*(*nko), pN, (sizeof(double))*(*nko));
+
+ // UT_FPRINTF(stderr,"\n\nTynner: %s",LC_GetGi(1));
+
+ while (lForste < *nko)
+ {
+ // Sjekk ett segment. Segmentet avsluttes når:
+ // - pilhøyden overskrider gitt verdi
+ // (Det punktet som hadde størst pilhøyde blir neste fastpunkt)
+ // - lengden overskrider gitt verdi
+
+ //LC_GetTK(lForste,&a1,&n1);
+ a1 = *(pA+lForste-1);
+ n1 = *(pN+lForste-1);
+ // UT_FPRINTF(stderr,"\n%hd a: %.1f n: %.1f",lForste,a1,n1);
+
+ bNyttFastpunktFunnet = false;
+ for (lSiste=lForste+1; !bNyttFastpunktFunnet && lSiste<=*nko; lSiste++)
+ {
+ // UT_FPRINTF(stderr,"\n\nSegment %hd - %hd",lForste,siste);
+
+ //LC_GetTK(lSiste,&a2,&n2);
+ a2 = *(pA+lSiste-1);
+ n2 = *(pN+lSiste-1);
+ // UT_FPRINTF(stderr,"\n%hd a: %.1f n: %.1f",lSiste,a2,n2);
+
+ // Beregn største pilhøyde
+ dStorPil = 0.0;
+ for (lTeller=lForste+1; lTeller<lSiste; lTeller++)
+ {
+ //LC_GetTK(lTeller,&ap,&np);
+ ap = *(pA+lTeller-1);
+ np = *(pN+lTeller-1);
+ dPil = 0.0;
+ // UT_FPRINTF(stderr,"\n%hd a: %.1f n: %.1f h: %.1f",s,ap,np,hp);
+
+ if (GM_bepa(a1,n1,a2,n2,&pa,&pb,&pc))
+ {
+ // UT_FPRINTF(stderr,"\n%hd pa: %.5f pb: %.5f pc: %.5f",s,pa,pb,pc);
+ dPil = fabs(pa*ap + pb*np + pc);
+ // UT_FPRINTF(stderr,"\n%hd 2D ph: %.4f",s,dPil);
+ }
+
+ // Husker største pilhøyde
+ if (dPil > dStorPil) {
+ lStorPnr = lTeller;
+ dStorPil = dPil;
+ }
+ }
+
+ // Max pilhøyde er overskredet, nytt fastpunkt er funnet
+
+ // UT_FPRINTF(stderr,"\nMax pilhøyde %hd : %.4f",sStorPnr,dStorPil);
+
+ if (dStorPil > dMaxPil)
+ {
+ //LC_GetTK(lStorPnr,&ap,&np);
+ ap = *(pA+lStorPnr-1);
+ np = *(pN+lStorPnr-1);
+ //LC_PutTK(lLagre,ap,np);
+ *(pA+lLagre-1) = ap;
+ *(pN+lLagre-1) = np;
+ // UT_FPRINTF(stderr,"\nLagres som punkt nr %hd",lagre);
+
+ lLagre++;
+ lForste = lStorPnr;
+ bNyttFastpunktFunnet = true;
+ }
+
+ // Sjekk om max avstand er overskredet
+ if ( ! bNyttFastpunktFunnet)
+ {
+ da = a2 - a1;
+ dn = n2 - n1;
+ dAvst2 = da*da + dn*dn;
+ // UT_FPRINTF(stderr,"\nAvst %hd %hd : %.4f",forste,siste,sqrt(dAvst2));
+
+ if (dAvst2 > dMaxAvst2)
+ {
+ if (lSiste == lForste+1)
+ {
+ //LC_PutTK(lLagre,a2,n2);
+ *(pA+lLagre-1) = a2;
+ *(pN+lLagre-1) = n2;
+
+ // UT_FPRINTF(stderr,"\nMax avst. overskredet, lagres som punkt nr %hd",lagre);
+
+ lLagre++;
+ lForste = lSiste;
+ bNyttFastpunktFunnet = true;
+ }
+
+ else
+ {
+ //LC_GetTK(lSiste-1,&ap,&np);
+ ap = *(pA+lSiste-1-1);
+ np = *(pN+lSiste-1-1);
+ //LC_PutTK(lLagre,ap,np);
+ *(pA+lLagre-1) = ap;
+ *(pN+lLagre-1) = np;
+
+ // UT_FPRINTF(stderr,"\nMax avst. overskredet, lagres som punkt nr %hd",lagre);
+
+ lLagre++;
+ lForste = lSiste-1;
+ bNyttFastpunktFunnet = true;
+ }
+ }
+
+ // Siste punkt i gruppen er alltid fastpunkt
+ if (lSiste == *nko)
+ {
+ // Sjekk at koordinatene er forskjellige fra forrige punkt
+ if (lLagre > 1)
+ {
+ //LC_GetTK((short)(lLagre-1),&a,&n);
+ a = *(pA+lLagre-1-1);
+ n = *(pN+lLagre-1-1);
+
+ if (fabs(a2-a) < ACCY && fabs(n2-n) < ACCY)
+ {
+ // Samme koordinater som forrige punkt, kutt ut dette
+ lLagre--;
+ }
+ }
+
+ //LC_PutTK(lLagre,a2,n2);
+ *(pA+lLagre-1) = a2;
+ *(pN+lLagre-1) = n2;
+ // UT_FPRINTF(stderr,"\nSiste pkt., lagres som punkt nr %hd",lagre);
+
+ lLagre++;
+ lForste = lSiste;
+ bNyttFastpunktFunnet = true;
+ }
+ }
+ }
+ }
+
+ // ----- Sjekk at gruppen ikke har klappet sammen til en kort liten strek
+
+ if (lLagre <= 3)
+ {
+ // Har 2 koordinater etter tynning,
+ // legg tilbake opprinnelige koordinater
+ bBeregnet = false;
+ UT_memcpy(pA, (sizeof(double))*(*nko), pdAust, (sizeof(double))*(*nko));
+ UT_memcpy(pN, (sizeof(double))*(*nko), pdNord, (sizeof(double))*(*nko));
+ }
+
+ else if (lLagre == 4)
+ {
+ // Har 3 koordinater etter tynning, og
+ // avstand fra første til siste punkt er mindre enn pilhøyden
+ da = (*(pA+lLagre-2)) - (*(pA));
+ dn = (*(pN+lLagre-2)) - (*(pN));
+
+ if ((da*da + dn*dn) < dPil2)
+ {
+ // Gruppen har blitt feil, legg tilbake opprinnelige koordinater
+ bBeregnet = false;
+ UT_memcpy(pA, (sizeof(double))*(*nko), pdAust, (sizeof(double))*(*nko));
+ UT_memcpy(pN, (sizeof(double))*(*nko), pdNord, (sizeof(double))*(*nko));
+ }
+ }
+
+ free(pdAust);
+ free(pdNord);
+
+ // Legg ut antall koordinater i resultatet
+ if (bBeregnet) *nko = lLagre-1;
+}
+
+
+/*
+CH GM_BeregnHjelpepunkt
+CD ==============================================================
+CD Formål:
+CD Beskriv funksjonaliteten her ...
+CD
+CD
+CD
+CD *3 *2
+CD / /
+CD n1* /
+CD / /
+CD /
+CD / n2* /
+CD /
+CD / n3* /
+CD /
+CD / /
+CD /
+CD / /
+CD /
+CD / /
+CD *1
+CD
+CD Parameterliste:
+CD Type Navn I/U Merknad
+CD -------------------------------------------------------------
+CD double dA1 i Koordinater punkt 1
+CD double dN1 i
+CD double dA2 i Koordinater punkt 2
+CD double dN2 i
+CD double dA3 i Koordinater punkt 3
+CD double dN3 i
+CD double dEnhet i Enhet som styrer avrunding og beregning
+CD short sMaxAntPkt i Max antall punkt i pdAustArr og pdNordArr
+CD double *pdAustArr u Peker til array som mottar beregnede koordinater( n1 -nx
+CD double *pdNordArr u Peker til array som mottar beregnede koordinater
+CD short sAntPkt u Antall punkt beregnet
+CD bool bBeregnet r Status: true = beregnet OK
+CD false = ikke beregnet. (ikke nok plass i resultat-array, og andre feil?)
+CD
+CD Bruk:
+CD bStatus = GM_BeregnHjelpepunkt(dA1,dN1,dA2,dN2,dA3,dN3,dEnhet,sMaxAntPkt,&dAustArr,&pdNordArr,&sAntPkt);
+CD ==============================================================
+*/
+
+/*
+bool GM_BeregnHjelpepunkt(double dA1,double dN1,double dA2,double dN2,double dA3,double dN3,double dEnhet,
+ short sMaxAntPkt,double *pdAustArr,double *pdNordArr,short *psAntPkt)
+{
+ // Beskriv algoritme som brukes her ...
+ // (Eventuelt med henvisning til bok med detaljbeskrivelse)
+
+
+ bool bStatus = true;
+
+ // Legg inn funksjonaliteten her ...
+
+ return bStatus;
+}
+*/
+
diff --git a/src/GM/GM.sln b/src/GM/GM.sln
new file mode 100644
index 0000000..9a0f1c4
--- /dev/null
+++ b/src/GM/GM.sln
@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Express 2012 for Windows Desktop
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GM", "GM.vcxproj", "{9301EA33-4E58-4692-AC49-FE321C107CE5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ SosiVis Debug|Win32 = SosiVis Debug|Win32
+ SosiVis Release|Win32 = SosiVis Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9301EA33-4E58-4692-AC49-FE321C107CE5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9301EA33-4E58-4692-AC49-FE321C107CE5}.Debug|Win32.Build.0 = Debug|Win32
+ {9301EA33-4E58-4692-AC49-FE321C107CE5}.Release|Win32.ActiveCfg = Release|Win32
+ {9301EA33-4E58-4692-AC49-FE321C107CE5}.Release|Win32.Build.0 = Release|Win32
+ {9301EA33-4E58-4692-AC49-FE321C107CE5}.SosiVis Debug|Win32.ActiveCfg = SosiVis Debug|Win32
+ {9301EA33-4E58-4692-AC49-FE321C107CE5}.SosiVis Debug|Win32.Build.0 = SosiVis Debug|Win32
+ {9301EA33-4E58-4692-AC49-FE321C107CE5}.SosiVis Release|Win32.ActiveCfg = SosiVis Release|Win32
+ {9301EA33-4E58-4692-AC49-FE321C107CE5}.SosiVis Release|Win32.Build.0 = SosiVis Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/GM/GM.vcxproj b/src/GM/GM.vcxproj
new file mode 100644
index 0000000..2e67bcb
--- /dev/null
+++ b/src/GM/GM.vcxproj
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="SosiVis Debug|Win32">
+ <Configuration>SosiVis Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="SosiVis Release|Win32">
+ <Configuration>SosiVis Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{9301EA33-4E58-4692-AC49-FE321C107CE5}</ProjectGuid>
+ <RootNamespace>GM</RootNamespace>
+ <SccProjectName>
+ </SccProjectName>
+ <SccAuxPath>
+ </SccAuxPath>
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccProvider>
+ </SccProvider>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>11.0.50727.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Lib>
+ <OutputFile>..\..\Lib\$(ProjectName)D.lib </OutputFile>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat />
+ </ClCompile>
+ <Lib>
+ <OutputFile>..\..\Lib\$(ProjectName).lib </OutputFile>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat />
+ </ClCompile>
+ <Lib>
+ <OutputFile>..\..\Lib\$(ProjectName).lib </OutputFile>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Lib>
+ <OutputFile>..\..\Lib\$(ProjectName)D.lib </OutputFile>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="GM.cpp" />
+ <ClCompile Include="stdafx.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">Create</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="fygm.h">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) ..\..\Include\*.*
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) ..\..\Include\*.*
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">copy %(FullPath) ..\..\Include\*.*
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">copy %(FullPath) ..\..\Include\*.*
+</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ </CustomBuild>
+ <ClInclude Include="stdafx.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <Text Include="ReadMe.txt" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+ <ProjectExtensions>
+ <VisualStudio>
+ <UserProperties DevPartner_IsInstrumented="0" />
+ </VisualStudio>
+ </ProjectExtensions>
+</Project> \ No newline at end of file
diff --git a/src/GM/LICENSE b/src/GM/LICENSE
new file mode 100644
index 0000000..642f5d5
--- /dev/null
+++ b/src/GM/LICENSE
@@ -0,0 +1,24 @@
+/******************************************************************************
+* STATENS KARTVERK - FYSAK
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
diff --git a/src/GM/Makefile.am b/src/GM/Makefile.am
new file mode 100644
index 0000000..67abad7
--- /dev/null
+++ b/src/GM/Makefile.am
@@ -0,0 +1,10 @@
+AM_CPPFLAGS = --pedantic -Wno-long-long -Wall -O2 -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -Wno-write-strings
+ACLOCAL_AMFLAGS = -I m5
+
+lib_LTLIBRARIES = libfygm.la
+libfygm_la_SOURCES = fygm.h GM.cpp stdafx.cpp stdafx.h
+libfygm_la_LDFLAGS = -version-info 0:0:0
+
+library_includedir=$(includedir)/fyba
+library_include_HEADERS = fygm.h
+
diff --git a/src/GM/fygm.h b/src/GM/fygm.h
new file mode 100644
index 0000000..b60a422
--- /dev/null
+++ b/src/GM/fygm.h
@@ -0,0 +1,129 @@
+/******************************************************************************
+*
+* STATENS KARTVERK - FYSAK
+*
+* Filename: fygm.h
+*
+* Content: Prototyper for generelle geometrirutiner.
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+#pragma once
+
+#ifdef WIN32
+#ifdef _DEBUG
+ #pragma comment (lib, "GmD.lib")
+#else
+ #pragma comment (lib, "Gm.lib")
+#endif
+#endif
+
+#ifndef SK_EntPnt_GM
+# define SK_EntPnt_GM
+#endif
+
+
+/* --- Konstanter -- */
+//#define PI 3.14159265358979324
+#define PI 3.14159265358979323846
+#define PIHALV (PI/2.0)
+#define TOPI (PI*2.0)
+
+/* --- Makroer -- */
+#define Rad2Deg(Rad) ((Rad/PI)*180)
+#define Rad2Gon(Rad) ((Rad/PI)*200)
+
+#define Deg2Rad(Deg) ((Deg/180)*PI)
+#define Gon2Rad(Gon) ((Gon/200)*PI)
+
+
+/* ---- Funksjonsdefinisjoner for fygm.c -- */
+SK_EntPnt_GM short GM_sver(double ka,double kn,double la,double ln,double na,double nn,
+ double ma,double mn,double *sa,double *sn);
+SK_EntPnt_GM short GM_shor(double ka,double kn,double la,double ln,double na,double nn,
+ double ma,double mn,double *sa,double *sn);
+SK_EntPnt_GM short GM_sLinLin(double ka,double kn,double la,double ln,double ma,double mn,
+ double na,double nn,double *sa,double *sn);
+SK_EntPnt_GM short GM_Overlapp(double ka,double kn,double la,double ln,double ma,double mn,double na,double nn);
+SK_EntPnt_GM short GM_sVektVekt(double ka,double kn,double la,double ln,double ma,double mn,
+ double na,double nn,double *sa,double *sn);
+SK_EntPnt_GM short GM_sLinBue(double sa,double sn,double radius,double fi,double dfi,
+ double ka,double kn,double la,double ln,
+ double *a1,double *n1,double *a2,double *n2);
+SK_EntPnt_GM short GM_sVektSirk(double sa,double sn,double radius,
+ double ka,double kn,double la,double ln,
+ double *a1,double *n1,double *a2,double *n2);
+SK_EntPnt_GM short GM_sBueBue(double as1,double ns1,double radius1,double fi1,double dfi1,
+ double as2,double ns2,double radius2,double fi2,double dfi2,
+ double *a1,double *n1,double *a2,double *n2);
+SK_EntPnt_GM short GM_sSirkSirk(double as1,double ns1,double radius1,
+ double as2,double ns2,double radius2,
+ double *a1,double *n1,double *a2,double *n2);
+SK_EntPnt_GM short GM_fotp(double a1,double n1,double a2,double n2,double ap,double np,
+ double *af,double *nf);
+SK_EntPnt_GM short GM_fotp_ny(double a1, double n1, double a2, double n2, double ap, double np,
+ double *af, double *nf);
+SK_EntPnt_GM short GM_KonvBue(double a1,double n1,double a2,double n2,double radius,
+ short storbue,double *as,double *ns,double *fi,double *dfi);
+SK_EntPnt_GM short GM_KonvBuep(double a1,double n1,double a2,double n2,double a3,double n3,
+ double *as,double *ns,double *radius,double *fi,double *dfi);
+SK_EntPnt_GM short GM_KonvSirkel(double *fi,double *dfi);
+SK_EntPnt_GM short GM_KonvSirkelp(double a1,double n1,double a2,double n2,double a3,double n3,
+ double *as,double *ns,double *radius,double *fi,double *dfi);
+SK_EntPnt_GM short GM_bepa(double a1,double n1,double a2,double n2,
+ double *pa,double *pb,double *pc);
+SK_EntPnt_GM short GM_bepa3(double a1, double n1, double h1,
+ double a2, double n2, double h2,
+ double *pf, double *pg, double *ph);
+SK_EntPnt_GM short GM_cint(double pa1,double pb1,double pc1,double pa2,double pb2,
+ double pc2,double *as,double *ns);
+SK_EntPnt_GM short GM_wtst(double p1a,double p1n,double p2a,double p2n,
+ double wmina,double wminn,double wmaxa,double wmaxn);
+SK_EntPnt_GM short GM_wtstBue(double as,double ns,double radius,double fi,double dfi,
+ double wmina,double wminn,double wmaxa,double wmaxn);
+SK_EntPnt_GM short GM_wtstPunkt(double PktA, double PktN, double wa1, double wn1, double wa2, double wn2, double wa3, double wn3,
+ double wa4, double wn4);
+SK_EntPnt_GM short GM_Parallell(double ka,double kn,double la,double ln,double avstand,
+ double *ka1,double *kn1,double *la1,double *ln1);
+SK_EntPnt_GM double GM_Avstand(double as, double ns, double a, double n);
+SK_EntPnt_GM double GM_Avstand2(double a1, double n1, double a2, double n2);
+SK_EntPnt_GM double GM_Areal(double *pA, double *pN, short sNko);
+SK_EntPnt_GM double GM_retning(double ak,double nk,double al,double nl);
+SK_EntPnt_GM double GM_RetnGon(double a1, double n1, double a2, double n2);
+SK_EntPnt_GM double GM_Vinkel(double fi1, double fi2 );
+SK_EntPnt_GM double GM_RedVinkel(double fi );
+SK_EntPnt_GM void GM_RettvPol(double a1 , double n1, double a2, double n2,
+ double *gon, double *avst);
+SK_EntPnt_GM void GM_PolRettv(double *a , double *n, double gon, double avst);
+SK_EntPnt_GM void GM_buebox(double as,double ns,double radius,double fi,double dfi,
+ double *nva,double *nvn,double *oha,double *ohn);
+SK_EntPnt_GM short GM_NormVindu(double *nva,double *nvn,double *oha,double *ohn);
+SK_EntPnt_GM short GM_PktBue(double as,double ns,double fi,double dfi,
+ double a,double n,double *dfiPkt);
+SK_EntPnt_GM short GM_TestPktBue(double as,double ns,double fi,double dfi,
+ double a,double n);
+SK_EntPnt_GM short GM_BueTangent(double as, double ns, double fi, double dfi,
+ double radius, double a, double n, double *buetan);
+SK_EntPnt_GM short GM_BueTilKorder (double as,double ns,double r,double fi,double dfi,
+ double delta,short mpu,double *a_arr,double *n_arr);
+SK_EntPnt_GM void GM_PktTilOktagon (double dAs,double dNs,double dAreal,double *a_arr,double *n_arr);
+SK_EntPnt_GM void GM_TynnDared(double dMaxAvst,double dMaxPil,long *nko, double *pA,double *pN);
diff --git a/src/GM/make.sh b/src/GM/make.sh
new file mode 100755
index 0000000..6a899a3
--- /dev/null
+++ b/src/GM/make.sh
@@ -0,0 +1,4 @@
+gcc -Wall -g -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -Wno-write-strings -c -I. -I../../include *.cpp
+ar rcs libfygm.a *.o
+gcc -g -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -Wno-write-strings -shared -I. -I../../include *.cpp -o ../../lib/libfygm.so
+cp fygm.h ../../include/fygm.h
diff --git a/src/GM/stdafx.cpp b/src/GM/stdafx.cpp
new file mode 100644
index 0000000..0455cd1
--- /dev/null
+++ b/src/GM/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// GM.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/src/GM/stdafx.h b/src/GM/stdafx.h
new file mode 100644
index 0000000..f1ffb54
--- /dev/null
+++ b/src/GM/stdafx.h
@@ -0,0 +1,9 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+
+// TODO: reference additional headers your program requires here
diff --git a/src/UT/ANFORSEL.cpp b/src/UT/ANFORSEL.cpp
new file mode 100644
index 0000000..2fe1572
--- /dev/null
+++ b/src/UT/ANFORSEL.cpp
@@ -0,0 +1,189 @@
+/*
+CD AR-920127
+CH Anforsel Legger til eller fjerner anførseltegn
+CD ===============================================================
+CD
+CD Eier.......: STATENS KARTVERK / FYSAK-prosjektet
+CD Ansvarlig..: Åge Eliassen
+CD
+CD ===============================================================
+*/
+
+#include "stdafx.h"
+#include <string.h>
+
+#include "fyut.h"
+
+
+/*
+OJ-2003-12-03
+ÅE-950401
+CH UT_PutAnfTegn Legg inn / fjern anførseltegn forran og bak streng
+CD ===========================================================================
+CD Formål:
+CD Legger inn eller fjerner anførseltegn forran eller bak parameter-streng.
+CD Ved rydding av anførseltegn ryddes også tegn inni strengen.
+CD Ved rydding må parameterstrengen bestå av mer enn ett tegn.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD --------------------------------------------------------------------------
+CD char *pszTx iu Tekststreng som skal behandles
+CD char cTegn i Styreparameter:
+CD " = Omslutt pszTx med ' " '
+CD ' = Omslutt pszTx med " ' "
+CD F = Fjern anførselstegn fra strengen
+CD short sMaksLen i Makslimal lengde på streng inklusiv null-termiantor
+CD short sOk r Feilstatus. UT_OK hvis ok, UT_ERROR hvis strengen er
+CD for kort til å føye på anførselstegn.
+CD
+CD Bruk:
+CD bOk = UT_PutAnfTegn(pszTx,cTegn, sMaksLen);
+CD =============================================================================
+*/
+SK_EntPnt_UT short UT_PutAnfTegn(char *pszTx, char cTegn, short sMaksLen)
+{
+ short i,ii,sTxtLen;
+ char t1,t2;
+ short sOk = UT_OK;
+
+ sTxtLen = (short)strlen(pszTx);
+ /* Hvis det skal legges på " eller ' i para-strengens ender: */
+ if (cTegn=='\"' || cTegn=='\'') {
+
+ /* Hvis para-strengen allerede er innrammet av anførselstegn :*/
+ if ((sTxtLen>1 && pszTx[0]=='\"' && pszTx[sTxtLen]=='\"')
+ || (sTxtLen>1 && pszTx[0]=='\'' && pszTx[sTxtLen]=='\'')) {
+ if (sTxtLen <= sMaksLen - 1)
+ {
+ pszTx[0] = pszTx[sTxtLen] = cTegn;
+ }
+ else
+ {
+ sOk = UT_ERROR;
+ }
+ // Hvis tegnet finnes bare i starten av strengen.
+ } else if ((sTxtLen > 1 ) && (pszTx[0]=='\'' || pszTx[0]=='\"')){
+ if(sTxtLen < sMaksLen - 2)
+ {
+ pszTx[0] = pszTx[sTxtLen] = cTegn;
+ pszTx[sTxtLen + 1] = '\0';
+ }
+ else
+ {
+ sOk = UT_ERROR;
+ }
+ // Hvis tegnet finnes bare i slutten av strengen.
+ } else if ((sTxtLen > 1 ) && (pszTx[sTxtLen - 1]=='\'' || pszTx[sTxtLen - 1]=='\"')){
+ if(sTxtLen < sMaksLen - 2)
+ {
+ t1 = pszTx[0];
+ t2 = pszTx[1];
+ pszTx[0] = cTegn;
+ pszTx[1] = t1;
+
+ i = 2;
+ while (pszTx[i] != '\0') {
+ t1 = pszTx[i];
+ pszTx[i] = t2;
+ t2 = t1;
+ i++;
+ }
+ pszTx[i] = cTegn;
+ pszTx[i+1] = '\0';
+ }else{
+ sOk = UT_ERROR;
+ }
+ // Strengen består av bare et anførselstegn.
+ } else if ((sTxtLen == 1 ) && (pszTx[sTxtLen - 1]=='\'' || pszTx[sTxtLen - 1]=='\"')){
+ if (sTxtLen <= sMaksLen - 2)
+ {
+ pszTx[0] = pszTx[1] = cTegn;
+ pszTx[2] = '\0';
+ }
+ else
+ {
+ sOk = UT_ERROR;
+ }
+
+ /* Hvis para-strengen ikke er innrammet av ' eller " :*/
+ } else {
+ if (sTxtLen <= sMaksLen - 3)
+ {
+ if (pszTx[0] == '\0') { /* ingen tegn, legger inn "" */
+ pszTx[0] = pszTx[1] = cTegn;
+ pszTx[2] = '\0';
+ } else if (pszTx[1] == '\0') { /* ett tegn, legger inn "x" */
+ pszTx[1] = pszTx[0];
+ pszTx[0] = pszTx[2] = cTegn;
+ pszTx[3] = '\0';
+ } else { /* flere tegn, legger inn "xx yy" */
+ t1 = pszTx[0];
+ t2 = pszTx[1];
+ pszTx[0] = cTegn;
+ pszTx[1] = t1;
+
+ i = 2;
+ while (pszTx[i] != '\0') {
+ t1 = pszTx[i];
+ pszTx[i] = t2;
+ t2 = t1;
+ i++;
+ }
+ pszTx[i] = t2;
+ pszTx[i+1] = cTegn;
+ pszTx[i+2] = '\0';
+ }
+ }
+ else
+ {
+ sOk = UT_ERROR;
+ }
+ }
+
+ /* Fjerner appostroffer: */
+ } else if (cTegn=='F') {
+ if (sTxtLen <= sMaksLen)
+ {
+ /* Para-strengen må innholde mer enn ett tegn: */
+ if (sTxtLen > 1) {
+
+ /* " */
+ if ( pszTx[0]=='\"' || pszTx[sTxtLen-1]=='\"') {
+
+ /* Fjerner alle " i hele strengen. */
+ i = 0;
+ ii = 0;
+ do {
+ if (pszTx[i] != '\"') {
+ pszTx[ii] = pszTx[i];
+ ii++;
+ }
+ i++;
+ } while (pszTx[i] != '\0');
+ pszTx[ii] = '\0';
+
+ /* ' */
+ } else if ( pszTx[0]=='\'' || pszTx[sTxtLen-1]=='\'') {
+
+ /* Fjerner alle ' i hele strengen. */
+ i = 0;
+ ii = 0;
+ do {
+ if (pszTx[i] != '\'') {
+ pszTx[ii] = pszTx[i];
+ ii++;
+ }
+ i++;
+ } while (pszTx[i] != '\0');
+ pszTx[ii] = '\0';
+ }
+ }
+ }
+ else
+ {
+ sOk = UT_ERROR;
+ }
+ }
+ return sOk;
+}
diff --git a/src/UT/CREDIR.cpp b/src/UT/CREDIR.cpp
new file mode 100644
index 0000000..6b0430d
--- /dev/null
+++ b/src/UT/CREDIR.cpp
@@ -0,0 +1,81 @@
+/* ------------------------------
+ * Fil: CreDir.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+
+#ifdef UNIX
+# ifndef _INCLUDE_POSIX_SOURCE
+# define _INCLUDE_POSIX_SOURCE
+# endif
+
+# ifndef _HPUX_SOURCE
+# define _HPUX_SOURCE
+# endif
+
+# include<sys/types.h>
+# include <sys/stat.h>
+#endif
+
+#ifdef OS232
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+#endif
+
+#ifdef OS216
+# include <direct.h>
+#endif
+
+#ifdef WIN32
+# include <direct.h>
+#endif
+
+#ifdef BORLAND
+# include <dir.h>
+#endif
+
+//#include "StdAfx.h"
+#include "fyut.h"
+
+/*
+AR-921013
+CH UT_CreateDir Oppretter et directory
+CD ==================================================================
+CD Formål:
+CD Sletter et directory.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Directory-navn
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_CreateDir(szPath);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_CreateDir(char *pszPath)
+{
+#ifdef UNIX
+ mode_t modus;
+ /* Setter alle rettigheter for user ingen for andre*/
+ modus = (S_IRUSR | S_IWUSR | S_IXUSR);
+ return (short)mkdir(pszPath,modus);
+#endif
+
+#ifdef OS232
+ return (short)DosCreateDir(pszPath,NULL);
+#endif
+
+#ifdef OS216
+ return (short)mkdir(pszPath);
+#endif
+
+#ifdef WIN32
+ return (short)_mkdir(pszPath);
+#endif
+
+#ifdef BORLAND
+ return (short)mkdir(pszPath);
+#endif
+}
diff --git a/src/UT/CopyFile.cpp b/src/UT/CopyFile.cpp
new file mode 100644
index 0000000..4e6d32c
--- /dev/null
+++ b/src/UT/CopyFile.cpp
@@ -0,0 +1,78 @@
+/* ------------------------------
+ * Fil: CopyFile.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+
+#ifdef UNIX
+# ifndef _INCLUDE_POSIX_SOURCE
+# define _INCLUDE_POSIX_SOURCE
+# endif
+# ifndef _HPUX_SOURCE
+# define _HPUX_SOURCE
+# endif
+#endif
+
+#ifdef OS2
+#endif
+
+#ifdef WIN32
+# include<windows.h>
+#endif
+
+#ifdef BORLAND
+#endif
+
+//#include "StdAfx.h"
+#include "fyut.h"
+
+/*
+AR-971118
+CH UT_CopyFile Kopier fil
+CD ==================================================================
+CD Formål:
+CD Kopierer en eksisterende fil til en ny fil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszFraFilnavn i Kopier fra denne filen
+CD char *pszTilFilnavn i Kopier til denne filen
+CD short sFeilHvisEksisterer i Hva skal skje hvis resultatfilen finnes fra før:
+CD UT_TRUE = Avbryter
+CD UT_FALSE = Overskriver
+CD short sStatus r Status:
+CD UT_TRUE = OK
+CD UT_FALSE = Feil.
+CD
+CD Bruk: sStatus = UT_CopyFile(pszFraFilnavn,pszTilFilnavn,UT_TRUE);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_CopyFile(char *pszFraFilnavn,char *pszTilFilnavn,short sFeilHvisEksisterer)
+{
+#ifdef WIN32
+ if (CopyFile( pszFraFilnavn, pszTilFilnavn, sFeilHvisEksisterer)) {
+ return UT_TRUE;
+ } else {
+ return UT_FALSE;
+ }
+#endif
+
+
+#ifdef UNIX
+ return UT_FALSE;
+#endif
+
+#ifdef OS232
+ return UT_FALSE;
+#endif
+
+#ifdef OS216
+ return UT_FALSE;
+#endif
+
+#ifdef BORLAND
+ return UT_FALSE;
+#endif
+
+}
diff --git a/src/UT/DELDIR.cpp b/src/UT/DELDIR.cpp
new file mode 100644
index 0000000..e42846a
--- /dev/null
+++ b/src/UT/DELDIR.cpp
@@ -0,0 +1,78 @@
+/* ------------------------------
+ * Fil: DelDir.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+
+#ifdef LINUX
+# include <unistd.h>
+#endif
+
+#ifdef UNIX
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif
+
+#ifdef OS232
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+#endif
+
+#ifdef OS216
+# include <direct.h>
+#endif
+
+#ifdef WIN32
+# include <direct.h>
+#endif
+
+#ifdef BORLAND
+# include <dir.h>
+#endif
+
+//#include "StdAfx.h"
+#include "fyut.h"
+
+/*
+AR-921013
+CH UT_DeleteDir Sletter et directory
+CD ==================================================================
+CD Formål:
+CD Sletter et directory.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Directory-navn
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_DeleteDir(szPath);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_DeleteDir(char *pszPath)
+{
+#ifdef LINUX
+ return (short)rmdir(pszPath);
+#endif
+
+#ifdef UNIX
+ return (short)rmdir(pszPath);
+#endif
+
+#ifdef OS232
+ return (short)DosDeleteDir(pszPath);
+#endif
+
+#ifdef OS216
+ return (short)rmdir(pszPath);
+#endif
+
+#ifdef WIN32
+ return (short)_rmdir(pszPath);
+#endif
+
+#ifdef BORLAND
+ return (short)rmdir(pszPath);
+#endif
+}
diff --git a/src/UT/DELFILE.cpp b/src/UT/DELFILE.cpp
new file mode 100644
index 0000000..6bc2489
--- /dev/null
+++ b/src/UT/DELFILE.cpp
@@ -0,0 +1,43 @@
+/* ------------------------------
+ * Fil: DelFile.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+
+#ifdef LINUX
+# include <unistd.h>
+# define UT_access access
+#else
+# include <io.h>
+# define UT_access _access
+#endif
+
+#include "fyut.h"
+
+/*
+AR-921013
+CH UT_DeleteFile Sletter en fil
+CD ==================================================================
+CD Formål:
+CD Sletter en fil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Filnavn
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_DeleteFile(szPath);
+ ==================================================================
+*/
+
+SK_EntPnt_UT short UT_DeleteFile(char *pszPath)
+{
+ // Sjekk at filen finnes
+ if( (UT_access( pszPath, 0 )) == 0 ) {
+ /* Sletter eventuell gammel hjelpefil */
+ return remove(pszPath);
+ }
+
+ return 0;
+}
diff --git a/src/UT/DISKINFO.cpp b/src/UT/DISKINFO.cpp
new file mode 100644
index 0000000..d165832
--- /dev/null
+++ b/src/UT/DISKINFO.cpp
@@ -0,0 +1,199 @@
+/* ------------------------------
+ * Fil: DiskInfo.c
+ * ------------------------------ */
+#include "stdafx.h"
+#include <ctype.h>
+
+#ifdef UNIX
+# ifndef _INCLUDE_POSIX_SOURCE
+# define _INCLUDE_POSIX_SOURCE
+# endif
+
+# ifndef _HPUX_SOURCE
+# define _HPUX_SOURCE
+# endif
+
+# ifdef SUNOS /* NB! DIKAS */
+# include <sys/statvfs.h>
+# else
+# include <sys/stat.h>
+# include <sys/vfs.h>
+# endif
+
+# include <sys/types.h>
+# include <unistd.h>
+# include <limits.h>
+#endif
+
+#ifdef OS2
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+#endif
+
+#ifdef WIN32
+# include <windows.h>
+# include <LIMITS.H>
+#endif
+
+#ifdef BORLAND
+# include <windows.h>
+#endif
+
+#include "fyut.h"
+
+/*
+AR-930623
+CH UT_InqAvailSize Finn ledig plass på disken
+CD ==================================================================
+CD Formål:
+CD Finner hvor mye plass som er ledig for utvidelse av gitt fil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Filnavn inkl. full sti.
+CD unsigned long *pulLedigPlass u Ledig plass på disken
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_InqAvailSize(pszPath,&ulLedigPLass);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_InqAvailSize(char *pszPath,unsigned long *pulLedigPlass)
+{
+#ifdef UNIX
+ int rc;
+# ifdef SUNOS
+ struct statvfs buf;
+# else
+ struct statfs buf;
+# endif
+
+ /* Hent filopplysninger */
+ rc = statfs(pszPath,&buf);
+ if (rc == 0) {
+ *pulLedigPlass = buf.f_bavail * buf.f_bsize;
+ }
+
+ /* Hent filopplysninger */
+# ifdef SUNOS
+ /* NB! statfs er på vei ut av systemet ! , bruker statvfs i stedet*/
+ rc = statvfs(pszPath,&buf);
+ if (rc == 0) {
+ *pulLedigPlass = buf.f_bavail * buf.f_bsize;
+ }
+
+# else
+ rc = statfs(pszPath,&buf);
+ if (rc == 0) {
+ *pulLedigPlass = buf.f_bavail * buf.f_bsize;
+ }
+# endif
+
+ return (short)rc;
+#endif
+
+
+#ifdef OS232
+ unsigned long ulDisk;
+ char disk[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ APIRET rc;
+ FSALLOCATE drive;
+
+ /* Finn disknummer */
+ UT_splitpath(pszPath,disk,dir,fname,ext);
+ if (*disk != '\0') {
+ ulDisk = toupper(*disk) - '@';
+ } else {
+ ulDisk = 0L;
+ }
+
+ /* Hent filopplysninger */
+ rc = DosQueryFSInfo(ulDisk,FSIL_ALLOC,(PBYTE)&drive,sizeof drive);
+
+ if (rc == NO_ERROR) {
+ *pulLedigPlass = drive.cUnitAvail * drive.cSectorUnit * drive.cbSector;
+ }
+
+ return (short)rc;
+#endif
+
+
+#ifdef OS216
+ unsigned short usDisk;
+ char disk[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ int rc;
+ FSALLOCATE drive;
+
+ /* Finn disknummer */
+ UT_splitpath(pszPath,disk,dir,fname,ext);
+ if (*disk != '\0') {
+ usDisk = toupper(*disk) - '@';
+ } else {
+ usDisk = 0;
+ }
+
+ /* Hent filopplysninger */
+ rc = DosQFSInfo(usDisk,FSIL_ALLOC,(PBYTE)&drive,sizeof drive);
+
+ if (rc == NO_ERROR) {
+ *pulLedigPlass = drive.cUnitAvail * drive.cSectorUnit * drive.cbSector;
+ }
+
+ return (short)rc;
+#endif
+
+
+#ifdef WIN32
+ char disk[_MAX_DRIVE+1],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ DWORD SectorsPerCluster; // address of sectors per cluster
+ DWORD BytesPerSector; // address of bytes per sector
+ DWORD FreeClusters; // address of number of free clusters
+ DWORD Clusters; // address of total number of clusters
+
+ UINT64 ui64;
+
+ // Finn disk
+ UT_splitpath(pszPath,disk,dir,fname,ext);
+ strcat_s(disk,"\\");
+ //Hent filopplysninger
+ if (GetDiskFreeSpace((LPCTSTR)disk,
+ (LPDWORD)&SectorsPerCluster,
+ (LPDWORD)&BytesPerSector,
+ (LPDWORD)&FreeClusters,
+ (LPDWORD)&Clusters ) )
+ {
+ ui64 = (UINT64)FreeClusters * (UINT64)SectorsPerCluster * (UINT64)BytesPerSector;
+ if (ui64 < ULONG_MAX) *pulLedigPlass = (unsigned long)ui64;
+ else *pulLedigPlass = ULONG_MAX;
+
+ return 0;
+ }
+ return 1;
+#endif
+
+#ifdef BORLAND
+ char disk[_MAX_DRIVE+1],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ DWORD SectorsPerCluster; /* address of sectors per cluster */
+ DWORD BytesPerSector; /* address of bytes per sector */
+ DWORD FreeClusters; /* address of number of free clusters */
+ DWORD Clusters; /* address of total number of clusters */
+
+ /* Finn disk */
+ UT_splitpath(pszPath,disk,dir,fname,ext);
+ UT_StrCat(disk,"\\",_MAX_DRIVE+1);
+
+ /* Hent filopplysninger */
+ if (GetDiskFreeSpace((LPCTSTR)disk,
+ (LPDWORD)&SectorsPerCluster,
+ (LPDWORD)&BytesPerSector,
+ (LPDWORD)&FreeClusters,
+ (LPDWORD)&Clusters ) ) {
+
+ *pulLedigPlass = FreeClusters * SectorsPerCluster * BytesPerSector;
+ return 0;
+ }
+
+ return 1;
+#endif
+}
diff --git a/src/UT/FILNACMP.cpp b/src/UT/FILNACMP.cpp
new file mode 100644
index 0000000..b2a5ec2
--- /dev/null
+++ b/src/UT/FILNACMP.cpp
@@ -0,0 +1,54 @@
+/* ------------------------------
+ * Fil: FilnaCmp.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+#include <string.h>
+#include "fyut.h"
+
+#ifdef BORLAND
+# include <windows.h>
+#endif
+
+#ifdef WIN32
+# include <windows.h>
+#endif
+
+/*
+AR-921013
+CH UT_FilnavnCmp Sammenlignfilnavn
+CD ==================================================================
+CD Formål:
+CD Sammenligner om 2 filnavn er like.
+CD Tar hensyn til om filsystemet handterer store og små bokstaver likt.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszFil1 i Filnavn 1
+CD char *pszFil2 i Filnavn 2
+CD short sStatus r Status; 0=Navnene er like, annen verdi = ulik
+CD
+CD Bruk: sStatus = UT_FilnavnCmp(pszFil1,pszFil2);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_FilnavnCmp(char *pszFil1,char *pszFil2)
+{
+ char fil1[_MAX_PATH];
+ char fil2[_MAX_PATH];
+
+#ifdef LINUX
+ strncpy(fil1,pszFil1,strlen(pszFil1));
+ strncpy(fil2,pszFil2,strlen(pszFil2));
+#else
+ strcpy_s(fil1,pszFil1);
+ strcpy_s(fil2,pszFil2);
+#endif
+
+#ifndef UNIX
+ UT_StrUpper(fil1);
+ UT_StrUpper(fil2);
+#endif
+
+ return (short)strcmp(fil1,fil2);
+}
diff --git a/src/UT/FULLPATH.cpp b/src/UT/FULLPATH.cpp
new file mode 100644
index 0000000..4092a93
--- /dev/null
+++ b/src/UT/FULLPATH.cpp
@@ -0,0 +1,249 @@
+/* ------------------------------
+ * Fil: FullPath.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef LINUX
+# include <unistd.h>
+# include <new>
+#endif
+
+#ifdef UNIX
+# include <ctype.h>
+#endif
+
+#ifdef OS2
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+#endif
+
+#ifdef BORLAND
+# include <windows.h>
+#endif
+
+#ifdef WIN32
+# include <windows.h>
+#endif
+
+#include "fyut.h"
+
+
+#ifdef UNIX
+
+#define wchar_t char
+#define wcschr strchr
+
+/*
+CH _fullpath
+CD ==============================================================
+CD Makes a complete path from a non-complete path. Handles "..",
+CD "." and will prepend the path with current working directory
+CD if it is relative (does not start with slash)
+CD
+CD The function returns buffer, pointer to memory area containing
+CD full path if buffer was NULL, or NULL if a error occured
+CD (e.g. full path was longer than maxlen and a buffer
+CD was supplied.) The pointer should be free'd by calling code.
+CD
+CD Parameters:
+CD Type Name I/O Explanation
+CD -------------------------------------------------------------
+CD char *buffer i/o Buffer to put full path into or NULL.
+CD const char *pathname i Pathname to expand
+CD size_t maxlen i Size of buffer.
+CD char * r buffer, pointer to char[] or NULL
+CD ==============================================================
+*/
+char * _fullpath(char *buffer, const char *pathname, size_t maxlen) {
+ if(maxlen < _MAX_PATH) {
+ return NULL;
+ }
+ char * wpath;
+ wpath = new (std::nothrow) char[_MAX_PATH];
+ if (wpath == NULL) { // could not allocate memory
+ return NULL;
+ }
+
+ char * wpath2;
+ wpath2 = new (std::nothrow) char[_MAX_PATH];
+ if (wpath2 == NULL) {
+ delete [] wpath;
+ return NULL;
+ }
+
+ strncpy(wpath, pathname, _MAX_PATH);
+ strncpy(wpath2, pathname, _MAX_PATH);
+
+ /* Make relativer paths of ./foo-paths */
+ if(pathname[0] == '.' && pathname[1] == UT_SLASH) {
+ strncpy(wpath, pathname+2, _MAX_PATH);
+ strncpy(wpath, pathname+2, _MAX_PATH);
+ }
+
+ char * prevPos = NULL;
+
+ char same[4] = { UT_SLASH, '.', UT_SLASH, '\0' }; // e.g. "/./"
+ /* replace /./ with nothing */
+ while ((prevPos = strstr(wpath, same)) != NULL) {
+ prevPos[1] = '\0';
+ UT_StrCopy(wpath2, wpath, _MAX_PATH);
+ strncat(wpath2, (prevPos+strlen(same)), _MAX_PATH);
+ UT_StrCopy(wpath, wpath2, _MAX_PATH);
+ }
+ char prev[5] = { UT_SLASH, '.', '.', UT_SLASH, '\0' }; // e.g "/../"
+
+ int i = -1;
+ /* Remove /../ and parent folder */
+ while ((prevPos = strstr(wpath, prev)) != NULL) {
+ /* Walk forward in the string until first slash or start of string */
+ while((prevPos + i) >= wpath && prevPos[i] != UT_SLASH) {
+ prevPos[i--] = '\0';
+ }
+ UT_StrCopy(wpath2, wpath, _MAX_PATH);
+ strncat(wpath2, (prevPos+strlen(prev)), _MAX_PATH);
+ UT_StrCopy(wpath, wpath2, _MAX_PATH);
+ i = -1;
+ }
+
+ /* prepend cwd on relative paths */
+ if(wpath[0] != UT_SLASH) {
+ if(getcwd(wpath2, _MAX_PATH) == NULL) {
+ delete [] wpath;
+ delete [] wpath2;
+ return NULL;
+ }
+ /* getcwd gives ut the path w/o ending slash */
+ strncat(wpath2, UT_STR_SLASH, _MAX_PATH-(strlen(wpath2)+1));
+ strncat(wpath2, wpath, _MAX_PATH)-(strlen(wpath2)+1);
+ UT_StrCopy(wpath, wpath2, _MAX_PATH);
+ }
+
+ int endLen = strlen(wpath);
+ int startAt = 0;
+ if(wpath[0] == UT_SLASH) {
+ endLen--;
+ startAt = 1;
+ }
+ if(wpath[endLen] == UT_SLASH) {
+ wpath[endLen] = '\0';
+ endLen--;
+ }
+ delete [] wpath2;
+ if (endLen < maxlen && buffer != NULL) { /* we have a buffer, and we have room in buffer */
+ UT_StrCopy(buffer, (wpath+startAt), maxlen);
+ delete [] wpath;
+ return buffer;
+ } else if (buffer == NULL) { /* we have no buffer */
+ char * tempbuf;
+ if ((tempbuf = (char*)UT_MALLOC(endLen+1)) != NULL) {
+ UT_StrCopy(tempbuf, (wpath+startAt), (endLen+1));
+ delete [] wpath;
+ return tempbuf;
+ } else { /* failed to alloc memory*/
+ delete [] wpath;
+ return NULL;
+ }
+ } else { /* not room in buffer and we were supposed to use the buffer */
+ delete [] wpath;
+ return NULL;
+ }
+}
+
+#endif
+
+
+/*
+AR-930423
+CH UT_FullPath Finn fullstendig filnavn
+CD ==================================================================
+CD Formål:
+CD Lag absolutt path navn fra relativt path navn.
+CD I tilleg tolker denne environment-variabler inn i filnavnet.
+CD Environment-varialen skrives i parantes.
+CD
+CD Eks:
+CD SET FKB=D:\DATA\SOSI\FKB
+CD
+CD Filnavnet (FKB)\CV03851V.SOS
+CD pakkes ut til D:\DATA\SOSI\FKB\CV03851V.SOS
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD wchar_t *pszBuffer u Komplett filnavn
+CD const wchar_t *pszPath i Forkortet filnavn
+CD size_t maxlen i Max lengde av pszBuffer
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_FullPath(szBuffer,szPath,maxlen);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_FullPath(char *pszBuffer, const char *pszPath, size_t maxlen)
+{
+ char szFilnavn[_MAX_PATH];
+ char *pszStart,*pszSlutt;
+ char *env;
+#ifdef BORLAND
+ wchar_t *pszOrgPath;
+#endif
+
+ /* Søk start- og sluttparantes */
+ UT_StrCopy(szFilnavn,pszPath,_MAX_PATH);
+ pszStart = strchr(szFilnavn,'(');
+ pszSlutt = strchr(szFilnavn,')');
+
+ /* Både start- og sluttparantes er funnet,
+ og starten er først i strengen */
+ if (pszStart != NULL && pszSlutt != NULL && pszStart < pszSlutt) {
+ *pszStart++ = '\0';
+ *pszSlutt++ = '\0';
+#ifdef LINUX
+ env = getenv( UT_StrUpper(pszStart));
+#else
+ size_t len;
+ _dupenv_s(&env, &len, UT_StrUpper(pszStart));
+#endif
+
+ /* Navnet er ikke funnet */
+ if (env == NULL) {
+ UT_StrCopy(szFilnavn,pszPath,_MAX_PATH);
+
+ } else {
+ UT_StrCat(szFilnavn,env,_MAX_PATH);
+ UT_ClrTrailsp(szFilnavn);
+ UT_StrCat(szFilnavn,pszPath+(pszSlutt-szFilnavn),_MAX_PATH);
+ }
+ }
+
+ /* Hent filopplysninger */
+#ifdef UNIX
+ return (short)(_fullpath(pszBuffer,szFilnavn,maxlen) != NULL)? 0 : 1;
+#endif
+
+#ifdef OS232
+ return (short) DosQueryPathInfo(szFilnavn,FIL_QUERYFULLNAME,pszBuffer,maxlen);
+#endif
+
+#ifdef OS216
+ return (short) DosQPathInfo(szFilnavn,FIL_QUERYFULLNAME,(PBYTE)pszBuffer,(USHORT)maxlen,0);
+#endif
+
+#ifdef WIN32
+ return (short)(_fullpath(pszBuffer,szFilnavn,maxlen) != NULL)? 0 : 1;
+#endif
+
+#ifdef BORLAND
+ pszOrgPath = FullPath(pszBuffer,szFilnavn,maxlen);
+
+ if (pszOrgPath != NULL)
+ return((short)0);
+ else
+ return ((short)1);
+#endif
+
+}
+
diff --git a/src/UT/INQSIZE.cpp b/src/UT/INQSIZE.cpp
new file mode 100644
index 0000000..023c2a0
--- /dev/null
+++ b/src/UT/INQSIZE.cpp
@@ -0,0 +1,173 @@
+/* ------------------------------
+ * Fil: InqSize.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+
+#ifdef UNIX
+# ifndef _INCLUDE_POSIX_SOURCE
+# define _INCLUDE_POSIX_SOURCE
+# endif
+
+# ifndef _HPUX_SOURCE
+# define _HPUX_SOURCE
+# endif
+
+# include<stdio.h>
+# include<sys/time.h>
+# include<sys/types.h>
+# include<sys/vfs.h>
+# include<fcntl.h>
+# include<sys/stat.h>
+# include<errno.h>
+#endif
+
+#ifdef OS2
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+#endif
+
+#ifdef WIN32
+# include<sys/stat.h>
+#endif
+
+#ifdef BORLAND
+# include<sys/stat.h>
+#endif
+
+#include "fyut.h"
+
+/*
+AR-921013
+CH UT_InqPathSize Finn filstørrelse
+CD ==================================================================
+CD Formål:
+CD Henter filstørrelsen for gitt fil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Filnavn
+CD long *plSize u Filstørrelse
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_InqPathSize(szPath,&lSize);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_InqPathSize(char *pszPath,long *plSize)
+{
+#ifdef UNIX
+ struct stat buf;
+ int result;
+
+
+ /* Hent filopplysninger */
+ result = stat(pszPath,&buf);
+ if (result == 0) {
+ *plSize = (long)buf.st_size;
+ }
+
+ return (short)result;
+#endif
+
+#ifdef OS232
+ APIRET rc;
+ FILESTATUS3 PathInfoBuf;
+
+ /* Hent filopplysninger */
+ rc = DosQueryPathInfo(pszPath,FIL_STANDARD,&PathInfoBuf,sizeof(FILESTATUS3));
+
+ if (rc == NO_ERROR) {
+ *plSize = (long)PathInfoBuf.cbFile;
+ }
+
+ return (short)rc;
+#endif
+
+#ifdef OS216
+ int rc;
+ FILESTATUS PathInfoBuf;
+
+ /* Hent filopplysninger */
+ rc = DosQPathInfo(pszPath,FIL_STANDARD,(PBYTE)&PathInfoBuf,sizeof(FILESTATUS),0);
+
+ if (rc == NO_ERROR) {
+ *plSize = (long)PathInfoBuf.cbFile;
+ }
+
+ return (short)rc;
+#endif
+
+#ifdef WIN32
+ struct _stat buf;
+ int result;
+
+
+ /* Hent filopplysninger */
+ result = _stat(pszPath,&buf);
+ if (result == 0) {
+ *plSize = (long)buf.st_size;
+ }
+
+ return (short)result;
+#endif
+
+#ifdef BORLAND
+ struct stat buf;
+ int result;
+
+
+ /* Hent filopplysninger */
+ result = stat(pszPath,&buf);
+ if (result == 0) {
+ *plSize = (long)buf.st_size;
+ }
+
+ return (short)result;
+#endif
+
+}
+
+
+
+/*
+AR-921013
+CH UT_InqPathSize_i64 Finn filstørrelse
+CD ==================================================================
+CD Formål:
+CD Henter filstørrelsen for gitt fil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Filnavn
+CD UT_INT64 *n64Size u Filstørrelse
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_InqPathSize_i64(szPath,&n64Size);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_InqPathSize_i64(char *pszPath,UT_INT64 *n64Size)
+{
+#ifdef LINUX
+ struct stat buf;
+#else
+ struct _stat32i64 buf;
+#endif
+ int result;
+
+
+ // Hent filopplysninger
+ //result = _stat(pszPath,&buf);
+#ifdef LINUX
+ result = stat(pszPath,&buf);
+#else
+ result = _stat32i64(pszPath,&buf);
+#endif
+ if (result == 0) {
+ *n64Size = buf.st_size;
+ }
+
+ return (short)result;
+}
diff --git a/src/UT/INQTID.cpp b/src/UT/INQTID.cpp
new file mode 100644
index 0000000..c98df02
--- /dev/null
+++ b/src/UT/INQTID.cpp
@@ -0,0 +1,209 @@
+/* ------------------------------
+ * Fil: InqTid.c
+ * ------------------------------ */
+#include "stdafx.h"
+
+#ifdef UNIX
+# ifndef _INCLUDE_POSIX_SOURCE
+# define _INCLUDE_POSIX_SOURCE
+# endif
+
+# ifndef _HPUX_SOURCE
+# define _HPUX_SOURCE
+# endif
+
+# include<stdio.h>
+# include<sys/time.h>
+# include<sys/types.h>
+# include<sys/vfs.h>
+# include<fcntl.h>
+# include<sys/stat.h>
+# include<errno.h>
+#endif
+
+#ifdef OS2
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+#endif
+
+#ifdef WIN32
+# include<windows.h>
+# include<sys/types.h>
+# include<sys/stat.h>
+# include<time.h>
+#endif
+
+#ifdef BORLAND
+# include<sys/stat.h>
+# include<time.h>
+#endif
+
+#ifdef LINUX
+# include <time.h>
+#endif
+
+#include "fyut.h"
+
+/*
+AR-921013
+CH UT_InqPathTid Finn oppdateringstid
+CD ==================================================================
+CD Formål:
+CD Henter oppdateringstidspunktet for gitt fil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Filnavn
+CD PFTID pFilTid u Oppdateringstid
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_InqPathTid(szPath,&FilTid);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_InqPathTid(char *pszPath,PFTID pFilTid)
+{
+#ifdef LINUX
+ struct stat buf;
+ struct tm *ntime;
+ int sStatus;
+ time_t temp;
+
+ /* Hent filopplysninger */
+ sStatus = stat(pszPath,&buf);
+
+ temp = buf.st_mtime;
+
+ ntime = localtime(&temp);
+
+ if (sStatus == 0) {
+ pFilTid->usAar = (unsigned short)ntime->tm_year;
+ pFilTid->usMnd = (unsigned short)ntime->tm_mon;
+ pFilTid->usDag = (unsigned short)ntime->tm_mday;
+ pFilTid->usTime = (unsigned short)ntime->tm_hour;
+ pFilTid->usMin = (unsigned short)ntime->tm_min;
+ pFilTid->usSek = (unsigned short)ntime->tm_sec;
+ }
+
+ return (short)sStatus;
+#else
+#ifdef UNIX
+ struct stat buf;
+ struct tm ntime;
+ int sStatus;
+ time_t temp;
+
+ /* Hent filopplysninger */
+ sStatus = stat(pszPath,&buf);
+
+ temp = buf.st_mtime;
+
+ localtime(&ntime,&temp);
+
+ if (sStatus == 0) {
+ pFilTid->usAar = (unsigned short)ntime.tm_year;
+ pFilTid->usMnd = (unsigned short)ntime.tm_mon;
+ pFilTid->usDag = (unsigned short)ntime.tm_mday;
+ pFilTid->usTime = (unsigned short)ntime.tm_hour;
+ pFilTid->usMin = (unsigned short)ntime.tm_min;
+ pFilTid->usSek = (unsigned short)ntime.tm_sec;
+ }
+
+ return (short)sStatus;
+#endif
+#endif /*not LINUX*/
+
+#ifdef OS232
+ APIRET rc;
+ FILESTATUS3 PathInfoBuf;
+
+ /* Hent filopplysninger */
+ rc = DosQueryPathInfo(pszPath,FIL_STANDARD,&PathInfoBuf,sizeof(FILESTATUS3));
+
+ if (rc == NO_ERROR) {
+ pFilTid->usAar = PathInfoBuf.fdateLastWrite.year;
+ pFilTid->usMnd = PathInfoBuf.fdateLastWrite.month;
+ pFilTid->usDag = PathInfoBuf.fdateLastWrite.day;
+ pFilTid->usTime = PathInfoBuf.ftimeLastWrite.hours;
+ pFilTid->usMin = PathInfoBuf.ftimeLastWrite.minutes;
+ pFilTid->usSek = PathInfoBuf.ftimeLastWrite.twosecs;
+ }
+
+ return (short)rc;
+#endif
+
+#ifdef OS216
+ int rc;
+ FILESTATUS2 PathInfoBuf;
+
+ /* Hent filopplysninger */
+ rc = DosQPathInfo(pszPath,FIL_STANDARD,(PBYTE)&PathInfoBuf,sizeof(FILESTATUS2),0);
+
+ if (rc == NO_ERROR) {
+ pFilTid->usAar = PathInfoBuf.fdateLastWrite.year;
+ pFilTid->usMnd = PathInfoBuf.fdateLastWrite.month;
+ pFilTid->usDag = PathInfoBuf.fdateLastWrite.day;
+ pFilTid->usTime = PathInfoBuf.ftimeLastWrite.hours;
+ pFilTid->usMin = PathInfoBuf.ftimeLastWrite.minutes;
+ pFilTid->usSek = PathInfoBuf.ftimeLastWrite.twosecs;
+ }
+
+ return (short)rc;
+#endif
+
+
+#ifdef WIN32
+ struct _stat32i64 buf;
+ struct tm ntime;
+ int sStatus;
+ time_t temp;
+
+ /* Hent filopplysninger */
+ sStatus = _stat32i64(pszPath,&buf);
+
+ /* Endringstidspunktet */
+ temp = buf.st_mtime;
+ /* Hvis filen ikke er endret brukes opprettelsestidspunktet */
+ if (temp == -1) temp = buf.st_ctime;
+
+ localtime_s(&ntime,&temp);
+
+ if (sStatus == 0) {
+ pFilTid->usAar = (unsigned short)ntime.tm_year;
+ pFilTid->usMnd = (unsigned short)ntime.tm_mon;
+ pFilTid->usDag = (unsigned short)ntime.tm_mday;
+ pFilTid->usTime = (unsigned short)ntime.tm_hour;
+ pFilTid->usMin = (unsigned short)ntime.tm_min;
+ pFilTid->usSek = (unsigned short)ntime.tm_sec;
+ }
+
+ return (short)sStatus;
+#endif
+
+#ifdef BORLAND
+ struct stat buf;
+ struct tm ntime;
+ int sStatus;
+ time_t temp;
+
+ /* Hent filopplysninger */
+ sStatus = stat(pszPath,&buf);
+
+ temp = buf.st_mtime;
+
+ localtime(&ntime,&temp);
+
+ if (sStatus == 0) {
+ pFilTid->usAar = (unsigned short)ntime.tm_year;
+ pFilTid->usMnd = (unsigned short)ntime.tm_mon;
+ pFilTid->usDag = (unsigned short)ntime.tm_mday;
+ pFilTid->usTime = (unsigned short)ntime.tm_hour;
+ pFilTid->usMin = (unsigned short)ntime.tm_min;
+ pFilTid->usSek = (unsigned short)ntime.tm_sec;
+ }
+
+ return (short)sStatus;
+#endif
+
+}
diff --git a/src/UT/LICENSE b/src/UT/LICENSE
new file mode 100644
index 0000000..642f5d5
--- /dev/null
+++ b/src/UT/LICENSE
@@ -0,0 +1,24 @@
+/******************************************************************************
+* STATENS KARTVERK - FYSAK
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
diff --git a/src/UT/MAKEPATH.cpp b/src/UT/MAKEPATH.cpp
new file mode 100644
index 0000000..7fb9628
--- /dev/null
+++ b/src/UT/MAKEPATH.cpp
@@ -0,0 +1,140 @@
+/*-----------------------------------------------------------------------*
+ * Fil - makepath.c
+ *
+ * funksjon
+ * UT_makepath - bygg opp filnavn
+ *-----------------------------------------------------------------------*/
+
+#include "stdafx.h"
+#include "fyut.h"
+
+#ifdef BORLAND
+# include <windows.h>
+#endif
+#ifdef WIN32
+# include <windows.h>
+#endif
+
+static char *_stpcpy(char *til, const char *fra);
+
+
+/*---------------------------------------------------------------------*
+
+Name UT_makepath - bygg opp filnavn
+
+Bruk #include <fyut.h>
+ void UT_makepath(char *path, const char * drive, const char * dir,
+ const char * name, const char * ext);
+
+Prototype i fyut.h
+
+Beskrivelse UT_makepath bygger opp et fullstendig filnavn ut fra dets deler.
+ Det nye filnavnet blir
+
+ X:\DIR\SUBDIR\NAME.EXT
+
+ hvor
+
+ X er drive
+ \DIR\SUBDIR\ er gitt av dir
+ NAME.EXT er gitt av name og ext
+
+ If the drive, dir, name, or ext parameters are null or empty,
+ they are not inserted in the path string. Otherwise, if
+ the drive doesn't end a colon, one is inserted in the path.
+ If the dir doesn't end in a slash, one is inserted in the
+ path. If the ext doesn't start with a dot, one is inserted
+ in the path.
+
+ The maximum sizes for the path string is given by the
+ constant _MAX_PATH (defined in stdlib.h), which includes space
+ for the null-terminator.
+
+ UT_splitpath and UT_makepath are invertible; if you split a given
+ path with UT_splitpath, then merge the resultant components
+ with UT_makepath, you end up with path.
+
+Return value None
+
+*---------------------------------------------------------------------*/
+
+
+/*
+AR-930423
+CH UT_makepath Slå sammen filnavn
+CD ==================================================================
+CD Formål:
+CD UT_makepath bygger opp et fullstendig filnavn ut fra dets deler.
+CD Det nye filnavnet blir: X:\DIR\SUBDIR\NAME.EXT
+CD hvor: X er drive
+CD \DIR\SUBDIR\ er gitt av dir
+CD NAME.EXT er gitt av name og ext
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD --------------------------------------------------------------
+CD char *pszPath u Komplett filnavn
+CD const char *pszDrive i Disk
+CD const char *pszDir i Katalog
+CD const char *pszNavn i Navn
+CD const char *pszExt i Extension
+CD
+CD Bruk: UT_makepath(szPath,szDrive,szDir,szNavn,szExt);
+ ==================================================================
+*/
+SK_EntPnt_UT void UT_makepath(char *pathP, const char *driveP, const char *dirP,
+ const char *nameP, const char *extP)
+{
+#ifdef UNIX
+ if (dirP && *dirP) {
+ if(*(dirP)!=UT_SLASH) {
+ *pathP++=UT_SLASH;
+ }
+ pathP = _stpcpy(pathP,dirP);
+ if (*(pathP-1) != '\\' && *(pathP-1) != '/') *pathP++ = UT_SLASH;
+ }
+
+ if (nameP) pathP = _stpcpy(pathP,nameP);
+
+ if (extP && *extP) {
+ if (*extP != '.') *pathP++ = '.';
+ pathP = _stpcpy(pathP,extP);
+ }
+
+ *pathP = '\0';
+
+#else
+
+ if (driveP && *driveP) {
+ *pathP++ = *driveP;
+ *pathP++ = ':';
+ }
+
+ if (dirP && *dirP) {
+ pathP = _stpcpy(pathP,dirP);
+ if (*(pathP-1) != '\\' && *(pathP-1) != '/') *pathP++ = UT_SLASH;
+ }
+
+ if (nameP) pathP = _stpcpy(pathP,nameP);
+
+ if (extP && *extP) {
+ if (*extP != '.') *pathP++ = '.';
+ pathP = _stpcpy(pathP,extP);
+ }
+
+ *pathP = '\0';
+#endif
+}
+
+
+//====================================================
+static char *_stpcpy(char *til, const char *fra)
+{
+ while (*fra) {
+ *til = *fra;
+ til++;
+ fra++;
+ } /* endwhile */
+
+ return til;
+}
diff --git a/src/UT/Makefile.am b/src/UT/Makefile.am
new file mode 100644
index 0000000..450aba0
--- /dev/null
+++ b/src/UT/Makefile.am
@@ -0,0 +1,11 @@
+AM_CPPFLAGS = --pedantic -Wno-long-long -Wall -O2 -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -Wno-write-strings
+ACLOCAL_AMFLAGS = -I m5
+
+lib_LTLIBRARIES = libfyut.la
+libfyut_la_SOURCES = ANFORSEL.cpp DELDIR.cpp FILNACMP.cpp INQTID.cpp UT1.cpp UT4.cpp CopyFile.cpp DELFILE.cpp MAKEPATH.cpp stdafx.cpp UT2.cpp CREDIR.cpp DISKINFO.cpp INQSIZE.cpp SETSIZE.cpp StrtPros.cpp UT3.cpp fyut.h stdafx.h FULLPATH.cpp SPLITPTH.cpp
+libfyut_la_LDFLAGS = -version-info 0:0:0
+
+library_includedir=$(includedir)/fyba
+library_include_HEADERS = fyut.h
+
+
diff --git a/src/UT/SETSIZE.cpp b/src/UT/SETSIZE.cpp
new file mode 100644
index 0000000..b65638e
--- /dev/null
+++ b/src/UT/SETSIZE.cpp
@@ -0,0 +1,210 @@
+/* ------------------------------
+ * Fil: SetSize.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+
+#ifdef LINUX
+# include <unistd.h>
+#endif
+
+#ifdef OS232
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+#endif
+
+#ifdef OS216
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+# include <io.h>
+#endif
+
+#ifdef WIN32
+# include <windows.h>
+# include <io.h>
+# include <Share.h>
+# include <fcntl.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <stdlib.h>
+#endif
+
+#ifdef BORLAND
+# include <fcntl.h>
+# include <sys/stat.h>
+#endif
+
+#include "fyut.h"
+
+/*
+AR-921013
+CH UT_SetPathSize Sett filstørrelse
+CD ==================================================================
+CD Formål:
+CD Setter filstørrelsen for gitt fil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Filnavn
+CD long lSize i Ønsket filstørrelse
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_SetPathSize(szPath,lSize);
+ ==================================================================
+*/
+
+SK_EntPnt_UT short UT_SetPathSize(char *pszPath,long lSize)
+{
+#ifdef UNIX
+ size_t filesize;
+
+ filesize = (size_t)lSize;
+ return (short) truncate(pszPath,filesize);
+#endif
+
+#ifdef OS232
+ APIRET rc;
+ HFILE FileHandle;
+ ULONG Action;
+
+ /* UT_FPRINTF(stderr,"SetPathSize: %s: %ld\n",pszPath,lSize); */
+
+ rc = DosOpen(pszPath, /* File path name */
+ &FileHandle, /* File handle */
+ &Action, /* Action taken */
+ 0, /* File primary allocation */
+ FILE_NORMAL, /* File attribute */
+ OPEN_ACTION_FAIL_IF_NEW | /* Open function type */
+ OPEN_ACTION_OPEN_IF_EXISTS,
+ OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE, /* Open mode of the file */
+ NULL); /* No extended attributes */
+
+ if (rc == NO_ERROR) {
+ rc = DosSetFileSize(FileHandle,(ULONG)lSize);
+ DosClose(FileHandle);
+ }
+
+ return (short)rc;
+#endif
+
+#ifdef OS216
+ int rc;
+ HFILE FileHandle;
+ USHORT Action;
+
+ rc = DosOpen(pszPath, /* File path name */
+ &FileHandle, /* File handle */
+ &Action, /* Action taken */
+ 0, /* File primary allocation */
+ FILE_NORMAL, /* File attribute */
+ OPEN_ACTION_FAIL_IF_NEW | /* Open function type */
+ OPEN_ACTION_OPEN_IF_EXISTS,
+ OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE, /* Open mode of the file */
+ 0L); /* No extended attributes */
+
+ if (rc == NO_ERROR) {
+ rc = chsize(FileHandle,lSize);
+ DosClose(FileHandle);
+ }
+
+ return (short)rc;
+#endif
+
+
+#ifdef WIN32
+ int fh,rc;
+
+ //fh = _open( pszPath, _O_RDWR | _O_BINARY | _O_RANDOM );
+ _sopen_s(&fh, pszPath, _O_RDWR | _O_BINARY | _O_RANDOM, _SH_DENYRW, _S_IREAD | _S_IWRITE);
+
+ if (fh != -1) {
+ rc = _chsize(fh,lSize);
+ _close(fh);
+
+ } else {
+ rc = fh;
+ }
+
+ return (short)rc;
+#endif
+
+#ifdef BORLAND
+ int fh,rc;
+
+
+ fh = open( pszPath, O_RDWR | O_BINARY);
+
+ if (fh != -1) {
+ rc = chsize(fh,lSize);
+ close(fh);
+
+ } else {
+ rc = fh;
+ }
+
+ return (short)rc;
+#endif
+}
+
+
+#ifdef WIN32
+/*
+AR-921013
+CH UT_SetPathSize_i64 Sett filstørrelse
+CD ==================================================================
+CD Formål:
+CD Setter filstørrelsen for gitt fil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD ------------------------------------------------------------------
+CD char *pszPath i Filnavn
+CD UT_INT64 n64Size i Ønsket filstørrelse
+CD short sStatus r Status; 0=OK, annen verdi er feil.
+CD
+CD Bruk: sStatus = UT_SetPathSize_i64(szPath,lSize);
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_SetPathSize_i64(char *pszPath, UT_INT64 n64Size)
+{
+ int fh,rc;
+
+ //fh = _open( pszPath, _O_RDWR | _O_BINARY | _O_RANDOM );
+ _sopen_s(&fh, pszPath, _O_RDWR | _O_BINARY | _O_RANDOM, _SH_DENYRW, _S_IREAD | _S_IWRITE);
+
+ // Åpnet OK
+ if (fh != -1)
+ {
+ rc = _chsize_s(fh,n64Size);
+
+ // _chsize_s returns the value 0 if the file size is successfully changed.
+ if (rc != 0)
+ {
+ char szError[256];
+ UT_strerror(szError,256,errno);
+ UT_FPRINTF(stderr,"(UT_SetPathSize_i64)Feil ved endring av filstørrelse (_chsize_s). (%s, Posisjon:%ld, Feil:%s)\n",pszPath,n64Size,szError);
+ }
+
+ _close(fh);
+ }
+
+ // Feil ved filåpning
+ else
+ {
+ char szError[256];
+ UT_strerror(szError,256,errno);
+ UT_FPRINTF(stderr,"(UT_SetPathSize_i64)Feil ved filåpning. (%s, Feil:%s)\n",pszPath,szError);
+ rc = fh;
+ }
+
+ return (short)rc;
+}
+#else
+SK_EntPnt_UT short UT_SetPathSize_i64(char *pszPath, UT_INT64 n64Size)
+{
+ return UT_SetPathSize(pszPath, n64Size);
+}
+#endif
diff --git a/src/UT/SPLITPTH.cpp b/src/UT/SPLITPTH.cpp
new file mode 100644
index 0000000..d6b76f8
--- /dev/null
+++ b/src/UT/SPLITPTH.cpp
@@ -0,0 +1,94 @@
+///////////////////////////////////////////////////////////////////////////////////
+// SPLITPATH.cpp
+// Functions
+// UT_splitpath - split a full path name
+//
+
+#include "stdafx.h"
+
+void UT_splitFN(char *filename, char* name, char* ext) {
+ char* lastDot = strrchr(filename, '.');
+ if(lastDot != NULL) {
+ UT_StrCopy(ext, lastDot, _MAX_EXT);
+ if(strlen(filename) > _MAX_EXT) {
+ name[_MAX_EXT-1] = '\0';
+ }
+ /* replace the posisiton of last dot in filename
+ with end-of-sting */
+ (*lastDot) = '\0';
+ } else {
+ (*ext) = '\0';
+ }
+ UT_StrCopy(name, filename, _MAX_FNAME);
+ if(strlen(filename) > _MAX_FNAME) {
+ name[_MAX_FNAME-1] = '\0';
+ }
+}
+
+/*
+CH UT_splitpath
+CD ==============================================================
+CD Splits a path into drive (X: for windows, "" for linux),
+CD directory, filename (w/o extension) and extension.
+CD
+CD Parameters:
+CD Type Name I/O Explanation
+CD -------------------------------------------------------------
+CD const char *pathP i Path to split
+CD char *driveP o Drive-part of path
+CD char *dirP o Directory-part
+CD char *nameP o Filename w/o extension
+CD char *extP o extension
+CD ==============================================================
+*/
+SK_EntPnt_UT void UT_splitpath(const char *pathP, char *driveP, char *dirP, char *nameP, char *extP) {
+ char local_path[_MAX_PATH]; /* Copy of pathP i case we modify it */
+ char tmp[_MAX_PATH]; /* Copy of pathP i case we modify it */
+ //char filename[_MAX_PATH];
+ (*driveP) = (*dirP) = (*nameP) = (*extP) = '\0';
+
+ UT_StrCopy(local_path, pathP, _MAX_PATH);
+ UT_StrCopy(tmp, local_path, _MAX_PATH);
+ /* Under linux, driveP is always \0 */
+ #ifdef WIN32
+ /* Afaik, there is only ONE : in windows filenames */
+ char* theColon = strrchr(tmp, ':');
+ if(theColon != NULL) {
+ /* We overwrite local_path here, because after this the code
+ is equal for win/lin if the drive-part is removed */
+ UT_StrCopy(local_path, theColon+1, _MAX_PATH);
+ (*(theColon + 1)) = '\0'; // set a \0 after the color (inside tmp!)
+ UT_StrCopy(driveP, tmp, _MAX_DRIVE);
+ if (strlen(tmp) > _MAX_DRIVE) { // how would this even happen?
+ driveP[_MAX_DRIVE-1] = '\0';
+ }
+ }
+ #endif
+
+ UT_StrCopy(tmp, local_path, _MAX_PATH);
+
+ char* lastSlash = strrchr(tmp, UT_SLASH);
+
+ /* Set dirP */
+ if(lastSlash != NULL) {
+ /* +1 because we don't want the / in the filename */
+ char filename[_MAX_PATH]; /* UT_splitFN might modify filename */
+ UT_StrCopy(filename,lastSlash+1, _MAX_PATH);
+ if (strcmp(filename, ".") != 0) {
+ UT_splitFN(filename, nameP, extP);
+ (*(tmp + (lastSlash - tmp + 1))) = '\0';
+ }
+ UT_StrCopy(dirP, tmp, _MAX_DIR);
+ // No null-character is implicitly appended at the end of destination if source is longer than num.
+ if (strlen(tmp) > _MAX_DIR) {
+ dirP[_MAX_DIR-1] = '\0';
+ }
+ } else {
+ if (strcmp(".", local_path) == 0) { /* Hard-coded to mimic old behaviour */
+ UT_StrCopy(dirP, ".", _MAX_DIR);
+ } else {
+ UT_splitFN(tmp, nameP, extP);
+ }
+ }
+}
+
diff --git a/src/UT/StrtPros.cpp b/src/UT/StrtPros.cpp
new file mode 100644
index 0000000..e348918
--- /dev/null
+++ b/src/UT/StrtPros.cpp
@@ -0,0 +1,122 @@
+/* ------------------------------
+ * Fil: StrtPros.c
+ * ------------------------------ */
+
+#include "stdafx.h"
+
+#ifdef UNIX
+# ifndef _INCLUDE_POSIX_SOURCE
+# define _INCLUDE_POSIX_SOURCE
+# endif
+# ifndef _HPUX_SOURCE
+# define _HPUX_SOURCE
+# endif
+#endif
+
+#ifdef OS2
+#endif
+
+#ifdef WIN32
+# include<windows.h>
+#endif
+
+#ifdef BORLAND
+#endif
+
+#include "fyut.h"
+
+
+/*
+AR-961118
+CH UT_StartProsess
+CD ==============================================================
+CD Formål:
+CD Starter en ny prosess.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD -------------------------------------------------------------
+CD char *pszCommandLine i Kommandolinje
+CD short sVent i UT_VENT = Vent til prosessen avsluttes
+CD UT_FORTSETT = Ikke vent
+CD short sStatus r Status:
+CD UT_TRUE = OK
+CD UT_FALSE = Feil.
+CD
+CD
+CD Bruk:
+CD sStatus = UT_StartProsess(szKommandolinje,UT_VENT);
+CD
+CD ==============================================================
+*/
+SK_EntPnt_UT short UT_StartProsess(char *pszCommandLine,short sVent)
+{
+
+#ifdef WIN32
+ PROCESS_INFORMATION ProcessInfo;
+ STARTUPINFO StartupInfo;
+ DWORD ExitCode = 0;
+ //char szCurrentDir[_MAX_PATH];
+ //char szShortPath[100];
+
+
+ // Setter opp oppstartinformasjon
+ StartupInfo.cb = sizeof(STARTUPINFO);
+ StartupInfo.lpDesktop = NULL;
+ StartupInfo.lpTitle = NULL;
+ StartupInfo.cbReserved2 = 0;
+ StartupInfo.lpReserved = NULL;
+ StartupInfo.lpReserved2 = NULL;
+ StartupInfo.dwFlags = 0;
+ // STARTF_USESTDHANDLES If this value is specified, sets the standard input of the process, standard output,
+ // and standard error handles to the handles specified in the hStdInput, hStdOutput,
+ // and hStdError members of the STARTUPINFO structure. The CreateProcess function's fInheritHandles
+ // parameter must be set to TRUE for this to work properly.
+ // If this value is not specified, the hStdInput, hStdOutput, and hStdError members of the STARTUPINFO
+ // structure are ignored.
+
+ //StartupInfo.dwX;
+ //StartupInfo.dwY;
+ //StartupInfo.dwXSize;
+ //StartupInfo.dwYSize;
+ //StartupInfo.dwXCountChars;
+ //StartupInfo.dwYCountChars;
+ //StartupInfo.dwFillAttribute;
+ //StartupInfo.wShowWindow;
+ //StartupInfo.hStdInput;
+ //StartupInfo.hStdOutput;
+ //StartupInfo.hStdError;
+
+
+ //GetCurrentDirectory(_MAX_PATH,szCurrentDir);
+ //GetShortPathName(szCurrentDir,szShortPath,100);
+
+ // Utfører system-kommando
+ if ( ! CreateProcess(NULL, pszCommandLine, NULL, NULL, FALSE,
+ NORMAL_PRIORITY_CLASS ,
+ //CREATE_NEW_CONSOLE
+ //CREATE_NEW_PROCESS_GROUP
+ //CREATE_SEPARATE_WOW_VDM
+ //CREATE_SHARED_WOW_VDM
+ NULL, NULL, &StartupInfo, &ProcessInfo)) {
+ return UT_FALSE;
+ }
+
+ // Vent til prosessen er ferdig
+ if (sVent == UT_VENT) {
+ WaitForSingleObject( ProcessInfo.hProcess, INFINITE);
+
+ //Retrieves the termination status of the specified process.
+ GetExitCodeProcess(ProcessInfo.hProcess, &ExitCode);
+ }
+
+ CloseHandle(ProcessInfo.hProcess);
+ CloseHandle(ProcessInfo.hThread);
+
+ return (ExitCode == 0)? UT_TRUE:UT_FALSE;
+
+#else
+
+ return UT_FALSE;
+#endif
+}
diff --git a/src/UT/UT.sln b/src/UT/UT.sln
new file mode 100644
index 0000000..5b37d85
--- /dev/null
+++ b/src/UT/UT.sln
@@ -0,0 +1,29 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Express 2012 for Windows Desktop
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UT", "UT.vcxproj", "{29669F36-408E-4FE2-B7A2-329A4185CF50}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ SosiVis Debug|Win32 = SosiVis Debug|Win32
+ SosiVis Release|Win32 = SosiVis Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {29669F36-408E-4FE2-B7A2-329A4185CF50}.Debug|Win32.ActiveCfg = Debug|Win32
+ {29669F36-408E-4FE2-B7A2-329A4185CF50}.Debug|Win32.Build.0 = Debug|Win32
+ {29669F36-408E-4FE2-B7A2-329A4185CF50}.Release|Win32.ActiveCfg = Release|Win32
+ {29669F36-408E-4FE2-B7A2-329A4185CF50}.Release|Win32.Build.0 = Release|Win32
+ {29669F36-408E-4FE2-B7A2-329A4185CF50}.SosiVis Debug|Win32.ActiveCfg = SosiVis Debug|Win32
+ {29669F36-408E-4FE2-B7A2-329A4185CF50}.SosiVis Debug|Win32.Build.0 = SosiVis Debug|Win32
+ {29669F36-408E-4FE2-B7A2-329A4185CF50}.SosiVis Release|Win32.ActiveCfg = SosiVis Release|Win32
+ {29669F36-408E-4FE2-B7A2-329A4185CF50}.SosiVis Release|Win32.Build.0 = SosiVis Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(DPCodeReviewSolutionGUID) = preSolution
+ DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
+ EndGlobalSection
+EndGlobal
diff --git a/src/UT/UT.vcxproj b/src/UT/UT.vcxproj
new file mode 100644
index 0000000..1d0316d
--- /dev/null
+++ b/src/UT/UT.vcxproj
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="SosiVis Debug|Win32">
+ <Configuration>SosiVis Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="SosiVis Release|Win32">
+ <Configuration>SosiVis Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{29669F36-408E-4FE2-B7A2-329A4185CF50}</ProjectGuid>
+ <RootNamespace>UT</RootNamespace>
+ <SccProjectName>
+ </SccProjectName>
+ <SccAuxPath>
+ </SccAuxPath>
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccProvider>
+ </SccProvider>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>NotSet</CharacterSet>
+ <WholeProgramOptimization>false</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>NotSet</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>11.0.50727.1</_ProjectFileVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Lib>
+ <OutputFile>$(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <PostBuildEvent>
+ <Command>copy $(TargetPath) ..\..\Lib\$(ProjectName)D$(TargetExt)</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat />
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Lib>
+ <OutputFile>$(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <PostBuildEvent>
+ <Command>copy $(TargetPath) ..\..\Lib\$(ProjectName)$(TargetExt)</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat />
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Lib>
+ <OutputFile>$(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <PostBuildEvent>
+ <Command>copy $(TargetPath) ..\..\Lib\$(ProjectName)$(TargetExt)</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <AdditionalOptions> /J</AdditionalOptions>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <AdditionalIncludeDirectories>..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Lib>
+ <OutputFile>$(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <PostBuildEvent>
+ <Command>copy $(TargetPath) ..\..\Lib\$(ProjectName)D$(TargetExt)</Command>
+ </PostBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="ANFORSEL.cpp" />
+ <ClCompile Include="CopyFile.cpp" />
+ <ClCompile Include="CREDIR.cpp" />
+ <ClCompile Include="DELDIR.cpp" />
+ <ClCompile Include="DELFILE.cpp" />
+ <ClCompile Include="DISKINFO.cpp" />
+ <ClCompile Include="FILNACMP.cpp" />
+ <ClCompile Include="FULLPATH.cpp" />
+ <ClCompile Include="INQSIZE.cpp" />
+ <ClCompile Include="INQTID.cpp" />
+ <ClCompile Include="MAKEPATH.cpp" />
+ <ClCompile Include="SETSIZE.cpp" />
+ <ClCompile Include="SPLITPTH.cpp" />
+ <ClCompile Include="stdafx.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">Create</PrecompiledHeader>
+ </ClCompile>
+ <ClCompile Include="StrtPros.cpp" />
+ <ClCompile Include="UT1.cpp" />
+ <ClCompile Include="UT2.cpp" />
+ <ClCompile Include="UT3.cpp" />
+ <ClCompile Include="UT4.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="stdafx.h" />
+ <CustomBuild Include=".\fyut.h">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) ..\..\Include\*.*</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) ..\..\Include\*.*</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">copy %(FullPath) ..\..\Include\*.*</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='SosiVis Debug|Win32'">\..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">copy %(FullPath) ..\..\Include\*.*</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='SosiVis Release|Win32'">..\..\Include\%(Filename)%(Extension);%(Outputs)</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <Text Include="ReadMe.txt" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+ <ProjectExtensions>
+ <VisualStudio>
+ <UserProperties DevPartner_IsInstrumented="0" />
+ </VisualStudio>
+ </ProjectExtensions>
+</Project> \ No newline at end of file
diff --git a/src/UT/UT1.cpp b/src/UT/UT1.cpp
new file mode 100644
index 0000000..ccd17a4
--- /dev/null
+++ b/src/UT/UT1.cpp
@@ -0,0 +1,817 @@
+/***************************************************************************
+* *
+* Hjelpebiblioteket U T (Utilities) *
+* Georg Langerak, Statens Kartverk / FYSAK-prosjektet, januar 1989 *
+* Fil: UT1.C : Filhandtering *
+* *
+****************************************************************************/
+
+/*
+CH UT1 Leser-på-Disk
+CD ==================================================================
+CD Rutiner for å åpne, posisjonere og lese/skrive på filer åpnet
+CD for binær les/skriv som stream.
+CD ==================================================================
+CD
+CH INSTALLERINGS- OG BRUKS-OPPLYSNINGER:
+CD
+CD Bibliotek..: UTLE.LIB
+CD Kildefiler.: UT1.C + fyut.h
+CD Versjon....: E00
+CD Eier.......: STATENS KARTVERK / FYSAK-prosjektet
+CD Ansvarlig..: Georg Langerak / Andreas Røstad
+CD
+CD #include...: fyut.h
+CD ==================================================================
+*/
+
+#include "stdafx.h"
+
+#ifdef OS2
+# define INCL_DOSFILEMGR
+# define INCL_DOSERRORS
+# include <os2.h>
+#endif
+
+#ifdef UNIX
+# ifndef _INCLUDE_POSIX_SOURCE
+# define _INCLUDE_POSIX_SOURCE
+# endif
+# ifndef _HPUX_SOURCE
+# define _HPUX_SOURCE
+# endif
+# include<sys/stat.h>
+#endif
+
+#ifdef LINUX /*This is just a quick fix. The two parameter versions of these are just not portable.*/
+# define strcpy_s strcpy
+# define strcat_s strcat
+#endif
+
+#ifdef WIN32
+# include <sys/stat.h>
+#endif
+
+#ifdef BORLAND
+# include <sys/stat.h>
+#endif
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#ifndef LINUX
+ #include <share.h>
+#endif
+
+#include "fyut.h"
+
+/*******************************************************************************
+* *
+* RUTINER FOR VERSJONSKONTROLL *
+* *
+*******************************************************************************/
+
+/*
+GL-890215
+AR-911006
+CH UT_OpenFile Åpner og sjekker fil
+CD ==========================================================================
+CD Bruk:
+CD fp = UT_OpenFile("TULLFILA","DAT",READ,OLD,&ierr);
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD const char *fnam i Filnavn inkl. type (Max 46 tegn inkl. '\0')
+CD const char *ftyp i Filtype (extention) (Max 4 tegn inkl. '\0')
+CD short facc i Aksess (0=UT_READ,1=UT_WRITE,2=UT_UPDATE)
+CD short exist i Åpningstatus (0=UT_UNKNOWN,1=UT_OLD,2=UT_NEW)
+CD short &ierr u (UT_OK,UT_ERROR eller skriv printf(strerror(ierr));
+CD FILE filpeker r filpeker.
+CD
+CD Formål:
+CD Åpner en fil med angitt aksess og åpningstatus.
+CD returnerer status som kan benyttes videre eller utskrives
+ ==========================================================================
+*/
+SK_EntPnt_UT FILE *UT_OpenFile(const char *filnavn,const char *ftyp,short facc,short exist,short *ierr)
+{
+ FILE *fp;
+ char mode[4];
+ char drive[_MAX_DRIVE],dir[_MAX_DIR],fname[_MAX_FNAME],ext[_MAX_EXT];
+ char path[_MAX_PATH];
+ int filslutt = 0;
+
+# ifdef OS232
+ FILESTATUS3 PathInfoBuf;
+ APIRET rc;
+# endif
+
+# ifdef OS216
+ FILESTATUS PathInfoBuf;
+ int rc;
+# endif
+
+# ifdef UNIX
+ struct stat buf;
+ int status;
+# endif
+
+#ifdef WIN32
+ //struct _stat buf;
+ struct _stat32i64 buf32i64;
+ int status;
+#endif
+
+#ifdef BORLAND
+ struct stat buf;
+ int status;
+#endif
+
+ /* Lag fullstendig filnavn */
+ UT_FullPath(path,filnavn,_MAX_PATH);
+
+ /* Splitt filnavnet */
+ UT_splitpath(path,drive,dir,fname,ext);
+
+ /* Ikke gitt filtype */
+ if (*ext == '\0') {
+ if (ftyp != NULL) {
+ if (*ftyp != '\0') {
+ strcpy_s(ext,".");
+ strcat_s(ext,ftyp);
+ }
+ }
+ }
+
+ /* Bygg opp filnavnet igjen */
+ UT_makepath(path,drive,dir,fname,ext);
+
+ mode[0] = '\0';
+
+ /* UT_FPRINTF(stderr,"\nFilnavn \"%s\"\n",path); */
+
+ /* Hent filopplysninger */
+# ifdef OS232
+ rc = DosQueryPathInfo(path,FIL_STANDARD,&PathInfoBuf,sizeof(FILESTATUS3));
+ /* UT_FPRINTF(stderr,"Fra DosQeryPathInfo rc = %d\n",rc); */
+# endif
+# ifdef OS216
+ rc = DosQPathInfo(path,FIL_STANDARD,(PBYTE)&PathInfoBuf,sizeof(FILESTATUS),0);
+# endif
+# ifdef UNIX
+ status = stat(path,&buf);
+# endif
+# ifdef WIN32
+ //status = _stat(path,&buf);
+ status = _stat32i64(path,&buf32i64);
+ /*
+ if (status == -1){
+ char szError[256];
+ UT_strerror(szError,256,errno);
+ szError[255] = '\0';
+ }
+ */
+
+# endif
+
+# ifdef BORLAND
+ status = stat(path,&buf);
+# endif
+
+
+ /* Setter sammen flagg for åpningsmodus */
+ if (facc == UT_READ && exist == UT_UNKNOWN) {
+ /* Hvis filen IKKE eksisterer */
+# ifdef OS2
+ if (rc == ERROR_FILE_NOT_FOUND) {
+# endif
+# ifdef UNIX
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef WIN32
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef BORLAND
+ if (status == -1 && errno == ENOENT) {
+# endif
+ strcpy_s(mode,"wb+");
+ } else { /* Filen finnes fra før */
+ strcpy_s(mode,"rb");
+ }
+ } else if (facc == UT_READ && exist == UT_OLD) {
+ /* Filen finnes ikke */
+
+# ifdef OS2
+ if (rc == ERROR_FILE_NOT_FOUND) {
+# endif
+# ifdef UNIX
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef WIN32
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef BORLAND
+ if (status == -1 && errno == ENOENT) {
+# endif
+ *ierr = ENOENT;
+ return (NULL); /* ===> RETUR */
+ }
+
+ strcpy_s(mode,"rb");
+
+ } else if (facc == UT_READ && exist == UT_NEW) {
+ /* Sjekk at filen IKKE eksisterer */
+# ifdef OS2
+ if (rc == ERROR_FILE_NOT_FOUND) {
+# endif
+# ifdef UNIX
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef WIN32
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef BORLAND
+ if (status == -1 && errno == ENOENT) {
+# endif
+ strcpy_s(mode,"wb+");
+ } else {
+ *ierr = EEXIST;
+ return (NULL); /* ===> RETUR */
+ }
+
+ } else if (facc == UT_WRITE && exist == UT_UNKNOWN) {
+ strcpy_s(mode,"wb+");
+
+ } else if (facc == UT_WRITE && exist == UT_OLD) {
+ /* Filen finnes ikke */
+# ifdef OS2
+ if (rc == ERROR_FILE_NOT_FOUND) {
+# endif
+# ifdef UNIX
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef WIN32
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef BORLAND
+ if (status == -1 && errno == ENOENT) {
+# endif
+ *ierr = ENOENT;
+ return (NULL); /* ===> RETUR */
+ }
+
+ /* Hvis filen er OK */
+# ifdef OS2
+ if (rc == NO_ERROR) {
+# endif
+# ifdef UNIX
+ if (status == 0) {
+# endif
+# ifdef WIN32
+ if (status == 0) {
+# endif
+# ifdef BORLAND
+ if (status == 0) {
+# endif
+ strcpy_s(mode,"wb+");
+ }
+
+ } else if (facc == UT_WRITE && exist == UT_NEW) {
+ /* Sjekk at filen IKKE eksisterer */
+# ifdef OS2
+ if (rc == ERROR_FILE_NOT_FOUND) {
+# endif
+# ifdef UNIX
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef WIN32
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef BORLAND
+ if (status == -1 && errno == ENOENT) {
+# endif
+ strcpy_s(mode,"wb+");
+ }
+
+ } else if (facc == UT_UPDATE && exist == UT_UNKNOWN) {
+ /* Hvis filen IKKE eksisterer */
+# ifdef OS2
+ if (rc == ERROR_FILE_NOT_FOUND) {
+# endif
+# ifdef UNIX
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef WIN32
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef BORLAND
+ if (status == -1 && errno == ENOENT) {
+# endif
+ strcpy_s(mode,"wb+");
+
+ } else { /* Filen finnes fra før */
+ strcpy_s(mode,"rb+");
+ filslutt=1;
+ }
+
+ } else if (facc == UT_UPDATE && exist == UT_OLD) {
+ /* Filen finnes ikke */
+# ifdef OS2
+ if (rc == ERROR_FILE_NOT_FOUND) {
+# endif
+# ifdef UNIX
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef WIN32
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef BORLAND
+ if (status == -1 && errno == ENOENT) {
+# endif
+ *ierr = ENOENT;
+ return (NULL); /* ===> RETUR */
+ }
+
+ strcpy_s(mode,"rb+");
+ filslutt=1;
+
+ } else if (facc == UT_UPDATE && exist == UT_NEW) {
+ /* Sjekk at filen IKKE eksisterer */
+# ifdef OS2
+ if (rc == ERROR_FILE_NOT_FOUND) {
+# endif
+# ifdef UNIX
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef WIN32
+ if (status == -1 && errno == ENOENT) {
+# endif
+# ifdef BORLAND
+ if (status == -1 && errno == ENOENT) {
+# endif
+ strcpy_s(mode,"wb+");
+ }
+
+ } else { /* Ugyldig kombinasjon */
+ *ierr=UT_ERROR;
+ return(NULL);
+ }
+
+/*
+_SH_COMPAT : Sets compatibility mode
+_SH_DENYRW : Denies read and write access to file
+_SH_DENYWR : Denies write access to file
+_SH_DENYRD : Denies read access to file
+_SH_DENYNO : Permits read and write access
+_SH_SECURE : Sets secure mode (shared read, exclusive write access).
+*/
+
+
+ // ----- Selve filåpningen
+ if (mode[0] != '\0') {
+#ifdef UNIX
+ fp = fopen(path,mode);
+#else
+ if (mode[0] == 'w' || mode[2] == '+')
+ {
+ fp = _fsopen(path,mode,_SH_DENYWR); // Sperrer mot at andre åpner filen for skriving, godtar lesing
+ }
+ else
+ {
+ fp = _fsopen(path,mode,_SH_DENYNO);
+ }
+#endif
+
+
+ if (fp == NULL)
+ {
+ *ierr = errno;
+ }
+
+ else
+ {
+ *ierr =UT_OK;
+ if (filslutt)
+ {
+ // Posisjoner på slutten av filen
+# ifdef OS2
+ UT_SetPos(fp,(long)PathInfoBuf.cbFile);
+# endif
+# ifdef UNIX
+ UT_SetPos(fp,(long)buf.st_size);
+# endif
+# ifdef WIN32
+ UT_SetPos_i64(fp,buf32i64.st_size);
+# endif
+# ifdef BORLAND
+ UT_SetPos(fp,(long)buf.st_size);
+# endif
+ }
+ }
+
+ /* UT_FPRINTF(stderr,"Ierr: %d\n",*ierr); */
+ /* UT_FPRINTF(stderr,strerror(*ierr)); */
+ }
+
+ else
+ {
+ *ierr = UT_ERROR;
+ return (NULL);
+ }
+
+ if (*ierr != UT_OK) fp=NULL;
+
+ return fp;
+}
+
+
+/*
+GL-890105
+CH UT_ReadLineCrlf Leser en linje inkl cl/lf
+CD ==================================================================
+CD Formål......: Leser en linje inkl. Crlf fra current posisjon.
+CD
+CD Aktivisering: ist = UT_ReadLineCrlf(fil,llin,clin);
+CD
+CD Retur-verdier: short UT_OK - Lesing er ok
+CD short UT_EOF - Du har lest End Of File
+CD short UT_ERROR - Du har fått feil ved lesingen
+CD
+CD PARAMETERLISTE:
+CD Navn Type i/U Merknad
+CD --------------------------------------------------------------
+CD pfil FILE i Peker til filstruktur (def i stdio.h)
+CD llin short i Max lengde på clin inkl (\r\n\0)
+CD clin *char u Streng les. Må være 3 større enn behov.
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_ReadLineCrlf(FILE *pfil,short llin, char *clin)
+{
+#ifdef UTGAAR
+ short ierr = UT_OK;
+
+ if (fgets(clin,llin,pfil) == NULL) {
+ if (feof(pfil)) ierr = UT_EOF;
+ else if (ferror(pfil)) ierr = UT_ERROR;
+ }
+ if ((int)*clin == 26) ierr = UT_EOF; /* LS-890928 */
+ return (ierr);
+#endif
+
+
+ char *cp = clin;
+ char *siste = clin + llin - 1;
+ short ierr = UT_OK;
+ int c;
+
+ while (cp < siste) {
+ c = getc(pfil);
+ if (c == EOF) {
+ if (feof(pfil)) {
+ if (cp == clin) ierr = UT_EOF;
+ } else if (ferror(pfil)) {
+ ierr = UT_ERROR;
+ }
+ break;
+
+ } else if (c == '\n') {
+ *cp = c;
+ cp++;
+ break;
+
+ } else if (c == '\0') {
+ *cp = ' ';
+
+ } else {
+ *cp = c;
+ }
+
+ cp++;
+ }
+
+ *cp = '\0';
+
+ if ((int)*clin == 26) ierr = UT_EOF; /* LS-890928 */
+
+
+ return (ierr);
+}
+
+
+/*
+GL-890105
+CH UT_ReadLine Leser en linje og fjerner crlf
+CD ==================================================================
+CD Aktivisering: ist = UT_ReadLine(fil,llin,clin);
+CD
+CD Retur-verdier: short UT_OK - Lesing er ok
+CD short UT_EOF - Du har lest End Of File
+CD short UT_ERROR - Du har fått feil ved lesingen
+CD
+CD PARAMETERLISTE:
+CD Navn Type i/U Merknad
+CD -----------------------------------------------------------
+CD pfil FILE i Peker til filstruktur (def i stdio.h)
+CD llin short i Max lengde på clin inkl '\0'
+CD clin *char u Streng lest. Må være 3 større enn faktisk.
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_ReadLine(FILE *pfil,short llin, char *clin)
+{
+#ifdef UTGAAR
+ short ierr = UT_OK;
+ size_t len;
+ /* Leser en linje */
+ if (fgets(clin,llin,pfil) == NULL) {
+ if (feof(pfil)) ierr = UT_EOF;
+ else ierr = UT_ERROR;
+ }
+ if ((int)*clin == 26) ierr = UT_EOF; /* LS-890928 */
+ /* Fjerner Crlf */
+ len = strlen(clin);
+ if (len > 1) {
+ if (clin[len-2] == '\r') clin[len-2]=clin[len-1]='\0'; /* crlf */
+ else if (clin[len-1] == '\n') clin[len-1]='\0'; /* lf */
+ }
+ return (ierr);
+#endif
+
+
+ char *cp = clin;
+ char *siste = clin + llin - 1;
+ short ierr = UT_OK;
+ int c;
+
+ while (cp < siste) {
+ c = getc(pfil);
+ if (c == EOF) {
+ if (feof(pfil)) {
+ if (cp == clin) ierr = UT_EOF;
+ } else if (ferror(pfil)) {
+ ierr = UT_ERROR;
+ }
+ break;
+
+ } else if (c == '\n') {
+ *cp = c;
+ cp++;
+ break;
+
+ } else if (c == '\0') {
+ *cp = ' ';
+
+ } else {
+ *cp = c;
+ }
+
+ cp++;
+ }
+
+ *cp = '\0';
+
+ if ((int)*clin == 26) ierr = UT_EOF; /* LS-890928 */
+
+
+ /* Fjerner Crlf */
+ if (cp-clin > 1) {
+ if (*(cp-2) == '\r') {
+ *(cp-2) = *(cp-1) = '\0'; /* crlf */
+ } else if (*(cp-1) == '\n') {
+ *(cp-1) = '\0'; /* lf */
+ }
+ }
+
+ return (ierr);
+}
+
+
+/*
+GL-890308
+CH UT_ReadLineNoComm Leser linjer og fjerner kommentarer
+CD ==================================================================
+CD Aktivisering : ist = UT_ReadLineNoComm(fil,llin,clin);
+CD
+CD Retur-verdier: short UT_OK - Lesing er ok
+CD short UT_EOF - Du har lest End Of File
+CD short UT_ERROR - Du har fått feil ved lesingen
+CD
+CD PARAMETERLISTE:
+CD Type Navn i/U Merknad
+CD ------------------------------------------------------------------
+CD FILE fi i Peker til filstruktur (def i stdio.h)
+CD short llin i Max lengde på clin inkl \r\n\0.(cr+lf)
+CD char *clin u Streng lest. (Uten \r\n. (cr+lf))
+CD
+CD Formål:
+CD Leser en linje fra filen, og fjerner CrLf. Hvis linjen er blank
+CD eller første "ikke-blanke-tegn" er utropstegn leses påfølgende linje(r).
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_ReadLineNoComm(FILE *pfil,short llin, char *clin)
+{
+ short ierr;
+ register char *cp=NULL;
+
+ do{
+ ierr = UT_ReadLine(pfil,llin,clin);
+ if (ierr == UT_OK){
+ for (cp=clin; UT_IsSpace(*cp) && *cp; cp++){
+ ;
+ }
+ }
+ } while (ierr == UT_OK && (!*cp || *cp=='!'));
+
+ /* Fjern blanke på slutten */
+ if (ierr == UT_OK) {
+ UT_ClrTrailsp(clin);
+ }
+
+ return (ierr);
+}
+
+
+/*
+GL-890107
+CH UT_WriteLineCrlf Skriver en linje incl crlf
+CD ==================================================================
+CD Formål......: Skriver en linje som alt HAR Crlf på slutten .
+CD
+CD Aktivisering: ist = UT_WriteLineCrlf(fil,clin);
+CD
+CD Retur-verdier: short UT_OK - Lesing er ok
+CD short UT_ERROR - Du har fått feil ved lesingen
+CD
+CD PARAMETERLISTE:
+CD Navn Type i/U Merknad
+CD --------------------------------------------
+CD pfil FILE i Peker til filstruktur (def i stdio.h)
+CD clin char[] i Streng som skal skrives (må ha \r\n\0 )
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_WriteLineCrlf(FILE *pfil,char clin[])
+{
+ fputs(clin,pfil);
+ if (ferror(pfil)) return UT_ERROR;
+ return UT_OK;
+}
+
+
+/*
+GL-890107
+CH UT_WriteLine Skriver en linje uten crlf
+CD ==================================================================
+CD Formål......: Skriver en linje og legger på Crlf etterpå .
+CD
+CD Aktivisering: ist = UT_WriteLine(fil,clin);
+CD
+CD Retur-verdier: short UT_OK - Lesing er ok
+CD short UT_ERROR - Du har fått feil ved lesingen
+CD
+CD PARAMETERLISTE:
+CD Navn Type i/U Merknad
+CD --------------------------------------------
+CD pfil FILE i Peker til filstruktur (def i stdio.h)
+CD clin char[] i Streng som skal skrives.
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_WriteLine(FILE *pfil,char clin[])
+{
+ fputs(clin,pfil);
+ fputs("\r\n",pfil);
+ if (ferror(pfil)) return(UT_ERROR);
+ return(UT_OK);
+}
+
+
+/*
+GL-880809
+CH UT_Save Berger diskbuffer ut på disk.
+CD ==================================================================
+CD Formål......: Sikre at at operativsystemets filbuffer
+CD blir disklagret. (Sikre mot strømstans etc.)
+CD
+CD Aktivisering: UT_Save(fil);
+CD
+CD Retur-verdier: short UT_OK - Lesing er ok
+CD short UT_ERROR - Du har fått feil ved flushingen
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array i/U Merknad
+CD ------------------------------------------------------------------
+CD pfil FILE i Peker til filstruktur (def i stdio.h)
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_Save (FILE *pfil)
+{
+ if (fflush(pfil) == EOF) return (UT_ERROR);
+
+ return(UT_OK);
+}
+
+
+/*
+GL-871127
+CH UT_SetPos Sette current filposisjon
+CD ==================================================================
+CD Formål......: Setter filposisjon hvor det skal begynnes å lese fra
+CD
+CD Aktivisering: ist = UT_SetPos(fil,lpos);
+CD
+CD Retur-verdier: short UT_OK - Lesing er ok
+CD short UT_ERROR - Du har fått feil.
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array i/U Merknad
+CD ------------------------------------------------------------------
+CD pfil FILE i Peker til filstruktur (def i stdio.h)
+CD lpos long i Fil-posisjon
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_SetPos (FILE *fi,long lpos)
+{
+ if (fseek(fi,lpos,SEEK_SET)) return (UT_ERROR);
+ return(UT_OK);
+}
+
+
+/*
+CH UT_SetPos_i64 Sette current filposisjon
+CD ==================================================================
+CD Formål......: Setter filposisjon hvor det skal begynnes å lese fra
+CD
+CD Aktivisering: ist = UT_SetPos_i64(fil,pos);
+CD
+CD Retur-verdier: short UT_OK - Utført OK.
+CD short UT_ERROR - Du har fått feil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn i/U Merknad
+CD ------------------------------------------------------------------
+CD FILE pfil i Peker til filstruktur (def i stdio.h)
+CD UT_INT64 n64FilPos i Fil-posisjon
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_SetPos_i64 (FILE *fi,UT_INT64 n64FilPos)
+{
+ if (_fseeki64(fi,n64FilPos,SEEK_SET)) return (UT_ERROR);
+ return(UT_OK);
+}
+
+
+/*
+GL-871127
+CH UT_GetPos Finner neste filposisjon
+CD ==================================================================
+CD Formål......: Finner NESTE posisjon på filen.
+CD Dette vil bli neste linje etter UT_Readxxx og,
+CD UT_Writexxxx.
+CD
+CD Aktivisering: ist = UT_GetPos(fil,&lpos);
+CD
+CD Retur-verdier: short UT_OK - Lesing er ok
+CD short UT_ERROR - Du har fått feil.
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array i/U Merknad
+CD ------------------------------------------------
+CD pfil FILE i Peker til filstruktur (def i stdio.h)
+CD lpos long u Peker til filposisjon
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_GetPos(FILE *fi,long *lpos)
+{
+ *lpos = ftell(fi);
+ if (*lpos == -1L ) return (UT_ERROR);
+ return(UT_OK);
+}
+
+
+/*
+CH UT_GetPos_i64 Finner neste filposisjon
+CD ==================================================================
+CD Formål......: Finner NESTE posisjon på filen.
+CD Dette vil bli neste linje etter UT_Readxxx og,
+CD UT_Writexxxx.
+CD
+CD Aktivisering: ist = UT_GetPos_i64(fil,&n64FilPos);
+CD
+CD Retur-verdier: short UT_OK - Utført OK
+CD short UT_ERROR - Du har fått feil.
+CD
+CD PARAMETERLISTE:
+CD Type Navn i/U Merknad
+CD ------------------------------------------------
+CD FILE pfil i Peker til filstruktur (def i stdio.h)
+CD long n64FilPos u Peker til filposisjon
+ ==================================================================
+*/
+SK_EntPnt_UT short UT_GetPos_i64(FILE *fi,UT_INT64 *n64FilPos)
+{
+ *n64FilPos = _ftelli64(fi);
+ if (*n64FilPos == -1L ) return (UT_ERROR);
+ return(UT_OK);
+}
+
+
diff --git a/src/UT/UT2.cpp b/src/UT/UT2.cpp
new file mode 100644
index 0000000..1eafd3f
--- /dev/null
+++ b/src/UT/UT2.cpp
@@ -0,0 +1,1550 @@
+/******************************************************************^$date;
+* *
+* Hjelpebiblioteket U T (Utilities) *
+* Lars Staurset, Statens Kartverk / FYSAK-prosjektet, januar 1990 *
+* Fil: UT2.C versjon C22: Streng- og teikn-operasjonar *
+* *
+****************************************************************************/
+
+#include "stdafx.h"
+
+#include <math.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+
+#include "fyut.h"
+
+#ifdef WIN32
+# include <windows.h>
+# include <memory.h>
+# include <stdlib.h>
+#endif
+
+/* Interne prototyper */
+static short VT_JustStr (char ztr[], short mstr, char str[]);
+static char VT_StrWord (char str[], short ii, short *iu, char *sep, short mw,
+ char word[]);
+
+/*******************************************************************************
+* *
+* FRAMHENTING AV TOKEN M.M. *
+* *
+*******************************************************************************/
+
+/*LS-890927*********************************************************************
+* Get Token *
+*******************************************************************************/
+
+SK_EntPnt_UT char *UT_GetToken (char *str, short *tl)
+{
+ char *ptr;
+ /* Hopp fram til første ikkje-blanke */
+ while (UT_IsSpace(*str)) ++str;
+ /* Hopp evt. forbi eitt komma el. punktum og blanke etter det */
+ if (*str == ',' || *str == '.') {
+ ++str;
+ while (UT_IsSpace(*str)) ++str;
+ }
+ /* Sjekk om strengen er ferdigbehandla */
+ if (*str == '\0') {
+ *tl=0;
+ return NULL;
+ }
+ /* Token avgrensa av hermeteikn */
+ if (*str == '"') {
+ ptr = str + 1;
+ while (*ptr != '"' && *ptr != '\0' && *ptr != '\n') ptr++;
+ *tl = (short)(ptr - str + 1);
+ return str;
+ }
+ /* Tekststreng fram til skilleteikn */
+ else {
+ ptr = str;
+ while (!UT_IsSpace(*ptr) && *ptr != ',' && *ptr != '\0') ptr++;
+ *tl = (short)(ptr - str);
+ return str;
+ }
+}
+
+/*LS-890927****AR-920317********************************************************
+* Get Token From String *
+*******************************************************************************/
+
+SK_EntPnt_UT char UT_StrToken (char str[], short ii, short *iu, short mt, char token[])
+{
+ char ch;
+ register short it;
+
+
+ /* Korrigerer max strenglengde (AR) */
+ mt--;
+
+
+ /* Hopp fram til første ikkje-blanke */
+ while (UT_IsSpace(str[ii])) ii++;
+
+ /* Hopp evt. forbi eitt komma eller semikolon og blanke etter det */
+ if (str[ii] == ',' || str[ii] == ';') {
+ ii++;
+ while (UT_IsSpace(str[ii])) ii++;
+ }
+
+ /* Sjekk om strengen er ferdigbehandla */
+ if (str[ii] == '\0') {
+ token[0] = '\0';
+ ch = '\0';
+
+ /* Token avgrensa av doble hermeteikn */
+ } else if (str[ii] == '"') {
+ for (ii++, it = 0; !strchr ("\"",str[ii]); ii++) {
+ if (it < mt) token[it++] = str[ii];
+ }
+ token[it] = '\0';
+ ch = '"';
+ if (str[ii]) ii++;
+
+ /* Token avgrensa av enkle hermeteikn */
+ } else if (str[ii] == '\'') {
+ for (ii++, it = 0; !strchr ("'",str[ii]); ii++) {
+ if (it < mt) token[it++] = str[ii];
+ }
+ token[it] = '\0';
+ ch = '\'';
+ if (str[ii]) ii++;
+
+
+ /* Token går fram til ',' , ';' , 'Space' el '\0' */
+ } else {
+ for (it = 0; (!UT_IsSpace(str[ii]) && str[ii] != ',' && str[ii] != ';' && str[ii] != '\0'); ii++) {
+ if (it < mt) token[it++] = str[ii];
+ }
+ token[it] = '\0';
+ /* Returkode avh. av slutt-teikn */
+ if (str[ii] == '\0' || UT_IsSpace(str[ii]))
+ ch = ' ';
+ else
+ ch = str[ii++];
+ }
+ *iu = ii;
+
+ return ch;
+}
+
+/*LS-880929*****AR-890713*******************************************************
+* Get Word From String *
+*******************************************************************************/
+
+SK_EntPnt_UT char UT_StrWord (char *str, short ii, short *iu, short mw, char *word)
+{
+ return VT_StrWord (str,ii,iu," ,\x9\xA\xB\xC\xD",mw,word);
+}
+
+/*LS-881005******AR-890713******************************************************
+* Get Integer From String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_StrInt (char str[], short ii, short *iu, int *_int)
+{
+ short ok;
+ long l;
+
+ ok = UT_StrLong (str,ii,iu,&l);
+ *_int = (int)l;
+ return ok;
+}
+
+/*LS-881005****AR-890713********************************************************
+* Get Short Integer From String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_StrShort (char *str, short ii, short *iu, short *s)
+{
+ char tal[7];
+
+ if (VT_StrWord (str,ii,iu," ,\x9\xA\xB\xC\xD",7,tal)) {
+ *s = (short)atol(tal);
+ return UT_TRUE;
+ }
+
+ *s = (short)0;
+ return UT_FALSE;
+}
+
+
+/*LS-880929*****AR-890713*******************************************************
+* Get Long Integer From String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_StrLong (char str[], short ii, short *iu, long *_long)
+{
+ char tal[12];
+
+ if (VT_StrWord (str,ii,iu," ,\x9\xA\xB\xC\xD",12,tal)) {
+ *_long = atol(tal);
+ return UT_TRUE;
+ }
+
+ *_long = 0;
+ return UT_FALSE;
+}
+
+
+/*LS-880929*****AR:2007-08-09***************************************************
+* Get Integer64 From String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_StrInt64 (char str[], short ii, short *iu, UT_INT64 *i64)
+{
+ char tal[20];
+
+ if (VT_StrWord (str,ii,iu," ,\x9\xA\xB\xC\xD",20,tal)) {
+#ifdef LINUX
+ *i64 = atoll(tal);
+#else
+ *i64 = _atoi64(tal);
+#endif
+ return UT_TRUE;
+ }
+
+ *i64 = 0;
+ return UT_FALSE;
+}
+
+
+/*LS-880929*****AR-890713*******************************************************
+* Get Unsigned Long Integer From String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_StrUlong (char str[], short ii, short *iu, unsigned long *_ulong)
+{
+ char tal[12],*endptr;
+
+ if (VT_StrWord (str,ii,iu," ,\x9\xA\xB\xC\xD",12,tal)) {
+
+ *_ulong = strtoul( tal, &endptr, 10 );
+
+ return UT_TRUE;
+ }
+
+ *_ulong = 0;
+ return UT_FALSE;
+}
+
+/*LS-890909*********************************************************************
+* Get Double From String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_StrDbl (char str[], short ii, short *iu, char decpt,
+ double *dbl)
+{
+ char tal[31], *sep;
+ static char sep1[] = " ,\x9\xA\xB\xC\xD", sep2[] = " \x9\xA\xB\xC\xD";
+
+ sep = (decpt == ',') ? sep2 : sep1;
+ if (VT_StrWord (str,ii,iu,sep,31,tal)) {
+ UT_AtoD (tal,decpt,dbl);
+ return UT_TRUE;
+ }
+
+ *dbl = 0.0;
+ return UT_FALSE;
+}
+
+/*LS-890927****AR-890713********************************************************
+* Get Word From String *
+*******************************************************************************/
+
+static char VT_StrWord (char *str, short ii, short *iu, char *sep, short mw,
+ char word[])
+{
+ char ch;
+ int iw;
+
+
+ /* Korrigerer max strenglengde (AR) */
+ mw--;
+ /* Hopp fram til første ikkje-blanke */
+ while (UT_IsSpace(str[ii])) ii++;
+ /* Hopp evt. forbi eitt komma og blanke etter det */
+ if (strchr (sep,',')) {
+ if (str[ii] == ',') ii++;
+ while (UT_IsSpace(str[ii])) ii++;
+ }
+
+ /* Sjekk om strengen er ferdigbehandla */
+ if (str[ii] == '\0') {
+ word[0] = '\0';
+ ch = '\0';
+
+ /* Ordet går fram til separator-teikn */
+ } else {
+ for (iw = 0; !strchr (sep,str[ii]); ii++) {
+ if (iw < mw) word[iw++] = str[ii];
+ }
+ word[iw] = '\0';
+ /* Returkode avh. av slutt-teikn */
+ if (str[ii] == '\0' || UT_IsSpace(str[ii]))
+ ch = ' ';
+ else
+ ch = str[ii++];
+ }
+ *iu = ii;
+ return ch;
+}
+
+
+/*
+AR:2011-08-04
+CH UT_memcpy Kopiere buffer
+CD ==============================================================
+CD For beskrivelse, se dokumentasjonen av memcpy_s.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD -------------------------------------------------------------
+CD void *dest iu Buffer det skal kopieres til.
+CD size_t numberOfElements i Size of the destination buffer.
+CD void *src i Buffer det kopieres fra.
+CD size_t count i Number of characters to copy.
+CD int status r Zero if successful; an error code on failure.
+CD ==============================================================
+*/
+SK_EntPnt_UT int UT_memcpy(void *dest,size_t numberOfElements,const void *src,size_t count)
+{
+#ifdef WIN32
+ return memcpy_s(dest,numberOfElements,src,count);
+#else
+ if (memcpy(dest,src,count)==NULL) return 1;
+ return 0;
+#endif
+}
+
+
+/*
+AR:2011-08-08
+CH UT_strerror Henter systemfeilmelding
+CD ==============================================================
+CD For beskrivelse, se dokumentasjonen av strerror_s.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD -------------------------------------------------------------
+CD char *buffer iu Buffer to hold error string.
+CD size_t numberOfElements i Size of buffer.
+CD int errnum i Error number.
+CD int status r Zero if successful; an error code on failure.
+CD ==============================================================
+*/
+SK_EntPnt_UT int UT_strerror(char *buffer,size_t numberOfElements,int errnum)
+{
+#ifdef WIN32
+ return strerror_s(buffer,numberOfElements,errnum);
+#else
+ UT_StrCopy(buffer,strerror(errnum),numberOfElements);
+ return 0;
+#endif
+}
+
+
+/*
+AR:2011-08-08
+CH UT_strtok Henter token
+CD ==============================================================
+CD Overbygning over strtok i standardbiblioteket.
+CD For beskrivelse, se dokumentasjonen av strtok_s.
+CD
+CD PARAMETERLISTE:
+CD Type Navn I/U Merknad
+CD -------------------------------------------------------------
+CD char *strToken iu String containing token or tokens.
+CD const char *strDelimit i Set of delimiter characters.
+CD char **context iu Used to store position information between calls to UT_strtok
+CD char *token r Returns a pointer to the next token found in strToken.
+CD They return NULL when no more tokens are found.
+CD
+CD ==============================================================
+*/
+SK_EntPnt_UT char *UT_strtok(char *strToken,const char *strDelimit,char **context)
+{
+#ifdef WIN32
+ return strtok_s(strToken,strDelimit,context);
+#else
+ return strtok(strToken,strDelimit);
+#endif
+}
+
+
+/*
+GL.06.03.89
+CH UT_StrCopy Kopiere streng med overflyttest
+CD ==============================================================
+CD Kopierer en streng med max ant tegn. Legger på \0 på slutten.
+CD
+CD PARAMETERLISTE:
+CD Navn Type I/U Merknad
+CD -------------------------------------------------------------
+CD dst *char u streng det skal kopieres til.
+CD src const *char i streng det skal kopieres fra.
+CD maxlen int i max antall tegn som skal kopieres
+CD (Inkludert null-terminator.)
+CD ==============================================================
+*/
+SK_EntPnt_UT void UT_StrCopy (char *dst, const char *src, int maxlen)
+{
+#ifdef WIN32
+ strncpy_s(dst,maxlen,src,_TRUNCATE);
+#else
+ strncpy(dst,src,maxlen);
+#endif
+}
+
+
+/*
+T.H.10.08.96
+CH UT_StrCat Konkatinerer streng
+CD ==============================================================
+CD Koncatinerer en streng med max ant tegn. Legger på \0 på slutten.
+CD
+CD PARAMETERLISTE:
+CD Navn Type I/U Merknad
+CD -------------------------------------------------------------
+CD dst *char u streng det skal kopieres til.
+CD src *char i streng det skal kopieres fra.
+CD maxlen int i Max lengde av dst, inkl. null-terminator.
+CD retur short r 1 = OK, 0 = feil.
+CD ==============================================================
+*/
+SK_EntPnt_UT short UT_StrCat (char *dst,const char *src, const int maxlen)
+{
+ //return (strcat_s(dst,maxlen,src))? 0 : 1;
+#ifdef WIN32
+ int err = strncat_s(dst,maxlen,src,_TRUNCATE); //Returns 0 if successful, an error code on failure.
+ return (err == 0)? 1 : 0;
+#else
+ strncat(dst,src,maxlen);
+ return 1;
+#endif
+
+
+/*
+#ifndef BORLAND
+ short sStatus = 1;
+ short sLen = (short)strlen(dst);
+
+ if (dst) {
+ //UT_StrCopy (dst+sLen-1, src, (short)(maxlen-sLen));
+ UT_StrCopy (dst+sLen, src, (short)(maxlen-sLen)); // AR:2000-10-26
+ }
+
+ return sStatus;
+
+#else
+
+ HANDLE hStringDest;
+ HANDLE hStringSource;
+ LPSTR Dest;
+ LPCSTR Source;
+ short sStatus = 1;;
+
+ hStringDest = LocalAlloc(LHND, maxlen + 1);
+ hStringSource = LocalAlloc(LHND, maxlen + 1);
+
+ if ((hStringDest != NULL) && (hStringSource != NULL)) {
+ Dest = LocalLock(hStringDest);
+ Source = LocalLock(hStringSource);
+ Dest = dst; // Setter Dest lik adressen til dst
+ Source = src; // Setter Src lik adressen til src
+
+ if (Dest) {
+ maxlen--; // Tar hensyn til null-terminator
+ if ((short)lstrlen(Source) <= maxlen) {
+ src+= maxlen;
+ *src = '\0';
+ }
+ lstrcat(Dest, Source);
+ }
+ LocalUnlock(hStringDest);
+ LocalUnlock(hStringSource);
+
+ if ((LocalFree(hStringDest))!= NULL)
+ sStatus = 0;
+
+ if ((LocalFree(hStringSource))!= NULL)
+ sStatus = 0;
+
+ }
+
+ return sStatus;
+
+#endif
+*/
+}
+
+
+
+/* (AR) */
+/*GL-880907*LS-880829***********************************************************
+* Get Substring *
+*******************************************************************************/
+SK_EntPnt_UT void UT_GetSubstr (char ctx[],short fra,short til,char sub[],short maxlen)
+{
+ short i;
+ short j = 0;
+ short txlen = (short)strlen(ctx);
+
+
+ sub[0] = '\0';
+
+ if (fra >= txlen) return; /* Starter etter slutten av strengen ==> retur */
+
+ if (til > txlen) til=txlen;
+
+ if (fra == -1) {
+ fra++;
+ while (UT_IsSpace(ctx[fra]) && fra < txlen) {
+ fra++;
+ }
+ }
+
+ if (til == -1) {
+ til=txlen;
+ while (UT_IsSpace(ctx[til]) && til > 0) {
+ til--;
+ }
+ }
+
+ for (i=fra; i<= til && ctx[i] != '\0' && maxlen>1 ; i++, maxlen--) {
+ sub[j++]=ctx[i];
+ }
+
+ sub[j]='\0';
+}
+
+
+/* (AR) */
+/*LS-880929*********************************************************************
+* Search String for Substring (INDEX) *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_Index (char str[], char substr[])
+{ /* Wortman & Sidebottom, p. 101 */
+ short i;
+ short j,k;
+
+ for (i = 0; str[i] != '\0'; i++) {
+ for (j=i, k=0; substr[k] != '\0' && substr[k] == str[j]; j++, k++) {
+ ;
+ }
+ if (substr[k] == '\0') return (i);
+ }
+ return (-1);
+}
+
+/*******************************************************************************
+* *
+* ANDRE STRENG- OG TEIKN-RUTINER *
+* *
+*******************************************************************************/
+
+/*LS-880929**AR-890713**********************************************************
+* Clear After CR/LF *
+*******************************************************************************/
+
+SK_EntPnt_UT char *UT_ClrCrlf (char *str)
+{
+ char *cp;
+
+ if ((cp = strpbrk(str,"\r\n")) != NULL) *cp = '\0';
+
+ return str;
+}
+
+/*AR-900111********************************************************************
+* Clear Trailing Space *
+*******************************************************************************/
+SK_EntPnt_UT char *UT_ClrTrailsp(char *str)
+{
+ char *cp;
+
+ if (*str != '\0')
+ {
+ // Fjern blanke på slutten
+ cp = strchr(str,'\0');
+ --cp;
+ while ( cp >= str && UT_IsSpace(*cp) )
+ {
+ --cp;
+ }
+ *(cp+1) = '\0';
+ }
+
+ return str;
+}
+
+
+/*AR-900111********************************************************************
+* Clear leading and trailing Space, and compress multiple space to one. *
+*******************************************************************************/
+SK_EntPnt_UT char *UT_ClrExtrasp(char *str)
+{
+ char *cp,*tp;
+ short sSp = UT_TRUE;
+
+ /* Fjern blanke på slutten */
+ UT_ClrTrailsp(str);
+
+ /* Fjern ledende blanke og overflødige blanke inni strengen */
+ cp = tp = str;
+
+ while (*cp != '\0') {
+ if (! UT_IsSpace(*cp)) {
+ *tp++ = *cp;
+ sSp = UT_FALSE;
+ } else {
+ if (sSp == UT_FALSE) *tp++ = ' ';
+ sSp = UT_TRUE;
+ }
+ cp++;
+ }
+ *tp = '\0';
+
+ return str;
+}
+
+
+/*
+AR-890312
+CH UT_IsSpace Test om mellomromstegn
+CD =============================================================================
+CD Formål:
+CD Sjekker om et tegn er mellomromstegn (ascii 0x09-0x0d eller 0x20)
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char c i Tegn som skall testes.
+CD int ist r 1=mellomromstegn, 0=ikke mellomromstegn.
+CD
+CD Bruk:
+CD ist = UT_IsSpace(*cp);
+ =============================================================================
+*/
+SK_EntPnt_UT int UT_IsSpace(char c)
+{
+#ifdef WIN32
+ static unsigned char atab[256] =
+ { 0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
+
+ return atab[(unsigned char)c];
+
+#else
+ switch (c){
+ case 0x20:
+ case 0x09:
+ case 0x0A:
+ case 0x0B:
+ case 0x0C:
+ case 0x0D:
+ return 1;
+ break;
+ default:
+ return 0;
+ break;
+ }
+#endif
+}
+
+/*LS-890430*********************************************************************
+* Check for Printable Character *
+*******************************************************************************/
+
+SK_EntPnt_UT int UT_IsPrint (int ch)
+{
+ if (isprint (ch)) return UT_TRUE;
+ else if (ch == 0) return UT_FALSE;
+ else if (strchr ("ÆØÅæøå",ch)) return UT_TRUE;
+ else return UT_FALSE;
+}
+
+/*LS-890517*********************************************************************
+* Check for Lower-Case Character *
+*******************************************************************************/
+
+SK_EntPnt_UT int UT_IsLower (int ch)
+{
+ if (islower (ch)) return UT_TRUE;
+ else if (ch == 0) return UT_FALSE;
+ else if (strchr ("æøåáäèïñö",ch)) return UT_TRUE;
+ else return UT_FALSE;
+}
+
+/*LS-890913*********************************************************************
+* Convert Character to Lower-Case *
+*******************************************************************************/
+
+SK_EntPnt_UT int UT_ToLower (int ch)
+{
+ if (ch >= 'A' && ch <= 'Z') {
+ ch += 0x20;
+
+ } else {
+ switch (ch) {
+ case 'Æ' : ch = 'æ'; break;
+ case 'Ø' : ch = 'ø'; break;
+ case 'Å' : ch = 'å'; break;
+
+ case 'Á' : ch = 'á'; break; // á - SK-fonter + standardfonter
+ case 'Ä' : ch = 'ä'; break; // ä - SK-fonter + standardfonter
+ case 'È' : ch = 'è'; break; // Samisk c - SK-fonter og è - standardfonter
+ case 'Ï' : ch = 'ï'; break; // ï - SK-fonter + standardfonter
+ case 'Ñ' : ch = 'ñ'; break; // Samisk n(aksent) - SK-fonter og ñ - standardfonter
+ case 'Ö' : ch = 'ö'; break; // ö - SK-fonter + standardfonter
+
+ case 0x010C : ch = 0x010D; break; // Samisk c - utvidede standardfonter
+ case 0x0110 : ch = 0x0111; break; // Samisk d - utvidede standardfonter
+ case 0x014A : ch = 0x014B; break; // Samisk n(lav) - utvidede standardfonter
+ case 0x0143 : ch = 0x0144; break; // Samisk n(aksent) - utvidede standardfonter
+ case 0x0160 : ch = 0x0161; break; // Samisk s - utvidede standardfonter
+ case 0x0166 : ch = 0x0167; break; // Samisk t - utvidede standardfonter
+ case 0x017D : ch = 0x017E; break; // Samisk z - utvidede standardfonter
+ }
+ } /* endif */
+
+ return ch;
+}
+
+/*AR-881020*LS-890517***********************************************************
+* Convert String to Lower-Case *
+*******************************************************************************/
+
+SK_EntPnt_UT char *UT_StrLower (char *ti)
+{
+ char *t = ti;
+
+ while ((*t = (char)UT_ToLower(*t)) != '\0')
+ t++;
+ return (ti);
+}
+
+/*LS-890517*********************************************************************
+* Check for Upper-Case Character *
+*******************************************************************************/
+
+SK_EntPnt_UT int UT_IsUpper (int ch)
+{
+ if (isupper (ch)) return UT_TRUE;
+ else if (ch == 0) return UT_FALSE;
+ else if (strchr ("ÆØÅÁÄÈÏÑÖ",ch)) return UT_TRUE;
+ else return UT_FALSE;
+}
+
+/*LS-890913*********************************************************************
+* Convert Character to Upper-Case *
+*******************************************************************************/
+
+SK_EntPnt_UT int UT_ToUpper (int ch)
+{
+ if (ch >= 'a' && ch <= 'z') {
+ ch -= 0x20;
+
+ } else {
+ switch (ch) {
+ case 'æ' : ch = 'Æ'; break;
+ case 'ø' : ch = 'Ø'; break;
+ case 'å' : ch = 'Å'; break;
+
+ case 'á' : ch = 'Á'; break; // á - SK-fonter + standardfonter
+ case 'ä' : ch = 'Ä'; break; // ä - SK-fonter + standardfonter
+ case 'è' : ch = 'È'; break; // Samisk c - SK-fonter og è - standardfonter
+ case 'ï' : ch = 'Ï'; break; // ï - SK-fonter + standardfonter
+ case 'ñ' : ch = 'Ñ'; break; // Samisk n(aksent) - SK-fonter og ñ - standardfonter
+ case 'ö' : ch = 'Ö'; break; // ö - SK-fonter + standardfonter
+
+ case 0x010D : ch = 0x010C; break; // Samisk c - utvidede standardfonter
+ case 0x0111 : ch = 0x0110; break; // Samisk d - utvidede standardfonter
+ case 0x014B : ch = 0x014A; break; // Samisk n(lav) - utvidede standardfonter
+ case 0x0144 : ch = 0x0143; break; // Samisk n(aksent) - utvidede standardfonter
+ case 0x0161 : ch = 0x0160; break; // Samisk s - utvidede standardfonter
+ case 0x0167 : ch = 0x0166; break; // Samisk t - utvidede standardfonter
+ case 0x017E : ch = 0x017D; break; // Samisk z - utvidede standardfonter
+ }
+ }
+
+ return ch;
+}
+
+/*LS-890517*********************************************************************
+* Convert String to Upper-Case *
+*******************************************************************************/
+
+SK_EntPnt_UT char *UT_StrUpper (char *ti)
+{
+ char *t = ti;
+
+ while ((*t = (char)UT_ToUpper(*t)) != '\0')
+ t++;
+ return (ti);
+}
+
+/*******************************************************************************
+* *
+* KONVERTERINGSRUTINER *
+* *
+*******************************************************************************/
+
+#ifdef OS216
+
+/*LS-880928*********************************************************************
+* Convert String to Integer If Possible *
+*******************************************************************************/
+
+SK_EntPnt_UT int UT_AtoI (char *str, int *_int)
+{
+ short s,ok;
+
+ ok = UT_AtoS (str,&s);
+ *_int = (int)s;
+ return ok;
+}
+
+/*LS-880929*********************************************************************
+* Convert String to Short Integer If Possible *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_AtoS (char str[], short *s)
+{
+ short ok,slen;
+ short len,sif;
+
+ ok = UT_FALSE;
+ /* Finn første siffer != 0 */
+ /*; for (sif=0; str[sif]<'1' || str[sif]>'9'; sif++); */
+ /* Rettet AR-940623 for å handtere streng uten siffer 1-9 */
+ for (sif=0; (str[sif]<'1' || str[sif]>'9') && str[sif]!='\0' ; sif++);
+ /* Lengde på sifferstrengen */
+ slen = (short)strlen(str);
+ len = slen - sif;
+ /* Viss <5 siffer: ok */
+ if (len < 5) ok = UT_TRUE;
+ /* Viss 5 siffer: u.s. dei 4 første */
+ else if (len == 5) {
+ sif = (short)str[--slen];
+ str[slen] = '\0';
+ *s = (short)abs(atoi(str));
+ if (*s < 3276) ok = UT_TRUE;
+ /* På grensa for lovleg verdi, sjekk det 5. */
+ else if (*s == 3276) {
+ if (sif <= '7') ok = UT_TRUE;
+ else if (sif == '8') {
+ /* Neg. tal kan ha 1 større abs.verdi */
+ if (atoi(str) < 0) ok = UT_TRUE;
+ }
+ }
+ /* Sett tilbake det lånte sifferet */
+ str[slen++] = (char)sif;
+ }
+ if (ok) *s = (short)atoi(str);
+ else *s = 0;
+ return ok;
+}
+
+/*LS-880929*********************************************************************
+* Convert String to Long Integer If Possible *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_AtoL (char str[], long *_long)
+{
+ short ok,slen;
+ register short len,sif;
+
+ ok = UT_FALSE;
+ /* Finn første siffer != 0 */
+ /*; for (sif=0; str[sif]<'1' || str[sif]>'9'; sif++); */
+ /* Rettet AR-940623 for å handtere streng uten siffer 1-9 */
+ for (sif=0; (str[sif]<'1' || str[sif]>'9') && str[sif]!='\0' ; sif++);
+
+ /* Lengde på sifferstrengen */
+ slen = (short)strlen(str);
+ len = slen - sif;
+ /* Viss <10 siffer: ok */
+ if (len < 10) ok = UT_TRUE;
+ /* Viss 10 siffer: u.s. dei 9 første */
+ else if (len == 10) {
+ sif = (short)str[--slen];
+ str[slen] = '\0';
+ *_long = labs (atol (str));
+ if (*_long < 214748364) ok = UT_TRUE;
+ /* På grensa for lovleg verdi, sjekk det 10. */
+ else if (*_long == 214748364) {
+ if (sif <= '7') ok = UT_TRUE;
+ else if (sif == '8') {
+ /* Neg. tal kan ha 1 større abs.verdi */
+ if (atol(str) < 0) ok = UT_TRUE;
+ }
+ }
+ /* Sett tilbake det lånte sifferet */
+ str[slen++] = (char)sif;
+ }
+ if (ok) *_long = atol (str);
+ else *_long = 0L;
+ return ok;
+}
+
+#endif
+
+
+/*LS-890519*********************************************************************
+* Convert String to Double *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_AtoD (char *str, char decpt, double *dbl)
+{
+ char *kompos;
+ /* Pass på desimalkomma */
+ if (decpt == ',') {
+ kompos = strchr (str,',');
+ if (kompos) *kompos = '.';
+ }
+ else
+ kompos = NULL;
+ *dbl = atof (str);
+ if (kompos) *kompos = ',';
+ return UT_TRUE;
+}
+
+/*LS-889297*********************************************************************
+* Convert Integer to String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_ItoA (int _int, short mstr, char *str)
+{
+ char ztr[12];
+
+ UT_SNPRINTF(ztr,12,"%d",_int);
+ return VT_JustStr (ztr,mstr,str);
+}
+
+/*LS-880928*********************************************************************
+* Convert Short Integer to String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_StoA (short s, short mstr, char *str)
+{
+ char ztr[7];
+
+ UT_SNPRINTF(ztr,7,"%hd",s);
+ return VT_JustStr (ztr,mstr,str);
+}
+
+/*LS-880929*********************************************************************
+* Convert Long Integer to String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_LtoA (long _long, short mstr, char *str)
+{
+ char ztr[12];
+
+ UT_SNPRINTF(ztr,12,"%ld",_long);
+ return VT_JustStr (ztr,mstr,str);
+}
+
+/*LS-890912*********************************************************************
+* Convert Double To String *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_DtoA (double dbl, short dec, char decpt, short mstr, char *str)
+{
+ /* size_t len; */
+ char *cp,ztr[41];
+
+ /* Sjekk mot for lang streng */
+ if (dbl!=0.0 && (log10(fabs(dbl)) + dec > 36.0)) {
+ memset( ztr, '*', 40);
+ ztr[40] = '\0';
+
+ } else {
+
+ /* Konverter til streng */
+ UT_SNPRINTF(ztr,41,"%.*f",dec,dbl);
+
+ /* Skift til rett desimaltegn */
+ if ((cp = strchr(ztr,'.')) != NULL) {
+ *cp = decpt;
+ }
+
+ /* Kontroller strenglengda */
+ /*if ((len = strlen (ztr)) > 40) { */
+ /* UT_FPRINTF (stderr,"\nFeil i UT_DtoA: %d",len); */
+ /* exit (1); */
+ /*} */
+ }
+
+ /* Juster etter behov */
+ return VT_JustStr(ztr,mstr,str);
+}
+
+/*LS-890912*********************************************************************
+* Check and Justify String *
+*******************************************************************************/
+
+static short VT_JustStr (char ztr[], short mstr, char str[])
+{
+ short ok,i,lstr;
+
+ lstr = (short)strlen (ztr);
+ mstr--;
+ /* For kort streng? */
+ if (mstr > 0 && mstr < lstr) {
+ for (i=0; i<mstr; i++) str[i] = ztr[i+lstr-mstr];
+ str[mstr] = '\0';
+ ok = UT_FALSE;
+ }
+ /* Lang nok streng */
+ else {
+ //strcpy_s (str,mstr,ztr);
+#ifdef LINUX
+ strncpy (str,ztr,mstr+1);
+#else
+ strcpy_s (str,mstr+1,ztr); // Må bruke mstr+1 fordi det er trukket fra en i den verdien som kommer inn
+#endif
+ ok = UT_TRUE;
+ }
+ /* For lang streng? */
+ if (mstr > lstr) UT_JustStr ('>',' ',(short)(mstr+1),str);
+ /* Avslutt */
+ return ok;
+}
+
+/*LS-891011*********************************************************************
+* Justify and Fill String *
+*******************************************************************************/
+
+SK_EntPnt_UT void UT_JustStr (char justmode, char fill, short lstr, char *str)
+{
+ char *pc1, *pc2, *pc, *qc;
+
+ if (lstr > 0) {
+ /* Terminer strengen */
+ lstr--;
+ *(str+lstr) = '\0';
+ /* Finn endane av strengen */
+ pc1 = str;
+ while (UT_IsSpace(*pc1) || *pc1 == fill) {
+ pc1++;
+ }
+
+ pc2 = strchr(pc1,'\0')-1;
+ while (UT_IsSpace(*pc2) || *pc2 == fill) {
+ pc2--;
+ }
+
+ switch (justmode) {
+ case '>' : /* Høgrepakking */
+ for (pc = pc2, qc = str+lstr-1; pc >= pc1; pc--) {
+ if (!UT_IsSpace(*pc) && *pc != fill) {
+ *qc-- = *pc;
+ }
+ }
+ while (qc >= str) *qc-- = fill;
+ break;
+ case '/' : /* Høgrejustering */
+ for (pc = pc2, qc = str+lstr-1; pc >= pc1; pc--)
+ *qc-- = *pc;
+ while (qc >= str) *qc-- = fill;
+ break;
+ case '<' : /* Venstrepakking */
+ for (pc = pc1, qc = str; pc <= pc2; pc++) {
+ if (!UT_IsSpace(*pc) && *pc != fill) *qc++ = *pc;
+ }
+ while (qc < str+lstr) *qc++ = fill;
+ break;
+ case '`' : /* Venstrejustering */
+ for (pc = pc1, qc = str; pc <= pc2; pc++)
+ *qc++ = *pc;
+ while (qc < str+lstr) *qc++ = fill;
+ break;
+ }
+ }
+}
+
+
+/*
+AR-890113 LS-890915
+CH UT_Ascii7to8 Konverter til PC-ASCII
+CD =============================================================================
+CD Formål:
+CD Konverterer en streng fra ND-7-bits norsk ASCII til PC-8-bits norsk ASCII.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *tx i Peker til streng som skal konverteres
+CD (avsluttet med '\0').
+CD char *tp r Peker til konvertert streng.
+CD
+CD Bruk:
+CD tp = UT_Ascii7to8(tx);
+ =============================================================================
+*/
+SK_EntPnt_UT unsigned char *UT_Ascii7to8(unsigned char *tx)
+{
+ static unsigned char atab[256] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,146,157,143, 94, 95, 96, 97, 98, 99,
+ 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,
+ 120,121,122,145,155,134,126,127,128,129,130,131,132,133,134,135,136,137,138,139,
+ 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
+ 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,
+ 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,
+ 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};
+
+ unsigned char *tp = tx;
+
+ for ( ; ((*tp = atab[*tp]) != '\0'); tp++){
+ ;
+ }
+
+ return (tx);
+}
+
+
+/*
+AR-890113 LS-890915
+CH UT_Ascii8to7 Konverter til ND-ASCII
+CD =============================================================================
+CD Formål:
+CD Konverterer en streng fra PC-8-bits norsk ASCII til ND-7-bits norsk ASCII.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *tx i Peker til streng som skal konverteres
+CD (avsluttet med '\0').
+CD char *tp r Peker til konvertert streng.
+CD
+CD Bruk:
+CD tp = UT_Ascii8to7(tx)
+ =============================================================================
+*/
+SK_EntPnt_UT unsigned char *UT_Ascii8to7(unsigned char *tx)
+{
+ static unsigned char atab[256] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+ 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,
+ 120,121,122,123,124,125,126,127,128,129,130,131,132,133,125,135,136,137,138,139,
+ 140,141,142, 93,144,123, 91,147,148,149,150,151,152,153,154,124,156, 92,158,159,
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
+ 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,
+ 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,
+ 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};
+
+ unsigned char *tp = tx;
+
+ for ( ; (*tp = atab[*tp]) != '\0'; tp++){
+ ;
+ }
+
+ return (tx);
+}
+
+
+/*
+AR-920929
+CH UT_Ascii8toISO8859 Konverter til ISO8859-10
+CD =============================================================================
+CD Formål:
+CD Konverterer en streng fra PC-8-bits norsk ASCII til ISO8859-10.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *tx i Peker til streng som skal konverteres
+CD (avsluttet med '\0').
+CD char *tp r Peker til konvertert streng.
+CD
+CD Bruk:
+CD tp = UT_Ascii8toISO8859(tx)
+ =============================================================================
+*/
+SK_EntPnt_UT unsigned char *UT_Ascii8toISO8859(unsigned char *tx)
+{
+ static unsigned char atab[256] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+ 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,
+ 120,121,122,123,124,125,126,127,128,129,130,131,132,133,229,135,136,137,138,139,
+ 140,141,142,197,144,230,198,147,148,149,150,151,152,153,154,248,156,216,158,159,
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
+ 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,
+ 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,
+ 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};
+
+
+
+ unsigned char *tp = tx;
+
+ for ( ; (*tp = atab[*tp]) != '\0'; tp++){
+ ;
+ }
+
+ return (tx);
+}
+
+
+/*
+AR-920929
+CH UT_ISO8859toAscii8 Konverter til PC-ASCII
+CD =============================================================================
+CD Formål:
+CD Konverterer en streng fra ISO8859-10 til PC-8-bits norsk ASCII.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *tx i Peker til streng som skal konverteres
+CD (avsluttet med '\0').
+CD char *tp r Peker til konvertert streng.
+CD
+CD Bruk:
+CD tp = UT_ISO8859toAscii8(tx);
+ =============================================================================
+*/
+SK_EntPnt_UT unsigned char *UT_ISO8859toAscii8(unsigned char *tx)
+{
+ static unsigned char atab[256] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+ 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,
+ 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,
+ 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
+ 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,143,146,199,
+ 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,157,217,218,219,
+ 220,221,222,223,224,225,226,227,228,134,145,231,232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,155,249,250,251,252,253,254,255};
+
+
+
+ unsigned char *tp = tx;
+
+ for ( ; ((*tp = atab[*tp]) != '\0'); tp++){
+ ;
+ }
+
+ return (tx);
+}
+
+
+/*
+AR-920929
+CH UT_Ascii7toISO8859 Konverter til ISO8859-10
+CD =============================================================================
+CD Formål:
+CD Konverterer en streng fra norsk 7-bits ASCII til ISO8859-10.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *tx i Peker til streng som skal konverteres
+CD (avsluttet med '\0').
+CD char *tp r Peker til konvertert streng.
+CD
+CD Bruk:
+CD tp = UT_Ascii7toISO8859(tx)
+ =============================================================================
+*/
+SK_EntPnt_UT unsigned char *UT_Ascii7toISO8859(unsigned char *tx)
+{
+
+ static unsigned char atab[256] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,198,216,197, 94, 95, 96, 97, 98, 99,
+ 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,
+ 120,121,122,230,248,229,126,127,128,129,130,131,132,133,134,135,136,137,138,139,
+ 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
+ 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,
+ 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,
+ 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};
+
+ unsigned char *tp = tx;
+
+ for ( ; (*tp = atab[*tp]) != '\0'; tp++){
+ ;
+ }
+
+ return (tx);
+}
+
+
+/*
+AR-920929
+CH UT_ISO8859toAscii7 Konverter til ND-ASCII
+CD =============================================================================
+CD Formål:
+CD Konverterer en streng fra ISO8859-10 til norsk 7-bits ASCII.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *tx i Peker til streng som skal konverteres
+CD (avsluttet med '\0').
+CD char *tp r Peker til konvertert streng.
+CD
+CD Bruk:
+CD tp = UT_ISO8859toAscii7(tx);
+ =============================================================================
+*/
+SK_EntPnt_UT unsigned char *UT_ISO8859toAscii7(unsigned char *tx)
+{
+
+ static unsigned char atab[256] =
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+ 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,
+ 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,
+ 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
+ 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
+ 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196, 93, 91,199,
+ 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215, 92,217,218,219,
+ 220,221,222,223,224,225,226,227,228,125,123,231,232,233,234,235,236,237,238,239,
+ 240,241,242,243,244,245,246,247,124,249,250,251,252,253,254,255};
+
+
+ unsigned char *tp = tx;
+
+ for ( ; ((*tp = atab[*tp]) != '\0'); tp++){
+ ;
+ }
+
+ return (tx);
+}
+
+
+/*
+AR-890113
+CH UT_KonverterTegnsett Konverter tegnsett
+CD ==========================================================================
+CD Formål:
+CD Konverterer en streng fra et tegnsett til et annet.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD short sFraTegnsett i Fra tegnsett
+CD TS_UKJENT = Ukjent tegnsett
+CD TS_DOSN8 = DOS norsk 8-bits
+CD TS_ND7 = Norsk Data 7-bits
+CD TS_DECM8 = DEC multinasjonal 8-bits
+CD TS_DECN7 = DEC norsk 7-bits
+CD TS_ISO8859 = ISO8859-10
+CD short sTilTegnsett i Til tegnsett
+CD TS_UKJENT = Ukjent tegnsett
+CD TS_DOSN8 = DOS norsk 8-bits
+CD TS_ND7 = Norsk Data 7-bits
+CD TS_DECM8 = DEC multinasjonal 8-bits
+CD TS_DECN7 = DEC norsk 7-bits
+CD TS_ISO8859 = ISO8859-10
+CD char *pszTx iu Peker til streng som skal konverteres
+CD (avsluttet med '\0').
+CD char *pszTx r Peker til konvertert streng.
+CD
+CD Bruk:
+CD pszTx = UT_KonverterTegnsett(sFraTegnsett,sTilTegnsett,pszTx);
+ =============================================================================
+*/
+SK_EntPnt_UT unsigned char *UT_KonverterTegnsett(short sFraTegnsett,short sTilTegnsett,
+ unsigned char *pszTx)
+{
+ if (sFraTegnsett != sTilTegnsett) {
+ switch (sFraTegnsett) {
+ /* Fra DOS 8-bits */
+ case TS_DOSN8:
+ switch (sTilTegnsett) {
+ /* Til norsk 7-bits */
+ case TS_ND7:
+ case TS_DECN7:
+ return UT_Ascii8to7(pszTx);
+
+ /* Til ISO8859 */
+ case TS_ISO8859:
+ case TS_DECM8:
+ return UT_Ascii8toISO8859(pszTx);
+ }
+ break;
+
+ /* Fra norsk 7-bits */
+ case TS_ND7:
+ case TS_DECN7:
+ switch (sTilTegnsett) {
+ /* Til DOS 8-bits */
+ case TS_DOSN8:
+ return UT_Ascii7to8(pszTx);
+
+ /* Til ISO8859 */
+ case TS_ISO8859:
+ case TS_DECM8:
+ return UT_Ascii7toISO8859(pszTx);
+ }
+ break;
+
+ /* Fra Dec-multinasjonal 8-bits */
+ case TS_ISO8859:
+ case TS_DECM8:
+ switch (sTilTegnsett) {
+ /* Til DOS 8-bits */
+ case TS_DOSN8:
+ return UT_ISO8859toAscii8(pszTx);
+
+ /* Til norsk 7-bits */
+ case TS_ND7:
+ case TS_DECN7:
+ return UT_ISO8859toAscii7(pszTx);
+ }
+ break;
+ }
+ }
+
+ return pszTx;
+}
+
+
+
+/*
+AR:2003-10-13
+CH UT_StrCmpi Sammenlign strenger
+CD ==========================================================================
+CD Formål:
+CD Sammenligner to strenger uavhengig av store og små bokstaver.
+CD For sammenligning der det bare sjekkes på likhet fungerer den for norske bokstaver.
+CD (Sammenligner bare karakterverdier.)
+CD For sortering må UT_StrColli brukes for å handtere norske bokstaver rett.
+CD UT_StrCmpi er mye raskere enn UT_StrColli.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszTx1 i Peker til første streng (avsluttet med '\0').
+CD char *pszTx2 i Peker til andre streng (avsluttet med '\0').
+CD int iStatus r Status, samme som strcmpi
+CD
+CD Bruk:
+CD iStatus = UT_StrCmpi(szTx1,szTx2);
+ =============================================================================
+*/
+SK_EntPnt_UT int UT_StrCmpi(const char *pszTx1, const char *pszTx2)
+{
+ char *ps1,*ps2;
+ int iStatus;
+
+
+ ps1 = (char*)malloc(strlen(pszTx1)+1);
+#ifdef LINUX
+ strncpy(ps1, pszTx1, strlen(pszTx1)+1);
+#else
+ strcpy_s(ps1, strlen(pszTx1)+1, pszTx1);
+#endif
+ UT_StrUpper(ps1);
+
+ ps2 = (char*)malloc(strlen(pszTx2)+1);
+#ifdef LINUX
+ strncpy(ps2, pszTx2, strlen(pszTx2)+1);
+#else
+ strcpy_s(ps2, strlen(pszTx2)+1, pszTx2);
+#endif
+ UT_StrUpper(ps2);
+
+ iStatus = strcmp(ps1,ps2);
+
+ free(ps1);
+ free(ps2);
+
+ return iStatus;
+}
+
+/*
+PG:2010-10-21
+CH UT_StrColli Sammenlign strenger
+CD ==========================================================================
+CD Formål:
+CD Sammenligner to strenger uavhengig av store og små bokstaver.
+CD Fungerer for norske bokstaver. Justerer for landskode (LC_COLLATE)
+CD Hvis det er bare er likhet det sjekkes på, bør heller den raskere UT_StrCmpi brukes.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD -----------------------------------------------------------------------------
+CD char *pszTx1 i Peker til første streng (avsluttet med '\0').
+CD char *pszTx2 i Peker til andre streng (avsluttet med '\0').
+CD int iStatus r Status, samme som strcmpi
+CD
+CD Bruk:
+CD iStatus = UT_StrColli(szTx1,szTx2);
+ =============================================================================
+*/
+SK_EntPnt_UT int UT_StrColli(const char *pszTx1, const char *pszTx2)
+{
+ char *ps1,*ps2;
+ int iStatus;
+
+ ps1 = (char*)malloc(strlen(pszTx1)+1);
+#ifdef LINUX
+ strncpy(ps1, pszTx1, strlen(pszTx1)+1);
+#else
+ strcpy_s(ps1, strlen(pszTx1)+1, pszTx1);
+#endif
+ UT_StrUpper(ps1);
+
+ ps2 = (char*)malloc(strlen(pszTx2)+1);
+#ifdef LINUX
+ strncpy (ps2, pszTx2, strlen(pszTx2)+1);
+#else
+ strcpy_s(ps2, strlen(pszTx2)+1, pszTx2);
+#endif
+ UT_StrUpper(ps2);
+
+ iStatus = strcoll(ps1,ps2);
+
+ free(ps1);
+ free(ps2);
+
+ return iStatus;
+}
diff --git a/src/UT/UT3.cpp b/src/UT/UT3.cpp
new file mode 100644
index 0000000..4824168
--- /dev/null
+++ b/src/UT/UT3.cpp
@@ -0,0 +1,575 @@
+ /******************************************************************^$date;
+* *
+* Hjelpebiblioteket U T (Utilities) *
+* Lars Staurset, Statens Kartverk / FYSAK-prosjektet, januar 1990 *
+* Fil: UT3.C versjon C22: Diverse rutiner *
+* *
+****************************************************************************/
+
+#include "stdafx.h"
+
+#include <time.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#ifdef OS2
+ #define INCL_DOSMEMMGR
+ #include <os2.h>
+#endif
+
+#ifdef WIN32
+# include <windows.h>
+#endif
+
+#include "fyut.h"
+
+/*******************************************************************************
+* *
+* RUTINER FOR Å STYRE MASKINUTSTYR *
+* *
+*******************************************************************************/
+
+/*LS-880928*********************************************************************
+* Sound Bell *
+*******************************************************************************/
+SK_EntPnt_UT void UT_Bell (void)
+{
+ UT_Sound(900,40);
+}
+
+
+/*AR-900110*********************************************************************
+* Sound Speaker for OS/2 *
+*******************************************************************************/
+SK_EntPnt_UT void UT_Sound (short freq, short dur)
+{
+#ifdef OS232
+ DosBeep((ULONG)freq,((ULONG)dur)*10);
+#endif
+
+#ifdef OS216
+ DosBeep((USHORT)freq,((USHORT)dur)*10);
+#endif
+
+#ifdef WIN32
+ Beep((DWORD)freq,((DWORD)dur)*10);
+#endif
+}
+
+/*LS-890706*********************************************************************
+* Pause *
+*******************************************************************************/
+SK_EntPnt_UT void UT_Pause (short dur)
+{
+#ifdef OS216
+ short t1,t2,t,tid[4];
+
+ UT_InqTime (tid);
+ t1 = 100*tid[2] + tid[3];
+ t2 = t1 + min (dur,6000);
+ do {
+ UT_InqTime (tid);
+ t = 100*tid[2] + tid[3];
+ if (t < t1) t += 6000;
+ } while (t < t2);
+#else
+#ifdef OS2
+ DosSleep(((ULONG)dur)*10);
+#endif
+#endif
+
+#ifdef WIN32
+ Sleep(((DWORD)dur)*10);
+#endif
+}
+
+/*******************************************************************************
+* *
+* MATEMATISKE FUNKSJONAR *
+* *
+*******************************************************************************/
+
+/*AR*LS-890611******************************************************************
+* Round Double to Double *
+*******************************************************************************/
+
+SK_EntPnt_UT double UT_RoundDD (double d)
+{
+ double dint;
+
+ modf((d + ((d < 0.0) ? -0.5 : 0.5) ), &dint) ;
+
+ return dint;
+}
+
+/*AR*TOU*IR:2010-01-25**********************************************************
+* Round Double to Double *
+* Spesiell avrunding som runder av halve verdier oppover *
+* Eks: -1.1 -> -1.0 *
+* -1.5 -> -1.0 *
+* 1.1 -> 1.0 *
+* 1.5 -> 2.0 *
+*******************************************************************************/
+
+SK_EntPnt_UT double UT_RoundHalfUpDD (double d)
+{
+ return floor(d + 0.5);
+}
+
+
+/*LS-890915*********************************************************************
+* Round Double to Integer *
+*******************************************************************************/
+
+SK_EntPnt_UT int UT_RoundDI (double d)
+{
+ if (d > INT_MAX || d < INT_MIN)
+ {
+ UT_FPRINTF(stderr,"Kan ikke avrunde %.3f til int!(Fil:%s, Linje:%d)\n", d, __FILE__, __LINE__);
+#ifndef LINUX
+ RaiseException( EXCEPTION_INT_OVERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
+#endif
+ return (d > INT_MAX)? INT_MAX : INT_MIN;
+ }
+
+ //(d > 0.0)? (d+=0.5) : (d-=0.5);
+ //return (int)d;
+ return (int)( d + ( (d < 0.0)? -0.5 : 0.5) );
+}
+
+
+/*LS-890915*********************************************************************
+* Round Double to Unsigned Integer *
+*******************************************************************************/
+
+SK_EntPnt_UT unsigned int UT_RoundDUI (double d)
+{
+ if (d > UINT_MAX || d < 0)
+ {
+ UT_FPRINTF(stderr,"Kan ikke avrunde %.3f til unsigned int!(Fil:%s, Linje:%d)\n", d, __FILE__, __LINE__);
+#ifndef LINUX
+ RaiseException( EXCEPTION_INT_OVERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
+#endif
+ return (d > UINT_MAX)? UINT_MAX : 0;
+ }
+
+ return (unsigned int)( d + 0.5 );
+}
+
+
+/*LS-890915*********************************************************************
+* Round Double to Long Integer *
+*******************************************************************************/
+
+SK_EntPnt_UT long UT_RoundDL (double d)
+{
+ if (d > LONG_MAX || d < LONG_MIN)
+ {
+ UT_FPRINTF(stderr,"Kan ikke avrunde %.3f til long!(Fil:%s, Linje:%d)\n", d, __FILE__, __LINE__);
+#ifndef LINUX
+ RaiseException( EXCEPTION_INT_OVERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
+#endif
+ return (d > LONG_MAX)? LONG_MAX : LONG_MIN;
+ }
+
+ //(d > 0.0)? (d+=0.5) : (d-=0.5);
+ //return (long)d;
+ return (long)( d + ( (d < 0.0)? -0.5 : 0.5) );
+}
+
+/*PG-071219*********************************************************************
+* Round Double to Long Long Integer *
+*******************************************************************************/
+
+SK_EntPnt_UT long long UT_RoundDLL (double d)
+{
+ if (d > LLONG_MAX || d < LLONG_MIN)
+ {
+ UT_FPRINTF(stderr,"Kan ikke avrunde %.3f til long long!(Fil:%s, Linje:%d)\n", d, __FILE__, __LINE__);
+#ifndef LINUX
+ RaiseException( EXCEPTION_INT_OVERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
+#endif
+ return (d > LLONG_MAX)? LLONG_MAX : LLONG_MIN;
+ }
+
+ //(d > 0.0)? (d+=0.5) : (d-=0.5);
+ //return (long)d;
+ return (long long)( d + ( (d < 0.0)? -0.5 : 0.5) );
+}
+
+/*LS-890915*********************************************************************
+* Round Double to Short Integer *
+*******************************************************************************/
+
+SK_EntPnt_UT short UT_RoundDS (double d)
+{
+ if (d > SHRT_MAX || d < SHRT_MIN)
+ {
+ UT_FPRINTF(stderr,"Kan ikke avrunde %.3f til short!(Fil:%s, Linje:%d)\n", d, __FILE__, __LINE__);
+#ifndef LINUX
+ RaiseException( EXCEPTION_INT_OVERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
+#endif
+ return (d > SHRT_MAX)? SHRT_MAX : SHRT_MIN;
+ }
+
+ //(d > 0.0)? (d+=0.5) : (d-=0.5);
+ //return (short)d;
+ return (short)( d + ( (d < 0.0)? -0.5 : 0.5) );
+}
+
+/*******************************************************************************
+* *
+* DIVERSE - DIVERSE *
+* *
+*******************************************************************************/
+
+/*LS-890926*********************************************************************
+* Get Environment Variable *
+*******************************************************************************/
+
+SK_EntPnt_UT char *UT_GetEnv (char *var, short mstr, char *str)
+{
+ char *env;
+#ifdef LINUX
+ env = getenv (UT_StrUpper(var));
+ if (env == NULL) {
+ UT_StrCopy(str,"C:\\",mstr);
+ UT_StrCat(str,var,(mstr-3));
+ }
+ else {
+ UT_StrCopy(str,env,mstr);
+ *(str+mstr-1) = '\0';
+ UT_ClrTrailsp(str);
+ }
+ return str;
+#else
+ size_t len;
+ _dupenv_s(&env, &len, UT_StrUpper(var));
+ //env = getenv (UT_StrUpper(var));
+ if (env == NULL) {
+ UT_StrCopy(str,"C:\\",mstr);
+ UT_StrCat(str,var,(mstr-3));
+ }
+ else {
+ UT_StrCopy(str,env,mstr);
+ *(str+mstr-1) = '\0';
+ UT_ClrTrailsp(str);
+ }
+ return str;
+#endif
+}
+
+
+#ifdef WIN32
+
+/*LS-890926*********************************************************************
+* Lag filnavn med path til FYSAK *
+*******************************************************************************/
+SK_EntPnt_UT char *UT_MakeFysakPath ( char *str, short mstr, char *path, char *filename )
+{
+ size_t len;
+
+ /* Standardverdi */
+ if (path == NULL || *path == '\0') {
+ GetCurrentDirectory(mstr,str);
+ } else {
+ UT_StrCopy(str,path,mstr);
+ }
+
+ UT_ClrTrailsp(str);
+ UT_FullPath(str,str,mstr);
+
+ /* Heng på '\' */
+ len = strlen(str);
+ if (*(str+len-1) != '\\' && *(str+len-1) != ':'){
+ UT_StrCat(str, "\\", mstr);
+ }
+
+ /* Heng på filnavn */
+ len = strlen(str);
+ UT_StrCat(str, filename, mstr);
+
+ return str;
+}
+
+#endif
+
+
+#ifdef OS216
+
+/*LS-890926*********************************************************************
+* Lag filnavn med path til FYSAK *
+*******************************************************************************/
+SK_EntPnt_UT char *UT_MakeFysak ( char *str, short mstr, char *filename )
+{
+ char *cp,finn_env[_MAX_EXT+10];
+ size_t len;
+ char *env = NULL;
+
+ /* S›k etter filtype, og hent environment-variabel */
+ if ((cp = strchr(filename,'.')) != NULL) {
+ cp++;
+ strcpy(finn_env,"FYSAK_");
+ strcat(finn_env,cp);
+ size_t len;
+ errno_t err = _dupenv_s(&env, &len, UT_StrUpper(finn_env));
+ //env = getenv( UT_StrUpper(finn_env));
+ }
+
+ /* Spesialtype er ikke funnet, bruk FYSAK-standard */
+ if (env == NULL) {
+ size_t len;
+ errno_t err = _dupenv_s(&env, &len, "FYSAK");
+ //env = getenv ("FYSAK");
+ }
+
+ /* Standardverdi */
+ if (env == NULL) {
+ strncpy(str,"C:\\FYSAK\\",(size_t)(mstr-1));
+ *(str+mstr-1) = '\0';
+
+ } else {
+ strncpy (str,env,(size_t)(mstr-1));
+ *(str+mstr-1) = '\0';
+ UT_ClrTrailsp(str);
+ }
+
+ /* Heng p† '\' */
+ len = strlen(str);
+ if (*(str+len-1) != '\\' && *(str+len-1) != ':'){
+ strncat (str,"\\",mstr-len-1);
+ *(str+mstr-1) = '\0';
+ }
+
+ /* Heng p† filnavn */
+ len = strlen(str);
+ strncat (str,filename,mstr-len-1);
+ *(str+mstr-1) = '\0';
+
+ return str;
+}
+
+#endif
+
+
+/*LS-880929*********************************************************************
+* Function : Inquire System Date *
+*******************************************************************************/
+
+SK_EntPnt_UT void UT_InqDate (short *date)
+{
+#ifdef LINUX
+ struct tm *ntime;
+ time_t ltime=NULL;
+
+ time(&ltime);
+
+ ntime = localtime(&ltime);
+
+ *date++ = (short)ntime->tm_year;
+ *date++ = (short)ntime->tm_mon;
+ *date++ = (short)ntime->tm_mday;
+ *date = (short)((ntime->tm_wday) ? ntime->tm_wday - 1 : 6);
+#else
+ time_t ltime=NULL;
+ struct tm ntime;
+
+ time(&ltime);
+
+ localtime_s(&ntime,&ltime);
+
+ *date++ = (short)ntime.tm_year;
+ *date++ = (short)ntime.tm_mon;
+ *date++ = (short)ntime.tm_mday;
+ *date = (short)((ntime.tm_wday) ? ntime.tm_wday - 1 : 6);
+#endif
+}
+
+
+//*****************************************************************
+// Henter og formatterer dagens dato som en 8-sifret streng
+//*****************************************************************
+SK_EntPnt_UT char *UT_InqDateString(void)
+{
+#ifdef LINUX
+ struct tm *ntime;
+ time_t aclock;
+ static char szDato[9];
+
+
+ time(&aclock);
+ ntime = localtime(&aclock);
+ UT_SNPRINTF(szDato,9,"%4d%02d%02d",
+ 1900+ntime->tm_year,
+ ntime->tm_mon+1,
+ ntime->tm_mday);
+
+ return szDato;
+#else
+ struct tm ntime;
+ time_t aclock;
+ static char szDato[9];
+
+
+ time(&aclock);
+ localtime_s(&ntime,&aclock);
+ UT_SNPRINTF(szDato,9,"%4d%02d%02d",
+ 1900+ntime.tm_year,
+ ntime.tm_mon+1,
+ ntime.tm_mday);
+
+ return szDato;
+#endif
+}
+
+
+//*****************************************************************
+// Henter og formatterer dagens dato og tid som en 14-sifret
+// streng på formen ååååmmddttmmss.
+//*****************************************************************
+SK_EntPnt_UT char *UT_InqDatetimeString(void)
+{
+#ifdef LINUX
+ struct tm *ntime;
+ time_t aclock;
+ static char szDatotid[15];
+
+ time(&aclock);
+ ntime = localtime(&aclock);
+ UT_SNPRINTF(szDatotid,15,"%4d%02d%02d%02d%02d%02d",
+ 1900+ntime->tm_year,
+ ntime->tm_mon+1,
+ ntime->tm_mday,
+ ntime->tm_hour,
+ ntime->tm_min,
+ ntime->tm_sec);
+
+ return szDatotid;
+#else
+ struct tm ntime;
+ time_t aclock;
+ static char szDatotid[15];
+
+ time(&aclock);
+ localtime_s(&ntime,&aclock);
+ UT_SNPRINTF(szDatotid,15,"%4d%02d%02d%02d%02d%02d",
+ 1900+ntime.tm_year,
+ ntime.tm_mon+1,
+ ntime.tm_mday,
+ ntime.tm_hour,
+ ntime.tm_min,
+ ntime.tm_sec);
+
+ return szDatotid;
+#endif
+}
+
+
+/*LS-880929*********************************************************************
+* Inquire System Time *
+*******************************************************************************/
+
+SK_EntPnt_UT void UT_InqTime (short *tid)
+{
+#ifdef LINUX
+ struct tm *ntime;
+ time_t ltime;
+
+ time(&ltime);
+ ntime = localtime(&ltime);
+ *tid++ = (short)ntime->tm_hour;
+ *tid++ = (short)ntime->tm_min;
+ *tid++ = (short)ntime->tm_sec;
+#else
+ time_t ltime;
+ struct tm ntime;
+
+ time(&ltime);
+ localtime_s(&ntime,&ltime);
+ *tid++ = (short)ntime.tm_hour;
+ *tid++ = (short)ntime.tm_min;
+ *tid++ = (short)ntime.tm_sec;
+#endif
+}
+
+
+/*LS-890913********************************************************************/
+/* Inquire Free Memory i OS2 */
+/******************************************************************************/
+SK_EntPnt_UT extern unsigned long UT_InqFreemem (void)
+{
+#ifdef OS216
+ ULONG size;
+ DosMemAvail(&size);
+ return size;
+
+#else
+ return 0L;
+#endif
+}
+
+
+/*
+JEK-920604
+CH UT_SortD Sorteringsrutine
+CD ==================================================================
+CD Formål:
+CD Sorterer verdier i en double-tabell i stigende rekkefølge.
+CD Teorien bak sorteringsalgoritmen(CombSort11) er beskrevet i
+CD Byte April-91 s315-320.
+CD
+CD NB! Rutina flytter de enkelte elementer i tabellen!!
+CD
+CD PARAMETERLISTE:
+CD Navn Type Array I/U Merknad
+CD ------------------------------------------------------------------
+CD *db_arr double i/u Tabell som skal sorteres
+CD size short i Ant elementer i tabell
+CD
+CD Bruk: UT_SortD(db_arr, size)
+ ==================================================================
+*/
+SK_EntPnt_UT void UT_SortD ( double *db_arr, short size)
+{
+ #define SHRINKFACTOR 1.3 /* Empirisk verdi */
+
+ int switches;
+ int i, j;
+ int top, gap;
+ double dtmp;
+
+ gap = size; /* Initier gap til tabellstørrelse */
+
+ /* ----- Start løkke */
+ do {
+ gap = (int)((float)gap/SHRINKFACTOR);
+
+ switch (gap) {
+ case 0: /* Minste gap --> boblesortering */
+ gap = 1;
+ break;
+ case 9: /* Spesielt for CombSort11 */
+ case 10:
+ gap = 11;
+ break;
+ default:
+ break;
+ }
+
+ switches = 0;
+ top = size - gap;
+
+ for (i=0;i<top;++i) {
+ j = i + gap;
+ if (db_arr[i] > db_arr[j]) {
+ dtmp = db_arr[i];
+ db_arr[i] = db_arr[j];
+ db_arr[j] = dtmp;
+ ++switches;
+ }
+ }
+
+ } while (switches || (gap > 1));
+}
diff --git a/src/UT/UT4.cpp b/src/UT/UT4.cpp
new file mode 100644
index 0000000..0c626ac
--- /dev/null
+++ b/src/UT/UT4.cpp
@@ -0,0 +1,149 @@
+/******************************************************************^$date;
+* *
+* Hjelpebiblioteket U T (Utilities) *
+* Lars Staurset, Statens Kartverk / FYSAK-prosjektet, januar 1990 *
+* Fil: UT4.C: Handtering av flag-tabell *
+* *
+****************************************************************************/
+
+#include "stdafx.h"
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "fyut.h"
+
+
+/**************************************************************************
+* *
+* RUTINER FOR Å HANDTERE FLAG-TABELL *
+* *
+***************************************************************************/
+
+/*
+OJ-920309
+CH UT_InitFlag
+CD ==========================================================================
+CD Formål:
+CD Opprette og nullstille flag-tabell.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD short sNlin i Antall linjer.
+CD long[] *plFlag r Peker til minneblokk for flagging.
+CD
+CD Bruk:
+CD plFlag = UT_InitFlag(sNgi,&sAktLines);
+ ==========================================================================
+*/
+SK_EntPnt_UT unsigned long *UT_InitFlag(short sNlin)
+{
+ unsigned long *plFlag;
+
+ unsigned long ulAntUL = UT_RoundDL(ceil((double)(sNlin + 1) / (double)(sizeof(unsigned long) * 8)));
+ plFlag = (unsigned long *)UT_MALLOC((size_t)((ulAntUL+1) * (sizeof(unsigned long))));
+ memset(plFlag,0,(size_t)((ulAntUL+1) * (sizeof(unsigned long))));
+
+ *plFlag = (unsigned long)sNlin;
+
+ return plFlag;
+}
+
+/*
+OJ-920309
+CH UT_CloseFlag
+CD ==========================================================================
+CD Formål:
+CD Frigjøre minne brukt til flagging av brukte linjer.
+CD
+CD Parametre:
+CD Type Navn I/U Forklaring
+CD --------------------------------------------------------------------------
+CD long *plFlag I Peker til minneblokk for flagging.
+CD
+CD Bruk:
+CD UT_CloseFlag(plFlag);
+ ==========================================================================
+*/
+SK_EntPnt_UT void UT_CloseFlag(unsigned long *plFlag)
+{
+ UT_FREE((void *)(plFlag));
+ plFlag = NULL;
+}
+
+/*
+OJ-920309
+CH UT_SetFlag Flagger brukt linje.
+CD ==========================================================================
+CD Formål:
+CD Legg inn merke i linje tabell.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD bStatus bool r Returstatus, UT_TRUE=OK, UT_FALSE=flagging feilet
+CD unsigned long *plFlag i Peker til minneblokk for flagging.
+CD short sLine i Linje som skal flagges som brukt.
+CD
+CD Bruk:
+CD bStatus = UT_SetFlag(plFlag,sLine)
+ ==========================================================================
+*/
+// SK_EntPnt_UT void UT_SetFlag(unsigned long *plFlag,short sLine)
+SK_EntPnt_UT bool UT_SetFlag(unsigned long *plFlag,short sLine)
+{
+
+ // char szErrMsg[80];
+
+ /* Maksimalt: antall long * 32 - 1 for bit 0 i første */
+ /*
+ if (sLine >= (short)*plFlag){
+ UT_SNPRINTF(szErrMsg,80,"For mange -linjer %hd, maksimalt: %hd",sLine,(short)*plFlag-1);
+ }
+ *(plFlag + (sLine / (sizeof(unsigned long) * 8)) + 1) |=
+ (0x00000001L << (sLine % (sizeof(unsigned long) * 8)));
+ */
+
+ // JEK 20090428 Gjort om til boolsk funksjon
+ if (sLine < (short)*plFlag){
+ *(plFlag + (sLine / (sizeof(unsigned long) * 8)) + 1) |=
+ (0x00000001L << (sLine % (sizeof(unsigned long) * 8)));
+ return UT_TRUE;
+ }else{
+ // UT_SNPRINTF(szErrMsg,80,"For mange -linjer %hd, maksimalt: %hd",sLine,(short)*plFlag-1);
+ return UT_FALSE;
+ }
+}
+
+
+/*
+OJ-920309
+CH UT_GetFlag Flagger brukt -linje.
+CD ==========================================================================
+CD Formål:
+CD Teste merke i linje tabell.
+CD
+CD Parametre:
+CD Navn Type I/U Forklaring
+CD --------------------------------------------------------------------------
+CD unsigned long *plFlag i Peker til minneblokk for flagging.
+CD short sLine i Linje som skal hentes.
+CD
+CD Bruk:
+CD UT_GetFlag(plFlag,sNlines,sLine)
+ ==========================================================================
+*/
+SK_EntPnt_UT short UT_GetFlag(unsigned long *plFlag,short sLine)
+{
+ char szErrMsg[80];
+
+ /* Maksimalt: antall long * 32 - 1 for bit 0 i første */
+ if (sLine >= (short)*plFlag){
+ UT_SNPRINTF(szErrMsg,80,"For mange -linjer %hd, maksimalt: %hd",sLine,(short)*plFlag-1);
+ }
+ return ((*(plFlag + (sLine / (sizeof(unsigned long) * 8)) + 1) &
+ (0x00000001L << (sLine % (sizeof(unsigned long) * 8)))) == 0)?
+ UT_FALSE : UT_TRUE;
+}
diff --git a/src/UT/fyut.h b/src/UT/fyut.h
new file mode 100644
index 0000000..abd515e
--- /dev/null
+++ b/src/UT/fyut.h
@@ -0,0 +1,283 @@
+/******************************************************************************
+*
+* STATENS KARTVERK - FYSAK
+*
+* Filename: fyut.h
+*
+* Content: Prototyper for generelle hjelperutiner og operativsystemavhengige rutiner.
+*
+* Copyright (c) 1990-2011 Statens kartverk
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+******************************************************************************/
+
+#pragma once
+
+
+
+#include <stdio.h>
+
+#ifndef SK_EntPnt_UT
+# define SK_EntPnt_UT
+#endif
+
+
+/* ----------------------------------------- Konstanter */
+/* Div. manifeste konstantar */
+
+#ifdef WIN32
+#ifdef _DEBUG
+ #pragma comment (lib, "UtD.lib")
+#else
+ #pragma comment (lib, "Ut.lib")
+#endif
+/* For DOS/OS2/Windows */
+# define UT_SLASH '\\'
+# define UT_STR_SLASH "\\"
+# define UT_INT64 __int64
+# define UT_SNPRINTF _snprintf_s
+# define UT_FPRINTF fprintf_s
+# define UT_GETPID _getpid
+
+#else
+ /* For UNIX */
+# ifdef LINUX /* specifically the LINUX */
+# include <stdint.h>
+# include <inttypes.h>
+# define UT_INT64 int64_t
+# endif
+
+# define UT_SNPRINTF snprintf
+# define UT_FPRINTF fprintf
+# define UT_GETPID getpid
+
+# define UT_SLASH '/'
+# define UT_STR_SLASH "/"
+# define cdecl
+# define EZERO 0
+
+# ifdef _FILE_OFFSET_BITS
+# undef _FILE_OFFSET_BITS
+# endif
+# define _FILE_OFFSET_BITS 64
+# include <limits.h>
+# include <sys/types.h>
+
+# ifdef WIN32
+# include <io.h>
+# else
+# include <unistd.h>
+# endif
+
+# define _TRUNCATE 0
+# define _fseeki64 fseek
+# define _ftelli64 ftell
+# define _strcmpi strcasecmp
+
+#endif
+
+#define UT_FALSE 0
+#define UT_TRUE 1
+#define UT_OVRFLW 2
+
+#define UT_NULL 0L
+
+#define UT_OK 0
+#define UT_EOF 1
+#define UT_ERROR -1
+#define UT_READ 0
+#define UT_WRITE 1
+#define UT_UPDATE 2
+#define UT_UNKNOWN 0
+#define UT_OLD 1
+#define UT_NEW 2
+
+/* Konstanter for UT_KonverterTegnsett */
+#define TS_UKJENT 0 /* Ukjent tegnsett */
+#define TS_DOSN8 1 /* DOS norsk 8-bits (standardverdi) */
+#define TS_ND7 2 /* Norsk Data 7-bits */
+#define TS_DECM8 4 /* DEC multinasjonal 8-bits */
+#define TS_DECN7 8 /* DEC norsk 7-bits */
+#define TS_ISO8859 16 /* ISO8859-10 (Samisk og norsk mm. ) */
+
+/* Div lengder for filnavn; jfr. stdlib.h */
+#define _MAX_PATH 260 /* max. length of full pathname */
+#define _MAX_DRIVE 3 /* max. length of drive component */
+#define _MAX_DIR 256 /* max. length of path component */
+#define _MAX_FNAME 256 /* max. length of file name component */
+#define _MAX_EXT 256 /* max. length of extension component */
+
+
+/* ----------------------------------------- Makroer */
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+
+
+
+/*
+ *!--------------------------------------------------------------!
+ *! Oppdateringstid for fil !
+ *!--------------------------------------------------------------!
+ */
+typedef struct dFTID {
+ unsigned short usAar;
+ unsigned short usMnd;
+ unsigned short usDag;
+ unsigned short usTime;
+ unsigned short usMin;
+ unsigned short usSek;
+} FTID;
+
+typedef FTID *PFTID;
+
+
+/* ----------------------------------------- Prototyper */
+
+SK_EntPnt_UT void UT_makepath(char *pathP,const char *driveP,const char *dirP,const char *nameP,const char *extP);
+SK_EntPnt_UT void UT_splitpath(const char *pathP,char *driveP,char *dirP,char *nameP,char *extP);
+SK_EntPnt_UT short UT_InqPathSize(char *pszPath,long *plSize);
+SK_EntPnt_UT short UT_InqPathSize_i64(char *pszPath,UT_INT64 *n64Size);
+SK_EntPnt_UT short UT_SetPathSize(char *pszPath,long lSize);
+SK_EntPnt_UT short UT_SetPathSize_i64(char *pszPath, UT_INT64 n64Size);
+SK_EntPnt_UT short UT_InqPathTid(char *pszPath,PFTID pFilTid);
+SK_EntPnt_UT short UT_InqAvailSize(char *pszPath,unsigned long *pulLedigPlass);
+SK_EntPnt_UT short UT_FullPath(char *pszBuffer, const char *pszPath, size_t maxlen);
+SK_EntPnt_UT short UT_DeleteFile(char *pszPath);
+SK_EntPnt_UT short UT_DeleteDir(char *pszPath);
+SK_EntPnt_UT short UT_CreateDir(char *pszPath);
+SK_EntPnt_UT short UT_FilnavnCmp(char *pszFil1,char *pszFil2);
+SK_EntPnt_UT short UT_CopyFile(char *pszFraFilnavn,char *pszTilFilnavn,short sFeilHvisEksisterer);
+
+
+/* Framhenting frå streng */
+SK_EntPnt_UT char *UT_GetToken (char *str, short *l_tok);
+SK_EntPnt_UT char UT_StrToken (char *str, short ii, short *iu, short mt, char *token);
+SK_EntPnt_UT char UT_StrWord (char *str, short ii, short *iu, short mw, char *word);
+SK_EntPnt_UT short UT_StrInt (char *str, short ii, short *iu, int *_int);
+SK_EntPnt_UT short UT_StrInt64 (char str[], short ii, short *iu, UT_INT64 *i64);
+SK_EntPnt_UT short UT_StrShort (char *str, short ii, short *iu, short *s);
+SK_EntPnt_UT short UT_StrLong (char *str, short ii, short *iu, long *_long);
+SK_EntPnt_UT short UT_StrUlong (char str[], short ii, short *iu, unsigned long *_ulong);
+SK_EntPnt_UT short UT_StrDbl (char *str, short ii, short *iu, char decpt,double *dbl);
+SK_EntPnt_UT void UT_StrCopy (char *tx_to, const char *tx_from, int tx_len);
+SK_EntPnt_UT short UT_StrCat (char *dst,const char *src, const int maxlen);
+SK_EntPnt_UT int UT_memcpy(void *dest,size_t numberOfElements,const void *src,size_t count);
+SK_EntPnt_UT int UT_strerror(char *buffer,size_t numberOfElements,int errnum);
+SK_EntPnt_UT char *UT_strtok(char *strToken,const char *strDelimit,char **context);
+
+
+/* Konvertering */
+#ifdef OS216
+SK_EntPnt_UT short UT_AtoI (char *str, int *_int);
+SK_EntPnt_UT short UT_AtoS (char str[], short *s);
+SK_EntPnt_UT short UT_AtoL (char str[], long *_long);
+#endif
+SK_EntPnt_UT short UT_AtoD (char *str, char decpt, double *d);
+SK_EntPnt_UT short UT_ItoA (int i, short sl, char *str);
+SK_EntPnt_UT short UT_StoA (short s, short mstr, char *str);
+SK_EntPnt_UT short UT_LtoA (long l, short sl, char *str);
+SK_EntPnt_UT short UT_DtoA (double d, short dec, char decpt, short sl, char *str);
+
+/* Strengmanipulering ellers */
+SK_EntPnt_UT char *UT_ClrCrlf (char *str);
+SK_EntPnt_UT char *UT_ClrTrailsp(char *str);
+SK_EntPnt_UT char *UT_ClrExtrasp(char *str);
+SK_EntPnt_UT void UT_JustStr (char justmode, char fill, short lstr, char *str);
+SK_EntPnt_UT short UT_Index (char *str, char *substr);
+SK_EntPnt_UT void UT_GetSubstr (char ctx[],short fra,short til,char sub[],short maxlen);
+SK_EntPnt_UT char *UT_StrLower (char *tx);
+SK_EntPnt_UT char *UT_StrUpper (char *tx);
+SK_EntPnt_UT int UT_StrCmpi(const char *pszTx1, const char *pszTx2);
+SK_EntPnt_UT int UT_StrColli(const char *pszTx1, const char *pszTx2);
+SK_EntPnt_UT unsigned char *UT_Ascii7to8 (unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_Ascii8to7 (unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_ISO8859toAscii8(unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_Ascii8toISO8859(unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_ISO8859toAscii7(unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_Ascii7toISO8859(unsigned char *tx);
+SK_EntPnt_UT unsigned char *UT_KonverterTegnsett(short sFraTegnsett,short sTilTegnsett,
+ unsigned char *pszTx);
+
+
+/* Andre teiknhandterings rutiner */
+SK_EntPnt_UT int UT_IsSpace (char c);
+SK_EntPnt_UT int UT_IsPrint (int ch);
+SK_EntPnt_UT int UT_IsLower (int ch);
+SK_EntPnt_UT int UT_IsUpper (int ch);
+SK_EntPnt_UT int UT_ToUpper (int ch);
+SK_EntPnt_UT int UT_ToLower (int ch);
+
+/* Matematiske funksjonar */
+SK_EntPnt_UT double UT_RoundDD (double d);
+SK_EntPnt_UT double UT_RoundHalfUpDD (double d);
+SK_EntPnt_UT int UT_RoundDI (double d);
+SK_EntPnt_UT unsigned int UT_RoundDUI (double d);
+SK_EntPnt_UT long UT_RoundDL (double d);
+SK_EntPnt_UT long long UT_RoundDLL (double d);
+SK_EntPnt_UT short UT_RoundDS (double d);
+
+/* Kalender/klokke-rutiner */
+SK_EntPnt_UT void UT_InqDate (short *date);
+SK_EntPnt_UT char *UT_InqDateString(void);
+SK_EntPnt_UT char *UT_InqDatetimeString(void);
+SK_EntPnt_UT void UT_InqTime (short *time);
+
+/* Høgnivå */
+SK_EntPnt_UT FILE *UT_OpenFile (const char *filnavn,const char *ftyp,
+ short facc,short exist,short *ierr);
+SK_EntPnt_UT short UT_ReadLine (FILE *pfil,short llin, char clin[]);
+SK_EntPnt_UT short UT_ReadLineCrlf (FILE *pfil,short llin, char clin[]);
+SK_EntPnt_UT short UT_ReadLineNoComm(FILE *pfil,short llin, char *clin);
+SK_EntPnt_UT short UT_WriteLine (FILE *pfil,char clin[]);
+SK_EntPnt_UT short UT_WriteLineCrlf(FILE *pfil,char clin[]);
+SK_EntPnt_UT short UT_SetPos (FILE *fi,long lpos);
+SK_EntPnt_UT short UT_SetPos_i64 (FILE *fi,UT_INT64 n64FilPos);
+SK_EntPnt_UT short UT_GetPos (FILE *fi,long *lpos);
+SK_EntPnt_UT short UT_GetPos_i64(FILE *fi,UT_INT64 *n64FilPos);
+SK_EntPnt_UT short UT_Save (FILE *pfil);
+
+/* Div. rutiner */
+SK_EntPnt_UT void UT_Bell (void);
+SK_EntPnt_UT void UT_Sound (short freq, short dur);
+SK_EntPnt_UT void UT_Pause (short dur);
+SK_EntPnt_UT unsigned long UT_InqFreemem (void);
+SK_EntPnt_UT char *UT_GetEnv (char *var, short mstr, char *str);
+SK_EntPnt_UT char *UT_MakeFysak ( char *str, short mstr, char *filename );
+SK_EntPnt_UT char *UT_MakeFysakPath ( char *str, short mstr, char *path, char *filename );
+SK_EntPnt_UT void UT_SortD(double *db_arr, short size);
+
+SK_EntPnt_UT unsigned long *UT_InitFlag(short sNlin);
+SK_EntPnt_UT void UT_CloseFlag(unsigned long *plFlag);
+SK_EntPnt_UT bool UT_SetFlag(unsigned long *plFlag,short sLine);
+SK_EntPnt_UT short UT_GetFlag(unsigned long *plFlag,short sLine);
+
+SK_EntPnt_UT short UT_StartProsess(char *pszCommandLine,short sVent);
+
+SK_EntPnt_UT short UT_PutAnfTegn(char *pszTx, char cTegn, short sMaksLen);
+
+
+/* --- Makroer -- */
+#define UT_MALLOC malloc
+#define UT_FREE free
+
+#define UT_VENT 1
+#define UT_FORTSETT 2
+
+
+
diff --git a/src/UT/make.sh b/src/UT/make.sh
new file mode 100755
index 0000000..3168960
--- /dev/null
+++ b/src/UT/make.sh
@@ -0,0 +1,4 @@
+gcc -Wall -g -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -Wno-write-strings -c -I. *.cpp
+ar rcs libfyut.a *.o
+gcc -g -D_FILE_OFFSET_BITS=64 -DUNIX -DLINUX -fPIC -Wno-write-strings -shared -I. *.cpp -o ../../lib/libfyut.so
+cp fyut.h ../../include/fyut.h
diff --git a/src/UT/stdafx.cpp b/src/UT/stdafx.cpp
new file mode 100644
index 0000000..f506d58
--- /dev/null
+++ b/src/UT/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// UT.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/src/UT/stdafx.h b/src/UT/stdafx.h
new file mode 100644
index 0000000..69f29d4
--- /dev/null
+++ b/src/UT/stdafx.h
@@ -0,0 +1,12 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include <cstring>
+#include "fyut.h"
+
+
+// TODO: reference additional headers your program requires here