This example plugin converts all procedural if statements to case statements.
The makefile for building the plugin (for linux based systems) follows (Makefile-example2):
#/*----------------------------------------------------------------------------- # * Copyright (c) 1997-2009 Mark Hummel DBA Raquette Software. # * All rights reserved # * # * This file contains source code written by Raquette Software, # * 68 Stewart Street, Franklin MA 02038. It may not be used without # * express written permission. The expression of the information # * contained herein is protected under federal copyright laws and # * all copying without permission is prohibited and may be subject # * to criminal penalties. The Author assumes no responsibility for # * errors, omissions, or damages caused by the use of these programs # * or from use of the information contained herein. # * # *----------------------------------------------------------------------------- # */ # # Extract installation flags and paths for vrq # VRQ_VERSION = $(shell vrq --version|head -n 1|cut -c 5-|cut -d , -f1) PLUGIN_DIR = $(shell vrq --pkglibdir) INCLUDE_DIR = $(shell vrq --includedir) CXXFLAGS = $(shell vrq --cflags) LDFLAGS = $(shell vrq --ldflags) # # name of plugin # PLUGIN=example2 # # Build object file # all: $(PLUGIN).so $(PLUGIN).o: $(PLUGIN).cc $(PLUGIN).h $(CXX) -I . -I $(INCLUDE_DIR) $(CXXFLAGS) \ -DVRQ_VERSION=\"$(VRQ_VERSION)\" -c $< -fPIC -DPIC -o $@ # # Build DLL # $(PLUGIN).so: $(PLUGIN).o $(CXX) $(LDFLAGS) -shared $< -Wl,-soname -Wl,$@ -o $@ # # Install plugin # install: $(PLUGIN).so install -c '$<' $(PLUGIN_DIR) # # Print installation flags and paths # env: echo "VRQ_VERSION: $(VRQ_VERSION)" echo "PLUGIN_DIR: $(PLUGIN_DIR)" echo "INCLUDE_DIR: $(INCLUDE_DIR)" echo "CXXFLAGS: $(CXXFLAGS)" echo "LDFLAGS: $(LDFLAGS)" # # remove built files # clean: -rm $(PLUGIN).o $(PLUGIN).so
The header file for the plugin is below (example2.h):
/*----------------------------------------------------------------------------- * Copyright (c) 1997-2009 Mark Hummel DBA Raquette Software. * All rights reserved * * This file contains source code written by Raquette Software, * 68 Stewart Street, Franklin MA 02038. It may not be used without * express written permission. The expression of the information * contained herein is protected under federal copyright laws and * all copying without permission is prohibited and may be subject * to criminal penalties. The Author assumes no responsibility for * errors, omissions, or damages caused by the use of these programs * or from use of the information contained herein. * *----------------------------------------------------------------------------- */ /****************************************************************************** * * * example2.h * - example plugin * - * ****************************************************************************** */ #ifndef EXAMPLE2_H #define EXAMPLE2_H /* * include vrq headers */ #include "plugin.h" #include <map> /* * Plugin tools implement a subclass of CBackend. */ class CExample2 : public CBackend { public: /* * Methods */ CExample2( void ); virtual char* GetToolName( void ); virtual char* GetToolDescription( void ); virtual int AcceptAllPlusArgs( void ); virtual int HideTool(); virtual int IgnoreVrqComments(); virtual int ResolveModules(); virtual int ResolveInstance( CModule*, CInstance* ); virtual void Activate(); virtual void Process( list<CElement>& inputList, list<CElement>& outputList ); }; #endif // EXAMPLE2_H
The source for the plugin follows (example2.cc):
/*----------------------------------------------------------------------------- * Copyright (c) 1997-2009 Mark Hummel DBA Raquette Software. * All rights reserved * * This file contains source code written by Raquette Software, * 68 Stewart Street, Franklin MA 02038. It may not be used without * express written permission. The expression of the information * contained herein is protected under federal copyright laws and * all copying without permission is prohibited and may be subject * to criminal penalties. The Author assumes no responsibility for * errors, omissions, or damages caused by the use of these programs * or from use of the information contained herein. * *----------------------------------------------------------------------------- */ /****************************************************************************** * * * example2.cc * - methods for example plugin * ****************************************************************************** */ #include "example2.h" /************************************************ CreateToolInstance - entry point for dll. Vrq will call this entry point (must be C code) to create and initialize the tool. If tool creation fails, return NULL and vrq will ignore DLL. ************************************************/ extern "C" { CBackend* CreateToolInstance() { /* * Only initialize the tool if it was built for * the running version of vrq. */ if( strcmp( VRQ_VERSION, VrqVersionString() ) ) { return NULL; } /* * Create tool and return it. */ return new CExample2(); } } /************************************************ Constructor - Initialize tool ************************************************/ CExample2::CExample2( ) { } /************************************************ AcceptAllPlusArgs - return TRUE if tool accepts arbitrary plusargs. ************************************************/ int CExample2::AcceptAllPlusArgs( void ) { /* * Tool does not support arbitary plusargs */ return FALSE; } /************************************************ HideTool - return TRUE if tool should be hidden from help system. This allows a tool to be functional and hidden. ***********************************************/ int CExample2::HideTool() { return FALSE; } /************************************************ IgnoreVrqComments - return TRUE if tool requires lexer to treat vrq translate_on/off pragmas as pure comments. ***********************************************/ int CExample2::IgnoreVrqComments() { return FALSE; } /************************************************ ResolveModules - return TRUE if tool requires all module references to be resolved. This is done by search specified library search paths. ***********************************************/ int CExample2::ResolveModules() { return FALSE; } /************************************************ ResolveInstance - return TRUE if tool requires the given module reference to be resolved. This is allows a tool to implement a fine grain filter on what must be resolved. Note this only called if ResolvedModules returns TRUE. ***********************************************/ int CExample2::ResolveInstance( CModule*, CInstance* ) { return FALSE; } /************************************************ Activate - This routine is called before a tool is invoked. It is only called once and will only be called if the tool will be used in a pipeline. ***********************************************/ void CExample2::Activate() { } /************************************************ GetToolName - return name of tool ************************************************/ char* CExample2::GetToolName( void ) { static char toolName[] = "example2"; return toolName; } /************************************************ GetToolDescription - return description of tool. This text is used in vrq help text, man pages, etc. ************************************************/ char* CExample2::GetToolDescription( void ) { static char toolDescription[] = "Example plugin that converts if statements" " to case statements"; return toolDescription; } /************************************************ ProcessIfStatements - callback routine used to convert if statements to case statements. ***********************************************/ CNode* ProcessIfStatements( CNode* n, void* arg ) { switch( n->GetOp() ) { } return n; } /************************************************ Process - process a compilation unit ************************************************/ void CExample2::Process( list<CElement>& inputList, list<CElement>& outputList ) { /* * process each compilation unit, pass on modified trees to next filter. */ list<CElement>::iterator ptr; for( ptr = inputList.begin(); ptr != inputList.end(); ++ptr ) { /* * Transverse the entire code tree for the given compilation * unit. For each node ProcessIfStatements will be called to * convert if to case */ CNode* code = ptr->Code(); code = code->PostSubVisit1( ProcessIfStatements, NULL ); outputList.push_back( CElement( ptr->Filename(), !ptr->Filename(), code ) ); } }