Blame src/code.l

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
%option never-interactive
Packit 1c1d7e
%option prefix="codeYY"
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
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 "arguments.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "groupdef.h"
Packit 1c1d7e
#include "classlist.h"
Packit 1c1d7e
#include "filedef.h"
Packit 1c1d7e
#include "filename.h"
Packit 1c1d7e
#include "namespacedef.h"
Packit 1c1d7e
#include "tooltip.h"
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
#define YY_NO_UNISTD_H 1
Packit 1c1d7e
Packit 1c1d7e
#define CLASSBLOCK (int *)4
Packit 1c1d7e
#define SCOPEBLOCK (int *)8
Packit 1c1d7e
#define INNERBLOCK (int *)12
Packit 1c1d7e
Packit 1c1d7e
/* -----------------------------------------------------------------
Packit 1c1d7e
 *	statics
Packit 1c1d7e
 */
Packit 1c1d7e
  
Packit 1c1d7e
static CodeOutputInterface * g_code;
Packit 1c1d7e
Packit 1c1d7e
static ClassSDict    *g_codeClassSDict = 0;
Packit 1c1d7e
static QCString      g_curClassName;
Packit 1c1d7e
static QStrList      g_curClassBases;
Packit 1c1d7e
Packit 1c1d7e
static QCString      g_parmType;
Packit 1c1d7e
static QCString      g_parmName;
Packit 1c1d7e
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 int	     g_yyColNr;         //!< current column number
Packit 1c1d7e
static bool          g_needsTermination;
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 bool          g_insideTemplate = FALSE;
Packit 1c1d7e
static QCString      g_type;
Packit 1c1d7e
static QCString      g_name;
Packit 1c1d7e
static QCString      g_args;
Packit 1c1d7e
static QCString      g_classScope;
Packit 1c1d7e
static QCString      g_realScope;
Packit 1c1d7e
static QStack<int>   g_scopeStack;      //!< 1 if bracket starts a scope, 
Packit 1c1d7e
                                        //   2 for internal blocks 
Packit 1c1d7e
static int           g_anchorCount;
Packit 1c1d7e
static FileDef *     g_sourceFileDef;
Packit 1c1d7e
static bool          g_lineNumbers;
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
static bool          g_searchingForBody;
Packit 1c1d7e
static bool          g_insideBody;
Packit 1c1d7e
static int           g_bodyCurlyCount;
Packit 1c1d7e
static QCString      g_saveName;
Packit 1c1d7e
static QCString      g_saveType;
Packit 1c1d7e
static QCString      g_delimiter;
Packit 1c1d7e
Packit 1c1d7e
static int	     g_bracketCount = 0;
Packit 1c1d7e
static int	     g_curlyCount   = 0;
Packit 1c1d7e
static int	     g_sharpCount   = 0;
Packit 1c1d7e
static bool          g_inFunctionTryBlock = FALSE;
Packit 1c1d7e
static bool          g_inForEachExpression = FALSE;
Packit 1c1d7e
Packit 1c1d7e
static int           g_lastTemplCastContext;
Packit 1c1d7e
static int	     g_lastSpecialCContext;
Packit 1c1d7e
static int           g_lastStringContext;
Packit 1c1d7e
static int           g_lastSkipCppContext;
Packit 1c1d7e
static int           g_lastVerbStringContext;
Packit 1c1d7e
static int           g_lastObjCCallContext;
Packit 1c1d7e
static int           g_memCallContext;
Packit 1c1d7e
static int	     g_lastCContext;
Packit 1c1d7e
static int           g_skipInlineInitContext;
Packit 1c1d7e
Packit 1c1d7e
static bool          g_insideObjC;
Packit 1c1d7e
static bool          g_insideJava;
Packit 1c1d7e
static bool          g_insideCS;
Packit 1c1d7e
static bool          g_insidePHP;
Packit 1c1d7e
static bool          g_insideProtocolList;
Packit 1c1d7e
Packit 1c1d7e
static bool          g_lexInit = FALSE;
Packit 1c1d7e
Packit 1c1d7e
static QStack<int>   g_classScopeLengthStack;
Packit 1c1d7e
Packit 1c1d7e
static int           g_prefixed_with_this_keyword = FALSE;
Packit 1c1d7e
static Definition   *g_searchCtx;
Packit 1c1d7e
static bool          g_collectXRefs;
Packit 1c1d7e
Packit 1c1d7e
// context for an Objective-C method call
Packit 1c1d7e
struct ObjCCallCtx
Packit 1c1d7e
{
Packit 1c1d7e
  int id;
Packit 1c1d7e
  QCString methodName;
Packit 1c1d7e
  QCString objectTypeOrName;
Packit 1c1d7e
  QGString comment;
Packit 1c1d7e
  ClassDef *objectType;
Packit 1c1d7e
  MemberDef *objectVar;
Packit 1c1d7e
  MemberDef *method;
Packit 1c1d7e
  QCString format;
Packit 1c1d7e
  int lexState;
Packit 1c1d7e
  int braceCount;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
// globals for objective-C method calls 
Packit 1c1d7e
static ObjCCallCtx *g_currentCtx=0;
Packit 1c1d7e
static int g_currentCtxId=0;
Packit 1c1d7e
static int g_currentNameId=0;
Packit 1c1d7e
static int g_currentObjId=0;
Packit 1c1d7e
static int g_currentWordId=0;
Packit 1c1d7e
static int g_currentCommentId=0;
Packit 1c1d7e
static QStack<ObjCCallCtx> g_contextStack;
Packit 1c1d7e
static QIntDict<ObjCCallCtx> g_contextDict;
Packit 1c1d7e
static QIntDict<QCString> g_nameDict;
Packit 1c1d7e
static QIntDict<QCString> g_objectDict;
Packit 1c1d7e
static QIntDict<QCString> g_wordDict;
Packit 1c1d7e
static QIntDict<QCString> g_commentDict;
Packit 1c1d7e
static int g_braceCount=0;
Packit 1c1d7e
  
Packit 1c1d7e
static void saveObjCContext();
Packit 1c1d7e
static void restoreObjCContext();
Packit 1c1d7e
Packit 1c1d7e
static QCString g_forceTagReference;
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
//-------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
/*! Represents a stack of variable to class mappings as found in the
Packit 1c1d7e
 *  code. Each scope is enclosed in pushScope() and popScope() calls.
Packit 1c1d7e
 *  Variables are added by calling addVariables() and one can search
Packit 1c1d7e
 *  for variable using findVariable().
Packit 1c1d7e
 */
Packit 1c1d7e
class VariableContext
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    static const ClassDef *dummyContext;
Packit 1c1d7e
    
Packit 1c1d7e
    class Scope : public SDict<ClassDef>
Packit 1c1d7e
    {
Packit 1c1d7e
      public:
Packit 1c1d7e
	Scope() : SDict<ClassDef>(17) {}
Packit 1c1d7e
    };
Packit 1c1d7e
    
Packit 1c1d7e
    VariableContext() 
Packit 1c1d7e
    {
Packit 1c1d7e
      m_scopes.setAutoDelete(TRUE);
Packit 1c1d7e
    }
Packit 1c1d7e
    virtual ~VariableContext()
Packit 1c1d7e
    {
Packit 1c1d7e
    }
Packit 1c1d7e
    
Packit 1c1d7e
    void pushScope()
Packit 1c1d7e
    {
Packit 1c1d7e
      m_scopes.append(new Scope);
Packit 1c1d7e
      DBG_CTX((stderr,"** Push var context %d\n",m_scopes.count()));
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    void popScope()
Packit 1c1d7e
    {
Packit 1c1d7e
      if (m_scopes.count()>0)
Packit 1c1d7e
      {
Packit 1c1d7e
        DBG_CTX((stderr,"** Pop var context %d\n",m_scopes.count()));
Packit 1c1d7e
	m_scopes.remove(m_scopes.count()-1);
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        DBG_CTX((stderr,"** ILLEGAL: Pop var context\n"));
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    void clear()
Packit 1c1d7e
    {
Packit 1c1d7e
      m_scopes.clear();
Packit 1c1d7e
      m_globalScope.clear();
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    void clearExceptGlobal()
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"** Clear var context\n"));
Packit 1c1d7e
      m_scopes.clear();
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    void addVariable(const QCString &type,const QCString &name);
Packit 1c1d7e
    ClassDef *findVariable(const QCString &name);
Packit 1c1d7e
Packit 1c1d7e
    int count() const { return m_scopes.count(); }
Packit 1c1d7e
    
Packit 1c1d7e
  private:
Packit 1c1d7e
    Scope        m_globalScope;
Packit 1c1d7e
    QList<Scope> m_scopes;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
void VariableContext::addVariable(const QCString &type,const QCString &name)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("VariableContext::addVariable(%s,%s)\n",type.data(),name.data());
Packit 1c1d7e
  QCString ltype = type.simplifyWhiteSpace();
Packit 1c1d7e
  QCString lname = name.simplifyWhiteSpace();
Packit 1c1d7e
  if (ltype.left(7)=="struct ") 
Packit 1c1d7e
  {
Packit 1c1d7e
    ltype = ltype.right(ltype.length()-7);
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (ltype.left(6)=="union ")
Packit 1c1d7e
  {
Packit 1c1d7e
    ltype = ltype.right(ltype.length()-6);
Packit 1c1d7e
  }
Packit 1c1d7e
  if (ltype.isEmpty() || lname.isEmpty()) return;
Packit 1c1d7e
  DBG_CTX((stderr,"** addVariable trying: type='%s' name='%s' g_currentDefinition=%s\n",
Packit 1c1d7e
	ltype.data(),lname.data(),g_currentDefinition?g_currentDefinition->name().data():"<none>"));
Packit 1c1d7e
  Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
Packit 1c1d7e
  ClassDef *varType;
Packit 1c1d7e
  int i=0;
Packit 1c1d7e
  if (
Packit 1c1d7e
      (varType=g_codeClassSDict->find(ltype)) ||  // look for class definitions inside the code block
Packit 1c1d7e
      (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions
Packit 1c1d7e
     ) 
Packit 1c1d7e
  {
Packit 1c1d7e
    DBG_CTX((stderr,"** addVariable type='%s' name='%s'\n",ltype.data(),lname.data()));
Packit 1c1d7e
    scope->append(lname,varType); // add it to a list
Packit 1c1d7e
  }
Packit 1c1d7e
  else if ((i=ltype.find('<'))!=-1)
Packit 1c1d7e
  {
Packit 1c1d7e
    // probably a template class
Packit 1c1d7e
    QCString typeName(ltype.left(i));
Packit 1c1d7e
    ClassDef* newDef = 0;
Packit 1c1d7e
    QCString templateArgs(ltype.right(ltype.length() - i));
Packit 1c1d7e
    if (  
Packit 1c1d7e
         ( // look for class definitions inside the code block
Packit 1c1d7e
	   (varType=g_codeClassSDict->find(typeName)) ||
Packit 1c1d7e
           // otherwise look for global class definitions
Packit 1c1d7e
           (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,typeName,0,0,TRUE,TRUE))
Packit 1c1d7e
	 ) && // and it must be a template
Packit 1c1d7e
         varType->templateArguments())
Packit 1c1d7e
    {
Packit 1c1d7e
      newDef = varType->getVariableInstance( templateArgs );
Packit 1c1d7e
    }
Packit 1c1d7e
    if (newDef)
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"** addVariable type='%s' templ='%s' name='%s'\n",typeName.data(),templateArgs.data(),lname.data()));
Packit 1c1d7e
      scope->append(lname, newDef);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      // Doesn't seem to be a template. Try just the base name.
Packit 1c1d7e
      addVariable(typeName,name);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else 
Packit 1c1d7e
  {
Packit 1c1d7e
    if (m_scopes.count()>0) // for local variables add a dummy entry so the name 
Packit 1c1d7e
                            // is hidden to avoid false links to global variables with the same name
Packit 1c1d7e
                            // TODO: make this work for namespaces as well!
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"** addVariable: dummy context for '%s'\n",lname.data()));
Packit 1c1d7e
      scope->append(lname,dummyContext);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"** addVariable: not adding variable!\n"));
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
ClassDef *VariableContext::findVariable(const QCString &name)
Packit 1c1d7e
{
Packit 1c1d7e
  if (name.isEmpty()) return 0;
Packit 1c1d7e
  ClassDef *result = 0;
Packit 1c1d7e
  QListIterator<Scope> sli(m_scopes);
Packit 1c1d7e
  Scope *scope;
Packit 1c1d7e
  QCString key = name;
Packit 1c1d7e
  // search from inner to outer scope
Packit 1c1d7e
  for (sli.toLast();(scope=sli.current());--sli)
Packit 1c1d7e
  {
Packit 1c1d7e
    result = scope->find(key);
Packit 1c1d7e
    if (result)
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
Packit 1c1d7e
      return result;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  // nothing found -> also try the global scope
Packit 1c1d7e
  result=m_globalScope.find(name);
Packit 1c1d7e
  DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static VariableContext g_theVarContext;
Packit 1c1d7e
const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8;
Packit 1c1d7e
Packit 1c1d7e
//-------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
class CallContext
Packit 1c1d7e
{
Packit 1c1d7e
  public:
Packit 1c1d7e
    struct Ctx
Packit 1c1d7e
    {
Packit 1c1d7e
      Ctx() : name(g_name), type(g_type), d(0) {}
Packit 1c1d7e
      QCString name;
Packit 1c1d7e
      QCString type;
Packit 1c1d7e
      Definition *d;
Packit 1c1d7e
    };
Packit 1c1d7e
Packit 1c1d7e
    CallContext() 
Packit 1c1d7e
    {
Packit 1c1d7e
      m_defList.append(new Ctx);
Packit 1c1d7e
      m_defList.setAutoDelete(TRUE);
Packit 1c1d7e
    }
Packit 1c1d7e
    virtual ~CallContext() {}
Packit 1c1d7e
    void setScope(Definition *d)
Packit 1c1d7e
    {
Packit 1c1d7e
      Ctx *ctx = m_defList.getLast();
Packit 1c1d7e
      if (ctx)
Packit 1c1d7e
      {
Packit 1c1d7e
	DBG_CTX((stderr,"** Set call context %s (%p)\n",d==0 ? "<null>" : d->name().data(),d));
Packit 1c1d7e
        ctx->d=d;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    void pushScope()
Packit 1c1d7e
    {
Packit 1c1d7e
      m_defList.append(new Ctx);
Packit 1c1d7e
      DBG_CTX((stderr,"** Push call context %d\n",m_defList.count()));
Packit 1c1d7e
    }
Packit 1c1d7e
    void popScope()
Packit 1c1d7e
    {
Packit 1c1d7e
      if (m_defList.count()>1)
Packit 1c1d7e
      {
Packit 1c1d7e
        DBG_CTX((stderr,"** Pop call context %d\n",m_defList.count()));
Packit 1c1d7e
	Ctx *ctx = m_defList.getLast();
Packit 1c1d7e
	if (ctx)
Packit 1c1d7e
	{
Packit 1c1d7e
	  g_name = ctx->name;
Packit 1c1d7e
	  g_type = ctx->type;
Packit 1c1d7e
	}
Packit 1c1d7e
	m_defList.removeLast();
Packit 1c1d7e
      }
Packit 1c1d7e
      else
Packit 1c1d7e
      {
Packit 1c1d7e
        DBG_CTX((stderr,"** ILLEGAL: Pop call context\n"));
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    void clear()
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"** Clear call context\n"));
Packit 1c1d7e
      m_defList.clear();
Packit 1c1d7e
      m_defList.append(new Ctx);
Packit 1c1d7e
    }
Packit 1c1d7e
    Definition *getScope() const
Packit 1c1d7e
    {
Packit 1c1d7e
      Ctx *ctx = m_defList.getLast();
Packit 1c1d7e
      if (ctx) return ctx->d; else return 0;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
  private:
Packit 1c1d7e
    QList<Ctx> m_defList;
Packit 1c1d7e
};
Packit 1c1d7e
Packit 1c1d7e
static CallContext g_theCallContext;
Packit 1c1d7e
Packit 1c1d7e
//-------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
/*! add class/namespace name s to the scope */
Packit 1c1d7e
static void pushScope(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  g_classScopeLengthStack.push(new int(g_classScope.length()));
Packit 1c1d7e
  if (g_classScope.isEmpty() || leftScopeMatch(s,g_classScope))
Packit 1c1d7e
  {
Packit 1c1d7e
    g_classScope = s;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    g_classScope += "::";
Packit 1c1d7e
    g_classScope += s;
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("pushScope(%s) result: `%s'\n",s,g_classScope.data());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*! remove the top class/namespace name from the scope */
Packit 1c1d7e
static void popScope()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!g_classScopeLengthStack.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    int *pLength = g_classScopeLengthStack.pop();
Packit 1c1d7e
    g_classScope.truncate(*pLength);
Packit 1c1d7e
    delete pLength;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    //err("Too many end of scopes found!\n");
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("popScope() result: `%s'\n",g_classScope.data());
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
      g_code->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      g_code->setCurrentDoc(g_sourceFileDef,anchor,TRUE);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void addToSearchIndex(const char *text)
Packit 1c1d7e
{
Packit 1c1d7e
  if (Doxygen::searchIndex)
Packit 1c1d7e
  {
Packit 1c1d7e
    g_code->addWord(text,FALSE);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void setClassScope(const QCString &name)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("setClassScope(%s)\n",name.data());
Packit 1c1d7e
  QCString n=name;
Packit 1c1d7e
  n=n.simplifyWhiteSpace();
Packit 1c1d7e
  int ts=n.find('<'); // start of template
Packit 1c1d7e
  int te=n.findRev('>'); // end of template
Packit 1c1d7e
  //printf("ts=%d te=%d\n",ts,te);
Packit 1c1d7e
  if (ts!=-1 && te!=-1 && te>ts)
Packit 1c1d7e
  {
Packit 1c1d7e
    // remove template from scope
Packit 1c1d7e
    n=n.left(ts)+n.right(n.length()-te-1);
Packit 1c1d7e
  }
Packit 1c1d7e
  while (!g_classScopeLengthStack.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    popScope();
Packit 1c1d7e
  }
Packit 1c1d7e
  g_classScope.resize(0);
Packit 1c1d7e
  int i;
Packit 1c1d7e
  while ((i=n.find("::"))!=-1)
Packit 1c1d7e
  {
Packit 1c1d7e
    pushScope(n.left(i));
Packit 1c1d7e
    n = n.mid(i+2);
Packit 1c1d7e
  }
Packit 1c1d7e
  pushScope(n);
Packit 1c1d7e
  //printf("--->New class scope `%s'\n",g_classScope.data());
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 && g_lineNumbers)
Packit 1c1d7e
  {
Packit 1c1d7e
    //QCString lineNumber,lineAnchor;
Packit 1c1d7e
    //lineNumber.sprintf("%05d",g_yyLineNr);
Packit 1c1d7e
    //lineAnchor.sprintf("l%05d",g_yyLineNr);
Packit 1c1d7e
   
Packit 1c1d7e
    Definition *d   = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
Packit 1c1d7e
    //printf("%s:startCodeLine(%d)=%p\n",g_sourceFileDef->name().data(),g_yyLineNr,d);
Packit 1c1d7e
    if (!g_includeCodeFragment && d)
Packit 1c1d7e
    {
Packit 1c1d7e
      g_currentDefinition = d;
Packit 1c1d7e
      g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
Packit 1c1d7e
      g_insideBody = FALSE;
Packit 1c1d7e
      g_searchingForBody = TRUE;
Packit 1c1d7e
      g_realScope = d->name();
Packit 1c1d7e
      //g_classScope = "";
Packit 1c1d7e
      g_type.resize(0);
Packit 1c1d7e
      g_name.resize(0);
Packit 1c1d7e
      g_args.resize(0);
Packit 1c1d7e
      g_parmType.resize(0);
Packit 1c1d7e
      g_parmName.resize(0);
Packit 1c1d7e
      //printf("Real scope: `%s'\n",g_realScope.data());
Packit 1c1d7e
      g_bodyCurlyCount = 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
  DBG_CTX((stderr,"startCodeLine(%d)\n",g_yyLineNr));
Packit 1c1d7e
  g_code->startCodeLine(g_sourceFileDef && g_lineNumbers); 
Packit 1c1d7e
  if (g_currentFontClass)
Packit 1c1d7e
  {
Packit 1c1d7e
    g_code->startFontClass(g_currentFontClass);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void endFontClass();
Packit 1c1d7e
static void startFontClass(const char *s);
Packit 1c1d7e
Packit 1c1d7e
static void endCodeLine()
Packit 1c1d7e
{
Packit 1c1d7e
  DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
Packit 1c1d7e
  endFontClass();
Packit 1c1d7e
  g_code->endCodeLine();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void nextCodeLine()
Packit 1c1d7e
{
Packit 1c1d7e
  const char * fc = g_currentFontClass;
Packit 1c1d7e
  endCodeLine();
Packit 1c1d7e
  if (g_yyLineNr
Packit 1c1d7e
  {
Packit 1c1d7e
    g_currentFontClass = fc;
Packit 1c1d7e
    startCodeLine();
Packit 1c1d7e
  }
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)
Packit 1c1d7e
{
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') { g_yyColNr++; }
Packit 1c1d7e
    if (c=='\n')
Packit 1c1d7e
    {
Packit 1c1d7e
      g_yyLineNr++;
Packit 1c1d7e
      g_yyColNr=1;
Packit 1c1d7e
      //*(p-1)='\0';
Packit 1c1d7e
      int l = (int)(p-sp-1);
Packit 1c1d7e
      char *tmp = (char*)malloc(l+1);
Packit 1c1d7e
      memcpy(tmp,sp,l);
Packit 1c1d7e
      tmp[l]='\0';
Packit 1c1d7e
      g_code->codify(tmp);
Packit 1c1d7e
      free(tmp);
Packit 1c1d7e
      nextCodeLine();
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      g_code->codify(sp);
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
      //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
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 addType()
Packit 1c1d7e
{
Packit 1c1d7e
  if (g_name=="const") { g_name.resize(0); return; }
Packit 1c1d7e
  if (!g_type.isEmpty()) g_type += ' ' ;
Packit 1c1d7e
  g_type += g_name ;
Packit 1c1d7e
  g_name.resize(0) ;
Packit 1c1d7e
  if (!g_type.isEmpty()) g_type += ' ' ;
Packit 1c1d7e
  g_type += g_args ;
Packit 1c1d7e
  g_args.resize(0) ;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void addParmType()
Packit 1c1d7e
{
Packit 1c1d7e
  if (g_parmName=="const") { g_parmName.resize(0); return; }
Packit 1c1d7e
  if (!g_parmType.isEmpty()) g_parmType += ' ' ;
Packit 1c1d7e
  g_parmType += g_parmName ;
Packit 1c1d7e
  g_parmName.resize(0) ;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void addUsingDirective(const char *name)
Packit 1c1d7e
{
Packit 1c1d7e
  if (g_sourceFileDef && name)
Packit 1c1d7e
  {
Packit 1c1d7e
    NamespaceDef *nd = Doxygen::namespaceSDict->find(name);
Packit 1c1d7e
    if (nd)
Packit 1c1d7e
    {
Packit 1c1d7e
      g_sourceFileDef->addUsingDirective(nd);
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 it(*al);
Packit 1c1d7e
  Argument *a;
Packit 1c1d7e
  for (;(a=it.current());++it)
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
static ClassDef *stripClassName(const char *s,Definition *d=g_currentDefinition)
Packit 1c1d7e
{
Packit 1c1d7e
  int pos=0;
Packit 1c1d7e
  QCString type = s;
Packit 1c1d7e
  QCString className;
Packit 1c1d7e
  QCString templSpec;
Packit 1c1d7e
  while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString clName=className+templSpec;
Packit 1c1d7e
    ClassDef *cd=0;
Packit 1c1d7e
    if (!g_classScope.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      cd=getResolvedClass(d,g_sourceFileDef,g_classScope+"::"+clName);
Packit 1c1d7e
    }
Packit 1c1d7e
    if (cd==0)
Packit 1c1d7e
    {
Packit 1c1d7e
      cd=getResolvedClass(d,g_sourceFileDef,clName);
Packit 1c1d7e
    }
Packit 1c1d7e
    //printf("stripClass trying `%s' = %p\n",clName.data(),cd);
Packit 1c1d7e
    if (cd)
Packit 1c1d7e
    {
Packit 1c1d7e
      return cd;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  return 0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static MemberDef *setCallContextForVar(const QCString &name)
Packit 1c1d7e
{
Packit 1c1d7e
  if (name.isEmpty()) return 0;
Packit 1c1d7e
  DBG_CTX((stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data()));
Packit 1c1d7e
Packit 1c1d7e
  int scopeEnd = name.findRev("::");
Packit 1c1d7e
  if (scopeEnd!=-1) // name with explicit scope
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString scope   = name.left(scopeEnd);
Packit 1c1d7e
    QCString locName = name.right(name.length()-scopeEnd-2);
Packit 1c1d7e
    //printf("explicit scope: name=%s scope=%s\n",locName.data(),scope.data());
Packit 1c1d7e
    ClassDef *mcd = getClass(scope); 
Packit 1c1d7e
    if (mcd && !locName.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberDef *md=mcd->getMemberByName(locName);
Packit 1c1d7e
      if (md)
Packit 1c1d7e
      {
Packit 1c1d7e
        //printf("name=%s scope=%s\n",locName.data(),scope.data());
Packit 1c1d7e
        g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
Packit 1c1d7e
        return md;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else // check namespace as well
Packit 1c1d7e
    {
Packit 1c1d7e
      NamespaceDef *mnd = getResolvedNamespace(scope);
Packit 1c1d7e
      if (mnd && !locName.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
	MemberDef *md=mnd->getMemberByName(locName);
Packit 1c1d7e
	if (md)
Packit 1c1d7e
	{
Packit 1c1d7e
	  //printf("name=%s scope=%s\n",locName.data(),scope.data());
Packit 1c1d7e
	  g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
Packit 1c1d7e
	  return md;
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
  MemberName *mn;
Packit 1c1d7e
  ClassDef *mcd = g_theVarContext.findVariable(name);
Packit 1c1d7e
  if (mcd) // local variable
Packit 1c1d7e
  {
Packit 1c1d7e
    DBG_CTX((stderr,"local variable?\n"));
Packit 1c1d7e
    if (mcd!=VariableContext::dummyContext)
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data()));
Packit 1c1d7e
      g_theCallContext.setScope(mcd);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    DBG_CTX((stderr,"class member? scope=%s\n",g_classScope.data()));
Packit 1c1d7e
    // look for a class member 
Packit 1c1d7e
    mcd = getClass(g_classScope);
Packit 1c1d7e
    if (mcd)
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"Inside class %s\n",mcd->name().data()));
Packit 1c1d7e
      MemberDef *md=mcd->getMemberByName(name);
Packit 1c1d7e
      if (md) 
Packit 1c1d7e
      {
Packit 1c1d7e
        DBG_CTX((stderr,"Found member %s\n",md->name().data()));
Packit 1c1d7e
	if (g_scopeStack.top()!=CLASSBLOCK)
Packit 1c1d7e
	{
Packit 1c1d7e
          DBG_CTX((stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data()));
Packit 1c1d7e
	  g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
Packit 1c1d7e
	}
Packit 1c1d7e
	return md;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  // look for a global member
Packit 1c1d7e
  if ((mn=Doxygen::functionNameSDict->find(name)))
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("global var `%s'\n",name.data());
Packit 1c1d7e
    if (mn->count()==1) // global defined only once
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberDef *md=mn->getFirst();
Packit 1c1d7e
      if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef)
Packit 1c1d7e
      {
Packit 1c1d7e
        g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
Packit 1c1d7e
        return md;
Packit 1c1d7e
      }
Packit 1c1d7e
      return 0;
Packit 1c1d7e
    }
Packit 1c1d7e
    else if (mn->count()>1) // global defined more than once
Packit 1c1d7e
    {
Packit 1c1d7e
      MemberNameIterator it(*mn);
Packit 1c1d7e
      MemberDef *md;
Packit 1c1d7e
      for (;(md=it.current());++it)
Packit 1c1d7e
      {
Packit 1c1d7e
	//printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n",
Packit 1c1d7e
	//    mn,md,
Packit 1c1d7e
	//    md->getBodyDef(),g_sourceFileDef);
Packit 1c1d7e
Packit 1c1d7e
	// in case there are multiple members we could link to, we 
Packit 1c1d7e
	// only link to members if defined in the same file or 
Packit 1c1d7e
	// defined as external.
Packit 1c1d7e
        if ((!md->isStatic() || md->getBodyDef()==g_sourceFileDef) &&
Packit 1c1d7e
	    (g_forceTagReference.isEmpty() || g_forceTagReference==md->getReference())
Packit 1c1d7e
	   )
Packit 1c1d7e
        {
Packit 1c1d7e
          g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
Packit 1c1d7e
	  //printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data());
Packit 1c1d7e
          return md;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
      return 0;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return 0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void updateCallContextForSmartPointer()
Packit 1c1d7e
{
Packit 1c1d7e
  Definition *d = g_theCallContext.getScope();
Packit 1c1d7e
  //printf("updateCallContextForSmartPointer() cd=%s\n",cd ? d->name().data() : "<none>");
Packit 1c1d7e
  MemberDef *md;
Packit 1c1d7e
  if (d && d->definitionType()==Definition::TypeClass && (md=((ClassDef*)d)->isSmartPointer()))
Packit 1c1d7e
  {
Packit 1c1d7e
    ClassDef *ncd = stripClassName(md->typeString(),md->getOuterScope());
Packit 1c1d7e
    if (ncd)
Packit 1c1d7e
    {
Packit 1c1d7e
      g_theCallContext.setScope(ncd);
Packit 1c1d7e
      //printf("Found smart pointer call %s->%s!\n",cd->name().data(),ncd->name().data());
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static bool getLinkInScope(const QCString &c,  // scope
Packit 1c1d7e
                           const QCString &m,  // member
Packit 1c1d7e
			   const char *memberText, // exact text
Packit 1c1d7e
			   CodeOutputInterface &ol,
Packit 1c1d7e
			   const char *text,
Packit 1c1d7e
			   bool varOnly=FALSE
Packit 1c1d7e
			  )
Packit 1c1d7e
{
Packit 1c1d7e
  MemberDef    *md;
Packit 1c1d7e
  ClassDef     *cd;
Packit 1c1d7e
  FileDef      *fd;
Packit 1c1d7e
  NamespaceDef *nd;
Packit 1c1d7e
  GroupDef     *gd;
Packit 1c1d7e
  DBG_CTX((stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly));
Packit 1c1d7e
  if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef,FALSE,g_forceTagReference) && 
Packit 1c1d7e
      (!varOnly || md->isVariable()))
Packit 1c1d7e
  {
Packit 1c1d7e
    if (md->isLinkable())
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("found it %s!\n",md->qualifiedName().data());
Packit 1c1d7e
      if (g_exampleBlock)
Packit 1c1d7e
      {
Packit 1c1d7e
        QCString anchor;
Packit 1c1d7e
        anchor.sprintf("a%d",g_anchorCount);
Packit 1c1d7e
        //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
Packit 1c1d7e
        //                                  g_exampleFile.data());
Packit 1c1d7e
        if (md->addExample(anchor,g_exampleName,g_exampleFile))
Packit 1c1d7e
        {
Packit 1c1d7e
          ol.writeCodeAnchor(anchor);
Packit 1c1d7e
          g_anchorCount++;
Packit 1c1d7e
        }
Packit 1c1d7e
      }
Packit 1c1d7e
Packit 1c1d7e
      Definition *d = md->getOuterScope()==Doxygen::globalScope ?
Packit 1c1d7e
        md->getFileDef() : md->getOuterScope();
Packit 1c1d7e
      if (md->getGroupDef()) d = md->getGroupDef();
Packit 1c1d7e
      if (d && d->isLinkable())
Packit 1c1d7e
      {
Packit 1c1d7e
        g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope()));
Packit 1c1d7e
        //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
Packit 1c1d7e
        //        g_currentDefinition,g_currentMemberDef,g_insideBody);
Packit 1c1d7e
Packit 1c1d7e
        if (g_currentDefinition && g_currentMemberDef &&
Packit 1c1d7e
            md!=g_currentMemberDef && g_insideBody && g_collectXRefs)
Packit 1c1d7e
        {
Packit 1c1d7e
          addDocCrossReference(g_currentMemberDef,md);
Packit 1c1d7e
        }
Packit 1c1d7e
        //printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
Packit 1c1d7e
Packit 1c1d7e
        writeMultiLineCodeLink(ol,md, text ? text : memberText);
Packit 1c1d7e
        addToSearchIndex(text ? text : memberText);
Packit 1c1d7e
        return TRUE;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else // found member, but is is not linkable, so make sure content inside is not assign
Packit 1c1d7e
         // to the previous member, see bug762760
Packit 1c1d7e
    {
Packit 1c1d7e
      DBG_CTX((stderr,"unlinkable member %s\n",md->name().data()));
Packit 1c1d7e
      g_currentMemberDef = 0;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static bool getLink(const char *className,
Packit 1c1d7e
                    const char *memberName,
Packit 1c1d7e
		    CodeOutputInterface &ol,
Packit 1c1d7e
		    const char *text=0,
Packit 1c1d7e
		    bool varOnly=FALSE)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("getLink(%s,%s) g_curClassName=%s\n",className,memberName,g_curClassName.data());
Packit 1c1d7e
  QCString m=removeRedundantWhiteSpace(memberName);
Packit 1c1d7e
  QCString c=className;
Packit 1c1d7e
  if (!getLinkInScope(c,m,memberName,ol,text,varOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!g_curClassName.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!c.isEmpty()) c.prepend("::");
Packit 1c1d7e
      c.prepend(g_curClassName);
Packit 1c1d7e
      return getLinkInScope(c,m,memberName,ol,text,varOnly);
Packit 1c1d7e
    }
Packit 1c1d7e
    return FALSE;
Packit 1c1d7e
  }
Packit 1c1d7e
  return TRUE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName,
Packit 1c1d7e
                                      bool typeOnly=FALSE,bool varOnly=FALSE)
Packit 1c1d7e
{
Packit 1c1d7e
  int i=0;
Packit 1c1d7e
  if (*clName=='~') // correct for matching negated values i.s.o. destructors.
Packit 1c1d7e
  {
Packit 1c1d7e
    g_code->codify("~");
Packit 1c1d7e
    clName++;
Packit 1c1d7e
  }
Packit 1c1d7e
  QCString className=clName;
Packit 1c1d7e
  if (className.isEmpty()) return;
Packit 1c1d7e
  if (g_insideProtocolList) // for Obj-C
Packit 1c1d7e
  {
Packit 1c1d7e
    className+="-p";
Packit 1c1d7e
  }
Packit 1c1d7e
  if (g_insidePHP)
Packit 1c1d7e
  {
Packit 1c1d7e
    className = substitute(className,"\\","::"); // for PHP namespaces
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (g_insideCS || g_insideJava)
Packit 1c1d7e
  {
Packit 1c1d7e
    className = substitute(className,".","::"); // for PHP namespaces
Packit 1c1d7e
  }
Packit 1c1d7e
  ClassDef *cd=0,*lcd=0;
Packit 1c1d7e
  MemberDef *md=0;
Packit 1c1d7e
  bool isLocal=FALSE;
Packit 1c1d7e
Packit 1c1d7e
  //printf("generateClassOrGlobalLink(className=%s)\n",className.data());
Packit 1c1d7e
  if (!g_prefixed_with_this_keyword || (lcd=g_theVarContext.findVariable(className))==0) // not a local variable
Packit 1c1d7e
  {
Packit 1c1d7e
    Definition *d = g_currentDefinition;
Packit 1c1d7e
    //printf("d=%s g_sourceFileDef=%s\n",d?d->name().data():"<none>",g_sourceFileDef?g_sourceFileDef->name().data():"<none>");
Packit 1c1d7e
    cd = getResolvedClass(d,g_sourceFileDef,className,&md);
Packit 1c1d7e
    DBG_CTX((stderr,"non-local variable name=%s context=%d cd=%s md=%s!\n",
Packit 1c1d7e
    className.data(),g_theVarContext.count(),cd?cd->name().data():"<none>",
Packit 1c1d7e
        md?md->name().data():"<none>"));
Packit 1c1d7e
    if (cd==0 && md==0 && (i=className.find('<'))!=-1)
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString bareName = className.left(i); //stripTemplateSpecifiersFromScope(className);
Packit 1c1d7e
      DBG_CTX((stderr,"bareName=%s\n",bareName.data()));
Packit 1c1d7e
      if (bareName!=className)
Packit 1c1d7e
      {
Packit 1c1d7e
	cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    NamespaceDef *nd = getResolvedNamespace(className);
Packit 1c1d7e
    if (nd)
Packit 1c1d7e
    {
Packit 1c1d7e
      g_theCallContext.setScope(nd);
Packit 1c1d7e
      addToSearchIndex(className);
Packit 1c1d7e
      writeMultiLineCodeLink(*g_code,nd,clName);
Packit 1c1d7e
      return;
Packit 1c1d7e
    }
Packit 1c1d7e
    //printf("md=%s\n",md?md->name().data():"<none>");
Packit 1c1d7e
    DBG_CTX((stderr,"is found as a type cd=%s nd=%s\n",
Packit 1c1d7e
          cd?cd->name().data():"<null>",
Packit 1c1d7e
          nd?nd->name().data():"<null>"));
Packit 1c1d7e
    if (cd==0 && md==0) // also see if it is variable or enum or enum value
Packit 1c1d7e
    {
Packit 1c1d7e
      if (getLink(g_classScope,clName,ol,clName,varOnly))
Packit 1c1d7e
      {
Packit 1c1d7e
	return;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("local variable!\n");
Packit 1c1d7e
    if (lcd!=VariableContext::dummyContext) 
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("non-dummy context lcd=%s!\n",lcd->name().data());
Packit 1c1d7e
      g_theCallContext.setScope(lcd);
Packit 1c1d7e
Packit 1c1d7e
      // to following is needed for links to a global variable, but is
Packit 1c1d7e
      // no good for a link to a local variable that is also a global symbol.
Packit 1c1d7e
       
Packit 1c1d7e
      //if (getLink(g_classScope,clName,ol,clName))
Packit 1c1d7e
      //{
Packit 1c1d7e
	//return;
Packit 1c1d7e
      //}
Packit 1c1d7e
    }
Packit 1c1d7e
    isLocal=TRUE;
Packit 1c1d7e
    DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
Packit 1c1d7e
  }
Packit 1c1d7e
  g_prefixed_with_this_keyword = FALSE; // discard the "this" prefix for the next calls
Packit 1c1d7e
Packit 1c1d7e
  if (cd && cd->isLinkable()) // is it a linkable class
Packit 1c1d7e
  {
Packit 1c1d7e
    DBG_CTX((stderr,"is linkable class %s\n",clName));
Packit 1c1d7e
    if (g_exampleBlock)
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString anchor;
Packit 1c1d7e
      anchor.sprintf("_a%d",g_anchorCount);
Packit 1c1d7e
      //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
Packit 1c1d7e
      //                                   g_exampleFile.data());
Packit 1c1d7e
      if (cd->addExample(anchor,g_exampleName,g_exampleFile))
Packit 1c1d7e
      {
Packit 1c1d7e
	ol.writeCodeAnchor(anchor);
Packit 1c1d7e
	g_anchorCount++;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    writeMultiLineCodeLink(ol,cd,clName);
Packit 1c1d7e
    addToSearchIndex(className);
Packit 1c1d7e
    g_theCallContext.setScope(cd);
Packit 1c1d7e
    if (md)
Packit 1c1d7e
    {
Packit 1c1d7e
      Definition *d = md->getOuterScope()==Doxygen::globalScope ?
Packit 1c1d7e
                      md->getFileDef() : md->getOuterScope();
Packit 1c1d7e
      if (md->getGroupDef()) d = md->getGroupDef();
Packit 1c1d7e
      if (d && d->isLinkable() && md->isLinkable() && 
Packit 1c1d7e
          g_currentMemberDef && g_collectXRefs)
Packit 1c1d7e
      {
Packit 1c1d7e
        addDocCrossReference(g_currentMemberDef,md);
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else // not a class, maybe a global member
Packit 1c1d7e
  {
Packit 1c1d7e
    DBG_CTX((stderr,"class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly));
Packit 1c1d7e
    if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
Packit 1c1d7e
    {
Packit 1c1d7e
      if (md==0) // not found as a typedef
Packit 1c1d7e
      {
Packit 1c1d7e
	md = setCallContextForVar(clName);
Packit 1c1d7e
	//printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
Packit 1c1d7e
	if (md && g_currentDefinition)
Packit 1c1d7e
	{
Packit 1c1d7e
	  DBG_CTX((stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
Packit 1c1d7e
	      md->name().data(),g_currentDefinition->name().data(),
Packit 1c1d7e
	      isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
Packit 1c1d7e
	      md->getOuterScope()->name().data()));
Packit 1c1d7e
	}
Packit 1c1d7e
	     
Packit 1c1d7e
        if (md && g_currentDefinition && 
Packit 1c1d7e
	    isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
Packit 1c1d7e
	{
Packit 1c1d7e
	  md=0; // variable not accessible
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
      if (md && (!varOnly || md->isVariable()))
Packit 1c1d7e
      {
Packit 1c1d7e
        DBG_CTX((stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable()));
Packit 1c1d7e
	if (md->isLinkable())
Packit 1c1d7e
	{
Packit 1c1d7e
	  QCString text;
Packit 1c1d7e
	  if (!g_forceTagReference.isEmpty()) // explicit reference to symbol in tag file
Packit 1c1d7e
	  {
Packit 1c1d7e
	    text=g_forceTagReference;
Packit 1c1d7e
	    if (text.right(4)==".tag") // strip .tag if present
Packit 1c1d7e
	    {
Packit 1c1d7e
	      text=text.left(text.length()-4);
Packit 1c1d7e
	    }
Packit 1c1d7e
	    text+=getLanguageSpecificSeparator(md->getLanguage());
Packit 1c1d7e
	    text+=clName;
Packit 1c1d7e
	    md->setName(text);
Packit 1c1d7e
	    md->setLocalName(text);
Packit 1c1d7e
	  }
Packit 1c1d7e
	  else // normal reference
Packit 1c1d7e
	  {
Packit 1c1d7e
	    text=clName;
Packit 1c1d7e
	  }
Packit 1c1d7e
	  writeMultiLineCodeLink(ol,md,text);
Packit 1c1d7e
          addToSearchIndex(clName);
Packit 1c1d7e
	  if (g_currentMemberDef && g_collectXRefs)
Packit 1c1d7e
	  {
Packit 1c1d7e
	    addDocCrossReference(g_currentMemberDef,md);
Packit 1c1d7e
	  }
Packit 1c1d7e
	  return;
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    
Packit 1c1d7e
    // nothing found, just write out the word
Packit 1c1d7e
    DBG_CTX((stderr,"not found!\n"));
Packit 1c1d7e
    codifyLines(clName);
Packit 1c1d7e
    addToSearchIndex(clName);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const char *memName)
Packit 1c1d7e
{
Packit 1c1d7e
  // extract class definition of the return type in order to resolve
Packit 1c1d7e
  // a->b()->c() like call chains
Packit 1c1d7e
Packit 1c1d7e
  //printf("type=`%s' args=`%s' class=%s\n",
Packit 1c1d7e
  //  xmd->typeString(),xmd->argsString(),
Packit 1c1d7e
  //  xmd->getClassDef()->name().data());
Packit 1c1d7e
Packit 1c1d7e
  if (g_exampleBlock)
Packit 1c1d7e
  {
Packit 1c1d7e
    QCString anchor;
Packit 1c1d7e
    anchor.sprintf("a%d",g_anchorCount);
Packit 1c1d7e
    //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
Packit 1c1d7e
    //                                  g_exampleFile.data());
Packit 1c1d7e
    if (xmd->addExample(anchor,g_exampleName,g_exampleFile))
Packit 1c1d7e
    {
Packit 1c1d7e
      ol.writeCodeAnchor(anchor);
Packit 1c1d7e
      g_anchorCount++;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope());
Packit 1c1d7e
  DBG_CTX((stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass));
Packit 1c1d7e
  g_theCallContext.setScope(typeClass);
Packit 1c1d7e
Packit 1c1d7e
  Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
Packit 1c1d7e
                   xmd->getFileDef() : xmd->getOuterScope();
Packit 1c1d7e
  if (xmd->getGroupDef()) xd = xmd->getGroupDef();
Packit 1c1d7e
  if (xd && xd->isLinkable())
Packit 1c1d7e
  {
Packit 1c1d7e
Packit 1c1d7e
    //printf("g_currentDefiniton=%p g_currentMemberDef=%p xmd=%p g_insideBody=%d\n",g_currentDefinition,g_currentMemberDef,xmd,g_insideBody);
Packit 1c1d7e
Packit 1c1d7e
    if (xmd->templateMaster()) xmd = xmd->templateMaster();
Packit 1c1d7e
Packit 1c1d7e
    if (xmd->isLinkable())
Packit 1c1d7e
    {
Packit 1c1d7e
      // add usage reference
Packit 1c1d7e
      if (g_currentDefinition && g_currentMemberDef &&
Packit 1c1d7e
	  /*xmd!=g_currentMemberDef &&*/ g_insideBody && g_collectXRefs)
Packit 1c1d7e
      {
Packit 1c1d7e
	addDocCrossReference(g_currentMemberDef,xmd);
Packit 1c1d7e
      }
Packit 1c1d7e
Packit 1c1d7e
      // write the actual link
Packit 1c1d7e
      writeMultiLineCodeLink(ol,xmd,memName);
Packit 1c1d7e
      addToSearchIndex(memName);
Packit 1c1d7e
      return TRUE;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static bool generateClassMemberLink(CodeOutputInterface &ol,Definition *def,const char *memName)
Packit 1c1d7e
{
Packit 1c1d7e
  if (def && def->definitionType()==Definition::TypeClass)
Packit 1c1d7e
  {
Packit 1c1d7e
    ClassDef *cd = (ClassDef*)def;
Packit 1c1d7e
    MemberDef *xmd = cd->getMemberByName(memName);
Packit 1c1d7e
    //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",def->name().data(),memName,xmd);
Packit 1c1d7e
    if (xmd)
Packit 1c1d7e
    {
Packit 1c1d7e
      return generateClassMemberLink(ol,xmd,memName);
Packit 1c1d7e
    }
Packit 1c1d7e
    else
Packit 1c1d7e
    {
Packit 1c1d7e
      Definition *innerDef = cd->findInnerCompound(memName);
Packit 1c1d7e
      if (innerDef)
Packit 1c1d7e
      {
Packit 1c1d7e
        g_theCallContext.setScope(innerDef);
Packit 1c1d7e
        addToSearchIndex(memName);
Packit 1c1d7e
        writeMultiLineCodeLink(*g_code,innerDef,memName);
Packit 1c1d7e
        return TRUE;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (def && def->definitionType()==Definition::TypeNamespace)
Packit 1c1d7e
  {
Packit 1c1d7e
    NamespaceDef *nd = (NamespaceDef*)def;
Packit 1c1d7e
    //printf("Looking for %s inside namespace %s\n",memName,nd->name().data());
Packit 1c1d7e
    Definition *innerDef = nd->findInnerCompound(memName);
Packit 1c1d7e
    if (innerDef)
Packit 1c1d7e
    {
Packit 1c1d7e
      g_theCallContext.setScope(innerDef);
Packit 1c1d7e
      addToSearchIndex(memName);
Packit 1c1d7e
      writeMultiLineCodeLink(*g_code,innerDef,memName);
Packit 1c1d7e
      return TRUE;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName,
Packit 1c1d7e
            char *memName)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n",
Packit 1c1d7e
  //    varName.data(),memName,g_classScope.data());
Packit 1c1d7e
Packit 1c1d7e
  if (varName.isEmpty()) return;
Packit 1c1d7e
Packit 1c1d7e
  // look for the variable in the current context
Packit 1c1d7e
  ClassDef *vcd = g_theVarContext.findVariable(varName);
Packit 1c1d7e
  if (vcd) 
Packit 1c1d7e
  {
Packit 1c1d7e
    if (vcd!=VariableContext::dummyContext)
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("Class found!\n");
Packit 1c1d7e
      if (getLink(vcd->name(),memName,ol)) 
Packit 1c1d7e
      {
Packit 1c1d7e
	//printf("Found result!\n");
Packit 1c1d7e
	return;
Packit 1c1d7e
      }
Packit 1c1d7e
      if (vcd->baseClasses())
Packit 1c1d7e
      {
Packit 1c1d7e
	BaseClassListIterator bcli(*vcd->baseClasses());
Packit 1c1d7e
	for ( ; bcli.current() ; ++bcli)
Packit 1c1d7e
	{
Packit 1c1d7e
	  if (getLink(bcli.current()->classDef->name(),memName,ol)) 
Packit 1c1d7e
	  {
Packit 1c1d7e
	    //printf("Found result!\n");
Packit 1c1d7e
	    return;
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  else // variable not in current context, maybe it is in a parent context
Packit 1c1d7e
  {
Packit 1c1d7e
    vcd = getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope);
Packit 1c1d7e
    if (vcd && vcd->isLinkable())
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("Found class %s for variable `%s'\n",g_classScope.data(),varName.data());
Packit 1c1d7e
      MemberName *vmn=Doxygen::memberNameSDict->find(varName);
Packit 1c1d7e
      if (vmn==0)
Packit 1c1d7e
      {
Packit 1c1d7e
	int vi;
Packit 1c1d7e
	QCString vn=varName;
Packit 1c1d7e
	if ((vi=vn.findRev("::"))!=-1 || (vi=vn.findRev('.'))!=-1)  // explicit scope A::b(), probably static member
Packit 1c1d7e
	{
Packit 1c1d7e
	  ClassDef *jcd = getClass(vn.left(vi));
Packit 1c1d7e
	  vn=vn.right(vn.length()-vi-2);
Packit 1c1d7e
	  vmn=Doxygen::memberNameSDict->find(vn);
Packit 1c1d7e
	  //printf("Trying name `%s' scope=%s\n",vn.data(),scope.data());
Packit 1c1d7e
	  if (vmn)
Packit 1c1d7e
	  {
Packit 1c1d7e
	    MemberNameIterator vmni(*vmn);
Packit 1c1d7e
	    MemberDef *vmd;
Packit 1c1d7e
	    for (;(vmd=vmni.current());++vmni)
Packit 1c1d7e
	    {
Packit 1c1d7e
	      if (/*(vmd->isVariable() || vmd->isFunction()) && */
Packit 1c1d7e
		  vmd->getClassDef()==jcd)
Packit 1c1d7e
	      {
Packit 1c1d7e
		//printf("Found variable type=%s\n",vmd->typeString());
Packit 1c1d7e
		ClassDef *mcd=stripClassName(vmd->typeString(),vmd->getOuterScope());
Packit 1c1d7e
		if (mcd && mcd->isLinkable())
Packit 1c1d7e
		{
Packit 1c1d7e
		  if (generateClassMemberLink(ol,mcd,memName)) return;
Packit 1c1d7e
		}
Packit 1c1d7e
	      }
Packit 1c1d7e
	    }
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
      if (vmn)
Packit 1c1d7e
      {
Packit 1c1d7e
	//printf("There is a variable with name `%s'\n",varName);
Packit 1c1d7e
	MemberNameIterator vmni(*vmn);
Packit 1c1d7e
	MemberDef *vmd;
Packit 1c1d7e
	for (;(vmd=vmni.current());++vmni)
Packit 1c1d7e
	{
Packit 1c1d7e
	  if (/*(vmd->isVariable() || vmd->isFunction()) && */
Packit 1c1d7e
	      vmd->getClassDef()==vcd)
Packit 1c1d7e
	  {
Packit 1c1d7e
	    //printf("Found variable type=%s\n",vmd->typeString());
Packit 1c1d7e
	    ClassDef *mcd=stripClassName(vmd->typeString(),vmd->getOuterScope());
Packit 1c1d7e
	    if (mcd && mcd->isLinkable())
Packit 1c1d7e
	    {
Packit 1c1d7e
	      if (generateClassMemberLink(ol,mcd,memName)) return;
Packit 1c1d7e
	    }
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  // nothing found -> write result as is
Packit 1c1d7e
  codifyLines(memName);
Packit 1c1d7e
  addToSearchIndex(memName);
Packit 1c1d7e
  return;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generatePHPVariableLink(CodeOutputInterface &ol,const char *varName)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString name = varName+7; // strip $this->
Packit 1c1d7e
  name.prepend("$");
Packit 1c1d7e
  //printf("generatePHPVariableLink(%s) name=%s scope=%s\n",varName,name.data(),g_classScope.data());
Packit 1c1d7e
  if (!getLink(g_classScope,name,ol,varName))
Packit 1c1d7e
  {
Packit 1c1d7e
    codifyLines(varName);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void generateFunctionLink(CodeOutputInterface &ol,const char *funcName)
Packit 1c1d7e
{
Packit 1c1d7e
  //CodeClassDef *ccd=0;
Packit 1c1d7e
  ClassDef *ccd=0;
Packit 1c1d7e
  QCString locScope=g_classScope;
Packit 1c1d7e
  QCString locFunc=removeRedundantWhiteSpace(funcName);
Packit 1c1d7e
  QCString funcScope;
Packit 1c1d7e
  QCString funcWithScope=locFunc;
Packit 1c1d7e
  QCString funcWithFullScope=locFunc;
Packit 1c1d7e
  QCString fullScope=locScope;
Packit 1c1d7e
  DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()));
Packit 1c1d7e
  int len=2;
Packit 1c1d7e
  int i=locFunc.findRev("::");
Packit 1c1d7e
  if (g_currentMemberDef && g_currentMemberDef->getClassDef() &&
Packit 1c1d7e
      funcName==g_currentMemberDef->localName() && 
Packit 1c1d7e
      g_currentMemberDef->getDefLine()==g_yyLineNr &&
Packit 1c1d7e
      generateClassMemberLink(ol,g_currentMemberDef,funcName)
Packit 1c1d7e
     )
Packit 1c1d7e
  {
Packit 1c1d7e
    // special case where funcName is the name of a method that is also
Packit 1c1d7e
    // defined on this line. In this case we can directly link to 
Packit 1c1d7e
    // g_currentMemberDef, which is not only faster, but
Packit 1c1d7e
    // in case of overloaded methods, this will make sure that we link to
Packit 1c1d7e
    // the correct method, and thereby get the correct reimplemented relations.
Packit 1c1d7e
    // See also bug 549022.
Packit 1c1d7e
    goto exit;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (i==-1) i=locFunc.findRev("."),len=1;
Packit 1c1d7e
  if (i==-1) i=locFunc.findRev("\\"),len=1; // for PHP
Packit 1c1d7e
  if (i>0)
Packit 1c1d7e
  {
Packit 1c1d7e
    funcScope=locFunc.left(i);
Packit 1c1d7e
    locFunc=locFunc.right(locFunc.length()-i-len).stripWhiteSpace();
Packit 1c1d7e
    int ts=locScope.find('<'); // start of template
Packit 1c1d7e
    int te=locScope.findRev('>'); // end of template
Packit 1c1d7e
    //printf("ts=%d te=%d\n",ts,te);
Packit 1c1d7e
    if (ts!=-1 && te!=-1 && te>ts)
Packit 1c1d7e
    {
Packit 1c1d7e
      // remove template from scope
Packit 1c1d7e
      locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1);
Packit 1c1d7e
    }
Packit 1c1d7e
    ts=funcScope.find('<'); // start of template
Packit 1c1d7e
    te=funcScope.findRev('>'); // end of template
Packit 1c1d7e
    //printf("ts=%d te=%d\n",ts,te);
Packit 1c1d7e
    if (ts!=-1 && te!=-1 && te>ts)
Packit 1c1d7e
    {
Packit 1c1d7e
      // remove template from scope
Packit 1c1d7e
      funcScope=funcScope.left(ts)+funcScope.right(funcScope.length()-te-1);
Packit 1c1d7e
    }
Packit 1c1d7e
    if (!funcScope.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      funcWithScope = funcScope+"::"+locFunc;
Packit 1c1d7e
      if (!locScope.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
        fullScope=locScope+"::"+funcScope;
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    if (!locScope.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      funcWithFullScope = locScope+"::"+funcWithScope;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!fullScope.isEmpty() && (ccd=g_codeClassSDict->find(fullScope)))
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("using classScope %s\n",g_classScope.data());
Packit 1c1d7e
    if (ccd->baseClasses())
Packit 1c1d7e
    {
Packit 1c1d7e
      BaseClassListIterator bcli(*ccd->baseClasses());
Packit 1c1d7e
      for ( ; bcli.current() ; ++bcli)
Packit 1c1d7e
      {
Packit 1c1d7e
	if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName)) 
Packit 1c1d7e
	{
Packit 1c1d7e
	  goto exit;
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!locScope.isEmpty() && fullScope!=locScope && (ccd=g_codeClassSDict->find(locScope)))
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("using classScope %s\n",g_classScope.data());
Packit 1c1d7e
    if (ccd->baseClasses())
Packit 1c1d7e
    {
Packit 1c1d7e
      BaseClassListIterator bcli(*ccd->baseClasses());
Packit 1c1d7e
      for ( ; bcli.current() ; ++bcli)
Packit 1c1d7e
      {
Packit 1c1d7e
	if (getLink(bcli.current()->classDef->name(),funcWithScope,ol,funcName)) 
Packit 1c1d7e
	{
Packit 1c1d7e
	  goto exit;
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (!getLink(locScope,funcWithScope,ol,funcName))
Packit 1c1d7e
  {
Packit 1c1d7e
    generateClassOrGlobalLink(ol,funcName);
Packit 1c1d7e
  }
Packit 1c1d7e
exit:  
Packit 1c1d7e
  g_forceTagReference.resize(0);
Packit 1c1d7e
  return;
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
  endFontClass();
Packit 1c1d7e
  g_code->startFontClass(s);
Packit 1c1d7e
  g_currentFontClass=s;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
// recursively writes a linkified Objective-C method call
Packit 1c1d7e
static void writeObjCMethodCall(ObjCCallCtx *ctx)
Packit 1c1d7e
{
Packit 1c1d7e
  if (ctx==0) return;
Packit 1c1d7e
  char c;
Packit 1c1d7e
  const char *p = ctx->format.data();
Packit 1c1d7e
  if (!ctx->methodName.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("writeObjCMethodCall(%s) obj=%s method=%s\n",
Packit 1c1d7e
    //    ctx->format.data(),ctx->objectTypeOrName.data(),ctx->methodName.data());
Packit 1c1d7e
    if (!ctx->objectTypeOrName.isEmpty() && ctx->objectTypeOrName.at(0)!='$')
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(),
Packit 1c1d7e
      //	ctx->methodName.data());
Packit 1c1d7e
      ClassDef *cd = g_theVarContext.findVariable(ctx->objectTypeOrName);
Packit 1c1d7e
      if (cd==0) // not a local variable
Packit 1c1d7e
      {
Packit 1c1d7e
	if (ctx->objectTypeOrName=="self")
Packit 1c1d7e
	{
Packit 1c1d7e
	  if (g_currentDefinition && 
Packit 1c1d7e
	      g_currentDefinition->definitionType()==Definition::TypeClass)
Packit 1c1d7e
	  {
Packit 1c1d7e
	    ctx->objectType = (ClassDef *)g_currentDefinition;
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
	else
Packit 1c1d7e
	{
Packit 1c1d7e
	  ctx->objectType = getResolvedClass(
Packit 1c1d7e
	      g_currentDefinition,
Packit 1c1d7e
	      g_sourceFileDef,
Packit 1c1d7e
	      ctx->objectTypeOrName,
Packit 1c1d7e
	      &ctx->method);
Packit 1c1d7e
	}
Packit 1c1d7e
	//printf("  object is class? %p\n",ctx->objectType);
Packit 1c1d7e
	if (ctx->objectType) // found class
Packit 1c1d7e
	{
Packit 1c1d7e
	  ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
Packit 1c1d7e
	  //printf("    yes->method=%s\n",ctx->method?ctx->method->name().data():"<none>");
Packit 1c1d7e
	}
Packit 1c1d7e
	else if (ctx->method==0) // search for class variable with the same name
Packit 1c1d7e
	{
Packit 1c1d7e
	  //printf("    no\n");
Packit 1c1d7e
	  //printf("g_currentDefinition=%p\n",g_currentDefinition);
Packit 1c1d7e
	  if (g_currentDefinition && 
Packit 1c1d7e
	      g_currentDefinition->definitionType()==Definition::TypeClass)
Packit 1c1d7e
	  {
Packit 1c1d7e
	    ctx->objectVar = ((ClassDef *)g_currentDefinition)->getMemberByName(ctx->objectTypeOrName);
Packit 1c1d7e
	    //printf("      ctx->objectVar=%p\n",ctx->objectVar);
Packit 1c1d7e
	    if (ctx->objectVar)
Packit 1c1d7e
	    {
Packit 1c1d7e
	      ctx->objectType = stripClassName(ctx->objectVar->typeString());
Packit 1c1d7e
	      //printf("        ctx->objectType=%p\n",ctx->objectType);
Packit 1c1d7e
	      if (ctx->objectType)
Packit 1c1d7e
	      {
Packit 1c1d7e
		ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
Packit 1c1d7e
		//printf("          ctx->method=%p\n",ctx->method);
Packit 1c1d7e
	      }
Packit 1c1d7e
	    }
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
      else // local variable
Packit 1c1d7e
      {
Packit 1c1d7e
	//printf("  object is local variable\n");
Packit 1c1d7e
	if (cd!=VariableContext::dummyContext)
Packit 1c1d7e
	{
Packit 1c1d7e
	  ctx->method = cd->getMemberByName(ctx->methodName);
Packit 1c1d7e
	  //printf("   class=%p method=%p\n",cd,ctx->method);
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  //printf("[");
Packit 1c1d7e
  while ((c=*p++)) // for each character in ctx->format
Packit 1c1d7e
  {
Packit 1c1d7e
    if (c=='$')
Packit 1c1d7e
    {
Packit 1c1d7e
      char nc=*p++;
Packit 1c1d7e
      if (nc=='$') // escaped $
Packit 1c1d7e
      {
Packit 1c1d7e
	g_code->codify("$");
Packit 1c1d7e
      }
Packit 1c1d7e
      else // name fragment or reference to a nested call 
Packit 1c1d7e
      {
Packit 1c1d7e
	if (nc=='n') // name fragment
Packit 1c1d7e
	{
Packit 1c1d7e
          nc=*p++;
Packit 1c1d7e
	  QCString refIdStr;
Packit 1c1d7e
	  while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
Packit 1c1d7e
	  p--;
Packit 1c1d7e
	  int refId=refIdStr.toInt();
Packit 1c1d7e
	  QCString *pName = g_nameDict.find(refId);
Packit 1c1d7e
	  if (pName)
Packit 1c1d7e
	  {
Packit 1c1d7e
	    if (ctx->method && ctx->method->isLinkable())
Packit 1c1d7e
	    {
Packit 1c1d7e
              writeMultiLineCodeLink(*g_code,ctx->method,pName->data());
Packit 1c1d7e
	      if (g_currentMemberDef && g_collectXRefs)
Packit 1c1d7e
	      {
Packit 1c1d7e
	        addDocCrossReference(g_currentMemberDef,ctx->method);
Packit 1c1d7e
	      }
Packit 1c1d7e
	    }
Packit 1c1d7e
	    else
Packit 1c1d7e
	    {
Packit 1c1d7e
   	      codifyLines(pName->data());
Packit 1c1d7e
	    }
Packit 1c1d7e
	  }
Packit 1c1d7e
	  else
Packit 1c1d7e
	  {
Packit 1c1d7e
	    //printf("Invalid name: id=%d\n",refId);
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
	else if (nc=='o') // reference to potential object name
Packit 1c1d7e
	{
Packit 1c1d7e
          nc=*p++;
Packit 1c1d7e
	  QCString refIdStr;
Packit 1c1d7e
	  while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
Packit 1c1d7e
	  p--;
Packit 1c1d7e
	  int refId=refIdStr.toInt();
Packit 1c1d7e
	  QCString *pObject = g_objectDict.find(refId);
Packit 1c1d7e
	  if (pObject)
Packit 1c1d7e
	  {
Packit 1c1d7e
	    if (*pObject=="self")
Packit 1c1d7e
	    {
Packit 1c1d7e
	      if (g_currentDefinition && 
Packit 1c1d7e
		  g_currentDefinition->definitionType()==Definition::TypeClass)
Packit 1c1d7e
	      {
Packit 1c1d7e
	        ctx->objectType = (ClassDef *)g_currentDefinition;
Packit 1c1d7e
	        if (ctx->objectType->categoryOf()) 
Packit 1c1d7e
	        {
Packit 1c1d7e
	          ctx->objectType = ctx->objectType->categoryOf();
Packit 1c1d7e
	        }
Packit 1c1d7e
	        if (ctx->objectType)
Packit 1c1d7e
	        {
Packit 1c1d7e
	          ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
Packit 1c1d7e
	        }
Packit 1c1d7e
	      }
Packit 1c1d7e
 	      startFontClass("keyword");
Packit 1c1d7e
              codifyLines(pObject->data());
Packit 1c1d7e
	      endFontClass();
Packit 1c1d7e
	    }
Packit 1c1d7e
	    else if (*pObject=="super")
Packit 1c1d7e
	    {
Packit 1c1d7e
	      if (g_currentDefinition &&
Packit 1c1d7e
		  g_currentDefinition->definitionType()==Definition::TypeClass)
Packit 1c1d7e
	      {
Packit 1c1d7e
		ClassDef *cd = (ClassDef *)g_currentDefinition;
Packit 1c1d7e
		if (cd->categoryOf()) 
Packit 1c1d7e
		{
Packit 1c1d7e
		  cd = cd->categoryOf();
Packit 1c1d7e
		}
Packit 1c1d7e
		BaseClassList *bcd = cd->baseClasses();
Packit 1c1d7e
		if (bcd) // get direct base class (there should be only one)
Packit 1c1d7e
		{
Packit 1c1d7e
		  BaseClassListIterator bli(*bcd);
Packit 1c1d7e
		  BaseClassDef *bclass;
Packit 1c1d7e
		  for (bli.toFirst();(bclass=bli.current());++bli)
Packit 1c1d7e
		  {
Packit 1c1d7e
		    if (bclass->classDef->compoundType()!=ClassDef::Protocol)
Packit 1c1d7e
		    {
Packit 1c1d7e
		      ctx->objectType = bclass->classDef;
Packit 1c1d7e
		      if (ctx->objectType)
Packit 1c1d7e
		      {
Packit 1c1d7e
			ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
Packit 1c1d7e
		      }
Packit 1c1d7e
		    }
Packit 1c1d7e
		  }
Packit 1c1d7e
		}
Packit 1c1d7e
	      }
Packit 1c1d7e
 	      startFontClass("keyword");
Packit 1c1d7e
              codifyLines(pObject->data());
Packit 1c1d7e
	      endFontClass();
Packit 1c1d7e
	    }
Packit 1c1d7e
	    else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
Packit 1c1d7e
	    {
Packit 1c1d7e
	      writeMultiLineCodeLink(*g_code,ctx->objectVar,pObject->data());
Packit 1c1d7e
	      if (g_currentMemberDef && g_collectXRefs)
Packit 1c1d7e
	      {
Packit 1c1d7e
	        addDocCrossReference(g_currentMemberDef,ctx->objectVar);
Packit 1c1d7e
	      }
Packit 1c1d7e
	    }
Packit 1c1d7e
	    else if (ctx->objectType && 
Packit 1c1d7e
		     ctx->objectType!=VariableContext::dummyContext && 
Packit 1c1d7e
		     ctx->objectType->isLinkable()
Packit 1c1d7e
		    ) // object is class name
Packit 1c1d7e
	    {
Packit 1c1d7e
	      ClassDef *cd = ctx->objectType;
Packit 1c1d7e
	      writeMultiLineCodeLink(*g_code,cd,pObject->data());
Packit 1c1d7e
	    }
Packit 1c1d7e
	    else // object still needs to be resolved
Packit 1c1d7e
	    {
Packit 1c1d7e
	      ClassDef *cd = getResolvedClass(g_currentDefinition, 
Packit 1c1d7e
		  g_sourceFileDef, *pObject);
Packit 1c1d7e
	      if (cd && cd->isLinkable())
Packit 1c1d7e
	      {
Packit 1c1d7e
		if (ctx->objectType==0) ctx->objectType=cd;
Packit 1c1d7e
	   	writeMultiLineCodeLink(*g_code,cd,pObject->data());
Packit 1c1d7e
	      }
Packit 1c1d7e
	      else
Packit 1c1d7e
	      {
Packit 1c1d7e
		codifyLines(pObject->data());
Packit 1c1d7e
	      }
Packit 1c1d7e
	    }
Packit 1c1d7e
	  }
Packit 1c1d7e
	  else
Packit 1c1d7e
	  {
Packit 1c1d7e
	    //printf("Invalid object: id=%d\n",refId);
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
	else if (nc=='c') // reference to nested call
Packit 1c1d7e
	{
Packit 1c1d7e
          nc=*p++;
Packit 1c1d7e
	  QCString refIdStr;
Packit 1c1d7e
	  while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
Packit 1c1d7e
	  p--;
Packit 1c1d7e
	  int refId=refIdStr.toInt();
Packit 1c1d7e
	  ObjCCallCtx *ictx = g_contextDict.find(refId);
Packit 1c1d7e
	  if (ictx) // recurse into nested call
Packit 1c1d7e
	  {
Packit 1c1d7e
	    writeObjCMethodCall(ictx);
Packit 1c1d7e
	    if (ictx->method) // link to nested call successfully
Packit 1c1d7e
	    {
Packit 1c1d7e
	      // get the ClassDef representing the method's return type
Packit 1c1d7e
	      if (QCString(ictx->method->typeString())=="id")
Packit 1c1d7e
	      {
Packit 1c1d7e
		// see if the method name is unique, if so we link to it
Packit 1c1d7e
		MemberName *mn=Doxygen::memberNameSDict->find(ctx->methodName);
Packit 1c1d7e
		//printf("mn->count=%d ictx->method=%s ctx->methodName=%s\n",
Packit 1c1d7e
		//    mn==0?-1:(int)mn->count(),
Packit 1c1d7e
		//    ictx->method->name().data(),
Packit 1c1d7e
		//    ctx->methodName.data());
Packit 1c1d7e
		if (mn && mn->count()==1) // member name unique
Packit 1c1d7e
		{
Packit 1c1d7e
		  ctx->method = mn->getFirst();
Packit 1c1d7e
		}
Packit 1c1d7e
	      } 
Packit 1c1d7e
	      else
Packit 1c1d7e
	      {
Packit 1c1d7e
		ctx->objectType = stripClassName(ictx->method->typeString());
Packit 1c1d7e
		if (ctx->objectType)
Packit 1c1d7e
		{
Packit 1c1d7e
		  ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
Packit 1c1d7e
		}
Packit 1c1d7e
	      }
Packit 1c1d7e
	      //printf("  ***** method=%s -> object=%p\n",ictx->method->name().data(),ctx->objectType);
Packit 1c1d7e
	    }
Packit 1c1d7e
	  }
Packit 1c1d7e
	  else
Packit 1c1d7e
	  {
Packit 1c1d7e
	    //printf("Invalid context: id=%d\n",refId);
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
	else if (nc=='w') // some word
Packit 1c1d7e
	{
Packit 1c1d7e
          nc=*p++;
Packit 1c1d7e
	  QCString refIdStr;
Packit 1c1d7e
	  while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
Packit 1c1d7e
	  p--;
Packit 1c1d7e
	  int refId=refIdStr.toInt();
Packit 1c1d7e
	  QCString *pWord = g_wordDict.find(refId);
Packit 1c1d7e
	  if (pWord)
Packit 1c1d7e
	  {
Packit 1c1d7e
            codifyLines(pWord->data());
Packit 1c1d7e
	  }
Packit 1c1d7e
	}
Packit 1c1d7e
        else if (nc=='d') // comment block
Packit 1c1d7e
        {
Packit 1c1d7e
          nc=*p++;
Packit 1c1d7e
	  QCString refIdStr;
Packit 1c1d7e
	  while (nc!=0 && isdigit(nc)) { refIdStr+=nc; nc=*p++; }
Packit 1c1d7e
	  p--;
Packit 1c1d7e
	  int refId=refIdStr.toInt();
Packit 1c1d7e
	  QCString *pComment = g_commentDict.find(refId);
Packit 1c1d7e
          if (pComment)
Packit 1c1d7e
          {
Packit 1c1d7e
            startFontClass("comment");
Packit 1c1d7e
	    codifyLines(pComment->data());
Packit 1c1d7e
	    endFontClass();
Packit 1c1d7e
          }
Packit 1c1d7e
        }
Packit 1c1d7e
	else // illegal marker
Packit 1c1d7e
	{
Packit 1c1d7e
	  ASSERT(!"invalid escape sequence");
Packit 1c1d7e
	}
Packit 1c1d7e
      }
Packit 1c1d7e
    }
Packit 1c1d7e
    else // normal non-marker character
Packit 1c1d7e
    {
Packit 1c1d7e
      char s[2];
Packit 1c1d7e
      s[0]=c;s[1]=0;
Packit 1c1d7e
      codifyLines(s);
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  //printf("%s %s]\n",ctx->objectTypeOrName.data(),ctx->methodName.data());
Packit 1c1d7e
  //printf("}=(type='%s',name='%s')",
Packit 1c1d7e
  //    ctx->objectTypeOrName.data(),
Packit 1c1d7e
  //    ctx->methodName.data());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
// Replaces an Objective-C method name fragment s by a marker of the form
Packit 1c1d7e
// $n12, the number (12) can later be used as a key for obtaining the name 
Packit 1c1d7e
// fragment, from g_nameDict
Packit 1c1d7e
static QCString escapeName(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString result;
Packit 1c1d7e
  result.sprintf("$n%d",g_currentNameId);
Packit 1c1d7e
  g_nameDict.insert(g_currentNameId,new QCString(s));
Packit 1c1d7e
  g_currentNameId++;
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString escapeObject(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString result;
Packit 1c1d7e
  result.sprintf("$o%d",g_currentObjId);
Packit 1c1d7e
  g_objectDict.insert(g_currentObjId,new QCString(s));
Packit 1c1d7e
  g_currentObjId++;
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString escapeWord(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString result;
Packit 1c1d7e
  result.sprintf("$w%d",g_currentWordId);
Packit 1c1d7e
  g_wordDict.insert(g_currentWordId,new QCString(s));
Packit 1c1d7e
  g_currentWordId++;
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString escapeComment(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString result;
Packit 1c1d7e
  result.sprintf("$d%d",g_currentCommentId);
Packit 1c1d7e
  g_commentDict.insert(g_currentCommentId,new QCString(s));
Packit 1c1d7e
  g_currentCommentId++;
Packit 1c1d7e
  return result;
Packit 1c1d7e
}
Packit 1c1d7e
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
B       [ \t]
Packit 1c1d7e
BN      [ \t\n\r]
Packit 1c1d7e
ID	"$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
Packit 1c1d7e
SEP     ("::"|"\\")
Packit 1c1d7e
SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
Packit 1c1d7e
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
Packit 1c1d7e
SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
Packit 1c1d7e
SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
Packit 1c1d7e
KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property")
Packit 1c1d7e
KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"set"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|"alignas"|"alignof"|{KEYWORD_OBJC})
Packit 1c1d7e
FLOWKW  ("break"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"return"|"switch"|"throw"|"throws"|"@catch"|"@finally")
Packit 1c1d7e
FLOWCONDITION  ("case"|"for"|"foreach"|"for each"|"goto"|"if"|"try"|"while"|"@try")
Packit 1c1d7e
TYPEKW  ("bool"|"char"|"double"|"float"|"int"|"long"|"object"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"size_t"|"boolean"|"id"|"SEL"|"string"|"nullptr")
Packit 1c1d7e
CASTKW ("const_cast"|"dynamic_cast"|"reinterpret_cast"|"static_cast")
Packit 1c1d7e
CHARLIT   (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
Packit 1c1d7e
ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++"
Packit 1c1d7e
ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
Packit 1c1d7e
LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
Packit 1c1d7e
BITOP   "&"|"|"|"^"|"<<"|">>"|"~"
Packit 1c1d7e
OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
Packit 1c1d7e
RAWBEGIN  (u|U|L|u8)?R\"[^ \t\(\)\\]{0,16}"("
Packit 1c1d7e
RAWEND    ")"[^ \t\(\)\\]{0,16}\"
Packit 1c1d7e
Packit 1c1d7e
%option noyywrap
Packit 1c1d7e
Packit 1c1d7e
%x      SkipString
Packit 1c1d7e
%x      SkipStringS
Packit 1c1d7e
%x      SkipVerbString
Packit 1c1d7e
%x	SkipCPP
Packit 1c1d7e
%x	SkipComment
Packit 1c1d7e
%x	SkipCxxComment
Packit 1c1d7e
%x	RemoveSpecialCComment
Packit 1c1d7e
%x	StripSpecialCComment
Packit 1c1d7e
%x	Body
Packit 1c1d7e
%x      FuncCall
Packit 1c1d7e
%x      MemberCall
Packit 1c1d7e
%x      MemberCall2
Packit 1c1d7e
%x      SkipInits
Packit 1c1d7e
%x      ClassName
Packit 1c1d7e
%x      AlignAs
Packit 1c1d7e
%x      AlignAsEnd
Packit 1c1d7e
%x      PackageName
Packit 1c1d7e
%x      ClassVar
Packit 1c1d7e
%x	CppCliTypeModifierFollowup
Packit 1c1d7e
%x      Bases
Packit 1c1d7e
%x      SkipSharp
Packit 1c1d7e
%x      ReadInclude
Packit 1c1d7e
%x      TemplDecl
Packit 1c1d7e
%x      TemplCast
Packit 1c1d7e
%x	CallEnd
Packit 1c1d7e
%x      ObjCMethod
Packit 1c1d7e
%x	ObjCParams
Packit 1c1d7e
%x	ObjCParamType
Packit 1c1d7e
%x      ObjCCall
Packit 1c1d7e
%x      ObjCMName
Packit 1c1d7e
%x      ObjCSkipStr
Packit 1c1d7e
%x      ObjCCallComment
Packit 1c1d7e
%x      OldStyleArgs
Packit 1c1d7e
%x	UsingName
Packit 1c1d7e
%x      RawString
Packit 1c1d7e
%x      InlineInit
Packit 1c1d7e
Packit 1c1d7e
%%
Packit 1c1d7e
Packit 1c1d7e
<*>\x0d
Packit 1c1d7e
<Body>^([ \t]*"#"[ \t]*("include"|"import")[ \t]*)("<"|"\"") {
Packit 1c1d7e
  					  startFontClass("preprocessor");
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
  					  BEGIN( ReadInclude ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ { 
Packit 1c1d7e
                                          g_insideObjC=TRUE;
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  if (!g_insideTemplate) 
Packit 1c1d7e
					    BEGIN( ClassName ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>(("public"|"private"){B}+)?("ref"|"value"|"interface"|"enum"){B}+("class"|"struct") {
Packit 1c1d7e
  					  if (g_insideTemplate) REJECT;
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  BEGIN( ClassName ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>"property"|"event"/{BN}*			{ 
Packit 1c1d7e
  					  if (g_insideTemplate) REJECT;
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>(KEYWORD_CPPCLI_DATATYPE|("partial"{B}+)?"class"|"struct"|"union"|"namespace"|"interface"){B}+ { 
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  if (!g_insideTemplate) 
Packit 1c1d7e
					    BEGIN( ClassName ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>("package")[ \t\n]+ 		{ 
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  BEGIN( PackageName ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<ClassVar>\n				{
Packit 1c1d7e
  					  if (!g_insideObjC) REJECT;
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  BEGIN(Body);
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body,ClassVar,Bases>"-"|"+"		{
Packit 1c1d7e
					  if (!g_insideObjC || g_insideBody)
Packit 1c1d7e
					  { 
Packit 1c1d7e
  					    g_code->codify(yytext);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else // Start of Objective-C method
Packit 1c1d7e
					  {
Packit 1c1d7e
					    //printf("Method!\n");
Packit 1c1d7e
  					    g_code->codify(yytext);
Packit 1c1d7e
					    BEGIN(ObjCMethod);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCMethod>":"				{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  BEGIN(ObjCParams);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCParams>"("				{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  BEGIN(ObjCParamType);
Packit 1c1d7e
					}
Packit 1c1d7e
<ObjCParams,ObjCMethod>";"|"{"		{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  if (*yytext=='{')
Packit 1c1d7e
					  {
Packit 1c1d7e
  					    if (g_searchingForBody)
Packit 1c1d7e
					    {
Packit 1c1d7e
					      g_searchingForBody=FALSE;
Packit 1c1d7e
					      g_insideBody=TRUE;
Packit 1c1d7e
					    }
Packit 1c1d7e
					    if (g_insideBody) g_bodyCurlyCount++;
Packit 1c1d7e
					    if (!g_curClassName.isEmpty()) // valid class name
Packit 1c1d7e
					    {
Packit 1c1d7e
					      pushScope(g_curClassName);
Packit 1c1d7e
                                              DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
Packit 1c1d7e
  					      g_scopeStack.push(SCOPEBLOCK);
Packit 1c1d7e
					    }
Packit 1c1d7e
					  }
Packit 1c1d7e
                                          g_type.resize(0);
Packit 1c1d7e
                                          g_name.resize(0);
Packit 1c1d7e
					  BEGIN(Body);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCParams>{ID}{B}*":"			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCParamType>{TYPEKW} 		{
Packit 1c1d7e
  					  startFontClass("keywordtype");
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  g_parmType=yytext;
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCParamType>{ID}			{
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
  					  g_parmType=yytext;
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCParamType>")"			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  BEGIN(ObjCParams);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCParams>{ID}			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  g_parmName=yytext;
Packit 1c1d7e
					  g_theVarContext.addVariable(g_parmType,g_parmName);
Packit 1c1d7e
					  g_parmType.resize(0);g_parmName.resize(0);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCMethod,ObjCParams,ObjCParamType>{ID} {
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCMethod,ObjCParams,ObjCParamType>.	{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCMethod,ObjCParams,ObjCParamType>\n	{
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ReadInclude>[^\n\"\>]+/(">"|"\"")  	{
Packit 1c1d7e
					  //FileInfo *f;
Packit 1c1d7e
					  bool ambig;
Packit 1c1d7e
					  bool found=FALSE;
Packit 1c1d7e
					  //QCString absPath = yytext;
Packit 1c1d7e
					  //if (g_sourceFileDef && QDir::isRelativePath(absPath))
Packit 1c1d7e
					  //{
Packit 1c1d7e
					  //  absPath = QDir::cleanDirPath(g_sourceFileDef->getPath()+"/"+absPath);
Packit 1c1d7e
					  //}
Packit 1c1d7e
Packit 1c1d7e
                                          FileDef *fd=findFileDef(Doxygen::inputNameDict,yytext,ambig);
Packit 1c1d7e
					  //printf("looking for include %s -> %s fd=%p\n",yytext,absPath.data(),fd);
Packit 1c1d7e
					  if (fd && fd->isLinkable())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    if (ambig) // multiple input files match the name
Packit 1c1d7e
					    {
Packit 1c1d7e
					      //printf("===== yes %s is ambiguous\n",yytext);
Packit 1c1d7e
					      QCString name = QDir::cleanDirPath(yytext).utf8();
Packit 1c1d7e
					      if (!name.isEmpty() && g_sourceFileDef)
Packit 1c1d7e
					      {
Packit 1c1d7e
					        FileName *fn = Doxygen::inputNameDict->find(name);
Packit 1c1d7e
						if (fn)
Packit 1c1d7e
						{
Packit 1c1d7e
						  FileNameIterator fni(*fn);
Packit 1c1d7e
						  // for each include name
Packit 1c1d7e
						  for (fni.toFirst();!found && (fd=fni.current());++fni)
Packit 1c1d7e
						  {
Packit 1c1d7e
						    // see if this source file actually includes the file
Packit 1c1d7e
						    found = g_sourceFileDef->isIncluded(fd->absFilePath());
Packit 1c1d7e
						    //printf("      include file %s found=%d\n",fd->absFilePath().data(),found);
Packit 1c1d7e
						  }
Packit 1c1d7e
						}
Packit 1c1d7e
					      }
Packit 1c1d7e
					    }
Packit 1c1d7e
					    else // not ambiguous
Packit 1c1d7e
					    {
Packit 1c1d7e
					      found = TRUE;
Packit 1c1d7e
					    }
Packit 1c1d7e
					  }
Packit 1c1d7e
					  //printf("      include file %s found=%d\n",fd ? fd->absFilePath().data() : "<none>",found);
Packit 1c1d7e
					  if (found)
Packit 1c1d7e
					  {
Packit 1c1d7e
	   	                            writeMultiLineCodeLink(*g_code,fd,yytext);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_code->codify(yytext);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  char c=yyinput();
Packit 1c1d7e
					  QCString text;
Packit 1c1d7e
					  text+=c;
Packit 1c1d7e
					  g_code->codify(text);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  BEGIN( Body );
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body,Bases>^[ \t]*"#"			{ 
Packit 1c1d7e
  					  startFontClass("preprocessor");
Packit 1c1d7e
					  g_lastSkipCppContext = YY_START;
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  BEGIN( SkipCPP ) ; 
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipCPP>.				{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipCPP>[^\n\/\\]+			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipCPP>\\[\r]?\n			{ 
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipCPP>"//"				{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<Body,FuncCall>"{"			{ 
Packit 1c1d7e
                                          g_theVarContext.pushScope();
Packit 1c1d7e
Packit 1c1d7e
                                          DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
Packit 1c1d7e
  					  g_scopeStack.push(INNERBLOCK);
Packit 1c1d7e
Packit 1c1d7e
  					  if (g_searchingForBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_searchingForBody=FALSE;
Packit 1c1d7e
					    g_insideBody=TRUE;
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  if (g_insideBody) 
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_bodyCurlyCount++;
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_type.resize(0); 
Packit 1c1d7e
					  g_name.resize(0);
Packit 1c1d7e
					  BEGIN( Body );
Packit 1c1d7e
					}
Packit 1c1d7e
<Body,FuncCall,MemberCall,MemberCall2>"}"  { 
Packit 1c1d7e
                                          g_theVarContext.popScope();
Packit 1c1d7e
  					  g_type.resize(0); 
Packit 1c1d7e
					  g_name.resize(0);
Packit 1c1d7e
Packit 1c1d7e
					  int *scope = g_scopeStack.pop();
Packit 1c1d7e
                                          DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
Packit 1c1d7e
  					  if (scope==SCOPEBLOCK || scope==CLASSBLOCK) 
Packit 1c1d7e
					  {
Packit 1c1d7e
					    popScope();
Packit 1c1d7e
					  }
Packit 1c1d7e
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
Packit 1c1d7e
					  DBG_CTX((stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount));
Packit 1c1d7e
					  if (--g_bodyCurlyCount<=0)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_insideBody=FALSE;
Packit 1c1d7e
					    g_currentMemberDef=0;
Packit 1c1d7e
					    if (g_currentDefinition) 
Packit 1c1d7e
					      g_currentDefinition=g_currentDefinition->getOuterScope();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  BEGIN(Body);
Packit 1c1d7e
					}
Packit 1c1d7e
<Body,ClassVar>"@end"			{ 
Packit 1c1d7e
  					  //printf("End of objc scope fd=%s\n",g_sourceFileDef->name().data());
Packit 1c1d7e
                                          if (g_sourceFileDef)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    FileDef *fd=g_sourceFileDef;
Packit 1c1d7e
                                            g_insideObjC = fd->name().lower().right(2)==".m" || 
Packit 1c1d7e
                                                           fd->name().lower().right(3)==".mm"; 
Packit 1c1d7e
					    //printf("insideObjC=%d\n",g_insideObjC);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_insideObjC = FALSE;
Packit 1c1d7e
					  }
Packit 1c1d7e
					  if (g_insideBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
                                            g_theVarContext.popScope();
Packit 1c1d7e
Packit 1c1d7e
					    int *scope = g_scopeStack.pop();
Packit 1c1d7e
                                            DBG_CTX((stderr,"** scope stack pop SCOPEBLOCK=%d\n",scope==SCOPEBLOCK));
Packit 1c1d7e
  					    if (scope==SCOPEBLOCK || scope==CLASSBLOCK) 
Packit 1c1d7e
					    {
Packit 1c1d7e
					      popScope();
Packit 1c1d7e
					    }
Packit 1c1d7e
					    g_insideBody=FALSE;
Packit 1c1d7e
					  }
Packit 1c1d7e
Packit 1c1d7e
					  startFontClass("keyword");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
Packit 1c1d7e
					  g_currentMemberDef=0;
Packit 1c1d7e
					  if (g_currentDefinition) 
Packit 1c1d7e
					    g_currentDefinition=g_currentDefinition->getOuterScope();
Packit 1c1d7e
					  BEGIN(Body);
Packit 1c1d7e
					}
Packit 1c1d7e
<ClassName,ClassVar>";"			{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_searchingForBody=FALSE; 
Packit 1c1d7e
  					  BEGIN( Body ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<ClassName,ClassVar>[*&^%]+       	{
Packit 1c1d7e
  					  g_type=g_curClassName.copy();
Packit 1c1d7e
  					  g_name.resize(0);
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
					  BEGIN( Body ); // variable of type struct *
Packit 1c1d7e
					}
Packit 1c1d7e
<ClassName>"__declspec"{B}*"("{B}*{ID}{B}*")"	{
Packit 1c1d7e
					  startFontClass("keyword");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					}
Packit 1c1d7e
<ClassName>{ID}("::"{ID})*	        {
Packit 1c1d7e
                                          g_curClassName=yytext;
Packit 1c1d7e
					  addType();
Packit 1c1d7e
                                          if (g_curClassName=="alignas")
Packit 1c1d7e
                                          {
Packit 1c1d7e
  					    startFontClass("keyword");
Packit 1c1d7e
					    g_code->codify(yytext);
Packit 1c1d7e
                                            endFontClass();
Packit 1c1d7e
                                            BEGIN( AlignAs );
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                          else
Packit 1c1d7e
                                          {
Packit 1c1d7e
					    generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					    BEGIN( ClassVar );
Packit 1c1d7e
                                          }
Packit 1c1d7e
					}
Packit 1c1d7e
<AlignAs>"("                            { 
Packit 1c1d7e
                                          g_bracketCount=1;
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
                                          BEGIN( AlignAsEnd );
Packit 1c1d7e
                                        }
Packit 1c1d7e
<AlignAs>\n                             { g_yyLineNr++; 
Packit 1c1d7e
                                          codifyLines(yytext);
Packit 1c1d7e
                                        }
Packit 1c1d7e
<AlignAs>.                              { g_code->codify(yytext); }
Packit 1c1d7e
<AlignAsEnd>"("                         { g_code->codify(yytext);
Packit 1c1d7e
                                          g_bracketCount++; 
Packit 1c1d7e
                                        }
Packit 1c1d7e
<AlignAsEnd>")"                         { 
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          if (--g_bracketCount<=0)
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            BEGIN(ClassName);
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                        }
Packit 1c1d7e
<AlignAsEnd>\n                          { g_yyLineNr++; 
Packit 1c1d7e
                                          codifyLines(yytext); 
Packit 1c1d7e
                                        }
Packit 1c1d7e
<AlignAsEnd>.                           { g_code->codify(yytext); }
Packit 1c1d7e
<ClassName>{ID}("\\"{ID})*		{ // PHP namespace
Packit 1c1d7e
                                          g_curClassName=substitute(yytext,"\\","::");
Packit 1c1d7e
  					  g_scopeStack.push(CLASSBLOCK);
Packit 1c1d7e
					  pushScope(g_curClassName);
Packit 1c1d7e
					  addType();
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					  BEGIN( ClassVar );
Packit 1c1d7e
  					}
Packit 1c1d7e
<ClassName>{ID}{B}*"("{ID}")"           { // Obj-C category
Packit 1c1d7e
                                          g_curClassName=removeRedundantWhiteSpace(yytext);
Packit 1c1d7e
  					  g_scopeStack.push(CLASSBLOCK);
Packit 1c1d7e
					  pushScope(g_curClassName);
Packit 1c1d7e
					  addType();
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					  BEGIN( ClassVar );
Packit 1c1d7e
                                        }
Packit 1c1d7e
<PackageName>{ID}("."{ID})*		{
Packit 1c1d7e
					  g_curClassName=substitute(yytext,".","::");
Packit 1c1d7e
					  //printf("found package: %s\n",g_curClassName.data());
Packit 1c1d7e
					  addType();
Packit 1c1d7e
					  codifyLines(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ClassVar>"="				{
Packit 1c1d7e
					  unput(*yytext);
Packit 1c1d7e
					  BEGIN( Body );
Packit 1c1d7e
  					}
Packit 1c1d7e
<ClassVar>("extends"|"implements")	{ // Java
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  g_curClassBases.clear();
Packit 1c1d7e
  					  BEGIN( Bases ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<ClassVar>("sealed"|"abstract")/{BN}*(":"|"{") {
Packit 1c1d7e
					  DBG_CTX((stderr,"***** C++/CLI modifier %s on g_curClassName=%s\n",yytext,g_curClassName.data()));
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  BEGIN( CppCliTypeModifierFollowup ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<ClassVar>{ID}				{
Packit 1c1d7e
  					  g_type = g_curClassName.copy();
Packit 1c1d7e
					  g_name = yytext;
Packit 1c1d7e
					  if (g_insideBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_theVarContext.addVariable(g_type,g_name);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*":"{B}*	{
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  g_curClassBases.clear();
Packit 1c1d7e
  					  BEGIN( Bases ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<PackageName>[ \t]*";"			|
Packit 1c1d7e
<Bases>^{B}*/"@"{ID}                    | // Objective-C interface
Packit 1c1d7e
<Bases,ClassName,ClassVar,CppCliTypeModifierFollowup>{B}*"{"{B}* {
Packit 1c1d7e
                                          g_theVarContext.pushScope();
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  if (YY_START==ClassVar && g_curClassName.isEmpty())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_curClassName = g_name.copy();
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  if (g_searchingForBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_searchingForBody=FALSE;
Packit 1c1d7e
					    g_insideBody=TRUE;
Packit 1c1d7e
					  }
Packit 1c1d7e
					  if (g_insideBody) g_bodyCurlyCount++;
Packit 1c1d7e
					  if (!g_curClassName.isEmpty()) // valid class name
Packit 1c1d7e
					  {
Packit 1c1d7e
                                            DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
Packit 1c1d7e
  					    g_scopeStack.push(CLASSBLOCK);
Packit 1c1d7e
					    pushScope(g_curClassName);
Packit 1c1d7e
					    DBG_CTX((stderr,"***** g_curClassName=%s\n",g_curClassName.data()));
Packit 1c1d7e
					    if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0)
Packit 1c1d7e
					    {
Packit 1c1d7e
					      DBG_CTX((stderr,"Adding new class %s\n",g_curClassName.data()));
Packit 1c1d7e
					      ClassDef *ncd=new ClassDef("",1,1,
Packit 1c1d7e
				 		  g_curClassName,ClassDef::Class,0,0,FALSE);
Packit 1c1d7e
					      g_codeClassSDict->append(g_curClassName,ncd);
Packit 1c1d7e
					      // insert base classes.
Packit 1c1d7e
					      char *s=g_curClassBases.first();
Packit 1c1d7e
					      while (s)
Packit 1c1d7e
					      {
Packit 1c1d7e
						ClassDef *bcd;
Packit 1c1d7e
						bcd=g_codeClassSDict->find(s);
Packit 1c1d7e
						if (bcd==0) bcd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
Packit 1c1d7e
						if (bcd && bcd!=ncd)
Packit 1c1d7e
						{
Packit 1c1d7e
						  ncd->insertBaseClass(bcd,s,Public,Normal);
Packit 1c1d7e
						}
Packit 1c1d7e
						s=g_curClassBases.next();
Packit 1c1d7e
					      }
Packit 1c1d7e
					    }
Packit 1c1d7e
					    //printf("g_codeClassList.count()=%d\n",g_codeClassList.count());
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else // not a class name -> assume inner block
Packit 1c1d7e
					  {
Packit 1c1d7e
                                            DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
Packit 1c1d7e
  					    g_scopeStack.push(INNERBLOCK);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_curClassName.resize(0);
Packit 1c1d7e
					  g_curClassBases.clear();
Packit 1c1d7e
					  BEGIN( Body );
Packit 1c1d7e
 					}
Packit 1c1d7e
<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" { 
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					}
Packit 1c1d7e
<Bases>{SEP}?({ID}{SEP})*{ID}           { 
Packit 1c1d7e
					  DBG_CTX((stderr,"%s:addBase(%s)\n",g_curClassName.data(),yytext));
Packit 1c1d7e
  					  g_curClassBases.inSort(yytext); 
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<Bases>"<"                              { 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  if (!g_insideObjC)
Packit 1c1d7e
					  {
Packit 1c1d7e
  					    g_sharpCount=1;
Packit 1c1d7e
					    BEGIN ( SkipSharp );
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_insideProtocolList=TRUE;
Packit 1c1d7e
					  }
Packit 1c1d7e
					}
Packit 1c1d7e
<Bases>">"				{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_insideProtocolList=FALSE;
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipSharp>"<"                          {
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  ++g_sharpCount; 
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipSharp>">"                          { 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  if (--g_sharpCount<=0)
Packit 1c1d7e
					  BEGIN ( Bases );
Packit 1c1d7e
					}
Packit 1c1d7e
<Bases>"("                              {
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          g_sharpCount=1;
Packit 1c1d7e
                                          BEGIN ( SkipSharp );
Packit 1c1d7e
                                        }
Packit 1c1d7e
<SkipSharp>"("                          {
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          ++g_sharpCount;
Packit 1c1d7e
                                        }
Packit 1c1d7e
<SkipSharp>")"                          {
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          if (--g_sharpCount<=0)
Packit 1c1d7e
                                            BEGIN ( Bases );
Packit 1c1d7e
                                        }
Packit 1c1d7e
      
Packit 1c1d7e
      
Packit 1c1d7e
<Bases>","                              { 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
  					
Packit 1c1d7e
Packit 1c1d7e
<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" {
Packit 1c1d7e
  					  addType();
Packit 1c1d7e
					  generateFunctionLink(*g_code,yytext);
Packit 1c1d7e
  					  g_bracketCount=0;
Packit 1c1d7e
					  g_args.resize(0);
Packit 1c1d7e
  					  g_name+=yytext; 
Packit 1c1d7e
  					  BEGIN( FuncCall );
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>{SCOPEPREFIX}?"operator"/"("      {
Packit 1c1d7e
  					  addType();
Packit 1c1d7e
					  generateFunctionLink(*g_code,yytext);
Packit 1c1d7e
  					  g_bracketCount=0;
Packit 1c1d7e
					  g_args.resize(0);
Packit 1c1d7e
  					  g_name+=yytext; 
Packit 1c1d7e
  					  BEGIN( FuncCall );
Packit 1c1d7e
                                        }
Packit 1c1d7e
<Body>{SCOPEPREFIX}?"operator"[^a-z_A-Z0-9\(\n]+/"(" {
Packit 1c1d7e
  					  addType();
Packit 1c1d7e
					  generateFunctionLink(*g_code,yytext);
Packit 1c1d7e
  					  g_bracketCount=0;
Packit 1c1d7e
					  g_args.resize(0);
Packit 1c1d7e
  					  g_name+=yytext; 
Packit 1c1d7e
  					  BEGIN( FuncCall );
Packit 1c1d7e
					}
Packit 1c1d7e
<Body,TemplDecl>("template"|"generic")/([^a-zA-Z0-9])		{
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  g_insideTemplate=TRUE;
Packit 1c1d7e
					  g_sharpCount=0;
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>"using"{BN}+"namespace"{BN}+	{
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  BEGIN(UsingName);
Packit 1c1d7e
  					}
Packit 1c1d7e
<UsingName>{ID}("::"{ID})*		{ addUsingDirective(yytext);
Packit 1c1d7e
 					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
                                          DBG_CTX((stderr,"** scope stack push CLASSBLOCK\n"));
Packit 1c1d7e
  					  g_scopeStack.push(CLASSBLOCK);
Packit 1c1d7e
					  pushScope(yytext);
Packit 1c1d7e
					  BEGIN(Body);
Packit 1c1d7e
                                        }
Packit 1c1d7e
<UsingName>\n				{ codifyLines(yytext); BEGIN(Body); }
Packit 1c1d7e
<UsingName>.				{ codifyLines(yytext); BEGIN(Body); }
Packit 1c1d7e
<Body,FuncCall>"$"?"this"("->"|".")	{ g_code->codify(yytext); // this-> for C++, this. for C#
Packit 1c1d7e
					  g_prefixed_with_this_keyword = TRUE;
Packit 1c1d7e
                                        }
Packit 1c1d7e
<Body>{KEYWORD}/([^a-z_A-Z0-9]) 	{
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  if (QCString(yytext)=="typedef")
Packit 1c1d7e
					  {
Packit 1c1d7e
					    addType();
Packit 1c1d7e
  					    g_name+=yytext; 
Packit 1c1d7e
					  }
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>{KEYWORD}/{B}* 			{
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>{KEYWORD}/{BN}*"(" 		{
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  				          g_name.resize(0);g_type.resize(0);
Packit 1c1d7e
  					}
Packit 1c1d7e
<FuncCall>"in"/{BN}*			{
Packit 1c1d7e
					  if (!g_inForEachExpression) REJECT;
Packit 1c1d7e
  					  startFontClass("keywordflow");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  // insert the variable in the parent scope, see bug 546158
Packit 1c1d7e
					  g_theVarContext.popScope();
Packit 1c1d7e
					  g_theVarContext.addVariable(g_parmType,g_parmName);
Packit 1c1d7e
					  g_theVarContext.pushScope();
Packit 1c1d7e
  				          g_name.resize(0);g_type.resize(0);
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>{FLOWKW}/{BN}*"(" 			{
Packit 1c1d7e
  					  startFontClass("keywordflow");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  				          g_name.resize(0);g_type.resize(0);
Packit 1c1d7e
					  g_inForEachExpression = (qstrcmp(yytext,"for each")==0 || qstrcmp(yytext, "foreach")==0);
Packit 1c1d7e
					  BEGIN(FuncCall);
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>{FLOWCONDITION}/{BN}*"("          {
Packit 1c1d7e
                                          if (g_currentMemberDef && g_currentMemberDef->isFunction())
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            g_currentMemberDef->addFlowKeyWord();
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                          startFontClass("keywordflow");
Packit 1c1d7e
                                          codifyLines(yytext);
Packit 1c1d7e
                                          endFontClass();
Packit 1c1d7e
                                          g_name.resize(0);g_type.resize(0);
Packit 1c1d7e
                                          g_inForEachExpression = (strcmp(yytext,"for each")==0 || strcmp(yytext, "foreach")==0);
Packit 1c1d7e
                                          BEGIN(FuncCall);
Packit 1c1d7e
                                        }
Packit 1c1d7e
<Body>{FLOWKW}/([^a-z_A-Z0-9]) 		{
Packit 1c1d7e
  					  startFontClass("keywordflow");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  if (g_inFunctionTryBlock && (qstrcmp(yytext,"catch")==0 || qstrcmp(yytext,"finally")==0))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_inFunctionTryBlock=FALSE;
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>{FLOWCONDITION}/([^a-z_A-Z0-9]) 	{
Packit 1c1d7e
                                          if (g_currentMemberDef && g_currentMemberDef->isFunction())
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            g_currentMemberDef->addFlowKeyWord();
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                          startFontClass("keywordflow");
Packit 1c1d7e
                                          codifyLines(yytext);
Packit 1c1d7e
                                          endFontClass();
Packit 1c1d7e
                                          if (g_inFunctionTryBlock && (strcmp(yytext,"catch")==0 || strcmp(yytext,"finally")==0))
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            g_inFunctionTryBlock=FALSE;
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                        }
Packit 1c1d7e
<Body>{FLOWKW}/{B}* 			{
Packit 1c1d7e
  					  startFontClass("keywordflow");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>{FLOWCONDITION}/{B}*              {
Packit 1c1d7e
                                          if (g_currentMemberDef && g_currentMemberDef->isFunction())
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            g_currentMemberDef->addFlowKeyWord();
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                          startFontClass("keywordflow");
Packit 1c1d7e
                                          codifyLines(yytext);
Packit 1c1d7e
                                          endFontClass();
Packit 1c1d7e
                                        }
Packit 1c1d7e
<Body>"*"{B}*")"                        { // end of cast?
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_theCallContext.popScope();
Packit 1c1d7e
					  g_bracketCount--;
Packit 1c1d7e
                                          g_parmType = g_name;
Packit 1c1d7e
					  BEGIN(FuncCall);
Packit 1c1d7e
                                        }
Packit 1c1d7e
<Body>[\\|\)\+\-\/\%\~\!]		{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  				          g_name.resize(0);g_type.resize(0);
Packit 1c1d7e
					  if (*yytext==')')
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_theCallContext.popScope();
Packit 1c1d7e
					    g_bracketCount--;
Packit 1c1d7e
					    BEGIN(FuncCall);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body,TemplDecl,ObjCMethod>{TYPEKW}/{B}* {
Packit 1c1d7e
  					  startFontClass("keywordtype");
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  addType();
Packit 1c1d7e
  					  g_name+=yytext; 
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>"generic"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* {
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  g_sharpCount=0;
Packit 1c1d7e
					  BEGIN(TemplDecl);
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>"template"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { // template<...>
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  g_sharpCount=0;
Packit 1c1d7e
					  BEGIN(TemplDecl);
Packit 1c1d7e
                                        }
Packit 1c1d7e
<TemplDecl>"class"|"typename"		{
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					}
Packit 1c1d7e
<TemplDecl>"<"				{
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          g_sharpCount++;
Packit 1c1d7e
  					}
Packit 1c1d7e
<TemplDecl>">"				{
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          g_sharpCount--;
Packit 1c1d7e
					  if (g_sharpCount<=0)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    BEGIN(Body);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<TemplCast>">"				{
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  BEGIN( g_lastTemplCastContext );
Packit 1c1d7e
  					}
Packit 1c1d7e
<TemplCast>{ID}("::"{ID})*		{
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<TemplCast>("const"|"volatile"){B}*	{
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					}
Packit 1c1d7e
<TemplCast>[*^]*			{
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<Body,FuncCall>{CASTKW}"<"                { // static_cast<T>(
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
                                          g_lastTemplCastContext = YY_START;
Packit 1c1d7e
					  BEGIN(TemplCast);
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>"$this->"{SCOPENAME}/{BN}*[;,)\]] { // PHP member variable
Packit 1c1d7e
					  addType();
Packit 1c1d7e
					  generatePHPVariableLink(*g_code,yytext);
Packit 1c1d7e
  					  g_name+=yytext+7; 
Packit 1c1d7e
                                        }
Packit 1c1d7e
<Body,TemplCast>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"("::"{ID})*/{B}* { // A<T> *pt;
Packit 1c1d7e
					  int i=QCString(yytext).find('<');
Packit 1c1d7e
					  QCString kw = QCString(yytext).left(i).stripWhiteSpace();
Packit 1c1d7e
					  if (kw.right(5)=="_cast" && YY_START==Body)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    REJECT;
Packit 1c1d7e
					  }
Packit 1c1d7e
					  addType();
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
  					  g_name+=yytext; 
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>{SCOPENAME}/{BN}*[:;,)\]]		{ // "int var;" or "var, var2" or "debug(f) macro" , or int var : 5;
Packit 1c1d7e
					  addType();
Packit 1c1d7e
					  // changed this to generateFunctionLink, see bug 624514
Packit 1c1d7e
					  //generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE);
Packit 1c1d7e
					  generateFunctionLink(*g_code,yytext);
Packit 1c1d7e
  					  g_name+=yytext; 
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>{SCOPENAME}/{B}* 			{ // p->func()
Packit 1c1d7e
					  addType();
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
  					  g_name+=yytext; 
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>"("{B}*("*"{B}*)+{SCOPENAME}*{B}*")"/{B}*	{  // (*p)->func() but not "if (p) ..."
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
					  int s=0;while (s<(int)yyleng && !isId(yytext[s])) s++;
Packit 1c1d7e
                                          int e=(int)yyleng-1;while (e>=0 && !isId(yytext[e])) e--;
Packit 1c1d7e
					  QCString varname = ((QCString)yytext).mid(s,e-s+1); 
Packit 1c1d7e
					  addType();
Packit 1c1d7e
  					  g_name=varname; 
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>{SCOPETNAME}/{BN}*"("		{ // a() or c::a() or t<A,B>::a() or A\B\foo()
Packit 1c1d7e
  					  addType();
Packit 1c1d7e
					  generateFunctionLink(*g_code,yytext);
Packit 1c1d7e
  					  g_bracketCount=0;
Packit 1c1d7e
					  g_args.resize(0);
Packit 1c1d7e
  					  g_name+=yytext; 
Packit 1c1d7e
  					  BEGIN( FuncCall );
Packit 1c1d7e
					}
Packit 1c1d7e
<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>{RAWBEGIN}	{
Packit 1c1d7e
                                          QCString text=yytext;
Packit 1c1d7e
                                          int i=text.find('R');
Packit 1c1d7e
                                          g_code->codify(text.left(i+1));
Packit 1c1d7e
					  startFontClass("stringliteral");
Packit 1c1d7e
  					  g_code->codify(yytext+i+1);
Packit 1c1d7e
  					  g_lastStringContext=YY_START;
Packit 1c1d7e
					  g_inForEachExpression = FALSE;
Packit 1c1d7e
                                          g_delimiter = yytext+i+2;
Packit 1c1d7e
                                          g_delimiter=g_delimiter.left(g_delimiter.length()-1);
Packit 1c1d7e
  					  BEGIN( RawString );
Packit 1c1d7e
                                        }
Packit 1c1d7e
<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\"	{
Packit 1c1d7e
					  startFontClass("stringliteral");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  g_lastStringContext=YY_START;
Packit 1c1d7e
					  g_inForEachExpression = FALSE;
Packit 1c1d7e
  					  BEGIN( SkipString );
Packit 1c1d7e
  					}
Packit 1c1d7e
<FuncCall,Body,MemberCall,MemberCall2,SkipInits,InlineInit>\'	{
Packit 1c1d7e
					  startFontClass("stringliteral");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  g_lastStringContext=YY_START;
Packit 1c1d7e
					  g_inForEachExpression = FALSE;
Packit 1c1d7e
  					  BEGIN( SkipStringS );
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipString>[^\"\\\r\n]*		{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipStringS>[^\'\\\r\n]*		{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipString,SkipStringS>"//"|"/*"	{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipString>@?\"			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  BEGIN( g_lastStringContext );
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipStringS>\'				{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  BEGIN( g_lastStringContext );
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipString,SkipStringS>\\.		{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<RawString>{RAWEND}                     { 
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          QCString delimiter = yytext+1;
Packit 1c1d7e
                                          delimiter=delimiter.left(delimiter.length()-1);
Packit 1c1d7e
                                          if (delimiter==g_delimiter)
Packit 1c1d7e
                                          {
Packit 1c1d7e
					    BEGIN( g_lastStringContext );
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                        }
Packit 1c1d7e
<RawString>[^)\n]+                      { g_code->codify(yytext); }
Packit 1c1d7e
<RawString>.                            { g_code->codify(yytext); }
Packit 1c1d7e
<RawString>\n                           { codifyLines(yytext); }
Packit 1c1d7e
<SkipVerbString>[^"\n]+			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipVerbString>\"\"			{ // escaped quote
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipVerbString>\"			{ // end of string
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  BEGIN( g_lastVerbStringContext );
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipVerbString>.			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipVerbString>\n			{
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>":"				{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  g_name.resize(0);g_type.resize(0);
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>"<"				{
Packit 1c1d7e
  					  if (g_insideTemplate)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_sharpCount++;
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>">"				{
Packit 1c1d7e
  					  if (g_insideTemplate)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    if (--g_sharpCount<=0)
Packit 1c1d7e
					    {
Packit 1c1d7e
					      g_insideTemplate=FALSE;
Packit 1c1d7e
					    }
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'"	{
Packit 1c1d7e
  					  startFontClass("charliteral"); 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>"."|"->"				{ 
Packit 1c1d7e
  				          if (yytext[0]=='-') // -> could be overloaded
Packit 1c1d7e
					  {
Packit 1c1d7e
					    updateCallContextForSmartPointer();
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_memCallContext = YY_START;
Packit 1c1d7e
  					  BEGIN( MemberCall ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall>{SCOPETNAME}/{BN}*"(" 	{
Packit 1c1d7e
					  if (g_theCallContext.getScope())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext))
Packit 1c1d7e
					    {
Packit 1c1d7e
					      g_code->codify(yytext);
Packit 1c1d7e
					      addToSearchIndex(yytext);
Packit 1c1d7e
					    }
Packit 1c1d7e
  					    g_name.resize(0);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
  					    g_code->codify(yytext);
Packit 1c1d7e
					    addToSearchIndex(yytext);
Packit 1c1d7e
  					    g_name.resize(0);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_type.resize(0);
Packit 1c1d7e
					  g_bracketCount=0;
Packit 1c1d7e
					  if (g_memCallContext==Body)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    BEGIN(FuncCall);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    BEGIN(g_memCallContext);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<MemberCall>{SCOPENAME}/{B}*		{
Packit 1c1d7e
					  if (g_theCallContext.getScope())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getScope()));
Packit 1c1d7e
					    if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext))
Packit 1c1d7e
					    {
Packit 1c1d7e
					      g_code->codify(yytext);
Packit 1c1d7e
					      addToSearchIndex(yytext);
Packit 1c1d7e
					    }
Packit 1c1d7e
  					    g_name.resize(0);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    DBG_CTX((stderr,"no class context!\n"));
Packit 1c1d7e
  					    g_code->codify(yytext);
Packit 1c1d7e
					    addToSearchIndex(yytext);
Packit 1c1d7e
  					    g_name.resize(0);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_type.resize(0);
Packit 1c1d7e
  					  BEGIN(g_memCallContext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<Body>[,=;\[]				{
Packit 1c1d7e
					  if (g_insideObjC && *yytext=='[')
Packit 1c1d7e
					  {
Packit 1c1d7e
					    //printf("Found start of ObjC call!\n");
Packit 1c1d7e
					    // start of a method call
Packit 1c1d7e
					    g_contextDict.setAutoDelete(TRUE);
Packit 1c1d7e
					    g_nameDict.setAutoDelete(TRUE);
Packit 1c1d7e
					    g_objectDict.setAutoDelete(TRUE);
Packit 1c1d7e
					    g_wordDict.setAutoDelete(TRUE);
Packit 1c1d7e
                                            g_commentDict.setAutoDelete(TRUE);
Packit 1c1d7e
					    g_contextDict.clear();
Packit 1c1d7e
					    g_nameDict.clear();
Packit 1c1d7e
					    g_objectDict.clear();
Packit 1c1d7e
					    g_wordDict.clear();
Packit 1c1d7e
                                            g_commentDict.clear();
Packit 1c1d7e
					    g_currentCtxId  = 0;
Packit 1c1d7e
					    g_currentNameId  = 0;
Packit 1c1d7e
					    g_currentObjId  = 0;
Packit 1c1d7e
					    g_currentCtx = 0;
Packit 1c1d7e
					    g_braceCount = 0;
Packit 1c1d7e
					    unput('[');
Packit 1c1d7e
					    BEGIN(ObjCCall);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_code->codify(yytext);
Packit 1c1d7e
					    g_saveName = g_name.copy();
Packit 1c1d7e
					    g_saveType = g_type.copy();
Packit 1c1d7e
					    if (*yytext!='[' && !g_type.isEmpty()) 
Packit 1c1d7e
					    {
Packit 1c1d7e
					      //printf("g_scopeStack.bottom()=%p\n",g_scopeStack.bottom());
Packit 1c1d7e
					      //if (g_scopeStack.top()!=CLASSBLOCK) // commented out for bug731363
Packit 1c1d7e
					      {
Packit 1c1d7e
						//printf("AddVariable: '%s' '%s' context=%d\n",
Packit 1c1d7e
						//    g_type.data(),g_name.data(),g_theVarContext.count());
Packit 1c1d7e
					        g_theVarContext.addVariable(g_type,g_name);
Packit 1c1d7e
					      }
Packit 1c1d7e
					      g_name.resize(0);
Packit 1c1d7e
					    }
Packit 1c1d7e
					    if (*yytext==';' || *yytext=='=') 
Packit 1c1d7e
					    {
Packit 1c1d7e
					      g_type.resize(0);
Packit 1c1d7e
					      g_name.resize(0);
Packit 1c1d7e
					    }
Packit 1c1d7e
					    else if (*yytext=='[')
Packit 1c1d7e
					    {
Packit 1c1d7e
					      g_theCallContext.pushScope();
Packit 1c1d7e
					    }
Packit 1c1d7e
					    g_args.resize(0);
Packit 1c1d7e
                                            g_parmType.resize(0);
Packit 1c1d7e
                                            g_parmName.resize(0);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
  /*
Packit 1c1d7e
<ObjCMemberCall>{ID}			{
Packit 1c1d7e
  					  if (qstrcmp(yytext,"self")==0 || qstrcmp(yytext,"super")==0)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    // TODO: get proper base class for "super"
Packit 1c1d7e
					    g_theCallContext.setClass(getClass(g_curClassName));
Packit 1c1d7e
					    startFontClass("keyword");
Packit 1c1d7e
					    g_code->codify(yytext); 
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_name.resize(0);
Packit 1c1d7e
					  BEGIN(ObjCMemberCall2);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCMemberCall>"["			{
Packit 1c1d7e
					    g_code->codify(yytext);
Packit 1c1d7e
					    g_theCallContext.pushScope();
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCMemberCall2>{ID}":"?		{
Packit 1c1d7e
  					  g_name+=yytext;
Packit 1c1d7e
					  if (g_theCallContext.getClass())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    //printf("Calling method %s\n",g_name.data());
Packit 1c1d7e
					    if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),g_name))
Packit 1c1d7e
					    {
Packit 1c1d7e
  					      g_code->codify(yytext);
Packit 1c1d7e
					      addToSearchIndex(g_name);
Packit 1c1d7e
					    }
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
  					    g_code->codify(yytext);
Packit 1c1d7e
					    addToSearchIndex(g_name);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_name.resize(0);
Packit 1c1d7e
					  BEGIN(ObjCMemberCall3);
Packit 1c1d7e
  					}
Packit 1c1d7e
<ObjCMemberCall2,ObjCMemberCall3>"]"	{
Packit 1c1d7e
					  g_theCallContext.popScope();
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  BEGIN(Body);
Packit 1c1d7e
  					}
Packit 1c1d7e
  */
Packit 1c1d7e
<ObjCCall,ObjCMName>"["|"{"       {
Packit 1c1d7e
                                    saveObjCContext();
Packit 1c1d7e
			            g_currentCtx->format+=*yytext;
Packit 1c1d7e
			            BEGIN(ObjCCall);
Packit 1c1d7e
		                    //printf("open\n");
Packit 1c1d7e
                                  }
Packit 1c1d7e
<ObjCCall,ObjCMName>"]"|"}"       {
Packit 1c1d7e
			            g_currentCtx->format+=*yytext;
Packit 1c1d7e
                                    restoreObjCContext();
Packit 1c1d7e
			            BEGIN(ObjCMName);
Packit 1c1d7e
		             	    if (g_currentCtx==0)
Packit 1c1d7e
				    {
Packit 1c1d7e
				      // end of call
Packit 1c1d7e
				      writeObjCMethodCall(g_contextDict.find(0));
Packit 1c1d7e
				      BEGIN(Body);
Packit 1c1d7e
				    }
Packit 1c1d7e
			            //printf("close\n");
Packit 1c1d7e
                                  }
Packit 1c1d7e
<ObjCCall,ObjCMName>"//".*        {
Packit 1c1d7e
                                    g_currentCtx->format+=escapeComment(yytext);
Packit 1c1d7e
                                  }
Packit 1c1d7e
<ObjCCall,ObjCMName>"/*"          {
Packit 1c1d7e
                                    g_lastObjCCallContext = YY_START;
Packit 1c1d7e
                                    g_currentCtx->comment=yytext;
Packit 1c1d7e
                                    BEGIN(ObjCCallComment);
Packit 1c1d7e
                                  }
Packit 1c1d7e
<ObjCCallComment>"*/"		  {
Packit 1c1d7e
                                    g_currentCtx->comment+=yytext;
Packit 1c1d7e
                                    g_currentCtx->format+=escapeComment(g_currentCtx->comment);
Packit 1c1d7e
  			  	    BEGIN(g_lastObjCCallContext);
Packit 1c1d7e
				  }
Packit 1c1d7e
<ObjCCallComment>[^*\n]+          { g_currentCtx->comment+=yytext; }
Packit 1c1d7e
<ObjCCallComment>"//"|"/*"        { g_currentCtx->comment+=yytext; }
Packit 1c1d7e
<ObjCCallComment>\n               { g_currentCtx->comment+=*yytext; }
Packit 1c1d7e
<ObjCCallComment>.                { g_currentCtx->comment+=*yytext; }
Packit 1c1d7e
<ObjCCall>{ID}	                  {
Packit 1c1d7e
                                    g_currentCtx->format+=escapeObject(yytext);
Packit 1c1d7e
			            if (g_braceCount==0)
Packit 1c1d7e
			            {
Packit 1c1d7e
			              g_currentCtx->objectTypeOrName=yytext;
Packit 1c1d7e
                                      //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
Packit 1c1d7e
			              BEGIN(ObjCMName);
Packit 1c1d7e
			            }
Packit 1c1d7e
  		                  }
Packit 1c1d7e
<ObjCMName>{ID}/{BN}*"]"          { 
Packit 1c1d7e
                                    if (g_braceCount==0 && 
Packit 1c1d7e
					g_currentCtx->methodName.isEmpty())
Packit 1c1d7e
                                    {
Packit 1c1d7e
			              g_currentCtx->methodName=yytext; 
Packit 1c1d7e
                                      g_currentCtx->format+=escapeName(yytext);
Packit 1c1d7e
			            }
Packit 1c1d7e
				    else
Packit 1c1d7e
				    {
Packit 1c1d7e
                                      g_currentCtx->format+=escapeWord(yytext);
Packit 1c1d7e
				    }
Packit 1c1d7e
                                  }
Packit 1c1d7e
<ObjCMName>{ID}/{BN}*":"           { 
Packit 1c1d7e
                                     if (g_braceCount==0)
Packit 1c1d7e
                                     {
Packit 1c1d7e
			               g_currentCtx->methodName+=yytext;
Packit 1c1d7e
                                       g_currentCtx->methodName+=":";
Packit 1c1d7e
			             }
Packit 1c1d7e
                                     g_currentCtx->format+=escapeName(yytext);
Packit 1c1d7e
                                   }
Packit 1c1d7e
<ObjCSkipStr>[^\n\"$\\]*           { g_currentCtx->format+=yytext; }
Packit 1c1d7e
<ObjCSkipStr>\\.	           { g_currentCtx->format+=yytext; }
Packit 1c1d7e
<ObjCSkipStr>"\""	           { g_currentCtx->format+=yytext; 
Packit 1c1d7e
                                      BEGIN(g_lastStringContext); 
Packit 1c1d7e
                                   }
Packit 1c1d7e
<ObjCCall,ObjCMName>{CHARLIT}      { g_currentCtx->format+=yytext; }
Packit 1c1d7e
<ObjCCall,ObjCMName>"@"?"\""       { g_currentCtx->format+=yytext; 
Packit 1c1d7e
                                      g_lastStringContext=YY_START;
Packit 1c1d7e
                                      BEGIN(ObjCSkipStr); 
Packit 1c1d7e
                                   }
Packit 1c1d7e
<ObjCCall,ObjCMName,ObjCSkipStr>"$" { g_currentCtx->format+="$$"; }
Packit 1c1d7e
<ObjCCall,ObjCMName>"("            { g_currentCtx->format+=*yytext; g_braceCount++; }
Packit 1c1d7e
<ObjCCall,ObjCMName>")"            { g_currentCtx->format+=*yytext; g_braceCount--; }
Packit 1c1d7e
<ObjCSkipStr>"@"/"\""		   { // needed to prevent matching the global rule (for C#)
Packit 1c1d7e
                                     g_currentCtx->format+=yytext;
Packit 1c1d7e
                                   }
Packit 1c1d7e
<ObjCCall,ObjCMName,ObjCSkipStr>{ID} { g_currentCtx->format+=escapeWord(yytext); }
Packit 1c1d7e
<ObjCCall,ObjCMName,ObjCSkipStr>.  { g_currentCtx->format+=*yytext; }
Packit 1c1d7e
<ObjCCall,ObjCMName,ObjCSkipStr>\n { g_currentCtx->format+=*yytext; }
Packit 1c1d7e
Packit 1c1d7e
<Body>"]"				{
Packit 1c1d7e
					  g_theCallContext.popScope();
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  // TODO: nested arrays like: a[b[0]->func()]->func()
Packit 1c1d7e
					  g_name = g_saveName.copy();
Packit 1c1d7e
					  g_type = g_saveType.copy();
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>[0-9]+				{
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<Body>[0-9]+[xX][0-9A-Fa-f]+		{
Packit 1c1d7e
					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) {
Packit 1c1d7e
					  //addParmType();
Packit 1c1d7e
					  //g_parmName=yytext; 
Packit 1c1d7e
  					  startFontClass("keyword");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall2,FuncCall,OldStyleArgs,TemplCast>{TYPEKW}/([^a-z_A-Z0-9]) {
Packit 1c1d7e
					  addParmType();
Packit 1c1d7e
					  g_parmName=yytext; 
Packit 1c1d7e
  					  startFontClass("keywordtype");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) {
Packit 1c1d7e
					  addParmType();
Packit 1c1d7e
					  g_parmName=yytext; 
Packit 1c1d7e
  					  startFontClass("keywordflow");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall2,FuncCall>{FLOWCONDITION}/([^a-z_A-Z0-9]) {
Packit 1c1d7e
                                          if (g_currentMemberDef && g_currentMemberDef->isFunction())
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            g_currentMemberDef->addFlowKeyWord();
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                          addParmType();
Packit 1c1d7e
                                          g_parmName=yytext;
Packit 1c1d7e
                                          startFontClass("keywordflow");
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          endFontClass();
Packit 1c1d7e
                                        }
Packit 1c1d7e
<MemberCall2,FuncCall>{ID}(({B}*"<"[^\n\[\](){}<>]*">")?({B}*"::"{B}*{ID})?)* {
Packit 1c1d7e
					  addParmType();
Packit 1c1d7e
					  g_parmName=yytext; 
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
Packit 1c1d7e
					}
Packit 1c1d7e
<FuncCall>";"				{ // probably a cast, not a function call
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_inForEachExpression = FALSE;
Packit 1c1d7e
					  BEGIN( Body );
Packit 1c1d7e
  					}
Packit 1c1d7e
<MemberCall2,FuncCall>,			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_theVarContext.addVariable(g_parmType,g_parmName);
Packit 1c1d7e
					  g_parmType.resize(0);g_parmName.resize(0);
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall2,FuncCall>"{"		{
Packit 1c1d7e
                                          if (g_bracketCount>0)
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            g_code->codify(yytext);
Packit 1c1d7e
                                            g_skipInlineInitContext=YY_START;
Packit 1c1d7e
                                            g_curlyCount=0;
Packit 1c1d7e
                                            BEGIN(InlineInit);
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                          else
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            REJECT;
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                        }
Packit 1c1d7e
<InlineInit>"{"                         { g_curlyCount++;
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                        }
Packit 1c1d7e
<InlineInit>"}"                         {
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                          if (--g_curlyCount<=0)
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            BEGIN(g_skipInlineInitContext);
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                        }
Packit 1c1d7e
<InlineInit>\n                          {
Packit 1c1d7e
                                          codifyLines(yytext);
Packit 1c1d7e
                                        }
Packit 1c1d7e
<InlineInit>.                           {
Packit 1c1d7e
                                          g_code->codify(yytext);
Packit 1c1d7e
                                        }
Packit 1c1d7e
<MemberCall2,FuncCall>"("		{
Packit 1c1d7e
					  g_parmType.resize(0);g_parmName.resize(0);
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  g_bracketCount++; 
Packit 1c1d7e
					  g_theCallContext.pushScope();
Packit 1c1d7e
					  if (YY_START==FuncCall && !g_insideBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_theVarContext.pushScope();
Packit 1c1d7e
					  }
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall2,FuncCall>{OPERATOR}        { // operator
Packit 1c1d7e
  					  if (qstrcmp(yytext,"*") && 
Packit 1c1d7e
					      qstrcmp(yytext,"&") &&
Packit 1c1d7e
					      qstrcmp(yytext,"^") &&
Packit 1c1d7e
					      qstrcmp(yytext,"%")) // typically a pointer or reference
Packit 1c1d7e
					  {
Packit 1c1d7e
					    // not a * or &, or C++/CLI's ^ or %
Packit 1c1d7e
					    g_parmType.resize(0);g_parmName.resize(0);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<MemberCall,MemberCall2,FuncCall>("*"{B}*)?")"	{ 
Packit 1c1d7e
                                          if (yytext[0]==')') // no a pointer cast
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            //printf("addVariable(%s,%s)\n",g_parmType.data(),g_parmName.data());
Packit 1c1d7e
                                            if (g_parmType.isEmpty())
Packit 1c1d7e
                                            {
Packit 1c1d7e
                                              g_parmType=g_parmName;
Packit 1c1d7e
                                              g_parmName.resize(0);
Packit 1c1d7e
                                            }
Packit 1c1d7e
					    g_theVarContext.addVariable(g_parmType,g_parmName);
Packit 1c1d7e
                                          }
Packit 1c1d7e
                                          else
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            g_parmType = g_parmName;
Packit 1c1d7e
                                            g_parmName.resize(0);
Packit 1c1d7e
					    g_theVarContext.addVariable(g_parmType,g_parmName);
Packit 1c1d7e
                                          }
Packit 1c1d7e
					  g_theCallContext.popScope();
Packit 1c1d7e
					  g_inForEachExpression = FALSE;
Packit 1c1d7e
					  //g_theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b().
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  if (--g_bracketCount<=0) 
Packit 1c1d7e
					  {
Packit 1c1d7e
					    if (g_name.isEmpty())
Packit 1c1d7e
					    {
Packit 1c1d7e
					      BEGIN( Body );
Packit 1c1d7e
					    }
Packit 1c1d7e
					    else
Packit 1c1d7e
					    {
Packit 1c1d7e
					      BEGIN( CallEnd ); 
Packit 1c1d7e
					    }
Packit 1c1d7e
					  }
Packit 1c1d7e
					}
Packit 1c1d7e
<CallEnd>[ \t\n]*			{ codifyLines(yytext); }
Packit 1c1d7e
  /*
Packit 1c1d7e
<MemberCall2,FuncCall>")"[ \t\n]*[;:]	{
Packit 1c1d7e
  */
Packit 1c1d7e
<CallEnd>[;:]				{
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
  					  g_bracketCount=0;
Packit 1c1d7e
					  if (*yytext==';') g_searchingForBody=FALSE; 
Packit 1c1d7e
					  if (!g_type.isEmpty())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    DBG_CTX((stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data()));
Packit 1c1d7e
					    g_theVarContext.addVariable(g_type,g_name);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_parmType.resize(0);g_parmName.resize(0);
Packit 1c1d7e
					  g_theCallContext.setScope(0);
Packit 1c1d7e
  					  if (*yytext==';' || g_insideBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    if (!g_insideBody)
Packit 1c1d7e
					    {
Packit 1c1d7e
                                              g_theVarContext.popScope();
Packit 1c1d7e
					    }
Packit 1c1d7e
					    g_name.resize(0);g_type.resize(0);
Packit 1c1d7e
					    BEGIN( Body );
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_bracketCount=0;
Packit 1c1d7e
					    BEGIN( SkipInits );
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<CallEnd>("const"|"volatile"|"sealed"|"override")({BN}+("const"|"volatile"|"sealed"|"override"))*/{BN}*(";"|"="|"throw"{BN}*"(") {
Packit 1c1d7e
					  startFontClass("keyword");
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					}
Packit 1c1d7e
<CallEnd,OldStyleArgs>("const"|"volatile"|"sealed"|"override")*({BN}+("const"|"volatile"|"sealed"|"override"))*{BN}*"{" {
Packit 1c1d7e
                                          if (g_insideBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_theVarContext.pushScope();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_theVarContext.addVariable(g_parmType,g_parmName);
Packit 1c1d7e
					  //g_theCallContext.popScope();
Packit 1c1d7e
					  g_parmType.resize(0);g_parmName.resize(0);
Packit 1c1d7e
					  int index = g_name.findRev("::");
Packit 1c1d7e
					  DBG_CTX((stderr,"g_name=%s\n",g_name.data()));
Packit 1c1d7e
					  if (index!=-1) 
Packit 1c1d7e
					  {
Packit 1c1d7e
					    QCString scope = g_name.left(index);
Packit 1c1d7e
					    if (!g_classScope.isEmpty()) scope.prepend(g_classScope+"::");
Packit 1c1d7e
					    ClassDef *cd=getResolvedClass(Doxygen::globalScope,g_sourceFileDef,scope);
Packit 1c1d7e
					    if (cd)
Packit 1c1d7e
					    {
Packit 1c1d7e
					      setClassScope(cd->name());
Packit 1c1d7e
  					      g_scopeStack.push(SCOPEBLOCK);
Packit 1c1d7e
                                              DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
Packit 1c1d7e
					    }
Packit 1c1d7e
					    else 
Packit 1c1d7e
					    {
Packit 1c1d7e
					      //setClassScope(g_realScope);
Packit 1c1d7e
  					      g_scopeStack.push(INNERBLOCK);
Packit 1c1d7e
                                              DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
Packit 1c1d7e
					    }
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
                                            DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
Packit 1c1d7e
  					    g_scopeStack.push(INNERBLOCK);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  yytext[yyleng-1]='\0';
Packit 1c1d7e
					  QCString cv(yytext);
Packit 1c1d7e
					  if (!cv.stripWhiteSpace().isEmpty())
Packit 1c1d7e
					  {
Packit 1c1d7e
					    startFontClass("keyword");
Packit 1c1d7e
  					    codifyLines(yytext);
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else // just whitespace
Packit 1c1d7e
					  {
Packit 1c1d7e
  					    codifyLines(yytext);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_code->codify("{");
Packit 1c1d7e
  					  if (g_searchingForBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_searchingForBody=FALSE;
Packit 1c1d7e
					    g_insideBody=TRUE;
Packit 1c1d7e
					  }
Packit 1c1d7e
					  if (g_insideBody) g_bodyCurlyCount++;
Packit 1c1d7e
  					  g_type.resize(0); g_name.resize(0);
Packit 1c1d7e
					  BEGIN( Body );
Packit 1c1d7e
  					}
Packit 1c1d7e
<CallEnd>"try"				{ // function-try-block
Packit 1c1d7e
					  startFontClass("keyword");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  g_inFunctionTryBlock=TRUE;
Packit 1c1d7e
                                        }
Packit 1c1d7e
<CallEnd>{ID}				{
Packit 1c1d7e
  					  if (g_insideBody || !g_parmType.isEmpty()) 
Packit 1c1d7e
					  {
Packit 1c1d7e
					    REJECT;
Packit 1c1d7e
					  }
Packit 1c1d7e
					  // could be K&R style definition
Packit 1c1d7e
					  addParmType();
Packit 1c1d7e
					  g_parmName=yytext; 
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
Packit 1c1d7e
					  BEGIN(OldStyleArgs);
Packit 1c1d7e
  					}
Packit 1c1d7e
<OldStyleArgs>{ID}			{
Packit 1c1d7e
					  addParmType();
Packit 1c1d7e
					  g_parmName=yytext; 
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
Packit 1c1d7e
  					}
Packit 1c1d7e
<OldStyleArgs>[,;]			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_theVarContext.addVariable(g_parmType,g_parmName);
Packit 1c1d7e
					  if (*yytext==';') g_parmType.resize(0);
Packit 1c1d7e
					  g_parmName.resize(0);
Packit 1c1d7e
  					}
Packit 1c1d7e
<CallEnd,OldStyleArgs>"#"		{
Packit 1c1d7e
  					  startFontClass("preprocessor");
Packit 1c1d7e
					  g_lastSkipCppContext = Body;
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  BEGIN( SkipCPP );
Packit 1c1d7e
  					}
Packit 1c1d7e
<CallEnd>.				{
Packit 1c1d7e
  					  unput(*yytext);
Packit 1c1d7e
                                          if (!g_insideBody) 
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_theVarContext.popScope();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  g_name.resize(0);g_args.resize(0);
Packit 1c1d7e
					  g_parmType.resize(0);g_parmName.resize(0);
Packit 1c1d7e
					  BEGIN( Body ); 
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipInits>";"				{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  g_type.resize(0); g_name.resize(0);
Packit 1c1d7e
  					  BEGIN( Body );
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipInits>"{"				{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  if (g_searchingForBody)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_searchingForBody=FALSE;
Packit 1c1d7e
					    g_insideBody=TRUE;
Packit 1c1d7e
					  }
Packit 1c1d7e
					  if (g_insideBody) g_bodyCurlyCount++;
Packit 1c1d7e
					  if (g_name.find("::")!=-1) 
Packit 1c1d7e
					  {
Packit 1c1d7e
                                            DBG_CTX((stderr,"** scope stack push SCOPEBLOCK\n"));
Packit 1c1d7e
  					    g_scopeStack.push(SCOPEBLOCK);
Packit 1c1d7e
					    setClassScope(g_realScope);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
                                            DBG_CTX((stderr,"** scope stack push INNERBLOCK\n"));
Packit 1c1d7e
  					    g_scopeStack.push(INNERBLOCK);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_type.resize(0); g_name.resize(0);
Packit 1c1d7e
					  BEGIN( Body ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipInits>{ID}				{
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<FuncCall>{ID}/"("			{
Packit 1c1d7e
					  generateFunctionLink(*g_code,yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<FuncCall>{ID}/("."|"->")               { 
Packit 1c1d7e
					  g_name=yytext; 
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					  BEGIN( MemberCall2 ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<FuncCall,MemberCall2>("("{B}*("*"{B}*)+{ID}*{B}*")"{B}*)/("."|"->") { 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  int s=0;while (!isId(yytext[s])) s++;
Packit 1c1d7e
                                          int e=(int)yyleng-1;while (!isId(yytext[e])) e--;
Packit 1c1d7e
					  g_name=((QCString)yytext).mid(s,e-s+1); 
Packit 1c1d7e
					  BEGIN( MemberCall2 ); 
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall2>{ID}/([ \t\n]*"(")         { 
Packit 1c1d7e
  					  if (!g_args.isEmpty())
Packit 1c1d7e
					    generateMemberLink(*g_code,g_args,yytext);
Packit 1c1d7e
					  else
Packit 1c1d7e
					    generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					  g_args.resize(0);
Packit 1c1d7e
					  BEGIN( FuncCall );
Packit 1c1d7e
					}
Packit 1c1d7e
<MemberCall2>{ID}/([ \t\n]*("."|"->"))  {
Packit 1c1d7e
  					  //g_code->codify(yytext);
Packit 1c1d7e
					  g_name=yytext; 
Packit 1c1d7e
					  generateClassOrGlobalLink(*g_code,yytext);
Packit 1c1d7e
					  BEGIN( MemberCall2 ); 
Packit 1c1d7e
    					}
Packit 1c1d7e
<MemberCall2>"->"|"."			{
Packit 1c1d7e
  				          if (yytext[0]=='-') // -> could be overloaded
Packit 1c1d7e
					  {
Packit 1c1d7e
					    updateCallContextForSmartPointer();
Packit 1c1d7e
					  }
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_memCallContext = YY_START;
Packit 1c1d7e
  					  BEGIN( MemberCall ); 
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipComment>"/*"("!"?)"*/"		{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  BEGIN( g_lastCContext ) ; 
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipComment>"//"|"/*"			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipComment>[^*/\n]+			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipComment>[ \t]*"*/"			{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  if (g_lastCContext==SkipCPP)
Packit 1c1d7e
                                          {
Packit 1c1d7e
                                            startFontClass("preprocessor");
Packit 1c1d7e
                                          }
Packit 1c1d7e
  					  BEGIN( g_lastCContext ) ; 
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipCxxComment>[^\r\n]*"\\"[\r]?\n	{ // line continuation
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipCxxComment>[^\r\n]+		{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
<SkipCxxComment>\r			
Packit 1c1d7e
<SkipCxxComment>\n			{
Packit 1c1d7e
  					  unput('\n');
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
					  BEGIN( g_lastCContext ) ;
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipCxxComment>.			{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)?{B}*"/*"[*!]/[^/*] {
Packit 1c1d7e
  					  g_yyLineNr+=QCString(yytext).contains('\n');
Packit 1c1d7e
					}
Packit 1c1d7e
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)? {
Packit 1c1d7e
  					  g_yyLineNr+=QCString(yytext).contains('\n');
Packit 1c1d7e
					  nextCodeLine();
Packit 1c1d7e
					  if (g_lastSpecialCContext==SkipCxxComment)
Packit 1c1d7e
					  { // force end of C++ comment here
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					    BEGIN( g_lastCContext ) ;
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
  					    BEGIN(g_lastSpecialCContext);
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<RemoveSpecialCComment>"*/"		{
Packit 1c1d7e
  					  BEGIN(g_lastSpecialCContext);
Packit 1c1d7e
  					}
Packit 1c1d7e
<RemoveSpecialCComment>[^*\n]+
Packit 1c1d7e
<RemoveSpecialCComment>"//"|"/*"
Packit 1c1d7e
<RemoveSpecialCComment>\n  { g_yyLineNr++; }
Packit 1c1d7e
<RemoveSpecialCComment>.
Packit 1c1d7e
<MemberCall>[^a-z_A-Z0-9(\n]		{ 
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
    					  g_type.resize(0);
Packit 1c1d7e
					  g_name.resize(0);
Packit 1c1d7e
					  BEGIN(g_memCallContext); 
Packit 1c1d7e
					}
Packit 1c1d7e
<*>\n({B}*"//"[!/][^\n]*\n)+		{ // remove special one-line comment
Packit 1c1d7e
					  if (YY_START==SkipCPP) REJECT;
Packit 1c1d7e
  					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_yyLineNr+=((QCString)yytext).contains('\n');
Packit 1c1d7e
					    nextCodeLine();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    codifyLines(yytext);
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  if (YY_START==SkipCxxComment)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					    BEGIN( g_lastCContext ) ;
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<SkipCPP>\n/.*\n			{ 
Packit 1c1d7e
					  endFontClass();
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					  BEGIN( g_lastSkipCppContext ) ;
Packit 1c1d7e
					}
Packit 1c1d7e
<*>\n{B}*"//@"[{}].*\n			{ // remove one-line group marker
Packit 1c1d7e
  					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_yyLineNr+=2;
Packit 1c1d7e
					    nextCodeLine();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    codifyLines(yytext);
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  if (YY_START==SkipCxxComment)
Packit 1c1d7e
					  {
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					    BEGIN( g_lastCContext ) ;
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>\n{B}*"/*@"[{}]			{ // remove one-line group marker
Packit 1c1d7e
					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
  					  {
Packit 1c1d7e
					    g_lastSpecialCContext = YY_START;
Packit 1c1d7e
					    g_yyLineNr++;
Packit 1c1d7e
					    BEGIN(RemoveSpecialCComment);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    // check is to prevent getting stuck in skipping C++ comments
Packit 1c1d7e
					    if (YY_START != SkipCxxComment)
Packit 1c1d7e
					    {
Packit 1c1d7e
  					      g_lastCContext = YY_START ;
Packit 1c1d7e
					    }
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    codifyLines(yytext);
Packit 1c1d7e
					    BEGIN(SkipComment);
Packit 1c1d7e
  					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>^{B}*"//@"[{}].*\n			{ // remove one-line group marker
Packit 1c1d7e
  					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_yyLineNr++;
Packit 1c1d7e
					    nextCodeLine();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    codifyLines(yytext);
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>^{B}*"/*@"[{}]			{ // remove multi-line group marker
Packit 1c1d7e
					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_lastSpecialCContext = YY_START;
Packit 1c1d7e
					    BEGIN(RemoveSpecialCComment);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    // check is to prevent getting stuck in skipping C++ comments
Packit 1c1d7e
					    if (YY_START != SkipCxxComment)
Packit 1c1d7e
					    {
Packit 1c1d7e
  					      g_lastCContext = YY_START ;
Packit 1c1d7e
					    }
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    g_code->codify(yytext);
Packit 1c1d7e
					    BEGIN(SkipComment);
Packit 1c1d7e
 					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>^{B}*"//"[!/][^\n]*\n		{ // remove special one-line comment
Packit 1c1d7e
  					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_yyLineNr++;
Packit 1c1d7e
					    //nextCodeLine();
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    codifyLines(yytext);
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>"//"[!/][^\n]*\n			{ // strip special one-line comment
Packit 1c1d7e
                                          if (YY_START==SkipComment || YY_START==SkipString) REJECT;
Packit 1c1d7e
  					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    char c[2]; c[0]='\n'; c[1]=0;
Packit 1c1d7e
					    codifyLines(c);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    codifyLines(yytext);
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					  }
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>"/*[tag:"[^\]\n]*"]*/"{B}*		{ // special pattern /*[tag:filename]*/ to force linking to a tag file
Packit 1c1d7e
  					  g_forceTagReference=yytext;
Packit 1c1d7e
					  int s=g_forceTagReference.find(':');
Packit 1c1d7e
					  int e=g_forceTagReference.findRev(']');
Packit 1c1d7e
					  g_forceTagReference = g_forceTagReference.mid(s+1,e-s-1);
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>\n{B}*"/*"[!*]/[^/*] 		{
Packit 1c1d7e
					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
  					  {
Packit 1c1d7e
					    g_lastSpecialCContext = YY_START;
Packit 1c1d7e
					    g_yyLineNr++;
Packit 1c1d7e
					    BEGIN(RemoveSpecialCComment);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    // check is to prevent getting stuck in skipping C++ comments
Packit 1c1d7e
					    if (YY_START != SkipCxxComment)
Packit 1c1d7e
					    {
Packit 1c1d7e
  					      g_lastCContext = YY_START ;
Packit 1c1d7e
					    }
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    codifyLines(yytext);
Packit 1c1d7e
					    BEGIN(SkipComment);
Packit 1c1d7e
  					  }
Packit 1c1d7e
					}
Packit 1c1d7e
<*>^{B}*"/*"[!*]/[^/*]			{ // special C comment block at a new line
Packit 1c1d7e
					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_lastSpecialCContext = YY_START;
Packit 1c1d7e
					    BEGIN(RemoveSpecialCComment);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    // check is to prevent getting stuck in skipping C++ comments
Packit 1c1d7e
					    if (YY_START != SkipCxxComment)
Packit 1c1d7e
					    {
Packit 1c1d7e
  					      g_lastCContext = YY_START ;
Packit 1c1d7e
					    }
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    g_code->codify(yytext);
Packit 1c1d7e
					    BEGIN(SkipComment);
Packit 1c1d7e
 					  }
Packit 1c1d7e
					}
Packit 1c1d7e
<*>"/*"[!*]/[^/*]			{ // special C comment block half way a line
Packit 1c1d7e
                                          if (YY_START==SkipString) REJECT;
Packit 1c1d7e
					  if (Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
					  {
Packit 1c1d7e
					    g_lastSpecialCContext = YY_START;
Packit 1c1d7e
					    BEGIN(RemoveSpecialCComment);
Packit 1c1d7e
					  }
Packit 1c1d7e
					  else
Packit 1c1d7e
					  {
Packit 1c1d7e
					    // check is to prevent getting stuck in skipping C++ comments
Packit 1c1d7e
					    if (YY_START != SkipCxxComment)
Packit 1c1d7e
					    {
Packit 1c1d7e
  					      g_lastCContext = YY_START ;
Packit 1c1d7e
					    }
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    g_code->codify(yytext);
Packit 1c1d7e
					    BEGIN(SkipComment);
Packit 1c1d7e
					  }
Packit 1c1d7e
					}
Packit 1c1d7e
<*>"/*"("!"?)"*/"			{ 
Packit 1c1d7e
                                          if (YY_START==SkipString) REJECT;
Packit 1c1d7e
                                          if (!Config_getBool(STRIP_CODE_COMMENTS))
Packit 1c1d7e
  					  {
Packit 1c1d7e
					    startFontClass("comment");
Packit 1c1d7e
					    g_code->codify(yytext);
Packit 1c1d7e
					    endFontClass();
Packit 1c1d7e
					  }
Packit 1c1d7e
					}
Packit 1c1d7e
<*>"/*"					{ 
Packit 1c1d7e
					  startFontClass("comment");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  // check is to prevent getting stuck in skipping C++ comments
Packit 1c1d7e
					  if (YY_START != SkipCxxComment)
Packit 1c1d7e
					  {
Packit 1c1d7e
  					    g_lastCContext = YY_START ;
Packit 1c1d7e
					  }
Packit 1c1d7e
					  BEGIN( SkipComment ) ;
Packit 1c1d7e
					}
Packit 1c1d7e
<*>@\"					{ // C# verbatim string
Packit 1c1d7e
					  startFontClass("stringliteral");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_lastVerbStringContext=YY_START;
Packit 1c1d7e
					  BEGIN(SkipVerbString);
Packit 1c1d7e
					}
Packit 1c1d7e
<*>"//"					{ 
Packit 1c1d7e
  					  startFontClass("comment");
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
  					  g_lastCContext = YY_START ;
Packit 1c1d7e
					  BEGIN( SkipCxxComment ) ;
Packit 1c1d7e
					}
Packit 1c1d7e
<*>"("|"["					{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_theCallContext.pushScope();
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>")"|"]"					{
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					  g_theCallContext.popScope();
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>\n					{
Packit 1c1d7e
					  g_yyColNr++;
Packit 1c1d7e
  					  codifyLines(yytext); 
Packit 1c1d7e
  					}
Packit 1c1d7e
<*>.					{
Packit 1c1d7e
					  g_yyColNr++;
Packit 1c1d7e
  					  g_code->codify(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
  /*
Packit 1c1d7e
<*>([ \t\n]*"\n"){2,}			{ // combine multiple blank lines
Packit 1c1d7e
  					  //QCString sepLine=yytext;
Packit 1c1d7e
  					  //g_code->codify("\n\n");
Packit 1c1d7e
  					  //g_yyLineNr+=sepLine.contains('\n'); 
Packit 1c1d7e
  					  //char sepLine[3]="\n\n";
Packit 1c1d7e
  					  codifyLines(yytext);
Packit 1c1d7e
					}
Packit 1c1d7e
  */
Packit 1c1d7e
Packit 1c1d7e
%%
Packit 1c1d7e
Packit 1c1d7e
/*@ ----------------------------------------------------------------------------
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
static void saveObjCContext()
Packit 1c1d7e
{
Packit 1c1d7e
  if (g_currentCtx)
Packit 1c1d7e
  {
Packit 1c1d7e
    g_currentCtx->format+=QCString().sprintf("$c%d",g_currentCtxId);
Packit 1c1d7e
    if (g_braceCount==0 && YY_START==ObjCCall)
Packit 1c1d7e
    {
Packit 1c1d7e
      g_currentCtx->objectTypeOrName=g_currentCtx->format.mid(1);
Packit 1c1d7e
      //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
Packit 1c1d7e
    }
Packit 1c1d7e
    g_contextStack.push(g_currentCtx);
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    //printf("Trying to save NULL context!\n");
Packit 1c1d7e
  }
Packit 1c1d7e
  ObjCCallCtx *newCtx = new ObjCCallCtx;
Packit 1c1d7e
  newCtx->id = g_currentCtxId;
Packit 1c1d7e
  newCtx->lexState = YY_START;
Packit 1c1d7e
  newCtx->braceCount = g_braceCount;
Packit 1c1d7e
  newCtx->objectType = 0;
Packit 1c1d7e
  newCtx->objectVar = 0;
Packit 1c1d7e
  newCtx->method = 0;
Packit 1c1d7e
  //printf("save state=%d\n",YY_START);
Packit 1c1d7e
  g_contextDict.insert(g_currentCtxId,newCtx);
Packit 1c1d7e
  g_currentCtx = newCtx;
Packit 1c1d7e
  g_braceCount = 0;
Packit 1c1d7e
  g_currentCtxId++;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void restoreObjCContext()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("restore state=%d->%d\n",YY_START,g_currentCtx->lexState);
Packit 1c1d7e
  BEGIN(g_currentCtx->lexState);
Packit 1c1d7e
  g_braceCount = g_currentCtx->braceCount;
Packit 1c1d7e
  if (!g_contextStack.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    g_currentCtx = g_contextStack.pop();
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    g_currentCtx = 0;
Packit 1c1d7e
    //printf("Trying to pop context while g_contextStack is empty!\n");
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void resetCCodeParserState()
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("***initParseCodeContext()\n");
Packit 1c1d7e
  g_forceTagReference.resize(0);
Packit 1c1d7e
  g_theVarContext.clear();
Packit 1c1d7e
  g_classScopeLengthStack.setAutoDelete(TRUE);
Packit 1c1d7e
  g_classScopeLengthStack.clear();
Packit 1c1d7e
  delete g_codeClassSDict;
Packit 1c1d7e
  g_codeClassSDict = new ClassSDict(17);
Packit 1c1d7e
  g_codeClassSDict->setAutoDelete(TRUE);
Packit 1c1d7e
  g_codeClassSDict->clear();
Packit 1c1d7e
  g_curClassBases.clear();
Packit 1c1d7e
  g_anchorCount = 0;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, 
Packit 1c1d7e
                SrcLangExt lang,bool exBlock, const char *exName,FileDef *fd,
Packit 1c1d7e
		int startLine,int endLine,bool inlineFragment,
Packit 1c1d7e
		MemberDef *memberDef,bool showLineNumbers,Definition *searchCtx,
Packit 1c1d7e
                bool collectXRefs)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("***parseCode() exBlock=%d exName=%s fd=%p className=%s searchCtx=%s\n",
Packit 1c1d7e
  //      exBlock,exName,fd,className,searchCtx?searchCtx->name().data():"<none>");
Packit 1c1d7e
Packit 1c1d7e
  if (s.isEmpty()) return;
Packit 1c1d7e
Packit 1c1d7e
  printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
Packit 1c1d7e
Packit 1c1d7e
  TooltipManager::instance()->clearTooltips();
Packit 1c1d7e
  if (g_codeClassSDict==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    resetCCodeParserState();
Packit 1c1d7e
  }
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
  g_collectXRefs = collectXRefs;
Packit 1c1d7e
  g_inFunctionTryBlock = FALSE;
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
  g_curlyCount    = 0;
Packit 1c1d7e
  g_bodyCurlyCount    = 0;
Packit 1c1d7e
  g_bracketCount  = 0;
Packit 1c1d7e
  g_sharpCount    = 0;
Packit 1c1d7e
  g_insideTemplate = FALSE;
Packit 1c1d7e
  g_theCallContext.clear();
Packit 1c1d7e
  g_scopeStack.clear();
Packit 1c1d7e
  g_classScope    = className;
Packit 1c1d7e
  //printf("parseCCode %s\n",className);
Packit 1c1d7e
  g_exampleBlock  = exBlock; 
Packit 1c1d7e
  g_exampleName   = exName;
Packit 1c1d7e
  g_sourceFileDef = fd;
Packit 1c1d7e
  g_lineNumbers   = fd!=0 && showLineNumbers;
Packit 1c1d7e
  bool cleanupSourceDef = FALSE;
Packit 1c1d7e
  if (fd==0)
Packit 1c1d7e
  {
Packit 1c1d7e
    // create a dummy filedef for the example
Packit 1c1d7e
    g_sourceFileDef = new FileDef("",(exName?exName:"generated"));
Packit 1c1d7e
    cleanupSourceDef = TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  g_insideObjC = lang==SrcLangExt_ObjC;
Packit 1c1d7e
  g_insideJava = lang==SrcLangExt_Java;
Packit 1c1d7e
  g_insideCS   = lang==SrcLangExt_CSharp;
Packit 1c1d7e
  g_insidePHP  = lang==SrcLangExt_PHP;
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_searchingForBody = exBlock;
Packit 1c1d7e
  g_insideBody = FALSE;
Packit 1c1d7e
  g_bracketCount = 0;
Packit 1c1d7e
  if (!g_exampleName.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    g_exampleFile = convertNameToFile(g_exampleName+"-example",FALSE,TRUE);
Packit 1c1d7e
    //printf("g_exampleFile=%s\n",g_exampleFile.data());
Packit 1c1d7e
  }
Packit 1c1d7e
  g_includeCodeFragment = inlineFragment;
Packit 1c1d7e
  //printf("** exBlock=%d exName=%s include=%d\n",exBlock,exName,inlineFragment);
Packit 1c1d7e
  startCodeLine();
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 (memberDef) setParameterList(memberDef);
Packit 1c1d7e
  codeYYrestart( codeYYin );
Packit 1c1d7e
  BEGIN( Body );
Packit 1c1d7e
  codeYYlex();
Packit 1c1d7e
  g_lexInit=TRUE;
Packit 1c1d7e
  if (g_needsTermination)
Packit 1c1d7e
  {
Packit 1c1d7e
    endFontClass();
Packit 1c1d7e
    DBG_CTX((stderr,"endCodeLine(%d)\n",g_yyLineNr));
Packit 1c1d7e
    g_code->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
Packit 1c1d7e
  printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
Packit 1c1d7e
  return;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void codeFreeScanner()
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(YY_FLEX_SUBMINOR_VERSION) 
Packit 1c1d7e
  if (g_lexInit)
Packit 1c1d7e
  {
Packit 1c1d7e
    codeYYlex_destroy();
Packit 1c1d7e
  }
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
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 codeYYdummy() { 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. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
Packit 1c1d7e
#endif
Packit 1c1d7e