mangen.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  *
4  *
5  * Copyright (C) 1997-2015 by Dimitri van Heesch.
6  *
7  * Permission to use, copy, modify, and distribute this software and its
8  * documentation under the terms of the GNU General Public License is hereby
9  * granted. No representations are made about the suitability of this software
10  * for any purpose. It is provided "as is" without express or implied warranty.
11  * See the GNU General Public License for more details.
12  *
13  * Documents produced by Doxygen are derivative works derived from the
14  * input used in their production; they are not affected by this license.
15  *
16  */
17 
18 /* http://www.cubic.org/source/archive/fileform/txt/man/ has some
19  nice introductions to groff and man pages. */
20 
21 #include <stdlib.h>
22 
23 #include <qdir.h>
24 #include "message.h"
25 #include "mangen.h"
26 #include "config.h"
27 #include "util.h"
28 #include "doxygen.h"
29 #include <string.h>
30 #include "docparser.h"
31 #include "mandocvisitor.h"
32 #include "language.h"
33 
35 {
36  /*
37  * [.][nuber][rest]
38  * in case of . missing, just ignore it
39  * in case number missing, just place a 3 in front of it
40  */
41  QCString ext = Config_getString("MAN_EXTENSION");
42  if (ext.isEmpty())
43  {
44  ext = "3";
45  }
46  else
47  {
48  if (ext.at(0)=='.')
49  {
50  if (ext.length()==1)
51  {
52  ext = "3";
53  }
54  else // strip .
55  {
56  ext = ext.mid(1);
57  }
58  }
59  if (ext.at(0)<'0' || ext.at(0)>'9')
60  {
61  ext.prepend("3");
62  }
63  }
64  return ext;
65 }
66 
68 {
69  QCString dir = Config_getString("MAN_SUBDIR");
70  if (dir.isEmpty())
71  {
72  dir = "man" + getExtension();
73  }
74  return dir;
75 }
76 
78 {
79  dir=Config_getString("MAN_OUTPUT") + "/" + getSubdir();
80  firstCol=TRUE;
82  col=0;
86 }
87 
89 {
90 }
91 
92 //void ManGenerator::append(const OutputGenerator *g)
93 //{
94 // QCString r=g->getContents();
95 // if (upperCase)
96 // t << r.upper();
97 // else
98 // t << r;
99 // if (!r.isEmpty())
100 // firstCol = r.at(r.length()-1)=='\n';
101 // else
102 // firstCol = ((ManGenerator *)g)->firstCol;
103 // col+=((ManGenerator *)g)->col;
104 // inHeader=((ManGenerator *)g)->inHeader;
105 // paragraph=FALSE;
106 //}
107 
109 {
110  QCString &manOutput = Config_getString("MAN_OUTPUT");
111 
112  QDir d(manOutput);
113  if (!d.exists() && !d.mkdir(manOutput))
114  {
115  err("Could not create output directory %s\n",manOutput.data());
116  exit(1);
117  }
118  d.setPath(manOutput + "/" + getSubdir());
119  if (!d.exists() && !d.mkdir(manOutput + "/" + getSubdir()))
120  {
121  err("Could not create output directory %s/%s\n",manOutput.data(), getSubdir().data());
122  exit(1);
123  }
124  createSubDirs(d);
125 }
126 
127 static QCString buildFileName(const char *name)
128 {
130  if (name==0) return "noname";
131 
132  const char *p=name;
133  char c;
134  while ((c=*p++))
135  {
136  switch (c)
137  {
138  case ':':
139  fileName+="_";
140  if (*p==':') p++;
141  break;
142  case '<':
143  case '>':
144  case '&':
145  case '*':
146  case '!':
147  case '^':
148  case '~':
149  case '%':
150  case '+':
151  case '/':
152  fileName+="_";
153  break;
154  default:
155  fileName+=c;
156  }
157  }
158 
159  QCString manExtension = "." + getExtension();
160  if (fileName.right(manExtension.length())!=manExtension)
161  {
162  fileName+=manExtension;
163  }
164 
165  return fileName;
166 }
167 
168 void ManGenerator::startFile(const char *,const char *manName,const char *)
169 {
170  startPlainFile( buildFileName( manName ) );
171  firstCol=TRUE;
172 }
173 
175 {
176  t << endl;
177  endPlainFile();
178 }
179 
180 void ManGenerator::endTitleHead(const char *,const char *name)
181 {
182  t << ".TH \"" << name << "\" " << getExtension() << " \""
183  << dateToString(FALSE) << "\" \"";
184  if (!Config_getString("PROJECT_NUMBER").isEmpty())
185  t << "Version " << Config_getString("PROJECT_NUMBER") << "\" \"";
186  if (Config_getString("PROJECT_NAME").isEmpty())
187  t << "Doxygen";
188  else
189  t << Config_getString("PROJECT_NAME");
190  t << "\" \\\" -*- nroff -*-" << endl;
191  t << ".ad l" << endl;
192  t << ".nh" << endl;
193  t << ".SH NAME" << endl;
194  t << name << " \\- ";
195  firstCol=FALSE;
196  paragraph=TRUE;
197  inHeader=TRUE;
198 }
199 
201 {
202  if (!paragraph)
203  {
204  if (!firstCol) t << endl;
205  t << ".PP" << endl;
206  firstCol=TRUE;
207  }
208  paragraph=TRUE;
209 }
210 
212 {
213  if (!paragraph)
214  {
215  if (!firstCol) t << endl;
216  t << ".PP" << endl;
217  firstCol=TRUE;
218  }
219  paragraph=TRUE;
220 }
221 
223 {
224 }
225 
226 void ManGenerator::writeString(const char *text)
227 {
228  docify(text);
229 }
230 
231 void ManGenerator::startIndexItem(const char *,const char *)
232 {
233 }
234 
235 void ManGenerator::endIndexItem(const char *,const char *)
236 {
237 }
238 
239 void ManGenerator::writeStartAnnoItem(const char *,const char *,
240  const char *,const char *)
241 {
242 }
243 
244 void ManGenerator::writeObjectLink(const char *,const char *,
245  const char *, const char *name)
246 {
247  startBold(); docify(name); endBold();
248 }
249 
250 void ManGenerator::writeCodeLink(const char *,const char *,
251  const char *, const char *name,
252  const char *)
253 {
254  docify(name);
255 }
256 
257 void ManGenerator::startHtmlLink(const char *)
258 {
259 }
260 
262 {
263 }
264 
265 //void ManGenerator::writeMailLink(const char *url)
266 //{
267 // docify(url);
268 //}
269 
271 {
272  if (!firstCol) t << endl;
273  t << ".SH \"";
274  upperCase=TRUE;
275  firstCol=FALSE;
276 }
277 
279 {
280  t << "\"\n.PP " << endl;
281  firstCol=TRUE;
282  paragraph=TRUE;
284 }
285 
287 {
288  if (!firstCol) t << endl;
289  t << ".SS \"";
290 }
291 
293 {
294  t << "\"\n";
295  firstCol=TRUE;
297 }
298 
299 void ManGenerator::docify(const char *str)
300 {
301  if (str)
302  {
303  const char *p=str;
304  char c=0;
305  while ((c=*p++))
306  {
307  switch(c)
308  {
309  case '-': t << "\\-"; break; // see bug747780
310  case '.': t << "\\&."; break; // see bug652277
311  case '\\': t << "\\\\"; col++; break;
312  case '\n': t << "\n"; col=0; break;
313  case '\"': c = '\''; // no break!
314  default: t << c; col++; break;
315  }
316  }
317  firstCol=(c=='\n');
318  //printf("%s",str);fflush(stdout);
319  }
321 }
322 
323 void ManGenerator::codify(const char *str)
324 {
325  //static char spaces[]=" ";
326  if (str)
327  {
328  const char *p=str;
329  char c;
330  int spacesToNextTabStop;
331  while (*p)
332  {
333  c=*p++;
334  switch(c)
335  {
336  case '.': t << "\\&."; break; // see bug652277
337  case '\t': spacesToNextTabStop =
338  Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
339  t << Doxygen::spaces.left(spacesToNextTabStop);
340  col+=spacesToNextTabStop;
341  break;
342  case '\n': t << "\n"; firstCol=TRUE; col=0; break;
343  case '\\': t << "\\"; col++; break;
344  case '\"': // no break!
345  default: p=writeUtf8Char(t,p-1); firstCol=FALSE; col++; break;
346  }
347  }
348  //printf("%s",str);fflush(stdout);
349  }
351 }
352 
354 {
355  firstCol=(c=='\n');
356  if (firstCol) col=0; else col++;
357  switch (c)
358  {
359  case '\\': t << "\\\\"; break;
360  case '\"': c = '\''; // no break!
361  default: t << c; break;
362  }
363  //printf("%c",c);fflush(stdout);
365 }
366 
368 {
369  if (!firstCol)
370  { t << endl << ".PP" << endl;
372  col=0;
373  }
375  startBold();
376 }
377 
379 {
380  if (!firstCol) t << endl;
381  t << ".SH \"";
382  firstCol=FALSE;
384 }
385 
387 {
388  t << "\"";
389 }
390 
392 {
393  if (!firstCol) t << endl;
394  t << ".TP" << endl;
395  firstCol=TRUE;
397  col=0;
398 }
399 
401 {
402 }
403 
405 {
406  newParagraph();
407  t << ".nf" << endl;
408  firstCol=TRUE;
410 }
411 
413 {
414  if (!firstCol) t << endl;
415  t << ".fi" << endl;
416  firstCol=TRUE;
418  col=0;
419 }
420 
421 void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *,bool)
422 {
423  if (!firstCol) t << endl;
424  t << ".SS \"";
425  firstCol=FALSE;
427 }
428 
429 void ManGenerator::startDoxyAnchor(const char *,const char *manName,
430  const char *, const char *name,
431  const char *)
432 {
433  // something to be done?
434  if( !Config_getBool("MAN_LINKS") )
435  {
436  return; // no
437  }
438 
439  // the name of the link file is derived from the name of the anchor:
440  // - truncate after an (optional) ::
442  int i=baseName.findRev("::");
443  if (i!=-1) baseName=baseName.right(baseName.length()-i-2);
444 
445  //printf("Converting man link '%s'->'%s'->'%s'\n",
446  // name,baseName.data(),buildFileName(baseName).data());
447 
448  // - remove dangerous characters and append suffix, then add dir prefix
449  QCString fileName=dir+"/"+buildFileName( baseName );
450  QFile linkfile( fileName );
451  // - only create file if it doesn't exist already
452  if ( !linkfile.open( IO_ReadOnly ) )
453  {
454  if ( linkfile.open( IO_WriteOnly ) )
455  {
456  FTextStream linkstream;
457  linkstream.setDevice(&linkfile);
458  //linkstream.setEncoding(QTextStream::UnicodeUTF8);
459  linkstream << ".so " << getSubdir() << "/" << buildFileName( manName ) << endl;
460  }
461  }
462  linkfile.close();
463 }
464 
466 {
467  t << "\"\n";
468 }
469 
471 {
472  if (!firstCol) t << endl;
473  t << ".SS \"";
474  firstCol=FALSE;
476 }
477 
479 {
480  t << "\"";
481 }
482 
483 
485 {
486  if (!firstCol) t << endl;
487  t << "\n.SS \"";
488  firstCol=FALSE;
490 }
491 
493 {
494  t << "\"";
495 }
496 
498 {
499  if (!firstCol) t << endl;
500  t << ".SH SYNOPSIS\n.br\n.PP\n";
501  firstCol=TRUE;
503 }
504 
506 {
507  if (!firstCol) t << endl;
508  t << ".IP \"";
509  firstCol=FALSE;
510 }
511 
512 //void ManGenerator::endDescTitle()
513 //{
514 // endBold();
515 // paragraph=TRUE;
516 //}
517 
519 {
520  if (!firstCol) t << endl;
521  if (!paragraph) t << ".in -1c" << endl;
522  t << ".in +1c" << endl;
523  firstCol=TRUE;
525  col=0;
526 }
527 
529 {
530 }
531 
533 {
534  t << "\" 1c" << endl;
535  firstCol=TRUE;
536 }
537 
538 void ManGenerator::startAnonTypeScope(int indentLevel)
539 {
540  if (indentLevel==0)
541  {
543  }
544 }
545 
546 void ManGenerator::endAnonTypeScope(int indentLevel)
547 {
548  if (indentLevel==0)
549  {
551  }
552 }
553 
554 
555 void ManGenerator::startMemberItem(const char *,int,const char *)
556 {
557  if (firstCol && !insideTabbing) t << ".in +1c\n";
558  t << "\n.ti -1c\n.RI \"";
559  firstCol=FALSE;
560 }
561 
563 {
564  t << "\"\n.br";
565 }
566 
568 {
569  if (!insideTabbing)
570  {
571  t << "\n.in +1c"; firstCol=FALSE;
572  }
573 }
574 
576 {
577  if (!insideTabbing)
578  {
579  t << "\n.in -1c"; firstCol=FALSE;
580  }
581 }
582 
584 {
585  t << "\n.PP\n.RI \"\\fB";
586 }
587 
589 {
590  t << "\\fP\"\n.br\n";
591  firstCol=TRUE;
592 }
593 
595 {
596 }
597 
599 {
600  t << "\n.PP";
601 }
602 
604 {
605  t << "\n.in +1c";
606 }
607 
609 {
610  t << "\n.in -1c";
611  firstCol=FALSE;
612 }
613 
615 {
616  if( !inHeader )
617  {
618  switch(type)
619  {
625  default: ASSERT(0); break;
626  }
627  }
628 }
629 
631 {
632  if( !inHeader )
633  {
634  switch(type)
635  {
636  case SectionInfo::Page: endGroupHeader(0); break;
637  case SectionInfo::Section: endGroupHeader(0); break;
641  default: ASSERT(0); break;
642  }
643  }
644  else
645  {
646  t << "\n";
647  firstCol=TRUE;
649  inHeader=FALSE;
650  }
651 }
652 
654  const char *,const char *title)
655 {
656  if (!firstCol)
657  { t << endl << ".PP" << endl;
659  col=0;
660  }
662  startBold();
663  docify(title);
664  endBold();
665  paragraph=TRUE;
666 }
667 
669 {
670 }
671 
673 {
674  if (!firstCol)
675  { t << endl << ".PP" << endl;
677  col=0;
678  }
680  startBold();
681  docify(title);
682  endBold();
683  paragraph=TRUE;
684 }
685 
687 {
688 }
689 
691 {
692  ManDocVisitor *visitor = new ManDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString(""));
693  n->accept(visitor);
694  delete visitor;
695  firstCol=FALSE;
696  paragraph = FALSE;
697 }
698 
699 void ManGenerator::startConstraintList(const char *header)
700 {
701  if (!firstCol)
702  { t << endl << ".PP" << endl;
704  col=0;
705  }
707  startBold();
708  docify(header);
709  endBold();
710  paragraph=TRUE;
711 }
712 
714 {
716  startEmphasis();
717 }
718 
720 {
721  endEmphasis();
722  endItemListItem();
723  t << " : ";
724 }
725 
727 {
728  startEmphasis();
729 }
730 
732 {
733  endEmphasis();
734 }
735 
737 {
738 }
739 
741 {
742  t << endl; firstCol=TRUE;
743 }
744 
746 {
747 }
748 
749 
751 {
752  if (!firstCol)
753  {
754  t << endl << ".PP" << endl << ".in -1c" << endl;
755  }
756  t << ".RI \"\\fB";
757 }
758 
760 {
761  t << "\\fP\"" << endl << ".in +1c" << endl;
762  firstCol = FALSE;
763 }
764 
766 {
767  if (!firstCol)
768  {
769  t << endl << ".PP" << endl;
770  }
771  t << "\\fB";
773  t << ":\\fP" << endl;
774  t << ".RS 4" << endl;
775 }
776 
778 {
779  if (!firstCol) t << endl;
780  t << ".RE" << endl;
781  t << ".PP" << endl;
782  firstCol=TRUE;
783 }
784 
786 {
787 }
788 
790 {
791  t << " ";
792 }
793 
795 {
796  t << "\\fI";
797 }
798 
800 {
801  t << "\\fP ";
802 }
803 
805 {
806 }
807 
809 {
810  if (!firstCol) t << endl;
811  t << ".br" << endl;
812  t << ".PP" << endl;
813  firstCol=TRUE;
814 }
815 
817 {
818 }
819 
820 void ManGenerator::writeLabel(const char *l,bool isLast)
821 {
822  t << "\\fC [" << l << "]\\fP";
823  if (!isLast) t << ", ";
824 }
825 
827 {
828 }
829 
831 {
832 }
static QCString name
Definition: declinfo.cpp:673
Traverses directory structures and contents in a platform-independent way.
Definition: qdir.h:52
void endParagraph()
Definition: mangen.cpp:222
void endSection(const char *, SectionInfo::SectionType)
Definition: mangen.cpp:630
void endMemberItem()
Definition: mangen.cpp:562
void endPlainFile()
Definition: outputgen.cpp:55
void endMemberGroup(bool)
Definition: mangen.cpp:608
static QCString buildFileName(const char *name)
Definition: mangen.cpp:127
void writeString(const char *text)
Definition: mangen.cpp:226
static void init()
Definition: mangen.cpp:108
void startAnonTypeScope(int)
Definition: mangen.cpp:538
void endConstraintDocs()
Definition: mangen.cpp:740
void endMemberGroupDocs()
Definition: mangen.cpp:598
void endBold()
Definition: mangen.h:140
bool isEmpty() const
Definition: qcstring.h:189
uint length() const
Definition: qcstring.h:195
virtual void setPath(const QString &path)
Definition: qdir.cpp:248
~ManGenerator()
Definition: mangen.cpp:88
#define IO_WriteOnly
Definition: qiodevice.h:62
void startDescForItem()
Definition: mangen.cpp:518
void endHtmlLink()
Definition: mangen.cpp:261
void startParamList(ParamListTypes, const char *title)
Definition: mangen.cpp:672
void endMemberDocSimple()
Definition: mangen.cpp:777
void startConstraintDocs()
Definition: mangen.cpp:736
void endDescItem()
Definition: mangen.cpp:532
void startDescItem()
Definition: mangen.cpp:505
char & at(uint i) const
Definition: qcstring.h:326
void setDevice(QIODevice *)
void startEmphasis()
Definition: mangen.h:137
void newParagraph()
Definition: mangen.cpp:200
void endAnonTypeScope(int)
Definition: mangen.cpp:546
const bool FALSE
Definition: qglobal.h:370
void startMemberList()
Definition: mangen.cpp:567
void startConstraintType()
Definition: mangen.cpp:726
void endIndexItem(const char *ref, const char *file)
Definition: mangen.cpp:235
void startMemberGroup()
Definition: mangen.cpp:603
void startSubsection()
Definition: mangen.cpp:470
void endParamList()
Definition: mangen.cpp:686
void writeLabel(const char *l, bool isLast)
Definition: mangen.cpp:820
QCString left(uint len) const
Definition: qcstring.cpp:213
void startInlineMemberName()
Definition: mangen.cpp:794
void startInlineMemberType()
Definition: mangen.cpp:785
void writeObjectLink(const char *ref, const char *file, const char *anchor, const char *name)
Definition: mangen.cpp:244
Simplified and optimized version of QTextStream.
Definition: ftextstream.h:11
string dir
void endEmphasis()
Definition: mangen.h:138
void startGroupHeader(int)
Definition: mangen.cpp:270
void docify(const char *text)
Definition: mangen.cpp:299
static QStrList * l
Definition: config.cpp:1044
int findRev(char c, int index=-1, bool cs=TRUE) const
Definition: qcstring.cpp:95
static QCString getSubdir()
Definition: mangen.cpp:67
void endMemberHeader()
Definition: mangen.cpp:292
QCString getDefFileExtension() const
void writeChar(char c)
Definition: mangen.cpp:353
void endTitle()
Definition: mangen.cpp:386
#define IO_ReadOnly
Definition: qiodevice.h:61
void endLabels()
Definition: mangen.cpp:826
void codify(const char *text)
Definition: mangen.cpp:323
#define Config_getInt(val)
Definition: config.cpp:661
bool inHeader
Definition: mangen.h:270
void startCodeFragment()
Definition: mangen.cpp:404
void endDescForItem()
Definition: mangen.cpp:528
void writeStartAnnoItem(const char *type, const char *file, const char *path, const char *name)
Definition: mangen.cpp:239
void endSimpleSect()
Definition: mangen.cpp:668
virtual bool mkdir(const QString &dirName, bool acceptAbsPath=TRUE) const
Definition: qdir_unix.cpp:98
void startInlineMemberDoc()
Definition: mangen.cpp:804
void startSimpleSect(SectionTypes, const char *, const char *, const char *)
Definition: mangen.cpp:653
void endInlineMemberDoc()
Definition: mangen.cpp:808
void startPlainFile(const char *name)
Definition: outputgen.cpp:42
void startMemberHeader(const char *)
Definition: mangen.cpp:286
void startItemListItem()
Definition: mangen.cpp:391
void startMemberGroupDocs()
Definition: mangen.cpp:594
void endMemberList()
Definition: mangen.cpp:575
void endConstraintList()
Definition: mangen.cpp:745
void endConstraintType()
Definition: mangen.cpp:731
void startLabels()
Definition: mangen.cpp:816
QCString right(uint len) const
Definition: qcstring.cpp:231
std::void_t< T > n
const char * writeUtf8Char(FTextStream &t, const char *s)
Definition: util.cpp:7165
bool open(int)
Definition: qfile_unix.cpp:134
void startMemberDoc(const char *, const char *, const char *, const char *, bool)
Definition: mangen.cpp:421
void startInlineHeader()
Definition: mangen.cpp:750
void endHeaderSection()
Definition: mangen.cpp:830
void startDoxyAnchor(const char *, const char *, const char *, const char *, const char *)
Definition: mangen.cpp:429
void writeDoc(DocNode *, Definition *, MemberDef *)
Definition: mangen.cpp:690
void startMemberItem(const char *, int, const char *)
Definition: mangen.cpp:555
void endItemListItem()
Definition: mangen.cpp:400
QCString & prepend(const char *s)
Definition: qcstring.cpp:387
p
Definition: test.py:223
void startHtmlLink(const char *url)
Definition: mangen.cpp:257
A bunch of utility functions.
const char * data() const
Definition: qcstring.h:207
void startIndexItem(const char *ref, const char *file)
Definition: mangen.cpp:231
QCString dateToString(bool includeTime)
Definition: util.cpp:2473
#define Config_getString(val)
Definition: config.cpp:660
#define Config_getBool(val)
Definition: config.cpp:664
void startParagraph()
Definition: mangen.cpp:211
void startSection(const char *, const char *, SectionInfo::SectionType)
Definition: mangen.cpp:614
void endCodeFragment()
Definition: mangen.cpp:412
void startBold()
Definition: mangen.h:139
Concrete visitor implementation for LaTeX output.
Definition: mandocvisitor.h:30
void err(const char *fmt,...)
Definition: message.cpp:226
void writeSynopsis()
Definition: mangen.cpp:497
bool firstCol
Definition: mangen.h:265
void endFile()
Definition: mangen.cpp:174
void startConstraintParam()
Definition: mangen.cpp:713
void endSubsubsection()
Definition: mangen.cpp:492
bool insideTabbing
Definition: mangen.h:269
void startSubsubsection()
Definition: mangen.cpp:484
void endTitleHead(const char *, const char *)
Definition: mangen.cpp:180
QCString mid(uint index, uint len=0xffffffff) const
Definition: qcstring.cpp:246
The QFile class is an I/O device that operates on files.
Definition: qfile.h:50
QCString fileName
Definition: outputgen.h:488
QCString dir
Definition: outputgen.h:489
void endInlineHeader()
Definition: mangen.cpp:759
void endGroupHeader(int)
Definition: mangen.cpp:278
void endConstraintParam()
Definition: mangen.cpp:719
FTextStream t
Definition: outputgen.h:486
void startConstraintList(const char *)
Definition: mangen.cpp:699
bool upperCase
Definition: mangen.h:268
void endMemberDoc(bool)
Definition: mangen.cpp:465
void endInlineMemberName()
Definition: mangen.cpp:799
void startFile(const char *name, const char *manName, const char *title)
Definition: mangen.cpp:168
void startDescList(SectionTypes)
Definition: mangen.cpp:367
void startTitle()
Definition: mangen.cpp:378
void writeCodeLink(const char *ref, const char *file, const char *anchor, const char *name, const char *tooltip)
Definition: mangen.cpp:250
void endInlineMemberType()
Definition: mangen.cpp:789
Translator * theTranslator
Definition: language.cpp:157
static QCString getExtension()
Definition: mangen.cpp:34
void startMemberGroupHeader(bool)
Definition: mangen.cpp:583
virtual QCString trCompoundMembers()=0
bool paragraph
Definition: mangen.h:266
void createSubDirs(QDir &d)
Definition: util.cpp:5458
static QCString baseName
Definition: scanner.cpp:10890
static QCString spaces
Definition: doxygen.h:151
void close()
Definition: qfile_unix.cpp:614
void startMemberDocSimple()
Definition: mangen.cpp:765
void endMemberGroupHeader()
Definition: mangen.cpp:588
void endSubsection()
Definition: mangen.cpp:478
virtual void accept(DocVisitor *v)=0
virtual bool exists() const
Definition: qdir.cpp:820
const bool TRUE
Definition: qglobal.h:371
static QCString str
QTextStream & endl(QTextStream &s)
#define ASSERT(x)
Definition: qglobal.h:590
ManGenerator()
Definition: mangen.cpp:77