/* == 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 = fymin(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 = fymin(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 = fymin(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 = fymin(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 = fymin(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 = fymin(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; }