Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1126 | savelij | 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 | } |