fcml  1.1.1
fcml_renderer.hpp
Go to the documentation of this file.
1 /*
2  * FCML - Free Code Manipulation Library.
3  * Copyright (C) 2010-2015 Slawomir Wojtasiak
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
27 #ifndef FCML_RENDERER_HPP_
28 #define FCML_RENDERER_HPP_
29 
30 #include "fcml_common.hpp"
31 #include "fcml_disassembler.hpp"
32 #include "fcml_renderer.h"
33 
34 namespace fcml {
35 
40 public:
41  RenderingFailedException( const fcml_cstring &msg, fcml_ceh_error error = FCML_CEH_GEC_NO_ERROR ) :
42  BaseException( msg, error ){
43  }
44 };
45 
51 class RenderConfig {
52 public:
53 
59  _throwExceptionOnError(true),
60  _renderFlags(0),
61  _preferedMnemonicPadding(FCML_REND_DEFAULT_MNEMONIC_PADDING),
62  _preferedCodePadding(FCML_REND_DEFAULT_CODE_PADDING) {
63  }
64 
71  RenderConfig( fcml_uint32_t renderFlags ) :
72  _throwExceptionOnError(true),
73  _renderFlags(renderFlags),
74  _preferedMnemonicPadding(0),
75  _preferedCodePadding(0) {
76  }
77 
79  fcml_uint16_t getPreferedCodePadding() const {
80  return _preferedCodePadding;
81  }
82 
84  void setPreferedCodePadding(fcml_uint16_t preferedCodePadding) {
85  _preferedCodePadding = preferedCodePadding;
86  }
87 
89  fcml_uint16_t getPreferedMnemonicPadding() const {
90  return _preferedMnemonicPadding;
91  }
92 
94  void setPreferedMnemonicPadding(fcml_uint16_t preferedMnemonicPadding) {
95  _preferedMnemonicPadding = preferedMnemonicPadding;
96  }
97 
99  fcml_uint32_t getRenderFlags() const {
100  return _renderFlags;
101  }
102 
104  void setRenderFlags(fcml_uint32_t renderFlags) {
105  _renderFlags = renderFlags;
106  }
107 
114  bool isThrowExceptionOnError() const {
115  return _throwExceptionOnError;
116  }
117 
124  void setThrowExceptionOnError(bool throwExceptionOnError) {
125  _throwExceptionOnError = throwExceptionOnError;
126  }
127 
128 private:
129 
131  bool _throwExceptionOnError;
133  fcml_uint32_t _renderFlags;
135  fcml_uint16_t _preferedMnemonicPadding;
137  fcml_uint16_t _preferedCodePadding;
138 
139 };
140 
147 public:
148 
149  static void convert( const RenderConfig &src, fcml_st_render_config &dest ) {
152  dest.render_flags = src.getRenderFlags();
153  }
154 
155 };
156 
160 class Renderer: protected DialectAware {
161 public:
162 
169  Renderer( Dialect &dialect ) :
170  _dialect( dialect ) {
171  }
172 
182  fcml_ceh_error render( const RenderConfig &renderConfig, DisassemblerResult &assemblerResult, fcml_cstring &result ) {
183 
184  result.clear();
185 
186  fcml_st_render_config render_config;
187  RenderTypeConverter::convert( renderConfig, render_config );
188 
189  fcml_st_disassembler_result disassembler_result;
190  DisassemblerTypeConverter::convert( assemblerResult, disassembler_result );
191 
192  fcml_char buffer[FCML_REND_MAX_BUFF_LEN];
193 
194  fcml_ceh_error error = ::fcml_fn_render( extractDialect( _dialect ), &render_config, buffer, FCML_REND_MAX_BUFF_LEN, &disassembler_result );
195 
196  DisassemblerTypeConverter::free( disassembler_result );
197 
198  if( error && renderConfig.isThrowExceptionOnError() ) {
199  throw RenderingFailedException( FCML_TEXT( "Can not render instruction." ), error );
200  }
201 
202  result = buffer;
203 
204  return error;
205  }
206 
207 private:
208 
210  Dialect &_dialect;
211 
212 };
213 
214 }
215 
216 #endif /* FCML_RENDERER_HPP_ */
fcml_uint16_t getPreferedMnemonicPadding() const
Definition: fcml_renderer.hpp:89
#define FCML_REND_MAX_BUFF_LEN
The rendered instruction size can not exceed this value.
Definition: fcml_renderer.h:42
C++ wrappers common classes.
RenderConfig()
Creates an empty renderer configuration.
Definition: fcml_renderer.hpp:58
C++ wrapper for the FCML disassembler.
RenderConfig(fcml_uint32_t renderFlags)
Creates a renderer configuration for given renderer flags.
Definition: fcml_renderer.hpp:71
fcml_uint32_t getRenderFlags() const
Definition: fcml_renderer.hpp:99
fcml_uint16_t getPreferedCodePadding() const
Definition: fcml_renderer.hpp:79
#define FCML_TEXT(x)
Used to code literal strings.
Definition: fcml_types.h:61
Converts objects to their structures counterparts.
Definition: fcml_renderer.hpp:146
void setPreferedCodePadding(fcml_uint16_t preferedCodePadding)
Definition: fcml_renderer.hpp:84
fcml_uint16_t prefered_code_padding
Preferred code padding in HEX bytes (2 characters on one byte.).
Definition: fcml_renderer.h:98
void setRenderFlags(fcml_uint32_t renderFlags)
Definition: fcml_renderer.hpp:104
Definition: fcml_assembler.hpp:39
void setThrowExceptionOnError(bool throwExceptionOnError)
Sets the way how the error handling is done.
Definition: fcml_renderer.hpp:124
Inherit from this class in order to get access to the native FCML dialect structure.
Definition: fcml_dialect.hpp:97
Base exception for all exceptions exposed by FCML library.
Definition: fcml_common.hpp:162
Renderer configuration.
Definition: fcml_renderer.h:92
Reusable disassembler result holder.
Definition: fcml_disassembler.h:219
#define FCML_REND_DEFAULT_CODE_PADDING
Default number of characters used as code padding.
Definition: fcml_renderer.h:85
Structures and functions declarations related to FCML renderers.
fcml_uint16_t prefered_mnemonic_padding
Preferred mnemonic padding in characters.
Definition: fcml_renderer.h:96
Renderer configuration.
Definition: fcml_renderer.hpp:51
fcml_ceh_error render(const RenderConfig &renderConfig, DisassemblerResult &assemblerResult, fcml_cstring &result)
Renders a disassembled instruction.
Definition: fcml_renderer.hpp:182
Disassembler result.
Definition: fcml_disassembler.hpp:1567
Component can not be initialized correctly.
Definition: fcml_renderer.hpp:39
Operation succeed.
Definition: fcml_errors.h:42
LIB_EXPORT fcml_ceh_error LIB_CALL fcml_fn_render(const fcml_st_dialect *dialect, const fcml_st_render_config *config, fcml_char *buffer, fcml_usize buffer_len, const fcml_st_disassembler_result *result)
Renders the disassembled instruction into its textual representation.
#define FCML_REND_DEFAULT_MNEMONIC_PADDING
Default number of characters used as mnemonic padding.
Definition: fcml_renderer.h:87
An abstract dialect.
Definition: fcml_dialect.hpp:41
Renderer wrapper.
Definition: fcml_renderer.hpp:160
fcml_uint32_t render_flags
Flags which allows to control rendering process.
Definition: fcml_renderer.h:94
void setPreferedMnemonicPadding(fcml_uint16_t preferedMnemonicPadding)
Definition: fcml_renderer.hpp:94
fcml_st_dialect * extractDialect(const Dialect &dialect) const
Extracts the native FCML dialect from the dialect object.
Definition: fcml_dialect.hpp:119
bool isThrowExceptionOnError() const
Returns true if exception should be thrown when disassembling fails.
Definition: fcml_renderer.hpp:114
fcml_uint16_t fcml_ceh_error
All error codes should be held in variables of this type.
Definition: fcml_errors.h:139
Renderer(Dialect &dialect)
Creates a renderer instance for the given dialect.
Definition: fcml_renderer.hpp:169