home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
smapp100.zip
/
sm10.zip
/
smgconv.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-05-14
|
14KB
|
449 lines
/* ------------------------------------------------------------------------
*
* File: smgconv.c
* Project: Source Mapper.
* Created: September 11, 1992.
* Description: Kildekode for å konvertere mellomfiler (kkg-objekter) til
* endelig kartfil.
*
* 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"
int stdwidth = 80; /* Width of horizontal lines, etc. */
char linechr1 = '-'; /* Character to make ---------------- */
char linechr2 = '='; /* Character to make ================ */
int MakeMapFile ( void )
/* Opprettet: L¢rdag 12. september 1992.
Parameter:
Retur : E/O.
Beskriv : Produserer endelig kartfil over aktivt prosjekt.
Denne funksjonen bare åpner kartfilen, kaller "_make_mapf ()",
og lukker kartfilen igjen.
Dermed virker denne funksjonen som et skall utenfor
"_make_mapf ()", og sistnevnte slipper å ta hensyn til å stenge
kartfilen ved eventuelle feil.
Ved feil slettes den halvferdige kartfilen.
*/
{
FILE *mapf; /* Filpeker til endelig kartfil */
char mapname [MAXPATH + 1]; /* Navn til endelig kartfil */
if (!MakeMapName (mapname)) /* Lag navnet til endelig kartfil */
RETURN_ERR;
/* Genererer kartfil: */
Display (D_HEIGHEST, "%s:\n%s\n", _StrMSGGENERATESMAP, mapname);
if (prjstat.filc > 1) /* Use normal objectfile if 1 source */
if (!JoinObjFiles ()) /* Join all objectfiles into one big */
RETURN_ERR;
if ((mapf = FOpen (mapname, "wt")) == NULL)
RETERR (22, mapname); /* Failed on create final mapfile! */
if (!FuncRBuffConstruct ()) /* Init buffer of function register */
{
FClose (mapf);
RETURN_ERR;
}
if (!MakeMapFile_ (mapf)) /* Do map generation */
{
FuncRBuffDestruct (); /* Destruct buffer of function regist.*/
FClose (mapf); /* Close map file if any error */
RETURN_ERR;
}
FuncRBuffDestruct (); /* Destruct buffer of function regist.*/
FClose (mapf); /* Close map file */
ClrLin (); /* Clear whole line on screen */
return (OK);
} /* MakeMapFile (); */
int MakeMapFile_ ( FILE *mapf )
/* Opprettet: L¢rdag 12. september 1992.
Parameter: "mapf" Åpen endelig kartfil.
Retur : E/O.
Beskriv : Utf¢rer det egentlige arbeidet med å produsere endelig kartfil
over aktivt prosjekt. Det forutsettes at kartfilen allerede
er åpnet og klar for skriving.
Denne funksjonen er kjernen til "MakeMapFile ()". Ved
eventuell feil returneres error uten at det blir gjordt
fors¢k på å stenge kartfilen ("mapf").
Se funksjonen ovenfor: "MakeMapFile ()".
*/
{
/* S¢rg for at prosjektfilen holder all n¢dvendig info om hver kildefil: */
if (!MakePrjDataOK ())
RETURN_ERR;
/* Inkluder totalinformasjon i kart */
if (o_totinfo.incl)
if (!wrt_totinfo (mapf))
RETURN_ERR;
/* Inkluder funksjonsregister hvis bruker ¢nsker dette: */
if (o_funcreg.incl)
if (!FuncRIncludeToMap (mapf))
RETURN_ERR;
/* Inkluder liste over funksjonskall hvis bruker ¢nsker dette: */
if (o_funcall.incl)
if (!FCalIncludeToMap (mapf))
RETURN_ERR;
/* Inkluder liste over identifikatorer hvis bruker ¢nsker dette: */
if (o_idlist.incl)
if (!IdLstIncludeToMap (mapf))
RETURN_ERR;
/* Inkluder liste over kalle-sekvenser hvis bruker ¢nsker dette: */
if (o_flow.incl)
if (!FlowCIncludeToMap (mapf))
RETURN_ERR;
/* Inkluder kildekode m/linjeinformasjon hvis bruker ¢nsker dette: */
if (o_lineinfo.incl)
if (!LInfoIncToMap (mapf))
RETURN_ERR;
return (OK);
} /* MakeMapFile_ (); */
int MakeMapName ( char *mapname )
/* Opprettet: Onsdag 16. september 1992.
Parameter: "mapname" Riktig navn til endelig kartfil.
Retur : E/O.
Beskriv : Lager navn til endelig kartfil ("mapname"). Kartfil skal lagres
i brukeroppgitt katalog og filnavn som navn til aktiv
prosjektfil, men med kartfil-endelse. Hvis aktivt prosjekt
er midlertidig skal kartfilen derimot ha samme navn
som 1. kildefil i det midlertidige prosjektet (men også da
med kartfil-endelse.
*/
{
prjfeTYPE fdata; /* Filelement i prosjektfil */
strcpy (mapname, o_generate.map); /* Brukeroppgitt kart-katalog */
Slash (mapname); /* Avsluttende '\' */
if (prjstat.temp) /* Hvis midlertidig prosj.fil */
{
if (!GetFDataFromPrj (1, &fdata)) /* Navn til 1. kildefil */
RETURN_ERR;
strcat (mapname, GetFName (fdata.name)); /* Same filename as of first sourcefile */
}
else /* Prosjekt som brukerfil */
strcat (mapname, GetFName (prjstat.name)); /* Same filename as of projectname */
CutFExt (mapname);
strcat (mapname, fnames [SMGMAPF_EXT]);
return (OK);
} /* MakeMapName (); */
int WrtComStart ( FILE *file )
/* Opprettet: Fredag 18. september 1992.
Parameter: "file" Filen det skal skrives til.
Retur : E/O.
Beskriv : Skriver streng for innledning av kildefil-komentar.
Dessuten legges det til et etterf¢lgende space.
Det forutsettes at aktuell fil er åpnet og klar for skriving.
*/
{
return (FPrintF (file, "/* "));
} /* WrtComStart (); */
int WrtComStartLn ( FILE *file )
/* Opprettet: Fredag 25. september 1992.
Parameter: "file" Filen det skal skrives til.
Retur : E/O.
Beskriv : Skriver streng for innledning av kildefil-komentar
m/linjeskift etter.
Det forutsettes at aktuell fil er åpnet og klar for skriving.
*/
{
return (FPrintF (file, "/*\n"));
} /* WrtComStartLn (); */
int WrtComEnd ( FILE *file )
/* Opprettet: Fredag 18. september 1992.
Parameter: "file" Filen det skal skrives til.
Retur : E/O.
Beskriv : Skriver streng for avsluttning av kildefil-komentar.
Dessuten legges det til et space f¢r selve komentarslutt-streng.
Det forutsettes at aktuell fil er åpnet og klar for skriving.
*/
{
return (FPrintF (file, " */"));
} /* WrtComEnd (); */
int WrtComEndLn ( FILE *file )
/* Opprettet: Fredag 18. september 1992.
Parameter: "file" Filen det skal skrives til.
Retur : E/O.
Beskriv : Skriver streng for avsluttning av kildefil-komentar
m/ linjeskift. Dessuten legges det til et space f¢r selve
komentarslutt-streng.
Det forutsettes at aktuell fil er åpnet og klar for skriving.
*/
{
return (FPrintF (file, " */\n"));
} /* WrtComEndLn (); */
int GetFPosTYPE ( FILE *objf, fposTYPE *fpos )
/* Opprettet: S¢ndag 20. september 1992.
Parameter: "objf" Aktuell mellomfil.
"fpos" Filposisjoner til datagrupper i mellomfilen.
Retur : E/O.
Beskriv : Leser posisjonsdata til datagrupper i oppgitt mellomfil.
Det forutsettes at oppgitt mellomfil er åpen og klar for lesing.
*/
{
long flen;
/* Get number of bytes in file: */
if ((flen = FLength (objf)) == -1L)
return (ERROR);
/* Plasser filpeker ved start til filposisjoner til datagrupper: */
if (FSeek (objf, flen - sizeof (fposTYPE), SEEK_SET) != OK)
return (ERROR);
/* Les posisjonsdataene: */
if (FRead (fpos, sizeof (fposTYPE), 1, objf) != 1)
return (ERROR);
return (OK);
} /* GetFPosTYPE (); */
int GetFInfTYPE ( FILE *objf, finfTYPE *finf )
/* Opprettet: Mandag 21. september 1992.
Parameter: "objf" Aktuell mellomfil.
"finf" Filinformasjon om kildefil til oppgitt mellomfil.
Retur : E/O.
Beskriv : Leser totalinfo om kildefilen til oppgitt mellomfil. Det
forutsettes at oppgitt mellomfil er åpen og klar for lesing.
*/
{
fposTYPE fpos; /* Posisjoner til info i mellomfil */
/* Les filposisjoner over datagrupper i mellomfil: */
if (!GetFPosTYPE (objf, &fpos))
RETURN_ERR;
/* Plasser mellomfilens filpeker til start av totalinfo om kildefil: */
if (!FSeek (objf, fpos.finf, SEEK_SET))
return (ERROR);
/* Les totalinfo om kildefil, fra mellomfilen: */
if (FRead (finf, sizeof (finfTYPE), 1, objf) != 1)
return (ERROR);
return (OK);
} /* GetFInfTYPE (); */
int TestObjFileHead ( FILE *objf )
/* Opprettet: Mandag 21. september 1992.
Parameter: "objf" Aktuell mellomfil som skal testes.
Retur : E/O.
Beskriv : Sjekker om oppgitt mellomfil har lovlig innledning.
Det forutsettes at filen er åpnet og klar for lesing.
*/
{
int len;
char buff [56];
if (!Rewind (objf)) /* Les inn selve hodet til mellomfilen*/
return (ERROR);
len = strlen (_StrMSGTEMPFILEID);
if (FRead (&buff, len, 1, objf) != 1)
return (ERROR);
buff[len] = 0; /* Terminer strengen */
if (strcmp (buff, _StrMSGTEMPFILEID) != 0)
return (ERROR);
return (OK);
} /* TestObjFileHead (); */
int TestObjFile ( const char *ofname )
/* Opprettet: Mandag 21. september 1992.
Parameter: "objf" Aktuell mellomfil som skal testes.
Retur : E/O.
Beskriv : Tester oppgitt mellomfil, og sjekker at den har lovlig format
og at den virkelig finnes.
*/
{
FILE *objf; /* Aktuell mellomfil */
if ((objf = FOpen (ofname, "r+b")) == NULL)
RETERR (16, ofname); /* Failed on open file! */
if (!TestObjFile_ (objf)) /* Utf¢r selve testen */
{
FClose (objf);
RETURN_ERR;
}
FClose (objf);
return (OK);
} /* TestObjFile (); */
int TestObjFile_ ( FILE *objf )
/* Opprettet: Mandag 21. september 1992.
Parameter: "objf" Aktuell mellomfil som skal testes.
Retur : E/O.
Beskriv : Tester oppgitt mellomfil, og sjekker at den har lovlig format
og at den virkelig finnes. Dette er kjernen til
"TestObjFile ()". Det forutsettes at "objf" er åpen og klar
for lesing.
*/
{
long flen;
fposTYPE fpos;
if (!TestObjFileHead (objf) || !GetFPosTYPE (objf, &fpos))
RETURN_ERR;
flen = FLength (objf);
if (flen < 0 ||
fpos.finf >= flen ||
fpos.funreg >= flen ||
fpos.funcal >= flen ||
fpos.idlst >= flen ||
fpos.lininf >= flen)
{
return (ERROR);
}
return (OK);
} /* TestObjFile_ (); */
int WrtStdLinComStart ( FILE *file, int linlen, int chr )
/* Opprettet: Torsdag 24. september 1992.
Parameter: "file" Filen som skal skrives til.
"linlen" Total bredde til linjen som skal skrives.
"chr" Karakteren som linjen skal tegnes med.
Retur : E/O.
Beskriv : Skriver standard skillelinje til oppgitt kartfil. Skillelinjen
innledes med komentarblokk-startmerke hvis bruker har valgt
SMG til å generere komentarblokker.
Det forutsettes at oppgit kartfil er åpen og klar for skriving.
*/
{
int width = linlen; /* Bredden til skillelinjer */
if (o_various.gencom) /* Hvis generer komentarblokker */
{
width -= 3; /* Gi plass til å innlede komentar */
if (!WrtComStart (file)) /* Innled komentarblokk */
RETURN_ERR;
}
/* Tegn selve skillelinjen */
if (WritFLineLn (file, width, (char) chr) != width + 2)
RETURN_ERR;
return (OK);
} /* WrtStdLinComStart (); */
int WrtStdLinComEnd ( FILE *file, int linlen, int chr )
/* Opprettet: Torsdag 24. september 1992.
Parameter: "file" Filen som skal skrives til.
"linlen" Total bredde til linjen som skal skrives.
"chr" Karakteren som linjen skal tegnes med.
Retur : E/O.
Beskriv : Skriver standard skillelinje til oppgitt kartfil. Skillelinjen
avsluttes med komentarblokk-sluttmerke hvis bruker har valgt
SMG til å generere komentarblokker.
Det forutsettes at oppgit kartfil er åpen og klar for skriving.
*/
{
int width = linlen; /* Bredden til skillelinjer */
if (o_various.gencom) /* Hvis generer komentarblokker */
width -= 3; /* Gi plass til å avslutte komentar */
/* Tegn selve skillelinjen */
if (WritFLine (file, width, (char) chr) != width)
return (ERROR);
if (o_various.gencom) /* Hvis generer komentarblokker */
if (!WrtComEnd (file)) /* Avsluttende komentarblokk */
RETURN_ERR;
if (!FPrintF (file, "\n"))
return (ERROR);
return (OK);
} /* WrtStdLinComEnd (); */