Added options to make Robodoc more customizable.
[robodoc.git] / Source / ascii_generator.c
1 /*
2 Copyright (C) 1994-2007  Frans Slothouber, Jacco van Weert, Petteri Kettunen,
3 Bernd Koesling, Thomas Aglassinger, Anthon Pang, Stefan Kost, David Druffner,
4 Sasha Vasko, Kai Hofmann, Thierry Pierron, Friedrich Haase, and Gergely Budai.
5
6 This file is part of ROBODoc
7
8 ROBODoc is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
21 */
22
23 /* vi: spell ff=unix 
24  */
25 /****h* ROBODoc/ASCII_Generator
26  * NAME
27  *   ASCII_Generator -- Generator for ASCII output
28  * FUNCTION
29  *   Plain ascii output, no formatting.
30  * MODIFICATION HISTORY
31  *   2003-06-17  Frans Slothouber V1.0
32  *******
33  * $Id: ascii_generator.c,v 1.21 2007/07/10 19:13:51 gumpu Exp $
34  */
35
36 #include <stdio.h>
37 #include <assert.h>
38
39 #include "ascii_generator.h"
40 #include "util.h"
41 #include "robodoc.h"
42 #include "globals.h"
43 #include "items.h"
44 #include "headers.h"
45 #include "headertypes.h"
46 #include "generator.h"
47
48 #ifdef DMALLOC
49 #include <dmalloc.h>
50 #endif
51
52 /*x**h* ROBODoc/ASCII_Generator
53  * FUNCTION
54  *   Generator for plain ASCII output
55  *******
56  */
57
58
59 /*x**f* ASCII_Generator/RB_ASCII_Generate_Doc_Start
60  * NAME
61  *   RB_ASCII_Generate_Doc_Start --
62  ******
63  */
64
65 void RB_ASCII_Generate_Doc_Start(
66     FILE *dest_doc,
67     char *src_name,
68     char *name,
69     char toc )
70 {
71     USE( src_name );
72     USE( name );
73     USE( toc );
74
75     if ( course_of_action.do_toc )
76     {
77         fprintf( dest_doc, "TABLE OF CONTENTS\n" );
78         /* TODO  TOC */
79 #if 0
80         for ( cur_header = first_header, header_nr = 1;
81               cur_header; cur_header = cur_header->next_header, header_nr++ )
82         {
83             if ( cur_header->name && cur_header->function_name )
84             {
85                 fprintf( dest_doc, "%4.4d %s\n",
86                          header_nr, cur_header->name );
87             }
88         }
89 #endif
90         fputc( '\f', dest_doc );
91     }
92 }
93
94 /*x**f* ASCII_Generator/RB_ASCII_Generate_Doc_End
95  * NAME
96  *   RB_ASCII_Generate_Doc_End --
97  ******
98  */
99
100 void RB_ASCII_Generate_Doc_End(
101     FILE *dest_doc,
102     char *name )
103 {
104     USE( dest_doc );
105     USE( name );
106     /* Empty */
107 }
108
109 /*x**f* ASCII_Generator/RB_ASCII_Generate_Header_Start
110  * NAME
111  *   RB_ASCII_Generate_Header_Start --
112  ******
113  */
114
115 void RB_ASCII_Generate_Header_Start(
116     FILE *dest_doc,
117     struct RB_header *cur_header )
118 {
119     fprintf( dest_doc, "%s", cur_header->name );
120     fprintf( dest_doc, "\n\n" );
121 }
122
123 void RB_ASCII_Generate_Header_End(
124     FILE *dest_doc,
125     struct RB_header *cur_header )
126 {
127     USE( cur_header );
128     fprintf( dest_doc,
129              "\n---------------------------------------------------------------------------\n" );
130     /* form-feeds are annoying    fputc( '\f', dest_doc ); */
131 }
132
133 /*x**f* ASCII_Generator/RB_ASCII_Generate_Empty_Item
134  * NAME
135  *   RB_ASCII_Generate_Empty_Item --
136  ******
137  */
138
139 void RB_ASCII_Generate_Empty_Item(
140     FILE *dest )
141 {
142     USE( dest );
143     /* Empty */
144 }
145
146 /* TODO Documentation */
147 void RB_ASCII_Generate_String(
148     FILE *dest,
149     char *string )
150 {
151     fprintf( dest, "%s", string );
152 }
153
154 /* TODO Documentation */
155 void RB_ASCII_Generate_False_Link(
156     FILE *dest_doc,
157     char *name )
158 {
159     fprintf( dest_doc, "%s", name );
160 }
161
162 /* TODO Documentation */
163 char               *RB_ASCII_Get_Default_Extension(
164     void )
165 {
166     return ( ".txt" );
167 }
168
169 /* TODO Documentation */
170 void RB_ASCII_Generate_Item_Name(
171     FILE *dest_doc,
172     char *name )
173 {
174     fprintf( dest_doc, "%s\n", name );
175 }
176
177
178 /* TODO Documentation */
179 void RB_ASCII_Generate_Item_Begin(
180     FILE *dest_doc )
181 {
182     USE( dest_doc );
183     /* Empty */
184 }
185
186
187 /* TODO Documentation */
188 void RB_ASCII_Generate_Char(
189     FILE *dest_doc,
190     int c )
191 {
192     fputc( c, dest_doc );
193 }
194
195
196 /* TODO Documentation */
197 void RB_ASCII_Generate_Item_End(
198     FILE *dest_doc )
199 {
200     USE( dest_doc );
201     /* Empty */
202 }
203
204
205 static int          section_counters[ASCII_MAX_SECTION_DEPTH];
206 void RB_ASCII_Generate_BeginSection(
207     FILE *dest_doc,
208     int depth,
209     char *name,
210     struct RB_header *header )
211 {
212     int                 i;
213
214     ++section_counters[depth];
215     for ( i = depth + 1; i < ASCII_MAX_SECTION_DEPTH; ++i )
216     {
217         section_counters[i] = 0;
218     }
219     if ( depth < ASCII_MAX_SECTION_DEPTH )
220     {
221         if ( !( course_of_action.do_sectionnameonly ) )
222         {
223             for ( i = 1; i <= depth; ++i )
224             {
225                 fprintf( dest_doc, "%d.", section_counters[i] );
226             }
227             fprintf( dest_doc, "  " );
228         }
229
230         // Print Header "first" name
231         RB_ASCII_Generate_String( dest_doc, name );
232
233         // Print further names
234         for ( i = 1; i < header->no_names; i++ )
235         {
236             fprintf( dest_doc, ( i % header_breaks ) ? ", " : ",\n" );
237             RB_ASCII_Generate_String( dest_doc, header->names[i] );
238         }
239
240         // Include module name if not sectionnameonly
241         if ( !( course_of_action.do_sectionnameonly ) )
242         {
243             fprintf( dest_doc, " [ " );
244             RB_ASCII_Generate_String( dest_doc, header->htype->indexName );
245             fprintf( dest_doc, " ]" );
246         }
247     }
248     else
249     {
250         /* too deep, don't do anything. */
251         assert( 0 );
252     }
253 }
254
255 void RB_ASCII_Generate_EndSection(
256     FILE *dest_doc,
257     int depth,
258     char *name )
259 {
260     USE( dest_doc );
261     USE( name );
262     USE( depth );
263     /* Empty */
264 }