home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / smapp100.zip / sm10.zip / smgconv.c < prev    next >
C/C++ Source or Header  |  2000-05-14  |  14KB  |  449 lines

  1. /* ------------------------------------------------------------------------
  2.  *
  3.  *        File: smgconv.c
  4.  *     Project: Source Mapper.
  5.  *     Created: September 11, 1992.
  6.  * Description: Kildekode for å konvertere mellomfiler (kkg-objekter) til 
  7.  *              endelig kartfil.
  8.  *
  9.  * Copyright (C) 2000 Leif-Erik Larsen.
  10.  * This file is part of the Source Mapper source package.
  11.  * Source Mapper is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published
  13.  * by the Free Software Foundation, in version 2 as it comes in the
  14.  * "COPYING" file of the XWorkplace main distribution.
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * ------------------------------------------------------------------------ */
  21.  
  22.  
  23.  
  24.  
  25. #include "smg.h"
  26.  
  27.  
  28.  
  29.  
  30. int  stdwidth  = 80;                   /* Width of horizontal lines, etc.    */
  31. char linechr1  = '-';                  /* Character to make ---------------- */
  32. char linechr2  = '=';                  /* Character to make ================ */
  33.  
  34.  
  35.  
  36.  
  37. int MakeMapFile ( void )
  38. /* Opprettet: L¢rdag 12. september 1992.
  39.    Parameter:
  40.    Retur    : E/O.
  41.    Beskriv  : Produserer endelig kartfil over aktivt prosjekt.
  42.               Denne funksjonen bare åpner kartfilen, kaller "_make_mapf ()",
  43.               og lukker kartfilen igjen.
  44.               Dermed virker denne funksjonen som et skall utenfor
  45.               "_make_mapf ()", og sistnevnte slipper å ta hensyn til å stenge
  46.               kartfilen ved eventuelle feil.
  47.               Ved feil slettes den halvferdige kartfilen.
  48. */
  49. {
  50.    FILE *mapf;                         /* Filpeker til endelig kartfil */
  51.    char  mapname [MAXPATH + 1];        /* Navn til endelig kartfil */
  52.  
  53.    if (!MakeMapName (mapname))         /* Lag navnet til endelig kartfil */
  54.       RETURN_ERR;
  55.  
  56.    /* Genererer kartfil: */
  57.    Display (D_HEIGHEST, "%s:\n%s\n", _StrMSGGENERATESMAP, mapname);
  58.  
  59.    if (prjstat.filc > 1)               /* Use normal objectfile if 1 source  */
  60.       if (!JoinObjFiles ())            /* Join all objectfiles into one big  */
  61.          RETURN_ERR;
  62.  
  63.    if ((mapf = FOpen (mapname, "wt")) == NULL)
  64.       RETERR (22, mapname);            /* Failed on create final mapfile!    */
  65.  
  66.    if (!FuncRBuffConstruct ())         /* Init buffer of function register   */
  67.    {
  68.       FClose (mapf);
  69.       RETURN_ERR;
  70.    }
  71.  
  72.    if (!MakeMapFile_ (mapf))           /* Do map generation                  */
  73.    {
  74.       FuncRBuffDestruct ();            /* Destruct buffer of function regist.*/
  75.       FClose (mapf);                   /* Close map file if any error        */
  76.       RETURN_ERR;
  77.    }
  78.  
  79.    FuncRBuffDestruct ();               /* Destruct buffer of function regist.*/
  80.    FClose (mapf);                      /* Close map file                     */
  81.    ClrLin ();                          /* Clear whole line on screen         */
  82.  
  83.    return (OK);
  84. } /* MakeMapFile (); */
  85.  
  86.  
  87.  
  88.  
  89. int MakeMapFile_ ( FILE *mapf )
  90. /* Opprettet: L¢rdag 12. september 1992.
  91.    Parameter: "mapf" Åpen endelig kartfil.
  92.    Retur    : E/O.
  93.    Beskriv  : Utf¢rer det egentlige arbeidet med å produsere endelig kartfil
  94.               over aktivt prosjekt. Det forutsettes at kartfilen allerede
  95.               er åpnet og klar for skriving.
  96.               Denne funksjonen er kjernen til "MakeMapFile ()". Ved
  97.               eventuell feil returneres error uten at det blir gjordt
  98.               fors¢k på å stenge kartfilen ("mapf").
  99.               Se funksjonen ovenfor: "MakeMapFile ()".
  100. */
  101. {
  102.    /* S¢rg for at prosjektfilen holder all n¢dvendig info om hver kildefil: */
  103.    if (!MakePrjDataOK ())
  104.       RETURN_ERR;
  105.  
  106.    /* Inkluder totalinformasjon i kart */
  107.    if (o_totinfo.incl)
  108.       if (!wrt_totinfo (mapf))
  109.          RETURN_ERR;
  110.  
  111.    /* Inkluder funksjonsregister hvis bruker ¢nsker dette: */
  112.    if (o_funcreg.incl)
  113.       if (!FuncRIncludeToMap (mapf))
  114.          RETURN_ERR;
  115.  
  116.    /* Inkluder liste over funksjonskall hvis bruker ¢nsker dette: */
  117.    if (o_funcall.incl)
  118.       if (!FCalIncludeToMap (mapf))
  119.          RETURN_ERR;
  120.  
  121.    /* Inkluder liste over identifikatorer hvis bruker ¢nsker dette: */
  122.    if (o_idlist.incl)
  123.       if (!IdLstIncludeToMap (mapf))
  124.          RETURN_ERR;
  125.  
  126.    /* Inkluder liste over kalle-sekvenser hvis bruker ¢nsker dette: */
  127.    if (o_flow.incl)
  128.       if (!FlowCIncludeToMap (mapf))
  129.          RETURN_ERR;
  130.  
  131.    /* Inkluder kildekode m/linjeinformasjon hvis bruker ¢nsker dette: */
  132.    if (o_lineinfo.incl)
  133.       if (!LInfoIncToMap (mapf))
  134.          RETURN_ERR;
  135.  
  136.    return (OK);
  137. } /* MakeMapFile_ (); */
  138.  
  139.  
  140.  
  141.  
  142. int MakeMapName ( char *mapname )
  143. /* Opprettet: Onsdag 16. september 1992.
  144.    Parameter: "mapname" Riktig navn til endelig kartfil.
  145.    Retur    : E/O.
  146.    Beskriv  : Lager navn til endelig kartfil ("mapname"). Kartfil skal lagres
  147.               i brukeroppgitt katalog og filnavn som navn til aktiv
  148.               prosjektfil, men med kartfil-endelse. Hvis aktivt prosjekt
  149.               er midlertidig skal kartfilen derimot ha samme navn
  150.               som 1. kildefil i det midlertidige prosjektet (men også da
  151.               med kartfil-endelse.
  152. */
  153. {
  154.    prjfeTYPE fdata;                    /* Filelement i prosjektfil */
  155.  
  156.    strcpy (mapname, o_generate.map);   /* Brukeroppgitt kart-katalog */
  157.    Slash  (mapname);                   /* Avsluttende '\' */
  158.  
  159.    if (prjstat.temp)                   /* Hvis midlertidig prosj.fil */
  160.    {
  161.       if (!GetFDataFromPrj (1, &fdata)) /* Navn til 1. kildefil */
  162.          RETURN_ERR;
  163.  
  164.       strcat (mapname, GetFName (fdata.name)); /* Same filename as of first sourcefile */
  165.    }
  166.  
  167.    else                                /* Prosjekt som brukerfil */
  168.       strcat  (mapname, GetFName (prjstat.name)); /* Same filename as of projectname */
  169.  
  170.    CutFExt (mapname);
  171.    strcat (mapname, fnames [SMGMAPF_EXT]);
  172.  
  173.    return (OK);
  174. } /* MakeMapName (); */
  175.  
  176.  
  177.  
  178.  
  179. int WrtComStart ( FILE *file )
  180. /* Opprettet: Fredag 18. september 1992.
  181.    Parameter: "file" Filen det skal skrives til.
  182.    Retur    : E/O.
  183.    Beskriv  : Skriver streng for innledning av kildefil-komentar.
  184.               Dessuten legges det til et etterf¢lgende space.
  185.               Det forutsettes at aktuell fil er åpnet og klar for skriving.
  186. */
  187. {
  188.    return (FPrintF (file, "/* "));
  189. } /* WrtComStart (); */
  190.  
  191.  
  192.  
  193.  
  194. int WrtComStartLn ( FILE *file )
  195. /* Opprettet: Fredag 25. september 1992.
  196.    Parameter: "file" Filen det skal skrives til.
  197.    Retur    : E/O.
  198.    Beskriv  : Skriver streng for innledning av kildefil-komentar
  199.               m/linjeskift etter.
  200.               Det forutsettes at aktuell fil er åpnet og klar for skriving.
  201. */
  202. {
  203.    return (FPrintF (file, "/*\n"));
  204. } /* WrtComStartLn (); */
  205.  
  206.  
  207.  
  208.  
  209. int WrtComEnd ( FILE *file )
  210. /* Opprettet: Fredag 18. september 1992.
  211.    Parameter: "file" Filen det skal skrives til.
  212.    Retur    : E/O.
  213.    Beskriv  : Skriver streng for avsluttning av kildefil-komentar.
  214.               Dessuten legges det til et space f¢r selve komentarslutt-streng.
  215.               Det forutsettes at aktuell fil er åpnet og klar for skriving.
  216. */
  217. {
  218.    return (FPrintF (file, " */"));
  219. } /* WrtComEnd (); */
  220.  
  221.  
  222.  
  223.  
  224. int WrtComEndLn ( FILE *file )
  225. /* Opprettet: Fredag 18. september 1992.
  226.    Parameter: "file" Filen det skal skrives til.
  227.    Retur    : E/O.
  228.    Beskriv  : Skriver streng for avsluttning av kildefil-komentar
  229.               m/ linjeskift. Dessuten legges det til et space f¢r selve
  230.               komentarslutt-streng.
  231.               Det forutsettes at aktuell fil er åpnet og klar for skriving.
  232. */
  233. {
  234.    return (FPrintF (file, " */\n"));
  235. } /* WrtComEndLn (); */
  236.  
  237.  
  238.  
  239.  
  240. int GetFPosTYPE ( FILE *objf, fposTYPE *fpos )
  241. /* Opprettet: S¢ndag 20. september 1992.
  242.    Parameter: "objf" Aktuell mellomfil.
  243.               "fpos" Filposisjoner til datagrupper i mellomfilen.
  244.    Retur    : E/O.
  245.    Beskriv  : Leser posisjonsdata til datagrupper i oppgitt mellomfil.
  246.               Det forutsettes at oppgitt mellomfil er åpen og klar for lesing.
  247. */
  248. {
  249.    long flen;
  250.  
  251.    /* Get number of bytes in file: */
  252.    if ((flen = FLength (objf)) == -1L)
  253.       return (ERROR);
  254.  
  255.    /* Plasser filpeker ved start til filposisjoner til datagrupper: */
  256.    if (FSeek (objf,  flen - sizeof (fposTYPE), SEEK_SET) != OK)
  257.       return (ERROR);
  258.  
  259.    /* Les posisjonsdataene: */
  260.    if (FRead (fpos, sizeof (fposTYPE), 1, objf) != 1)
  261.       return (ERROR);
  262.  
  263.    return (OK);
  264. } /* GetFPosTYPE (); */
  265.  
  266.  
  267.  
  268.  
  269. int GetFInfTYPE ( FILE *objf, finfTYPE *finf )
  270. /* Opprettet: Mandag 21. september 1992.
  271.    Parameter: "objf" Aktuell mellomfil.
  272.               "finf" Filinformasjon om kildefil til oppgitt mellomfil.
  273.    Retur    : E/O.
  274.    Beskriv  : Leser totalinfo om kildefilen til oppgitt mellomfil. Det
  275.               forutsettes at oppgitt mellomfil er åpen og klar for lesing.
  276. */
  277. {
  278.    fposTYPE  fpos;                     /* Posisjoner til info i mellomfil */
  279.  
  280.    /* Les filposisjoner over datagrupper i mellomfil: */
  281.    if (!GetFPosTYPE (objf, &fpos))
  282.       RETURN_ERR;
  283.  
  284.    /* Plasser mellomfilens filpeker til start av totalinfo om kildefil: */
  285.    if (!FSeek (objf, fpos.finf, SEEK_SET))
  286.       return (ERROR);
  287.  
  288.    /* Les totalinfo om kildefil, fra mellomfilen: */
  289.    if (FRead (finf, sizeof (finfTYPE), 1, objf) != 1)
  290.       return (ERROR);
  291.  
  292.    return (OK);
  293. } /* GetFInfTYPE (); */
  294.  
  295.  
  296.  
  297.  
  298. int TestObjFileHead ( FILE *objf )
  299. /* Opprettet: Mandag 21. september 1992.
  300.    Parameter: "objf" Aktuell mellomfil som skal testes.
  301.    Retur    : E/O.
  302.    Beskriv  : Sjekker om oppgitt mellomfil har lovlig innledning.
  303.               Det forutsettes at filen er åpnet og klar for lesing.
  304. */
  305. {
  306.    int  len;
  307.    char buff [56];
  308.  
  309.    if (!Rewind (objf))                 /* Les inn selve hodet til mellomfilen*/
  310.       return (ERROR);
  311.  
  312.    len = strlen (_StrMSGTEMPFILEID);
  313.    if (FRead (&buff, len, 1, objf) != 1)
  314.       return (ERROR);
  315.  
  316.    buff[len] = 0;                      /* Terminer strengen */
  317.  
  318.    if (strcmp (buff, _StrMSGTEMPFILEID) != 0)
  319.       return (ERROR);
  320.  
  321.    return (OK);
  322. } /* TestObjFileHead (); */
  323.  
  324.  
  325.  
  326.  
  327. int TestObjFile ( const char *ofname )
  328. /* Opprettet: Mandag 21. september 1992.
  329.    Parameter: "objf" Aktuell mellomfil som skal testes.
  330.    Retur    : E/O.
  331.    Beskriv  : Tester oppgitt mellomfil, og sjekker at den har lovlig format
  332.               og at den virkelig finnes.
  333. */
  334. {
  335.    FILE *objf;                         /* Aktuell mellomfil */
  336.  
  337.    if ((objf = FOpen (ofname, "r+b")) == NULL)
  338.       RETERR (16, ofname);             /* Failed on open file! */
  339.  
  340.    if (!TestObjFile_ (objf))           /* Utf¢r selve testen */
  341.    {
  342.       FClose (objf);
  343.       RETURN_ERR;
  344.    }
  345.  
  346.    FClose (objf);
  347.  
  348.    return (OK);
  349. } /* TestObjFile (); */
  350.  
  351.  
  352.  
  353.  
  354. int TestObjFile_ ( FILE *objf )
  355. /* Opprettet: Mandag 21. september 1992.
  356.    Parameter: "objf" Aktuell mellomfil som skal testes.
  357.    Retur    : E/O.
  358.    Beskriv  : Tester oppgitt mellomfil, og sjekker at den har lovlig format
  359.               og at den virkelig finnes. Dette er kjernen til
  360.               "TestObjFile ()". Det forutsettes at "objf" er åpen og klar
  361.               for lesing.
  362. */
  363. {
  364.    long     flen;
  365.    fposTYPE fpos;
  366.  
  367.    if (!TestObjFileHead (objf) || !GetFPosTYPE (objf, &fpos))
  368.       RETURN_ERR;
  369.  
  370.    flen = FLength (objf);
  371.    if (flen < 0 ||
  372.        fpos.finf   >= flen ||
  373.        fpos.funreg >= flen ||
  374.        fpos.funcal >= flen ||
  375.        fpos.idlst  >= flen ||
  376.        fpos.lininf >= flen)
  377.    {
  378.       return (ERROR);
  379.    }
  380.  
  381.    return (OK);
  382. } /* TestObjFile_ (); */
  383.  
  384.  
  385.  
  386.  
  387. int WrtStdLinComStart ( FILE *file, int linlen, int chr )
  388. /* Opprettet: Torsdag 24. september 1992.
  389.    Parameter: "file"   Filen som skal skrives til.
  390.               "linlen" Total bredde til linjen som skal skrives.
  391.               "chr"    Karakteren som linjen skal tegnes med.
  392.    Retur    : E/O.
  393.    Beskriv  : Skriver standard skillelinje til oppgitt kartfil. Skillelinjen
  394.               innledes med komentarblokk-startmerke hvis bruker har valgt
  395.               SMG til å generere komentarblokker.
  396.               Det forutsettes at oppgit kartfil er åpen og klar for skriving.
  397. */
  398. {
  399.    int width = linlen;                 /* Bredden til skillelinjer */
  400.  
  401.    if (o_various.gencom)               /* Hvis generer komentarblokker */
  402.    {
  403.       width -= 3;                      /* Gi plass til å innlede komentar */
  404.       if (!WrtComStart (file))         /* Innled komentarblokk */
  405.          RETURN_ERR;
  406.    }
  407.  
  408.    /* Tegn selve skillelinjen */
  409.    if (WritFLineLn (file, width, (char) chr) != width + 2)
  410.       RETURN_ERR;
  411.  
  412.    return (OK);
  413. } /* WrtStdLinComStart (); */
  414.  
  415.  
  416.  
  417.  
  418. int WrtStdLinComEnd ( FILE *file, int linlen, int chr )
  419. /* Opprettet: Torsdag 24. september 1992.
  420.    Parameter: "file"   Filen som skal skrives til.
  421.               "linlen" Total bredde til linjen som skal skrives.
  422.               "chr"    Karakteren som linjen skal tegnes med.
  423.    Retur    : E/O.
  424.    Beskriv  : Skriver standard skillelinje til oppgitt kartfil. Skillelinjen
  425.               avsluttes med komentarblokk-sluttmerke hvis bruker har valgt
  426.               SMG til å generere komentarblokker.
  427.               Det forutsettes at oppgit kartfil er åpen og klar for skriving.
  428. */
  429. {
  430.    int width = linlen;                 /* Bredden til skillelinjer */
  431.  
  432.    if (o_various.gencom)               /* Hvis generer komentarblokker */
  433.       width -= 3;                      /* Gi plass til å avslutte komentar */
  434.  
  435.    /* Tegn selve skillelinjen */
  436.    if (WritFLine (file, width, (char) chr) != width)
  437.       return (ERROR);
  438.  
  439.    if (o_various.gencom)               /* Hvis generer komentarblokker */
  440.       if (!WrtComEnd (file))           /* Avsluttende komentarblokk */
  441.          RETURN_ERR;
  442.  
  443.    if (!FPrintF (file, "\n"))
  444.       return (ERROR);
  445.  
  446.    return (OK);
  447. } /* WrtStdLinComEnd (); */
  448.  
  449.