Blame src/mangen.cpp

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
/* http://www.cubic.org/source/archive/fileform/txt/man/ has some
Packit 1c1d7e
   nice introductions to groff and man pages. */
Packit 1c1d7e
Packit 1c1d7e
#include <stdlib.h>
Packit 1c1d7e
Packit 1c1d7e
#include <qdir.h>
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "mangen.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include <string.h>
Packit 1c1d7e
#include "docparser.h"
Packit 1c1d7e
#include "mandocvisitor.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
Packit 1c1d7e
static QCString getExtension()
Packit 1c1d7e
{
Packit 1c1d7e
  /*
Packit 1c1d7e
   * [.][nuber][rest]
Packit 1c1d7e
   * in case of . missing, just ignore it
Packit 1c1d7e
   * in case number missing, just place a 3 in front of it
Packit 1c1d7e
   */
Packit 1c1d7e
  QCString ext = Config_getString(MAN_EXTENSION);
Packit 1c1d7e
  if (ext.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    ext = "3"; 
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    if (ext.at(0)=='.')
Packit 1c1d7e
    {
Packit 1c1d7e
      if (ext.length()==1)
Packit 1c1d7e
      {
Packit 1c1d7e
        ext = "3"; 
Packit 1c1d7e
      }
Packit 1c1d7e
      else // strip .
Packit 1c1d7e
      {
Packit 1c1d7e
        ext = ext.mid(1);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    if (ext.at(0)<'0' || ext.at(0)>'9')
Packit 1c1d7e
    {
Packit 1c1d7e
      ext.prepend("3");
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return ext;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString getSubdir()
Packit 1c1d7e
{
Packit 1c1d7e
  QCString dir = Config_getString(MAN_SUBDIR);
Packit 1c1d7e
  if (dir.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    dir = "man" + getExtension();
Packit 1c1d7e
  }
Packit 1c1d7e
  return dir;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
ManGenerator::ManGenerator() : OutputGenerator()
Packit 1c1d7e
{
Packit 1c1d7e
  dir=Config_getString(MAN_OUTPUT) + "/" + getSubdir();
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
  paragraph=TRUE;
Packit 1c1d7e
  col=0;
Packit 1c1d7e
  upperCase=FALSE;
Packit 1c1d7e
  insideTabbing=FALSE;
Packit 1c1d7e
  inHeader=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
ManGenerator::~ManGenerator()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//void ManGenerator::append(const OutputGenerator *g)
Packit 1c1d7e
//{
Packit 1c1d7e
//  QCString r=g->getContents();
Packit 1c1d7e
//  if (upperCase)
Packit 1c1d7e
//    t << r.upper();
Packit 1c1d7e
//  else
Packit 1c1d7e
//    t << r;
Packit 1c1d7e
//  if (!r.isEmpty())
Packit 1c1d7e
//    firstCol = r.at(r.length()-1)=='\n';
Packit 1c1d7e
//  else
Packit 1c1d7e
//    firstCol = ((ManGenerator *)g)->firstCol;
Packit 1c1d7e
//  col+=((ManGenerator *)g)->col;
Packit 1c1d7e
//  inHeader=((ManGenerator *)g)->inHeader;
Packit 1c1d7e
//  paragraph=FALSE;
Packit 1c1d7e
//}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::init()
Packit 1c1d7e
{
Packit 1c1d7e
  QCString &manOutput = Config_getString(MAN_OUTPUT);
Packit 1c1d7e
  
Packit 1c1d7e
  QDir d(manOutput);
Packit 1c1d7e
  if (!d.exists() && !d.mkdir(manOutput))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Could not create output directory %s\n",manOutput.data());
Packit 1c1d7e
    exit(1);
Packit 1c1d7e
  }
Packit 1c1d7e
  d.setPath(manOutput + "/" + getSubdir());
Packit 1c1d7e
  if (!d.exists() && !d.mkdir(manOutput + "/" + getSubdir()))
Packit 1c1d7e
  {
Packit 1c1d7e
    err("Could not create output directory %s/%s\n",manOutput.data(), getSubdir().data());
Packit 1c1d7e
    exit(1);
Packit 1c1d7e
  }
Packit 1c1d7e
  createSubDirs(d);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString buildFileName(const char *name)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString fileName;
Packit 1c1d7e
  if (name==0) return "noname";
Packit 1c1d7e
Packit 1c1d7e
  const char *p=name;
Packit 1c1d7e
  char c;
Packit 1c1d7e
  while ((c=*p++))
Packit 1c1d7e
  {
Packit 1c1d7e
    switch (c)
Packit 1c1d7e
    {
Packit 1c1d7e
      case ':':
Packit 1c1d7e
        fileName+="_";
Packit 1c1d7e
        if (*p==':') p++;
Packit 1c1d7e
        break;
Packit 1c1d7e
      case '<':
Packit 1c1d7e
      case '>':
Packit 1c1d7e
      case '&':
Packit 1c1d7e
      case '*':
Packit 1c1d7e
      case '!':
Packit 1c1d7e
      case '^':
Packit 1c1d7e
      case '~':
Packit 1c1d7e
      case '%':
Packit 1c1d7e
      case '+':
Packit 1c1d7e
      case '/':
Packit 1c1d7e
        fileName+="_";
Packit 1c1d7e
        break;
Packit 1c1d7e
      default:
Packit 1c1d7e
        fileName+=c;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  QCString manExtension = "." + getExtension();
Packit 1c1d7e
  if (fileName.right(manExtension.length())!=manExtension) 
Packit 1c1d7e
  {
Packit 1c1d7e
    fileName+=manExtension;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  return fileName;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startFile(const char *,const char *manName,const char *)
Packit 1c1d7e
{
Packit 1c1d7e
  startPlainFile( buildFileName( manName ) );
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endFile()
Packit 1c1d7e
{
Packit 1c1d7e
  t << endl;
Packit 1c1d7e
  endPlainFile();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endTitleHead(const char *,const char *name)
Packit 1c1d7e
{
Packit 1c1d7e
  t << ".TH \"" << name << "\" " << getExtension() << " \"" 
Packit 1c1d7e
    << dateToString(FALSE) << "\" \"";
Packit 1c1d7e
  if (!Config_getString(PROJECT_NUMBER).isEmpty())
Packit 1c1d7e
    t << "Version " << Config_getString(PROJECT_NUMBER) << "\" \"";
Packit 1c1d7e
  if (Config_getString(PROJECT_NAME).isEmpty()) 
Packit 1c1d7e
    t << "Doxygen";
Packit 1c1d7e
  else
Packit 1c1d7e
    t << Config_getString(PROJECT_NAME);
Packit 1c1d7e
  t << "\" \\\" -*- nroff -*-" << endl;
Packit 1c1d7e
  t << ".ad l" << endl;
Packit 1c1d7e
  t << ".nh" << endl;
Packit 1c1d7e
  t << ".SH NAME" << endl;
Packit 1c1d7e
  t << name;
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
  paragraph=TRUE;
Packit 1c1d7e
  inHeader=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::newParagraph()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!paragraph)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!firstCol) t << endl;
Packit 1c1d7e
    t << ".PP" << endl;
Packit 1c1d7e
    firstCol=TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  paragraph=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startParagraph(const char *)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!paragraph)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!firstCol) t << endl;
Packit 1c1d7e
    t << ".PP" << endl;
Packit 1c1d7e
    firstCol=TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  paragraph=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endParagraph()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::writeString(const char *text)
Packit 1c1d7e
{
Packit 1c1d7e
  docify(text);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startIndexItem(const char *,const char *)
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endIndexItem(const char *,const char *)
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::writeStartAnnoItem(const char *,const char *,
Packit 1c1d7e
                                       const char *,const char *)
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::writeObjectLink(const char *,const char *,
Packit 1c1d7e
                                    const char *, const char *name)
Packit 1c1d7e
{
Packit 1c1d7e
  startBold(); docify(name); endBold();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::writeCodeLink(const char *,const char *,
Packit 1c1d7e
                                 const char *, const char *name,
Packit 1c1d7e
                                 const char *)
Packit 1c1d7e
{
Packit 1c1d7e
  docify(name);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startHtmlLink(const char *)
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endHtmlLink()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//void ManGenerator::writeMailLink(const char *url)
Packit 1c1d7e
//{
Packit 1c1d7e
//  docify(url);
Packit 1c1d7e
//}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startGroupHeader(int)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".SH \"";
Packit 1c1d7e
  upperCase=TRUE;
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endGroupHeader(int)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\"\n.PP " << endl;
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
  paragraph=TRUE;
Packit 1c1d7e
  upperCase=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startMemberHeader(const char *)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".SS \"";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endMemberHeader()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\"\n";
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::docify(const char *str)
Packit 1c1d7e
{
Packit 1c1d7e
  if (str)
Packit 1c1d7e
  {
Packit 1c1d7e
    const char *p=str;
Packit 1c1d7e
    char c=0;
Packit 1c1d7e
    while ((c=*p++)) 
Packit 1c1d7e
    {
Packit 1c1d7e
      switch(c)
Packit 1c1d7e
      {
Packit 1c1d7e
        case '-':  t << "\\-"; break; // see  bug747780
Packit 1c1d7e
        case '.':  t << "\\&.;; break; // see  bug652277
Packit 1c1d7e
        case '\\': t << "\\\\"; col++; break;
Packit 1c1d7e
        case '\n': t << "\n"; col=0; break;
Packit 1c1d7e
        case '\"':  c = '\''; // no break!
Packit 1c1d7e
        default: t << c; col++; break;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    firstCol=(c=='\n');
Packit 1c1d7e
    //printf("%s",str);fflush(stdout);
Packit 1c1d7e
  }
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::codify(const char *str)
Packit 1c1d7e
{
Packit 1c1d7e
  //static char spaces[]="        ";
Packit 1c1d7e
  if (str)
Packit 1c1d7e
  {
Packit 1c1d7e
    const char *p=str;
Packit 1c1d7e
    char c;
Packit 1c1d7e
    int spacesToNextTabStop;
Packit 1c1d7e
    while (*p)
Packit 1c1d7e
    {
Packit 1c1d7e
      c=*p++;
Packit 1c1d7e
      switch(c)
Packit 1c1d7e
      {
Packit 1c1d7e
        case '.':   t << "\\&.;; break; // see  bug652277
Packit 1c1d7e
        case '\t':  spacesToNextTabStop =
Packit 1c1d7e
                          Config_getInt(TAB_SIZE) - (col%Config_getInt(TAB_SIZE));
Packit 1c1d7e
                    t << Doxygen::spaces.left(spacesToNextTabStop); 
Packit 1c1d7e
                    col+=spacesToNextTabStop; 
Packit 1c1d7e
                    break;
Packit 1c1d7e
        case '\n':  t << "\n"; firstCol=TRUE; col=0; break;
Packit 1c1d7e
        case '\\':  t << "\\"; col++; break;
Packit 1c1d7e
        case '\"':  // no break!
Packit 1c1d7e
        default:    p=writeUtf8Char(t,p-1); firstCol=FALSE; col++; break;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    //printf("%s",str);fflush(stdout);
Packit 1c1d7e
  }
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::writeChar(char c)
Packit 1c1d7e
{
Packit 1c1d7e
  firstCol=(c=='\n');
Packit 1c1d7e
  if (firstCol) col=0; else col++;
Packit 1c1d7e
  switch (c)
Packit 1c1d7e
  {
Packit 1c1d7e
    case '\\': t << "\\\\"; break;
Packit 1c1d7e
  case '\"': c = '\''; // no break!
Packit 1c1d7e
    default:   t << c; break;
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("%c",c);fflush(stdout);
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startDescList(SectionTypes)      
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) 
Packit 1c1d7e
  { t << endl << ".PP" << endl; 
Packit 1c1d7e
    firstCol=TRUE; paragraph=TRUE; 
Packit 1c1d7e
    col=0;
Packit 1c1d7e
  }
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
  startBold();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startTitle() 
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!firstCol) t << endl; 
Packit 1c1d7e
  t << ".SH \""; 
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endTitle()
Packit 1c1d7e
{
Packit 1c1d7e
    t << "\"";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startItemListItem() 
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!firstCol) t << endl; 
Packit 1c1d7e
  t << ".TP" << endl; 
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
  col=0;
Packit 1c1d7e
} 
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endItemListItem()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startCodeFragment() 
Packit 1c1d7e
{ 
Packit 1c1d7e
  newParagraph();
Packit 1c1d7e
  t << ".nf" << endl; 
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endCodeFragment()   
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".fi" << endl; 
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
  col=0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *,int,int,bool) 
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".SS \""; 
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startDoxyAnchor(const char *,const char *manName,
Packit 1c1d7e
                                   const char *, const char *name,
Packit 1c1d7e
                                   const char *)
Packit 1c1d7e
{
Packit 1c1d7e
    // something to be done?
Packit 1c1d7e
    if( !Config_getBool(MAN_LINKS) ) 
Packit 1c1d7e
    {
Packit 1c1d7e
	return; // no
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    // the name of the link file is derived from the name of the anchor:
Packit 1c1d7e
    // - truncate after an (optional) ::
Packit 1c1d7e
    QCString baseName = name;
Packit 1c1d7e
    int i=baseName.findRev("::");
Packit 1c1d7e
    if (i!=-1) baseName=baseName.right(baseName.length()-i-2);
Packit 1c1d7e
Packit 1c1d7e
    //printf("Converting man link '%s'->'%s'->'%s'\n",
Packit 1c1d7e
    //       name,baseName.data(),buildFileName(baseName).data());
Packit 1c1d7e
    
Packit 1c1d7e
    // - remove dangerous characters and append suffix, then add dir prefix
Packit 1c1d7e
    QCString fileName=dir+"/"+buildFileName( baseName );
Packit 1c1d7e
    QFile linkfile( fileName );
Packit 1c1d7e
    // - only create file if it doesn't exist already
Packit 1c1d7e
    if ( !linkfile.open( IO_ReadOnly ) ) 
Packit 1c1d7e
    {
Packit 1c1d7e
	if ( linkfile.open( IO_WriteOnly ) ) 
Packit 1c1d7e
        {
Packit 1c1d7e
	      FTextStream linkstream;
Packit 1c1d7e
	      linkstream.setDevice(&linkfile);
Packit 1c1d7e
	      //linkstream.setEncoding(QTextStream::UnicodeUTF8);
Packit 1c1d7e
	      linkstream << ".so " << getSubdir() << "/" << buildFileName( manName ) << endl;
Packit 1c1d7e
	}
Packit 1c1d7e
    }
Packit 1c1d7e
    linkfile.close();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endMemberDoc(bool)
Packit 1c1d7e
{
Packit 1c1d7e
    t << "\"\n";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startSubsection()    
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".SS \""; 
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endSubsection()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\"";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startSubsubsection() 
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << "\n.SS \""; 
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endSubsubsection()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\"";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::writeSynopsis()      
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".SH SYNOPSIS\n.br\n.PP\n"; 
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startDescItem()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".IP \"";
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//void ManGenerator::endDescTitle()
Packit 1c1d7e
//{
Packit 1c1d7e
//  endBold();
Packit 1c1d7e
//  paragraph=TRUE;
Packit 1c1d7e
//}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startDescForItem()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  if (!paragraph) t << ".in -1c" << endl;
Packit 1c1d7e
  t << ".in +1c" << endl;
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
  col=0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endDescForItem()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endDescItem()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\" 1c" << endl;
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startAnonTypeScope(int indentLevel)
Packit 1c1d7e
{
Packit 1c1d7e
  if (indentLevel==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    insideTabbing=TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endAnonTypeScope(int indentLevel)
Packit 1c1d7e
{
Packit 1c1d7e
  if (indentLevel==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    insideTabbing=FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startMemberItem(const char *,int,const char *) 
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (firstCol && !insideTabbing) t << ".in +1c\n";
Packit 1c1d7e
  t << "\n.ti -1c\n.RI \""; 
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endMemberItem() 
Packit 1c1d7e
{ 
Packit 1c1d7e
  t << "\"\n.br"; 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startMemberList() 
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!insideTabbing)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "\n.in +1c"; firstCol=FALSE; 
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endMemberList() 
Packit 1c1d7e
{ 
Packit 1c1d7e
  if (!insideTabbing)
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "\n.in -1c"; firstCol=FALSE; 
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startMemberGroupHeader(bool)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\n.PP\n.RI \"\\fB";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endMemberGroupHeader()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\\fP\"\n.br\n";
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startMemberGroupDocs()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endMemberGroupDocs()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\n.PP";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startMemberGroup()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\n.in +1c";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endMemberGroup(bool)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\n.in -1c";
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startSection(const char *,const char *,SectionInfo::SectionType type)
Packit 1c1d7e
{
Packit 1c1d7e
  if( !inHeader ) 
Packit 1c1d7e
  {
Packit 1c1d7e
    switch(type)
Packit 1c1d7e
    {
Packit 1c1d7e
      case SectionInfo::Page:          startGroupHeader(FALSE); break;
Packit 1c1d7e
      case SectionInfo::Section:       startGroupHeader(FALSE); break;
Packit 1c1d7e
      case SectionInfo::Subsection:    startMemberHeader(0); break;
Packit 1c1d7e
      case SectionInfo::Subsubsection: startMemberHeader(0); break;
Packit 1c1d7e
      case SectionInfo::Paragraph:     startMemberHeader(0); break;
Packit 1c1d7e
      default: ASSERT(0); break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endSection(const char *,SectionInfo::SectionType type)
Packit 1c1d7e
{
Packit 1c1d7e
  if( !inHeader )
Packit 1c1d7e
  {
Packit 1c1d7e
    switch(type)
Packit 1c1d7e
    {
Packit 1c1d7e
      case SectionInfo::Page:          endGroupHeader(0); break;
Packit 1c1d7e
      case SectionInfo::Section:       endGroupHeader(0); break;
Packit 1c1d7e
      case SectionInfo::Subsection:    endMemberHeader(); break;
Packit 1c1d7e
      case SectionInfo::Subsubsection: endMemberHeader(); break;
Packit 1c1d7e
      case SectionInfo::Paragraph:     endMemberHeader(); break;
Packit 1c1d7e
      default: ASSERT(0); break;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    t << "\n";
Packit 1c1d7e
    firstCol=TRUE;
Packit 1c1d7e
    paragraph=FALSE;
Packit 1c1d7e
    inHeader=FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startSimpleSect(SectionTypes,const char *,
Packit 1c1d7e
                                   const char *,const char *title)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) 
Packit 1c1d7e
  { t << endl << ".PP" << endl; 
Packit 1c1d7e
    firstCol=TRUE; paragraph=TRUE; 
Packit 1c1d7e
    col=0;
Packit 1c1d7e
  }
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
  startBold();
Packit 1c1d7e
  docify(title);
Packit 1c1d7e
  endBold();
Packit 1c1d7e
  paragraph=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endSimpleSect()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startParamList(ParamListTypes,const char *title)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) 
Packit 1c1d7e
  { t << endl << ".PP" << endl; 
Packit 1c1d7e
    firstCol=TRUE; paragraph=TRUE; 
Packit 1c1d7e
    col=0;
Packit 1c1d7e
  }
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
  startBold();
Packit 1c1d7e
  docify(title);
Packit 1c1d7e
  endBold();
Packit 1c1d7e
  paragraph=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endParamList()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::writeDoc(DocNode *n,Definition *ctx,MemberDef *)
Packit 1c1d7e
{
Packit 1c1d7e
  ManDocVisitor *visitor = new ManDocVisitor(t,*this,ctx?ctx->getDefFileExtension():QCString(""));
Packit 1c1d7e
  n->accept(visitor);
Packit 1c1d7e
  delete visitor; 
Packit 1c1d7e
  firstCol=FALSE;
Packit 1c1d7e
  paragraph = FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startConstraintList(const char *header)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) 
Packit 1c1d7e
  { t << endl << ".PP" << endl; 
Packit 1c1d7e
    firstCol=TRUE; paragraph=TRUE; 
Packit 1c1d7e
    col=0;
Packit 1c1d7e
  }
Packit 1c1d7e
  paragraph=FALSE;
Packit 1c1d7e
  startBold();
Packit 1c1d7e
  docify(header);
Packit 1c1d7e
  endBold();
Packit 1c1d7e
  paragraph=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startConstraintParam()
Packit 1c1d7e
{
Packit 1c1d7e
  startItemListItem();
Packit 1c1d7e
  startEmphasis();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endConstraintParam()
Packit 1c1d7e
{
Packit 1c1d7e
  endEmphasis();
Packit 1c1d7e
  endItemListItem();
Packit 1c1d7e
  t << " : ";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startConstraintType()
Packit 1c1d7e
{
Packit 1c1d7e
  startEmphasis();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endConstraintType()
Packit 1c1d7e
{
Packit 1c1d7e
  endEmphasis();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startConstraintDocs()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endConstraintDocs()
Packit 1c1d7e
{
Packit 1c1d7e
  t << endl; firstCol=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endConstraintList()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startInlineHeader() 
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << endl << ".PP" << endl << ".in -1c" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << ".RI \"\\fB"; 
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endInlineHeader() 
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\\fP\"" << endl << ".in +1c" << endl;
Packit 1c1d7e
  firstCol = FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startMemberDocSimple(bool isEnum)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) 
Packit 1c1d7e
  {
Packit 1c1d7e
    t << endl << ".PP" << endl;
Packit 1c1d7e
  }
Packit 1c1d7e
  t << "\\fB";
Packit 1c1d7e
  if (isEnum)
Packit 1c1d7e
  {
Packit 1c1d7e
    docify(theTranslator->trEnumerationValues());
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    docify(theTranslator->trCompoundMembers());
Packit 1c1d7e
  }
Packit 1c1d7e
  t << ":\\fP" << endl;
Packit 1c1d7e
  t << ".RS 4" << endl;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endMemberDocSimple(bool)
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".RE" << endl;
Packit 1c1d7e
  t << ".PP" << endl;
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startInlineMemberType()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endInlineMemberType()
Packit 1c1d7e
{
Packit 1c1d7e
  t << " ";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startInlineMemberName()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\\fI";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endInlineMemberName()
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\\fP ";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startInlineMemberDoc()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endInlineMemberDoc()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!firstCol) t << endl;
Packit 1c1d7e
  t << ".br" << endl;
Packit 1c1d7e
  t << ".PP" << endl;
Packit 1c1d7e
  firstCol=TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::startLabels()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::writeLabel(const char *l,bool isLast)
Packit 1c1d7e
{
Packit 1c1d7e
  t << "\\fC [" << l << "]\\fP";
Packit 1c1d7e
  if (!isLast) t << ", ";
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endLabels()
Packit 1c1d7e
{
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void ManGenerator::endHeaderSection()
Packit 1c1d7e
{
Packit 1c1d7e
}