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

  1. /* ------------------------------------------------------------------------
  2.  *
  3.  *        File: smgprjct.c
  4.  *     Project: Source Mapper.
  5.  *     Created: Mai 19, 1992.
  6.  * Description: Kildekode for å styre/bruke prosjektfil.
  7.  *
  8.  * Copyright (C) 2000 Leif-Erik Larsen.
  9.  * This file is part of the Source Mapper source package.
  10.  * Source Mapper is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published
  12.  * by the Free Software Foundation, in version 2 as it comes in the
  13.  * "COPYING" file of the XWorkplace main distribution.
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * ------------------------------------------------------------------------ */
  20.  
  21.  
  22.  
  23.  
  24. #include "smg.h"
  25.  
  26.  
  27.  
  28.  
  29. prjstatTYPE prjstat;
  30.  
  31.  
  32.  
  33.  
  34. int GetFDataFromPrj ( int filenr, prjfeTYPE *fdata )
  35. /* Opprettet: Onsdag 9. september 1992.
  36.    Parameter: "filenr" Nummer til aktuelt fil i prosjekt (1..).
  37.               "fdata"  Struktur med data til aktuell fil, returneres.
  38.    Retur    : E/O.
  39.    Beskriv  : Returnerer tilgjengelige data om aktuell fil i
  40.               definert prosjekt.
  41. */
  42. {
  43.    long offs;
  44.  
  45.    if (!prjstat.prjon || filenr <= 0)  /* Hvis ikke noe aktivt prosjekt      */
  46.       return (ERROR);
  47.  
  48.    if (prjstat.file == NULL)           /* Hvis prosjektfil ikke er åpen      */
  49.    {
  50.       if ((prjstat.file = FOpen (prjstat.name, "r+b")) == NULL)
  51.          RETERR (2, prjstat.name);     /* Failed on open project file! */
  52.    }
  53.  
  54.    offs = strlen (_StrMSGPRJFILEID)    /* Calculate offset inside file       */
  55.           + 1 +                        /* +1 because the end-of-file mark    */
  56.           (filenr-1)*sizeof(prjfeTYPE);/* Index to actual element (0..).     */
  57.  
  58.    /* Pek til aktuell datablokk i fil */
  59.    FSeek (prjstat.file, offs, SEEK_SET);
  60.  
  61.    /* Les inn den aktuelle datablokken fra prosjektfilen: */
  62.    if (FRead (fdata, sizeof (prjfeTYPE), 1, prjstat.file) != 1)
  63.    {
  64.       FClose (prjstat.file);
  65.       prjstat.file = NULL;
  66.       return (ERROR);
  67.    }
  68.  
  69.    return (OK);
  70. } /* GetFDataFromPrj (); */
  71.  
  72.  
  73.  
  74.  
  75. int PutFDataToPrj ( int filenr, prjfeTYPE *fdata )
  76. /* Opprettet: S¢ndag 27. september 1992.
  77.    Parameter: "filenr" Nummer til aktuelt fil i prosjekt (1..).
  78.               "fdata"  Struktur med data som skal skrives til prosjektfil.
  79.    Retur    : E/O.
  80.    Beskriv  : Skriver oppgitte data om kildefil til prosjektfil. Dataene
  81.               skrives over kildefildata nummer "filenr" (1..). "filenr" kan
  82.               derfor ikke være h¢yere enn det er antall kildefiler i
  83.               aktiv prosjektfil.
  84. */
  85. {
  86.    if (!prjstat.prjon)                 /* Hvis ikke noe aktivt prosjekt */
  87.       return (ERROR);
  88.  
  89.    if (prjstat.file == NULL)           /* Hvis prosjektfil ikke er åpen */
  90.    {
  91.       if ((prjstat.file = FOpen (prjstat.name, "r+b")) == NULL)
  92.          RETERR (2, prjstat.name);     /* Failed on open project file! */
  93.    }
  94.  
  95.    /* Plasser filpeker ved starten til aktuell datablokk: */
  96.    FSeek (prjstat.file, strlen (_StrMSGPRJFILEID) + 1 + (filenr-1) * sizeof (prjfeTYPE), SEEK_SET);
  97.  
  98.    /* Skriv den aktuelle datablokken til prosjektfilen: */
  99.    if (FWrite (fdata, sizeof (prjfeTYPE), 1, prjstat.file) != 1)
  100.    {
  101.       FClose (prjstat.file);
  102.       prjstat.file = NULL;
  103.       return (ERROR);
  104.    }
  105.  
  106.    return (OK);
  107. } /* PutFDataToPrj (); */
  108.  
  109.  
  110.  
  111.  
  112. void ResetPrjStat ( void )
  113. /* Opprettet: Onsdag 9. september 1992.
  114.    Parameter:
  115.    Retur    :
  116.    Beskriv  : Nullstiller strukturen som lagrer status til prosjekt.
  117. */
  118. {
  119.    if (prjstat.file)
  120.       FClose (prjstat.file);
  121.  
  122.    prjstat.file   = NULL;
  123.  
  124.    memset (prjstat.name, 0, MAXPATH);
  125.    prjstat.usrn  = FALSE;
  126.    prjstat.temp  = TRUE;
  127.    prjstat.save  = FALSE;
  128.    prjstat.prjon = FALSE;
  129.    prjstat.filc  = 0;
  130. } /* ResetPrjStat (); */
  131.  
  132.  
  133.  
  134.  
  135. int AddFDataToPrj ( prjfeTYPE *fdata )
  136. /* Opprettet: Onsdag 9. september 1992.
  137.    Parameter: "fdata"  Struktur med data som skal legges til prosjektfilen
  138.    Retur    : E/O.
  139.    Beskriv  : Legger oppgitte fildata til prosjektfilen. Dataene legges
  140.               bakerst i prosjektfilen. Dersom det ikke er noe aktivt prosjekt
  141.               opprettes prosjektet m/midlertidig prosjektfil.
  142. */
  143. {
  144.    if (prjstat.prjon == FALSE)         /* Hvis ingen aktiv prosjektfil */
  145.    {
  146.       ResetPrjStat ();
  147.       strcpy (prjstat.name, tmpn.projec);
  148.       if (!MakePrjF (prjstat.name))
  149.          RETURN_ERR;
  150.       prjstat.temp = TRUE;             /* Aktiv prosjektfil er midlertidig */
  151.    }
  152.  
  153.    if (prjstat.file == NULL)           /* Hvis prosjektfil ikke er åpen */
  154.    {
  155.       prjstat.file = FOpen (prjstat.name, "r+b"); /* Åpne prosjektfil */
  156.       if (prjstat.file == NULL)
  157.          RETERR (2, prjstat.name)      /* Kunne ikke åpne prosjektfil */
  158.    }
  159.  
  160.    /* Plasser filpeker bakerst i filen, slik at nytt element skj¢tes: */
  161.    FSeek (prjstat.file, 0L, SEEK_END);
  162.  
  163.    if (FWrite (fdata, sizeof (prjfeTYPE), 1, prjstat.file) != 1)
  164.    {
  165.       FClose (prjstat.file);
  166.       prjstat.file = NULL;
  167.       RETERR (3, prjstat.name);        /* Kunne ikke skrive til fil */
  168.    }
  169.  
  170.    prjstat.filc += 1;                  /* Antall filer i prosjekt */
  171.  
  172.    return (OK);
  173. } /* AddFDataToPrj (); */
  174.  
  175.  
  176.  
  177.  
  178. int MakePrjF ( const char *fname )
  179. /* Opprettet: Onsdag 9. september 1992.
  180.    Parameter: "fname"  Navnet til prosjektfilen som skal opprettes.
  181.    Return   : E/O.
  182.    Beskriv  : Oppretter prosjektfil med oppgitt filnavn.
  183.               Gj¢r ikke annet enn å opprette filen og skrive filkjennemerke.
  184.               Eventuell åpen prosjektfil lukkes f¢r den nye filen opprettes.
  185. */
  186. {
  187.    if (prjstat.prjon == TRUE)          /* Hvis allerede aktivt prosjekt */
  188.    {
  189.       prjstat.prjon = FALSE;           /* Prosjektfil er midlertidig passiv */
  190.       if (prjstat.file != NULL)        /* Hvis prosjektfil er åpen */
  191.          FClose (prjstat.file);
  192.    }
  193.  
  194.    /* Åpne den nye prosjektfilen: */
  195.    if ((prjstat.file = FOpen (fname, "w+b")) == NULL)
  196.       RETERR (4, fname);
  197.  
  198.    /* Skriv filkjennemerke til prosjektfil: */
  199.    if (!FPrintF (prjstat.file, "%s%c", _StrMSGPRJFILEID, EOFCHR))
  200.    {
  201.       FClose (prjstat.file);
  202.       prjstat.file = NULL;
  203.       RETERR (3, fname);               /* Failed on write to file */
  204.    }
  205.  
  206.    prjstat.prjon = TRUE;               /* Prosjekt er herved aktivt */
  207.  
  208.    return (OK);
  209. } /* MakePrjF (); */
  210.  
  211.  
  212.  
  213.  
  214. void ResetPrjFETYPE ( prjfeTYPE *fdata )
  215. /* Opprettet: Onsdag 9. september 1992.
  216.    Parameter: "fdata"  Strukturen som skal nullstilles.
  217.    Beskriv  : Nullstiller data om kildefil som er en del av prosjektfilen. */
  218. {
  219.    memset (fdata, 0, sizeof (prjfeTYPE));
  220. } /* ResetPrjFETYPE (); */
  221.  
  222.  
  223.  
  224.  
  225. void GetObjFileName ( char *ofname, const char *sfname )
  226. /* Opprettet: S¢ndag 20. september 1992.
  227.    Parameter: "ofname" Produsert navn til mellomfil.
  228.               "sfname" Navn til kildefil.
  229.    Beskriv  : Finner navn til mellomfil. Navnet lages på grunnlag av
  230.               oppgitt kildefil-navn og brukerens valg av mellomfil-katalog og
  231.               mellomfil-etternavn. */
  232. {
  233.    strcpy  (ofname, o_generate.obj);       /* Katalog til mellomfiler */
  234.    Slash   (ofname);                       /* Avsluttende "\" */
  235.    strcat  (ofname, GetFName (sfname));    /* Skj¢t filnavn til mellomfil-navn */
  236.    CutFExt (ofname);                       /* Kutt etternavn-delen */
  237.    strcat  (ofname, fnames [SMGOBJC_EXT]); /* Skj¢t på standard etternavn */
  238. } /* GetObjFileName (); */
  239.  
  240.  
  241.  
  242.  
  243. int IsTime1NewerThanTime2 ( const timeTYPE *Time1, const timeTYPE *Time2 )
  244. /* Function : Test if Time1 is newer than Time2.
  245.    Opprettet: September 20, 1995. 19:00. By Leif-Erik Larsen.
  246.    Parameter: Time1 = Time to test if newer than Time2.
  247.               Time2 = Time to be tested with Time1.
  248.    Return   : TRUE if Time1 is newer than Time2, or else FALSE. */
  249. {
  250.    #define TIMETEST(Time1, Time2) if (Time1 > Time2) return TRUE; \
  251.                                   if (Time1 < Time2) return FALSE;
  252.  
  253.    TIMETEST (Time1->year, Time2->year);
  254.    TIMETEST (Time1->month, Time2->month);
  255.    TIMETEST (Time1->day, Time2->day);
  256.    TIMETEST (Time1->hour, Time2->hour);
  257.    TIMETEST (Time1->min, Time2->min);
  258.    TIMETEST (Time1->sec, Time2->sec);
  259.    TIMETEST (Time1->hund, Time2->hund);
  260.  
  261.    #undef TIMETEST
  262.  
  263.    /* The two times are 100% identical to each other, so return FALSE */
  264.    return FALSE;
  265. } /* IsTime1NewerThanTime2 (); */
  266.  
  267.  
  268.  
  269.  
  270. int ScanFilesInPrj ( int job )
  271. /* Opprettet: Torsdag 10. september 1992.
  272.    Parameter: "job" PRJMAKE:  Generer mellomfil bare over de kildefiler som
  273.                               er forandret siden forrige generering.
  274.                     PRJBUILD: Generer mellomfil over samtlige kildefiler,
  275.                               uavhengig av om de er forandret siden sist
  276.                               eller ikke.
  277.    Retur    : E/O.
  278.    Beskriv  : Scanner og lager mellomfil av samtlige kildefiler som er
  279.               oppgitt i aktiv prosjektfil. Dersom det ikke er noen aktiv
  280.               prosjektfil vil denne funksjonen bare returnere error.
  281.               Returnerer error også ved andre typer feil, som hindret
  282.               funksjonen å lage mellomfil til en eller fler av aktuelle
  283.               kildefiler.
  284. */
  285. {
  286.    int c1 = 0;
  287.    int washere  = 0;
  288.    timeTYPE ftsource;                  /* Dato/tid-stempel til kildefil */
  289.    timeTYPE ftobj;                     /* Dato/tid-stempel til mellomfil */
  290.    prjfeTYPE fdata;                    /* Mellomlager for kildefildata */
  291.  
  292.    if (prjstat.prjon == FALSE)         /* Hvis ingen aktiv prosjektfil */
  293.       RETERR (5, NULL);                /* Integral error */
  294.  
  295.    while (c1++ < prjstat.filc)         /* Alle kildefiler i prosjekt */
  296.    {
  297.       if (!GetFDataFromPrj (c1, &fdata))
  298.          RETURN_ERR;
  299.  
  300.       /* Hvis feil i kildefil-datostempel (antagelig manglende fil) */
  301.       if (!GetFileTime (fdata.name, &ftsource))
  302.          RETERR (6, fdata.name);
  303.  
  304.       GetFileTime (fdata.objn, &ftobj);/* Ignorer eventuell feil */
  305.  
  306.       if (job == PRJBUILD ||           /* Hvis samtlige objektfiler skal gen*/
  307.           !IsTime1NewerThanTime2 (&ftobj, &ftsource) ||
  308.           o_various.del ||             /* Auto delete .smg-files */
  309.           !TestObjFile (fdata.objn))   /* Feil format i mellomfil? */
  310.       {
  311.          if (!washere)                 /* Display only once */
  312.          {
  313.             /* Genererer mellomfil(er): */
  314.             Display (D_HEIGHEST, "%s:\n", _StrMSGGENERATESOBJ);
  315.             washere = 1;
  316.          }
  317.  
  318.          /* Utf¢r selve scanningen av aktiv kildefil: */
  319.          if (!scan_sourcef (fdata.name, fdata.objn))
  320.             RETURN_ERR;
  321.       }
  322.    }
  323.  
  324.    if (washere)                        /* Hvis noen mellomfil er laget */
  325.       if (o_various.iShowInfo > 0)     /* Hvis vi viser noen runtimeinfo */
  326.          printf ("\n");
  327.  
  328.    return (OK);
  329. } /* ScanFilesInPrj (); */
  330.  
  331.  
  332.  
  333.  
  334. int MakePrjDataOK ( void )
  335. /* Opprettet: S¢ndag 27. september 1992.
  336.    Retur    : E/O.
  337.    Beskriv  : Leser kildefil-info fra samtlige kildefilers tilh¢rende
  338.               mellomfil, og lagrer infoen i de respektive kildefilinfo-
  339.               blokkene til prosjektfilen.
  340. */
  341. {
  342.    int c1 = 0;
  343.    FILE *objf;
  344.    prjfeTYPE fdata;
  345.  
  346.    if (prjstat.prjon == FALSE)         /* If no current project in process   */
  347.       RETURN_ERR;
  348.  
  349.    while (c1++ < prjstat.filc)         /* Loop trough all files in project   */
  350.    {
  351.       if (!GetFDataFromPrj (c1, &fdata)) /* Get project info about file */
  352.          RETURN_ERR;
  353.  
  354.       GetObjFileName (fdata.objn, fdata.name); /* Construct name of objectfile */
  355.  
  356.       if ((objf = FOpen (fdata.objn, "r+b")) == NULL)
  357.          RETERR (16, fdata.objn);      /* Failed on open active objectfile! */
  358.  
  359.       if (!GetFInfTYPE (objf, &fdata.finf)) /* Get total information of object file */
  360.       {
  361.          FClose (objf);
  362.          RETURN_ERR;
  363.       }
  364.  
  365.       if (!GetFPosTYPE (objf, &fdata.fpos)) /* Get indexes to blocks of data */
  366.       {
  367.          FClose (objf);                /* Close active objectfile if error   */
  368.          RETURN_ERR;
  369.       }
  370.  
  371.       FClose (objf);                   /* Close active objectfile            */
  372.       fdata.dataok = TRUE;             /* Now, the structure is complete     */
  373.       if (!PutFDataToPrj (c1, &fdata)) /* Write the complete data to prject file */
  374.          RETURN_ERR;
  375.    }
  376.  
  377.    return (OK);
  378. } /* MakePrjDataOK (); */
  379.  
  380.  
  381.  
  382.  
  383. int GetFDataOfGLin ( long glin, long *slin, prjfeTYPE *fdata )
  384. /*
  385.     Function: Get file data with respect to global line number.
  386.               Which source do this line number belong to?
  387.         Date: April, 26. 1993. 15:45. By LEL.
  388.    Interface: glin  = Global line number to find.
  389.               slin  = Mother source start on this global line number.
  390.               fdata = Return the found source, and info, in
  391.                       this structure.
  392.      Returns: E/O.
  393. */
  394. {
  395.    int filec = 0;                      /* Count files in project             */
  396.    long cglin = 0;                     /* Count global line number           */
  397.  
  398.    while (filec++ < prjstat.filc)      /* Seek trough all files in project   */
  399.    {
  400.       if (!GetFDataFromPrj (filec, fdata)) /* Get info about next source */
  401.          RETURN_ERR;
  402.  
  403.       if (glin > cglin &&              /* Is spec. line within this source?  */
  404.           glin <= cglin + fdata->finf.ltot)
  405.       {
  406.          *slin = cglin + 1;            /* Global first line number of source */
  407.          return (OK);                  /* Line was found to belong a source  */
  408.       }
  409.  
  410.       cglin += fdata->finf.ltot;       /* Count current global line number   */
  411.    }
  412.  
  413.    RETURN_ERR;                         /* Line does not belong to any source */
  414. } /* GetFDataOfGLin (); */
  415.  
  416.