File: pptable.h

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (148 lines) | stat: -rw-r--r-- 4,492 bytes parent folder | download | duplicates (5)
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