Blame src/vhdlcode.l

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
 * Parser for syntax highlighting and references for vhdl subset
Packit 1c1d7e
 * written by M. Kreis
Packit 1c1d7e
 * supports VHDL-87/93/2008
Packit 1c1d7e
 ******************************************************************************/
Packit 1c1d7e
%option never-interactive
Packit 1c1d7e
%option case-insensitive
Packit 1c1d7e
%option prefix="vhdlcodeYY"
Packit 1c1d7e
Packit 1c1d7e
%{
Packit 1c1d7e
Packit 1c1d7e
/*
Packit 1c1d7e
 *        includes
Packit 1c1d7e
 */
Packit 1c1d7e
#include <stdio.h>
Packit 1c1d7e
#include <assert.h>
Packit 1c1d7e
#include <ctype.h>
Packit 1c1d7e
#include <qregexp.h>
Packit 1c1d7e
#include <qdir.h>
Packit 1c1d7e
#include <qstringlist.h>
Packit 1c1d7e
Packit 1c1d7e
#include "entry.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "outputlist.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "membername.h"
Packit 1c1d7e
#include "searchindex.h"
Packit 1c1d7e
#include "vhdldocgen.h"
Packit 1c1d7e
#include "arguments.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "classdef.h"
Packit 1c1d7e
#include "filedef.h"
Packit 1c1d7e
#include "tooltip.h"
Packit 1c1d7e
Packit 1c1d7e
#define YY_NO_INPUT 1
Packit 1c1d7e
#define YY_NO_UNISTD_H 1
Packit 1c1d7e
  
Packit 1c1d7e
// Toggle for some debugging info
Packit 1c1d7e
//#define DBG_CTX(x) fprintf x
Packit 1c1d7e
#define DBG_CTX(x) do { } while(0)
Packit 1c1d7e
  
Packit 1c1d7e
Packit 1c1d7e
/* -----------------------------------------------------------------
Packit 1c1d7e
 *        statics
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
// ----------------- <vhdl> ----------------------------------
Packit 1c1d7e
Packit 1c1d7e
//static bool isPackBody=FALSE;
Packit 1c1d7e
//static bool isStartMap;
Packit 1c1d7e
static bool isFuncProto=FALSE;
Packit 1c1d7e
static bool isComponent=FALSE;
Packit 1c1d7e
static bool isPackageBody=FALSE;
Packit 1c1d7e
static bool isProto = FALSE;
Packit 1c1d7e
static bool       g_startCode = FALSE;
Packit 1c1d7e
static QCString   g_PrevString;
Packit 1c1d7e
static QCString   g_CurrClass;
Packit 1c1d7e
static QDict<QCString>g_vhdlKeyDict;   
Packit 1c1d7e
static QCString   g_tempComp;
Packit 1c1d7e
static QCString   g_PortMapComp;
Packit 1c1d7e
static MemberDef *g_vhdlMember;
Packit 1c1d7e
static QCString   g_FuncProto;
Packit 1c1d7e
Packit 1c1d7e
//-----------------------------------------------------------
Packit 1c1d7e
  
Packit 1c1d7e
static CodeOutputInterface * g_code;
Packit 1c1d7e
static QCString      g_parmType;
Packit 1c1d7e
static QCString      g_parmName;
Packit 1c1d7e
static const char *  g_inputString;     //!< the code fragment as text
Packit 1c1d7e
static int           g_inputPosition;   //!< read offset during parsing 
Packit 1c1d7e
static int           g_inputLines;      //!< number of line in the code fragment
Packit 1c1d7e
static int           g_yyLineNr;        //!< current line number
Packit 1c1d7e
static bool          g_needsTermination;
Packit 1c1d7e
static Definition   *g_searchCtx;
Packit 1c1d7e
Packit 1c1d7e
static bool          g_exampleBlock;
Packit 1c1d7e
static QCString      g_exampleName;
Packit 1c1d7e
static QCString      g_exampleFile;
Packit 1c1d7e
Packit 1c1d7e
static QCString      g_classScope;
Packit 1c1d7e
   
Packit 1c1d7e
static QCString      g_CurrScope;
Packit 1c1d7e
   
Packit 1c1d7e
static FileDef *     g_sourceFileDef;
Packit 1c1d7e
static Definition *  g_currentDefinition;
Packit 1c1d7e
static MemberDef *   g_currentMemberDef;
Packit 1c1d7e
static bool          g_includeCodeFragment;
Packit 1c1d7e
static const char *  g_currentFontClass;
Packit 1c1d7e
Packit 1c1d7e
static bool          g_lexInit = FALSE;
Packit 1c1d7e
static int           g_braceCount=0;
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void writeFont(const char *s,const char* text);
Packit 1c1d7e
static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName);
Packit 1c1d7e
static bool writeColoredWord(QCString& word );
Packit 1c1d7e
static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool typeOnly=FALSE);
Packit 1c1d7e
static void endFontClass();
Packit 1c1d7e
static void startFontClass(const char *s);
Packit 1c1d7e
//-------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void setCurrentDoc(const QCString &anchor)
Packit 1c1d7e
{
Packit 1c1d7e
  if (Doxygen::searchIndex)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (g_searchCtx)
Packit 1c1d7e
    {
Packit 1c1d7e
      Doxygen::searchIndex->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      Doxygen::searchIndex->setCurrentDoc(g_sourceFileDef,anchor,TRUE);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static bool checkVhdlString(QCString &name)
Packit 1c1d7e
{
Packit 1c1d7e
  if (name.isEmpty()) return FALSE;
Packit 1c1d7e
  static QRegExp regg("[\\s\"]");
Packit 1c1d7e
Packit 1c1d7e
  int len=name.length();
Packit 1c1d7e
  if (name.at(0)=='"' && name.at(len-1)=='"' && len > 2)
Packit 1c1d7e
  {
Packit 1c1d7e
    QStringList qrl=QStringList::split(regg,name,FALSE);
Packit 1c1d7e
    if (VhdlDocGen::isNumber(qrl[0].utf8()))
Packit 1c1d7e
    {
Packit 1c1d7e
      g_code->codify("\""); 
Packit 1c1d7e
      startFontClass("vhdllogic");
Packit 1c1d7e
      QCString mid=name.mid(1,len-2); //" 1223 "
Packit 1c1d7e
      g_code->codify(mid.data());
Packit 1c1d7e
      endFontClass();
Packit 1c1d7e
      g_code->codify("\""); 
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      startFontClass("keyword");
Packit 1c1d7e
      g_code->codify(name.data());
Packit 1c1d7e
      endFontClass();
Packit 1c1d7e
    }
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (VhdlDocGen::isNumber(name))
Packit 1c1d7e
  {
Packit 1c1d7e
    startFontClass("vhdllogic");
Packit 1c1d7e
    g_code->codify(name.data());
Packit 1c1d7e
    endFontClass();
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void addToSearchIndex(const char *text)
Packit 1c1d7e
{
Packit 1c1d7e
  if (Doxygen::searchIndex)
Packit 1c1d7e
  {
Packit 1c1d7e
    Doxygen::searchIndex->addWord(text,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*! start a new line of code, inserting a line number if g_sourceFileDef
Packit 1c1d7e
 * is TRUE. If a definition starts at the current line, then the line
Packit 1c1d7e
 * number is linked to the documentation of that definition.
Packit 1c1d7e
 */
Packit 1c1d7e
static void startCodeLine()
Packit 1c1d7e
{
Packit 1c1d7e
  //if (g_currentFontClass) { g_code->endFontClass(); }
Packit 1c1d7e
  if (g_sourceFileDef)
Packit 1c1d7e
  {
Packit 1c1d7e
    //QCString lineNumber,lineAnchor;
Packit 1c1d7e
    //lineNumber.sprintf("%05d",g_yyLineNr);
Packit 1c1d7e
    //lineAnchor.sprintf("l%05d",g_yyLineNr);
Packit 1c1d7e
    //  if ((g_yyLineNr % 500) == 0) 
Packit 1c1d7e
    //         fprintf(stderr,"\n starting Line %d:",g_yyLineNr);
Packit 1c1d7e
    Definition *d   = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
Packit 1c1d7e
    //printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>");
Packit 1c1d7e
    if (!g_includeCodeFragment && d)
Packit 1c1d7e
    {
Packit 1c1d7e
      g_currentDefinition = d;
Packit 1c1d7e
      g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
Packit 1c1d7e
      if (!g_tempComp.isEmpty() && g_currentMemberDef )
Packit 1c1d7e
      {
Packit 1c1d7e
        //ClassDef *cf=VhdlDocGen::getClass(g_tempComp.data());
Packit 1c1d7e
        QCString nn=g_currentMemberDef->name();
Packit 1c1d7e
        MemberDef* mdeff=VhdlDocGen::findMember(g_tempComp,nn);
Packit 1c1d7e
        if (mdeff)
Packit 1c1d7e
        {
Packit 1c1d7e
          g_currentMemberDef=mdeff;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
Packit 1c1d7e
      g_parmType.resize(0);
Packit 1c1d7e
      g_parmName.resize(0);
Packit 1c1d7e
      QCString lineAnchor;
Packit 1c1d7e
      lineAnchor.sprintf("l%05d",g_yyLineNr);
Packit 1c1d7e
      if (g_currentMemberDef)
Packit 1c1d7e
      {
Packit 1c1d7e
        g_code->writeLineNumber(g_currentMemberDef->getReference(),
Packit 1c1d7e
                                g_currentMemberDef->getOutputFileBase(),
Packit 1c1d7e
                                g_currentMemberDef->anchor(),g_yyLineNr);
Packit 1c1d7e
        setCurrentDoc(lineAnchor);
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (d->isLinkableInProject())
Packit 1c1d7e
      {
Packit 1c1d7e
        g_code->writeLineNumber(d->getReference(),
Packit 1c1d7e
                                d->getOutputFileBase(),
Packit 1c1d7e
                                0,g_yyLineNr);
Packit 1c1d7e
        setCurrentDoc(lineAnchor);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      g_code->writeLineNumber(0,0,0,g_yyLineNr);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  g_code->startCodeLine(g_sourceFileDef); 
Packit 1c1d7e
  g_startCode=TRUE;
Packit 1c1d7e
  if (g_currentFontClass)
Packit 1c1d7e
  {
Packit 1c1d7e
    g_code->startFontClass(g_currentFontClass);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void endCodeLine()
Packit 1c1d7e
{
Packit 1c1d7e
  endFontClass();
Packit 1c1d7e
  g_code->endCodeLine();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void nextCodeLine()
Packit 1c1d7e
{
Packit 1c1d7e
  if (g_startCode)
Packit 1c1d7e
  {
Packit 1c1d7e
    endCodeLine();    // 
Packit 1c1d7e
  }
Packit 1c1d7e
  const char *fc = g_currentFontClass;
Packit 1c1d7e
  if (g_yyLineNr
Packit 1c1d7e
  {
Packit 1c1d7e
    g_currentFontClass = fc;
Packit 1c1d7e
    startCodeLine();  //
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*! writes a word to the output.
Packit 1c1d7e
 *  If curr_class is defined, the word belongs to a class
Packit 1c1d7e
 *  and will be linked.
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
static void writeWord(const char *word,const char* curr_class=0,bool classLink=FALSE)
Packit 1c1d7e
{
Packit 1c1d7e
  bool found=FALSE;
Packit 1c1d7e
  QCString temp; 
Packit 1c1d7e
  QCString tclass(curr_class);
Packit 1c1d7e
  QCString ttt(word);
Packit 1c1d7e
  if (ttt.isEmpty()) return;
Packit 1c1d7e
  for (unsigned int j=0;j
Packit 1c1d7e
  {
Packit 1c1d7e
    char c=ttt.at(j);
Packit 1c1d7e
    if (c==' '|| c==',' || c==';' || c==':' || c=='(' || c==')' || c=='\r' || c=='\t' || c=='.')
Packit 1c1d7e
    {
Packit 1c1d7e
      if (found)
Packit 1c1d7e
      {
Packit 1c1d7e
        if (!writeColoredWord(temp)) // is it a keyword ?
Packit 1c1d7e
        {
Packit 1c1d7e
          //if (VhdlDocGen::findKeyWord(temp))
Packit 1c1d7e
          // writeFont("vhdlkeyword",temp.data());
Packit 1c1d7e
	  //printf("writeWord: %s\n",temp.data());
Packit 1c1d7e
          if (!tclass.isEmpty())
Packit 1c1d7e
          {
Packit 1c1d7e
            if (!classLink)
Packit 1c1d7e
	    {
Packit 1c1d7e
              generateMemLink(*g_code,tclass,temp);
Packit 1c1d7e
	    }
Packit 1c1d7e
            else
Packit 1c1d7e
            {
Packit 1c1d7e
              generateClassOrGlobalLink(*g_code,temp);
Packit 1c1d7e
            }
Packit 1c1d7e
          }
Packit 1c1d7e
          else                                                                          
Packit 1c1d7e
	  {
Packit 1c1d7e
          if (!checkVhdlString(temp))
Packit 1c1d7e
            g_code->codify(temp.data());
Packit 1c1d7e
	  }
Packit 1c1d7e
        }
Packit 1c1d7e
        temp.resize(0);
Packit 1c1d7e
        found=FALSE;
Packit 1c1d7e
      }
Packit 1c1d7e
Packit 1c1d7e
      char cc[2];
Packit 1c1d7e
      cc[0]=c;
Packit 1c1d7e
      cc[1]=0;
Packit 1c1d7e
      g_code->codify(cc);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      found=TRUE;
Packit 1c1d7e
      temp+=c;
Packit 1c1d7e
    }
Packit 1c1d7e
  } // for
Packit 1c1d7e
Packit 1c1d7e
  if (!temp.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!writeColoredWord(temp))
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!tclass.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        if (!classLink)
Packit 1c1d7e
        {
Packit 1c1d7e
          generateMemLink(*g_code,tclass,temp); // generateMemLink(*g_code,g_CurrClass,left); 
Packit 1c1d7e
        }
Packit 1c1d7e
        else
Packit 1c1d7e
        {
Packit 1c1d7e
          generateClassOrGlobalLink(*g_code,temp);
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      else                 
Packit 1c1d7e
      {
Packit 1c1d7e
         QCString qc(temp.data());
Packit 1c1d7e
         if (VhdlDocGen::isNumber(qc)){
Packit 1c1d7e
                         startFontClass("vhdllogic");
Packit 1c1d7e
                         g_code->codify(temp.data());
Packit 1c1d7e
                         endFontClass();
Packit 1c1d7e
                              }
Packit 1c1d7e
         else     
Packit 1c1d7e
        g_code->codify(temp.data());
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}// writeWord
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*! write a code fragment `text' that may span multiple lines, inserting
Packit 1c1d7e
 * line numbers for each line.
Packit 1c1d7e
 */
Packit 1c1d7e
static void codifyLines(const char *text,const char *cl=0,bool classlink=FALSE,bool comment=FALSE)
Packit 1c1d7e
{
Packit 1c1d7e
  if (text==0) return;
Packit 1c1d7e
  //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
Packit 1c1d7e
  const char *p=text,*sp=p;
Packit 1c1d7e
  char c;
Packit 1c1d7e
  bool done=FALSE;
Packit 1c1d7e
  while (!done)
Packit 1c1d7e
  {
Packit 1c1d7e
    sp=p;
Packit 1c1d7e
    while ((c=*p++) && c!='\n') {}
Packit 1c1d7e
    if (c=='\n')
Packit 1c1d7e
    {
Packit 1c1d7e
      g_yyLineNr++;
Packit 1c1d7e
      QCString line = sp;
Packit 1c1d7e
      line = line.left((int)(p-sp)-1);
Packit 1c1d7e
      //*(p-1)='\0';
Packit 1c1d7e
      //g_code->codify(sp);
Packit 1c1d7e
      if (comment)
Packit 1c1d7e
      {
Packit 1c1d7e
        writeFont("keyword",line.data());
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        writeWord(line,cl,classlink);
Packit 1c1d7e
      }
Packit 1c1d7e
      nextCodeLine();
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      if (comment)
Packit 1c1d7e
        writeFont("keyword",sp);
Packit 1c1d7e
      else
Packit 1c1d7e
      writeWord(sp,cl,classlink);
Packit 1c1d7e
      done=TRUE;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*! writes a link to a fragment \a text that may span multiple lines, inserting
Packit 1c1d7e
 * line numbers for each line. If \a text contains newlines, the link will be 
Packit 1c1d7e
 * split into multiple links with the same destination, one for each line.
Packit 1c1d7e
 */
Packit 1c1d7e
static void writeMultiLineCodeLink(CodeOutputInterface &ol,
Packit 1c1d7e
                  Definition *d,
Packit 1c1d7e
                  const char *text)
Packit 1c1d7e
{
Packit 1c1d7e
  static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
Packit 1c1d7e
  TooltipManager::instance()->addTooltip(d);
Packit 1c1d7e
  QCString ref  = d->getReference();
Packit 1c1d7e
  QCString file = d->getOutputFileBase();
Packit 1c1d7e
  QCString anchor = d->anchor();
Packit 1c1d7e
  QCString tooltip; 
Packit 1c1d7e
  if (!sourceTooltips) // fall back to simple "title" tooltips
Packit 1c1d7e
  {
Packit 1c1d7e
    tooltip = d->briefDescriptionAsTooltip();
Packit 1c1d7e
  }
Packit 1c1d7e
  bool done=FALSE;
Packit 1c1d7e
  char *p=(char *)text;
Packit 1c1d7e
  while (!done)
Packit 1c1d7e
  {
Packit 1c1d7e
    char *sp=p;
Packit 1c1d7e
    char c;
Packit 1c1d7e
    while ((c=*p++) && c!='\n') {}
Packit 1c1d7e
    if (c=='\n')
Packit 1c1d7e
    {
Packit 1c1d7e
      g_yyLineNr++;
Packit 1c1d7e
      *(p-1)='\0';
Packit 1c1d7e
      // printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
Packit 1c1d7e
      ol.writeCodeLink(ref,file,anchor,sp,tooltip);
Packit 1c1d7e
      nextCodeLine();
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.writeCodeLink(ref,file,anchor,sp,tooltip);
Packit 1c1d7e
      done=TRUE;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void setParameterList(MemberDef *md)
Packit 1c1d7e
{
Packit 1c1d7e
  g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
Packit 1c1d7e
  ArgumentList *al = md->argumentList();
Packit 1c1d7e
  if (al==0) return;
Packit 1c1d7e
  ArgumentListIterator ali(*al);
Packit 1c1d7e
  Argument *a;
Packit 1c1d7e
  for (ali.toFirst();(a=ali.current());++ali)
Packit 1c1d7e
  {
Packit 1c1d7e
    g_parmName = a->name.copy();
Packit 1c1d7e
    g_parmType = a->type.copy();
Packit 1c1d7e
    int i = g_parmType.find('*');
Packit 1c1d7e
    if (i!=-1) g_parmType = g_parmType.left(i);
Packit 1c1d7e
    i = g_parmType.find('&';;
Packit 1c1d7e
    if (i!=-1) g_parmType = g_parmType.left(i);
Packit 1c1d7e
    g_parmType.stripPrefix("const ");
Packit 1c1d7e
    g_parmType=g_parmType.stripWhiteSpace();
Packit 1c1d7e
   // g_theVarContext.addVariable(g_parmType,g_parmName);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*! writes a link to a function or procedure
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
static void generateFuncLink(CodeOutputInterface &ol,MemberDef* mdef)
Packit 1c1d7e
{
Packit 1c1d7e
Packit 1c1d7e
  //printf("generateFuncLink(FuncName=%s)\n",mdef->name().data());
Packit 1c1d7e
  QCString memberName=mdef->name();
Packit 1c1d7e
Packit 1c1d7e
  if (mdef && mdef->isLinkable()) // is it a linkable class
Packit 1c1d7e
  {
Packit 1c1d7e
    writeMultiLineCodeLink(ol,mdef,mdef->name());
Packit 1c1d7e
    addToSearchIndex(memberName);
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  codifyLines(memberName.data());
Packit 1c1d7e
  addToSearchIndex(memberName);
Packit 1c1d7e
} // generateFuncLink
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void generateMemLink(CodeOutputInterface &ol,QCString &clName,QCString& memberName)
Packit 1c1d7e
{
Packit 1c1d7e
  if (memberName.isEmpty()) return; 
Packit 1c1d7e
  if (clName.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    codifyLines(memberName.data());
Packit 1c1d7e
Packit 1c1d7e
   return;
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  QCString className=clName;
Packit 1c1d7e
Packit 1c1d7e
  MemberDef *md=0;
Packit 1c1d7e
  //MemberDef *comp=0;
Packit 1c1d7e
  //bool isLocal=FALSE;
Packit 1c1d7e
Packit 1c1d7e
  md=VhdlDocGen::findMember(className,memberName);
Packit 1c1d7e
  ClassDef *po=VhdlDocGen::getClass(className.data());
Packit 1c1d7e
Packit 1c1d7e
  if (md==0 && po && (VhdlDocGen::VhdlClasses)po->protection()==VhdlDocGen::PACKBODYCLASS) 
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString temp=className;//.stripPrefix("_");
Packit 1c1d7e
    temp.stripPrefix("_");
Packit 1c1d7e
    md=VhdlDocGen::findMember(temp,memberName);
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  if (md && md->isLinkable()) // is it a linkable class
Packit 1c1d7e
  {
Packit 1c1d7e
    writeMultiLineCodeLink(ol,md,memberName);
Packit 1c1d7e
    addToSearchIndex(memberName);
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  // nothing found, just write out the word
Packit 1c1d7e
  codifyLines(memberName.data());
Packit 1c1d7e
  addToSearchIndex(memberName);
Packit 1c1d7e
}// generateMemLink
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName, bool /*typeOnly*/)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString className=clName;
Packit 1c1d7e
Packit 1c1d7e
  if (className.isEmpty()) return;
Packit 1c1d7e
Packit 1c1d7e
  ClassDef *cd=0;
Packit 1c1d7e
  //MemberDef *md=0;
Packit 1c1d7e
  //bool isLocal=FALSE;
Packit 1c1d7e
  className.stripPrefix("_");
Packit 1c1d7e
  cd = getClass(className.data()); 
Packit 1c1d7e
  while (cd)
Packit 1c1d7e
  {
Packit 1c1d7e
    //className.stripPrefix("_");
Packit 1c1d7e
    QCString temp(clName);
Packit 1c1d7e
    temp.stripPrefix("_");
Packit 1c1d7e
    if (cd && cd->isLinkable()) // is it a linkable class
Packit 1c1d7e
    {
Packit 1c1d7e
      //if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS)
Packit 1c1d7e
      //{
Packit 1c1d7e
      //  temp=VhdlDocGen::getClassName(cd);
Packit 1c1d7e
      //}
Packit 1c1d7e
      writeMultiLineCodeLink(ol,cd,temp);
Packit 1c1d7e
      addToSearchIndex(className);
Packit 1c1d7e
      return;
Packit 1c1d7e
    }
Packit 1c1d7e
    Definition *d = cd->getOuterScope();
Packit 1c1d7e
    if (d && d->definitionType()==Definition::TypeClass)
Packit 1c1d7e
    {
Packit 1c1d7e
      cd = (ClassDef*)d;
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      cd = 0;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // nothing found, just write out the word
Packit 1c1d7e
  codifyLines(clName);
Packit 1c1d7e
  addToSearchIndex(clName);
Packit 1c1d7e
}// generateClasss or global link
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
/*! counts the number of lines in the input */
Packit 1c1d7e
static int countLines()
Packit 1c1d7e
{
Packit 1c1d7e
  const char *p=g_inputString;
Packit 1c1d7e
  char c;
Packit 1c1d7e
  int count=1;
Packit 1c1d7e
  while ((c=*p)) 
Packit 1c1d7e
  { 
Packit 1c1d7e
    p++ ; 
Packit 1c1d7e
    if (c=='\n') count++;  
Packit 1c1d7e
  }
Packit 1c1d7e
  if (p>g_inputString && *(p-1)!='\n') 
Packit 1c1d7e
  { // last line does not end with a \n, so we add an extra
Packit 1c1d7e
    // line and explicitly terminate the line after parsing.
Packit 1c1d7e
    count++, 
Packit 1c1d7e
    g_needsTermination=TRUE; 
Packit 1c1d7e
  } 
Packit 1c1d7e
  return count;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void endFontClass()
Packit 1c1d7e
{
Packit 1c1d7e
  if (g_currentFontClass)
Packit 1c1d7e
  {
Packit 1c1d7e
    g_code->endFontClass();
Packit 1c1d7e
    g_currentFontClass=0;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void startFontClass(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (s==0) return;
Packit 1c1d7e
  endFontClass();
Packit 1c1d7e
  g_code->startFontClass(s);
Packit 1c1d7e
  g_currentFontClass=s;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void writeFont(const char *s,const char* text)
Packit 1c1d7e
{
Packit 1c1d7e
  if (s==0 || text==0) return;
Packit 1c1d7e
  //printf("writeFont(%d,\"%s\")\n",g_yyLineNr,text);
Packit 1c1d7e
  g_code->startFontClass(s);
Packit 1c1d7e
  g_code->codify(text);
Packit 1c1d7e
  g_code->endFontClass();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
static void appStringLower(QCString& qcs,const char* text)
Packit 1c1d7e
{
Packit 1c1d7e
  qcs.resize(0);
Packit 1c1d7e
  qcs.append(text);
Packit 1c1d7e
  //qcs=qcs.lower();
Packit 1c1d7e
  qcs=qcs.stripWhiteSpace();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//static void appString(QCString& qcs,const char* text)
Packit 1c1d7e
//{
Packit 1c1d7e
//  qcs.resize(0);
Packit 1c1d7e
//  qcs.append(text);
Packit 1c1d7e
//}
Packit 1c1d7e
Packit 1c1d7e
static QCString g_temp;
Packit 1c1d7e
Packit 1c1d7e
/* writes and links a port map statement */
Packit 1c1d7e
static void codifyMapLines(const char *text)
Packit 1c1d7e
{
Packit 1c1d7e
  if (text==0) return;
Packit 1c1d7e
  g_temp.resize(0);       
Packit 1c1d7e
  //bool dot=FALSE;
Packit 1c1d7e
  int wordCounter=0;
Packit 1c1d7e
  QCString ctemp;
Packit 1c1d7e
  //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
Packit 1c1d7e
  const char *p=text; //,*sp=p;
Packit 1c1d7e
  char c;
Packit 1c1d7e
  bool done=FALSE;
Packit 1c1d7e
  while (!done)
Packit 1c1d7e
  {
Packit 1c1d7e
    //sp=p;
Packit 1c1d7e
    while ((c=*p++) &&  c!='\n' && c!=':' && c != ' ' && c != '(' && c!='\0' && c!='\t')
Packit 1c1d7e
    { 
Packit 1c1d7e
      if (c!=0x9)
Packit 1c1d7e
	g_temp+=c; 
Packit 1c1d7e
    }
Packit 1c1d7e
    if (c=='\0') return;
Packit 1c1d7e
    if (!g_temp.isEmpty()) wordCounter++;
Packit 1c1d7e
Packit 1c1d7e
    if (!g_temp.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      // different kinds of component instantiations
Packit 1c1d7e
      // xxx:yyy (generic/port) map(
Packit 1c1d7e
      // xxx:(entity/component/configuration) yyy (generic/port) map(
Packit 1c1d7e
      // xxx: entity yyy(zzz) (generic/port) map(
Packit 1c1d7e
      if (wordCounter==2 || wordCounter==3)
Packit 1c1d7e
      {
Packit 1c1d7e
	QCString q=g_temp.lower(); // consider (upper/lower) cases
Packit 1c1d7e
	if (q=="entity" || q=="component" || q=="configuration" || q=="port" || q=="generic")
Packit 1c1d7e
	{
Packit 1c1d7e
	  generateMemLink(*g_code,g_CurrClass,g_temp); 
Packit 1c1d7e
	}
Packit 1c1d7e
	else
Packit 1c1d7e
	{
Packit 1c1d7e
	  g_PortMapComp=g_temp;
Packit 1c1d7e
	  generateClassOrGlobalLink(*g_code,g_temp);
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
      else 
Packit 1c1d7e
      {
Packit 1c1d7e
	generateMemLink(*g_code,g_CurrClass,g_temp); 
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    ctemp.fill(c,1);
Packit 1c1d7e
    codifyLines(ctemp.data()); 
Packit 1c1d7e
    ctemp.resize(0);
Packit 1c1d7e
    g_temp.resize(0); 
Packit 1c1d7e
  }//while
Packit 1c1d7e
}//codifymaplines
Packit 1c1d7e
Packit 1c1d7e
/*
Packit 1c1d7e
* writes a function|procedure prototype and links the function|procedure name 
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
static void writeFuncProto()
Packit 1c1d7e
{
Packit 1c1d7e
  QList<Argument> ql;
Packit 1c1d7e
  QCString name,ret;
Packit 1c1d7e
  VhdlDocGen::parseFuncProto(g_FuncProto,ql,name,ret,FALSE);
Packit 1c1d7e
Packit 1c1d7e
  if (name.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    codifyLines(g_FuncProto.data(),g_CurrClass.data());
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
  QStringList qlist=QStringList::split(name,g_FuncProto,FALSE);
Packit 1c1d7e
  QCString temp=qlist[0].utf8();
Packit 1c1d7e
  codifyLines(temp.data(),g_CurrClass.data());
Packit 1c1d7e
  g_FuncProto.stripPrefix(temp.data());
Packit 1c1d7e
  temp.resize(0);
Packit 1c1d7e
  temp=g_CurrClass;
Packit 1c1d7e
  if (isPackageBody) 
Packit 1c1d7e
  {
Packit 1c1d7e
    temp.stripPrefix("_");// _{package body name}
Packit 1c1d7e
  }
Packit 1c1d7e
  MemberDef *mdef=VhdlDocGen::findFunction(ql,name,temp,FALSE);
Packit 1c1d7e
Packit 1c1d7e
  if (mdef)
Packit 1c1d7e
  {
Packit 1c1d7e
    generateFuncLink(*g_code,mdef);
Packit 1c1d7e
    g_FuncProto.stripPrefix(name.data());
Packit 1c1d7e
    codifyLines(g_FuncProto.data(),g_CurrClass.data());
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    codifyLines(g_FuncProto.data(),g_CurrClass.data());
Packit 1c1d7e
  }
Packit 1c1d7e
}// writeFuncProto
Packit 1c1d7e
Packit 1c1d7e
/* writes a process prototype to the output */
Packit 1c1d7e
Packit 1c1d7e
 static void writeProcessProto(){
Packit 1c1d7e
 codifyLines(g_FuncProto.data(),g_CurrClass.data());
Packit 1c1d7e
 g_vhdlKeyDict.clear();
Packit 1c1d7e
}// writeProcessProto
Packit 1c1d7e
Packit 1c1d7e
/* writes a keyword */
Packit 1c1d7e
Packit 1c1d7e
static bool writeColoredWord(QCString& word )
Packit 1c1d7e
{
Packit 1c1d7e
  QCString qcs=word.lower();
Packit 1c1d7e
  QCString *ss=VhdlDocGen::findKeyWord(qcs);
Packit 1c1d7e
  if (ss) 
Packit 1c1d7e
  {
Packit 1c1d7e
    writeFont(ss->data(),word.data());
Packit 1c1d7e
    return TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
#undef        YY_INPUT
Packit 1c1d7e
#define       YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
Packit 1c1d7e
Packit 1c1d7e
static int yyread(char *buf,int max_size)
Packit 1c1d7e
{
Packit 1c1d7e
  int c=0;
Packit 1c1d7e
  while( c < max_size && g_inputString[g_inputPosition] )
Packit 1c1d7e
  {
Packit 1c1d7e
    *buf = g_inputString[g_inputPosition++] ;
Packit 1c1d7e
    c++; buf++;
Packit 1c1d7e
  }
Packit 1c1d7e
  return c;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
%}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
B             [ \t]
Packit 1c1d7e
BN            [ \t\n\r]
Packit 1c1d7e
STRING      ["][^"\n]*["]
Packit 1c1d7e
NAME          [a-z_A-Z][ a-z_A-Z0-9]*
Packit 1c1d7e
FUNCNAME      [a-z_A-Z"][a-z_A-Z0-9+*"/=<>-]*
Packit 1c1d7e
ID            "$"?[a-z_A-Z][a-z_A-Z0-9]*
Packit 1c1d7e
SPECSIGN      [:;, +*&\/=<>'\t]*
Packit 1c1d7e
DIGITSS       [0-9]+|[0-9]+("#")*[0-9_a-fA-F\+\.\-]+("#")*
Packit 1c1d7e
ALLTYPESMAP   {B}*[_a-zA-Z0-9. ]+{BN}*
Packit 1c1d7e
ALLTYPESMAP1  {BN}*[_a-zA-Z0-9.() ]+{BN}*
Packit 1c1d7e
Packit 1c1d7e
ARCHITECTURE  ^{B}*("architecture"){BN}+{FUNCNAME}{BN}+("of"){BN}+{FUNCNAME}
Packit 1c1d7e
PROCESS       ({BN}*{FUNCNAME}{BN}*[:]+{BN}*("process"){BN}*[(]*)|[^a-zA-Z]("process "|"process("){BN}*[ (]*|[^a-zA-Z]("process"){BN}+
Packit 1c1d7e
Packit 1c1d7e
END1          {B}*("end "){BN}+("if"|"case"|"loop"|"generate"|"for")
Packit 1c1d7e
END2          [^a-zA-Z_]("end"){BN}*[;]
Packit 1c1d7e
END3          {BN}*[^a-zA-Z]("end"){BN}+{FUNCNAME}{BN}*[;]
Packit 1c1d7e
END4          {B}*("end"){BN}+"function"{BN}+{FUNCNAME}{BN}*[;]
Packit 1c1d7e
ENDEFUNC      {END3}|{END4}|{END2}
Packit 1c1d7e
Packit 1c1d7e
KEYWORD       ("new"|"event"|"break"|"case"|"end"|"loop"|"else"|"for"|"goto"|"if"|"return"|"generate"|"is"|"while"|"in")
Packit 1c1d7e
TYPEKW        ^{B}*("type"|"subtype"|"constant"|"attribute"|"signal"|"variable","alias","configuration")
Packit 1c1d7e
FUNC          ^{B}*("function"|"procedure"){BN}*{FUNCNAME}{BN}*("(")
Packit 1c1d7e
Packit 1c1d7e
ARITHOP       "+"|"-"|"/"|"*"|"%"|"/="|":="
Packit 1c1d7e
ASSIGNOP      "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
Packit 1c1d7e
LOGICOP       "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
Packit 1c1d7e
BITOP         "&"|"|"|"^"|"<<"|">>"|"~"
Packit 1c1d7e
OPERATOR      {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
Packit 1c1d7e
Packit 1c1d7e
PORT          {B}*("port"){BN}*("(")
Packit 1c1d7e
GENERIC       {B}*("generic"){BN}*("(")
Packit 1c1d7e
Packit 1c1d7e
BRACEOPEN     [(]{1}
Packit 1c1d7e
BRACECLOSE    [)]{1}
Packit 1c1d7e
Packit 1c1d7e
TEXTT         {B}*"--"[^\n]*
Packit 1c1d7e
Packit 1c1d7e
MAPCOMPONENT1 ({ALLTYPESMAP}[:]{ALLTYPESMAP}{TEXTT}*{BN}+("port"|"generic"){BN}+("map"){BN}*("("){1})
Packit 1c1d7e
MAPCOMPONENT2 {BN}*("port"|"generic"){BN}+("map"){BN}*("("){1}
Packit 1c1d7e
MAPCOMPONENT3 ({ALLTYPESMAP}[:]{BN}*{ALLTYPESMAP1}{TEXTT}*{BN}+("port"|"generic"){BN}+("map"){BN}*("("){1})
Packit 1c1d7e
MAPCOMPONENT4 ({ALLTYPESMAP}[:]{BN}*("entity"|"component"|"configuration"){BN}+{ALLTYPESMAP1}{TEXTT}*{BN}*("port"|"generic"){BN}*("map"){BN}*("("){1})
Packit 1c1d7e
Packit 1c1d7e
XILINX      "INST"|"NET"|"PIN"|"BLKNM"|"BUFG"|"COLLAPSE"|"CPLD"|"COMPGRP"|"CONFIG"|"CONFIG_MODE"|"COOL_CLK"|"DATA_GATE"|"DCI_VALUE"|"DISABLE"|"DRIVE"|"DROP_SPEC"|"ENABLE"|"FAST"|"FEEDBACK"|"FILE"|"FLOAT"|"FROM-THRU-TO"|"FROM-TO"|"HBLKNM"|"HU_SET"|"INREG"|"IOB"|"IOBDELAY"|"IOSTANDARD"|"KEEP"|"KEEPER"|"LOC"|"LOCATE"|"LOCK_PINS"|"MAP"|"MAXDELAY"|"MAXPT"|"MAXSKEW"|"NODELAY"|"NOREDUCE"|"OFFSET"|"OPEN_DRAIN"|"OPT_EFFORT"|"OPTIMIZE"|"PERIOD"|"PIN"|"PRIORITY"|"PROHIBIT"|"PULLDOWN"|"PULLUP"|"PWR_MODE"|"REG"|"RLOC"|"RLOC_ORIGIN"|"RLOC_RANGE"|"SAVE NET"|"FLAG"|"SYSTEM_JITTER"|"TEMPERATURE"|"TIMEGRP"|"TIMESPEC"|"VOLTAGE"
Packit 1c1d7e
Packit 1c1d7e
%option noyywrap
Packit 1c1d7e
%option nounput
Packit 1c1d7e
Packit 1c1d7e
%x Bases
Packit 1c1d7e
%x ParseType
Packit 1c1d7e
%x ParseFuncProto
Packit 1c1d7e
%x ParseComponent
Packit 1c1d7e
%x ParsePackage
Packit 1c1d7e
%x ParseProcessProto
Packit 1c1d7e
%x ClassName
Packit 1c1d7e
%x PackageName
Packit 1c1d7e
%x ClassVar
Packit 1c1d7e
%x ClassesName
Packit 1c1d7e
%x Map
Packit 1c1d7e
%x Body
Packit 1c1d7e
        
Packit 1c1d7e
%%
Packit 1c1d7e
Packit 1c1d7e
.                     { 
Packit 1c1d7e
                        BEGIN(Bases); 
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<Map>{BRACEOPEN}      {
Packit 1c1d7e
                        g_braceCount++;
Packit 1c1d7e
                        writeFont("vhdlchar",vhdlcodeYYtext);
Packit 1c1d7e
                        BEGIN(Map);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<Map>[^()\n,--]*        { /* write and link a port map lines */
Packit 1c1d7e
                        QCString tt(vhdlcodeYYtext);
Packit 1c1d7e
                        VhdlDocGen::deleteAllChars(tt,',');
Packit 1c1d7e
                        QRegExp r("=>");
Packit 1c1d7e
			QStringList ql=QStringList::split(r,tt,FALSE);
Packit 1c1d7e
			if (ql.count()>=2)
Packit 1c1d7e
			{
Packit 1c1d7e
			  unsigned int index=0;
Packit 1c1d7e
			  QCString t1=ql[0].utf8();
Packit 1c1d7e
			  char cc=t1.at(index);
Packit 1c1d7e
			  while (cc==' ' || cc=='\t') 
Packit 1c1d7e
			  {
Packit 1c1d7e
			    char c2[2];
Packit 1c1d7e
			    c2[0]=cc;
Packit 1c1d7e
			    c2[1]=0;
Packit 1c1d7e
			    g_code->codify(c2);
Packit 1c1d7e
			    index++;
Packit 1c1d7e
			    if (index>=t1.size()) break;
Packit 1c1d7e
			    cc=t1.at(index);
Packit 1c1d7e
			  }        
Packit 1c1d7e
Packit 1c1d7e
			  QCString s1=t1;
Packit 1c1d7e
			  s1=s1.stripWhiteSpace();
Packit 1c1d7e
Packit 1c1d7e
			  //         if (!g_PortMapComp.isEmpty())
Packit 1c1d7e
			  generateMemLink(*g_code,g_PortMapComp,s1); 
Packit 1c1d7e
			  while (index++
Packit 1c1d7e
			  { 
Packit 1c1d7e
			    char cc=t1.at(index);
Packit 1c1d7e
			    if (cc==' ' || cc=='\t')
Packit 1c1d7e
			    {
Packit 1c1d7e
			      char c2[2];
Packit 1c1d7e
			      c2[0]=cc;
Packit 1c1d7e
			      c2[1]=0;
Packit 1c1d7e
			      g_code->codify(c2);
Packit 1c1d7e
			    }
Packit 1c1d7e
			  }        
Packit 1c1d7e
			  codifyLines("=>");
Packit 1c1d7e
			  index=0;
Packit 1c1d7e
			  QCString s2=ql[1].utf8();
Packit 1c1d7e
			  t1=s2;
Packit 1c1d7e
			  cc=t1.at(index);
Packit 1c1d7e
			  while (cc==' ' || cc=='\t') 
Packit 1c1d7e
			  {
Packit 1c1d7e
			    char c2[2];
Packit 1c1d7e
			    c2[0]=cc;
Packit 1c1d7e
			    c2[1]=0;
Packit 1c1d7e
			    g_code->codify(c2);
Packit 1c1d7e
			    index++;
Packit 1c1d7e
			    if (index>=t1.size()) break;
Packit 1c1d7e
			    cc=t1.at(index);
Packit 1c1d7e
			  }        
Packit 1c1d7e
			  s2=s2.stripWhiteSpace();
Packit 1c1d7e
			    if (!checkVhdlString(s2))
Packit 1c1d7e
			  generateMemLink(*g_code,g_CurrClass,s2); 
Packit 1c1d7e
			  while (index++
Packit 1c1d7e
			  { 
Packit 1c1d7e
			    if (t1.at(index)==' ')
Packit 1c1d7e
			    {
Packit 1c1d7e
			      g_code->codify(" "); 
Packit 1c1d7e
			    }
Packit 1c1d7e
			  }        
Packit 1c1d7e
			}
Packit 1c1d7e
			else
Packit 1c1d7e
			{
Packit 1c1d7e
			  codifyLines(vhdlcodeYYtext,g_CurrClass.data());
Packit 1c1d7e
			}
Packit 1c1d7e
			BEGIN(Map);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<Map>"\n"|","         {
Packit 1c1d7e
                        codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                        BEGIN(Map);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<Map>{BRACECLOSE}     {
Packit 1c1d7e
                        g_braceCount--;
Packit 1c1d7e
                        writeFont("vhdlchar",vhdlcodeYYtext);
Packit 1c1d7e
                        if (g_braceCount==0)
Packit 1c1d7e
			{
Packit 1c1d7e
                          BEGIN(Bases);
Packit 1c1d7e
			}
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<ParseFuncProto>{NAME} {
Packit 1c1d7e
                         QCString tmp(vhdlcodeYYtext);
Packit 1c1d7e
                         tmp=tmp.stripWhiteSpace();
Packit 1c1d7e
                         appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                         g_vhdlKeyDict.insert(g_PrevString,new QCString(g_PrevString.data()));
Packit 1c1d7e
                         if (!writeColoredWord(tmp))
Packit 1c1d7e
			 {
Packit 1c1d7e
                           generateMemLink(*g_code,g_CurrClass,tmp); 
Packit 1c1d7e
			 }
Packit 1c1d7e
                         BEGIN(Bases);
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>{STRING} {
Packit 1c1d7e
                       QCString qcs(vhdlcodeYYtext);
Packit 1c1d7e
                       VhdlDocGen::deleteAllChars(qcs,'"');
Packit 1c1d7e
                       VhdlDocGen::deleteAllChars(qcs,' ');
Packit 1c1d7e
                        if (VhdlDocGen::isNumber(qcs))
Packit 1c1d7e
                       writeFont("vhdllogic",vhdlcodeYYtext);
Packit 1c1d7e
                       else
Packit 1c1d7e
                       writeFont("keyword",vhdlcodeYYtext);
Packit 1c1d7e
                }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>"\n"       {
Packit 1c1d7e
                        g_FuncProto.append(vhdlcodeYYtext);
Packit 1c1d7e
                        if (isProto)
Packit 1c1d7e
			{
Packit 1c1d7e
                          codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
			}
Packit 1c1d7e
                        BEGIN(ParseType);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ParseType>{TEXTT}    {
Packit 1c1d7e
                        g_FuncProto.append(vhdlcodeYYtext);                
Packit 1c1d7e
                        if (isProto)                                                                 
Packit 1c1d7e
		        {
Packit 1c1d7e
                          writeFont("keyword",vhdlcodeYYtext);
Packit 1c1d7e
		        }
Packit 1c1d7e
                        BEGIN(ParseType); 
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>{ENDEFUNC} {
Packit 1c1d7e
  			QRegExp regg("[\\s]");
Packit 1c1d7e
                        QCString tt(vhdlcodeYYtext);
Packit 1c1d7e
                        codifyLines(vhdlcodeYYtext,g_CurrClass.data());
Packit 1c1d7e
                        tt=tt.lower();
Packit 1c1d7e
                        VhdlDocGen::deleteAllChars(tt,';');
Packit 1c1d7e
                        tt.stripWhiteSpace();
Packit 1c1d7e
                        QStringList ql=QStringList::split(regg,tt,FALSE);
Packit 1c1d7e
                        int index=ql.findIndex(QCString("if"))+1;
Packit 1c1d7e
                        index+=ql.findIndex(QCString("case"))+1;
Packit 1c1d7e
                        index+=ql.findIndex(QCString("loop"))+1;
Packit 1c1d7e
                        index+=ql.findIndex(QCString("generate"))+1;                        
Packit 1c1d7e
                        if (index==0)
Packit 1c1d7e
		        {
Packit 1c1d7e
                          BEGIN(Bases);
Packit 1c1d7e
		        }
Packit 1c1d7e
                        else
Packit 1c1d7e
		        {
Packit 1c1d7e
                          BEGIN(ParseType);
Packit 1c1d7e
	        	}
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>{END1}     {
Packit 1c1d7e
                        codifyLines(vhdlcodeYYtext,g_CurrClass.data());
Packit 1c1d7e
                        g_vhdlKeyDict.clear();
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>^{B}*("begin "|"begin") {
Packit 1c1d7e
                        codifyLines(vhdlcodeYYtext,g_CurrClass.data());
Packit 1c1d7e
                        isFuncProto=FALSE;
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>{SPECSIGN} {
Packit 1c1d7e
                        g_FuncProto.append(vhdlcodeYYtext);
Packit 1c1d7e
                        if (isProto)
Packit 1c1d7e
			{
Packit 1c1d7e
                          codifyLines(vhdlcodeYYtext,g_CurrClass.data());
Packit 1c1d7e
			}
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>["_a-zA-Z0-9]* {
Packit 1c1d7e
                        QCString val(vhdlcodeYYtext);
Packit 1c1d7e
                        g_FuncProto.append(vhdlcodeYYtext);
Packit 1c1d7e
                        appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                                                        
Packit 1c1d7e
                        if (isFuncProto && g_braceCount==0)
Packit 1c1d7e
                        {
Packit 1c1d7e
                          g_vhdlKeyDict.insert(g_PrevString,new QCString(g_PrevString.data()));
Packit 1c1d7e
		        }
Packit 1c1d7e
                                
Packit 1c1d7e
                        if (isProto) 
Packit 1c1d7e
		        { 
Packit 1c1d7e
                          if (!writeColoredWord(val))
Packit 1c1d7e
                          {
Packit 1c1d7e
                            if (!isFuncProto && !g_vhdlKeyDict.find(g_PrevString))
Packit 1c1d7e
                            {
Packit 1c1d7e
                              val=val.stripWhiteSpace();
Packit 1c1d7e
			      if (VhdlDocGen::isNumber(val))
Packit 1c1d7e
			      {
Packit 1c1d7e
				startFontClass("vhdllogic");
Packit 1c1d7e
				codifyLines(vhdlcodeYYtext,g_CurrClass.data());
Packit 1c1d7e
				endFontClass();
Packit 1c1d7e
			      }
Packit 1c1d7e
                             else
Packit 1c1d7e
                              generateMemLink(*g_code,g_CurrClass,val); 
Packit 1c1d7e
                            }
Packit 1c1d7e
                            else
Packit 1c1d7e
			    {
Packit 1c1d7e
                              codifyLines(vhdlcodeYYtext,g_CurrClass.data());
Packit 1c1d7e
			    }
Packit 1c1d7e
                          }
Packit 1c1d7e
                        }
Packit 1c1d7e
                        BEGIN(ParseType); 
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>{BRACEOPEN} {
Packit 1c1d7e
                        g_braceCount++;
Packit 1c1d7e
                        g_FuncProto+='(';
Packit 1c1d7e
                        if (isProto)
Packit 1c1d7e
		        {
Packit 1c1d7e
                          writeFont("vhdlchar",vhdlcodeYYtext);
Packit 1c1d7e
		        }
Packit 1c1d7e
                        BEGIN(ParseType);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
<ParseType>{BRACECLOSE} {
Packit 1c1d7e
                        g_braceCount--;
Packit 1c1d7e
                        g_FuncProto+=')';
Packit 1c1d7e
                        if (isProto)
Packit 1c1d7e
			{
Packit 1c1d7e
                          writeFont("vhdlchar",vhdlcodeYYtext);
Packit 1c1d7e
			}
Packit 1c1d7e
                        if (g_braceCount==0 && !isProto)// && !isPackageBody)
Packit 1c1d7e
                        {
Packit 1c1d7e
                          isProto=TRUE;
Packit 1c1d7e
                          appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                          writeFuncProto();
Packit 1c1d7e
                          BEGIN(Bases);
Packit 1c1d7e
                        }
Packit 1c1d7e
                        if (isPackageBody)
Packit 1c1d7e
			{
Packit 1c1d7e
                          BEGIN(ParseType);
Packit 1c1d7e
			}
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ClassesName>{FUNCNAME} {
Packit 1c1d7e
                         appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                         g_CurrClass.resize(0);
Packit 1c1d7e
                         g_CurrClass.append(vhdlcodeYYtext);
Packit 1c1d7e
                         g_CurrClass=g_CurrClass.stripWhiteSpace();
Packit 1c1d7e
                                                  
Packit 1c1d7e
                         if (!writeColoredWord(g_CurrScope))
Packit 1c1d7e
			 {
Packit 1c1d7e
                           generateClassOrGlobalLink(*g_code,vhdlcodeYYtext);
Packit 1c1d7e
			 }
Packit 1c1d7e
                         else
Packit 1c1d7e
		         {
Packit 1c1d7e
                           codifyLines(vhdlcodeYYtext,g_CurrClass.data());
Packit 1c1d7e
		         }
Packit 1c1d7e
                         BEGIN(Bases);
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>{BRACEOPEN} {
Packit 1c1d7e
                         g_braceCount++;
Packit 1c1d7e
                         g_code->codify(vhdlcodeYYtext);
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>{BRACECLOSE} {
Packit 1c1d7e
                         g_braceCount--;
Packit 1c1d7e
                         g_code->codify(vhdlcodeYYtext);  
Packit 1c1d7e
                         if (g_braceCount==0 && !isComponent)
Packit 1c1d7e
                         {
Packit 1c1d7e
                           g_tempComp.resize(0);
Packit 1c1d7e
                           BEGIN(Bases);
Packit 1c1d7e
                         }
Packit 1c1d7e
                         else
Packit 1c1d7e
			 {
Packit 1c1d7e
                           BEGIN(ParseComponent);
Packit 1c1d7e
			 }
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>{B}*"-" {    
Packit 1c1d7e
                         if (strlen(vhdlcodeYYtext)>=2) // found text ?
Packit 1c1d7e
			 {
Packit 1c1d7e
                           writeFont("keyword",vhdlcodeYYtext);
Packit 1c1d7e
			 }
Packit 1c1d7e
                         else
Packit 1c1d7e
			 {
Packit 1c1d7e
                           writeFont("vhdlchar",vhdlcodeYYtext); 
Packit 1c1d7e
			 }
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>{SPECSIGN} {
Packit 1c1d7e
                         codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>"\n"|" " {
Packit 1c1d7e
                           codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>{DIGITSS} { 
Packit 1c1d7e
                         startFontClass("vhdllogic");
Packit 1c1d7e
                         codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                         endFontClass();
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>{PORT} { 
Packit 1c1d7e
                         codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                         g_braceCount=1;
Packit 1c1d7e
                         isComponent=FALSE;
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>{GENERIC} { 
Packit 1c1d7e
                         codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                         g_braceCount=1;
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>[_a-zA_Z][_a-zA-Z0-9]*  {
Packit 1c1d7e
                         QCString temp(vhdlcodeYYtext);
Packit 1c1d7e
                         appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                         if (!checkVhdlString(temp)){
Packit 1c1d7e
                         if (!writeColoredWord(g_PrevString))
Packit 1c1d7e
		         {
Packit 1c1d7e
                           generateMemLink(*g_code,g_tempComp,temp); 
Packit 1c1d7e
		         }
Packit 1c1d7e
                       }
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseComponent>{STRING} { 
Packit 1c1d7e
                            QCString temp(vhdlcodeYYtext);
Packit 1c1d7e
                        if (!checkVhdlString(temp))
Packit 1c1d7e
                         codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ParseProcessProto>[^()]* { 
Packit 1c1d7e
                         g_FuncProto.append(vhdlcodeYYtext);
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ParseProcessProto>{BRACEOPEN} {
Packit 1c1d7e
                         g_FuncProto.append(vhdlcodeYYtext);
Packit 1c1d7e
                         g_braceCount++;
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
<ParseProcessProto>{BRACECLOSE} {
Packit 1c1d7e
                         g_FuncProto.append(vhdlcodeYYtext);
Packit 1c1d7e
                         g_braceCount--;
Packit 1c1d7e
                         if (g_braceCount==0) 
Packit 1c1d7e
			 {
Packit 1c1d7e
                            writeProcessProto();
Packit 1c1d7e
                            BEGIN(Bases);
Packit 1c1d7e
                          }
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
<ParsePackage>[^:;]*    { //found package 
Packit 1c1d7e
                          QCString temp(vhdlcodeYYtext);
Packit 1c1d7e
                          QStringList strl=QStringList::split(".",temp,FALSE);
Packit 1c1d7e
                                
Packit 1c1d7e
                          if (strl.count()>2) 
Packit 1c1d7e
			  {
Packit 1c1d7e
                             QCString s1=strl[0].utf8();  
Packit 1c1d7e
                             QCString s2=strl[1].utf8();  
Packit 1c1d7e
                             QCString s3=strl[2].utf8();  
Packit 1c1d7e
                             s1.append(".");
Packit 1c1d7e
                             s3.prepend(".");
Packit 1c1d7e
                             codifyLines(s1.data(),g_CurrClass.data());  
Packit 1c1d7e
                             ClassDef *cd=VhdlDocGen::getPackageName(s2);
Packit 1c1d7e
                             if (cd)
Packit 1c1d7e
			     {
Packit 1c1d7e
                               generateClassOrGlobalLink(*g_code,s2.data());
Packit 1c1d7e
			     }
Packit 1c1d7e
                             else 
Packit 1c1d7e
			     {
Packit 1c1d7e
                               codifyLines(s2.data());
Packit 1c1d7e
			     }
Packit 1c1d7e
                             codifyLines(s3.data());
Packit 1c1d7e
                           }
Packit 1c1d7e
                           else
Packit 1c1d7e
			   {
Packit 1c1d7e
                             writeFont("keywordflow",vhdlcodeYYtext);
Packit 1c1d7e
			   }
Packit 1c1d7e
                           BEGIN(Bases);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<Bases>{MAPCOMPONENT1}|{MAPCOMPONENT2}|{MAPCOMPONENT3}|{MAPCOMPONENT4}  { // found port or generic map
Packit 1c1d7e
                           QCString tt(vhdlcodeYYtext);
Packit 1c1d7e
             /*
Packit 1c1d7e
                           if (tt.contains(':',FALSE))
Packit 1c1d7e
			   {
Packit 1c1d7e
                             isStartMap=TRUE;
Packit 1c1d7e
			   }
Packit 1c1d7e
                           else
Packit 1c1d7e
			   {
Packit 1c1d7e
                             isStartMap=FALSE;                                        
Packit 1c1d7e
			   }
Packit 1c1d7e
			   */
Packit 1c1d7e
			   int j=tt.find('.');
Packit 1c1d7e
                                                    
Packit 1c1d7e
                           if (j>0)
Packit 1c1d7e
                           {
Packit 1c1d7e
                             QCString left=tt.left(j+1); 
Packit 1c1d7e
                             codifyLines(left.data());
Packit 1c1d7e
                             tt=tt.right(tt.length()-j-1);
Packit 1c1d7e
                             left=VhdlDocGen::getIndexWord(tt.data(),0);
Packit 1c1d7e
                             if (!left.isEmpty())
Packit 1c1d7e
                             {          
Packit 1c1d7e
                               if (left.contains('('))
Packit 1c1d7e
			       {
Packit 1c1d7e
                                 j=left.find('(',FALSE);
Packit 1c1d7e
                                 QCString name=left.left(j);
Packit 1c1d7e
                                 generateClassOrGlobalLink(*g_code,name.data()); 
Packit 1c1d7e
                                 g_PortMapComp=name;
Packit 1c1d7e
                                 name=tt.right(tt.length()-name.length());
Packit 1c1d7e
                                 codifyLines(name.data());
Packit 1c1d7e
                               }
Packit 1c1d7e
                               else
Packit 1c1d7e
			       {
Packit 1c1d7e
                                 generateClassOrGlobalLink(*g_code,left.data()); 
Packit 1c1d7e
                                 tt.stripPrefix(left.data()); //=tt.right(tt.length()-left.length()-1);
Packit 1c1d7e
                                 
Packit 1c1d7e
                                 g_PortMapComp=left;
Packit 1c1d7e
                                 codifyLines(tt.data());
Packit 1c1d7e
                               }
Packit 1c1d7e
                             }
Packit 1c1d7e
                           }
Packit 1c1d7e
                           else
Packit 1c1d7e
			   {
Packit 1c1d7e
                           if (tt.contains(':',FALSE)) 
Packit 1c1d7e
                             codifyMapLines(tt.data());
Packit 1c1d7e
                              else
Packit 1c1d7e
                             codifyLines(tt.data()); 
Packit 1c1d7e
			   }
Packit 1c1d7e
                           g_braceCount=1;
Packit 1c1d7e
                           BEGIN(Map);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<Bases>^{B}*("component"){BN}+{FUNCNAME}  { // found component
Packit 1c1d7e
                           appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                           //  writeFont("keywordflow",VhdlDocGen::getIndexWord(vhdlcodeYYtext,0).data());
Packit 1c1d7e
                           //  writeFont("vhdlkeyword"," ");
Packit 1c1d7e
                           QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
Packit 1c1d7e
                           temp=temp.stripWhiteSpace();
Packit 1c1d7e
                           VhdlDocGen::deleteAllChars(temp,'\n');
Packit 1c1d7e
                           g_tempComp=temp;
Packit 1c1d7e
                           codifyLines(vhdlcodeYYtext,temp.data(),TRUE);
Packit 1c1d7e
			   g_braceCount=0;
Packit 1c1d7e
                         
Packit 1c1d7e
                           //if (getClass(temp.data()))
Packit 1c1d7e
                           //  generateClassOrGlobalLink(*g_code,temp.data());
Packit 1c1d7e
                           //else
Packit 1c1d7e
                           //  generateMemLink(*g_code,g_CurrClass,temp);
Packit 1c1d7e
                         
Packit 1c1d7e
                           isComponent=TRUE;
Packit 1c1d7e
                           BEGIN(ParseComponent);
Packit 1c1d7e
                         }
Packit 1c1d7e
                                                
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<Bases>{ARCHITECTURE}    { // found architecture
Packit 1c1d7e
                           g_PortMapComp.resize(0);
Packit 1c1d7e
                           //        writeFont("vhdlkeyword",VhdlDocGen::getIndexWord(vhdlcodeYYtext,0).data());
Packit 1c1d7e
                           //        writeFont("vhdlkeyword"," ");
Packit 1c1d7e
                           //        writeFont("vhdlchar",VhdlDocGen::getIndexWord(vhdlcodeYYtext,1).data());
Packit 1c1d7e
                           //        writeFont("vhdlkeyword"," ");
Packit 1c1d7e
                           //        writeFont("vhdlkeyword",VhdlDocGen::getIndexWord(vhdlcodeYYtext,2).data());
Packit 1c1d7e
                           //        writeFont("vhdlkeyword"," ");
Packit 1c1d7e
                           //QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
Packit 1c1d7e
                           //temp=temp.stripWhiteSpace();
Packit 1c1d7e
                           //temp+=("-");
Packit 1c1d7e
                           //temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,3);
Packit 1c1d7e
			   QCString temp = VhdlDocGen::getIndexWord(vhdlcodeYYtext,3);
Packit 1c1d7e
			   temp+="::";
Packit 1c1d7e
			   temp+=VhdlDocGen::getIndexWord(vhdlcodeYYtext,1);
Packit 1c1d7e
                           g_CurrClass=temp;
Packit 1c1d7e
                           VhdlDocGen::deleteAllChars(temp,'\n');
Packit 1c1d7e
                           codifyLines(vhdlcodeYYtext,temp.data(),TRUE);
Packit 1c1d7e
                           //generateClassOrGlobalLink(*g_code,temp.data());
Packit 1c1d7e
                           isPackageBody=FALSE;
Packit 1c1d7e
                           BEGIN(ClassName);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<Bases>^{B}*("package "){BN}*("body"){BN}*{FUNCNAME}  { // found package body  
Packit 1c1d7e
                           QCString ss(vhdlcodeYYtext);
Packit 1c1d7e
                           QCString temp=VhdlDocGen::getIndexWord(vhdlcodeYYtext,2);
Packit 1c1d7e
                           QStringList ql=QStringList::split(temp,ss,FALSE);
Packit 1c1d7e
                           QCString ll=ql[0].utf8();
Packit 1c1d7e
                           codifyLines(ll.data(),g_CurrClass.data());
Packit 1c1d7e
                           temp=temp.stripWhiteSpace();
Packit 1c1d7e
                                     temp.prepend("_");
Packit 1c1d7e
                           generateClassOrGlobalLink(*g_code,temp.data());
Packit 1c1d7e
                           g_CurrClass.resize(0);
Packit 1c1d7e
                           g_CurrClass=temp;
Packit 1c1d7e
                           isProto=FALSE;
Packit 1c1d7e
                           isPackageBody=TRUE;
Packit 1c1d7e
                           // BEGIN(ClassesName);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<Bases>{PROCESS}         { // found process
Packit 1c1d7e
                           isFuncProto=TRUE;
Packit 1c1d7e
                           g_FuncProto.resize(0);
Packit 1c1d7e
                           g_FuncProto.append(vhdlcodeYYtext);
Packit 1c1d7e
                           g_vhdlKeyDict.clear();
Packit 1c1d7e
                           appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                           if (g_PrevString.contains('(')) 
Packit 1c1d7e
                           {
Packit 1c1d7e
                             g_braceCount=1;
Packit 1c1d7e
                             BEGIN(ParseProcessProto);
Packit 1c1d7e
                           }
Packit 1c1d7e
                           else
Packit 1c1d7e
			   {
Packit 1c1d7e
			     writeProcessProto();
Packit 1c1d7e
			   }
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<Bases>("end"){BN}+("process") { // end of process
Packit 1c1d7e
                           isFuncProto=FALSE;
Packit 1c1d7e
                           codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                           BEGIN(Bases);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<Bases>^{B}*("begin "|"begin") { 
Packit 1c1d7e
                           isFuncProto=FALSE;
Packit 1c1d7e
                           writeFont("vhdlkeyword",vhdlcodeYYtext);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<Bases>^{B}*("use"|"library"){BN}+ { //found package or library
Packit 1c1d7e
                           writeFont("vhdlkeyword",vhdlcodeYYtext);
Packit 1c1d7e
                           BEGIN(ParsePackage);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<Bases>^{B}*("use"){BN}+("configuration")[^\n]* { 
Packit 1c1d7e
                           codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<Bases>{FUNC}            {  // found function|procedure
Packit 1c1d7e
                           g_vhdlKeyDict.clear();
Packit 1c1d7e
                           g_FuncProto.resize(0);
Packit 1c1d7e
                           isProto=FALSE;
Packit 1c1d7e
                           g_FuncProto.append(vhdlcodeYYtext);
Packit 1c1d7e
                           g_braceCount=1;
Packit 1c1d7e
                           BEGIN(ParseType);
Packit 1c1d7e
                         }
Packit 1c1d7e
                                        
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<Bases>^{B}*("entity"|"package"){BN}+ { 
Packit 1c1d7e
                           appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                           writeFont("keywordflow",vhdlcodeYYtext);
Packit 1c1d7e
                           isPackageBody=FALSE;
Packit 1c1d7e
                           BEGIN(ClassesName);
Packit 1c1d7e
                         }
Packit 1c1d7e
                                        
Packit 1c1d7e
Packit 1c1d7e
<Bases>{KEYWORD}         { // found keyword
Packit 1c1d7e
                           QCString qcs(vhdlcodeYYtext);
Packit 1c1d7e
                           if (!writeColoredWord(qcs))
Packit 1c1d7e
                           {
Packit 1c1d7e
                             startFontClass("vhdlchar");
Packit 1c1d7e
                             g_code->codify(vhdlcodeYYtext);
Packit 1c1d7e
                             endFontClass();
Packit 1c1d7e
                           }
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<Bases>{ID}              {
Packit 1c1d7e
                           appStringLower(g_PrevString,vhdlcodeYYtext);
Packit 1c1d7e
                           QCString temp(vhdlcodeYYtext);
Packit 1c1d7e
                           temp=temp.stripWhiteSpace();
Packit 1c1d7e
                        
Packit 1c1d7e
                           if (!writeColoredWord(temp))
Packit 1c1d7e
                           {
Packit 1c1d7e
                             startFontClass("vhdlchar");
Packit 1c1d7e
                             generateMemLink(*g_code,g_CurrClass,temp);
Packit 1c1d7e
                             endFontClass();
Packit 1c1d7e
                           }
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<Bases,ParseComponent>{DIGITSS} { 
Packit 1c1d7e
                           startFontClass("vhdllogic");
Packit 1c1d7e
                           codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                           endFontClass();
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<Bases>^{B}*("use"){BN}+("entity"|"component")[^\n]* { 
Packit 1c1d7e
                            codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<Bases>{TYPEKW}          { 
Packit 1c1d7e
                           codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
                           if (isFuncProto)
Packit 1c1d7e
			   {
Packit 1c1d7e
                             BEGIN(ParseFuncProto);
Packit 1c1d7e
			   }
Packit 1c1d7e
                           else 
Packit 1c1d7e
			   {
Packit 1c1d7e
                             BEGIN(Bases);
Packit 1c1d7e
			   }
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<Bases>{OPERATOR}        {                            
Packit 1c1d7e
                           startFontClass("vhdlchar");
Packit 1c1d7e
                           g_code->codify(vhdlcodeYYtext);
Packit 1c1d7e
                           endFontClass();
Packit 1c1d7e
                         }
Packit 1c1d7e
   
Packit 1c1d7e
<Bases>","|"."|":"|"'"|"("|")" { 
Packit 1c1d7e
                           startFontClass("vhdlchar");
Packit 1c1d7e
                           g_code->codify(vhdlcodeYYtext);
Packit 1c1d7e
                           endFontClass();
Packit 1c1d7e
                         }
Packit 1c1d7e
                                          
Packit 1c1d7e
<Bases>{STRING} {
Packit 1c1d7e
                       QCString qcs(vhdlcodeYYtext);
Packit 1c1d7e
                       VhdlDocGen::deleteAllChars(qcs,'"');
Packit 1c1d7e
                       VhdlDocGen::deleteAllChars(qcs,' ');
Packit 1c1d7e
                    
Packit 1c1d7e
                       if (VhdlDocGen::isNumber(qcs))
Packit 1c1d7e
                       writeFont("vhdllogic",vhdlcodeYYtext);
Packit 1c1d7e
                       else
Packit 1c1d7e
                       writeFont("keyword",vhdlcodeYYtext);
Packit 1c1d7e
                }
Packit 1c1d7e
Packit 1c1d7e
<Bases>{B}*"#"[^\n]*  { 
Packit 1c1d7e
                                      writeFont("keyword",vhdlcodeYYtext);
Packit 1c1d7e
                                    }
Packit 1c1d7e
                                     
Packit 1c1d7e
<Bases>^{B}*{XILINX}[^\n]*  { 
Packit 1c1d7e
                            writeWord(yytext);
Packit 1c1d7e
                            //codifyLines(vhdlcodeYYtext,g_CurrClass.data(),TRUE);
Packit 1c1d7e
                         }           
Packit 1c1d7e
                             
Packit 1c1d7e
<Bases>^{B}*"set_"[^\n]*  { 
Packit 1c1d7e
                                      writeWord(yytext);
Packit 1c1d7e
                                    }
Packit 1c1d7e
                                    
Packit 1c1d7e
<*>\n                    {
Packit 1c1d7e
			   codifyLines(vhdlcodeYYtext);
Packit 1c1d7e
			   BEGIN(Bases);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<*>.                     {
Packit 1c1d7e
                           g_code->codify(vhdlcodeYYtext);
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
<*>\n{TEXTT}             { // found normal or special comment on its own line
Packit 1c1d7e
			   QCString text(vhdlcodeYYtext);
Packit 1c1d7e
			   int i=text.find("--");
Packit 1c1d7e
			   if (text.mid(i,3)=="--!" && // hide special comment
Packit 1c1d7e
                               Config_getBool(STRIP_CODE_COMMENTS)) 
Packit 1c1d7e
			   { 
Packit 1c1d7e
			     g_yyLineNr++; // skip complete line
Packit 1c1d7e
			   }  
Packit 1c1d7e
			   else // normal comment
Packit 1c1d7e
			   {
Packit 1c1d7e
			     //    startFontClass("keyword");
Packit 1c1d7e
			     codifyLines(text,0,FALSE,TRUE);
Packit 1c1d7e
			     //    endFontClass();
Packit 1c1d7e
			   }
Packit 1c1d7e
                         }
Packit 1c1d7e
<*>{TEXTT}               { // found normal or special comment after something
Packit 1c1d7e
			   QCString text(vhdlcodeYYtext);
Packit 1c1d7e
			   int i=text.find("--");
Packit 1c1d7e
			   if (text.mid(i,3)=="--!" &&
Packit 1c1d7e
                               Config_getBool(STRIP_CODE_COMMENTS)) 
Packit 1c1d7e
			   { 
Packit 1c1d7e
			      // hide special comment
Packit 1c1d7e
			   }  
Packit 1c1d7e
			   else // normal comment
Packit 1c1d7e
			   {
Packit 1c1d7e
			     //   startFontClass("keyword");
Packit 1c1d7e
			     codifyLines(text,0,FALSE,TRUE);
Packit 1c1d7e
			     //   endFontClass();
Packit 1c1d7e
			   }
Packit 1c1d7e
                         }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
%%
Packit 1c1d7e
Packit 1c1d7e
/*@ ----------------------------------------------------------------------------
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
void resetVhdlCodeParserState()
Packit 1c1d7e
{
Packit 1c1d7e
  g_vhdlKeyDict.setAutoDelete(TRUE);
Packit 1c1d7e
  g_vhdlKeyDict.clear();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString &s, 
Packit 1c1d7e
                  bool exBlock, const char *exName,FileDef *fd,
Packit 1c1d7e
                  int startLine,int endLine,bool inlineFragment,
Packit 1c1d7e
                  MemberDef *memberDef,bool,Definition *searchCtx,
Packit 1c1d7e
                  bool /* collectXRefs */)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("***parseCode() exBlock=%d exName=%s fd=%p\n",exBlock,exName,fd);
Packit 1c1d7e
  if (s.isEmpty()) return;
Packit 1c1d7e
  printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
Packit 1c1d7e
  TooltipManager::instance()->clearTooltips();
Packit 1c1d7e
  if (memberDef)
Packit 1c1d7e
  {
Packit 1c1d7e
    ClassDef *dd=memberDef->getClassDef();
Packit 1c1d7e
    if (dd) g_CurrClass=dd->name();
Packit 1c1d7e
    startLine--;
Packit 1c1d7e
  }
Packit 1c1d7e
  resetVhdlCodeParserState();
Packit 1c1d7e
  g_code = &od;
Packit 1c1d7e
  g_inputString   = s;
Packit 1c1d7e
  g_inputPosition = 0;
Packit 1c1d7e
  g_currentFontClass = 0;
Packit 1c1d7e
  g_needsTermination = FALSE;
Packit 1c1d7e
  g_searchCtx = searchCtx;
Packit 1c1d7e
Packit 1c1d7e
  if (startLine!=-1)
Packit 1c1d7e
    g_yyLineNr    = startLine;
Packit 1c1d7e
  else
Packit 1c1d7e
    g_yyLineNr    = 1;
Packit 1c1d7e
Packit 1c1d7e
  if (endLine!=-1)
Packit 1c1d7e
    g_inputLines  = endLine+1;
Packit 1c1d7e
  else
Packit 1c1d7e
    g_inputLines  = g_yyLineNr + countLines() - 1;
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
  // g_theCallContext.clear();
Packit 1c1d7e
  g_classScope    = className;
Packit 1c1d7e
  g_exampleBlock  = exBlock; 
Packit 1c1d7e
  g_exampleName   = exName;
Packit 1c1d7e
  g_sourceFileDef = fd;
Packit 1c1d7e
  bool cleanupSourceDef = FALSE;
Packit 1c1d7e
  if (exBlock && fd==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    // create a dummy filedef for the example
Packit 1c1d7e
    g_sourceFileDef = new FileDef("",exName);
Packit 1c1d7e
    cleanupSourceDef = TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (g_sourceFileDef) 
Packit 1c1d7e
  {
Packit 1c1d7e
    setCurrentDoc("l00001");
Packit 1c1d7e
  }
Packit 1c1d7e
  g_currentDefinition = 0;
Packit 1c1d7e
  g_currentMemberDef = 0;
Packit 1c1d7e
  g_vhdlMember=0;
Packit 1c1d7e
  if (!g_exampleName.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    g_exampleFile = convertNameToFile(g_exampleName+"-example");
Packit 1c1d7e
  }
Packit 1c1d7e
  g_includeCodeFragment = inlineFragment;
Packit 1c1d7e
  if (!memberDef)
Packit 1c1d7e
  {
Packit 1c1d7e
    startCodeLine();
Packit 1c1d7e
  }
Packit 1c1d7e
  // g_type.resize(0);
Packit 1c1d7e
  // g_name.resize(0);
Packit 1c1d7e
  // g_args.resize(0);
Packit 1c1d7e
  g_parmName.resize(0);
Packit 1c1d7e
  g_parmType.resize(0);
Packit 1c1d7e
  if(!g_lexInit)
Packit 1c1d7e
    VhdlDocGen::init();
Packit 1c1d7e
  if (memberDef) 
Packit 1c1d7e
  {
Packit 1c1d7e
    setParameterList(memberDef);
Packit 1c1d7e
  }
Packit 1c1d7e
  /*int iLine=*/countLines();
Packit 1c1d7e
  vhdlcodeYYrestart( vhdlcodeYYin );
Packit 1c1d7e
  BEGIN( Bases );
Packit 1c1d7e
  vhdlcodeYYlex();
Packit 1c1d7e
  g_lexInit=TRUE;
Packit 1c1d7e
  if (g_needsTermination)
Packit 1c1d7e
  {
Packit 1c1d7e
    endCodeLine();
Packit 1c1d7e
  }
Packit 1c1d7e
  if (fd)
Packit 1c1d7e
  {
Packit 1c1d7e
    TooltipManager::instance()->writeTooltips(*g_code);
Packit 1c1d7e
  }
Packit 1c1d7e
  if (cleanupSourceDef)
Packit 1c1d7e
  {
Packit 1c1d7e
    // delete the temporary file definition used for this example
Packit 1c1d7e
    delete g_sourceFileDef;
Packit 1c1d7e
    g_sourceFileDef=0;
Packit 1c1d7e
  }
Packit 1c1d7e
  g_startCode=FALSE;
Packit 1c1d7e
  printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void codeFreeVhdlScanner()
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(YY_FLEX_SUBMINOR_VERSION) 
Packit 1c1d7e
  if (g_lexInit)
Packit 1c1d7e
  {
Packit 1c1d7e
    vhdlcodeYYlex_destroy();
Packit 1c1d7e
  }
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
#if !defined(YY_FLEX_SUBMINOR_VERSION) 
Packit 1c1d7e
extern "C" { // some bogus code to keep the compiler happy
Packit 1c1d7e
  void vhdlcodeYYdummy() { yy_flex_realloc(0,0); } 
Packit 1c1d7e
}
Packit 1c1d7e
#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33
Packit 1c1d7e
#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
Packit 1c1d7e
#endif
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e