1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// copyright : (C) 2014 Eran Ifrah
// file name : pptable.h
//
// -------------------------------------------------------------------------
// A
// _____ _ _ _ _
// / __ \ | | | | (_) |
// | / \/ ___ __| | ___| | _| |_ ___
// | | / _ \ / _ |/ _ \ | | | __/ _ )
// | \__/\ (_) | (_| | __/ |___| | || __/
// \____/\___/ \__,_|\___\_____/_|\__\___|
//
// F i l e
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#ifndef PPTABLE_H
#define PPTABLE_H
#include <wx/arrstr.h>
#include <map>
#include <wx/ffile.h>
#include <vector>
#include <string>
#include <list>
#include <set>
#ifndef WXDLLIMPEXP_CL
#ifdef WXMAKINGDLL_CL
#define WXDLLIMPEXP_CL __declspec(dllexport)
#elif defined(WXUSINGDLL_CL)
#define WXDLLIMPEXP_CL __declspec(dllimport)
#else // not making nor using DLL
#define WXDLLIMPEXP_CL
#endif
#endif
struct WXDLLIMPEXP_CL CLReplacement {
bool is_compound;
bool is_ok;
std::string full_pattern;
std::string searchFor;
std::string replaceWith;
void construct(const std::string& pattern, const std::string& replacement);
};
typedef std::list<CLReplacement> CLReplacementList;
/**
* @brief perform search and replace using CL pattern
* an example:
* pattern=wx_dynamic_cast(%0, %1)
* replacement=dynamic_cast<%0>(%1)
* in=wx_dynamic_cast(wxApp*, ptr)->OnInit();
*
* the expected result is:
* dynamic_cast<wxApp*>(ptr)->OnInit()
*
* It also supports simple search and replace
*/
bool CLReplacePattern(const wxString& in, const wxString& pattern, const wxString& replacement, wxString& output);
/**
* @brief perform search and replace using CL pattern
* an example:
* pattern=wx_dynamic_cast(%0, %1)
* replacement=dynamic_cast<%0>(%1)
* in=wx_dynamic_cast(wxApp*, ptr)->OnInit();
*
* the expected result is:
* dynamic_cast<wxApp*>(ptr)->OnInit()
*
* It also supports simple search and replace
*/
bool CLReplacePatternA(const std::string& in, const CLReplacement& repl, std::string& outStr);
/**
*
*/
struct WXDLLIMPEXP_CL PPToken {
enum { IsFunctionLike = 0x00000001, IsValid = 0x00000002, IsOverridable = 0x00000004 };
int line; // line where found
wxString name; // preprocessor name
wxString replacement; // un processed replacement
wxArrayString args; // for function like macros, contains the argument's names
size_t flags; // PP token flags
wxString fileName;
PPToken()
: line(0)
, flags(IsOverridable)
{
}
~PPToken() {}
void expandOnce(const wxArrayString& initList);
void processArgs(const wxString& argsList);
wxString signature() const;
void print(wxFFile& fp);
static bool readInitList(const wxString& in, int from, wxString& initList, wxArrayString& initListArr);
static bool
readInitList(const std::string& in, size_t from, std::string& initList, std::vector<std::string>& initListArr);
void squeeze();
wxString fullname() const;
};
class WXDLLIMPEXP_CL PPTable
{
std::map<wxString, PPToken> m_table;
std::set<wxString> m_namesUsed;
public:
static PPTable* Instance();
static void Release();
private:
PPTable();
~PPTable();
public:
PPToken Token(const wxString& name);
bool Contains(const wxString& name);
void Add(const PPToken& token);
void AddUsed(const wxString& name);
void Print(wxFFile& fp);
wxString Export();
void Clear();
void ClearNamesUsed();
void Squeeze();
const std::map<wxString, PPToken>& GetTable() const { return m_table; }
const std::set<wxString>& GetNamesUsed() const { return m_namesUsed; }
};
#endif // PPTABLE_H
|