home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
smapp100.zip
/
sm10.zip
/
smgprjct.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-05-14
|
14KB
|
416 lines
/* ------------------------------------------------------------------------
*
* File: smgprjct.c
* Project: Source Mapper.
* Created: Mai 19, 1992.
* Description: Kildekode for å styre/bruke prosjektfil.
*
* 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"
prjstatTYPE prjstat;
int GetFDataFromPrj ( int filenr, prjfeTYPE *fdata )
/* Opprettet: Onsdag 9. september 1992.
Parameter: "filenr" Nummer til aktuelt fil i prosjekt (1..).
"fdata" Struktur med data til aktuell fil, returneres.
Retur : E/O.
Beskriv : Returnerer tilgjengelige data om aktuell fil i
definert prosjekt.
*/
{
long offs;
if (!prjstat.prjon || filenr <= 0) /* Hvis ikke noe aktivt prosjekt */
return (ERROR);
if (prjstat.file == NULL) /* Hvis prosjektfil ikke er åpen */
{
if ((prjstat.file = FOpen (prjstat.name, "r+b")) == NULL)
RETERR (2, prjstat.name); /* Failed on open project file! */
}
offs = strlen (_StrMSGPRJFILEID) /* Calculate offset inside file */
+ 1 + /* +1 because the end-of-file mark */
(filenr-1)*sizeof(prjfeTYPE);/* Index to actual element (0..). */
/* Pek til aktuell datablokk i fil */
FSeek (prjstat.file, offs, SEEK_SET);
/* Les inn den aktuelle datablokken fra prosjektfilen: */
if (FRead (fdata, sizeof (prjfeTYPE), 1, prjstat.file) != 1)
{
FClose (prjstat.file);
prjstat.file = NULL;
return (ERROR);
}
return (OK);
} /* GetFDataFromPrj (); */
int PutFDataToPrj ( int filenr, prjfeTYPE *fdata )
/* Opprettet: S¢ndag 27. september 1992.
Parameter: "filenr" Nummer til aktuelt fil i prosjekt (1..).
"fdata" Struktur med data som skal skrives til prosjektfil.
Retur : E/O.
Beskriv : Skriver oppgitte data om kildefil til prosjektfil. Dataene
skrives over kildefildata nummer "filenr" (1..). "filenr" kan
derfor ikke være h¢yere enn det er antall kildefiler i
aktiv prosjektfil.
*/
{
if (!prjstat.prjon) /* Hvis ikke noe aktivt prosjekt */
return (ERROR);
if (prjstat.file == NULL) /* Hvis prosjektfil ikke er åpen */
{
if ((prjstat.file = FOpen (prjstat.name, "r+b")) == NULL)
RETERR (2, prjstat.name); /* Failed on open project file! */
}
/* Plasser filpeker ved starten til aktuell datablokk: */
FSeek (prjstat.file, strlen (_StrMSGPRJFILEID) + 1 + (filenr-1) * sizeof (prjfeTYPE), SEEK_SET);
/* Skriv den aktuelle datablokken til prosjektfilen: */
if (FWrite (fdata, sizeof (prjfeTYPE), 1, prjstat.file) != 1)
{
FClose (prjstat.file);
prjstat.file = NULL;
return (ERROR);
}
return (OK);
} /* PutFDataToPrj (); */
void ResetPrjStat ( void )
/* Opprettet: Onsdag 9. september 1992.
Parameter:
Retur :
Beskriv : Nullstiller strukturen som lagrer status til prosjekt.
*/
{
if (prjstat.file)
FClose (prjstat.file);
prjstat.file = NULL;
memset (prjstat.name, 0, MAXPATH);
prjstat.usrn = FALSE;
prjstat.temp = TRUE;
prjstat.save = FALSE;
prjstat.prjon = FALSE;
prjstat.filc = 0;
} /* ResetPrjStat (); */
int AddFDataToPrj ( prjfeTYPE *fdata )
/* Opprettet: Onsdag 9. september 1992.
Parameter: "fdata" Struktur med data som skal legges til prosjektfilen
Retur : E/O.
Beskriv : Legger oppgitte fildata til prosjektfilen. Dataene legges
bakerst i prosjektfilen. Dersom det ikke er noe aktivt prosjekt
opprettes prosjektet m/midlertidig prosjektfil.
*/
{
if (prjstat.prjon == FALSE) /* Hvis ingen aktiv prosjektfil */
{
ResetPrjStat ();
strcpy (prjstat.name, tmpn.projec);
if (!MakePrjF (prjstat.name))
RETURN_ERR;
prjstat.temp = TRUE; /* Aktiv prosjektfil er midlertidig */
}
if (prjstat.file == NULL) /* Hvis prosjektfil ikke er åpen */
{
prjstat.file = FOpen (prjstat.name, "r+b"); /* Åpne prosjektfil */
if (prjstat.file == NULL)
RETERR (2, prjstat.name) /* Kunne ikke åpne prosjektfil */
}
/* Plasser filpeker bakerst i filen, slik at nytt element skj¢tes: */
FSeek (prjstat.file, 0L, SEEK_END);
if (FWrite (fdata, sizeof (prjfeTYPE), 1, prjstat.file) != 1)
{
FClose (prjstat.file);
prjstat.file = NULL;
RETERR (3, prjstat.name); /* Kunne ikke skrive til fil */
}
prjstat.filc += 1; /* Antall filer i prosjekt */
return (OK);
} /* AddFDataToPrj (); */
int MakePrjF ( const char *fname )
/* Opprettet: Onsdag 9. september 1992.
Parameter: "fname" Navnet til prosjektfilen som skal opprettes.
Return : E/O.
Beskriv : Oppretter prosjektfil med oppgitt filnavn.
Gj¢r ikke annet enn å opprette filen og skrive filkjennemerke.
Eventuell åpen prosjektfil lukkes f¢r den nye filen opprettes.
*/
{
if (prjstat.prjon == TRUE) /* Hvis allerede aktivt prosjekt */
{
prjstat.prjon = FALSE; /* Prosjektfil er midlertidig passiv */
if (prjstat.file != NULL) /* Hvis prosjektfil er åpen */
FClose (prjstat.file);
}
/* Åpne den nye prosjektfilen: */
if ((prjstat.file = FOpen (fname, "w+b")) == NULL)
RETERR (4, fname);
/* Skriv filkjennemerke til prosjektfil: */
if (!FPrintF (prjstat.file, "%s%c", _StrMSGPRJFILEID, EOFCHR))
{
FClose (prjstat.file);
prjstat.file = NULL;
RETERR (3, fname); /* Failed on write to file */
}
prjstat.prjon = TRUE; /* Prosjekt er herved aktivt */
return (OK);
} /* MakePrjF (); */
void ResetPrjFETYPE ( prjfeTYPE *fdata )
/* Opprettet: Onsdag 9. september 1992.
Parameter: "fdata" Strukturen som skal nullstilles.
Beskriv : Nullstiller data om kildefil som er en del av prosjektfilen. */
{
memset (fdata, 0, sizeof (prjfeTYPE));
} /* ResetPrjFETYPE (); */
void GetObjFileName ( char *ofname, const char *sfname )
/* Opprettet: S¢ndag 20. september 1992.
Parameter: "ofname" Produsert navn til mellomfil.
"sfname" Navn til kildefil.
Beskriv : Finner navn til mellomfil. Navnet lages på grunnlag av
oppgitt kildefil-navn og brukerens valg av mellomfil-katalog og
mellomfil-etternavn. */
{
strcpy (ofname, o_generate.obj); /* Katalog til mellomfiler */
Slash (ofname); /* Avsluttende "\" */
strcat (ofname, GetFName (sfname)); /* Skj¢t filnavn til mellomfil-navn */
CutFExt (ofname); /* Kutt etternavn-delen */
strcat (ofname, fnames [SMGOBJC_EXT]); /* Skj¢t på standard etternavn */
} /* GetObjFileName (); */
int IsTime1NewerThanTime2 ( const timeTYPE *Time1, const timeTYPE *Time2 )
/* Function : Test if Time1 is newer than Time2.
Opprettet: September 20, 1995. 19:00. By Leif-Erik Larsen.
Parameter: Time1 = Time to test if newer than Time2.
Time2 = Time to be tested with Time1.
Return : TRUE if Time1 is newer than Time2, or else FALSE. */
{
#define TIMETEST(Time1, Time2) if (Time1 > Time2) return TRUE; \
if (Time1 < Time2) return FALSE;
TIMETEST (Time1->year, Time2->year);
TIMETEST (Time1->month, Time2->month);
TIMETEST (Time1->day, Time2->day);
TIMETEST (Time1->hour, Time2->hour);
TIMETEST (Time1->min, Time2->min);
TIMETEST (Time1->sec, Time2->sec);
TIMETEST (Time1->hund, Time2->hund);
#undef TIMETEST
/* The two times are 100% identical to each other, so return FALSE */
return FALSE;
} /* IsTime1NewerThanTime2 (); */
int ScanFilesInPrj ( int job )
/* Opprettet: Torsdag 10. september 1992.
Parameter: "job" PRJMAKE: Generer mellomfil bare over de kildefiler som
er forandret siden forrige generering.
PRJBUILD: Generer mellomfil over samtlige kildefiler,
uavhengig av om de er forandret siden sist
eller ikke.
Retur : E/O.
Beskriv : Scanner og lager mellomfil av samtlige kildefiler som er
oppgitt i aktiv prosjektfil. Dersom det ikke er noen aktiv
prosjektfil vil denne funksjonen bare returnere error.
Returnerer error også ved andre typer feil, som hindret
funksjonen å lage mellomfil til en eller fler av aktuelle
kildefiler.
*/
{
int c1 = 0;
int washere = 0;
timeTYPE ftsource; /* Dato/tid-stempel til kildefil */
timeTYPE ftobj; /* Dato/tid-stempel til mellomfil */
prjfeTYPE fdata; /* Mellomlager for kildefildata */
if (prjstat.prjon == FALSE) /* Hvis ingen aktiv prosjektfil */
RETERR (5, NULL); /* Integral error */
while (c1++ < prjstat.filc) /* Alle kildefiler i prosjekt */
{
if (!GetFDataFromPrj (c1, &fdata))
RETURN_ERR;
/* Hvis feil i kildefil-datostempel (antagelig manglende fil) */
if (!GetFileTime (fdata.name, &ftsource))
RETERR (6, fdata.name);
GetFileTime (fdata.objn, &ftobj);/* Ignorer eventuell feil */
if (job == PRJBUILD || /* Hvis samtlige objektfiler skal gen*/
!IsTime1NewerThanTime2 (&ftobj, &ftsource) ||
o_various.del || /* Auto delete .smg-files */
!TestObjFile (fdata.objn)) /* Feil format i mellomfil? */
{
if (!washere) /* Display only once */
{
/* Genererer mellomfil(er): */
Display (D_HEIGHEST, "%s:\n", _StrMSGGENERATESOBJ);
washere = 1;
}
/* Utf¢r selve scanningen av aktiv kildefil: */
if (!scan_sourcef (fdata.name, fdata.objn))
RETURN_ERR;
}
}
if (washere) /* Hvis noen mellomfil er laget */
if (o_various.iShowInfo > 0) /* Hvis vi viser noen runtimeinfo */
printf ("\n");
return (OK);
} /* ScanFilesInPrj (); */
int MakePrjDataOK ( void )
/* Opprettet: S¢ndag 27. september 1992.
Retur : E/O.
Beskriv : Leser kildefil-info fra samtlige kildefilers tilh¢rende
mellomfil, og lagrer infoen i de respektive kildefilinfo-
blokkene til prosjektfilen.
*/
{
int c1 = 0;
FILE *objf;
prjfeTYPE fdata;
if (prjstat.prjon == FALSE) /* If no current project in process */
RETURN_ERR;
while (c1++ < prjstat.filc) /* Loop trough all files in project */
{
if (!GetFDataFromPrj (c1, &fdata)) /* Get project info about file */
RETURN_ERR;
GetObjFileName (fdata.objn, fdata.name); /* Construct name of objectfile */
if ((objf = FOpen (fdata.objn, "r+b")) == NULL)
RETERR (16, fdata.objn); /* Failed on open active objectfile! */
if (!GetFInfTYPE (objf, &fdata.finf)) /* Get total information of object file */
{
FClose (objf);
RETURN_ERR;
}
if (!GetFPosTYPE (objf, &fdata.fpos)) /* Get indexes to blocks of data */
{
FClose (objf); /* Close active objectfile if error */
RETURN_ERR;
}
FClose (objf); /* Close active objectfile */
fdata.dataok = TRUE; /* Now, the structure is complete */
if (!PutFDataToPrj (c1, &fdata)) /* Write the complete data to prject file */
RETURN_ERR;
}
return (OK);
} /* MakePrjDataOK (); */
int GetFDataOfGLin ( long glin, long *slin, prjfeTYPE *fdata )
/*
Function: Get file data with respect to global line number.
Which source do this line number belong to?
Date: April, 26. 1993. 15:45. By LEL.
Interface: glin = Global line number to find.
slin = Mother source start on this global line number.
fdata = Return the found source, and info, in
this structure.
Returns: E/O.
*/
{
int filec = 0; /* Count files in project */
long cglin = 0; /* Count global line number */
while (filec++ < prjstat.filc) /* Seek trough all files in project */
{
if (!GetFDataFromPrj (filec, fdata)) /* Get info about next source */
RETURN_ERR;
if (glin > cglin && /* Is spec. line within this source? */
glin <= cglin + fdata->finf.ltot)
{
*slin = cglin + 1; /* Global first line number of source */
return (OK); /* Line was found to belong a source */
}
cglin += fdata->finf.ltot; /* Count current global line number */
}
RETURN_ERR; /* Line does not belong to any source */
} /* GetFDataOfGLin (); */