/* == 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);

