Subversion Repositories pentevo

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. /* textoc.c */
  2. /*****************************************************************************/
  3. /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only                     */
  4. /*                                                                           */
  5. /* AS                                                                        */
  6. /*                                                                           */
  7. /* TeX-->ASCII/HTML Converter: Table Of Contents                             */
  8. /*                                                                           */
  9. /*****************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include "strutil.h"
  16. #include "textoc.h"
  17.  
  18. /*--------------------------------------------------------------------------*/
  19.  
  20. typedef struct sTocSave
  21. {
  22.   struct sTocSave *pNext;
  23.   char *pTocName;
  24. } tTocSave, *tpTocSave;
  25.  
  26. /*--------------------------------------------------------------------------*/
  27.  
  28. static tpTocSave pFirstTocSave;
  29.  
  30. /*--------------------------------------------------------------------------*/
  31.  
  32. /*!------------------------------------------------------------------------
  33.  * \fn     InitToc(void)
  34.  * \brief  initialize TOC
  35.  * ------------------------------------------------------------------------ */
  36.  
  37. void InitToc(void)
  38. {
  39.   pFirstTocSave = NULL;
  40. }
  41.  
  42. /*!------------------------------------------------------------------------
  43.  * \fn     AddToc(const char *pLine, unsigned Indent)
  44.  * \brief  add TOC entry
  45.  * \param  pLine title of TOC entry
  46.  * \param  Indent indentation of title
  47.  * ------------------------------------------------------------------------ */
  48.  
  49. void AddToc(const char *pLine, unsigned Indent)
  50. {
  51.   tpTocSave pNewTocSave, pRunToc;
  52.  
  53.   pNewTocSave = (tpTocSave) malloc(sizeof(*pNewTocSave));
  54.   pNewTocSave->pNext = NULL;
  55.   pNewTocSave->pTocName = (char *) malloc(1 + Indent + strlen(pLine));
  56.   strcpy(pNewTocSave->pTocName, Blanks(Indent));
  57.   strcat(pNewTocSave->pTocName, pLine);
  58.   if (!pFirstTocSave)
  59.     pFirstTocSave = pNewTocSave;
  60.   else
  61.   {
  62.     for (pRunToc = pFirstTocSave; pRunToc->pNext; pRunToc = pRunToc->pNext);
  63.     pRunToc->pNext = pNewTocSave;
  64.   }
  65. }
  66.  
  67. /*!------------------------------------------------------------------------
  68.  * \fn     PrintToc(char *pFileName)
  69.  * \brief  dump TOC to file
  70.  * \param  pFileName where to write
  71.  * ------------------------------------------------------------------------ */
  72.  
  73. void PrintToc(char *pFileName)
  74. {
  75.   tpTocSave pRun;
  76.   FILE *pFile = fopen(pFileName, "w");
  77.  
  78.   if (!pFile)
  79.     perror(pFileName);
  80.  
  81.   for (pRun = pFirstTocSave; pRun; pRun = pRun->pNext)
  82.     fprintf(pFile, "%s\n\n", pRun->pTocName);
  83.   fclose(pFile);
  84. }
  85.  
  86. /*!------------------------------------------------------------------------
  87.  * \fn     FreeToc(void)
  88.  * \brief  free TOC list
  89.  * ------------------------------------------------------------------------ */
  90.  
  91. void FreeToc(void)
  92. {
  93.   while (pFirstTocSave)
  94.   {
  95.     tpTocSave pOld = pFirstTocSave;
  96.     pFirstTocSave = pOld->pNext;
  97.     free(pOld->pTocName);
  98.     free(pOld);
  99.   }
  100. }
  101.