From ca171b72eb7f835c0d18cdac013d81e11d007a54 Mon Sep 17 00:00:00 2001 From: Ruben Undheim Date: Thu, 4 Sep 2014 21:41:19 +0200 Subject: Import fyba_4.1.1.orig.tar.gz [dgit import orig fyba_4.1.1.orig.tar.gz] --- .gitignore | 5 + ChangeLog | 9 + Lib/.keep | 0 Makefile.am | 6 + README | 100 + configure | 22476 ++++++++++++++++++++++++++++++++++++ configure.ac | 36 + doc/Makefile.am | 3 + doc/en_EN/fyba.html | 10 + doc/en_EN/fyba1.html | 304 + doc/en_EN/fyba2.html | 6789 +++++++++++ doc/no_NB/fyba.html | 10 + doc/no_NB/fyba1.html | 304 + doc/no_NB/fyba2.html | 6795 +++++++++++ fyba.pc.in | 11 + include/fyba.h | 1484 +++ include/fygm.h | 129 + include/fyut.h | 283 + m4/.keep | 0 src/FYBA/FYBA.cpp | 42 + src/FYBA/FYBA.sln | 26 + src/FYBA/FYBA.vcxproj | 231 + src/FYBA/FYBA_DLL.cpp | 25 + src/FYBA/FYHO.cpp | 1456 +++ src/FYBA/FYLB.cpp | 4646 ++++++++ src/FYBA/FYLD.cpp | 111 + src/FYBA/FYLE.cpp | 494 + src/FYBA/FYLH.cpp | 1035 ++ src/FYBA/FYLI.cpp | 2297 ++++ src/FYBA/FYLO.cpp | 2529 ++++ src/FYBA/FYLP.cpp | 1169 ++ src/FYBA/FYLR.cpp | 2240 ++++ src/FYBA/FYLS.cpp | 678 ++ src/FYBA/FYLU.cpp | 2904 +++++ src/FYBA/FYLX.cpp | 4948 ++++++++ src/FYBA/FYTA.cpp | 199 + src/FYBA/Fyba_Callback.cpp | 232 + src/FYBA/Fyba_melding.cpp | 201 + src/FYBA/Fyba_melding_dll.cpp.bak | 368 + src/FYBA/LICENSE | 24 + src/FYBA/Makefile.am | 9 + src/FYBA/fyba.h | 1484 +++ src/FYBA/fyba_strings.h | 223 + src/FYBA/fybax.h | 344 + src/FYBA/fyln.cpp | 870 ++ src/FYBA/make.sh | 5 + src/FYBA/stdafx.cpp | 8 + src/FYBA/stdafx.h | 16 + src/GM/GM.cpp | 3245 ++++++ src/GM/GM.sln | 26 + src/GM/GM.vcxproj | 193 + src/GM/LICENSE | 24 + src/GM/Makefile.am | 10 + src/GM/fygm.h | 129 + src/GM/make.sh | 4 + src/GM/stdafx.cpp | 8 + src/GM/stdafx.h | 9 + src/UT/ANFORSEL.cpp | 189 + src/UT/CREDIR.cpp | 81 + src/UT/CopyFile.cpp | 78 + src/UT/DELDIR.cpp | 78 + src/UT/DELFILE.cpp | 43 + src/UT/DISKINFO.cpp | 199 + src/UT/FILNACMP.cpp | 54 + src/UT/FULLPATH.cpp | 249 + src/UT/INQSIZE.cpp | 173 + src/UT/INQTID.cpp | 209 + src/UT/LICENSE | 24 + src/UT/MAKEPATH.cpp | 140 + src/UT/Makefile.am | 11 + src/UT/SETSIZE.cpp | 210 + src/UT/SPLITPTH.cpp | 94 + src/UT/StrtPros.cpp | 122 + src/UT/UT.sln | 29 + src/UT/UT.vcxproj | 218 + src/UT/UT1.cpp | 817 ++ src/UT/UT2.cpp | 1550 +++ src/UT/UT3.cpp | 575 + src/UT/UT4.cpp | 149 + src/UT/fyut.h | 283 + src/UT/make.sh | 4 + src/UT/stdafx.cpp | 8 + src/UT/stdafx.h | 12 + 83 files changed, 76815 insertions(+) create mode 100644 .gitignore create mode 100644 ChangeLog create mode 100644 Lib/.keep create mode 100644 Makefile.am create mode 100644 README create mode 100755 configure create mode 100644 configure.ac create mode 100644 doc/Makefile.am create mode 100644 doc/en_EN/fyba.html create mode 100644 doc/en_EN/fyba1.html create mode 100644 doc/en_EN/fyba2.html create mode 100644 doc/no_NB/fyba.html create mode 100644 doc/no_NB/fyba1.html create mode 100644 doc/no_NB/fyba2.html create mode 100644 fyba.pc.in create mode 100644 include/fyba.h create mode 100644 include/fygm.h create mode 100644 include/fyut.h create mode 100644 m4/.keep create mode 100644 src/FYBA/FYBA.cpp create mode 100644 src/FYBA/FYBA.sln create mode 100644 src/FYBA/FYBA.vcxproj create mode 100644 src/FYBA/FYBA_DLL.cpp create mode 100644 src/FYBA/FYHO.cpp create mode 100644 src/FYBA/FYLB.cpp create mode 100644 src/FYBA/FYLD.cpp create mode 100644 src/FYBA/FYLE.cpp create mode 100644 src/FYBA/FYLH.cpp create mode 100644 src/FYBA/FYLI.cpp create mode 100644 src/FYBA/FYLO.cpp create mode 100644 src/FYBA/FYLP.cpp create mode 100644 src/FYBA/FYLR.cpp create mode 100644 src/FYBA/FYLS.cpp create mode 100644 src/FYBA/FYLU.cpp create mode 100644 src/FYBA/FYLX.cpp create mode 100644 src/FYBA/FYTA.cpp create mode 100644 src/FYBA/Fyba_Callback.cpp create mode 100644 src/FYBA/Fyba_melding.cpp create mode 100644 src/FYBA/Fyba_melding_dll.cpp.bak create mode 100644 src/FYBA/LICENSE create mode 100644 src/FYBA/Makefile.am create mode 100644 src/FYBA/fyba.h create mode 100644 src/FYBA/fyba_strings.h create mode 100644 src/FYBA/fybax.h create mode 100644 src/FYBA/fyln.cpp create mode 100755 src/FYBA/make.sh create mode 100644 src/FYBA/stdafx.cpp create mode 100644 src/FYBA/stdafx.h create mode 100644 src/GM/GM.cpp create mode 100644 src/GM/GM.sln create mode 100644 src/GM/GM.vcxproj create mode 100644 src/GM/LICENSE create mode 100644 src/GM/Makefile.am create mode 100644 src/GM/fygm.h create mode 100755 src/GM/make.sh create mode 100644 src/GM/stdafx.cpp create mode 100644 src/GM/stdafx.h create mode 100644 src/UT/ANFORSEL.cpp create mode 100644 src/UT/CREDIR.cpp create mode 100644 src/UT/CopyFile.cpp create mode 100644 src/UT/DELDIR.cpp create mode 100644 src/UT/DELFILE.cpp create mode 100644 src/UT/DISKINFO.cpp create mode 100644 src/UT/FILNACMP.cpp create mode 100644 src/UT/FULLPATH.cpp create mode 100644 src/UT/INQSIZE.cpp create mode 100644 src/UT/INQTID.cpp create mode 100644 src/UT/LICENSE create mode 100644 src/UT/MAKEPATH.cpp create mode 100644 src/UT/Makefile.am create mode 100644 src/UT/SETSIZE.cpp create mode 100644 src/UT/SPLITPTH.cpp create mode 100644 src/UT/StrtPros.cpp create mode 100644 src/UT/UT.sln create mode 100644 src/UT/UT.vcxproj create mode 100644 src/UT/UT1.cpp create mode 100644 src/UT/UT2.cpp create mode 100644 src/UT/UT3.cpp create mode 100644 src/UT/UT4.cpp create mode 100644 src/UT/fyut.h create mode 100755 src/UT/make.sh create mode 100644 src/UT/stdafx.cpp create mode 100644 src/UT/stdafx.h 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 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 + +== 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 . +# +# 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 </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 +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#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 if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + 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 . +_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 &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &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 +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 &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &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 +#include +#include +#include +/* 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 +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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 &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 &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 +#include +#include +#include + +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 + +_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 + +_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 +#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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 to if __STDC__ is defined, since + # 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 +#else +# include +#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 +_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 &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &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 <&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 < 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 <> 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 <&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 <&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 <&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 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 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 <&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.so + # instead of lib.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 declares shl_load. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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 declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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 < +#endif + +#include + +#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 < +#endif + +#include + +#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 , 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 &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 &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 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 <&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.so + # instead of lib.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 <&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 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 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 <&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.so + # instead of lib.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 <&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 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 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 <&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.so + # instead of lib.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 +#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 +#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 +#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 declares pow. + For example, HP-UX 11i declares gettimeofday. */ +#define pow innocuous_pow + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char pow (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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 declares $ac_func. + For example, HP-UX 11i 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 to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#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 ." +_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 <>$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 <>$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 ." +_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 <>$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 <>$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/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 @@ + + + +FYBA + + + + + + 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 @@ + + + + + + +
Content:
+

Top +

1 Introduction +

2 Overview of the Functionality of FYBA +

3 The Internal Working of the Index System +- Group table +- Used table +- SOSI buffer +- Serial number table +- Geographical search table +

4 Naming Conventions +

5 Initialisation and Control +- LC_Init +- LC_InqVer +- LC_Close +- LC_ErInitiert +- LC_MaxSkriv +- LC_InqMaxSkriv +- LC_SetNgisModus +- LC_SetDefLpfi +- LC_InqDefLpfi +- LC_SetUtvidModus +- LC_GetUtvidModus +

6 Opening Base and SOSI Files +- LC_OpenBase +- LC_CloseBase +- LC_SelectBase +- LC_InqCurBase +- LC_OpenSos +- LC_CloseSos +- LC_DelIdx +- LC_FcloseSos +

7 Helper Functions +

7.1 Base and File +- LC_GetBaOm +- LC_GetFiOm +- LC_GetFiNr +- LC_GetFiNa +- LC_GetTegnsett +- LC_InqLag +- LC_InqFilLag +- LC_SetFilLag +- LC_FiLastGr +- LC_ErFilBase +- LC_ErKoordsysLik +- LC_ErVertdatumLik +- LC_Backup +- LC_GetNgisLag +- LC_SetFilType +- LC_GetFilType +- LC_ErLik_Avrundet +- LC_ErLik_IkkeAvrundet +- LC_ErReferert +

7.2 SOSI Group +- LC_GetGrNr +- LC_GetGrPara +- LC_GetGrParaBgr +- LC_GetGrFi +- LC_SetEndringsstatus +

7.3 Header, active group +- LC_NyttHode +- LC_TestHode +- LC_GetOmr +- LC_PutOmr +- LC_GetTrans +- LC_GetTransEx +- LC_PutTrans +- LC_PutTransEx +

7.4 Header, directly from SOSI-file +- HO_New +- HO_TestSOSI +- HO_GetKvalitet +- HO_GetTegnsett +- HO_GetVal +- HO_GetTrans +- HO_GetTransEx +- HO_GetOmr +- HO_SjekkTegnsett +

8 New Group +- LC_NyGr +

9 Direct Read/Write +- LC_RxGr +- LC_WxGr +

10 Sequential Read/Write +- LC_RsGr +- LC_RsHode +- LC_WsGr +- LC_WsGrPart +- LC_EndreHode +

11 Delete Group +- LC_DelGr +

12 Storing Back the Buffered Info to a SOSI File +- LC_Save +

13 Reserve Space in the Ring Buffer +- LC_InsGiL +- LC_AppGiL +- LC_InsKoL +- LC_AppKoL +- LC_DelGiL +- LC_DelKoL +

14 Add Data to the Ring Buffer +

14.1 Copying Group +- LC_CopyGr +- LC_CopyCoord +

14.2 Group Information +- LC_PutGi +- LC_PutGP +- LC_AppGP +- LC_UpdateGP +- LC_UpdateGiEnhet +- LC_UpdateGiKvalitet +- LC_UpdatePiKvalitet +- LC_OppdaterEndret +- LC_DelGiNavn +- LC_FinnNivo +

14.3 Serial Number and Reference Number +- LC_PutSn +- LC_PutRef +

14.4 Coordinates +- LC_PutTK +- LC_PutTH +- LC_PutTD +

14.5 Connection Nodes +- LC_PutKp +

14.6 Node Information +- LC_PutPi +

15 Get Data from the Ring Buffer +

15.1 General Value for a SOSI Name +

15.2 Group Information +- LC_GetGi +- LC_GetGP +

15.3 Serial Number and Reference Number +- LC_GetSn +- LC_GetRef +- LC_InqAntRef +- LC_InitGetRefFlate +- LC_GetRefFlate +- LC_ErLinjeRefLin +

15.4 Special get-functions +- LC_GetBuePar +- LC_GetBue +- LC_GetBuep +- LC_GetSirkel +- LC_GetSirkelp +- LC_GetKvalitet +

15.5 Coordinates +- LC_GetTK +- LC_GetArrayTK +- LC_GetTH +- LC_GetArrayTH +- LC_GetHoyde +- LC_GetTD +- LC_GetDybde +

15.6 Connection Nodes +- LC_GetKp +- LC_FinnKp +

15.7 Node Information +- LC_GetPi +- LC_InitPP +- LC_GetPP +- LC_GetPiVerdi +- LC_TestPi +

15.8 Special get Operations +- LC_GetCurEnhet +- LC_GetCurKvalitet +- LC_GetObjtypeBgr +- LC_GetElementNavn +

16 Iterating in the Base +- LC_InitNextFil +- LC_NextFil +- LC_InitNextBgr +- LC_NextBgr +

17 Geographical Search +- LC_GetGrWin +- LC_SBFlate +- LC_FFFlate +- LC_FNFlate +- LC_SBGeo +- LC_FFGeo +- LC_FNGeo +- LC_FAGeo +- LC_FFGeoFil +- LC_FNGeoFil +- LC_AvsluttSok +- LC_WTst +- LC_PTst +- LC_PTstOmkrets +

18 Serial Number Search +- LC_SBSn +- LC_MoveSn +- LC_FiSn +- LC_FiArraySn +- LC_FASn +- LC_FFSn +- LC_FNSn +- LC_FPSn +- LC_FLSn +- LC_FFSnBt +- LC_FNSnBt +- LC_FPSnBt +- LC_FLSnBt +

19 Property Subset +- LC_OpenQuery +- LC_CloseQuery +- LC_PutQueryLine +- LC_PutQueryRegel +- LC_LesUtvalg +- LC_GetUtRegelNavn +- LC_GruppeUtvalg +- LC_PunktUtvalg +- LC_FinnPinfoUtvalg +- LC_PiTestUtvalg +- LC_GiQuery +- LC_FAGiQuery +- LC_FAGiKombinertFlateQuery +- LC_QueryGP +- LC_InqMaxPrioritet +- LC_TestPrioritetBrukt +- LC_UtvalgPrioritet +

20 Marking Groups +- LC_SetBt +- LC_ClrBt +- LC_GetBt +- LC_EraseBt +- LC_CopyBt +- LC_SetModusMerk +- LC_MerkGr +

21 Special Handling of Polygons +- Polygonbeskrivelse +- LC_POL_InitPolygon +- LC_POL_FrigiPolygon +- LC_POL_InitOmkrets +- LC_POL_LeggTilGruppeOmkrets +- LC_POL_FjernGruppeOmkrets +- LC_POL_FjernSisteGruppeOmkrets +- LC_POL_FrigiOmkrets +- LC_POL_InitOy +- LC_POL_FrigiAlleOyer +- LC_POL_FjernOy +- LC_POL_LeggTilOy +- LC_POL_TestBrukt +- LC_POL_PutRef +- LC_POL_GetRef +- LC_POL_GetRefOmkrets +- LC_POL_PTst +- LC_POL_PTstOmkrets +- LC_POL_Box +

22 Various Functions +

22.1 Calculations +- LC_BerAreal +- LC_BerLengde +- LC_BerLengde3D +- LC_BerAvgrensLengde +- LC_BerYtreAvgrensLengde +- LC_BerIndreAvgrensLengde +- LC_RoundKoord +

22.2 Structure Changes +- LC_SnuGr +- LC_SammenfoyGr +- LC_SplittGr +- LC_ErstattReferanse +

22.3 The Entire Base +- LC_InqAntFiler +

22.4 Priority +- LC_ClrPrioritet +- LC_SetPrioritet +- LC_InqPrioritet +- LC_ErasePrioritet +- LC_EraseAllPrioritet +

22.5 Quality +- LC_FormatterKvalitet +

22.6 Table Handling +- LC_InitTabel +- LC_PutTabel +- LC_GetTabel +- LC_CloseTabel +

22.7 Message Handling +- LC_SetErrorHandler +- LC_SetStartMessageHandler +- LC_SetShowMessageHandler +- LC_SetEndMessageHandler +- LC_SetCancelHandler +- LC_StartMessage +- LC_ShowMessage +- LC_EndMessage +- LC_Cancel +- LC_Error +

22.8 Helper Functions for Message Handling +- LC_StrError +

22.9 Debugging +- LC_DumpTab +

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 @@ + + + + + + +
+
+
FYBA
+
+
A Storage System for Geo Data in SOSI format.
+
+
+
+
+
Last updated: 2014-08-24 by rubund. Translated from the norwegian version dated 2013-10-09
+ + + +
+
+
+
+
+
+

1 Introduction

+ + +FYBA is a library to handle searching, reading and updating of +SOSI-files. +FYBA is now compatible with the SOSI-format +versjon 4.0, and will be adapted to newer SOSI-versions. +
+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. + +
+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). + + +
+
+
+
+
+
+

2 Overview of the Functionality of FYBA

+ + +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. + +
+                         !---------------!
+       !---------------->!  Index-files  !<-------!
+       !                 !---------------!        !
+       !                        ^                 !
+       !                        !                 !
+       !                    !---!-----!           !   !-----------------!
+       !                    !         !           !-->!                 !
+       !                    ! Buffer  !               !                 !
+!------!------!  LC_Rxxxx   !         !  LC_PutXxx    ! User-program    !
+! SOSI-file(s)!<----------- !internal !<------------- !                 !
+!             ! ----------->!         !               !                 !
+!-------------!  LC_Wxxxx   ! in      ! ------------->!                 !
+                            !         !  LC_GetXxx    !                 !
+                            ! the FYBA!               !                 !
+                            !         !               !                 !
+                            ! routines!               !-----------------!
+                            !         !
+                            !---------!
+
+
+
+
+
+
+
+
+

3 The Internal Workings of the Index System

+ +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: + +
+
+
+
+
+

Group table

+Group table
+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 !
+*------------------------------------------------------------------------------*
+
+
+
+
+
+
+

Used table

+Marking of groups
+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
+
+ +
+
+
+
+
+

SOSI buffer

+Binary copy of the SOSI-file
+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 !
+
+ +
+
+
+
+
+

Serial number table

+!-------------* +! Group number! +!-------------! The line number in the table is the serial number. +! lGrNr ! +! (long) ! +*-------------* +
+ +
+
+
+
+
+

Geographical search table

+Geographical search table
+
+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    !
+!        !        !        !        !
+*-----------------------------------*
+
+ +
+
+
+
+
+
+

4 Naming Conventions

+ + +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. +
+Most of the functions in the user interface begin with "LC_": +
+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_": + +
+
+
+
+
+
+

5 Initialisation and Control

+ +
+
+
+
+
+

LC_Init

+Initialises FYBA
+=============================================================================
+Purpose:
+Initialises FYBA.
+Parameters:
+Type     Name      I/O   Explanation
+-----------------------------------------------------------------------------
+Usage:
+LC_Init();
+   =============================================================================
+ 
+SK_EntPnt_FYBA void LC_Init(void)
+
+
+
+
+
+
+

LC_InqVer

+Identification
+=============================================================================
+Purpose:
+Gets the version of this library.
+   =============================================================================
+ 
+SK_EntPnt_FYBA char *LC_InqVer(void)
+
+
+
+
+
+
+

LC_Close

+Closes FYBA
+=============================================================================
+Purpose:
+Closes FYBA.
+Parameters:
+Type     Name      I/O   Explanation
+-----------------------------------------------------------------------------
+Usage:
+LC_Close();
+	=============================================================================
+ 
+SK_EntPnt_FYBA void LC_Close(void)
+
+
+
+
+
+
+

LC_ErInitiert

+Is FYBA initialised
+=============================================================================
+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)
+
+ +
+
+
+
+
+

LC_MaxSkriv

+Maximum number of times to write before writing to the SOSI file
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqMaxSkriv

+Maximum number of times to write before writing to the SOSI file
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetNgisModus

+Choose NGIS mode
+==========================================================================
+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)
+
+ +
+
+
+
+
+

LC_SetDefLpfi

+Available space between groups
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqDefLpfi

+Gets the available space between groups
+==========================================================================
+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)
+
+ +
+
+
+
+
+

LC_SetUtvidModus

+Set the expanding mode
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetUtvidModus

+Get the expanding mode
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

6 Opening Base and SOSI Files

+ +
+
+
+
+
+

LC_OpenBase

+Opens a new base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_CloseBase

+Close base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SelectBase

+Selects active base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqCurBase

+Gets the active base
+==========================================================================
+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)
+
+ +
+
+
+
+
+

LC_OpenSos

+Åpner og sjekker SOSI-fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_CloseSos

+Close SOSI file
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_DelIdx

+Delete the index files
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FcloseSos

+Close an opened SOSI file in the file system
+==========================================================================
+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)
+
+ + +
+
+
+
+
+
+

7 Helper Functions

+ +
+
+
+

7.1 Base og File

+
+
+
+
+
+

LC_GetBaOm

+Get the base area
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetFiOm

+Get area from the file header
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetFiNr

+Get file number
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetFiNa

+Get filename
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTegnsett

+Get encoding
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqLag

+Get which layer the active group belongs to
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqFilLag

+Get which layer a file belongs to
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetFilLag

+Set which layer a file belongs to
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FiLastGr

+Find the last group in the file
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErFilBase

+Check if the file is in the base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErKoordsysLik

+Check that all files in the base have the same coordinate system
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_ErVertdatumLik

+Check that all files have the same VERT-DATUM
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_Backup

+Make backup of a SOSI file
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetNgisLag

+Get NGIS-LAG from a file
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetFilType

+Set file type for a SOSI file
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetFilType

+Get file type for a SOSI file
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErLik_Avrundet

+Rund av og sjekk om sammenfallende punkt
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErLik_IkkeAvrundet

+Sjekk om sammenfallende punkt (uten avrunding)
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErReferert

+Sjekk om gruppe er referert
+==========================================================================
+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)
+
+ +
+
+
+

7.2 SOSI Group

+
+
+
+
+
+

LC_GetGrNr

+Hent gruppe-nummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetGrPara

+Hent gruppe-parametre
+==========================================================================
+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 LC_RxGr)
+Usage:
+    gnavn = LC_GetGrPara(&ngi,&nko,&info);
+   ==========================================================================
+ 
+SK_EntPnt_FYBA short LC_GetGrPara(short *ngi,long *nko,unsigned short *info)
+
+
+
+
+
+
+

LC_GetGrParaBgr

+Hent gruppe-parametre for gruppe
+=============================================================================
+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 LC_RxGr)
+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)
+
+
+
+
+
+
+

LC_GetGrFi

+Hent gruppe-filnr
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_SetEndringsstatus

+Setter endringsstatus for aktuell gruppe
+==========================================================================
+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)
+
+ +
+
+
+

7.3 Header, active group

+
+
+
+
+
+

LC_NyttHode

+Lager nytt hode
+==========================================================================
+Purpose:
+Legger inn et standard SOSI-filhode i ginfo i aktuell gruppe.
+Parameters:
+    ingen
+Usage:
+    LC_NyttHode();
+==========================================================================
+ 
+SK_EntPnt_FYBA void LC_NyttHode(void)
+
+
+
+
+
+
+

LC_TestHode

+Tester SOSI-hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetOmr

+Finner ..OMRÅDE i hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutOmr

+Legger inn ..OMRÅDE i hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTrans

+Finner ..TRANSPAR i hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTransEx

+Henter ..TRANSPAR fra hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutTrans

+Legger inn ..TRANSPAR i hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutTransEx

+Legger inn ..TRANSPAR i hodet
+==========================================================================
+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    
+    ...TRANSSYS        
+    ...GEOSYS    
+    ...GEOKOORD  
+    ...ORIGO-NØ   
+    ...ENHET  
+    ...ENHET-H  
+    ...ENHET-D  
+    ...VERT-DATUM     
+    ...VERT-INT    
+    ...VERT-DELTA  
+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)
+
+ +
+
+
+

7.4 Header, directly from SOSI-file

+
+
+
+
+
+

HO_New

+Lager nytt hode
+ =========================================================================
+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)
+
+
+
+
+
+
+

HO_TestSOSI

+Tester SOSI-filen
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetKvalitet

+Finner kvalitetsopplysninger
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetTegnsett

+Finner tegnsett
+==========================================================================
+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)
+
+
+
+
+
+
+

HO_GetVal

+Finn verdien til et SOSI-navn
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetTrans

+Finner .TRANSPAR i hodet
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetTransEx

+Finner .TRANSPAR i hodet
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetOmr

+Finner ..OMRÅDE i hodet
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_SjekkTegnsett

+Sjekker tegnsett på SOSI-filen
+=============================================================================
+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)
+
+ +
+
+
+
+
+
+

8 New Group

+
+
+
+
+
+

LC_NyGr

+Ny gruppe i basen
+==========================================================================
+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 LC_RxGr)
+                         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)
+
+ +
+
+
+
+
+
+

9 Direct Read/Write

+
+
+
+
+
+

LC_RxGr

+Les gruppe fra base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_WxGr

+Skriv gruppe til base
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

10 Sequential Read/Write

+
+
+
+
+
+

LC_RsGr

+Les gruppe sekvensielt
+==========================================================================
+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 LC_RxGr)
+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)
+
+
+
+
+
+
+

LC_RsHode

+Les filhode sekvensiellt
+==========================================================================
+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 LC_RxGr)
+Usage:
+    gnavn = LC_RsHode(pFil,&ngi,&nko,&info);
+   =============================================================================
+ 
+short LC_RsHode(LC_FILADM *pFil,short *ngi,long *nko,unsigned short *info)
+
+
+
+
+
+
+

LC_WsGr

+Skriv gruppe sekvensiellt
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_WsGrPart

+Skriv del av gruppe sekvensiellt
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_EndreHode

+Endre hodet på eksisterende SOSI-fil
+=============================================================================
+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)
+
+ +
+
+
+
+
+
+

11 Delete Group

+
+
+
+
+
+

LC_DelGr

+Slett gruppe
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

12 Storing Back the Buffered Info to a SOSI File

+
+
+
+
+
+

LC_Save

+Tøm skrivekøa
+==========================================================================
+Purpose:
+Skriver gruppene som ligger i skrivekø ut til SOSI-fil.
+Parameters: ingen
+Usage:
+LC_Save();
+   ==========================================================================
+ 
+SK_EntPnt_FYBA void LC_Save(void)
+
+ + +
+
+
+
+
+
+

13 Reserve Space in the Ring Buffer

+ +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 + +
+
+
+
+
+

LC_InsGiL

+Skyt inn GINFO-linjer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_AppGiL

+Heng på en GINFO-linje
+=============================================================================
+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()
+
+
+
+
+
+
+

LC_InsKoL

+Skyt inn koordinatlinjer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_AppKoL

+Heng på en koordinatlinje
+==========================================================================
+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()
+
+
+
+
+
+
+

LC_DelGiL

+Fjern GINFO-linjer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_DelKoL

+Fjern koordinatlinjer
+=============================================================================
+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)
+
+ + +
+
+
+
+
+
+

14 Add Data to the Ring Buffer

+ +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. + +
+
+
+

14.1 Copying group

+
+
+
+
+
+

LC_CopyGr

+Kopier gruppe
+==========================================================================
+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 LC_RxGr)
+short    gnavn    r    Gruppenavn. (Se under LC_RxGr)
+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)
+
+
+
+
+
+
+

LC_CopyCoord

+Kopier koordinater fra annen gruppe
+===========================================================================
+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 LC_RxGr)
+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)
+
+ +
+
+
+

14.2 Group Information

+
+
+
+
+
+

LC_PutGi

+Put GINFO-linje
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutGP

+Put GINFO-parameter
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_AppGP

+Legg til GINFO-parameter
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UpdateGP

+Endre GINFO-parameter
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UpdateGiEnhet

+Oppdater ..ENHET i GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UpdateGiKvalitet

+Oppdaterer ..KVALITET i Ginfo
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UpdatePiKvalitet

+Oppdaterer ...KVALITET i Pinfo
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_OppdaterEndret

+Oppdater ..NGIS-FLAGG
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_DelGiName

+Fjerner egenskap fra GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FinnNivo

+Beregn nivå
+==============================================================
+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)
+
+ +
+
+
+

14.3 Serial Number and Reference Number

+
+
+
+
+
+

LC_PutSn

+Put Serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutRef

+Legger inn referanser i GINFO
+==========================================================================
+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)
+
+ +
+
+
+

14.4 Coordinates

+
+
+
+
+
+

LC_PutTK

+Put koordinat
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutTH

+Put høyde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutTD

+Put dybde
+==========================================================================
+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)
+
+ +
+
+
+

14.5 Connection Nodes

+
+
+
+
+
+

LC_PutKp

+Put knutepunkt
+==========================================================================
+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)
+
+ +
+
+
+

14.6 Node information

+
+
+
+
+
+

LC_PutPi

+Put PINFO
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

15 Get Data from the Ring Buffer

+ +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. + +
+
+
+

15.1 General Value for a SOSI Name

+ +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. + +
+
+
+

15.2 Group Information

+
+
+
+
+
+

LC_GetGi

+Get GINFO-linje
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetGP

+Get GINFO-parameter
+==========================================================================
+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)
+
+ +
+
+
+

15.3 Serial Number and Reference Number

+
+
+
+
+
+

LC_GetSn

+Get serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetRef

+Hent referanser fra GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqAntRef

+Spørr om antall referanser
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InitGetRefFlate

+Initierer status for GetRefFlate
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetRefFlate

+Hent referanser for flate fra GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErLinjeRefLin

+Sjekk om linje inneholder referanser
+=======================================================================
+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)
+
+ +
+
+
+

15.4 Special get functions

+
+
+
+
+
+

LC_GetBuePar

+Beregner parametre som definerer sirkelbue
+============================================================================
+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)
+
+
+
+
+
+
+

LC_GetBue

+Hent bue
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetBuep

+Hent buep
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetSirkel

+Hent silkel
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetSirkelp

+Hent silkelp
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetKvalitet

+Finner kvalitetsopplysninger
+==========================================================================
+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)
+
+ +
+
+
+

15.5 Coordinates

+
+
+
+
+
+

LC_GetTK

+Get koordinat
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetArrayTK

+Hent tabell med koordinater
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTH

+Get høyde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetArrayTH

+Hent tabell med høyder
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetHoyde

+Get høyde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTD

+Get dybde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetDybde

+Get dybde
+==========================================================================
+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)
+
+ +
+
+
+

15.6 Connection Nodes

+
+
+
+
+
+

LC_GetKp

+Get knutepunkt
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FinnKp

+Finn knutepunkt
+==========================================================================
+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)
+
+ +
+
+
+

15.7 Node Information

+
+
+
+
+
+

LC_GetPi

+Get PINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InitPP

+Initier PINFO-søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetPP

+Utfør PINFO-søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetPiVerdi

+Get PINFO-verdi
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_TestPi

+Sjekk om punkt har PINFO
+==========================================================================
+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)
+
+ +
+
+
+

15.8 Special get operations

+
+
+
+
+
+

LC_GetCurEnhet

+Hent enhet på angitt nivå
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetCurKvalitet

+Finner kvalitetsopplysninger på angitt nivå
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetObjtypeBgr

+Hent objekttype
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_GetElementName

+Hent elementnavn
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

16 Iterating in the Base

+
+
+
+
+
+

LC_InitNextFil

+Initier finn neste fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_NextFil

+Finn neste fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InitNextBgr

+Initier finn neste gruppe
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_NextBgr

+Finn neste gruppe
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

17 Geographical Search

+
+
+
+
+
+

LC_GetGrWin

+Hent omskrevet rektangel for gruppe
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SBFlate

+Sett søkegrense for geografisk søk på flate
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FFFlate

+Finn første ved flatesøk
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FNFlate

+Finn neste ved flatesøk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SBGeo

+Sett søkegrense for grov geografisk søk
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FFGeo

+Finn første ved geografisk søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FNGeo

+Finn neste ved geografisk søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FAGeo

+Finn alle ved geografisk søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FFGeoFil

+Finn første ved geografisk søk i en fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FNGeoFil

+Finn neste ved geografisk søk i en fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_AvsluttSok

+Avslutter geografisk søk
+=======================================================================
+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)
+
+ +
+
+
+
+
+

LC_WTst

+Vindustest
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PTst

+Polygontest
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PTstOmkrets

+Sjekk om punkt ligger inni polygon
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

18 Serial Number Search

+
+
+
+
+
+

LC_SBSn

+Sett søkegrense for serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_MoveSn

+Flytt til gruppenummer for et serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FiSn

+Finn gruppenummer for et serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FiArraySn

+Finn gruppenummer for flere serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FASn

+Finn alle serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FFSn

+Finn første serienummer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FNSn

+Finn neste serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FPSn

+Finn forige serienummer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FLSn

+Finn siste serienummer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FFSnBt

+Finn første serienummer med tilleggskrav
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FNSnBt

+Finn neste serienummer med tilleggskrav
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FPSnBt

+Finn forige serienummer med tilleggskrav
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FLSnBt

+Finn siste serienummer med tilleggskrav
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

19 Property Subset

+FYBA har en egen "utvalgsmotor" som har et rikt sett av utvalgsmetoder. +Disse metodene er spesiellt tilpasset SOSI-formatet. + +
+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.)   
+
+
+ +
+
+
+
+
+

LC_OpenQuery

+Initier query
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_CloseQuery

+Avslutter query
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutQueryLine

+Legg inn en query-linje
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutQueryRegel

+Legg inn et regelnavn
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_LesUtvalg

+Les utvalg i kom.filen
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_GetUtRegelName

+Henter regelnavn
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_GruppeUtvalg

+GINFO-utvalg
+==========================================================================
+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,®el);
+   =============================================================================
+ 
+SK_EntPnt_FYBA char *LC_GruppeUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *sstat,char **regelnavn)
+
+
+
+
+
+
+

LC_PunktUtvalg

+PUNKT-utvalg
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FinnPinfoUtvalg

+========================================================================== +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) + +
+
+
+
+
+

LC_PiTestUtvalg

+Sjekk PUNKT/PINFO utvalg
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GiQuery

+Query mot aktuell ginfo
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FAGiQuery

+Finn alle ved query mot ginfo
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FAGiKombinertFlateQuery

+Finn alle ved query mot ginfo i flate og omkrets
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_QueryGP

+Søk i ginfo og finn verdi
+=============================================================================
+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,¶);
+   =============================================================================
+ 
+SK_EntPnt_FYBA short LC_QueryGP(char *qulin,unsigned short iniv,unsigned short *univ,short *ulin,char **para)
+
+
+
+
+
+
+

LC_InqMaxPrioritet

+Hent største prioritet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_TestPrioritetBrukt

+Tester om en prioritet er brukt
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UtvalgPrioritet

+Finn brukt prioritet
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

20 Marking Groups

+
+
+
+
+
+

LC_SetBt

+Sett merke i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ClrBt

+Slett merke i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetBt

+Hent merke i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_EraseBt

+Slett område i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_CopyBt

+Kopier kolonne i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetModusMerk

+Setter flag for merking av referert gruppe.
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_MerkGr

+Merk en gruppe brukttabellen
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

21 Special Handling of Polygons

+
+
+
+
+
+

Polygon Description

+Structs for polygon description.
+
+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:
+LC_POL_GetRef.
+
+
+  !-----------------!
+  ! 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)!
+                                          !-----------------!   !---------------!
+
+
+
+
+
+
+

LC_POL_InitPolygon

+Initierer polygon-struktur
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FrigiPolygon

+Frigi minne som er allokert til polygon
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_InitOmkrets

+Initierer polygon-omkrets
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_LeggTilGruppeOmkrets

+Legg til eit element
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FjernGruppeOmkrets

+Fjernar element
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FjernSisteGruppeOmkrets

+Fjernar siste element
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FrigiOmkrets

+Frigjer minne som er allokert til kjede av polygonelement
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_InitOy

+Initierer øy-kjeden
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FrigiAlleOyer

+Frigjer minne som er allokert til kjede av øyelement
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FjernOy

+Fjernar ei oy frå kjede av øyelement
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_LeggTilOy

+Legg til eit element
+=======================================================================
+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)
+
+ +
+
+
+
+
+

LC_POL_TestBrukt

+Testar om ei gruppe er brukt i polygonet
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_PutRef

+Legger inn referanser i GINFO
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_GetRef

+Hent referanser for flate fra GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_POL_GetRefOmkrets

+Hent referanser for omkretsen av flate
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_POL_PTst

+Polygontest
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_POL_PTstOmkrets

+Sjekk om punkt ligger inni polygonomkrets
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_POL_Box

+Henter omskreven boks
+=======================================================================
+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)
+
+ +
+
+
+
+
+
+

22 Various Functions

+ +
+
+
+

22.1 Calculations

+
+
+
+
+
+

LC_BerAreal

+Calculate the area of the active group
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerLengde

+Calculate the horizonal length of the active group
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerLengde3D

+Calculate the diagonal length of the active group
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerAvgrensLengde

+Calculate the length of the perimeter of a polygon
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerYtreAvgrensLengde

+Calculate the length of the outer perimeter of a polygon
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerIndreAvgrensLengde

+Calculate the length of the inner perimeter of a polygon
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_RoundKoord

+Change the coordinates in the active group to the correct unit
+===========================================================================
+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)
+
+ +
+
+
+

22.2 Structure Changes

+
+
+
+
+
+

LC_SnuGr

+Invert group order
+===========================================================================
+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)
+
+
+
+
+
+
+

LC_SammenfoyGr

+Merge groups
+==========================================================================
+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 LC_RxGr)
+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)
+
+
+
+
+
+
+

LC_SplittGr

+Split group
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErstattReferanse

+Replace reference
+==========================================================================
+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)
+
+ +
+
+
+

22.3 The Entire Base

+
+
+
+
+
+

LC_InqAntFiler

+Get number of files in the base
+==========================================================================
+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)
+
+ + +
+
+
+

22.4 Priority

+
+
+
+
+
+

LC_ClrPrioritet

+Clear priority bit
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetPrioritet

+Set priority bit
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqPrioritet

+Get priority bit
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErasePrioritet

+Erase priority bit
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_EraseAllPrioritet

+Erase all priority bits
+==========================================================================
+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)
+
+ +
+
+
+

22.5 Quality

+
+
+
+
+
+

LC_FormatterKvalitet

+Format for KVALITET
+==========================================================================
+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)
+
+ +
+
+
+

22.6 Table Handling

+
+
+
+
+
+

LC_InitTabel

+Initialise the table system
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_PutTabel

+Add one line to the table file (push)
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_GetTabel

+Get one line from the table file
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_CloseTabel

+Close the table system
+=============================================================================
+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)
+
+ +
+
+
+

22.7 Message Handling

+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: + +
+
+
+
+
+

LC_SetErrorHandler

+Set error handler
+=============================================================================
+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*))
+
+
+
+
+
+
+

LC_SetStartMessageHandler

+Set start message handler
+=============================================================================
+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*)) 
+
+
+
+
+
+
+

LC_SetShowMessageHandler

+Set show message handler
+=============================================================================
+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))
+
+
+
+
+
+
+

LC_SetEndMessageHandler

+Set end message handler
+=============================================================================
+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))
+
+
+
+
+
+
+

LC_SetCancelHandler

+Set cancel handler
+=============================================================================
+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))
+
+ +En tilsvarende enkel feilmeldingshandtering ligger i FYBA_DLL.dll. +Denne (DLL'ens) meldingshandteringen blir brukt hvis ekstern meldingshandtering +ikke blir aktivisert. + +
+
+
+
+
+

LC_StartMessage

+Start message
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_ShowMessage

+Show message
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_EndMessage

+End message
+=============================================================================
+Purpose:
+Avslutt melding om baseoppbygging.
+Parameters:
+Type     Name        I/O  Explanation
+-----------------------------------------------------------------------------
+Usage:
+LC_EndMessage();
+=============================================================================
+ 
+void LC_EndMessage(void)
+
+
+
+
+
+
+

LC_Cancel

+Check if Esc has been pushed
+==========================================================================
+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)
+
+ +
+
+
+
+
+

LC_Error

+Error message function
+=============================================================================
+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)
+
+ +
+
+
+

22.8 Helper Functions for Message Handling

+
+
+
+
+
+

LC_StrError

+Error message text
+==========================================================================
+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)
+
+ +
+
+
+

22.9 Debugging

+
+
+
+
+
+

LC_DumpTab

+Dump internal tables to stderr
+==========================================================================
+Purpose:
+Dump internal tables to stderr
+Parameters:
+Type     Name     I/O   Explanation
+--------------------------------------------------------------------------
+Usage:
+LC_DumpTab();
+   =============================================================================
+ 
+SK_EntPnt_FYBA void LC_DumpTab(void)
+
+ + + + + + + + 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 @@ + + + +FYBA + + + + + + 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 @@ + + + + + + +
Innhold:
+

Topp +

1 Innledning +

2 Oversikt over funksjonaliteten til FYBA +

3 Indeks-systemets oppbygning +- Gruppetabell +- Brukttabell +- SOSI-buffer +- Serienummer-tabell +- Geografisk-søketabell +

4 Navnekonvensjoner +

5 Initiering og styring +- LC_Init +- LC_InqVer +- LC_Close +- LC_ErInitiert +- LC_MaxSkriv +- LC_InqMaxSkriv +- LC_SetNgisModus +- LC_SetDefLpfi +- LC_InqDefLpfi +- LC_SetUtvidModus +- LC_GetUtvidModus +

6 Åpning av base og sosi-filer +- LC_OpenBase +- LC_CloseBase +- LC_SelectBase +- LC_InqCurBase +- LC_OpenSos +- LC_CloseSos +- LC_DelIdx +- LC_FcloseSos +

7 Hjelpefunksjoner +

7.1 Base og fil +- LC_GetBaOm +- LC_GetFiOm +- LC_GetFiNr +- LC_GetFiNa +- LC_GetTegnsett +- LC_InqLag +- LC_InqFilLag +- LC_SetFilLag +- LC_FiLastGr +- LC_ErFilBase +- LC_ErKoordsysLik +- LC_ErVertdatumLik +- LC_Backup +- LC_GetNgisLag +- LC_SetFilType +- LC_GetFilType +- LC_ErLik_Avrundet +- LC_ErLik_IkkeAvrundet +- LC_ErReferert +

7.2 SOSI-gruppe +- LC_GetGrNr +- LC_GetGrPara +- LC_GetGrParaBgr +- LC_GetGrFi +- LC_SetEndringsstatus +

7.3 Hode, aktuell gruppe +- LC_NyttHode +- LC_TestHode +- LC_GetOmr +- LC_PutOmr +- LC_GetTrans +- LC_GetTransEx +- LC_PutTrans +- LC_PutTransEx +

7.4 Hode, direkte fra SOSI-fil +- HO_New +- HO_TestSOSI +- HO_GetKvalitet +- HO_GetTegnsett +- HO_GetVal +- HO_GetTrans +- HO_GetTransEx +- HO_GetOmr +- HO_SjekkTegnsett +

8 Ny gruppe +- LC_NyGr +

9 Direkte les/skriv +- LC_RxGr +- LC_WxGr +

10 Sekvensiell les/skriv +- LC_RsGr +- LC_RsHode +- LC_WsGr +- LC_WsGrPart +- LC_EndreHode +

11 Slette gruppe +- LC_DelGr +

12 Tilbakeskriving av buffret info til SOSI-fil +- LC_Save +

13 Reservere plass i ringbuffer +- LC_InsGiL +- LC_AppGiL +- LC_InsKoL +- LC_AppKoL +- LC_DelGiL +- LC_DelKoL +

14 Legge data inn i ringbuffer +

14.1 Kopiere gruppe +- LC_CopyGr +- LC_CopyCoord +

14.2 Gruppeinforasjon +- LC_PutGi +- LC_PutGP +- LC_AppGP +- LC_UpdateGP +- LC_UpdateGiEnhet +- LC_UpdateGiKvalitet +- LC_UpdatePiKvalitet +- LC_OppdaterEndret +- LC_DelGiNavn +- LC_FinnNivo +

14.3 Serienummer og referansenummer +- LC_PutSn +- LC_PutRef +

14.4 Koordinater +- LC_PutTK +- LC_PutTH +- LC_PutTD +

14.5 Knutepunkt +- LC_PutKp +

14.6 Punktinformasjon +- LC_PutPi +

15 Hente data fra ringbuffer +

15.1 Generell verdi til et SOSI-navn +

15.2 Gruppeinforasjon +- LC_GetGi +- LC_GetGP +

15.3 Serienummer og referansenummer +- LC_GetSn +- LC_GetRef +- LC_InqAntRef +- LC_InitGetRefFlate +- LC_GetRefFlate +- LC_ErLinjeRefLin +

15.4 Spesielle get-rutiner +- LC_GetBuePar +- LC_GetBue +- LC_GetBuep +- LC_GetSirkel +- LC_GetSirkelp +- LC_GetKvalitet +

15.5 Koordinater +- LC_GetTK +- LC_GetArrayTK +- LC_GetTH +- LC_GetArrayTH +- LC_GetHoyde +- LC_GetTD +- LC_GetDybde +

15.6 Knutepunkt +- LC_GetKp +- LC_FinnKp +

15.7 Punktinformasjon +- LC_GetPi +- LC_InitPP +- LC_GetPP +- LC_GetPiVerdi +- LC_TestPi +

15.8 Spesielle henteoperasjoner +- LC_GetCurEnhet +- LC_GetCurKvalitet +- LC_GetObjtypeBgr +- LC_GetElementNavn +

16 Blaing i basen +- LC_InitNextFil +- LC_NextFil +- LC_InitNextBgr +- LC_NextBgr +

17 Geografisk søking +- LC_GetGrWin +- LC_SBFlate +- LC_FFFlate +- LC_FNFlate +- LC_SBGeo +- LC_FFGeo +- LC_FNGeo +- LC_FAGeo +- LC_FFGeoFil +- LC_FNGeoFil +- LC_AvsluttSok +- LC_WTst +- LC_PTst +- LC_PTstOmkrets +

18 Serienummer-søking +- LC_SBSn +- LC_MoveSn +- LC_FiSn +- LC_FiArraySn +- LC_FASn +- LC_FFSn +- LC_FNSn +- LC_FPSn +- LC_FLSn +- LC_FFSnBt +- LC_FNSnBt +- LC_FPSnBt +- LC_FLSnBt +

19 Egenskapsutvalg +- LC_OpenQuery +- LC_CloseQuery +- LC_PutQueryLine +- LC_PutQueryRegel +- LC_LesUtvalg +- LC_GetUtRegelNavn +- LC_GruppeUtvalg +- LC_PunktUtvalg +- LC_FinnPinfoUtvalg +- LC_PiTestUtvalg +- LC_GiQuery +- LC_FAGiQuery +- LC_FAGiKombinertFlateQuery +- LC_QueryGP +- LC_InqMaxPrioritet +- LC_TestPrioritetBrukt +- LC_UtvalgPrioritet +

20 Merke grupper +- LC_SetBt +- LC_ClrBt +- LC_GetBt +- LC_EraseBt +- LC_CopyBt +- LC_SetModusMerk +- LC_MerkGr +

21 Spesiell handtering av flater +- Polygonbeskrivelse +- LC_POL_InitPolygon +- LC_POL_FrigiPolygon +- LC_POL_InitOmkrets +- LC_POL_LeggTilGruppeOmkrets +- LC_POL_FjernGruppeOmkrets +- LC_POL_FjernSisteGruppeOmkrets +- LC_POL_FrigiOmkrets +- LC_POL_InitOy +- LC_POL_FrigiAlleOyer +- LC_POL_FjernOy +- LC_POL_LeggTilOy +- LC_POL_TestBrukt +- LC_POL_PutRef +- LC_POL_GetRef +- LC_POL_GetRefOmkrets +- LC_POL_PTst +- LC_POL_PTstOmkrets +- LC_POL_Box +

22 Diverse funksjoner +

22.1 Beregninger +- LC_BerAreal +- LC_BerLengde +- LC_BerLengde3D +- LC_BerAvgrensLengde +- LC_BerYtreAvgrensLengde +- LC_BerIndreAvgrensLengde +- LC_RoundKoord +

22.2 Strukturendring +- LC_SnuGr +- LC_SammenfoyGr +- LC_SplittGr +- LC_ErstattReferanse +

22.3 Hele basen +- LC_InqAntFiler +

22.4 Prioritet +- LC_ClrPrioritet +- LC_SetPrioritet +- LC_InqPrioritet +- LC_ErasePrioritet +- LC_EraseAllPrioritet +

22.5 Kvalitet +- LC_FormatterKvalitet +

22.6 Tabellhandtering +- LC_InitTabel +- LC_PutTabel +- LC_GetTabel +- LC_CloseTabel +

22.7 Meldingshandtering +- LC_SetErrorHandler +- LC_SetStartMessageHandler +- LC_SetShowMessageHandler +- LC_SetEndMessageHandler +- LC_SetCancelHandler +- LC_StartMessage +- LC_ShowMessage +- LC_EndMessage +- LC_Cancel +- LC_Error +

22.8 Hjelperutine for meldingshandtering +- LC_StrError +

22.9 Feilsøking +- LC_DumpTab +

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 @@ + + + + + + +
+
+
FYBA
+
+
Et lagringssystem for geodata på SOSI-format.
+
+
+
+
+
Sist oppdatert: 2013-10-09 av rosand
+ + + +
+
+
+
+
+
+

1 Innledning

+ + +FYBA er et rutinebibliotek for å kunne håndtere +SOSI-filer på en +mest mulig elegant måte, både mht. søking, lesing og oppdatering. +FYBA er nå tilpasset SOSI-format +versjon 4.0, og blir fortløpende tilpasset nye SOSI-versjoner. +
+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. + +
+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). + + +
+
+
+
+
+
+

2 Oversikt over funksjonaliteten til FYBA

+ + +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. + +
+                         !---------------!
+       !---------------->! Indeks-filer  !<-------!
+       !                 !---------------!        !
+       !                        ^                 !
+       !                        !                 !
+       !                    !---!-----!           !   !-----------------!
+       !                    !         !           !-->!                 !
+       !                    ! Buffer  !               !                 !
+!------!------!  LC_Rxxxx   !         !  LC_PutXxx    ! Bruker-program  !
+! SOSI-fil(er)!<----------- ! internt !<------------- !                 !
+!             ! ----------->!         !               !                 !
+!-------------!  LC_Wxxxx   ! i       ! ------------->!                 !
+                            !         !  LC_GetXxx    !                 !
+                            ! FYBA-   !               !                 !
+                            !         !               !                 !
+                            ! rutinene!               !-----------------!
+                            !         !
+                            !---------!
+
+
+
+
+
+
+
+
+

3 Indeks-systemets oppbygning

+ +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: + +
+
+
+
+
+

Gruppetabell

+Gruppetabell
+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 !
+*------------------------------------------------------------------------------*
+
+
+
+
+
+
+

Brukttabell

+Merking av grupper
+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
+
+ +
+
+
+
+
+

SOSI-buffer

+Binær kopi av SOSI-filen
+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 !
+
+ +
+
+
+
+
+

Serienummer-tabell

+!-------------* +! Gruppenummer! +!-------------! Linjenummer i tabellen er serienummer. +! lGrNr ! +! (long) ! +*-------------* +
+ +
+
+
+
+
+

Geografisk-søketabell

+Geografisk søketabell
+
+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    !
+!        !        !        !        !
+*-----------------------------------*
+
+ +
+
+
+
+
+
+

4 Navnekonvensjoner

+ + +Variabelnavn er fritt valgt for å si mest mulig om hva variabelen inneholder. +
+De fleste rutiner i brukergrensesnittet starter med "LC_": +
+I tillegg kommer noen spesielle rutiner for å lese filhodet direkte fra +SOSI-fil. Disse har navn som starter med "HO_": + +
+
+
+
+
+
+

5 Initiering og styring

+ +
+
+
+
+
+

LC_Init

+Initierer FYBA
+=============================================================================
+Formål:
+Initierer FYBA.
+Parametre:
+Type     Navn      I/U   Forklaring
+-----------------------------------------------------------------------------
+Bruk:
+LC_Init();
+   =============================================================================
+ 
+SK_EntPnt_FYBA void LC_Init(void)
+
+
+
+
+
+
+

LC_InqVer

+Identifikasjon
+=============================================================================
+Formål:
+Henter versjons-identifikasjon for dette biblioteket.
+   =============================================================================
+ 
+SK_EntPnt_FYBA char *LC_InqVer(void)
+
+
+
+
+
+
+

LC_Close

+Stenger ned FYBA
+=============================================================================
+Formål:
+Stenger ned FYBA.
+Parametre:
+Type     Navn      I/U   Forklaring
+-----------------------------------------------------------------------------
+Bruk:
+LC_Close();
+	=============================================================================
+ 
+SK_EntPnt_FYBA void LC_Close(void)
+
+
+
+
+
+
+

LC_ErInitiert

+Er FYBA initiert
+=============================================================================
+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)
+
+ +
+
+
+
+
+

LC_MaxSkriv

+Max skriv før lagring
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqMaxSkriv

+Max skriv før lagring
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetNgisModus

+Velg NGIS modus
+==========================================================================
+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)
+
+ +
+
+
+
+
+

LC_SetDefLpfi

+Ledig plass mellom grupper
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqDefLpfi

+Hent ledig plass mellom grupper
+==========================================================================
+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)
+
+ +
+
+
+
+
+

LC_SetUtvidModus

+Velg utvis modus
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetUtvidModus

+Hent utvis modus
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

6 Åpning av base og sosi-filer

+ +
+
+
+
+
+

LC_OpenBase

+Åpner ny base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_CloseBase

+Steng base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SelectBase

+Velg aktuell base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqCurBase

+Aktuell base
+==========================================================================
+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)
+
+ +
+
+
+
+
+

LC_OpenSos

+Åpner og sjekker SOSI-fil
+==========================================================================
+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);
+   ==========================================================================
+ 
+/// LC_OpenSos Åpner og sjekker SOSI-fil FYBA biblioteket.
+/// 
+/// Filnavn inkl. sti og fil-type (Hvis fil-type mangler forutsettes  .SOS)
+SK_EntPnt_FYBA short LC_OpenSos(const char *fil,short sModus,short sNyIdx,short sVisStatus,
+                                LC_FILADM **pFil, short *o_stat)
+
+
+
+
+
+
+

LC_CloseSos

+Steng SOSI-fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_DelIdx

+Sletter indeksfilene
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FcloseSos

+Steng åpen SOSI-fil i filsystemet
+==========================================================================
+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)
+
+ + +
+
+
+
+
+
+

7 Hjelpefunksjoner

+ +
+
+
+

7.1 Base og fil

+
+
+
+
+
+

LC_GetBaOm

+Hent baseområde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetFiOm

+Hent område fra fil-hode
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetFiNr

+Get fil nummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetFiNa

+Hent filnavn
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTegnsett

+Finner tegnsett
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqLag

+Finn hvilet lag aktuell gruppe tilhører
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqFilLag

+Finn hvilet lag en fil tilhører
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetFilLag

+Velg hvilet lag en fil tilhører
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FiLastGr

+Finn siste gruppe i filen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErFilBase

+Sjekker om en fil er i basen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErKoordsysLik

+Sjekker KOORDSYS
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_ErVertdatumLik

+Sjekker VERT-DATUM
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_Backup

+Lag backup av gitt SOSI-fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetNgisLag

+Hent NGIS-LAG
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetFilType

+Setter filtype for en sosifil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetFilType

+Henter filtype for en sosifil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErLik_Avrundet

+Rund av og sjekk om sammenfallende punkt
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErLik_IkkeAvrundet

+Sjekk om sammenfallende punkt (uten avrunding)
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErReferert

+Sjekk om gruppe er referert
+==========================================================================
+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)
+
+ +
+
+
+

7.2 SOSI-gruppe

+
+
+
+
+
+

LC_GetGrNr

+Hent gruppe-nummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetGrPara

+Hent gruppe-parametre
+==========================================================================
+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 LC_RxGr)
+Bruk:
+    gnavn = LC_GetGrPara(&ngi,&nko,&info);
+   ==========================================================================
+ 
+SK_EntPnt_FYBA short LC_GetGrPara(short *ngi,long *nko,unsigned short *info)
+
+
+
+
+
+
+

LC_GetGrParaBgr

+Hent gruppe-parametre for gruppe
+=============================================================================
+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 LC_RxGr)
+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)
+
+
+
+
+
+
+

LC_GetGrFi

+Hent gruppe-filnr
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_SetEndringsstatus

+Setter endringsstatus for aktuell gruppe
+==========================================================================
+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)
+
+ +
+
+
+

7.3 Hode, aktuell gruppe

+
+
+
+
+
+

LC_NyttHode

+Lager nytt hode
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_TestHode

+Tester SOSI-hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetOmr

+Finner ..OMRÅDE i hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutOmr

+Legger inn ..OMRÅDE i hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTrans

+Finner ..TRANSPAR i hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTransEx

+Henter ..TRANSPAR fra hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutTrans

+Legger inn ..TRANSPAR i hodet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutTransEx

+Legger inn ..TRANSPAR i hodet
+==========================================================================
+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    
+    ...TRANSSYS        
+    ...GEOSYS    
+    ...GEOKOORD  
+    ...ORIGO-NØ   
+    ...ENHET  
+    ...ENHET-H  
+    ...ENHET-D  
+    ...VERT-DATUM     
+    ...VERT-INT    
+    ...VERT-DELTA  
+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)
+
+ +
+
+
+

7.4 Hode, direkte fra SOSI-fil

+
+
+
+
+
+

HO_New

+Lager nytt hode
+ =========================================================================
+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)
+
+
+
+
+
+
+

HO_TestSOSI

+Tester SOSI-filen
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetKvalitet

+Finner kvalitetsopplysninger
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetTegnsett

+Finner tegnsett
+==========================================================================
+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)
+
+
+
+
+
+
+

HO_GetVal

+Finn verdien til et SOSI-navn
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetTrans

+Finner .TRANSPAR i hodet
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetTransEx

+Finner .TRANSPAR i hodet
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_GetOmr

+Finner ..OMRÅDE i hodet
+=============================================================================
+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)
+
+
+
+
+
+
+

HO_SjekkTegnsett

+Sjekker tegnsett på SOSI-filen
+=============================================================================
+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)
+
+ +
+
+
+
+
+
+

8 Ny gruppe

+
+
+
+
+
+

LC_NyGr

+Ny gruppe i basen
+==========================================================================
+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 LC_RxGr)
+                         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)
+
+ +
+
+
+
+
+
+

9 Direkte les/skriv

+
+
+
+
+
+

LC_RxGr

+Les gruppe fra base
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_WxGr

+Skriv gruppe til base
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

10 Sekvensiell les/skriv

+
+
+
+
+
+

LC_RsGr

+Les gruppe sekvensielt
+==========================================================================
+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 LC_RxGr)
+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)
+
+
+
+
+
+
+

LC_RsHode

+Les filhode sekvensiellt
+==========================================================================
+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 LC_RxGr)
+Bruk:
+    gnavn = LC_RsHode(pFil,&ngi,&nko,&info);
+   =============================================================================
+ 
+short LC_RsHode(LC_FILADM *pFil,short *ngi,long *nko,unsigned short *info)
+
+
+
+
+
+
+

LC_WsGr

+Skriv gruppe sekvensiellt
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_WsGrPart

+Skriv del av gruppe sekvensiellt
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_EndreHode

+Endre hodet på eksisterende SOSI-fil
+=============================================================================
+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)
+
+ +
+
+
+
+
+
+

11 Slette gruppe

+
+
+
+
+
+

LC_DelGr

+Slett gruppe
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

12 Tilbakeskriving av buffret info til SOSI-fil

+
+
+
+
+
+

LC_Save

+Tøm skrivekøa
+==========================================================================
+Formål:
+Skriver gruppene som ligger i skrivekø ut til SOSI-fil.
+Parametre: ingen
+Bruk:
+LC_Save();
+   ==========================================================================
+ 
+SK_EntPnt_FYBA void LC_Save(void)
+
+ + +
+
+
+
+
+
+

13 Reservere plass i ringbuffer

+ +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. + +
+
+
+
+
+

LC_InsGiL

+Skyt inn GINFO-linjer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_AppGiL

+Heng på en GINFO-linje
+=============================================================================
+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()
+
+
+
+
+
+
+

LC_InsKoL

+Skyt inn koordinatlinjer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_AppKoL

+Heng på en koordinatlinje
+==========================================================================
+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()
+
+
+
+
+
+
+

LC_DelGiL

+Fjern GINFO-linjer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_DelKoL

+Fjern koordinatlinjer
+=============================================================================
+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)
+
+ + +
+
+
+
+
+
+

14 Legge data inn i ringbuffer

+ +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. + +
+
+
+

14.1 Kopiere gruppe

+
+
+
+
+
+

LC_CopyGr

+Kopier gruppe
+==========================================================================
+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 LC_RxGr)
+short    gnavn    r    Gruppenavn. (Se under LC_RxGr)
+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)
+
+
+
+
+
+
+

LC_CopyCoord

+Kopier koordinater fra annen gruppe
+===========================================================================
+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 LC_RxGr)
+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)
+
+ +
+
+
+

14.2 Gruppeinformasjon

+
+
+
+
+
+

LC_PutGi

+Put GINFO-linje
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutGP

+Put GINFO-parameter
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_AppGP

+Legg til GINFO-parameter
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UpdateGP

+Endre GINFO-parameter
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UpdateGiEnhet

+Oppdater ..ENHET i GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UpdateGiKvalitet

+Oppdaterer ..KVALITET i Ginfo
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UpdatePiKvalitet

+Oppdaterer ...KVALITET i Pinfo
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_OppdaterEndret

+Oppdater ..NGIS-FLAGG
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_DelGiNavn

+Fjerner egenskap fra GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FinnNivo

+Beregn nivå
+==============================================================
+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)
+
+ +
+
+
+

14.3 Serienummer og referansenummer

+
+
+
+
+
+

LC_PutSn

+Put Serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutRef

+Legger inn referanser i GINFO
+==========================================================================
+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)
+
+ +
+
+
+

14.4 Koordinater

+
+
+
+
+
+

LC_PutTK

+Put koordinat
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutTH

+Put høyde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutTD

+Put dybde
+==========================================================================
+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)
+
+ +
+
+
+

14.5 Knutepunkt

+
+
+
+
+
+

LC_PutKp

+Put knutepunkt
+==========================================================================
+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)
+
+ +
+
+
+

14.6 Punktinformasjon

+
+
+
+
+
+

LC_PutPi

+Put PINFO
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

15 Hente data fra ringbuffer

+ +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. + +
+
+
+

15.1 Generell verdi til et SOSI-navn

+ +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. + +
+
+
+

15.2 Gruppeinformasjon

+
+
+
+
+
+

LC_GetGi

+Get GINFO-linje
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetGP

+Get GINFO-parameter
+==========================================================================
+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)
+
+ +
+
+
+

15.3 Serienummer og referansenummer

+
+
+
+
+
+

LC_GetSn

+Get serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetRef

+Hent referanser fra GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqAntRef

+Spørr om antall referanser
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InitGetRefFlate

+Initierer status for GetRefFlate
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetRefFlate

+Hent referanser for flate fra GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErLinjeRefLin

+Sjekk om linje inneholder referanser
+=======================================================================
+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)
+
+ +
+
+
+

15.4 Spesielle get-rutiner

+
+
+
+
+
+

LC_GetBuePar

+Beregner parametre som definerer sirkelbue
+============================================================================
+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)
+
+
+
+
+
+
+

LC_GetBue

+Hent bue
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetBuep

+Hent buep
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetSirkel

+Hent silkel
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetSirkelp

+Hent silkelp
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetKvalitet

+Finner kvalitetsopplysninger
+==========================================================================
+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)
+
+ +
+
+
+

15.5 Koordinater

+
+
+
+
+
+

LC_GetTK

+Get koordinat
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetArrayTK

+Hent tabell med koordinater
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTH

+Get høyde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetArrayTH

+Hent tabell med høyder
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetHoyde

+Get høyde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetTD

+Get dybde
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetDybde

+Get dybde
+==========================================================================
+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)
+
+ +
+
+
+

15.6 Knutepunkt

+
+
+
+
+
+

LC_GetKp

+Get knutepunkt
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FinnKp

+Finn knutepunkt
+==========================================================================
+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)
+
+ +
+
+
+

15.7 Punktinformasjon

+
+
+
+
+
+

LC_GetPi

+Get PINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InitPP

+Initier PINFO-søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetPP

+Utfør PINFO-søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetPiVerdi

+Get PINFO-verdi
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_TestPi

+Sjekk om punkt har PINFO
+==========================================================================
+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)
+
+ +
+
+
+

15.8 Spesielle henteoperasjoner

+
+
+
+
+
+

LC_GetCurEnhet

+Hent enhet på angitt nivå
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetCurKvalitet

+Finner kvalitetsopplysninger på angitt nivå
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetObjtypeBgr

+Hent objekttype
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_GetElementNavn

+Hent elementnavn
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

16 Blaing i basen

+
+
+
+
+
+

LC_InitNextFil

+Initier finn neste fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_NextFil

+Finn neste fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InitNextBgr

+Initier finn neste gruppe
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_NextBgr

+Finn neste gruppe
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

17 Geografisk søking

+
+
+
+
+
+

LC_GetGrWin

+Hent omskrevet rektangel for gruppe
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SBFlate

+Sett søkegrense for geografisk søk på flate
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FFFlate

+Finn første ved flatesøk
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FNFlate

+Finn neste ved flatesøk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SBGeo

+Sett søkegrense for grov geografisk søk
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FFGeo

+Finn første ved geografisk søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FNGeo

+Finn neste ved geografisk søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FAGeo

+Finn alle ved geografisk søk
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FFGeoFil

+Finn første ved geografisk søk i en fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FNGeoFil

+Finn neste ved geografisk søk i en fil
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_AvsluttSok

+Avslutter geografisk søk
+=======================================================================
+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)
+
+ +
+
+
+
+
+

LC_WTst

+Vindustest
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PTst

+Polygontest
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PTstOmkrets

+Sjekk om punkt ligger inni polygon
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

18 Serienummer-søking

+
+
+
+
+
+

LC_SBSn

+Sett søkegrense for serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_MoveSn

+Flytt til gruppenummer for et serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FiSn

+Finn gruppenummer for et serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FiArraySn

+Finn gruppenummer for flere serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FASn

+Finn alle serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FFSn

+Finn første serienummer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FNSn

+Finn neste serienummer
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FPSn

+Finn forige serienummer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FLSn

+Finn siste serienummer
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FFSnBt

+Finn første serienummer med tilleggskrav
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FNSnBt

+Finn neste serienummer med tilleggskrav
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FPSnBt

+Finn forige serienummer med tilleggskrav
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_FLSnBt

+Finn siste serienummer med tilleggskrav
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

19 Egenskapsutvalg

+FYBA har en egen "utvalgsmotor" som har et rikt sett av utvalgsmetoder. +Disse metodene er spesiellt tilpasset SOSI-formatet. + +
+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.)   
+
+
+ +
+
+
+
+
+

LC_OpenQuery

+Initier query
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_CloseQuery

+Avslutter query
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutQueryLine

+Legg inn en query-linje
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_PutQueryRegel

+Legg inn et regelnavn
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_LesUtvalg

+Les utvalg i kom.filen
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_GetUtRegelNavn

+Henter regelnavn
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_GruppeUtvalg

+GINFO-utvalg
+==========================================================================
+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,®el);
+   =============================================================================
+ 
+SK_EntPnt_FYBA char *LC_GruppeUtvalg(LC_UT_ADM *pUtAdm,short sPrior,short *sstat,char **regelnavn)
+
+
+
+
+
+
+

LC_PunktUtvalg

+PUNKT-utvalg
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FinnPinfoUtvalg

+========================================================================== +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) + +
+
+
+
+
+

LC_PiTestUtvalg

+Sjekk PUNKT/PINFO utvalg
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GiQuery

+Query mot aktuell ginfo
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FAGiQuery

+Finn alle ved query mot ginfo
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_FAGiKombinertFlateQuery

+Finn alle ved query mot ginfo i flate og omkrets
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_QueryGP

+Søk i ginfo og finn verdi
+=============================================================================
+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,¶);
+   =============================================================================
+ 
+SK_EntPnt_FYBA short LC_QueryGP(char *qulin,unsigned short iniv,unsigned short *univ,short *ulin,char **para)
+
+
+
+
+
+
+

LC_InqMaxPrioritet

+Hent største prioritet
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_TestPrioritetBrukt

+Tester om en prioritet er brukt
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_UtvalgPrioritet

+Finn brukt prioritet
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

20 Merke grupper

+
+
+
+
+
+

LC_SetBt

+Sett merke i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ClrBt

+Slett merke i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_GetBt

+Hent merke i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_EraseBt

+Slett område i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_CopyBt

+Kopier kolonne i brukttabellen
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetModusMerk

+Setter flag for merking av referert gruppe.
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_MerkGr

+Merk en gruppe brukttabellen
+==========================================================================
+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)
+
+ +
+
+
+
+
+
+

21 Spesiell handtering av flater

+
+
+
+
+
+

Polygonbeskrivelse

+Strukturer for polygonbeskrivelse.
+
+Dette er et sett med strukturer som er kjedet sammen til en komplett
+beskrielse av en flate. Eksempel på bruk er gitt under LC_POL_GetRef.
+
+
+  !-----------------!
+  ! 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)!
+                                          !-----------------!   !---------------!
+
+
+
+
+
+
+

LC_POL_InitPolygon

+Initierer polygon-struktur
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FrigiPolygon

+Frigi minne som er allokert til polygon
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_InitOmkrets

+Initierer polygon-omkrets
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_LeggTilGruppeOmkrets

+Legg til eit element
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FjernGruppeOmkrets

+Fjernar element
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FjernSisteGruppeOmkrets

+Fjernar siste element
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FrigiOmkrets

+Frigjer minne som er allokert til kjede av polygonelement
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_InitOy

+Initierer øy-kjeden
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FrigiAlleOyer

+Frigjer minne som er allokert til kjede av øyelement
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_FjernOy

+Fjernar ei oy frå kjede av øyelement
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_LeggTilOy

+Legg til eit element
+=======================================================================
+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)
+
+ +
+
+
+
+
+

LC_POL_TestBrukt

+Testar om ei gruppe er brukt i polygonet
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_PutRef

+Legger inn referanser i GINFO
+=======================================================================
+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)
+
+
+
+
+
+
+

LC_POL_GetRef

+Hent referanser for flate fra GINFO
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_POL_GetRefOmkrets

+Hent referanser for omkretsen av flate
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_POL_PTst

+Polygontest
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_POL_PTstOmkrets

+Sjekk om punkt ligger inni polygonomkrets
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_POL_Box

+Henter omskreven boks
+=======================================================================
+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)
+
+ +
+
+
+
+
+
+

22 Diverse funksjoner

+ +
+
+
+

22.1 Beregninger

+
+
+
+
+
+

LC_BerAreal

+Beregn areal av aktuell FLATE
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerLengde

+Beregn horisontal lengde av aktuell gruppe
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerLengde3D

+Beregn skrå lengde av aktuell gruppe
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerAvgrensLengde

+Beregn lengden av avgrensning av FLATE
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerYtreAvgrensLengde

+Beregn lengden av ytre avgrensning av FLATE
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_BerIndreAvgrensLengde

+Beregn lengden av indre avgrensning av FLATE
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_RoundKoord

+Endre koordinatene i buffer til riktig enhet
+===========================================================================
+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)
+
+ +
+
+
+

22.2 Strukturendring

+
+
+
+
+
+

LC_SnuGr

+Snu gruppe
+===========================================================================
+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)
+
+
+
+
+
+
+

LC_SammenfoyGr

+Sammenføy grupper
+==========================================================================
+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 LC_RxGr)
+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)
+
+
+
+
+
+
+

LC_SplittGr

+Splitt gruppe
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErstattReferanse

+Erstatt referanse
+==========================================================================
+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)
+
+ +
+
+
+

22.3 Hele basen

+
+
+
+
+
+

LC_InqAntFiler

+Finn antall filer i basen
+==========================================================================
+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)
+
+ + +
+
+
+

22.4 Prioritet

+
+
+
+
+
+

LC_ClrPrioritet

+Slett prioritets-bit
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_SetPrioritet

+Sett prioritets-bit
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_InqPrioritet

+Hent prioritets-bit
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_ErasePrioritet

+Blank ut prioritets-bit
+==========================================================================
+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)
+
+
+
+
+
+
+

LC_EraseAllPrioritet

+Blank ut ALLE prioritets-bit
+==========================================================================
+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)
+
+ +
+
+
+

22.5 Kvalitet

+
+
+
+
+
+

LC_FormatterKvalitet

+Formatter KVALITET
+==========================================================================
+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)
+
+ +
+
+
+

22.6 Tabellhandtering

+
+
+
+
+
+

LC_InitTabel

+Åpner tabellsystemet
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_PutTabel

+Put tabell-linje
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_GetTabel

+Get tabell-linje
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_CloseTabel

+Stenge tabellsystemet
+=============================================================================
+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)
+
+ +
+
+
+

22.7 Meldingshandtering

+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: +
+
+
+
+
+

LC_SetErrorHandler

+Registrer feilmeldingsrutine
+=============================================================================
+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*))
+
+
+
+
+
+
+

LC_SetStartMessageHandler

+Registrer initieringsrutine
+=============================================================================
+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*)) 
+
+
+
+
+
+
+

LC_SetShowMessageHandler

+Registrer visningsrutine
+=============================================================================
+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))
+
+
+
+
+
+
+

LC_SetEndMessageHandler

+Registrer avslutningsrutine
+=============================================================================
+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))
+
+
+
+
+
+
+

LC_SetCancelHandler

+Registrer avbruddsstyring
+=============================================================================
+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))
+
+ +En tilsvarende enkel feilmeldingshandtering ligger i FYBA_DLL.dll. +Denne (DLL'ens) meldingshandteringen blir brukt hvis ekstern meldingshandtering +ikke blir aktivisert. + +
+
+
+
+
+

LC_StartMessage

+Vise melding
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_ShowMessage

+Vise melding
+=============================================================================
+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)
+
+
+
+
+
+
+

LC_EndMessage

+Avslutt melding
+=============================================================================
+Formål:
+Avslutt melding om baseoppbygging.
+Parametre:
+Type     Navn        I/U  Forklaring
+-----------------------------------------------------------------------------
+Bruk:
+LC_EndMessage();
+=============================================================================
+ 
+void LC_EndMessage(void)
+
+
+
+
+
+
+

LC_Cancel

+Sjekk om Esc er trykket
+==========================================================================
+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)
+
+ +
+
+
+
+
+

LC_Error

+Feilmeldingsrutine
+=============================================================================
+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)
+
+ +
+
+
+

22.8 Hjelperutine for meldingshandtering

+
+
+
+
+
+

LC_StrError

+Feilmeldingstekst
+==========================================================================
+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)
+
+ +
+
+
+

22.9 Feilsøking

+
+
+
+
+
+

LC_DumpTab

+Dump interne tabeller til stderr
+==========================================================================
+Formål:
+Dump interne tabeller til stderr
+Parametre:
+Type     Navn     I/U   Forklaring
+--------------------------------------------------------------------------
+Bruk:
+LC_DumpTab();
+   =============================================================================
+ 
+SK_EntPnt_FYBA void LC_DumpTab(void)
+
+ + + + + + + + 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 +#include + +#include +#include + + +/* ======================================================= */ +/* 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. +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 + +#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 +# include +# 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 +# include + +# ifdef WIN32 +# include +# else +# include +# 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 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 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + SosiVis Debug + Win32 + + + SosiVis Release + Win32 + + + + {26B83785-CE7C-47A5-8B4F-B830185AFFCF} + FYBA + + + + + + + + + Win32Proj + + + + StaticLibrary + v110 + NotSet + + + StaticLibrary + v110 + false + NotSet + false + + + StaticLibrary + v110 + false + NotSet + false + + + StaticLibrary + v110 + NotSet + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Disabled + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + /J + Use + true + Level3 + EditAndContinue + + + $(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt) + + + true + + + copy $(TargetPath) ..\..\Lib\$(ProjectName)D$(TargetExt) + + + + + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDLL + /J + Use + Level3 + + + + $(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt) + + + copy $(TargetPath) ..\..\Lib\$(ProjectName)$(TargetExt) + + + + + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions) + MultiThreadedDLL + /J + Use + Level3 + + + + ..\..\Lib\$(ProjectName).lib + + + copy $(TargetPath) ..\..\Lib\$(ProjectName)$(TargetExt) + + + + + Disabled + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + /J + Use + true + Level3 + EditAndContinue + + + ..\..\Lib\$(ProjectName)D.lib + + + true + + + copy $(TargetPath) ..\..\Lib\$(ProjectName)D$(TargetExt) + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + copy %(FullPath) ..\..\Include\*.* + + ..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + + ..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + + ..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + + ..\..\Include\%(Filename)%(Extension);%(Outputs) + + + + + + + + + + + + + + + + + + + \ 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 +#include +#include +#include + + +/* --- 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 +#include +#include +#include +#include +#include + + +/* 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) +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) +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) +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) +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; ptnko; 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) +CD short gnavn r Gruppenavn. (Se under $LENKE) +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) +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_ptdHoyde = (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 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) +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) +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; sngi); +} + + +/* +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; sulPiOfset != 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; lNrlAntGr; 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; ldHoyde != 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; lNrlAntGr; 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 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 + + + + +/* 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 +#include +#include +#include + +/* 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 +CD ...TRANSSYS +CD ...GEOSYS +CD ...GEOKOORD +CD ...ORIGO-NØ +CD ...ENHET +CD ...ENHET-H +CD ...ENHET-D +CD ...VERT-DATUM +CD ...VERT-INT +CD ...VERT-DELTA +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 + +#ifdef WIN32 +# include +#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; linjelAntGr; 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; linjelAntGr; 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; linjelAntGr; 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; ipGeoRN != 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; lGrNrlAntGr; 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; lGrNrlAntGr; 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; lGrNrlAntGr; 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; antallpIdx != 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; lNrlAntGr; 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; lNrlAntGr; 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; lpFil,"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; lNrlAntGr; 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 +#include + +#include +#include +#include + + +/* --- 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); + ========================================================================== +*/ + +/// LC_OpenSos Åpner og sjekker SOSI-fil FYBA biblioteket. +/// +/// Filnavn inkl. sti og fil-type (Hvis fil-type mangler forutsettes .SOS) +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 , 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(); /* 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; lGrNrlAntGr && !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(); /* 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 +#include +#include + + +/* 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 +#include +#include +#include + + +/* 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 +//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; ptnko; 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; ptnko; 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; isSonAnt; 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; sBoks.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; isSonAnt; 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; isSonAnt; 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; isSonAnt; 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; isSonAnt; 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; ptnko; ++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; ptnko; ++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 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; ptpGeoRN,&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; isSonAnt; 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; isSonAnt; 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; isSonAnt; 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; isSonAnt; 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; isSonAnt; 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; isSonAnt; 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; isSonAnt; 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; isSonAnt; i++) { + LR_R_BoksSum(&(pRN->Boks),&(pRN->Son.pLeaf[i]->Boks)); + } + + } else { + for (i=0; isSonAnt; 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; isSonAnt; i++) { + UT_FREE((char *)pRN->Son.pLeaf[i]); + } + + /* Node */ + } else { + /* Rekursiv sjekk av de underliggende nodene */ + for (i=0; isSonAnt; 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 + + +/* 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; spFil->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 +#include +#include + +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,®el); + ============================================================================= +*/ +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(); /* 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(); /* 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,®el); + 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(); /* avbryter lesing */ + } + } + } + avbrutt = LC_Cancel(); /* 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,¶); + ============================================================================= +*/ +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 && ssPrioritet) { + 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 && ssPrioritet) { + 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 && ssPrioritet) { + 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; sPrioritetGruppe.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 + +#include +#include + + +/* 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--; punktsKp != 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; ipszTx); + } +} + + +/* +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 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 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= 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 + + +/* 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 + +#ifdef WIN32 +# include +#endif + +#ifdef LINUX + +#include +#include +#include +#include + + 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 +#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 +#endif + +#include + +//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 +#include + +#include +#include + + +/* ======================================================= */ +/* 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. +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 +#include +#include + + +/* +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 +#include +#include + +#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 +#include +#include + +#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) || (PktAdPolyMaxN) || (PktN= 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) 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 ((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 (getStartPosition()->clone()); + QdiPosition *pEnd= dynamic_cast (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 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 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + SosiVis Debug + Win32 + + + SosiVis Release + Win32 + + + + {9301EA33-4E58-4692-AC49-FE321C107CE5} + GM + + + + + + + + + Win32Proj + + + + StaticLibrary + v110 + NotSet + + + StaticLibrary + v110 + false + NotSet + false + + + StaticLibrary + v110 + false + NotSet + false + + + StaticLibrary + v110 + NotSet + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Disabled + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + /J + Use + Level3 + EditAndContinue + + + ..\..\Lib\$(ProjectName)D.lib + + + + + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDLL + /J + Use + Level3 + + + + ..\..\Lib\$(ProjectName).lib + + + + + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions) + MultiThreadedDLL + /J + Use + Level3 + + + + ..\..\Lib\$(ProjectName).lib + + + + + Disabled + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + /J + Use + Level3 + EditAndContinue + + + ..\..\Lib\$(ProjectName)D.lib + + + + + + Create + Create + Create + Create + + + + + copy %(FullPath) ..\..\Include\*.* + + ..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + + ..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + + ..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + + ..\..\Include\%(Filename)%(Extension);%(Outputs) + + + + + + + + + + + + + + + \ 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 + +#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 +# include +#endif + +#ifdef OS232 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include +#endif + +#ifdef OS216 +# include +#endif + +#ifdef WIN32 +# include +#endif + +#ifdef BORLAND +# include +#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 +#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 +#endif + +#ifdef UNIX +# include +# include +#endif + +#ifdef OS232 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include +#endif + +#ifdef OS216 +# include +#endif + +#ifdef WIN32 +# include +#endif + +#ifdef BORLAND +# include +#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 +# define UT_access access +#else +# include +# 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 + +#ifdef UNIX +# ifndef _INCLUDE_POSIX_SOURCE +# define _INCLUDE_POSIX_SOURCE +# endif + +# ifndef _HPUX_SOURCE +# define _HPUX_SOURCE +# endif + +# ifdef SUNOS /* NB! DIKAS */ +# include +# else +# include +# include +# endif + +# include +# include +# include +#endif + +#ifdef OS2 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include +#endif + +#ifdef WIN32 +# include +# include +#endif + +#ifdef BORLAND +# include +#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 +#include "fyut.h" + +#ifdef BORLAND +# include +#endif + +#ifdef WIN32 +# include +#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 +#include + +#ifdef LINUX +# include +# include +#endif + +#ifdef UNIX +# include +#endif + +#ifdef OS2 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include +#endif + +#ifdef BORLAND +# include +#endif + +#ifdef WIN32 +# include +#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 +# include +# include +# include +# include +# include +# include +#endif + +#ifdef OS2 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include +#endif + +#ifdef WIN32 +# include +#endif + +#ifdef BORLAND +# include +#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 +# include +# include +# include +# include +# include +# include +#endif + +#ifdef OS2 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include +#endif + +#ifdef WIN32 +# include +# include +# include +# include +#endif + +#ifdef BORLAND +# include +# include +#endif + +#ifdef LINUX +# include +#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 +#endif +#ifdef WIN32 +# include +#endif + +static char *_stpcpy(char *til, const char *fra); + + +/*---------------------------------------------------------------------* + +Name UT_makepath - bygg opp filnavn + +Bruk #include + 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 +#endif + +#ifdef OS232 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include +#endif + +#ifdef OS216 +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# include +# include +#endif + +#ifdef WIN32 +# include +# include +# include +# include +# include +# include +# include +#endif + +#ifdef BORLAND +# include +# include +#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 +#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 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + SosiVis Debug + Win32 + + + SosiVis Release + Win32 + + + + {29669F36-408E-4FE2-B7A2-329A4185CF50} + UT + + + + + + + + + Win32Proj + + + + StaticLibrary + v110 + NotSet + + + StaticLibrary + v110 + false + NotSet + false + + + StaticLibrary + v110 + false + NotSet + false + + + StaticLibrary + v110 + NotSet + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + $(SolutionDir)$(Configuration)\ + $(Configuration)\ + + + + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + /J + Use + Level3 + EditAndContinue + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + + + $(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt) + + + copy $(TargetPath) ..\..\Lib\$(ProjectName)D$(TargetExt) + + + + + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreadedDLL + /J + Use + Level3 + + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + + + $(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt) + + + copy $(TargetPath) ..\..\Lib\$(ProjectName)$(TargetExt) + + + + + WIN32;NDEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions) + MultiThreadedDLL + /J + Use + Level3 + + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + + + $(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt) + + + copy $(TargetPath) ..\..\Lib\$(ProjectName)$(TargetExt) + + + + + Disabled + WIN32;_DEBUG;_LIB;SOSIVIS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + /J + Use + Level3 + EditAndContinue + ..\GM;..\UT;..\..\Include;%(AdditionalIncludeDirectories) + + + $(SolutionDir)$(Configuration)\$(ProjectName)$(TargetExt) + + + copy $(TargetPath) ..\..\Lib\$(ProjectName)D$(TargetExt) + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + copy %(FullPath) ..\..\Include\*.* + ..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + \..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + \..\..\Include\%(Filename)%(Extension);%(Outputs) + copy %(FullPath) ..\..\Include\*.* + ..\..\Include\%(Filename)%(Extension);%(Outputs) + + + + + + + + + + + + + + \ 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 +#endif + +#ifdef UNIX +# ifndef _INCLUDE_POSIX_SOURCE +# define _INCLUDE_POSIX_SOURCE +# endif +# ifndef _HPUX_SOURCE +# define _HPUX_SOURCE +# endif +# include +#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 +#endif + +#ifdef BORLAND +# include +#endif + +#include +#include +#include +#include +#ifndef LINUX + #include +#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 +#include +#include +#include +#include + +#include "fyut.h" + +#ifdef WIN32 +# include +# include +# include +#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 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 +#include +#include +#include +#include + +#ifdef OS2 + #define INCL_DOSMEMMGR + #include +#endif + +#ifdef WIN32 +# include +#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(<ime); + + ntime = localtime(<ime); + + *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(<ime); + + localtime_s(&ntime,<ime); + + *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(<ime); + ntime = localtime(<ime); + *tid++ = (short)ntime->tm_hour; + *tid++ = (short)ntime->tm_min; + *tid++ = (short)ntime->tm_sec; +#else + time_t ltime; + struct tm ntime; + + time(<ime); + localtime_s(&ntime,<ime); + *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 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 +#include +#include +#include + +#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 + +#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 +# include +# 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 +# include + +# ifdef WIN32 +# include +# else +# include +# 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 +#include "fyut.h" + + +// TODO: reference additional headers your program requires here -- cgit v1.2.3