home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
smapp100.zip
/
sm10.zip
/
smgdifid.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-05-14
|
8KB
|
268 lines
/* ------------------------------------------------------------------------
*
* File: smgdifid.c
* Project: Source Mapper.
* Created: October 19, 1992.
* Description: Kildekode for å samle liste over forskjellige
* identifikatorer/elementer.
* Merk: Listen kan ikke bestå av fler enn 65535 elementer.
*
* Copyright (C) 2000 Leif-Erik Larsen.
* This file is part of the Source Mapper source package.
* Source Mapper 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, in version 2 as it comes in the
* "COPYING" file of the XWorkplace main distribution.
* 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.
*
* ------------------------------------------------------------------------ */
#include "smg.h"
diffbTYPE diffb;
int DiffBConstruct ( const char *fname, int idsize )
/* Opprettet: Mandag 19. oktober 1992.
Parameter: "fname" Navn til filen hvor forskjellige id'er skal lagres.
"idsize" St¢rrelsen til hvert element i listen (byte).
Retur : E/O.
Beskriv : Initierer den globale strukturen "diffb".
Strukturens fil åpnes.
*/
{
unsigned long memfree; /* Ledig RAM */
/* Åpne den midlertidige filen: */
if ((diffb.file = FOpen (fname, "w+b")) == NULL)
RETERR (11, fname); /* Failed on open temporary file! */
/* Alloker hukommelse til buffer for lesing av enkle elementer: */
if ((diffb.buff_test = Alloc (idsize + 1)) == NULL)
{
FClose (diffb.file);
RETERR (14, NULL); /* Out of memory! */
}
/* Alloker hukommelse til buffer: */
memfree = MemLeft (); /* Ledig RAM */
if (memfree < 4000) /* Minste ledig RAM for å bruke buffer*/
{
diffb.buff = NULL; /* Ingen buffer */
diffb.maxidbuff = 0; /* Ingen elementer i buffer */
diffb.allinbuff = FALSE; /* Ingen elementer i buffer */
}
else /* Tilstrekkelig ledig RAM */
{
if (memfree > 65535L * idsize)
memfree = 65535L * idsize;
diffb.buff = Alloc (memfree - 1000);
diffb.allinbuff = TRUE; /* Alle elementer i buffer*/
diffb.maxidbuff = (uint16) ((memfree - 1000) / idsize);
}
/* Forel¢pig ingen elementer i listen: */
diffb.cid = 0;
diffb.cidbuff = 0;
diffb.cidfile = 0;
diffb.idsize = (uint16) idsize;
return (OK);
} /* DiffBConstruct (); */
int DiffBClear ( void )
{
char filename[MAXPATH];
/* Recreate the file, to make it empty */
strcpy (filename, GetFNames (diffb.file));
FClose (diffb.file);
if ((diffb.file = FOpen (filename, "w+b")) == NULL)
RETERR (11, filename); /* Failed on open temporary file! */
/* Pretend buffer is now empty (contain none IDs) */
diffb.cid = 0;
diffb.cidbuff = 0;
diffb.cidfile = 0;
return (OK);
}
int DiffBDestruct ( void )
/* Opprettet: Mandag 19. oktober 1992.
Parameter:
Retur : E/O.
Beskriv : Avslutter og resetter den globale strukturen "diffb".
Strukturens fil lukkes.
*/
{
int ret = OK; /* Returkode */
/* Plasser filpeker bakerst i filen: */
if (!FSeek (diffb.file, 0L, SEEK_END))
{
ret = ERROR;
goto END_ERR;
}
/* Lagre elementene i buffer til filen: */
if (FWrite (diffb.buff, diffb.idsize, diffb.cidbuff, diffb.file) != diffb.cidbuff)
ret = ERROR;
END_ERR:
FClose (diffb.file);
/* Frigj¢r eventuellt allokert buffer: */
if (diffb.buff)
Free (diffb.buff);
/* Frigj¢r allokert buffer for lesing av enkle elementer: */
Free (diffb.buff_test);
diffb.maxidbuff = 0;
diffb.allinbuff = FALSE;
diffb.buff = NULL;
diffb.cid = 0;
diffb.cidbuff = 0;
diffb.cidfile = 0;
diffb.idsize = 0;
return (ret);
} /* DiffBDestruct ();*/
int DiffBAddId ( const char *id )
/* Opprettet: Mandag 19. oktober 1992.
Parameter: "id" Navn som skal legges til listen over forskjellige id'er.
Retur : E/O.
Beskriv : Inkluderer oppgitt navn i listen over forskjellige navn.
Tester ikke om navnet finnes i listen fra f¢r.
*/
{
/* Legg navn i buffer, hvis det er plass: */
if (diffb.cidbuff < diffb.maxidbuff)
{
memcpy (ADRESS (diffb.buff, diffb.cidbuff, diffb.idsize), id, diffb.idsize);
diffb.cidbuff++; /* Antall elementer i buffer */
diffb.cid++; /* Antall elementer totalt */
return (OK); /* Returner uten videre */
}
/* Det er ikke plass i buffer. Legg navnet i filen: */
FSeek (diffb.file, 0L, SEEK_END);
if (FWrite (id, diffb.idsize, 1, diffb.file) != 1)
return (ERROR);
diffb.cid++; /* Antall elementer totalt */
diffb.cidfile++; /* Antall elementer i fil */
diffb.allinbuff = FALSE; /* Ikke alle elementer er i buffer */
return (OK);
} /* DiffBAddId (); */
int DiffBIfId ( const char *id, uint16 *answ )
/* Opprettet: Mandag 19. oktober 1992.
Parameter: "id" Navn som skal sjekkes om finnes i listen fra f¢r.
"answ" Returnerer 0 hvis id ikke finnes i listen.
Ellers returneres indeks nummer til hvor i listen id
ble funnet (1..).
Retur : E/O.
Beskriv : Tester om oppgitt navn finnes i listen fra f¢r.
*/
{
uint16 c1 = 0; /* Counter 1 */
uint16 Index;
char huge *ptr = diffb.buff;
*answ = 0; /* Standard at elementet ikke finnes */
while (c1++ < diffb.cidbuff) /* Test alle elementer i buffer */
{
if (strcmp (id, (char far *) ptr) == 0)
{
*answ = c1; /* Elementet finnes */
return (OK);
}
ptr += diffb.idsize;
}
Index = (uint16) (c1 - 1);
/* Hvis alle elementer er i buffer finnes ikke elementet: */
if (diffb.allinbuff)
return (OK);
/* Plasser filpeker til start av fil: */
if (!FSeek (diffb.file, 0, SEEK_SET))
return (ERROR);
/* Test i fil: */
for (c1=0; c1<diffb.cidfile; c1++) /* Test alle elementer i fil */
{
Index++; /* Tell id-index */
if (FRead (diffb.buff_test, diffb.idsize, 1, diffb.file) != 1)
return (ERROR);
if (strcmp (id, diffb.buff_test) == 0)
{
*answ = Index; /* Elementet finnes */
return (OK);
}
}
return (OK); /* Elementet finnes ikke */
} /* DiffBIfId (); */
int DiffBGetId ( uint16 indx, char *id )
/* Opprettet: Onsdag 12. mai 1992. 21:04.
Parameter: "indx" Indeks nummer til hvilken id som skal returneres (1..).
"id" Returner spesifisert id i i denne buffer.
Retur : E/O.
*/
{
if (indx < 1 || indx > diffb.cid)
return (ERROR);
if (indx <= diffb.cidbuff) /* Hvis ¢nsket id ligger i buffer */
{
memcpy (id, ADRESS (diffb.buff, indx - 1, diffb.idsize), diffb.idsize);
return (OK);
}
indx -= (uint16) (diffb.cidbuff - 1); /* Konverter til indeks til fil */
FSeek (diffb.file, (long) indx * diffb.idsize, SEEK_SET);
FRead (id, diffb.idsize, 1, diffb.file);
if (errno != 0)
return (ERROR);
return (OK);
} /* DiffBGetId (); */