| 1 | 1 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,30 @@ |
| 1 |
+QMAKE ?= qmake |
|
| 2 |
+ |
|
| 3 |
+QT_PRO = asm.pro |
|
| 4 |
+ |
|
| 5 |
+.PHONY: all |
|
| 6 |
+all: src doc |
|
| 7 |
+ |
|
| 8 |
+.PHONY: src |
|
| 9 |
+src: qmake |
|
| 10 |
+ $(MAKE) -C src |
|
| 11 |
+ |
|
| 12 |
+.PHONY: doc |
|
| 13 |
+doc: |
|
| 14 |
+ $(MAKE) -C doc |
|
| 15 |
+ |
|
| 16 |
+.PHONY: qmake |
|
| 17 |
+qmake: |
|
| 18 |
+ cd src; \ |
|
| 19 |
+ $(QMAKE) $(QT_PRO) |
|
| 20 |
+ |
|
| 21 |
+.PHONY: clean |
|
| 22 |
+clean: clean_src clean_doc |
|
| 23 |
+ |
|
| 24 |
+.PHONY: clean_src |
|
| 25 |
+clean_src: qmake |
|
| 26 |
+ $(MAKE) -C src clean |
|
| 27 |
+ |
|
| 28 |
+.PHONY: clean_doc |
|
| 29 |
+clean_doc: |
|
| 30 |
+ $(MAKE) -C doc clean |
| 0 | 31 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,2671 @@ |
| 1 |
+# Doxyfile 1.9.5 |
|
| 2 |
+ |
|
| 3 |
+# This file describes the settings to be used by the documentation system |
|
| 4 |
+# doxygen (www.doxygen.org) for a project. |
|
| 5 |
+# |
|
| 6 |
+# All text after a double hash (##) is considered a comment and is placed in |
|
| 7 |
+# front of the TAG it is preceding. |
|
| 8 |
+# |
|
| 9 |
+# All text after a single hash (#) is considered a comment and will be ignored. |
|
| 10 |
+# The format is: |
|
| 11 |
+# TAG = value [value, ...] |
|
| 12 |
+# For lists, items can also be appended using: |
|
| 13 |
+# TAG += value [value, ...] |
|
| 14 |
+# Values that contain spaces should be placed between quotes (\" \"). |
|
| 15 |
+# |
|
| 16 |
+# Note: |
|
| 17 |
+# |
|
| 18 |
+# Use doxygen to compare the used configuration file with the template |
|
| 19 |
+# configuration file: |
|
| 20 |
+# doxygen -x [configFile] |
|
| 21 |
+# Use doxygen to compare the used configuration file with the template |
|
| 22 |
+# configuration file without replacing the environment variables or CMake type |
|
| 23 |
+# replacement variables: |
|
| 24 |
+# doxygen -x_noenv [configFile] |
|
| 25 |
+ |
|
| 26 |
+#--------------------------------------------------------------------------- |
|
| 27 |
+# Project related configuration options |
|
| 28 |
+#--------------------------------------------------------------------------- |
|
| 29 |
+ |
|
| 30 |
+# This tag specifies the encoding used for all characters in the configuration |
|
| 31 |
+# file that follow. The default is UTF-8 which is also the encoding used for all |
|
| 32 |
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the |
|
| 33 |
+# iconv built into libc) for the transcoding. See |
|
| 34 |
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings. |
|
| 35 |
+# The default value is: UTF-8. |
|
| 36 |
+ |
|
| 37 |
+DOXYFILE_ENCODING = UTF-8 |
|
| 38 |
+ |
|
| 39 |
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by |
|
| 40 |
+# double-quotes, unless you are using Doxywizard) that should identify the |
|
| 41 |
+# project for which the documentation is generated. This name is used in the |
|
| 42 |
+# title of most generated pages and in a few other places. |
|
| 43 |
+# The default value is: My Project. |
|
| 44 |
+ |
|
| 45 |
+PROJECT_NAME = "XiPU ASM Compiler" |
|
| 46 |
+ |
|
| 47 |
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This |
|
| 48 |
+# could be handy for archiving the generated documentation or if some version |
|
| 49 |
+# control system is used. |
|
| 50 |
+ |
|
| 51 |
+PROJECT_NUMBER = |
|
| 52 |
+ |
|
| 53 |
+# Using the PROJECT_BRIEF tag one can provide an optional one line description |
|
| 54 |
+# for a project that appears at the top of each page and should give viewer a |
|
| 55 |
+# quick idea about the purpose of the project. Keep the description short. |
|
| 56 |
+ |
|
| 57 |
+PROJECT_BRIEF = |
|
| 58 |
+ |
|
| 59 |
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included |
|
| 60 |
+# in the documentation. The maximum height of the logo should not exceed 55 |
|
| 61 |
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy |
|
| 62 |
+# the logo to the output directory. |
|
| 63 |
+ |
|
| 64 |
+PROJECT_LOGO = |
|
| 65 |
+ |
|
| 66 |
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path |
|
| 67 |
+# into which the generated documentation will be written. If a relative path is |
|
| 68 |
+# entered, it will be relative to the location where doxygen was started. If |
|
| 69 |
+# left blank the current directory will be used. |
|
| 70 |
+ |
|
| 71 |
+OUTPUT_DIRECTORY = |
|
| 72 |
+ |
|
| 73 |
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 |
|
| 74 |
+# sub-directories (in 2 levels) under the output directory of each output format |
|
| 75 |
+# and will distribute the generated files over these directories. Enabling this |
|
| 76 |
+# option can be useful when feeding doxygen a huge amount of source files, where |
|
| 77 |
+# putting all generated files in the same directory would otherwise causes |
|
| 78 |
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to |
|
| 79 |
+# control the number of sub-directories. |
|
| 80 |
+# The default value is: NO. |
|
| 81 |
+ |
|
| 82 |
+CREATE_SUBDIRS = NO |
|
| 83 |
+ |
|
| 84 |
+# Controls the number of sub-directories that will be created when |
|
| 85 |
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every |
|
| 86 |
+# level increment doubles the number of directories, resulting in 4096 |
|
| 87 |
+# directories at level 8 which is the default and also the maximum value. The |
|
| 88 |
+# sub-directories are organized in 2 levels, the first level always has a fixed |
|
| 89 |
+# numer of 16 directories. |
|
| 90 |
+# Minimum value: 0, maximum value: 8, default value: 8. |
|
| 91 |
+# This tag requires that the tag CREATE_SUBDIRS is set to YES. |
|
| 92 |
+ |
|
| 93 |
+CREATE_SUBDIRS_LEVEL = 8 |
|
| 94 |
+ |
|
| 95 |
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII |
|
| 96 |
+# characters to appear in the names of generated files. If set to NO, non-ASCII |
|
| 97 |
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode |
|
| 98 |
+# U+3044. |
|
| 99 |
+# The default value is: NO. |
|
| 100 |
+ |
|
| 101 |
+ALLOW_UNICODE_NAMES = NO |
|
| 102 |
+ |
|
| 103 |
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all |
|
| 104 |
+# documentation generated by doxygen is written. Doxygen will use this |
|
| 105 |
+# information to generate all constant output in the proper language. |
|
| 106 |
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, |
|
| 107 |
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English |
|
| 108 |
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, |
|
| 109 |
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with |
|
| 110 |
+# English messages), Korean, Korean-en (Korean with English messages), Latvian, |
|
| 111 |
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, |
|
| 112 |
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, |
|
| 113 |
+# Swedish, Turkish, Ukrainian and Vietnamese. |
|
| 114 |
+# The default value is: English. |
|
| 115 |
+ |
|
| 116 |
+OUTPUT_LANGUAGE = English |
|
| 117 |
+ |
|
| 118 |
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member |
|
| 119 |
+# descriptions after the members that are listed in the file and class |
|
| 120 |
+# documentation (similar to Javadoc). Set to NO to disable this. |
|
| 121 |
+# The default value is: YES. |
|
| 122 |
+ |
|
| 123 |
+BRIEF_MEMBER_DESC = YES |
|
| 124 |
+ |
|
| 125 |
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief |
|
| 126 |
+# description of a member or function before the detailed description |
|
| 127 |
+# |
|
| 128 |
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the |
|
| 129 |
+# brief descriptions will be completely suppressed. |
|
| 130 |
+# The default value is: YES. |
|
| 131 |
+ |
|
| 132 |
+REPEAT_BRIEF = YES |
|
| 133 |
+ |
|
| 134 |
+# This tag implements a quasi-intelligent brief description abbreviator that is |
|
| 135 |
+# used to form the text in various listings. Each string in this list, if found |
|
| 136 |
+# as the leading text of the brief description, will be stripped from the text |
|
| 137 |
+# and the result, after processing the whole list, is used as the annotated |
|
| 138 |
+# text. Otherwise, the brief description is used as-is. If left blank, the |
|
| 139 |
+# following values are used ($name is automatically replaced with the name of |
|
| 140 |
+# the entity):The $name class, The $name widget, The $name file, is, provides, |
|
| 141 |
+# specifies, contains, represents, a, an and the. |
|
| 142 |
+ |
|
| 143 |
+ABBREVIATE_BRIEF = |
|
| 144 |
+ |
|
| 145 |
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then |
|
| 146 |
+# doxygen will generate a detailed section even if there is only a brief |
|
| 147 |
+# description. |
|
| 148 |
+# The default value is: NO. |
|
| 149 |
+ |
|
| 150 |
+ALWAYS_DETAILED_SEC = NO |
|
| 151 |
+ |
|
| 152 |
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all |
|
| 153 |
+# inherited members of a class in the documentation of that class as if those |
|
| 154 |
+# members were ordinary class members. Constructors, destructors and assignment |
|
| 155 |
+# operators of the base classes will not be shown. |
|
| 156 |
+# The default value is: NO. |
|
| 157 |
+ |
|
| 158 |
+INLINE_INHERITED_MEMB = NO |
|
| 159 |
+ |
|
| 160 |
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path |
|
| 161 |
+# before files name in the file list and in the header files. If set to NO the |
|
| 162 |
+# shortest path that makes the file name unique will be used |
|
| 163 |
+# The default value is: YES. |
|
| 164 |
+ |
|
| 165 |
+FULL_PATH_NAMES = NO |
|
| 166 |
+ |
|
| 167 |
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. |
|
| 168 |
+# Stripping is only done if one of the specified strings matches the left-hand |
|
| 169 |
+# part of the path. The tag can be used to show relative paths in the file list. |
|
| 170 |
+# If left blank the directory from which doxygen is run is used as the path to |
|
| 171 |
+# strip. |
|
| 172 |
+# |
|
| 173 |
+# Note that you can specify absolute paths here, but also relative paths, which |
|
| 174 |
+# will be relative from the directory where doxygen is started. |
|
| 175 |
+# This tag requires that the tag FULL_PATH_NAMES is set to YES. |
|
| 176 |
+ |
|
| 177 |
+STRIP_FROM_PATH = |
|
| 178 |
+ |
|
| 179 |
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the |
|
| 180 |
+# path mentioned in the documentation of a class, which tells the reader which |
|
| 181 |
+# header file to include in order to use a class. If left blank only the name of |
|
| 182 |
+# the header file containing the class definition is used. Otherwise one should |
|
| 183 |
+# specify the list of include paths that are normally passed to the compiler |
|
| 184 |
+# using the -I flag. |
|
| 185 |
+ |
|
| 186 |
+STRIP_FROM_INC_PATH = |
|
| 187 |
+ |
|
| 188 |
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but |
|
| 189 |
+# less readable) file names. This can be useful is your file systems doesn't |
|
| 190 |
+# support long names like on DOS, Mac, or CD-ROM. |
|
| 191 |
+# The default value is: NO. |
|
| 192 |
+ |
|
| 193 |
+SHORT_NAMES = NO |
|
| 194 |
+ |
|
| 195 |
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the |
|
| 196 |
+# first line (until the first dot) of a Javadoc-style comment as the brief |
|
| 197 |
+# description. If set to NO, the Javadoc-style will behave just like regular Qt- |
|
| 198 |
+# style comments (thus requiring an explicit @brief command for a brief |
|
| 199 |
+# description.) |
|
| 200 |
+# The default value is: NO. |
|
| 201 |
+ |
|
| 202 |
+JAVADOC_AUTOBRIEF = NO |
|
| 203 |
+ |
|
| 204 |
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line |
|
| 205 |
+# such as |
|
| 206 |
+# /*************** |
|
| 207 |
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the |
|
| 208 |
+# Javadoc-style will behave just like regular comments and it will not be |
|
| 209 |
+# interpreted by doxygen. |
|
| 210 |
+# The default value is: NO. |
|
| 211 |
+ |
|
| 212 |
+JAVADOC_BANNER = NO |
|
| 213 |
+ |
|
| 214 |
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first |
|
| 215 |
+# line (until the first dot) of a Qt-style comment as the brief description. If |
|
| 216 |
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus |
|
| 217 |
+# requiring an explicit \brief command for a brief description.) |
|
| 218 |
+# The default value is: NO. |
|
| 219 |
+ |
|
| 220 |
+QT_AUTOBRIEF = NO |
|
| 221 |
+ |
|
| 222 |
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a |
|
| 223 |
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as |
|
| 224 |
+# a brief description. This used to be the default behavior. The new default is |
|
| 225 |
+# to treat a multi-line C++ comment block as a detailed description. Set this |
|
| 226 |
+# tag to YES if you prefer the old behavior instead. |
|
| 227 |
+# |
|
| 228 |
+# Note that setting this tag to YES also means that rational rose comments are |
|
| 229 |
+# not recognized any more. |
|
| 230 |
+# The default value is: NO. |
|
| 231 |
+ |
|
| 232 |
+MULTILINE_CPP_IS_BRIEF = NO |
|
| 233 |
+ |
|
| 234 |
+# By default Python docstrings are displayed as preformatted text and doxygen's |
|
| 235 |
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the |
|
| 236 |
+# doxygen's special commands can be used and the contents of the docstring |
|
| 237 |
+# documentation blocks is shown as doxygen documentation. |
|
| 238 |
+# The default value is: YES. |
|
| 239 |
+ |
|
| 240 |
+PYTHON_DOCSTRING = YES |
|
| 241 |
+ |
|
| 242 |
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the |
|
| 243 |
+# documentation from any documented member that it re-implements. |
|
| 244 |
+# The default value is: YES. |
|
| 245 |
+ |
|
| 246 |
+INHERIT_DOCS = YES |
|
| 247 |
+ |
|
| 248 |
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new |
|
| 249 |
+# page for each member. If set to NO, the documentation of a member will be part |
|
| 250 |
+# of the file/class/namespace that contains it. |
|
| 251 |
+# The default value is: NO. |
|
| 252 |
+ |
|
| 253 |
+SEPARATE_MEMBER_PAGES = NO |
|
| 254 |
+ |
|
| 255 |
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen |
|
| 256 |
+# uses this value to replace tabs by spaces in code fragments. |
|
| 257 |
+# Minimum value: 1, maximum value: 16, default value: 4. |
|
| 258 |
+ |
|
| 259 |
+TAB_SIZE = 4 |
|
| 260 |
+ |
|
| 261 |
+# This tag can be used to specify a number of aliases that act as commands in |
|
| 262 |
+# the documentation. An alias has the form: |
|
| 263 |
+# name=value |
|
| 264 |
+# For example adding |
|
| 265 |
+# "sideeffect=@par Side Effects:^^" |
|
| 266 |
+# will allow you to put the command \sideeffect (or @sideeffect) in the |
|
| 267 |
+# documentation, which will result in a user-defined paragraph with heading |
|
| 268 |
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias |
|
| 269 |
+# to insert newlines (in the resulting output). You can put ^^ in the value part |
|
| 270 |
+# of an alias to insert a newline as if a physical newline was in the original |
|
| 271 |
+# file. When you need a literal { or } or , in the value part of an alias you
|
|
| 272 |
+# have to escape them by means of a backslash (\), this can lead to conflicts |
|
| 273 |
+# with the commands \{ and \} for these it is advised to use the version @{ and
|
|
| 274 |
+# @} or use a double escape (\\{ and \\})
|
|
| 275 |
+ |
|
| 276 |
+ALIASES = |
|
| 277 |
+ |
|
| 278 |
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources |
|
| 279 |
+# only. Doxygen will then generate output that is more tailored for C. For |
|
| 280 |
+# instance, some of the names that are used will be different. The list of all |
|
| 281 |
+# members will be omitted, etc. |
|
| 282 |
+# The default value is: NO. |
|
| 283 |
+ |
|
| 284 |
+OPTIMIZE_OUTPUT_FOR_C = YES |
|
| 285 |
+ |
|
| 286 |
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or |
|
| 287 |
+# Python sources only. Doxygen will then generate output that is more tailored |
|
| 288 |
+# for that language. For instance, namespaces will be presented as packages, |
|
| 289 |
+# qualified scopes will look different, etc. |
|
| 290 |
+# The default value is: NO. |
|
| 291 |
+ |
|
| 292 |
+OPTIMIZE_OUTPUT_JAVA = NO |
|
| 293 |
+ |
|
| 294 |
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran |
|
| 295 |
+# sources. Doxygen will then generate output that is tailored for Fortran. |
|
| 296 |
+# The default value is: NO. |
|
| 297 |
+ |
|
| 298 |
+OPTIMIZE_FOR_FORTRAN = NO |
|
| 299 |
+ |
|
| 300 |
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL |
|
| 301 |
+# sources. Doxygen will then generate output that is tailored for VHDL. |
|
| 302 |
+# The default value is: NO. |
|
| 303 |
+ |
|
| 304 |
+OPTIMIZE_OUTPUT_VHDL = NO |
|
| 305 |
+ |
|
| 306 |
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice |
|
| 307 |
+# sources only. Doxygen will then generate output that is more tailored for that |
|
| 308 |
+# language. For instance, namespaces will be presented as modules, types will be |
|
| 309 |
+# separated into more groups, etc. |
|
| 310 |
+# The default value is: NO. |
|
| 311 |
+ |
|
| 312 |
+OPTIMIZE_OUTPUT_SLICE = NO |
|
| 313 |
+ |
|
| 314 |
+# Doxygen selects the parser to use depending on the extension of the files it |
|
| 315 |
+# parses. With this tag you can assign which parser to use for a given |
|
| 316 |
+# extension. Doxygen has a built-in mapping, but you can override or extend it |
|
| 317 |
+# using this tag. The format is ext=language, where ext is a file extension, and |
|
| 318 |
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, |
|
| 319 |
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, |
|
| 320 |
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: |
|
| 321 |
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser |
|
| 322 |
+# tries to guess whether the code is fixed or free formatted code, this is the |
|
| 323 |
+# default for Fortran type files). For instance to make doxygen treat .inc files |
|
| 324 |
+# as Fortran files (default is PHP), and .f files as C (default is Fortran), |
|
| 325 |
+# use: inc=Fortran f=C. |
|
| 326 |
+# |
|
| 327 |
+# Note: For files without extension you can use no_extension as a placeholder. |
|
| 328 |
+# |
|
| 329 |
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise |
|
| 330 |
+# the files are not read by doxygen. When specifying no_extension you should add |
|
| 331 |
+# * to the FILE_PATTERNS. |
|
| 332 |
+# |
|
| 333 |
+# Note see also the list of default file extension mappings. |
|
| 334 |
+ |
|
| 335 |
+EXTENSION_MAPPING = |
|
| 336 |
+ |
|
| 337 |
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments |
|
| 338 |
+# according to the Markdown format, which allows for more readable |
|
| 339 |
+# documentation. See https://daringfireball.net/projects/markdown/ for details. |
|
| 340 |
+# The output of markdown processing is further processed by doxygen, so you can |
|
| 341 |
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in |
|
| 342 |
+# case of backward compatibilities issues. |
|
| 343 |
+# The default value is: YES. |
|
| 344 |
+ |
|
| 345 |
+MARKDOWN_SUPPORT = NO |
|
| 346 |
+ |
|
| 347 |
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up |
|
| 348 |
+# to that level are automatically included in the table of contents, even if |
|
| 349 |
+# they do not have an id attribute. |
|
| 350 |
+# Note: This feature currently applies only to Markdown headings. |
|
| 351 |
+# Minimum value: 0, maximum value: 99, default value: 5. |
|
| 352 |
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. |
|
| 353 |
+ |
|
| 354 |
+TOC_INCLUDE_HEADINGS = 5 |
|
| 355 |
+ |
|
| 356 |
+# When enabled doxygen tries to link words that correspond to documented |
|
| 357 |
+# classes, or namespaces to their corresponding documentation. Such a link can |
|
| 358 |
+# be prevented in individual cases by putting a % sign in front of the word or |
|
| 359 |
+# globally by setting AUTOLINK_SUPPORT to NO. |
|
| 360 |
+# The default value is: YES. |
|
| 361 |
+ |
|
| 362 |
+AUTOLINK_SUPPORT = YES |
|
| 363 |
+ |
|
| 364 |
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want |
|
| 365 |
+# to include (a tag file for) the STL sources as input, then you should set this |
|
| 366 |
+# tag to YES in order to let doxygen match functions declarations and |
|
| 367 |
+# definitions whose arguments contain STL classes (e.g. func(std::string); |
|
| 368 |
+# versus func(std::string) {}). This also make the inheritance and collaboration
|
|
| 369 |
+# diagrams that involve STL classes more complete and accurate. |
|
| 370 |
+# The default value is: NO. |
|
| 371 |
+ |
|
| 372 |
+BUILTIN_STL_SUPPORT = YES |
|
| 373 |
+ |
|
| 374 |
+# If you use Microsoft's C++/CLI language, you should set this option to YES to |
|
| 375 |
+# enable parsing support. |
|
| 376 |
+# The default value is: NO. |
|
| 377 |
+ |
|
| 378 |
+CPP_CLI_SUPPORT = NO |
|
| 379 |
+ |
|
| 380 |
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: |
|
| 381 |
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen |
|
| 382 |
+# will parse them like normal C++ but will assume all classes use public instead |
|
| 383 |
+# of private inheritance when no explicit protection keyword is present. |
|
| 384 |
+# The default value is: NO. |
|
| 385 |
+ |
|
| 386 |
+SIP_SUPPORT = NO |
|
| 387 |
+ |
|
| 388 |
+# For Microsoft's IDL there are propget and propput attributes to indicate |
|
| 389 |
+# getter and setter methods for a property. Setting this option to YES will make |
|
| 390 |
+# doxygen to replace the get and set methods by a property in the documentation. |
|
| 391 |
+# This will only work if the methods are indeed getting or setting a simple |
|
| 392 |
+# type. If this is not the case, or you want to show the methods anyway, you |
|
| 393 |
+# should set this option to NO. |
|
| 394 |
+# The default value is: YES. |
|
| 395 |
+ |
|
| 396 |
+IDL_PROPERTY_SUPPORT = YES |
|
| 397 |
+ |
|
| 398 |
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC |
|
| 399 |
+# tag is set to YES then doxygen will reuse the documentation of the first |
|
| 400 |
+# member in the group (if any) for the other members of the group. By default |
|
| 401 |
+# all members of a group must be documented explicitly. |
|
| 402 |
+# The default value is: NO. |
|
| 403 |
+ |
|
| 404 |
+DISTRIBUTE_GROUP_DOC = NO |
|
| 405 |
+ |
|
| 406 |
+# If one adds a struct or class to a group and this option is enabled, then also |
|
| 407 |
+# any nested class or struct is added to the same group. By default this option |
|
| 408 |
+# is disabled and one has to add nested compounds explicitly via \ingroup. |
|
| 409 |
+# The default value is: NO. |
|
| 410 |
+ |
|
| 411 |
+GROUP_NESTED_COMPOUNDS = NO |
|
| 412 |
+ |
|
| 413 |
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type |
|
| 414 |
+# (for instance a group of public functions) to be put as a subgroup of that |
|
| 415 |
+# type (e.g. under the Public Functions section). Set it to NO to prevent |
|
| 416 |
+# subgrouping. Alternatively, this can be done per class using the |
|
| 417 |
+# \nosubgrouping command. |
|
| 418 |
+# The default value is: YES. |
|
| 419 |
+ |
|
| 420 |
+SUBGROUPING = YES |
|
| 421 |
+ |
|
| 422 |
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions |
|
| 423 |
+# are shown inside the group in which they are included (e.g. using \ingroup) |
|
| 424 |
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX |
|
| 425 |
+# and RTF). |
|
| 426 |
+# |
|
| 427 |
+# Note that this feature does not work in combination with |
|
| 428 |
+# SEPARATE_MEMBER_PAGES. |
|
| 429 |
+# The default value is: NO. |
|
| 430 |
+ |
|
| 431 |
+INLINE_GROUPED_CLASSES = NO |
|
| 432 |
+ |
|
| 433 |
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions |
|
| 434 |
+# with only public data fields or simple typedef fields will be shown inline in |
|
| 435 |
+# the documentation of the scope in which they are defined (i.e. file, |
|
| 436 |
+# namespace, or group documentation), provided this scope is documented. If set |
|
| 437 |
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and |
|
| 438 |
+# Man pages) or section (for LaTeX and RTF). |
|
| 439 |
+# The default value is: NO. |
|
| 440 |
+ |
|
| 441 |
+INLINE_SIMPLE_STRUCTS = NO |
|
| 442 |
+ |
|
| 443 |
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or |
|
| 444 |
+# enum is documented as struct, union, or enum with the name of the typedef. So |
|
| 445 |
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
|
|
| 446 |
+# with name TypeT. When disabled the typedef will appear as a member of a file, |
|
| 447 |
+# namespace, or class. And the struct will be named TypeS. This can typically be |
|
| 448 |
+# useful for C code in case the coding convention dictates that all compound |
|
| 449 |
+# types are typedef'ed and only the typedef is referenced, never the tag name. |
|
| 450 |
+# The default value is: NO. |
|
| 451 |
+ |
|
| 452 |
+TYPEDEF_HIDES_STRUCT = NO |
|
| 453 |
+ |
|
| 454 |
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This |
|
| 455 |
+# cache is used to resolve symbols given their name and scope. Since this can be |
|
| 456 |
+# an expensive process and often the same symbol appears multiple times in the |
|
| 457 |
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small |
|
| 458 |
+# doxygen will become slower. If the cache is too large, memory is wasted. The |
|
| 459 |
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range |
|
| 460 |
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 |
|
| 461 |
+# symbols. At the end of a run doxygen will report the cache usage and suggest |
|
| 462 |
+# the optimal cache size from a speed point of view. |
|
| 463 |
+# Minimum value: 0, maximum value: 9, default value: 0. |
|
| 464 |
+ |
|
| 465 |
+LOOKUP_CACHE_SIZE = 0 |
|
| 466 |
+ |
|
| 467 |
+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use |
|
| 468 |
+# during processing. When set to 0 doxygen will based this on the number of |
|
| 469 |
+# cores available in the system. You can set it explicitly to a value larger |
|
| 470 |
+# than 0 to get more control over the balance between CPU load and processing |
|
| 471 |
+# speed. At this moment only the input processing can be done using multiple |
|
| 472 |
+# threads. Since this is still an experimental feature the default is set to 1, |
|
| 473 |
+# which effectively disables parallel processing. Please report any issues you |
|
| 474 |
+# encounter. Generating dot graphs in parallel is controlled by the |
|
| 475 |
+# DOT_NUM_THREADS setting. |
|
| 476 |
+# Minimum value: 0, maximum value: 32, default value: 1. |
|
| 477 |
+ |
|
| 478 |
+NUM_PROC_THREADS = 1 |
|
| 479 |
+ |
|
| 480 |
+#--------------------------------------------------------------------------- |
|
| 481 |
+# Build related configuration options |
|
| 482 |
+#--------------------------------------------------------------------------- |
|
| 483 |
+ |
|
| 484 |
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in |
|
| 485 |
+# documentation are documented, even if no documentation was available. Private |
|
| 486 |
+# class members and static file members will be hidden unless the |
|
| 487 |
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. |
|
| 488 |
+# Note: This will also disable the warnings about undocumented members that are |
|
| 489 |
+# normally produced when WARNINGS is set to YES. |
|
| 490 |
+# The default value is: NO. |
|
| 491 |
+ |
|
| 492 |
+EXTRACT_ALL = YES |
|
| 493 |
+ |
|
| 494 |
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will |
|
| 495 |
+# be included in the documentation. |
|
| 496 |
+# The default value is: NO. |
|
| 497 |
+ |
|
| 498 |
+EXTRACT_PRIVATE = YES |
|
| 499 |
+ |
|
| 500 |
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual |
|
| 501 |
+# methods of a class will be included in the documentation. |
|
| 502 |
+# The default value is: NO. |
|
| 503 |
+ |
|
| 504 |
+EXTRACT_PRIV_VIRTUAL = NO |
|
| 505 |
+ |
|
| 506 |
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal |
|
| 507 |
+# scope will be included in the documentation. |
|
| 508 |
+# The default value is: NO. |
|
| 509 |
+ |
|
| 510 |
+EXTRACT_PACKAGE = NO |
|
| 511 |
+ |
|
| 512 |
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be |
|
| 513 |
+# included in the documentation. |
|
| 514 |
+# The default value is: NO. |
|
| 515 |
+ |
|
| 516 |
+EXTRACT_STATIC = YES |
|
| 517 |
+ |
|
| 518 |
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined |
|
| 519 |
+# locally in source files will be included in the documentation. If set to NO, |
|
| 520 |
+# only classes defined in header files are included. Does not have any effect |
|
| 521 |
+# for Java sources. |
|
| 522 |
+# The default value is: YES. |
|
| 523 |
+ |
|
| 524 |
+EXTRACT_LOCAL_CLASSES = YES |
|
| 525 |
+ |
|
| 526 |
+# This flag is only useful for Objective-C code. If set to YES, local methods, |
|
| 527 |
+# which are defined in the implementation section but not in the interface are |
|
| 528 |
+# included in the documentation. If set to NO, only methods in the interface are |
|
| 529 |
+# included. |
|
| 530 |
+# The default value is: NO. |
|
| 531 |
+ |
|
| 532 |
+EXTRACT_LOCAL_METHODS = NO |
|
| 533 |
+ |
|
| 534 |
+# If this flag is set to YES, the members of anonymous namespaces will be |
|
| 535 |
+# extracted and appear in the documentation as a namespace called |
|
| 536 |
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
|
|
| 537 |
+# the file that contains the anonymous namespace. By default anonymous namespace |
|
| 538 |
+# are hidden. |
|
| 539 |
+# The default value is: NO. |
|
| 540 |
+ |
|
| 541 |
+EXTRACT_ANON_NSPACES = YES |
|
| 542 |
+ |
|
| 543 |
+# If this flag is set to YES, the name of an unnamed parameter in a declaration |
|
| 544 |
+# will be determined by the corresponding definition. By default unnamed |
|
| 545 |
+# parameters remain unnamed in the output. |
|
| 546 |
+# The default value is: YES. |
|
| 547 |
+ |
|
| 548 |
+RESOLVE_UNNAMED_PARAMS = YES |
|
| 549 |
+ |
|
| 550 |
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all |
|
| 551 |
+# undocumented members inside documented classes or files. If set to NO these |
|
| 552 |
+# members will be included in the various overviews, but no documentation |
|
| 553 |
+# section is generated. This option has no effect if EXTRACT_ALL is enabled. |
|
| 554 |
+# The default value is: NO. |
|
| 555 |
+ |
|
| 556 |
+HIDE_UNDOC_MEMBERS = NO |
|
| 557 |
+ |
|
| 558 |
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all |
|
| 559 |
+# undocumented classes that are normally visible in the class hierarchy. If set |
|
| 560 |
+# to NO, these classes will be included in the various overviews. This option |
|
| 561 |
+# has no effect if EXTRACT_ALL is enabled. |
|
| 562 |
+# The default value is: NO. |
|
| 563 |
+ |
|
| 564 |
+HIDE_UNDOC_CLASSES = NO |
|
| 565 |
+ |
|
| 566 |
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend |
|
| 567 |
+# declarations. If set to NO, these declarations will be included in the |
|
| 568 |
+# documentation. |
|
| 569 |
+# The default value is: NO. |
|
| 570 |
+ |
|
| 571 |
+HIDE_FRIEND_COMPOUNDS = NO |
|
| 572 |
+ |
|
| 573 |
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any |
|
| 574 |
+# documentation blocks found inside the body of a function. If set to NO, these |
|
| 575 |
+# blocks will be appended to the function's detailed documentation block. |
|
| 576 |
+# The default value is: NO. |
|
| 577 |
+ |
|
| 578 |
+HIDE_IN_BODY_DOCS = NO |
|
| 579 |
+ |
|
| 580 |
+# The INTERNAL_DOCS tag determines if documentation that is typed after a |
|
| 581 |
+# \internal command is included. If the tag is set to NO then the documentation |
|
| 582 |
+# will be excluded. Set it to YES to include the internal documentation. |
|
| 583 |
+# The default value is: NO. |
|
| 584 |
+ |
|
| 585 |
+INTERNAL_DOCS = NO |
|
| 586 |
+ |
|
| 587 |
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be |
|
| 588 |
+# able to match the capabilities of the underlying filesystem. In case the |
|
| 589 |
+# filesystem is case sensitive (i.e. it supports files in the same directory |
|
| 590 |
+# whose names only differ in casing), the option must be set to YES to properly |
|
| 591 |
+# deal with such files in case they appear in the input. For filesystems that |
|
| 592 |
+# are not case sensitive the option should be set to NO to properly deal with |
|
| 593 |
+# output files written for symbols that only differ in casing, such as for two |
|
| 594 |
+# classes, one named CLASS and the other named Class, and to also support |
|
| 595 |
+# references to files without having to specify the exact matching casing. On |
|
| 596 |
+# Windows (including Cygwin) and MacOS, users should typically set this option |
|
| 597 |
+# to NO, whereas on Linux or other Unix flavors it should typically be set to |
|
| 598 |
+# YES. |
|
| 599 |
+# Possible values are: SYSTEM, NO and YES. |
|
| 600 |
+# The default value is: SYSTEM. |
|
| 601 |
+ |
|
| 602 |
+CASE_SENSE_NAMES = NO |
|
| 603 |
+ |
|
| 604 |
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with |
|
| 605 |
+# their full class and namespace scopes in the documentation. If set to YES, the |
|
| 606 |
+# scope will be hidden. |
|
| 607 |
+# The default value is: NO. |
|
| 608 |
+ |
|
| 609 |
+HIDE_SCOPE_NAMES = NO |
|
| 610 |
+ |
|
| 611 |
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will |
|
| 612 |
+# append additional text to a page's title, such as Class Reference. If set to |
|
| 613 |
+# YES the compound reference will be hidden. |
|
| 614 |
+# The default value is: NO. |
|
| 615 |
+ |
|
| 616 |
+HIDE_COMPOUND_REFERENCE= NO |
|
| 617 |
+ |
|
| 618 |
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class |
|
| 619 |
+# will show which file needs to be included to use the class. |
|
| 620 |
+# The default value is: YES. |
|
| 621 |
+ |
|
| 622 |
+SHOW_HEADERFILE = YES |
|
| 623 |
+ |
|
| 624 |
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of |
|
| 625 |
+# the files that are included by a file in the documentation of that file. |
|
| 626 |
+# The default value is: YES. |
|
| 627 |
+ |
|
| 628 |
+SHOW_INCLUDE_FILES = YES |
|
| 629 |
+ |
|
| 630 |
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each |
|
| 631 |
+# grouped member an include statement to the documentation, telling the reader |
|
| 632 |
+# which file to include in order to use the member. |
|
| 633 |
+# The default value is: NO. |
|
| 634 |
+ |
|
| 635 |
+SHOW_GROUPED_MEMB_INC = YES |
|
| 636 |
+ |
|
| 637 |
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include |
|
| 638 |
+# files with double quotes in the documentation rather than with sharp brackets. |
|
| 639 |
+# The default value is: NO. |
|
| 640 |
+ |
|
| 641 |
+FORCE_LOCAL_INCLUDES = NO |
|
| 642 |
+ |
|
| 643 |
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the |
|
| 644 |
+# documentation for inline members. |
|
| 645 |
+# The default value is: YES. |
|
| 646 |
+ |
|
| 647 |
+INLINE_INFO = YES |
|
| 648 |
+ |
|
| 649 |
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the |
|
| 650 |
+# (detailed) documentation of file and class members alphabetically by member |
|
| 651 |
+# name. If set to NO, the members will appear in declaration order. |
|
| 652 |
+# The default value is: YES. |
|
| 653 |
+ |
|
| 654 |
+SORT_MEMBER_DOCS = YES |
|
| 655 |
+ |
|
| 656 |
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief |
|
| 657 |
+# descriptions of file, namespace and class members alphabetically by member |
|
| 658 |
+# name. If set to NO, the members will appear in declaration order. Note that |
|
| 659 |
+# this will also influence the order of the classes in the class list. |
|
| 660 |
+# The default value is: NO. |
|
| 661 |
+ |
|
| 662 |
+SORT_BRIEF_DOCS = NO |
|
| 663 |
+ |
|
| 664 |
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the |
|
| 665 |
+# (brief and detailed) documentation of class members so that constructors and |
|
| 666 |
+# destructors are listed first. If set to NO the constructors will appear in the |
|
| 667 |
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. |
|
| 668 |
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief |
|
| 669 |
+# member documentation. |
|
| 670 |
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting |
|
| 671 |
+# detailed member documentation. |
|
| 672 |
+# The default value is: NO. |
|
| 673 |
+ |
|
| 674 |
+SORT_MEMBERS_CTORS_1ST = NO |
|
| 675 |
+ |
|
| 676 |
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy |
|
| 677 |
+# of group names into alphabetical order. If set to NO the group names will |
|
| 678 |
+# appear in their defined order. |
|
| 679 |
+# The default value is: NO. |
|
| 680 |
+ |
|
| 681 |
+SORT_GROUP_NAMES = NO |
|
| 682 |
+ |
|
| 683 |
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by |
|
| 684 |
+# fully-qualified names, including namespaces. If set to NO, the class list will |
|
| 685 |
+# be sorted only by class name, not including the namespace part. |
|
| 686 |
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. |
|
| 687 |
+# Note: This option applies only to the class list, not to the alphabetical |
|
| 688 |
+# list. |
|
| 689 |
+# The default value is: NO. |
|
| 690 |
+ |
|
| 691 |
+SORT_BY_SCOPE_NAME = NO |
|
| 692 |
+ |
|
| 693 |
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper |
|
| 694 |
+# type resolution of all parameters of a function it will reject a match between |
|
| 695 |
+# the prototype and the implementation of a member function even if there is |
|
| 696 |
+# only one candidate or it is obvious which candidate to choose by doing a |
|
| 697 |
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still |
|
| 698 |
+# accept a match between prototype and implementation in such cases. |
|
| 699 |
+# The default value is: NO. |
|
| 700 |
+ |
|
| 701 |
+STRICT_PROTO_MATCHING = NO |
|
| 702 |
+ |
|
| 703 |
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo |
|
| 704 |
+# list. This list is created by putting \todo commands in the documentation. |
|
| 705 |
+# The default value is: YES. |
|
| 706 |
+ |
|
| 707 |
+GENERATE_TODOLIST = YES |
|
| 708 |
+ |
|
| 709 |
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test |
|
| 710 |
+# list. This list is created by putting \test commands in the documentation. |
|
| 711 |
+# The default value is: YES. |
|
| 712 |
+ |
|
| 713 |
+GENERATE_TESTLIST = YES |
|
| 714 |
+ |
|
| 715 |
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug |
|
| 716 |
+# list. This list is created by putting \bug commands in the documentation. |
|
| 717 |
+# The default value is: YES. |
|
| 718 |
+ |
|
| 719 |
+GENERATE_BUGLIST = YES |
|
| 720 |
+ |
|
| 721 |
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) |
|
| 722 |
+# the deprecated list. This list is created by putting \deprecated commands in |
|
| 723 |
+# the documentation. |
|
| 724 |
+# The default value is: YES. |
|
| 725 |
+ |
|
| 726 |
+GENERATE_DEPRECATEDLIST= YES |
|
| 727 |
+ |
|
| 728 |
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation |
|
| 729 |
+# sections, marked by \if <section_label> ... \endif and \cond <section_label> |
|
| 730 |
+# ... \endcond blocks. |
|
| 731 |
+ |
|
| 732 |
+ENABLED_SECTIONS = |
|
| 733 |
+ |
|
| 734 |
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the |
|
| 735 |
+# initial value of a variable or macro / define can have for it to appear in the |
|
| 736 |
+# documentation. If the initializer consists of more lines than specified here |
|
| 737 |
+# it will be hidden. Use a value of 0 to hide initializers completely. The |
|
| 738 |
+# appearance of the value of individual variables and macros / defines can be |
|
| 739 |
+# controlled using \showinitializer or \hideinitializer command in the |
|
| 740 |
+# documentation regardless of this setting. |
|
| 741 |
+# Minimum value: 0, maximum value: 10000, default value: 30. |
|
| 742 |
+ |
|
| 743 |
+MAX_INITIALIZER_LINES = 30 |
|
| 744 |
+ |
|
| 745 |
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at |
|
| 746 |
+# the bottom of the documentation of classes and structs. If set to YES, the |
|
| 747 |
+# list will mention the files that were used to generate the documentation. |
|
| 748 |
+# The default value is: YES. |
|
| 749 |
+ |
|
| 750 |
+SHOW_USED_FILES = YES |
|
| 751 |
+ |
|
| 752 |
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This |
|
| 753 |
+# will remove the Files entry from the Quick Index and from the Folder Tree View |
|
| 754 |
+# (if specified). |
|
| 755 |
+# The default value is: YES. |
|
| 756 |
+ |
|
| 757 |
+SHOW_FILES = YES |
|
| 758 |
+ |
|
| 759 |
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces |
|
| 760 |
+# page. This will remove the Namespaces entry from the Quick Index and from the |
|
| 761 |
+# Folder Tree View (if specified). |
|
| 762 |
+# The default value is: YES. |
|
| 763 |
+ |
|
| 764 |
+SHOW_NAMESPACES = YES |
|
| 765 |
+ |
|
| 766 |
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that |
|
| 767 |
+# doxygen should invoke to get the current version for each file (typically from |
|
| 768 |
+# the version control system). Doxygen will invoke the program by executing (via |
|
| 769 |
+# popen()) the command command input-file, where command is the value of the |
|
| 770 |
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided |
|
| 771 |
+# by doxygen. Whatever the program writes to standard output is used as the file |
|
| 772 |
+# version. For an example see the documentation. |
|
| 773 |
+ |
|
| 774 |
+FILE_VERSION_FILTER = |
|
| 775 |
+ |
|
| 776 |
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed |
|
| 777 |
+# by doxygen. The layout file controls the global structure of the generated |
|
| 778 |
+# output files in an output format independent way. To create the layout file |
|
| 779 |
+# that represents doxygen's defaults, run doxygen with the -l option. You can |
|
| 780 |
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml |
|
| 781 |
+# will be used as the name of the layout file. See also section "Changing the |
|
| 782 |
+# layout of pages" for information. |
|
| 783 |
+# |
|
| 784 |
+# Note that if you run doxygen from a directory containing a file called |
|
| 785 |
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE |
|
| 786 |
+# tag is left empty. |
|
| 787 |
+ |
|
| 788 |
+LAYOUT_FILE = |
|
| 789 |
+ |
|
| 790 |
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing |
|
| 791 |
+# the reference definitions. This must be a list of .bib files. The .bib |
|
| 792 |
+# extension is automatically appended if omitted. This requires the bibtex tool |
|
| 793 |
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. |
|
| 794 |
+# For LaTeX the style of the bibliography can be controlled using |
|
| 795 |
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the |
|
| 796 |
+# search path. See also \cite for info how to create references. |
|
| 797 |
+ |
|
| 798 |
+CITE_BIB_FILES = |
|
| 799 |
+ |
|
| 800 |
+#--------------------------------------------------------------------------- |
|
| 801 |
+# Configuration options related to warning and progress messages |
|
| 802 |
+#--------------------------------------------------------------------------- |
|
| 803 |
+ |
|
| 804 |
+# The QUIET tag can be used to turn on/off the messages that are generated to |
|
| 805 |
+# standard output by doxygen. If QUIET is set to YES this implies that the |
|
| 806 |
+# messages are off. |
|
| 807 |
+# The default value is: NO. |
|
| 808 |
+ |
|
| 809 |
+QUIET = NO |
|
| 810 |
+ |
|
| 811 |
+# The WARNINGS tag can be used to turn on/off the warning messages that are |
|
| 812 |
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES |
|
| 813 |
+# this implies that the warnings are on. |
|
| 814 |
+# |
|
| 815 |
+# Tip: Turn warnings on while writing the documentation. |
|
| 816 |
+# The default value is: YES. |
|
| 817 |
+ |
|
| 818 |
+WARNINGS = YES |
|
| 819 |
+ |
|
| 820 |
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate |
|
| 821 |
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag |
|
| 822 |
+# will automatically be disabled. |
|
| 823 |
+# The default value is: YES. |
|
| 824 |
+ |
|
| 825 |
+WARN_IF_UNDOCUMENTED = YES |
|
| 826 |
+ |
|
| 827 |
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for |
|
| 828 |
+# potential errors in the documentation, such as documenting some parameters in |
|
| 829 |
+# a documented function twice, or documenting parameters that don't exist or |
|
| 830 |
+# using markup commands wrongly. |
|
| 831 |
+# The default value is: YES. |
|
| 832 |
+ |
|
| 833 |
+WARN_IF_DOC_ERROR = YES |
|
| 834 |
+ |
|
| 835 |
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete |
|
| 836 |
+# function parameter documentation. If set to NO, doxygen will accept that some |
|
| 837 |
+# parameters have no documentation without warning. |
|
| 838 |
+# The default value is: YES. |
|
| 839 |
+ |
|
| 840 |
+WARN_IF_INCOMPLETE_DOC = YES |
|
| 841 |
+ |
|
| 842 |
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that |
|
| 843 |
+# are documented, but have no documentation for their parameters or return |
|
| 844 |
+# value. If set to NO, doxygen will only warn about wrong parameter |
|
| 845 |
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is |
|
| 846 |
+# set to YES then this flag will automatically be disabled. See also |
|
| 847 |
+# WARN_IF_INCOMPLETE_DOC |
|
| 848 |
+# The default value is: NO. |
|
| 849 |
+ |
|
| 850 |
+WARN_NO_PARAMDOC = YES |
|
| 851 |
+ |
|
| 852 |
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when |
|
| 853 |
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS |
|
| 854 |
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but |
|
| 855 |
+# at the end of the doxygen process doxygen will return with a non-zero status. |
|
| 856 |
+# Possible values are: NO, YES and FAIL_ON_WARNINGS. |
|
| 857 |
+# The default value is: NO. |
|
| 858 |
+ |
|
| 859 |
+WARN_AS_ERROR = YES |
|
| 860 |
+ |
|
| 861 |
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen |
|
| 862 |
+# can produce. The string should contain the $file, $line, and $text tags, which |
|
| 863 |
+# will be replaced by the file and line number from which the warning originated |
|
| 864 |
+# and the warning text. Optionally the format may contain $version, which will |
|
| 865 |
+# be replaced by the version of the file (if it could be obtained via |
|
| 866 |
+# FILE_VERSION_FILTER) |
|
| 867 |
+# See also: WARN_LINE_FORMAT |
|
| 868 |
+# The default value is: $file:$line: $text. |
|
| 869 |
+ |
|
| 870 |
+WARN_FORMAT = "$file:$line: $text" |
|
| 871 |
+ |
|
| 872 |
+# In the $text part of the WARN_FORMAT command it is possible that a reference |
|
| 873 |
+# to a more specific place is given. To make it easier to jump to this place |
|
| 874 |
+# (outside of doxygen) the user can define a custom "cut" / "paste" string. |
|
| 875 |
+# Example: |
|
| 876 |
+# WARN_LINE_FORMAT = "'vi $file +$line'" |
|
| 877 |
+# See also: WARN_FORMAT |
|
| 878 |
+# The default value is: at line $line of file $file. |
|
| 879 |
+ |
|
| 880 |
+WARN_LINE_FORMAT = "at line $line of file $file" |
|
| 881 |
+ |
|
| 882 |
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error |
|
| 883 |
+# messages should be written. If left blank the output is written to standard |
|
| 884 |
+# error (stderr). In case the file specified cannot be opened for writing the |
|
| 885 |
+# warning and error messages are written to standard error. When as file - is |
|
| 886 |
+# specified the warning and error messages are written to standard output |
|
| 887 |
+# (stdout). |
|
| 888 |
+ |
|
| 889 |
+WARN_LOGFILE = warnings.log |
|
| 890 |
+ |
|
| 891 |
+#--------------------------------------------------------------------------- |
|
| 892 |
+# Configuration options related to the input files |
|
| 893 |
+#--------------------------------------------------------------------------- |
|
| 894 |
+ |
|
| 895 |
+# The INPUT tag is used to specify the files and/or directories that contain |
|
| 896 |
+# documented source files. You may enter file names like myfile.cpp or |
|
| 897 |
+# directories like /usr/src/myproject. Separate the files or directories with |
|
| 898 |
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING |
|
| 899 |
+# Note: If this tag is empty the current directory is searched. |
|
| 900 |
+ |
|
| 901 |
+INPUT = ../src |
|
| 902 |
+ |
|
| 903 |
+# This tag can be used to specify the character encoding of the source files |
|
| 904 |
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses |
|
| 905 |
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv |
|
| 906 |
+# documentation (see: |
|
| 907 |
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings. |
|
| 908 |
+# See also: INPUT_FILE_ENCODING |
|
| 909 |
+# The default value is: UTF-8. |
|
| 910 |
+ |
|
| 911 |
+INPUT_ENCODING = UTF-8 |
|
| 912 |
+ |
|
| 913 |
+# This tag can be used to specify the character encoding of the source files |
|
| 914 |
+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify |
|
| 915 |
+# character encoding on a per file pattern basis. Doxygen will compare the file |
|
| 916 |
+# name with each pattern and apply the encoding instead of the default |
|
| 917 |
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the |
|
| 918 |
+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding |
|
| 919 |
+# "INPUT_ENCODING" for further information on supported encodings. |
|
| 920 |
+ |
|
| 921 |
+INPUT_FILE_ENCODING = |
|
| 922 |
+ |
|
| 923 |
+# If the value of the INPUT tag contains directories, you can use the |
|
| 924 |
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and |
|
| 925 |
+# *.h) to filter out the source-files in the directories. |
|
| 926 |
+# |
|
| 927 |
+# Note that for custom extensions or not directly supported extensions you also |
|
| 928 |
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not |
|
| 929 |
+# read by doxygen. |
|
| 930 |
+# |
|
| 931 |
+# Note the list of default checked file patterns might differ from the list of |
|
| 932 |
+# default file extension mappings. |
|
| 933 |
+# |
|
| 934 |
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, |
|
| 935 |
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, |
|
| 936 |
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, |
|
| 937 |
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C |
|
| 938 |
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, |
|
| 939 |
+# *.vhdl, *.ucf, *.qsf and *.ice. |
|
| 940 |
+ |
|
| 941 |
+FILE_PATTERNS = *.h \ |
|
| 942 |
+ *.cpp |
|
| 943 |
+ |
|
| 944 |
+# The RECURSIVE tag can be used to specify whether or not subdirectories should |
|
| 945 |
+# be searched for input files as well. |
|
| 946 |
+# The default value is: NO. |
|
| 947 |
+ |
|
| 948 |
+RECURSIVE = NO |
|
| 949 |
+ |
|
| 950 |
+# The EXCLUDE tag can be used to specify files and/or directories that should be |
|
| 951 |
+# excluded from the INPUT source files. This way you can easily exclude a |
|
| 952 |
+# subdirectory from a directory tree whose root is specified with the INPUT tag. |
|
| 953 |
+# |
|
| 954 |
+# Note that relative paths are relative to the directory from which doxygen is |
|
| 955 |
+# run. |
|
| 956 |
+ |
|
| 957 |
+EXCLUDE = |
|
| 958 |
+ |
|
| 959 |
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or |
|
| 960 |
+# directories that are symbolic links (a Unix file system feature) are excluded |
|
| 961 |
+# from the input. |
|
| 962 |
+# The default value is: NO. |
|
| 963 |
+ |
|
| 964 |
+EXCLUDE_SYMLINKS = NO |
|
| 965 |
+ |
|
| 966 |
+# If the value of the INPUT tag contains directories, you can use the |
|
| 967 |
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude |
|
| 968 |
+# certain files from those directories. |
|
| 969 |
+# |
|
| 970 |
+# Note that the wildcards are matched against the file with absolute path, so to |
|
| 971 |
+# exclude all test directories for example use the pattern */test/* |
|
| 972 |
+ |
|
| 973 |
+EXCLUDE_PATTERNS = moc_*.cpp |
|
| 974 |
+ |
|
| 975 |
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names |
|
| 976 |
+# (namespaces, classes, functions, etc.) that should be excluded from the |
|
| 977 |
+# output. The symbol name can be a fully qualified name, a word, or if the |
|
| 978 |
+# wildcard * is used, a substring. Examples: ANamespace, AClass, |
|
| 979 |
+# ANamespace::AClass, ANamespace::*Test |
|
| 980 |
+# |
|
| 981 |
+# Note that the wildcards are matched against the file with absolute path, so to |
|
| 982 |
+# exclude all test directories use the pattern */test/* |
|
| 983 |
+ |
|
| 984 |
+EXCLUDE_SYMBOLS = |
|
| 985 |
+ |
|
| 986 |
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories |
|
| 987 |
+# that contain example code fragments that are included (see the \include |
|
| 988 |
+# command). |
|
| 989 |
+ |
|
| 990 |
+EXAMPLE_PATH = |
|
| 991 |
+ |
|
| 992 |
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the |
|
| 993 |
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and |
|
| 994 |
+# *.h) to filter out the source-files in the directories. If left blank all |
|
| 995 |
+# files are included. |
|
| 996 |
+ |
|
| 997 |
+EXAMPLE_PATTERNS = |
|
| 998 |
+ |
|
| 999 |
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be |
|
| 1000 |
+# searched for input files to be used with the \include or \dontinclude commands |
|
| 1001 |
+# irrespective of the value of the RECURSIVE tag. |
|
| 1002 |
+# The default value is: NO. |
|
| 1003 |
+ |
|
| 1004 |
+EXAMPLE_RECURSIVE = NO |
|
| 1005 |
+ |
|
| 1006 |
+# The IMAGE_PATH tag can be used to specify one or more files or directories |
|
| 1007 |
+# that contain images that are to be included in the documentation (see the |
|
| 1008 |
+# \image command). |
|
| 1009 |
+ |
|
| 1010 |
+IMAGE_PATH = |
|
| 1011 |
+ |
|
| 1012 |
+# The INPUT_FILTER tag can be used to specify a program that doxygen should |
|
| 1013 |
+# invoke to filter for each input file. Doxygen will invoke the filter program |
|
| 1014 |
+# by executing (via popen()) the command: |
|
| 1015 |
+# |
|
| 1016 |
+# <filter> <input-file> |
|
| 1017 |
+# |
|
| 1018 |
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the |
|
| 1019 |
+# name of an input file. Doxygen will then use the output that the filter |
|
| 1020 |
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag |
|
| 1021 |
+# will be ignored. |
|
| 1022 |
+# |
|
| 1023 |
+# Note that the filter must not add or remove lines; it is applied before the |
|
| 1024 |
+# code is scanned, but not when the output code is generated. If lines are added |
|
| 1025 |
+# or removed, the anchors will not be placed correctly. |
|
| 1026 |
+# |
|
| 1027 |
+# Note that doxygen will use the data processed and written to standard output |
|
| 1028 |
+# for further processing, therefore nothing else, like debug statements or used |
|
| 1029 |
+# commands (so in case of a Windows batch file always use @echo OFF), should be |
|
| 1030 |
+# written to standard output. |
|
| 1031 |
+# |
|
| 1032 |
+# Note that for custom extensions or not directly supported extensions you also |
|
| 1033 |
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not |
|
| 1034 |
+# properly processed by doxygen. |
|
| 1035 |
+ |
|
| 1036 |
+INPUT_FILTER = |
|
| 1037 |
+ |
|
| 1038 |
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern |
|
| 1039 |
+# basis. Doxygen will compare the file name with each pattern and apply the |
|
| 1040 |
+# filter if there is a match. The filters are a list of the form: pattern=filter |
|
| 1041 |
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how |
|
| 1042 |
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the |
|
| 1043 |
+# patterns match the file name, INPUT_FILTER is applied. |
|
| 1044 |
+# |
|
| 1045 |
+# Note that for custom extensions or not directly supported extensions you also |
|
| 1046 |
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not |
|
| 1047 |
+# properly processed by doxygen. |
|
| 1048 |
+ |
|
| 1049 |
+FILTER_PATTERNS = |
|
| 1050 |
+ |
|
| 1051 |
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using |
|
| 1052 |
+# INPUT_FILTER) will also be used to filter the input files that are used for |
|
| 1053 |
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). |
|
| 1054 |
+# The default value is: NO. |
|
| 1055 |
+ |
|
| 1056 |
+FILTER_SOURCE_FILES = NO |
|
| 1057 |
+ |
|
| 1058 |
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file |
|
| 1059 |
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and |
|
| 1060 |
+# it is also possible to disable source filtering for a specific pattern using |
|
| 1061 |
+# *.ext= (so without naming a filter). |
|
| 1062 |
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. |
|
| 1063 |
+ |
|
| 1064 |
+FILTER_SOURCE_PATTERNS = |
|
| 1065 |
+ |
|
| 1066 |
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that |
|
| 1067 |
+# is part of the input, its contents will be placed on the main page |
|
| 1068 |
+# (index.html). This can be useful if you have a project on for instance GitHub |
|
| 1069 |
+# and want to reuse the introduction page also for the doxygen output. |
|
| 1070 |
+ |
|
| 1071 |
+USE_MDFILE_AS_MAINPAGE = |
|
| 1072 |
+ |
|
| 1073 |
+# The Fortran standard specifies that for fixed formatted Fortran code all |
|
| 1074 |
+# characters from position 72 are to be considered as comment. A common |
|
| 1075 |
+# extension is to allow longer lines before the automatic comment starts. The |
|
| 1076 |
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can |
|
| 1077 |
+# be processed before the automatic comment starts. |
|
| 1078 |
+# Minimum value: 7, maximum value: 10000, default value: 72. |
|
| 1079 |
+ |
|
| 1080 |
+FORTRAN_COMMENT_AFTER = 72 |
|
| 1081 |
+ |
|
| 1082 |
+#--------------------------------------------------------------------------- |
|
| 1083 |
+# Configuration options related to source browsing |
|
| 1084 |
+#--------------------------------------------------------------------------- |
|
| 1085 |
+ |
|
| 1086 |
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be |
|
| 1087 |
+# generated. Documented entities will be cross-referenced with these sources. |
|
| 1088 |
+# |
|
| 1089 |
+# Note: To get rid of all source code in the generated output, make sure that |
|
| 1090 |
+# also VERBATIM_HEADERS is set to NO. |
|
| 1091 |
+# The default value is: NO. |
|
| 1092 |
+ |
|
| 1093 |
+SOURCE_BROWSER = YES |
|
| 1094 |
+ |
|
| 1095 |
+# Setting the INLINE_SOURCES tag to YES will include the body of functions, |
|
| 1096 |
+# classes and enums directly into the documentation. |
|
| 1097 |
+# The default value is: NO. |
|
| 1098 |
+ |
|
| 1099 |
+INLINE_SOURCES = YES |
|
| 1100 |
+ |
|
| 1101 |
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any |
|
| 1102 |
+# special comment blocks from generated source code fragments. Normal C, C++ and |
|
| 1103 |
+# Fortran comments will always remain visible. |
|
| 1104 |
+# The default value is: YES. |
|
| 1105 |
+ |
|
| 1106 |
+STRIP_CODE_COMMENTS = NO |
|
| 1107 |
+ |
|
| 1108 |
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented |
|
| 1109 |
+# entity all documented functions referencing it will be listed. |
|
| 1110 |
+# The default value is: NO. |
|
| 1111 |
+ |
|
| 1112 |
+REFERENCED_BY_RELATION = YES |
|
| 1113 |
+ |
|
| 1114 |
+# If the REFERENCES_RELATION tag is set to YES then for each documented function |
|
| 1115 |
+# all documented entities called/used by that function will be listed. |
|
| 1116 |
+# The default value is: NO. |
|
| 1117 |
+ |
|
| 1118 |
+REFERENCES_RELATION = YES |
|
| 1119 |
+ |
|
| 1120 |
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set |
|
| 1121 |
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and |
|
| 1122 |
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will |
|
| 1123 |
+# link to the documentation. |
|
| 1124 |
+# The default value is: YES. |
|
| 1125 |
+ |
|
| 1126 |
+REFERENCES_LINK_SOURCE = YES |
|
| 1127 |
+ |
|
| 1128 |
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the |
|
| 1129 |
+# source code will show a tooltip with additional information such as prototype, |
|
| 1130 |
+# brief description and links to the definition and documentation. Since this |
|
| 1131 |
+# will make the HTML file larger and loading of large files a bit slower, you |
|
| 1132 |
+# can opt to disable this feature. |
|
| 1133 |
+# The default value is: YES. |
|
| 1134 |
+# This tag requires that the tag SOURCE_BROWSER is set to YES. |
|
| 1135 |
+ |
|
| 1136 |
+SOURCE_TOOLTIPS = YES |
|
| 1137 |
+ |
|
| 1138 |
+# If the USE_HTAGS tag is set to YES then the references to source code will |
|
| 1139 |
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in |
|
| 1140 |
+# source browser. The htags tool is part of GNU's global source tagging system |
|
| 1141 |
+# (see https://www.gnu.org/software/global/global.html). You will need version |
|
| 1142 |
+# 4.8.6 or higher. |
|
| 1143 |
+# |
|
| 1144 |
+# To use it do the following: |
|
| 1145 |
+# - Install the latest version of global |
|
| 1146 |
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file |
|
| 1147 |
+# - Make sure the INPUT points to the root of the source tree |
|
| 1148 |
+# - Run doxygen as normal |
|
| 1149 |
+# |
|
| 1150 |
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these |
|
| 1151 |
+# tools must be available from the command line (i.e. in the search path). |
|
| 1152 |
+# |
|
| 1153 |
+# The result: instead of the source browser generated by doxygen, the links to |
|
| 1154 |
+# source code will now point to the output of htags. |
|
| 1155 |
+# The default value is: NO. |
|
| 1156 |
+# This tag requires that the tag SOURCE_BROWSER is set to YES. |
|
| 1157 |
+ |
|
| 1158 |
+USE_HTAGS = NO |
|
| 1159 |
+ |
|
| 1160 |
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a |
|
| 1161 |
+# verbatim copy of the header file for each class for which an include is |
|
| 1162 |
+# specified. Set to NO to disable this. |
|
| 1163 |
+# See also: Section \class. |
|
| 1164 |
+# The default value is: YES. |
|
| 1165 |
+ |
|
| 1166 |
+VERBATIM_HEADERS = YES |
|
| 1167 |
+ |
|
| 1168 |
+#--------------------------------------------------------------------------- |
|
| 1169 |
+# Configuration options related to the alphabetical class index |
|
| 1170 |
+#--------------------------------------------------------------------------- |
|
| 1171 |
+ |
|
| 1172 |
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all |
|
| 1173 |
+# compounds will be generated. Enable this if the project contains a lot of |
|
| 1174 |
+# classes, structs, unions or interfaces. |
|
| 1175 |
+# The default value is: YES. |
|
| 1176 |
+ |
|
| 1177 |
+ALPHABETICAL_INDEX = YES |
|
| 1178 |
+ |
|
| 1179 |
+# In case all classes in a project start with a common prefix, all classes will |
|
| 1180 |
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag |
|
| 1181 |
+# can be used to specify a prefix (or a list of prefixes) that should be ignored |
|
| 1182 |
+# while generating the index headers. |
|
| 1183 |
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. |
|
| 1184 |
+ |
|
| 1185 |
+IGNORE_PREFIX = |
|
| 1186 |
+ |
|
| 1187 |
+#--------------------------------------------------------------------------- |
|
| 1188 |
+# Configuration options related to the HTML output |
|
| 1189 |
+#--------------------------------------------------------------------------- |
|
| 1190 |
+ |
|
| 1191 |
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output |
|
| 1192 |
+# The default value is: YES. |
|
| 1193 |
+ |
|
| 1194 |
+GENERATE_HTML = YES |
|
| 1195 |
+ |
|
| 1196 |
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a |
|
| 1197 |
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of |
|
| 1198 |
+# it. |
|
| 1199 |
+# The default directory is: html. |
|
| 1200 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1201 |
+ |
|
| 1202 |
+HTML_OUTPUT = |
|
| 1203 |
+ |
|
| 1204 |
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each |
|
| 1205 |
+# generated HTML page (for example: .htm, .php, .asp). |
|
| 1206 |
+# The default value is: .html. |
|
| 1207 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1208 |
+ |
|
| 1209 |
+HTML_FILE_EXTENSION = .html |
|
| 1210 |
+ |
|
| 1211 |
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for |
|
| 1212 |
+# each generated HTML page. If the tag is left blank doxygen will generate a |
|
| 1213 |
+# standard header. |
|
| 1214 |
+# |
|
| 1215 |
+# To get valid HTML the header file that includes any scripts and style sheets |
|
| 1216 |
+# that doxygen needs, which is dependent on the configuration options used (e.g. |
|
| 1217 |
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a |
|
| 1218 |
+# default header using |
|
| 1219 |
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css |
|
| 1220 |
+# YourConfigFile |
|
| 1221 |
+# and then modify the file new_header.html. See also section "Doxygen usage" |
|
| 1222 |
+# for information on how to generate the default header that doxygen normally |
|
| 1223 |
+# uses. |
|
| 1224 |
+# Note: The header is subject to change so you typically have to regenerate the |
|
| 1225 |
+# default header when upgrading to a newer version of doxygen. For a description |
|
| 1226 |
+# of the possible markers and block names see the documentation. |
|
| 1227 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1228 |
+ |
|
| 1229 |
+HTML_HEADER = |
|
| 1230 |
+ |
|
| 1231 |
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each |
|
| 1232 |
+# generated HTML page. If the tag is left blank doxygen will generate a standard |
|
| 1233 |
+# footer. See HTML_HEADER for more information on how to generate a default |
|
| 1234 |
+# footer and what special commands can be used inside the footer. See also |
|
| 1235 |
+# section "Doxygen usage" for information on how to generate the default footer |
|
| 1236 |
+# that doxygen normally uses. |
|
| 1237 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1238 |
+ |
|
| 1239 |
+HTML_FOOTER = |
|
| 1240 |
+ |
|
| 1241 |
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style |
|
| 1242 |
+# sheet that is used by each HTML page. It can be used to fine-tune the look of |
|
| 1243 |
+# the HTML output. If left blank doxygen will generate a default style sheet. |
|
| 1244 |
+# See also section "Doxygen usage" for information on how to generate the style |
|
| 1245 |
+# sheet that doxygen normally uses. |
|
| 1246 |
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as |
|
| 1247 |
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become |
|
| 1248 |
+# obsolete. |
|
| 1249 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1250 |
+ |
|
| 1251 |
+HTML_STYLESHEET = |
|
| 1252 |
+ |
|
| 1253 |
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined |
|
| 1254 |
+# cascading style sheets that are included after the standard style sheets |
|
| 1255 |
+# created by doxygen. Using this option one can overrule certain style aspects. |
|
| 1256 |
+# This is preferred over using HTML_STYLESHEET since it does not replace the |
|
| 1257 |
+# standard style sheet and is therefore more robust against future updates. |
|
| 1258 |
+# Doxygen will copy the style sheet files to the output directory. |
|
| 1259 |
+# Note: The order of the extra style sheet files is of importance (e.g. the last |
|
| 1260 |
+# style sheet in the list overrules the setting of the previous ones in the |
|
| 1261 |
+# list). For an example see the documentation. |
|
| 1262 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1263 |
+ |
|
| 1264 |
+HTML_EXTRA_STYLESHEET = |
|
| 1265 |
+ |
|
| 1266 |
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or |
|
| 1267 |
+# other source files which should be copied to the HTML output directory. Note |
|
| 1268 |
+# that these files will be copied to the base HTML output directory. Use the |
|
| 1269 |
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these |
|
| 1270 |
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the |
|
| 1271 |
+# files will be copied as-is; there are no commands or markers available. |
|
| 1272 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1273 |
+ |
|
| 1274 |
+HTML_EXTRA_FILES = |
|
| 1275 |
+ |
|
| 1276 |
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output |
|
| 1277 |
+# should be rendered with a dark or light theme. Default setting AUTO_LIGHT |
|
| 1278 |
+# enables light output unless the user preference is dark output. Other options |
|
| 1279 |
+# are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to |
|
| 1280 |
+# default to dark mode unless the user prefers light mode, and TOGGLE to let the |
|
| 1281 |
+# user toggle between dark and light mode via a button. |
|
| 1282 |
+# Possible values are: LIGHT Always generate light output., DARK Always generate |
|
| 1283 |
+# dark output., AUTO_LIGHT Automatically set the mode according to the user |
|
| 1284 |
+# preference, use light mode if no preference is set (the default)., AUTO_DARK |
|
| 1285 |
+# Automatically set the mode according to the user preference, use dark mode if |
|
| 1286 |
+# no preference is set. and TOGGLE Allow to user to switch between light and |
|
| 1287 |
+# dark mode via a button.. |
|
| 1288 |
+# The default value is: AUTO_LIGHT. |
|
| 1289 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1290 |
+ |
|
| 1291 |
+HTML_COLORSTYLE = AUTO_LIGHT |
|
| 1292 |
+ |
|
| 1293 |
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen |
|
| 1294 |
+# will adjust the colors in the style sheet and background images according to |
|
| 1295 |
+# this color. Hue is specified as an angle on a color-wheel, see |
|
| 1296 |
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value |
|
| 1297 |
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 |
|
| 1298 |
+# purple, and 360 is red again. |
|
| 1299 |
+# Minimum value: 0, maximum value: 359, default value: 220. |
|
| 1300 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1301 |
+ |
|
| 1302 |
+HTML_COLORSTYLE_HUE = 220 |
|
| 1303 |
+ |
|
| 1304 |
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors |
|
| 1305 |
+# in the HTML output. For a value of 0 the output will use gray-scales only. A |
|
| 1306 |
+# value of 255 will produce the most vivid colors. |
|
| 1307 |
+# Minimum value: 0, maximum value: 255, default value: 100. |
|
| 1308 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1309 |
+ |
|
| 1310 |
+HTML_COLORSTYLE_SAT = 100 |
|
| 1311 |
+ |
|
| 1312 |
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the |
|
| 1313 |
+# luminance component of the colors in the HTML output. Values below 100 |
|
| 1314 |
+# gradually make the output lighter, whereas values above 100 make the output |
|
| 1315 |
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents |
|
| 1316 |
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not |
|
| 1317 |
+# change the gamma. |
|
| 1318 |
+# Minimum value: 40, maximum value: 240, default value: 80. |
|
| 1319 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1320 |
+ |
|
| 1321 |
+HTML_COLORSTYLE_GAMMA = 80 |
|
| 1322 |
+ |
|
| 1323 |
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML |
|
| 1324 |
+# page will contain the date and time when the page was generated. Setting this |
|
| 1325 |
+# to YES can help to show when doxygen was last run and thus if the |
|
| 1326 |
+# documentation is up to date. |
|
| 1327 |
+# The default value is: NO. |
|
| 1328 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1329 |
+ |
|
| 1330 |
+HTML_TIMESTAMP = YES |
|
| 1331 |
+ |
|
| 1332 |
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML |
|
| 1333 |
+# documentation will contain a main index with vertical navigation menus that |
|
| 1334 |
+# are dynamically created via JavaScript. If disabled, the navigation index will |
|
| 1335 |
+# consists of multiple levels of tabs that are statically embedded in every HTML |
|
| 1336 |
+# page. Disable this option to support browsers that do not have JavaScript, |
|
| 1337 |
+# like the Qt help browser. |
|
| 1338 |
+# The default value is: YES. |
|
| 1339 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1340 |
+ |
|
| 1341 |
+HTML_DYNAMIC_MENUS = NO |
|
| 1342 |
+ |
|
| 1343 |
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML |
|
| 1344 |
+# documentation will contain sections that can be hidden and shown after the |
|
| 1345 |
+# page has loaded. |
|
| 1346 |
+# The default value is: NO. |
|
| 1347 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1348 |
+ |
|
| 1349 |
+HTML_DYNAMIC_SECTIONS = NO |
|
| 1350 |
+ |
|
| 1351 |
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries |
|
| 1352 |
+# shown in the various tree structured indices initially; the user can expand |
|
| 1353 |
+# and collapse entries dynamically later on. Doxygen will expand the tree to |
|
| 1354 |
+# such a level that at most the specified number of entries are visible (unless |
|
| 1355 |
+# a fully collapsed tree already exceeds this amount). So setting the number of |
|
| 1356 |
+# entries 1 will produce a full collapsed tree by default. 0 is a special value |
|
| 1357 |
+# representing an infinite number of entries and will result in a full expanded |
|
| 1358 |
+# tree by default. |
|
| 1359 |
+# Minimum value: 0, maximum value: 9999, default value: 100. |
|
| 1360 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1361 |
+ |
|
| 1362 |
+HTML_INDEX_NUM_ENTRIES = 100 |
|
| 1363 |
+ |
|
| 1364 |
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be |
|
| 1365 |
+# generated that can be used as input for Apple's Xcode 3 integrated development |
|
| 1366 |
+# environment (see: |
|
| 1367 |
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To |
|
| 1368 |
+# create a documentation set, doxygen will generate a Makefile in the HTML |
|
| 1369 |
+# output directory. Running make will produce the docset in that directory and |
|
| 1370 |
+# running make install will install the docset in |
|
| 1371 |
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at |
|
| 1372 |
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy |
|
| 1373 |
+# genXcode/_index.html for more information. |
|
| 1374 |
+# The default value is: NO. |
|
| 1375 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1376 |
+ |
|
| 1377 |
+GENERATE_DOCSET = NO |
|
| 1378 |
+ |
|
| 1379 |
+# This tag determines the name of the docset feed. A documentation feed provides |
|
| 1380 |
+# an umbrella under which multiple documentation sets from a single provider |
|
| 1381 |
+# (such as a company or product suite) can be grouped. |
|
| 1382 |
+# The default value is: Doxygen generated docs. |
|
| 1383 |
+# This tag requires that the tag GENERATE_DOCSET is set to YES. |
|
| 1384 |
+ |
|
| 1385 |
+DOCSET_FEEDNAME = "Doxygen docs" |
|
| 1386 |
+ |
|
| 1387 |
+# This tag determines the URL of the docset feed. A documentation feed provides |
|
| 1388 |
+# an umbrella under which multiple documentation sets from a single provider |
|
| 1389 |
+# (such as a company or product suite) can be grouped. |
|
| 1390 |
+# This tag requires that the tag GENERATE_DOCSET is set to YES. |
|
| 1391 |
+ |
|
| 1392 |
+DOCSET_FEEDURL = |
|
| 1393 |
+ |
|
| 1394 |
+# This tag specifies a string that should uniquely identify the documentation |
|
| 1395 |
+# set bundle. This should be a reverse domain-name style string, e.g. |
|
| 1396 |
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name. |
|
| 1397 |
+# The default value is: org.doxygen.Project. |
|
| 1398 |
+# This tag requires that the tag GENERATE_DOCSET is set to YES. |
|
| 1399 |
+ |
|
| 1400 |
+DOCSET_BUNDLE_ID = org.doxygen.Doxygen |
|
| 1401 |
+ |
|
| 1402 |
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify |
|
| 1403 |
+# the documentation publisher. This should be a reverse domain-name style |
|
| 1404 |
+# string, e.g. com.mycompany.MyDocSet.documentation. |
|
| 1405 |
+# The default value is: org.doxygen.Publisher. |
|
| 1406 |
+# This tag requires that the tag GENERATE_DOCSET is set to YES. |
|
| 1407 |
+ |
|
| 1408 |
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher |
|
| 1409 |
+ |
|
| 1410 |
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. |
|
| 1411 |
+# The default value is: Publisher. |
|
| 1412 |
+# This tag requires that the tag GENERATE_DOCSET is set to YES. |
|
| 1413 |
+ |
|
| 1414 |
+DOCSET_PUBLISHER_NAME = Publisher |
|
| 1415 |
+ |
|
| 1416 |
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three |
|
| 1417 |
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The |
|
| 1418 |
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop |
|
| 1419 |
+# on Windows. In the beginning of 2021 Microsoft took the original page, with |
|
| 1420 |
+# a.o. the download links, offline the HTML help workshop was already many years |
|
| 1421 |
+# in maintenance mode). You can download the HTML help workshop from the web |
|
| 1422 |
+# archives at Installation executable (see: |
|
| 1423 |
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo |
|
| 1424 |
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). |
|
| 1425 |
+# |
|
| 1426 |
+# The HTML Help Workshop contains a compiler that can convert all HTML output |
|
| 1427 |
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML |
|
| 1428 |
+# files are now used as the Windows 98 help format, and will replace the old |
|
| 1429 |
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed |
|
| 1430 |
+# HTML files also contain an index, a table of contents, and you can search for |
|
| 1431 |
+# words in the documentation. The HTML workshop also contains a viewer for |
|
| 1432 |
+# compressed HTML files. |
|
| 1433 |
+# The default value is: NO. |
|
| 1434 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1435 |
+ |
|
| 1436 |
+GENERATE_HTMLHELP = NO |
|
| 1437 |
+ |
|
| 1438 |
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm |
|
| 1439 |
+# file. You can add a path in front of the file if the result should not be |
|
| 1440 |
+# written to the html output directory. |
|
| 1441 |
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES. |
|
| 1442 |
+ |
|
| 1443 |
+CHM_FILE = |
|
| 1444 |
+ |
|
| 1445 |
+# The HHC_LOCATION tag can be used to specify the location (absolute path |
|
| 1446 |
+# including file name) of the HTML help compiler (hhc.exe). If non-empty, |
|
| 1447 |
+# doxygen will try to run the HTML help compiler on the generated index.hhp. |
|
| 1448 |
+# The file has to be specified with full path. |
|
| 1449 |
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES. |
|
| 1450 |
+ |
|
| 1451 |
+HHC_LOCATION = |
|
| 1452 |
+ |
|
| 1453 |
+# The GENERATE_CHI flag controls if a separate .chi index file is generated |
|
| 1454 |
+# (YES) or that it should be included in the main .chm file (NO). |
|
| 1455 |
+# The default value is: NO. |
|
| 1456 |
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES. |
|
| 1457 |
+ |
|
| 1458 |
+GENERATE_CHI = NO |
|
| 1459 |
+ |
|
| 1460 |
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) |
|
| 1461 |
+# and project file content. |
|
| 1462 |
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES. |
|
| 1463 |
+ |
|
| 1464 |
+CHM_INDEX_ENCODING = |
|
| 1465 |
+ |
|
| 1466 |
+# The BINARY_TOC flag controls whether a binary table of contents is generated |
|
| 1467 |
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it |
|
| 1468 |
+# enables the Previous and Next buttons. |
|
| 1469 |
+# The default value is: NO. |
|
| 1470 |
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES. |
|
| 1471 |
+ |
|
| 1472 |
+BINARY_TOC = NO |
|
| 1473 |
+ |
|
| 1474 |
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to |
|
| 1475 |
+# the table of contents of the HTML help documentation and to the tree view. |
|
| 1476 |
+# The default value is: NO. |
|
| 1477 |
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES. |
|
| 1478 |
+ |
|
| 1479 |
+TOC_EXPAND = NO |
|
| 1480 |
+ |
|
| 1481 |
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and |
|
| 1482 |
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that |
|
| 1483 |
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help |
|
| 1484 |
+# (.qch) of the generated HTML documentation. |
|
| 1485 |
+# The default value is: NO. |
|
| 1486 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1487 |
+ |
|
| 1488 |
+GENERATE_QHP = NO |
|
| 1489 |
+ |
|
| 1490 |
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify |
|
| 1491 |
+# the file name of the resulting .qch file. The path specified is relative to |
|
| 1492 |
+# the HTML output folder. |
|
| 1493 |
+# This tag requires that the tag GENERATE_QHP is set to YES. |
|
| 1494 |
+ |
|
| 1495 |
+QCH_FILE = |
|
| 1496 |
+ |
|
| 1497 |
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help |
|
| 1498 |
+# Project output. For more information please see Qt Help Project / Namespace |
|
| 1499 |
+# (see: |
|
| 1500 |
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). |
|
| 1501 |
+# The default value is: org.doxygen.Project. |
|
| 1502 |
+# This tag requires that the tag GENERATE_QHP is set to YES. |
|
| 1503 |
+ |
|
| 1504 |
+QHP_NAMESPACE = org.doxygen.Project |
|
| 1505 |
+ |
|
| 1506 |
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt |
|
| 1507 |
+# Help Project output. For more information please see Qt Help Project / Virtual |
|
| 1508 |
+# Folders (see: |
|
| 1509 |
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). |
|
| 1510 |
+# The default value is: doc. |
|
| 1511 |
+# This tag requires that the tag GENERATE_QHP is set to YES. |
|
| 1512 |
+ |
|
| 1513 |
+QHP_VIRTUAL_FOLDER = doc |
|
| 1514 |
+ |
|
| 1515 |
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom |
|
| 1516 |
+# filter to add. For more information please see Qt Help Project / Custom |
|
| 1517 |
+# Filters (see: |
|
| 1518 |
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). |
|
| 1519 |
+# This tag requires that the tag GENERATE_QHP is set to YES. |
|
| 1520 |
+ |
|
| 1521 |
+QHP_CUST_FILTER_NAME = |
|
| 1522 |
+ |
|
| 1523 |
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the |
|
| 1524 |
+# custom filter to add. For more information please see Qt Help Project / Custom |
|
| 1525 |
+# Filters (see: |
|
| 1526 |
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). |
|
| 1527 |
+# This tag requires that the tag GENERATE_QHP is set to YES. |
|
| 1528 |
+ |
|
| 1529 |
+QHP_CUST_FILTER_ATTRS = |
|
| 1530 |
+ |
|
| 1531 |
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this |
|
| 1532 |
+# project's filter section matches. Qt Help Project / Filter Attributes (see: |
|
| 1533 |
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). |
|
| 1534 |
+# This tag requires that the tag GENERATE_QHP is set to YES. |
|
| 1535 |
+ |
|
| 1536 |
+QHP_SECT_FILTER_ATTRS = |
|
| 1537 |
+ |
|
| 1538 |
+# The QHG_LOCATION tag can be used to specify the location (absolute path |
|
| 1539 |
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to |
|
| 1540 |
+# run qhelpgenerator on the generated .qhp file. |
|
| 1541 |
+# This tag requires that the tag GENERATE_QHP is set to YES. |
|
| 1542 |
+ |
|
| 1543 |
+QHG_LOCATION = |
|
| 1544 |
+ |
|
| 1545 |
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be |
|
| 1546 |
+# generated, together with the HTML files, they form an Eclipse help plugin. To |
|
| 1547 |
+# install this plugin and make it available under the help contents menu in |
|
| 1548 |
+# Eclipse, the contents of the directory containing the HTML and XML files needs |
|
| 1549 |
+# to be copied into the plugins directory of eclipse. The name of the directory |
|
| 1550 |
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. |
|
| 1551 |
+# After copying Eclipse needs to be restarted before the help appears. |
|
| 1552 |
+# The default value is: NO. |
|
| 1553 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1554 |
+ |
|
| 1555 |
+GENERATE_ECLIPSEHELP = NO |
|
| 1556 |
+ |
|
| 1557 |
+# A unique identifier for the Eclipse help plugin. When installing the plugin |
|
| 1558 |
+# the directory name containing the HTML and XML files should also have this |
|
| 1559 |
+# name. Each documentation set should have its own identifier. |
|
| 1560 |
+# The default value is: org.doxygen.Project. |
|
| 1561 |
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. |
|
| 1562 |
+ |
|
| 1563 |
+ECLIPSE_DOC_ID = org.doxygen.Project |
|
| 1564 |
+ |
|
| 1565 |
+# If you want full control over the layout of the generated HTML pages it might |
|
| 1566 |
+# be necessary to disable the index and replace it with your own. The |
|
| 1567 |
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top |
|
| 1568 |
+# of each HTML page. A value of NO enables the index and the value YES disables |
|
| 1569 |
+# it. Since the tabs in the index contain the same information as the navigation |
|
| 1570 |
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. |
|
| 1571 |
+# The default value is: NO. |
|
| 1572 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1573 |
+ |
|
| 1574 |
+DISABLE_INDEX = NO |
|
| 1575 |
+ |
|
| 1576 |
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index |
|
| 1577 |
+# structure should be generated to display hierarchical information. If the tag |
|
| 1578 |
+# value is set to YES, a side panel will be generated containing a tree-like |
|
| 1579 |
+# index structure (just like the one that is generated for HTML Help). For this |
|
| 1580 |
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required |
|
| 1581 |
+# (i.e. any modern browser). Windows users are probably better off using the |
|
| 1582 |
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can |
|
| 1583 |
+# further fine tune the look of the index (see "Fine-tuning the output"). As an |
|
| 1584 |
+# example, the default style sheet generated by doxygen has an example that |
|
| 1585 |
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME. |
|
| 1586 |
+# Since the tree basically has the same information as the tab index, you could |
|
| 1587 |
+# consider setting DISABLE_INDEX to YES when enabling this option. |
|
| 1588 |
+# The default value is: NO. |
|
| 1589 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1590 |
+ |
|
| 1591 |
+GENERATE_TREEVIEW = YES |
|
| 1592 |
+ |
|
| 1593 |
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the |
|
| 1594 |
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview |
|
| 1595 |
+# area (value NO) or if it should extend to the full height of the window (value |
|
| 1596 |
+# YES). Setting this to YES gives a layout similar to |
|
| 1597 |
+# https://docs.readthedocs.io with more room for contents, but less room for the |
|
| 1598 |
+# project logo, title, and description. If either GENERATE_TREEVIEW or |
|
| 1599 |
+# DISABLE_INDEX is set to NO, this option has no effect. |
|
| 1600 |
+# The default value is: NO. |
|
| 1601 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1602 |
+ |
|
| 1603 |
+FULL_SIDEBAR = NO |
|
| 1604 |
+ |
|
| 1605 |
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that |
|
| 1606 |
+# doxygen will group on one line in the generated HTML documentation. |
|
| 1607 |
+# |
|
| 1608 |
+# Note that a value of 0 will completely suppress the enum values from appearing |
|
| 1609 |
+# in the overview section. |
|
| 1610 |
+# Minimum value: 0, maximum value: 20, default value: 4. |
|
| 1611 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1612 |
+ |
|
| 1613 |
+ENUM_VALUES_PER_LINE = 4 |
|
| 1614 |
+ |
|
| 1615 |
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used |
|
| 1616 |
+# to set the initial width (in pixels) of the frame in which the tree is shown. |
|
| 1617 |
+# Minimum value: 0, maximum value: 1500, default value: 250. |
|
| 1618 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1619 |
+ |
|
| 1620 |
+TREEVIEW_WIDTH = 250 |
|
| 1621 |
+ |
|
| 1622 |
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to |
|
| 1623 |
+# external symbols imported via tag files in a separate window. |
|
| 1624 |
+# The default value is: NO. |
|
| 1625 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1626 |
+ |
|
| 1627 |
+EXT_LINKS_IN_WINDOW = NO |
|
| 1628 |
+ |
|
| 1629 |
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email |
|
| 1630 |
+# addresses. |
|
| 1631 |
+# The default value is: YES. |
|
| 1632 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1633 |
+ |
|
| 1634 |
+OBFUSCATE_EMAILS = YES |
|
| 1635 |
+ |
|
| 1636 |
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg |
|
| 1637 |
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see |
|
| 1638 |
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for |
|
| 1639 |
+# the HTML output. These images will generally look nicer at scaled resolutions. |
|
| 1640 |
+# Possible values are: png (the default) and svg (looks nicer but requires the |
|
| 1641 |
+# pdf2svg or inkscape tool). |
|
| 1642 |
+# The default value is: png. |
|
| 1643 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1644 |
+ |
|
| 1645 |
+HTML_FORMULA_FORMAT = png |
|
| 1646 |
+ |
|
| 1647 |
+# Use this tag to change the font size of LaTeX formulas included as images in |
|
| 1648 |
+# the HTML documentation. When you change the font size after a successful |
|
| 1649 |
+# doxygen run you need to manually remove any form_*.png images from the HTML |
|
| 1650 |
+# output directory to force them to be regenerated. |
|
| 1651 |
+# Minimum value: 8, maximum value: 50, default value: 10. |
|
| 1652 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1653 |
+ |
|
| 1654 |
+FORMULA_FONTSIZE = 10 |
|
| 1655 |
+ |
|
| 1656 |
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands |
|
| 1657 |
+# to create new LaTeX commands to be used in formulas as building blocks. See |
|
| 1658 |
+# the section "Including formulas" for details. |
|
| 1659 |
+ |
|
| 1660 |
+FORMULA_MACROFILE = |
|
| 1661 |
+ |
|
| 1662 |
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see |
|
| 1663 |
+# https://www.mathjax.org) which uses client side JavaScript for the rendering |
|
| 1664 |
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX |
|
| 1665 |
+# installed or if you want to formulas look prettier in the HTML output. When |
|
| 1666 |
+# enabled you may also need to install MathJax separately and configure the path |
|
| 1667 |
+# to it using the MATHJAX_RELPATH option. |
|
| 1668 |
+# The default value is: NO. |
|
| 1669 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1670 |
+ |
|
| 1671 |
+USE_MATHJAX = NO |
|
| 1672 |
+ |
|
| 1673 |
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. |
|
| 1674 |
+# Note that the different versions of MathJax have different requirements with |
|
| 1675 |
+# regards to the different settings, so it is possible that also other MathJax |
|
| 1676 |
+# settings have to be changed when switching between the different MathJax |
|
| 1677 |
+# versions. |
|
| 1678 |
+# Possible values are: MathJax_2 and MathJax_3. |
|
| 1679 |
+# The default value is: MathJax_2. |
|
| 1680 |
+# This tag requires that the tag USE_MATHJAX is set to YES. |
|
| 1681 |
+ |
|
| 1682 |
+MATHJAX_VERSION = MathJax_2 |
|
| 1683 |
+ |
|
| 1684 |
+# When MathJax is enabled you can set the default output format to be used for |
|
| 1685 |
+# the MathJax output. For more details about the output format see MathJax |
|
| 1686 |
+# version 2 (see: |
|
| 1687 |
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 |
|
| 1688 |
+# (see: |
|
| 1689 |
+# http://docs.mathjax.org/en/latest/web/components/output.html). |
|
| 1690 |
+# Possible values are: HTML-CSS (which is slower, but has the best |
|
| 1691 |
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3 |
|
| 1692 |
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported |
|
| 1693 |
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This |
|
| 1694 |
+# is the name for Mathjax version 3, for MathJax version 2 this will be |
|
| 1695 |
+# translated into HTML-CSS) and SVG. |
|
| 1696 |
+# The default value is: HTML-CSS. |
|
| 1697 |
+# This tag requires that the tag USE_MATHJAX is set to YES. |
|
| 1698 |
+ |
|
| 1699 |
+MATHJAX_FORMAT = HTML-CSS |
|
| 1700 |
+ |
|
| 1701 |
+# When MathJax is enabled you need to specify the location relative to the HTML |
|
| 1702 |
+# output directory using the MATHJAX_RELPATH option. The destination directory |
|
| 1703 |
+# should contain the MathJax.js script. For instance, if the mathjax directory |
|
| 1704 |
+# is located at the same level as the HTML output directory, then |
|
| 1705 |
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax |
|
| 1706 |
+# Content Delivery Network so you can quickly see the result without installing |
|
| 1707 |
+# MathJax. However, it is strongly recommended to install a local copy of |
|
| 1708 |
+# MathJax from https://www.mathjax.org before deployment. The default value is: |
|
| 1709 |
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 |
|
| 1710 |
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 |
|
| 1711 |
+# This tag requires that the tag USE_MATHJAX is set to YES. |
|
| 1712 |
+ |
|
| 1713 |
+MATHJAX_RELPATH = |
|
| 1714 |
+ |
|
| 1715 |
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax |
|
| 1716 |
+# extension names that should be enabled during MathJax rendering. For example |
|
| 1717 |
+# for MathJax version 2 (see |
|
| 1718 |
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): |
|
| 1719 |
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols |
|
| 1720 |
+# For example for MathJax version 3 (see |
|
| 1721 |
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): |
|
| 1722 |
+# MATHJAX_EXTENSIONS = ams |
|
| 1723 |
+# This tag requires that the tag USE_MATHJAX is set to YES. |
|
| 1724 |
+ |
|
| 1725 |
+MATHJAX_EXTENSIONS = |
|
| 1726 |
+ |
|
| 1727 |
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces |
|
| 1728 |
+# of code that will be used on startup of the MathJax code. See the MathJax site |
|
| 1729 |
+# (see: |
|
| 1730 |
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an |
|
| 1731 |
+# example see the documentation. |
|
| 1732 |
+# This tag requires that the tag USE_MATHJAX is set to YES. |
|
| 1733 |
+ |
|
| 1734 |
+MATHJAX_CODEFILE = |
|
| 1735 |
+ |
|
| 1736 |
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for |
|
| 1737 |
+# the HTML output. The underlying search engine uses javascript and DHTML and |
|
| 1738 |
+# should work on any modern browser. Note that when using HTML help |
|
| 1739 |
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) |
|
| 1740 |
+# there is already a search function so this one should typically be disabled. |
|
| 1741 |
+# For large projects the javascript based search engine can be slow, then |
|
| 1742 |
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to |
|
| 1743 |
+# search using the keyboard; to jump to the search box use <access key> + S |
|
| 1744 |
+# (what the <access key> is depends on the OS and browser, but it is typically |
|
| 1745 |
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down |
|
| 1746 |
+# key> to jump into the search results window, the results can be navigated |
|
| 1747 |
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel |
|
| 1748 |
+# the search. The filter options can be selected when the cursor is inside the |
|
| 1749 |
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> |
|
| 1750 |
+# to select a filter and <Enter> or <escape> to activate or cancel the filter |
|
| 1751 |
+# option. |
|
| 1752 |
+# The default value is: YES. |
|
| 1753 |
+# This tag requires that the tag GENERATE_HTML is set to YES. |
|
| 1754 |
+ |
|
| 1755 |
+SEARCHENGINE = NO |
|
| 1756 |
+ |
|
| 1757 |
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be |
|
| 1758 |
+# implemented using a web server instead of a web client using JavaScript. There |
|
| 1759 |
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH |
|
| 1760 |
+# setting. When disabled, doxygen will generate a PHP script for searching and |
|
| 1761 |
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing |
|
| 1762 |
+# and searching needs to be provided by external tools. See the section |
|
| 1763 |
+# "External Indexing and Searching" for details. |
|
| 1764 |
+# The default value is: NO. |
|
| 1765 |
+# This tag requires that the tag SEARCHENGINE is set to YES. |
|
| 1766 |
+ |
|
| 1767 |
+SERVER_BASED_SEARCH = NO |
|
| 1768 |
+ |
|
| 1769 |
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP |
|
| 1770 |
+# script for searching. Instead the search results are written to an XML file |
|
| 1771 |
+# which needs to be processed by an external indexer. Doxygen will invoke an |
|
| 1772 |
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the |
|
| 1773 |
+# search results. |
|
| 1774 |
+# |
|
| 1775 |
+# Doxygen ships with an example indexer (doxyindexer) and search engine |
|
| 1776 |
+# (doxysearch.cgi) which are based on the open source search engine library |
|
| 1777 |
+# Xapian (see: |
|
| 1778 |
+# https://xapian.org/). |
|
| 1779 |
+# |
|
| 1780 |
+# See the section "External Indexing and Searching" for details. |
|
| 1781 |
+# The default value is: NO. |
|
| 1782 |
+# This tag requires that the tag SEARCHENGINE is set to YES. |
|
| 1783 |
+ |
|
| 1784 |
+EXTERNAL_SEARCH = NO |
|
| 1785 |
+ |
|
| 1786 |
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server |
|
| 1787 |
+# which will return the search results when EXTERNAL_SEARCH is enabled. |
|
| 1788 |
+# |
|
| 1789 |
+# Doxygen ships with an example indexer (doxyindexer) and search engine |
|
| 1790 |
+# (doxysearch.cgi) which are based on the open source search engine library |
|
| 1791 |
+# Xapian (see: |
|
| 1792 |
+# https://xapian.org/). See the section "External Indexing and Searching" for |
|
| 1793 |
+# details. |
|
| 1794 |
+# This tag requires that the tag SEARCHENGINE is set to YES. |
|
| 1795 |
+ |
|
| 1796 |
+SEARCHENGINE_URL = |
|
| 1797 |
+ |
|
| 1798 |
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed |
|
| 1799 |
+# search data is written to a file for indexing by an external tool. With the |
|
| 1800 |
+# SEARCHDATA_FILE tag the name of this file can be specified. |
|
| 1801 |
+# The default file is: searchdata.xml. |
|
| 1802 |
+# This tag requires that the tag SEARCHENGINE is set to YES. |
|
| 1803 |
+ |
|
| 1804 |
+SEARCHDATA_FILE = searchdata.xml |
|
| 1805 |
+ |
|
| 1806 |
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the |
|
| 1807 |
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is |
|
| 1808 |
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple |
|
| 1809 |
+# projects and redirect the results back to the right project. |
|
| 1810 |
+# This tag requires that the tag SEARCHENGINE is set to YES. |
|
| 1811 |
+ |
|
| 1812 |
+EXTERNAL_SEARCH_ID = |
|
| 1813 |
+ |
|
| 1814 |
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen |
|
| 1815 |
+# projects other than the one defined by this configuration file, but that are |
|
| 1816 |
+# all added to the same external search index. Each project needs to have a |
|
| 1817 |
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of |
|
| 1818 |
+# to a relative location where the documentation can be found. The format is: |
|
| 1819 |
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... |
|
| 1820 |
+# This tag requires that the tag SEARCHENGINE is set to YES. |
|
| 1821 |
+ |
|
| 1822 |
+EXTRA_SEARCH_MAPPINGS = |
|
| 1823 |
+ |
|
| 1824 |
+#--------------------------------------------------------------------------- |
|
| 1825 |
+# Configuration options related to the LaTeX output |
|
| 1826 |
+#--------------------------------------------------------------------------- |
|
| 1827 |
+ |
|
| 1828 |
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. |
|
| 1829 |
+# The default value is: YES. |
|
| 1830 |
+ |
|
| 1831 |
+GENERATE_LATEX = NO |
|
| 1832 |
+ |
|
| 1833 |
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a |
|
| 1834 |
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of |
|
| 1835 |
+# it. |
|
| 1836 |
+# The default directory is: latex. |
|
| 1837 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1838 |
+ |
|
| 1839 |
+LATEX_OUTPUT = latex |
|
| 1840 |
+ |
|
| 1841 |
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be |
|
| 1842 |
+# invoked. |
|
| 1843 |
+# |
|
| 1844 |
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling |
|
| 1845 |
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is |
|
| 1846 |
+# chosen this is overwritten by pdflatex. For specific output languages the |
|
| 1847 |
+# default can have been set differently, this depends on the implementation of |
|
| 1848 |
+# the output language. |
|
| 1849 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1850 |
+ |
|
| 1851 |
+LATEX_CMD_NAME = |
|
| 1852 |
+ |
|
| 1853 |
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate |
|
| 1854 |
+# index for LaTeX. |
|
| 1855 |
+# Note: This tag is used in the Makefile / make.bat. |
|
| 1856 |
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file |
|
| 1857 |
+# (.tex). |
|
| 1858 |
+# The default file is: makeindex. |
|
| 1859 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1860 |
+ |
|
| 1861 |
+MAKEINDEX_CMD_NAME = makeindex |
|
| 1862 |
+ |
|
| 1863 |
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to |
|
| 1864 |
+# generate index for LaTeX. In case there is no backslash (\) as first character |
|
| 1865 |
+# it will be automatically added in the LaTeX code. |
|
| 1866 |
+# Note: This tag is used in the generated output file (.tex). |
|
| 1867 |
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. |
|
| 1868 |
+# The default value is: makeindex. |
|
| 1869 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1870 |
+ |
|
| 1871 |
+LATEX_MAKEINDEX_CMD = makeindex |
|
| 1872 |
+ |
|
| 1873 |
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX |
|
| 1874 |
+# documents. This may be useful for small projects and may help to save some |
|
| 1875 |
+# trees in general. |
|
| 1876 |
+# The default value is: NO. |
|
| 1877 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1878 |
+ |
|
| 1879 |
+COMPACT_LATEX = NO |
|
| 1880 |
+ |
|
| 1881 |
+# The PAPER_TYPE tag can be used to set the paper type that is used by the |
|
| 1882 |
+# printer. |
|
| 1883 |
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x |
|
| 1884 |
+# 14 inches) and executive (7.25 x 10.5 inches). |
|
| 1885 |
+# The default value is: a4. |
|
| 1886 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1887 |
+ |
|
| 1888 |
+PAPER_TYPE = a4 |
|
| 1889 |
+ |
|
| 1890 |
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names |
|
| 1891 |
+# that should be included in the LaTeX output. The package can be specified just |
|
| 1892 |
+# by its name or with the correct syntax as to be used with the LaTeX |
|
| 1893 |
+# \usepackage command. To get the times font for instance you can specify : |
|
| 1894 |
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
|
|
| 1895 |
+# To use the option intlimits with the amsmath package you can specify: |
|
| 1896 |
+# EXTRA_PACKAGES=[intlimits]{amsmath}
|
|
| 1897 |
+# If left blank no extra packages will be included. |
|
| 1898 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1899 |
+ |
|
| 1900 |
+EXTRA_PACKAGES = |
|
| 1901 |
+ |
|
| 1902 |
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for |
|
| 1903 |
+# the generated LaTeX document. The header should contain everything until the |
|
| 1904 |
+# first chapter. If it is left blank doxygen will generate a standard header. It |
|
| 1905 |
+# is highly recommended to start with a default header using |
|
| 1906 |
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty |
|
| 1907 |
+# and then modify the file new_header.tex. See also section "Doxygen usage" for |
|
| 1908 |
+# information on how to generate the default header that doxygen normally uses. |
|
| 1909 |
+# |
|
| 1910 |
+# Note: Only use a user-defined header if you know what you are doing! |
|
| 1911 |
+# Note: The header is subject to change so you typically have to regenerate the |
|
| 1912 |
+# default header when upgrading to a newer version of doxygen. The following |
|
| 1913 |
+# commands have a special meaning inside the header (and footer): For a |
|
| 1914 |
+# description of the possible markers and block names see the documentation. |
|
| 1915 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1916 |
+ |
|
| 1917 |
+LATEX_HEADER = |
|
| 1918 |
+ |
|
| 1919 |
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for |
|
| 1920 |
+# the generated LaTeX document. The footer should contain everything after the |
|
| 1921 |
+# last chapter. If it is left blank doxygen will generate a standard footer. See |
|
| 1922 |
+# LATEX_HEADER for more information on how to generate a default footer and what |
|
| 1923 |
+# special commands can be used inside the footer. See also section "Doxygen |
|
| 1924 |
+# usage" for information on how to generate the default footer that doxygen |
|
| 1925 |
+# normally uses. Note: Only use a user-defined footer if you know what you are |
|
| 1926 |
+# doing! |
|
| 1927 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1928 |
+ |
|
| 1929 |
+LATEX_FOOTER = |
|
| 1930 |
+ |
|
| 1931 |
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined |
|
| 1932 |
+# LaTeX style sheets that are included after the standard style sheets created |
|
| 1933 |
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen |
|
| 1934 |
+# will copy the style sheet files to the output directory. |
|
| 1935 |
+# Note: The order of the extra style sheet files is of importance (e.g. the last |
|
| 1936 |
+# style sheet in the list overrules the setting of the previous ones in the |
|
| 1937 |
+# list). |
|
| 1938 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1939 |
+ |
|
| 1940 |
+LATEX_EXTRA_STYLESHEET = |
|
| 1941 |
+ |
|
| 1942 |
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or |
|
| 1943 |
+# other source files which should be copied to the LATEX_OUTPUT output |
|
| 1944 |
+# directory. Note that the files will be copied as-is; there are no commands or |
|
| 1945 |
+# markers available. |
|
| 1946 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1947 |
+ |
|
| 1948 |
+LATEX_EXTRA_FILES = |
|
| 1949 |
+ |
|
| 1950 |
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is |
|
| 1951 |
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will |
|
| 1952 |
+# contain links (just like the HTML output) instead of page references. This |
|
| 1953 |
+# makes the output suitable for online browsing using a PDF viewer. |
|
| 1954 |
+# The default value is: YES. |
|
| 1955 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1956 |
+ |
|
| 1957 |
+PDF_HYPERLINKS = YES |
|
| 1958 |
+ |
|
| 1959 |
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as |
|
| 1960 |
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX |
|
| 1961 |
+# files. Set this option to YES, to get a higher quality PDF documentation. |
|
| 1962 |
+# |
|
| 1963 |
+# See also section LATEX_CMD_NAME for selecting the engine. |
|
| 1964 |
+# The default value is: YES. |
|
| 1965 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1966 |
+ |
|
| 1967 |
+USE_PDFLATEX = YES |
|
| 1968 |
+ |
|
| 1969 |
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode |
|
| 1970 |
+# command to the generated LaTeX files. This will instruct LaTeX to keep running |
|
| 1971 |
+# if errors occur, instead of asking the user for help. |
|
| 1972 |
+# The default value is: NO. |
|
| 1973 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1974 |
+ |
|
| 1975 |
+LATEX_BATCHMODE = NO |
|
| 1976 |
+ |
|
| 1977 |
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the |
|
| 1978 |
+# index chapters (such as File Index, Compound Index, etc.) in the output. |
|
| 1979 |
+# The default value is: NO. |
|
| 1980 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1981 |
+ |
|
| 1982 |
+LATEX_HIDE_INDICES = NO |
|
| 1983 |
+ |
|
| 1984 |
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the |
|
| 1985 |
+# bibliography, e.g. plainnat, or ieeetr. See |
|
| 1986 |
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info. |
|
| 1987 |
+# The default value is: plain. |
|
| 1988 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1989 |
+ |
|
| 1990 |
+LATEX_BIB_STYLE = plain |
|
| 1991 |
+ |
|
| 1992 |
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated |
|
| 1993 |
+# page will contain the date and time when the page was generated. Setting this |
|
| 1994 |
+# to NO can help when comparing the output of multiple runs. |
|
| 1995 |
+# The default value is: NO. |
|
| 1996 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 1997 |
+ |
|
| 1998 |
+LATEX_TIMESTAMP = NO |
|
| 1999 |
+ |
|
| 2000 |
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) |
|
| 2001 |
+# path from which the emoji images will be read. If a relative path is entered, |
|
| 2002 |
+# it will be relative to the LATEX_OUTPUT directory. If left blank the |
|
| 2003 |
+# LATEX_OUTPUT directory will be used. |
|
| 2004 |
+# This tag requires that the tag GENERATE_LATEX is set to YES. |
|
| 2005 |
+ |
|
| 2006 |
+LATEX_EMOJI_DIRECTORY = |
|
| 2007 |
+ |
|
| 2008 |
+#--------------------------------------------------------------------------- |
|
| 2009 |
+# Configuration options related to the RTF output |
|
| 2010 |
+#--------------------------------------------------------------------------- |
|
| 2011 |
+ |
|
| 2012 |
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The |
|
| 2013 |
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF |
|
| 2014 |
+# readers/editors. |
|
| 2015 |
+# The default value is: NO. |
|
| 2016 |
+ |
|
| 2017 |
+GENERATE_RTF = NO |
|
| 2018 |
+ |
|
| 2019 |
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a |
|
| 2020 |
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of |
|
| 2021 |
+# it. |
|
| 2022 |
+# The default directory is: rtf. |
|
| 2023 |
+# This tag requires that the tag GENERATE_RTF is set to YES. |
|
| 2024 |
+ |
|
| 2025 |
+RTF_OUTPUT = |
|
| 2026 |
+ |
|
| 2027 |
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF |
|
| 2028 |
+# documents. This may be useful for small projects and may help to save some |
|
| 2029 |
+# trees in general. |
|
| 2030 |
+# The default value is: NO. |
|
| 2031 |
+# This tag requires that the tag GENERATE_RTF is set to YES. |
|
| 2032 |
+ |
|
| 2033 |
+COMPACT_RTF = NO |
|
| 2034 |
+ |
|
| 2035 |
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will |
|
| 2036 |
+# contain hyperlink fields. The RTF file will contain links (just like the HTML |
|
| 2037 |
+# output) instead of page references. This makes the output suitable for online |
|
| 2038 |
+# browsing using Word or some other Word compatible readers that support those |
|
| 2039 |
+# fields. |
|
| 2040 |
+# |
|
| 2041 |
+# Note: WordPad (write) and others do not support links. |
|
| 2042 |
+# The default value is: NO. |
|
| 2043 |
+# This tag requires that the tag GENERATE_RTF is set to YES. |
|
| 2044 |
+ |
|
| 2045 |
+RTF_HYPERLINKS = NO |
|
| 2046 |
+ |
|
| 2047 |
+# Load stylesheet definitions from file. Syntax is similar to doxygen's |
|
| 2048 |
+# configuration file, i.e. a series of assignments. You only have to provide |
|
| 2049 |
+# replacements, missing definitions are set to their default value. |
|
| 2050 |
+# |
|
| 2051 |
+# See also section "Doxygen usage" for information on how to generate the |
|
| 2052 |
+# default style sheet that doxygen normally uses. |
|
| 2053 |
+# This tag requires that the tag GENERATE_RTF is set to YES. |
|
| 2054 |
+ |
|
| 2055 |
+RTF_STYLESHEET_FILE = |
|
| 2056 |
+ |
|
| 2057 |
+# Set optional variables used in the generation of an RTF document. Syntax is |
|
| 2058 |
+# similar to doxygen's configuration file. A template extensions file can be |
|
| 2059 |
+# generated using doxygen -e rtf extensionFile. |
|
| 2060 |
+# This tag requires that the tag GENERATE_RTF is set to YES. |
|
| 2061 |
+ |
|
| 2062 |
+RTF_EXTENSIONS_FILE = |
|
| 2063 |
+ |
|
| 2064 |
+#--------------------------------------------------------------------------- |
|
| 2065 |
+# Configuration options related to the man page output |
|
| 2066 |
+#--------------------------------------------------------------------------- |
|
| 2067 |
+ |
|
| 2068 |
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for |
|
| 2069 |
+# classes and files. |
|
| 2070 |
+# The default value is: NO. |
|
| 2071 |
+ |
|
| 2072 |
+GENERATE_MAN = NO |
|
| 2073 |
+ |
|
| 2074 |
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a |
|
| 2075 |
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of |
|
| 2076 |
+# it. A directory man3 will be created inside the directory specified by |
|
| 2077 |
+# MAN_OUTPUT. |
|
| 2078 |
+# The default directory is: man. |
|
| 2079 |
+# This tag requires that the tag GENERATE_MAN is set to YES. |
|
| 2080 |
+ |
|
| 2081 |
+MAN_OUTPUT = |
|
| 2082 |
+ |
|
| 2083 |
+# The MAN_EXTENSION tag determines the extension that is added to the generated |
|
| 2084 |
+# man pages. In case the manual section does not start with a number, the number |
|
| 2085 |
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is |
|
| 2086 |
+# optional. |
|
| 2087 |
+# The default value is: .3. |
|
| 2088 |
+# This tag requires that the tag GENERATE_MAN is set to YES. |
|
| 2089 |
+ |
|
| 2090 |
+MAN_EXTENSION = .3 |
|
| 2091 |
+ |
|
| 2092 |
+# The MAN_SUBDIR tag determines the name of the directory created within |
|
| 2093 |
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by |
|
| 2094 |
+# MAN_EXTENSION with the initial . removed. |
|
| 2095 |
+# This tag requires that the tag GENERATE_MAN is set to YES. |
|
| 2096 |
+ |
|
| 2097 |
+MAN_SUBDIR = |
|
| 2098 |
+ |
|
| 2099 |
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it |
|
| 2100 |
+# will generate one additional man file for each entity documented in the real |
|
| 2101 |
+# man page(s). These additional files only source the real man page, but without |
|
| 2102 |
+# them the man command would be unable to find the correct page. |
|
| 2103 |
+# The default value is: NO. |
|
| 2104 |
+# This tag requires that the tag GENERATE_MAN is set to YES. |
|
| 2105 |
+ |
|
| 2106 |
+MAN_LINKS = NO |
|
| 2107 |
+ |
|
| 2108 |
+#--------------------------------------------------------------------------- |
|
| 2109 |
+# Configuration options related to the XML output |
|
| 2110 |
+#--------------------------------------------------------------------------- |
|
| 2111 |
+ |
|
| 2112 |
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that |
|
| 2113 |
+# captures the structure of the code including all documentation. |
|
| 2114 |
+# The default value is: NO. |
|
| 2115 |
+ |
|
| 2116 |
+GENERATE_XML = NO |
|
| 2117 |
+ |
|
| 2118 |
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a |
|
| 2119 |
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of |
|
| 2120 |
+# it. |
|
| 2121 |
+# The default directory is: xml. |
|
| 2122 |
+# This tag requires that the tag GENERATE_XML is set to YES. |
|
| 2123 |
+ |
|
| 2124 |
+XML_OUTPUT = xml |
|
| 2125 |
+ |
|
| 2126 |
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program |
|
| 2127 |
+# listings (including syntax highlighting and cross-referencing information) to |
|
| 2128 |
+# the XML output. Note that enabling this will significantly increase the size |
|
| 2129 |
+# of the XML output. |
|
| 2130 |
+# The default value is: YES. |
|
| 2131 |
+# This tag requires that the tag GENERATE_XML is set to YES. |
|
| 2132 |
+ |
|
| 2133 |
+XML_PROGRAMLISTING = YES |
|
| 2134 |
+ |
|
| 2135 |
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include |
|
| 2136 |
+# namespace members in file scope as well, matching the HTML output. |
|
| 2137 |
+# The default value is: NO. |
|
| 2138 |
+# This tag requires that the tag GENERATE_XML is set to YES. |
|
| 2139 |
+ |
|
| 2140 |
+XML_NS_MEMB_FILE_SCOPE = NO |
|
| 2141 |
+ |
|
| 2142 |
+#--------------------------------------------------------------------------- |
|
| 2143 |
+# Configuration options related to the DOCBOOK output |
|
| 2144 |
+#--------------------------------------------------------------------------- |
|
| 2145 |
+ |
|
| 2146 |
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files |
|
| 2147 |
+# that can be used to generate PDF. |
|
| 2148 |
+# The default value is: NO. |
|
| 2149 |
+ |
|
| 2150 |
+GENERATE_DOCBOOK = NO |
|
| 2151 |
+ |
|
| 2152 |
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. |
|
| 2153 |
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in |
|
| 2154 |
+# front of it. |
|
| 2155 |
+# The default directory is: docbook. |
|
| 2156 |
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES. |
|
| 2157 |
+ |
|
| 2158 |
+DOCBOOK_OUTPUT = docbook |
|
| 2159 |
+ |
|
| 2160 |
+#--------------------------------------------------------------------------- |
|
| 2161 |
+# Configuration options for the AutoGen Definitions output |
|
| 2162 |
+#--------------------------------------------------------------------------- |
|
| 2163 |
+ |
|
| 2164 |
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an |
|
| 2165 |
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures |
|
| 2166 |
+# the structure of the code including all documentation. Note that this feature |
|
| 2167 |
+# is still experimental and incomplete at the moment. |
|
| 2168 |
+# The default value is: NO. |
|
| 2169 |
+ |
|
| 2170 |
+GENERATE_AUTOGEN_DEF = NO |
|
| 2171 |
+ |
|
| 2172 |
+#--------------------------------------------------------------------------- |
|
| 2173 |
+# Configuration options related to the Perl module output |
|
| 2174 |
+#--------------------------------------------------------------------------- |
|
| 2175 |
+ |
|
| 2176 |
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module |
|
| 2177 |
+# file that captures the structure of the code including all documentation. |
|
| 2178 |
+# |
|
| 2179 |
+# Note that this feature is still experimental and incomplete at the moment. |
|
| 2180 |
+# The default value is: NO. |
|
| 2181 |
+ |
|
| 2182 |
+GENERATE_PERLMOD = NO |
|
| 2183 |
+ |
|
| 2184 |
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary |
|
| 2185 |
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI |
|
| 2186 |
+# output from the Perl module output. |
|
| 2187 |
+# The default value is: NO. |
|
| 2188 |
+# This tag requires that the tag GENERATE_PERLMOD is set to YES. |
|
| 2189 |
+ |
|
| 2190 |
+PERLMOD_LATEX = NO |
|
| 2191 |
+ |
|
| 2192 |
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely |
|
| 2193 |
+# formatted so it can be parsed by a human reader. This is useful if you want to |
|
| 2194 |
+# understand what is going on. On the other hand, if this tag is set to NO, the |
|
| 2195 |
+# size of the Perl module output will be much smaller and Perl will parse it |
|
| 2196 |
+# just the same. |
|
| 2197 |
+# The default value is: YES. |
|
| 2198 |
+# This tag requires that the tag GENERATE_PERLMOD is set to YES. |
|
| 2199 |
+ |
|
| 2200 |
+PERLMOD_PRETTY = YES |
|
| 2201 |
+ |
|
| 2202 |
+# The names of the make variables in the generated doxyrules.make file are |
|
| 2203 |
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful |
|
| 2204 |
+# so different doxyrules.make files included by the same Makefile don't |
|
| 2205 |
+# overwrite each other's variables. |
|
| 2206 |
+# This tag requires that the tag GENERATE_PERLMOD is set to YES. |
|
| 2207 |
+ |
|
| 2208 |
+PERLMOD_MAKEVAR_PREFIX = |
|
| 2209 |
+ |
|
| 2210 |
+#--------------------------------------------------------------------------- |
|
| 2211 |
+# Configuration options related to the preprocessor |
|
| 2212 |
+#--------------------------------------------------------------------------- |
|
| 2213 |
+ |
|
| 2214 |
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all |
|
| 2215 |
+# C-preprocessor directives found in the sources and include files. |
|
| 2216 |
+# The default value is: YES. |
|
| 2217 |
+ |
|
| 2218 |
+ENABLE_PREPROCESSING = YES |
|
| 2219 |
+ |
|
| 2220 |
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names |
|
| 2221 |
+# in the source code. If set to NO, only conditional compilation will be |
|
| 2222 |
+# performed. Macro expansion can be done in a controlled way by setting |
|
| 2223 |
+# EXPAND_ONLY_PREDEF to YES. |
|
| 2224 |
+# The default value is: NO. |
|
| 2225 |
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. |
|
| 2226 |
+ |
|
| 2227 |
+MACRO_EXPANSION = YES |
|
| 2228 |
+ |
|
| 2229 |
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then |
|
| 2230 |
+# the macro expansion is limited to the macros specified with the PREDEFINED and |
|
| 2231 |
+# EXPAND_AS_DEFINED tags. |
|
| 2232 |
+# The default value is: NO. |
|
| 2233 |
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. |
|
| 2234 |
+ |
|
| 2235 |
+EXPAND_ONLY_PREDEF = YES |
|
| 2236 |
+ |
|
| 2237 |
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the |
|
| 2238 |
+# INCLUDE_PATH will be searched if a #include is found. |
|
| 2239 |
+# The default value is: YES. |
|
| 2240 |
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. |
|
| 2241 |
+ |
|
| 2242 |
+SEARCH_INCLUDES = NO |
|
| 2243 |
+ |
|
| 2244 |
+# The INCLUDE_PATH tag can be used to specify one or more directories that |
|
| 2245 |
+# contain include files that are not input files but should be processed by the |
|
| 2246 |
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of |
|
| 2247 |
+# RECURSIVE has no effect here. |
|
| 2248 |
+# This tag requires that the tag SEARCH_INCLUDES is set to YES. |
|
| 2249 |
+ |
|
| 2250 |
+INCLUDE_PATH = |
|
| 2251 |
+ |
|
| 2252 |
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard |
|
| 2253 |
+# patterns (like *.h and *.hpp) to filter out the header-files in the |
|
| 2254 |
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be |
|
| 2255 |
+# used. |
|
| 2256 |
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. |
|
| 2257 |
+ |
|
| 2258 |
+INCLUDE_FILE_PATTERNS = |
|
| 2259 |
+ |
|
| 2260 |
+# The PREDEFINED tag can be used to specify one or more macro names that are |
|
| 2261 |
+# defined before the preprocessor is started (similar to the -D option of e.g. |
|
| 2262 |
+# gcc). The argument of the tag is a list of macros of the form: name or |
|
| 2263 |
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1" |
|
| 2264 |
+# is assumed. To prevent a macro definition from being undefined via #undef or |
|
| 2265 |
+# recursively expanded use the := operator instead of the = operator. |
|
| 2266 |
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. |
|
| 2267 |
+ |
|
| 2268 |
+PREDEFINED = |
|
| 2269 |
+ |
|
| 2270 |
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this |
|
| 2271 |
+# tag can be used to specify a list of macro names that should be expanded. The |
|
| 2272 |
+# macro definition that is found in the sources will be used. Use the PREDEFINED |
|
| 2273 |
+# tag if you want to use a different macro definition that overrules the |
|
| 2274 |
+# definition found in the source code. |
|
| 2275 |
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. |
|
| 2276 |
+ |
|
| 2277 |
+EXPAND_AS_DEFINED = |
|
| 2278 |
+ |
|
| 2279 |
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will |
|
| 2280 |
+# remove all references to function-like macros that are alone on a line, have |
|
| 2281 |
+# an all uppercase name, and do not end with a semicolon. Such function macros |
|
| 2282 |
+# are typically used for boiler-plate code, and will confuse the parser if not |
|
| 2283 |
+# removed. |
|
| 2284 |
+# The default value is: YES. |
|
| 2285 |
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. |
|
| 2286 |
+ |
|
| 2287 |
+SKIP_FUNCTION_MACROS = YES |
|
| 2288 |
+ |
|
| 2289 |
+#--------------------------------------------------------------------------- |
|
| 2290 |
+# Configuration options related to external references |
|
| 2291 |
+#--------------------------------------------------------------------------- |
|
| 2292 |
+ |
|
| 2293 |
+# The TAGFILES tag can be used to specify one or more tag files. For each tag |
|
| 2294 |
+# file the location of the external documentation should be added. The format of |
|
| 2295 |
+# a tag file without this location is as follows: |
|
| 2296 |
+# TAGFILES = file1 file2 ... |
|
| 2297 |
+# Adding location for the tag files is done as follows: |
|
| 2298 |
+# TAGFILES = file1=loc1 "file2 = loc2" ... |
|
| 2299 |
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the |
|
| 2300 |
+# section "Linking to external documentation" for more information about the use |
|
| 2301 |
+# of tag files. |
|
| 2302 |
+# Note: Each tag file must have a unique name (where the name does NOT include |
|
| 2303 |
+# the path). If a tag file is not located in the directory in which doxygen is |
|
| 2304 |
+# run, you must also specify the path to the tagfile here. |
|
| 2305 |
+ |
|
| 2306 |
+TAGFILES = |
|
| 2307 |
+ |
|
| 2308 |
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a |
|
| 2309 |
+# tag file that is based on the input files it reads. See section "Linking to |
|
| 2310 |
+# external documentation" for more information about the usage of tag files. |
|
| 2311 |
+ |
|
| 2312 |
+GENERATE_TAGFILE = doxygen.tag |
|
| 2313 |
+ |
|
| 2314 |
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in |
|
| 2315 |
+# the class index. If set to NO, only the inherited external classes will be |
|
| 2316 |
+# listed. |
|
| 2317 |
+# The default value is: NO. |
|
| 2318 |
+ |
|
| 2319 |
+ALLEXTERNALS = NO |
|
| 2320 |
+ |
|
| 2321 |
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed |
|
| 2322 |
+# in the modules index. If set to NO, only the current project's groups will be |
|
| 2323 |
+# listed. |
|
| 2324 |
+# The default value is: YES. |
|
| 2325 |
+ |
|
| 2326 |
+EXTERNAL_GROUPS = YES |
|
| 2327 |
+ |
|
| 2328 |
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in |
|
| 2329 |
+# the related pages index. If set to NO, only the current project's pages will |
|
| 2330 |
+# be listed. |
|
| 2331 |
+# The default value is: YES. |
|
| 2332 |
+ |
|
| 2333 |
+EXTERNAL_PAGES = YES |
|
| 2334 |
+ |
|
| 2335 |
+#--------------------------------------------------------------------------- |
|
| 2336 |
+# Configuration options related to the dot tool |
|
| 2337 |
+#--------------------------------------------------------------------------- |
|
| 2338 |
+ |
|
| 2339 |
+# You can include diagrams made with dia in doxygen documentation. Doxygen will |
|
| 2340 |
+# then run dia to produce the diagram and insert it in the documentation. The |
|
| 2341 |
+# DIA_PATH tag allows you to specify the directory where the dia binary resides. |
|
| 2342 |
+# If left empty dia is assumed to be found in the default search path. |
|
| 2343 |
+ |
|
| 2344 |
+DIA_PATH = |
|
| 2345 |
+ |
|
| 2346 |
+# If set to YES the inheritance and collaboration graphs will hide inheritance |
|
| 2347 |
+# and usage relations if the target is undocumented or is not a class. |
|
| 2348 |
+# The default value is: YES. |
|
| 2349 |
+ |
|
| 2350 |
+HIDE_UNDOC_RELATIONS = NO |
|
| 2351 |
+ |
|
| 2352 |
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is |
|
| 2353 |
+# available from the path. This tool is part of Graphviz (see: |
|
| 2354 |
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent |
|
| 2355 |
+# Bell Labs. The other options in this section have no effect if this option is |
|
| 2356 |
+# set to NO |
|
| 2357 |
+# The default value is: NO. |
|
| 2358 |
+ |
|
| 2359 |
+HAVE_DOT = YES |
|
| 2360 |
+ |
|
| 2361 |
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed |
|
| 2362 |
+# to run in parallel. When set to 0 doxygen will base this on the number of |
|
| 2363 |
+# processors available in the system. You can set it explicitly to a value |
|
| 2364 |
+# larger than 0 to get control over the balance between CPU load and processing |
|
| 2365 |
+# speed. |
|
| 2366 |
+# Minimum value: 0, maximum value: 32, default value: 0. |
|
| 2367 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2368 |
+ |
|
| 2369 |
+DOT_NUM_THREADS = 0 |
|
| 2370 |
+ |
|
| 2371 |
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of |
|
| 2372 |
+# subgraphs. When you want a differently looking font in the dot files that |
|
| 2373 |
+# doxygen generates you can specify fontname, fontcolor and fontsize attributes. |
|
| 2374 |
+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node, |
|
| 2375 |
+# Edge and Graph Attributes specification</a> You need to make sure dot is able |
|
| 2376 |
+# to find the font, which can be done by putting it in a standard location or by |
|
| 2377 |
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the |
|
| 2378 |
+# directory containing the font. Default graphviz fontsize is 14. |
|
| 2379 |
+# The default value is: fontname=Helvetica,fontsize=10. |
|
| 2380 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2381 |
+ |
|
| 2382 |
+DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" |
|
| 2383 |
+ |
|
| 2384 |
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can |
|
| 2385 |
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a |
|
| 2386 |
+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about |
|
| 2387 |
+# arrows shapes.</a> |
|
| 2388 |
+# The default value is: labelfontname=Helvetica,labelfontsize=10. |
|
| 2389 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2390 |
+ |
|
| 2391 |
+DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" |
|
| 2392 |
+ |
|
| 2393 |
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes |
|
| 2394 |
+# around nodes set 'shape=plain' or 'shape=plaintext' <a |
|
| 2395 |
+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a> |
|
| 2396 |
+# The default value is: shape=box,height=0.2,width=0.4. |
|
| 2397 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2398 |
+ |
|
| 2399 |
+DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" |
|
| 2400 |
+ |
|
| 2401 |
+# You can set the path where dot can find font specified with fontname in |
|
| 2402 |
+# DOT_COMMON_ATTR and others dot attributes. |
|
| 2403 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2404 |
+ |
|
| 2405 |
+DOT_FONTPATH = |
|
| 2406 |
+ |
|
| 2407 |
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a |
|
| 2408 |
+# graph for each documented class showing the direct and indirect inheritance |
|
| 2409 |
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, |
|
| 2410 |
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set |
|
| 2411 |
+# to TEXT the direct and indirect inheritance relations will be shown as texts / |
|
| 2412 |
+# links. |
|
| 2413 |
+# Possible values are: NO, YES, TEXT and GRAPH. |
|
| 2414 |
+# The default value is: YES. |
|
| 2415 |
+ |
|
| 2416 |
+CLASS_GRAPH = YES |
|
| 2417 |
+ |
|
| 2418 |
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a |
|
| 2419 |
+# graph for each documented class showing the direct and indirect implementation |
|
| 2420 |
+# dependencies (inheritance, containment, and class references variables) of the |
|
| 2421 |
+# class with other documented classes. |
|
| 2422 |
+# The default value is: YES. |
|
| 2423 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2424 |
+ |
|
| 2425 |
+COLLABORATION_GRAPH = YES |
|
| 2426 |
+ |
|
| 2427 |
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for |
|
| 2428 |
+# groups, showing the direct groups dependencies. See also the chapter Grouping |
|
| 2429 |
+# in the manual. |
|
| 2430 |
+# The default value is: YES. |
|
| 2431 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2432 |
+ |
|
| 2433 |
+GROUP_GRAPHS = YES |
|
| 2434 |
+ |
|
| 2435 |
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and |
|
| 2436 |
+# collaboration diagrams in a style similar to the OMG's Unified Modeling |
|
| 2437 |
+# Language. |
|
| 2438 |
+# The default value is: NO. |
|
| 2439 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2440 |
+ |
|
| 2441 |
+UML_LOOK = NO |
|
| 2442 |
+ |
|
| 2443 |
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the |
|
| 2444 |
+# class node. If there are many fields or methods and many nodes the graph may |
|
| 2445 |
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the |
|
| 2446 |
+# number of items for each type to make the size more manageable. Set this to 0 |
|
| 2447 |
+# for no limit. Note that the threshold may be exceeded by 50% before the limit |
|
| 2448 |
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear, |
|
| 2449 |
+# but if the number exceeds 15, the total amount of fields shown is limited to |
|
| 2450 |
+# 10. |
|
| 2451 |
+# Minimum value: 0, maximum value: 100, default value: 10. |
|
| 2452 |
+# This tag requires that the tag UML_LOOK is set to YES. |
|
| 2453 |
+ |
|
| 2454 |
+UML_LIMIT_NUM_FIELDS = 10 |
|
| 2455 |
+ |
|
| 2456 |
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and |
|
| 2457 |
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS |
|
| 2458 |
+# tag is set to YES, doxygen will add type and arguments for attributes and |
|
| 2459 |
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen |
|
| 2460 |
+# will not generate fields with class member information in the UML graphs. The |
|
| 2461 |
+# class diagrams will look similar to the default class diagrams but using UML |
|
| 2462 |
+# notation for the relationships. |
|
| 2463 |
+# Possible values are: NO, YES and NONE. |
|
| 2464 |
+# The default value is: NO. |
|
| 2465 |
+# This tag requires that the tag UML_LOOK is set to YES. |
|
| 2466 |
+ |
|
| 2467 |
+DOT_UML_DETAILS = NO |
|
| 2468 |
+ |
|
| 2469 |
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters |
|
| 2470 |
+# to display on a single line. If the actual line length exceeds this threshold |
|
| 2471 |
+# significantly it will wrapped across multiple lines. Some heuristics are apply |
|
| 2472 |
+# to avoid ugly line breaks. |
|
| 2473 |
+# Minimum value: 0, maximum value: 1000, default value: 17. |
|
| 2474 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2475 |
+ |
|
| 2476 |
+DOT_WRAP_THRESHOLD = 17 |
|
| 2477 |
+ |
|
| 2478 |
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and |
|
| 2479 |
+# collaboration graphs will show the relations between templates and their |
|
| 2480 |
+# instances. |
|
| 2481 |
+# The default value is: NO. |
|
| 2482 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2483 |
+ |
|
| 2484 |
+TEMPLATE_RELATIONS = YES |
|
| 2485 |
+ |
|
| 2486 |
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to |
|
| 2487 |
+# YES then doxygen will generate a graph for each documented file showing the |
|
| 2488 |
+# direct and indirect include dependencies of the file with other documented |
|
| 2489 |
+# files. |
|
| 2490 |
+# The default value is: YES. |
|
| 2491 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2492 |
+ |
|
| 2493 |
+INCLUDE_GRAPH = YES |
|
| 2494 |
+ |
|
| 2495 |
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are |
|
| 2496 |
+# set to YES then doxygen will generate a graph for each documented file showing |
|
| 2497 |
+# the direct and indirect include dependencies of the file with other documented |
|
| 2498 |
+# files. |
|
| 2499 |
+# The default value is: YES. |
|
| 2500 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2501 |
+ |
|
| 2502 |
+INCLUDED_BY_GRAPH = YES |
|
| 2503 |
+ |
|
| 2504 |
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call |
|
| 2505 |
+# dependency graph for every global function or class method. |
|
| 2506 |
+# |
|
| 2507 |
+# Note that enabling this option will significantly increase the time of a run. |
|
| 2508 |
+# So in most cases it will be better to enable call graphs for selected |
|
| 2509 |
+# functions only using the \callgraph command. Disabling a call graph can be |
|
| 2510 |
+# accomplished by means of the command \hidecallgraph. |
|
| 2511 |
+# The default value is: NO. |
|
| 2512 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2513 |
+ |
|
| 2514 |
+CALL_GRAPH = YES |
|
| 2515 |
+ |
|
| 2516 |
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller |
|
| 2517 |
+# dependency graph for every global function or class method. |
|
| 2518 |
+# |
|
| 2519 |
+# Note that enabling this option will significantly increase the time of a run. |
|
| 2520 |
+# So in most cases it will be better to enable caller graphs for selected |
|
| 2521 |
+# functions only using the \callergraph command. Disabling a caller graph can be |
|
| 2522 |
+# accomplished by means of the command \hidecallergraph. |
|
| 2523 |
+# The default value is: NO. |
|
| 2524 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2525 |
+ |
|
| 2526 |
+CALLER_GRAPH = YES |
|
| 2527 |
+ |
|
| 2528 |
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical |
|
| 2529 |
+# hierarchy of all classes instead of a textual one. |
|
| 2530 |
+# The default value is: YES. |
|
| 2531 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2532 |
+ |
|
| 2533 |
+GRAPHICAL_HIERARCHY = YES |
|
| 2534 |
+ |
|
| 2535 |
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the |
|
| 2536 |
+# dependencies a directory has on other directories in a graphical way. The |
|
| 2537 |
+# dependency relations are determined by the #include relations between the |
|
| 2538 |
+# files in the directories. |
|
| 2539 |
+# The default value is: YES. |
|
| 2540 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2541 |
+ |
|
| 2542 |
+DIRECTORY_GRAPH = YES |
|
| 2543 |
+ |
|
| 2544 |
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels |
|
| 2545 |
+# of child directories generated in directory dependency graphs by dot. |
|
| 2546 |
+# Minimum value: 1, maximum value: 25, default value: 1. |
|
| 2547 |
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES. |
|
| 2548 |
+ |
|
| 2549 |
+DIR_GRAPH_MAX_DEPTH = 1 |
|
| 2550 |
+ |
|
| 2551 |
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images |
|
| 2552 |
+# generated by dot. For an explanation of the image formats see the section |
|
| 2553 |
+# output formats in the documentation of the dot tool (Graphviz (see: |
|
| 2554 |
+# http://www.graphviz.org/)). |
|
| 2555 |
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order |
|
| 2556 |
+# to make the SVG files visible in IE 9+ (other browsers do not have this |
|
| 2557 |
+# requirement). |
|
| 2558 |
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, |
|
| 2559 |
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and |
|
| 2560 |
+# png:gdiplus:gdiplus. |
|
| 2561 |
+# The default value is: png. |
|
| 2562 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2563 |
+ |
|
| 2564 |
+DOT_IMAGE_FORMAT = svg |
|
| 2565 |
+ |
|
| 2566 |
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to |
|
| 2567 |
+# enable generation of interactive SVG images that allow zooming and panning. |
|
| 2568 |
+# |
|
| 2569 |
+# Note that this requires a modern browser other than Internet Explorer. Tested |
|
| 2570 |
+# and working are Firefox, Chrome, Safari, and Opera. |
|
| 2571 |
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make |
|
| 2572 |
+# the SVG files visible. Older versions of IE do not have SVG support. |
|
| 2573 |
+# The default value is: NO. |
|
| 2574 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2575 |
+ |
|
| 2576 |
+INTERACTIVE_SVG = YES |
|
| 2577 |
+ |
|
| 2578 |
+# The DOT_PATH tag can be used to specify the path where the dot tool can be |
|
| 2579 |
+# found. If left blank, it is assumed the dot tool can be found in the path. |
|
| 2580 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2581 |
+ |
|
| 2582 |
+DOT_PATH = |
|
| 2583 |
+ |
|
| 2584 |
+# The DOTFILE_DIRS tag can be used to specify one or more directories that |
|
| 2585 |
+# contain dot files that are included in the documentation (see the \dotfile |
|
| 2586 |
+# command). |
|
| 2587 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2588 |
+ |
|
| 2589 |
+DOTFILE_DIRS = |
|
| 2590 |
+ |
|
| 2591 |
+# The MSCFILE_DIRS tag can be used to specify one or more directories that |
|
| 2592 |
+# contain msc files that are included in the documentation (see the \mscfile |
|
| 2593 |
+# command). |
|
| 2594 |
+ |
|
| 2595 |
+MSCFILE_DIRS = |
|
| 2596 |
+ |
|
| 2597 |
+# The DIAFILE_DIRS tag can be used to specify one or more directories that |
|
| 2598 |
+# contain dia files that are included in the documentation (see the \diafile |
|
| 2599 |
+# command). |
|
| 2600 |
+ |
|
| 2601 |
+DIAFILE_DIRS = |
|
| 2602 |
+ |
|
| 2603 |
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the |
|
| 2604 |
+# path where java can find the plantuml.jar file or to the filename of jar file |
|
| 2605 |
+# to be used. If left blank, it is assumed PlantUML is not used or called during |
|
| 2606 |
+# a preprocessing step. Doxygen will generate a warning when it encounters a |
|
| 2607 |
+# \startuml command in this case and will not generate output for the diagram. |
|
| 2608 |
+ |
|
| 2609 |
+PLANTUML_JAR_PATH = |
|
| 2610 |
+ |
|
| 2611 |
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a |
|
| 2612 |
+# configuration file for plantuml. |
|
| 2613 |
+ |
|
| 2614 |
+PLANTUML_CFG_FILE = |
|
| 2615 |
+ |
|
| 2616 |
+# When using plantuml, the specified paths are searched for files specified by |
|
| 2617 |
+# the !include statement in a plantuml block. |
|
| 2618 |
+ |
|
| 2619 |
+PLANTUML_INCLUDE_PATH = |
|
| 2620 |
+ |
|
| 2621 |
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes |
|
| 2622 |
+# that will be shown in the graph. If the number of nodes in a graph becomes |
|
| 2623 |
+# larger than this value, doxygen will truncate the graph, which is visualized |
|
| 2624 |
+# by representing a node as a red box. Note that doxygen if the number of direct |
|
| 2625 |
+# children of the root node in a graph is already larger than |
|
| 2626 |
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that |
|
| 2627 |
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. |
|
| 2628 |
+# Minimum value: 0, maximum value: 10000, default value: 50. |
|
| 2629 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2630 |
+ |
|
| 2631 |
+DOT_GRAPH_MAX_NODES = 100 |
|
| 2632 |
+ |
|
| 2633 |
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs |
|
| 2634 |
+# generated by dot. A depth value of 3 means that only nodes reachable from the |
|
| 2635 |
+# root by following a path via at most 3 edges will be shown. Nodes that lay |
|
| 2636 |
+# further from the root node will be omitted. Note that setting this option to 1 |
|
| 2637 |
+# or 2 may greatly reduce the computation time needed for large code bases. Also |
|
| 2638 |
+# note that the size of a graph can be further restricted by |
|
| 2639 |
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. |
|
| 2640 |
+# Minimum value: 0, maximum value: 1000, default value: 0. |
|
| 2641 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2642 |
+ |
|
| 2643 |
+MAX_DOT_GRAPH_DEPTH = 0 |
|
| 2644 |
+ |
|
| 2645 |
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output |
|
| 2646 |
+# files in one run (i.e. multiple -o and -T options on the command line). This |
|
| 2647 |
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support |
|
| 2648 |
+# this, this feature is disabled by default. |
|
| 2649 |
+# The default value is: NO. |
|
| 2650 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2651 |
+ |
|
| 2652 |
+DOT_MULTI_TARGETS = NO |
|
| 2653 |
+ |
|
| 2654 |
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page |
|
| 2655 |
+# explaining the meaning of the various boxes and arrows in the dot generated |
|
| 2656 |
+# graphs. |
|
| 2657 |
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal |
|
| 2658 |
+# graphical representation for inheritance and collaboration diagrams is used. |
|
| 2659 |
+# The default value is: YES. |
|
| 2660 |
+# This tag requires that the tag HAVE_DOT is set to YES. |
|
| 2661 |
+ |
|
| 2662 |
+GENERATE_LEGEND = YES |
|
| 2663 |
+ |
|
| 2664 |
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate |
|
| 2665 |
+# files that are used to generate the various graphs. |
|
| 2666 |
+# |
|
| 2667 |
+# Note: This setting is not only used for dot files but also for msc temporary |
|
| 2668 |
+# files. |
|
| 2669 |
+# The default value is: YES. |
|
| 2670 |
+ |
|
| 2671 |
+DOT_CLEANUP = NO |
| 0 | 2672 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,22 @@ |
| 1 |
+DOXYGEN = doxygen |
|
| 2 |
+ |
|
| 3 |
+DOC_DIR = html |
|
| 4 |
+DOC_TAG = doxygen.tag |
|
| 5 |
+DOC_LOG = warnings.log |
|
| 6 |
+ |
|
| 7 |
+SRC_FILES := $(wildcard ../src/*.cpp ../src/*.h) |
|
| 8 |
+SRC_FILES := $(filter-out $(wildcard ../src/moc_*.cpp), $(SRC_FILES)) |
|
| 9 |
+ |
|
| 10 |
+.PHONY: all |
|
| 11 |
+all: html |
|
| 12 |
+ |
|
| 13 |
+html: $(SRC_FILES) |
|
| 14 |
+ rm -rf html |
|
| 15 |
+ $(DOXYGEN) Doxyfile |
|
| 16 |
+ |
|
| 17 |
+.PHONY: clean |
|
| 18 |
+clean: |
|
| 19 |
+ rm -rf $(DOC_DIR) |
|
| 20 |
+ rm -f $(DOC_TAG) |
|
| 21 |
+ rm -f $(DOC_LOG) |
|
| 22 |
+ |
| 0 | 23 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,208 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "asm.h" |
|
| 13 |
+ |
|
| 14 |
+//! Constructor for assembler start functions |
|
| 15 |
+Asm::Asm() |
|
| 16 |
+{
|
|
| 17 |
+} |
|
| 18 |
+ |
|
| 19 |
+/** |
|
| 20 |
+ * Compile the kernel |
|
| 21 |
+ * |
|
| 22 |
+ * @param inputFile Name of the input source file |
|
| 23 |
+ * @param outputFile Name of the output binary file |
|
| 24 |
+ * @param outputMapFile Name of the output map file |
|
| 25 |
+ * |
|
| 26 |
+ * @return Status of compilation |
|
| 27 |
+ */ |
|
| 28 |
+bool Asm::compileRom(const QString &inputFile, const QString &outputFile, const QString &outputMapFile) |
|
| 29 |
+{
|
|
| 30 |
+ return(this->compile(DataList::Mode::Rom, inputFile, outputFile, outputMapFile)); |
|
| 31 |
+} |
|
| 32 |
+ |
|
| 33 |
+/** |
|
| 34 |
+ * Compile the application |
|
| 35 |
+ * |
|
| 36 |
+ * @param inputFile Name of the input source file |
|
| 37 |
+ * @param outputFile Name of the output binary file |
|
| 38 |
+ * |
|
| 39 |
+ * @return Status of compilation |
|
| 40 |
+ */ |
|
| 41 |
+bool Asm::compileApp(const QString &inputFile, const QString &outputFile) |
|
| 42 |
+{
|
|
| 43 |
+ return(this->compile(DataList::Mode::App, inputFile, outputFile)); |
|
| 44 |
+} |
|
| 45 |
+ |
|
| 46 |
+/** |
|
| 47 |
+ * Compile the source |
|
| 48 |
+ * |
|
| 49 |
+ * @param mode Mode of compilation |
|
| 50 |
+ * @param inputFile Name of the input source file |
|
| 51 |
+ * @param outputFile Name of the output binary file |
|
| 52 |
+ * @param outputMapFile Name of the output map file |
|
| 53 |
+ * |
|
| 54 |
+ * @return Status of compilation |
|
| 55 |
+ */ |
|
| 56 |
+bool Asm::compile(DataList::Mode mode, QString inputFile, QString outputFile, QString outputMapFile) |
|
| 57 |
+{
|
|
| 58 |
+ QTextStream out(stdout); |
|
| 59 |
+ |
|
| 60 |
+ DataList dataList(mode); |
|
| 61 |
+ Parser parser(dataList); |
|
| 62 |
+ |
|
| 63 |
+ if(!parser.parseFile(inputFile)) |
|
| 64 |
+ {
|
|
| 65 |
+ out << "ERROR: Parsing error\n\n"; |
|
| 66 |
+ return(-1); |
|
| 67 |
+ } |
|
| 68 |
+ |
|
| 69 |
+ Compiler compiler(dataList); |
|
| 70 |
+ this->initInstructions(compiler); |
|
| 71 |
+ |
|
| 72 |
+ if(!compiler.compile()) |
|
| 73 |
+ {
|
|
| 74 |
+ out << "ERROR: Compilation error\n\n"; |
|
| 75 |
+ return(-1); |
|
| 76 |
+ } |
|
| 77 |
+ |
|
| 78 |
+ Linker linker(dataList); |
|
| 79 |
+ |
|
| 80 |
+ if(!linker.link()) |
|
| 81 |
+ {
|
|
| 82 |
+ out << "ERROR: Linking error\n\n"; |
|
| 83 |
+ return(-1); |
|
| 84 |
+ } |
|
| 85 |
+ |
|
| 86 |
+ if(!linker.saveFile(outputFile, outputMapFile)) |
|
| 87 |
+ {
|
|
| 88 |
+ out << "ERROR: Failed to save file\n\n"; |
|
| 89 |
+ return(-1); |
|
| 90 |
+ } |
|
| 91 |
+ |
|
| 92 |
+ out << "OK: The file was saved successfully\n\n"; |
|
| 93 |
+ return(0); |
|
| 94 |
+} |
|
| 95 |
+ |
|
| 96 |
+/** |
|
| 97 |
+ * Init the instruction list for the compiler |
|
| 98 |
+ * |
|
| 99 |
+ * @param compiler Compiler to which the instructions will be added |
|
| 100 |
+ */ |
|
| 101 |
+void Asm::initInstructions(Compiler &compiler) |
|
| 102 |
+{
|
|
| 103 |
+ // LOAD_I + RPC+1 |
|
| 104 |
+ compiler.addInstruction(Instruction("nop", 0b00000000));
|
|
| 105 |
+ |
|
| 106 |
+ // LOAD_I + RPC |
|
| 107 |
+ compiler.addInstruction(Instruction("halt", 0b11111111));
|
|
| 108 |
+ |
|
| 109 |
+ // LOAD_I + STORE + RPC+1 |
|
| 110 |
+ compiler.addInstruction(Instruction("ldf", 0b00000100, Instruction::Arg::ABXY));
|
|
| 111 |
+ compiler.addInstruction(Instruction("ldr", 0b00001000, Instruction::Arg::ABXY));
|
|
| 112 |
+ compiler.addInstruction(Instruction("str", 0b00001100, Instruction::Arg::ABXY));
|
|
| 113 |
+ compiler.addInstruction(Instruction("mov", 0b10000000, Instruction::Arg::ABXY, Instruction::Arg::ABXY));
|
|
| 114 |
+ compiler.addInstruction(Instruction("in", 0b00010000, Instruction::Arg::ABXY));
|
|
| 115 |
+ compiler.addInstruction(Instruction("out", 0b00010100, Instruction::Arg::ABXY));
|
|
| 116 |
+ |
|
| 117 |
+ // LOAD_I + ALU + RPC+1 |
|
| 118 |
+ compiler.addInstruction(Instruction("cmp", 0b11100000, Instruction::Arg::AB, Instruction::Arg::ABXY));
|
|
| 119 |
+ |
|
| 120 |
+ // LOAD_I + ALU + STORE + RPC+1 |
|
| 121 |
+ compiler.addInstruction(Instruction("inc", 0b00011000, Instruction::Arg::ABXY));
|
|
| 122 |
+ compiler.addInstruction(Instruction("incc", 0b01110000, Instruction::Arg::ABXY));
|
|
| 123 |
+ compiler.addInstruction(Instruction("dec", 0b00011100, Instruction::Arg::ABXY));
|
|
| 124 |
+ compiler.addInstruction(Instruction("decc", 0b01110100, Instruction::Arg::ABXY));
|
|
| 125 |
+ compiler.addInstruction(Instruction("not", 0b00100000, Instruction::Arg::ABXY));
|
|
| 126 |
+ compiler.addInstruction(Instruction("add", 0b10010000, Instruction::Arg::AB, Instruction::Arg::ABXY));
|
|
| 127 |
+ compiler.addInstruction(Instruction("addc", 0b10011000, Instruction::Arg::AB, Instruction::Arg::ABXY));
|
|
| 128 |
+ compiler.addInstruction(Instruction("sub", 0b10100000, Instruction::Arg::AB, Instruction::Arg::ABXY));
|
|
| 129 |
+ compiler.addInstruction(Instruction("subc", 0b10101000, Instruction::Arg::AB, Instruction::Arg::ABXY));
|
|
| 130 |
+ compiler.addInstruction(Instruction("and", 0b10110000, Instruction::Arg::AB, Instruction::Arg::ABXY));
|
|
| 131 |
+ compiler.addInstruction(Instruction("or", 0b10111000, Instruction::Arg::AB, Instruction::Arg::ABXY));
|
|
| 132 |
+ compiler.addInstruction(Instruction("xor", 0b11000000, Instruction::Arg::AB, Instruction::Arg::ABXY));
|
|
| 133 |
+ compiler.addInstruction(Instruction("shl", 0b01111000, Instruction::Arg::ABXY));
|
|
| 134 |
+ compiler.addInstruction(Instruction("clr", 0b11001000, Instruction::Arg::ABXY));
|
|
| 135 |
+ |
|
| 136 |
+ // LOAD_I + 8x ALU + STORE + RPC+1 |
|
| 137 |
+ compiler.addInstruction(Instruction("shr", 0b01111100, Instruction::Arg::ABXY));
|
|
| 138 |
+ compiler.addInstruction(Instruction("swap", 0b01101100, Instruction::Arg::ABXY));
|
|
| 139 |
+ |
|
| 140 |
+ // LOAD_I + PC+1 + STORE + RPC+1 |
|
| 141 |
+ compiler.addInstruction(Instruction("mov", 0b00100100, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 142 |
+ compiler.addInstruction(Instruction("out", 0b00000010, Instruction::Arg::Val256));
|
|
| 143 |
+ |
|
| 144 |
+ // LOAD_I + PC+1 + LOAD_D + STORE + RPC+1 |
|
| 145 |
+ compiler.addInstruction(Instruction("str", 0b00000001, Instruction::Arg::Val256));
|
|
| 146 |
+ |
|
| 147 |
+ // LOAD_I + PC+1 + LOAD_D + ALU + RPC+1 |
|
| 148 |
+ compiler.addInstruction(Instruction("cmp", 0b00101000, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 149 |
+ |
|
| 150 |
+ // LOAD_I + PC+1 + LOAD_D + ALU + STORE + RPC+1 |
|
| 151 |
+ compiler.addInstruction(Instruction("add", 0b00101100, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 152 |
+ compiler.addInstruction(Instruction("addc", 0b00110000, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 153 |
+ compiler.addInstruction(Instruction("sub", 0b00110100, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 154 |
+ compiler.addInstruction(Instruction("subc", 0b00111000, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 155 |
+ compiler.addInstruction(Instruction("and", 0b00111100, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 156 |
+ compiler.addInstruction(Instruction("or", 0b01000000, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 157 |
+ compiler.addInstruction(Instruction("xor", 0b01000100, Instruction::Arg::Val256, Instruction::Arg::ABXY));
|
|
| 158 |
+ |
|
| 159 |
+ // LOAD_I + PC+1 + LOAD_MAL + PC+1 + LOAD_MAH + STORE + RPC+1 |
|
| 160 |
+ compiler.addInstruction(Instruction("ldf", 0b01011000, Instruction::Arg::Addr, Instruction::Arg::ABXY));
|
|
| 161 |
+ compiler.addInstruction(Instruction("ldr", 0b01011100, Instruction::Arg::Addr, Instruction::Arg::ABXY));
|
|
| 162 |
+ compiler.addInstruction(Instruction("str", 0b01100000, Instruction::Arg::ABXY, Instruction::Arg::Addr));
|
|
| 163 |
+ |
|
| 164 |
+ // LOAD_I + PC+1 + LOAD_D + PC+1 + LOAD_MAL + PC+1 + LOAD_MAH + STORE + RPC+1 |
|
| 165 |
+ compiler.addInstruction(Instruction("str", 0b00000011, Instruction::Arg::Val256, Instruction::Arg::Addr));
|
|
| 166 |
+ |
|
| 167 |
+ // LOAD_I + LOAD + LOAD + RPC+1 + LOAD_I + LOAD + RPC+1 |
|
| 168 |
+ compiler.addInstruction(Instruction("xchg", 0b11010000, Instruction::Arg::ABXY, Instruction::Arg::ABXY, Instruction::Arg::None, 0b11001100, Instruction::Arg::ABXY));
|
|
| 169 |
+ |
|
| 170 |
+ // LOAD_I + PC+1 + LOAD_MAL + PC+1 + LOAD_MAH + 3x STORE + RPC+1 |
|
| 171 |
+ compiler.addInstruction(Instruction("xchg", 0b01001000, Instruction::Arg::Addr, Instruction::Arg::ABXY));
|
|
| 172 |
+ |
|
| 173 |
+ // LOAD_I + PC+1 + LOAD_PCL + PC+1 + LOAD_PCH + STORE + RESET |
|
| 174 |
+ compiler.addInstruction(Instruction("jmp", 0b11110000, Instruction::Arg::Addr));
|
|
| 175 |
+ |
|
| 176 |
+ // LOAD_I + PC+1 + LOAD_D + PC+1 + LOAD_PCH + STORE + RESET |
|
| 177 |
+ // + PC+1 + PC+1 + RPC+1 |
|
| 178 |
+ compiler.addInstruction(Instruction("je", 0b11111000, Instruction::Arg::Addr));
|
|
| 179 |
+ compiler.addInstruction(Instruction("jne", 0b11111001, Instruction::Arg::Addr));
|
|
| 180 |
+ compiler.addInstruction(Instruction("jg", 0b11111010, Instruction::Arg::Addr));
|
|
| 181 |
+ compiler.addInstruction(Instruction("jge", 0b11111011, Instruction::Arg::Addr));
|
|
| 182 |
+ compiler.addInstruction(Instruction("jl", 0b11111100, Instruction::Arg::Addr));
|
|
| 183 |
+ compiler.addInstruction(Instruction("jle", 0b11111101, Instruction::Arg::Addr));
|
|
| 184 |
+ |
|
| 185 |
+ // LOAD_I + STORE + SP-1 + RPC+1 |
|
| 186 |
+ compiler.addInstruction(Instruction("push", 0b01100100, Instruction::Arg::ABXY));
|
|
| 187 |
+ |
|
| 188 |
+ // LOAD_I + SP+1 + STORE + RPC+1 |
|
| 189 |
+ compiler.addInstruction(Instruction("pop", 0b01101000, Instruction::Arg::ABXY));
|
|
| 190 |
+ |
|
| 191 |
+ // LOAD_I + STORE + SP-1 + STORE + SP-1 + PC+1 + LOAD_D + PC+1 + LOAD_PCH + STORE + RESET |
|
| 192 |
+ compiler.addInstruction(Instruction("call", 0b11110001, Instruction::Arg::Addr));
|
|
| 193 |
+ |
|
| 194 |
+ // LOAD_I + SP+1 + STORE + SP+1 + STORE + RESET |
|
| 195 |
+ compiler.addInstruction(Instruction("ret", 0b11110010));
|
|
| 196 |
+ |
|
| 197 |
+ // LOAD_I + ALU + PC+1 + PC+1 + RPC+1 |
|
| 198 |
+ // + ALU + STORE + PC+1 + LOAD_D + PC+1 + LOAD_PCH + STORE + RESET |
|
| 199 |
+ compiler.addInstruction(Instruction("loope", 0b11101000, Instruction::Arg::AB, Instruction::Arg::ABXY, Instruction::Arg::Addr));
|
|
| 200 |
+ |
|
| 201 |
+ // LOAD_I + ALU + STORE + PC+1 + PC+1 + PC+1 + RPC+1 |
|
| 202 |
+ // + ALU + STORE + PC+1 + LOAD_D + PC+1 + LOAD_PCH + STORE + RESET |
|
| 203 |
+ compiler.addInstruction(Instruction("loope", 0b01001100, Instruction::Arg::Val256, Instruction::Arg::ABXY, Instruction::Arg::Addr));
|
|
| 204 |
+ |
|
| 205 |
+ // LOAD_I + ALU STORE + PC+1 + PC+1 + RPC+1 |
|
| 206 |
+ // + ALU + STORE + PC+1 + LOAD_D + PC+1 + LOAD_PCH + STORE + RESET |
|
| 207 |
+ compiler.addInstruction(Instruction("loopz", 0b11110100, Instruction::Arg::ABXY, Instruction::Arg::Addr));
|
|
| 208 |
+} |
| 0 | 209 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,27 @@ |
| 1 |
+#ifndef ASM_H |
|
| 2 |
+#define ASM_H |
|
| 3 |
+ |
|
| 4 |
+#include <QString> |
|
| 5 |
+#include <QTextStream> |
|
| 6 |
+ |
|
| 7 |
+#include "datalist.h" |
|
| 8 |
+#include "parser.h" |
|
| 9 |
+#include "compiler.h" |
|
| 10 |
+#include "linker.h" |
|
| 11 |
+ |
|
| 12 |
+//! This class contains assembler start functions |
|
| 13 |
+class Asm |
|
| 14 |
+{
|
|
| 15 |
+ public: |
|
| 16 |
+ Asm(); |
|
| 17 |
+ |
|
| 18 |
+ bool compileRom(const QString &inputFile, const QString &outputFile, const QString &outputMapFile); |
|
| 19 |
+ bool compileApp(const QString &inputFile, const QString &outputFile); |
|
| 20 |
+ |
|
| 21 |
+ private: |
|
| 22 |
+ bool compile(DataList::Mode mode, QString inputFile, QString outputFile, QString outputMapFile = ""); |
|
| 23 |
+ |
|
| 24 |
+ void initInstructions(Compiler &compiler); |
|
| 25 |
+}; |
|
| 26 |
+ |
|
| 27 |
+#endif |
| 0 | 28 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,34 @@ |
| 1 |
+QT -= gui |
|
| 2 |
+ |
|
| 3 |
+CONFIG += c++14 console |
|
| 4 |
+CONFIG -= app_bundle |
|
| 5 |
+CONFIG -= debug_and_release debug_and_release_target |
|
| 6 |
+ |
|
| 7 |
+DEFINES += QT_DEPRECATED_WARNINGS |
|
| 8 |
+ |
|
| 9 |
+SOURCES += \ |
|
| 10 |
+ asm.cpp \ |
|
| 11 |
+ instruction.cpp \ |
|
| 12 |
+ codeitem.cpp \ |
|
| 13 |
+ codesection.cpp \ |
|
| 14 |
+ main.cpp \ |
|
| 15 |
+ ramitem.cpp \ |
|
| 16 |
+ flashitem.cpp \ |
|
| 17 |
+ data.cpp \ |
|
| 18 |
+ parser.cpp \ |
|
| 19 |
+ compiler.cpp \ |
|
| 20 |
+ linker.cpp \ |
|
| 21 |
+ datalist.cpp |
|
| 22 |
+ |
|
| 23 |
+HEADERS += \ |
|
| 24 |
+ asm.h \ |
|
| 25 |
+ instruction.h \ |
|
| 26 |
+ codeitem.h \ |
|
| 27 |
+ codesection.h \ |
|
| 28 |
+ ramitem.h \ |
|
| 29 |
+ flashitem.h \ |
|
| 30 |
+ data.h \ |
|
| 31 |
+ parser.h \ |
|
| 32 |
+ compiler.h \ |
|
| 33 |
+ linker.h \ |
|
| 34 |
+ datalist.h |
| 0 | 35 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,99 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "codeitem.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor for creating a code item |
|
| 16 |
+ * |
|
| 17 |
+ * @param line Line number in the source file |
|
| 18 |
+ * @param name Name of the instruction |
|
| 19 |
+ * @param paramList List of parameters for the instruction |
|
| 20 |
+ */ |
|
| 21 |
+CodeItem::CodeItem(int line, const QString &name, const QList<QString> ¶mList) |
|
| 22 |
+{
|
|
| 23 |
+ this->line = line; |
|
| 24 |
+ this->name = name; |
|
| 25 |
+ |
|
| 26 |
+ this->paramList = paramList; |
|
| 27 |
+ |
|
| 28 |
+ this->address = 0; |
|
| 29 |
+} |
|
| 30 |
+ |
|
| 31 |
+/** |
|
| 32 |
+ * Get the line number where the instruction occurred |
|
| 33 |
+ * |
|
| 34 |
+ * @return Line number in the source file |
|
| 35 |
+ */ |
|
| 36 |
+int CodeItem::getLine() const |
|
| 37 |
+{
|
|
| 38 |
+ return(this->line); |
|
| 39 |
+} |
|
| 40 |
+ |
|
| 41 |
+/** |
|
| 42 |
+ * Get the name of the instruction |
|
| 43 |
+ * |
|
| 44 |
+ * @return Name of the instruction |
|
| 45 |
+ */ |
|
| 46 |
+const QString &CodeItem::getName() const |
|
| 47 |
+{
|
|
| 48 |
+ return(this->name); |
|
| 49 |
+} |
|
| 50 |
+ |
|
| 51 |
+/** |
|
| 52 |
+ * Get the parameter list of the instruction |
|
| 53 |
+ * |
|
| 54 |
+ * @return Parameter list of the instruction |
|
| 55 |
+ */ |
|
| 56 |
+const QList<QString> &CodeItem::getParamList() const |
|
| 57 |
+{
|
|
| 58 |
+ return(this->paramList); |
|
| 59 |
+} |
|
| 60 |
+ |
|
| 61 |
+/** |
|
| 62 |
+ * Get the list of machine instructions generated from the assembler instruction |
|
| 63 |
+ * |
|
| 64 |
+ * @return List of machine instruction |
|
| 65 |
+ */ |
|
| 66 |
+QVector<unsigned char> &CodeItem::getDataVector() |
|
| 67 |
+{
|
|
| 68 |
+ return(this->dataVector); |
|
| 69 |
+} |
|
| 70 |
+ |
|
| 71 |
+/** |
|
| 72 |
+ * Get the list of address needed to fill up during linking |
|
| 73 |
+ * |
|
| 74 |
+ * @return List of address needed to fill up during linking |
|
| 75 |
+ */ |
|
| 76 |
+QHash<QString, unsigned int> &CodeItem::getToFillUpHash() |
|
| 77 |
+{
|
|
| 78 |
+ return(this->toFillUpHash); |
|
| 79 |
+} |
|
| 80 |
+ |
|
| 81 |
+/** |
|
| 82 |
+ * Set the address in the memory |
|
| 83 |
+ * |
|
| 84 |
+ * @param address Address in the memory |
|
| 85 |
+ */ |
|
| 86 |
+void CodeItem::setAddress(unsigned int address) |
|
| 87 |
+{
|
|
| 88 |
+ this->address = address; |
|
| 89 |
+} |
|
| 90 |
+ |
|
| 91 |
+/** |
|
| 92 |
+ * Get the address in the memory |
|
| 93 |
+ * |
|
| 94 |
+ * @return Address in the memory |
|
| 95 |
+ */ |
|
| 96 |
+unsigned int CodeItem::getAddress() const |
|
| 97 |
+{
|
|
| 98 |
+ return(this->address); |
|
| 99 |
+} |
| 0 | 100 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,48 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef CODEITEM_H |
|
| 13 |
+#define CODEITEM_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+#include <QList> |
|
| 17 |
+#include <QVector> |
|
| 18 |
+#include <QHash> |
|
| 19 |
+ |
|
| 20 |
+//! This class contains a one assembler instruction |
|
| 21 |
+class CodeItem |
|
| 22 |
+{
|
|
| 23 |
+ public: |
|
| 24 |
+ CodeItem(int line, const QString &name, const QList<QString> ¶mList); |
|
| 25 |
+ |
|
| 26 |
+ int getLine() const; |
|
| 27 |
+ const QString &getName() const; |
|
| 28 |
+ |
|
| 29 |
+ const QList<QString> &getParamList() const; |
|
| 30 |
+ |
|
| 31 |
+ QVector<unsigned char> &getDataVector(); |
|
| 32 |
+ QHash<QString, unsigned int> &getToFillUpHash(); |
|
| 33 |
+ |
|
| 34 |
+ void setAddress(unsigned int address); |
|
| 35 |
+ unsigned int getAddress() const; |
|
| 36 |
+ |
|
| 37 |
+ private: |
|
| 38 |
+ int line; //!< Line number from the source file |
|
| 39 |
+ QString name; //!< Name of the assembler instruction |
|
| 40 |
+ |
|
| 41 |
+ QList<QString> paramList; //!< List of parameters of the assembler instruction in raw text format |
|
| 42 |
+ |
|
| 43 |
+ QVector<unsigned char> dataVector; //!< List of bytes generated from the assembler instruction to be a machine instruction |
|
| 44 |
+ QHash<QString, unsigned int> toFillUpHash; //!< List of address fields connected to label needed to fill up during linking |
|
| 45 |
+ unsigned int address; //!< Address in memory after linking |
|
| 46 |
+}; |
|
| 47 |
+ |
|
| 48 |
+#endif |
| 0 | 49 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,73 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "codesection.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor for creating a code section |
|
| 16 |
+ * |
|
| 17 |
+ * @param name Name of the code section |
|
| 18 |
+ */ |
|
| 19 |
+CodeSection::CodeSection(const QString &name) |
|
| 20 |
+{
|
|
| 21 |
+ this->name = name; |
|
| 22 |
+ this->address = 0; |
|
| 23 |
+} |
|
| 24 |
+ |
|
| 25 |
+/** |
|
| 26 |
+ * Add a code item to the code section |
|
| 27 |
+ * |
|
| 28 |
+ * @param codeItem Code item |
|
| 29 |
+ */ |
|
| 30 |
+void CodeSection::addCodeItem(const QSharedPointer<CodeItem> &codeItem) |
|
| 31 |
+{
|
|
| 32 |
+ this->codeItemList.append(codeItem); |
|
| 33 |
+} |
|
| 34 |
+ |
|
| 35 |
+/** |
|
| 36 |
+ * Get the name of the code section |
|
| 37 |
+ * |
|
| 38 |
+ * @return Name of the code section |
|
| 39 |
+ */ |
|
| 40 |
+const QString &CodeSection::getName() const |
|
| 41 |
+{
|
|
| 42 |
+ return(this->name); |
|
| 43 |
+} |
|
| 44 |
+ |
|
| 45 |
+/** |
|
| 46 |
+ * Get the code item list |
|
| 47 |
+ * |
|
| 48 |
+ * @return Code item list |
|
| 49 |
+ */ |
|
| 50 |
+QList<QSharedPointer<CodeItem>> &CodeSection::getCodeItemList() |
|
| 51 |
+{
|
|
| 52 |
+ return(this->codeItemList); |
|
| 53 |
+} |
|
| 54 |
+ |
|
| 55 |
+/** |
|
| 56 |
+ * Set the address in the memory |
|
| 57 |
+ * |
|
| 58 |
+ * @param address Address in the memory |
|
| 59 |
+ */ |
|
| 60 |
+void CodeSection::setAddress(unsigned int address) |
|
| 61 |
+{
|
|
| 62 |
+ this->address = address; |
|
| 63 |
+} |
|
| 64 |
+ |
|
| 65 |
+/** |
|
| 66 |
+ * Get the address in the memory |
|
| 67 |
+ * |
|
| 68 |
+ * @return Address in the memory |
|
| 69 |
+ */ |
|
| 70 |
+unsigned int CodeSection::getAddress() const |
|
| 71 |
+{
|
|
| 72 |
+ return(this->address); |
|
| 73 |
+} |
| 0 | 74 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,42 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef CODESECTION_H |
|
| 13 |
+#define CODESECTION_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+#include <QList> |
|
| 17 |
+#include <QSharedPointer> |
|
| 18 |
+ |
|
| 19 |
+#include "codeitem.h" |
|
| 20 |
+ |
|
| 21 |
+//! This class contains a one code section set by each label |
|
| 22 |
+class CodeSection |
|
| 23 |
+{
|
|
| 24 |
+ public: |
|
| 25 |
+ CodeSection(const QString &name); |
|
| 26 |
+ |
|
| 27 |
+ void addCodeItem(const QSharedPointer<CodeItem> &codeItem); |
|
| 28 |
+ |
|
| 29 |
+ const QString &getName() const; |
|
| 30 |
+ QList<QSharedPointer<CodeItem>> &getCodeItemList(); |
|
| 31 |
+ |
|
| 32 |
+ void setAddress(unsigned int address); |
|
| 33 |
+ unsigned int getAddress() const; |
|
| 34 |
+ |
|
| 35 |
+ private: |
|
| 36 |
+ QString name; //!< Label name of the code section |
|
| 37 |
+ |
|
| 38 |
+ QList<QSharedPointer<CodeItem>> codeItemList; //!< Instruction list attached to the code section |
|
| 39 |
+ unsigned int address; //!< Address in the memory of the code section |
|
| 40 |
+}; |
|
| 41 |
+ |
|
| 42 |
+#endif |
| 0 | 43 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,743 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "compiler.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor of the compiler |
|
| 16 |
+ * |
|
| 17 |
+ * @param dataList Data list |
|
| 18 |
+ */ |
|
| 19 |
+Compiler::Compiler(DataList &dataList) : dataList(dataList) |
|
| 20 |
+{
|
|
| 21 |
+} |
|
| 22 |
+ |
|
| 23 |
+/** |
|
| 24 |
+ * Add an instruction to the uROM opcode table |
|
| 25 |
+ * |
|
| 26 |
+ * @param instruction Instruction to add |
|
| 27 |
+ */ |
|
| 28 |
+void Compiler::addInstruction(const Instruction &instruction) |
|
| 29 |
+{
|
|
| 30 |
+ this->instructionList.append(instruction); |
|
| 31 |
+} |
|
| 32 |
+ |
|
| 33 |
+/** |
|
| 34 |
+ * Compile the application |
|
| 35 |
+ * |
|
| 36 |
+ * @return Status of compiling the application |
|
| 37 |
+ */ |
|
| 38 |
+bool Compiler::compile() |
|
| 39 |
+{
|
|
| 40 |
+ QTextStream out(stdout); |
|
| 41 |
+ |
|
| 42 |
+ for(const QSharedPointer<Data> &data : this->dataList) |
|
| 43 |
+ {
|
|
| 44 |
+ if(!(this->compileRam(*data))) |
|
| 45 |
+ {
|
|
| 46 |
+ return(false); |
|
| 47 |
+ } |
|
| 48 |
+ |
|
| 49 |
+ if(!(this->compileFlash(*data))) |
|
| 50 |
+ {
|
|
| 51 |
+ return(false); |
|
| 52 |
+ } |
|
| 53 |
+ |
|
| 54 |
+ if(!(this->compileCode(*data))) |
|
| 55 |
+ {
|
|
| 56 |
+ return(false); |
|
| 57 |
+ } |
|
| 58 |
+ } |
|
| 59 |
+ |
|
| 60 |
+ return(true); |
|
| 61 |
+} |
|
| 62 |
+ |
|
| 63 |
+/** |
|
| 64 |
+ * Check the type of the param |
|
| 65 |
+ * |
|
| 66 |
+ * @param param String to check |
|
| 67 |
+ * |
|
| 68 |
+ * @return Param type |
|
| 69 |
+ */ |
|
| 70 |
+QList<Instruction::Arg> Compiler::checkParamType(const QString ¶m) |
|
| 71 |
+{
|
|
| 72 |
+ QList<Instruction::Arg> argList; |
|
| 73 |
+ |
|
| 74 |
+ if(param.contains(QRegularExpression("^(a|b|x|y|A|B|X|Y)$")))
|
|
| 75 |
+ {
|
|
| 76 |
+ argList.append(Instruction::Arg::ABXY); |
|
| 77 |
+ |
|
| 78 |
+ if(param.contains(QRegularExpression("^(a|b|A|B)$")))
|
|
| 79 |
+ {
|
|
| 80 |
+ argList.append(Instruction::Arg::AB); |
|
| 81 |
+ } |
|
| 82 |
+ } |
|
| 83 |
+ else if(param.contains(QRegularExpression("^([0-9]+|0b[01]+|0x[0-9abcdefABCDEF]+|'.')$")))
|
|
| 84 |
+ {
|
|
| 85 |
+ argList.append(Instruction::Arg::Val256); |
|
| 86 |
+ |
|
| 87 |
+ if(param.contains(QRegularExpression("^(0x[0-9abcdefABCDEF]+)$")))
|
|
| 88 |
+ {
|
|
| 89 |
+ argList.append(Instruction::Arg::Addr); |
|
| 90 |
+ } |
|
| 91 |
+ } |
|
| 92 |
+ else if(param.contains(QRegularExpression(R"(^(\.[0-9a-zA-Z_-]+)$)"))) |
|
| 93 |
+ {
|
|
| 94 |
+ argList.append(Instruction::Arg::Addr); |
|
| 95 |
+ } |
|
| 96 |
+ else if(param.contains(QRegularExpression(R"(^(\*[0-9a-zA-Z_-]+)$)"))) |
|
| 97 |
+ {
|
|
| 98 |
+ argList.append(Instruction::Arg::Addr); |
|
| 99 |
+ } |
|
| 100 |
+ else if(param.contains(QRegularExpression(R"(^(\*[0-9a-zA-Z_-]+\[[0-9]+\])$)"))) |
|
| 101 |
+ {
|
|
| 102 |
+ argList.append(Instruction::Arg::Addr); |
|
| 103 |
+ } |
|
| 104 |
+ else if(param.contains(QRegularExpression(R"(^((low|high)\(\.[0-9a-zA-Z_-]+\))$)"))) |
|
| 105 |
+ {
|
|
| 106 |
+ argList.append(Instruction::Arg::Val256); |
|
| 107 |
+ } |
|
| 108 |
+ else if(param.contains(QRegularExpression(R"(^((low|high)\(\*[0-9a-zA-Z_-]+\))$)"))) |
|
| 109 |
+ {
|
|
| 110 |
+ argList.append(Instruction::Arg::Val256); |
|
| 111 |
+ } |
|
| 112 |
+ else if(param.contains(QRegularExpression(R"(^((low|high)\(\*[0-9a-zA-Z_-]+\[[0-9]+\]\))$)"))) |
|
| 113 |
+ {
|
|
| 114 |
+ argList.append(Instruction::Arg::Val256); |
|
| 115 |
+ } |
|
| 116 |
+ |
|
| 117 |
+ return(argList); |
|
| 118 |
+} |
|
| 119 |
+ |
|
| 120 |
+/** |
|
| 121 |
+ * Compile the RAM items |
|
| 122 |
+ * |
|
| 123 |
+ * @param data Data of the parsed application |
|
| 124 |
+ * |
|
| 125 |
+ * @return Status of compiling the RAM items |
|
| 126 |
+ */ |
|
| 127 |
+bool Compiler::compileRam(Data &data) |
|
| 128 |
+{
|
|
| 129 |
+ QTextStream out(stdout); |
|
| 130 |
+ |
|
| 131 |
+ for(const QSharedPointer<RamItem> &ramItem : data.getRamItemList()) |
|
| 132 |
+ {
|
|
| 133 |
+ bool compiled = false; |
|
| 134 |
+ QString arraySize = ramItem->getArraySize(); |
|
| 135 |
+ |
|
| 136 |
+ if(arraySize.length() > 0) |
|
| 137 |
+ {
|
|
| 138 |
+ if(arraySize.contains(QRegularExpression("^([0-9]+)$")))
|
|
| 139 |
+ {
|
|
| 140 |
+ bool isOk; |
|
| 141 |
+ unsigned int size = arraySize.toUInt(&isOk, 10); |
|
| 142 |
+ |
|
| 143 |
+ if(isOk) |
|
| 144 |
+ {
|
|
| 145 |
+ ramItem->setDataSize(size); |
|
| 146 |
+ compiled = true; |
|
| 147 |
+ } |
|
| 148 |
+ } |
|
| 149 |
+ } |
|
| 150 |
+ else |
|
| 151 |
+ {
|
|
| 152 |
+ ramItem->setDataSize(1); |
|
| 153 |
+ compiled = true; |
|
| 154 |
+ } |
|
| 155 |
+ |
|
| 156 |
+ if(!compiled) |
|
| 157 |
+ {
|
|
| 158 |
+ out << QString("ERROR: Syntax error at line %1 in file: \"%2\"\n").arg(ramItem->getLine()).arg(data.getFileName());
|
|
| 159 |
+ return(false); |
|
| 160 |
+ } |
|
| 161 |
+ } |
|
| 162 |
+ |
|
| 163 |
+ return(true); |
|
| 164 |
+} |
|
| 165 |
+ |
|
| 166 |
+/** |
|
| 167 |
+ * Compile the Flash items |
|
| 168 |
+ * |
|
| 169 |
+ * @param data Data of the parsed application |
|
| 170 |
+ * |
|
| 171 |
+ * @return Status of compiling the Flash items |
|
| 172 |
+ */ |
|
| 173 |
+bool Compiler::compileFlash(Data &data) |
|
| 174 |
+{
|
|
| 175 |
+ QTextStream out(stdout); |
|
| 176 |
+ |
|
| 177 |
+ for(const QSharedPointer<FlashItem> &flashItem : data.getFlashItemList()) |
|
| 178 |
+ {
|
|
| 179 |
+ bool compiled = true; |
|
| 180 |
+ bool isString = false; |
|
| 181 |
+ |
|
| 182 |
+ if(flashItem->getValueList().size() == 1) |
|
| 183 |
+ {
|
|
| 184 |
+ QString string = flashItem->getValueList().at(0); |
|
| 185 |
+ |
|
| 186 |
+ if(string.contains(QRegularExpression("^(\".+\")$")))
|
|
| 187 |
+ {
|
|
| 188 |
+ isString = true; |
|
| 189 |
+ |
|
| 190 |
+ for(int j = 1; j < (string.length() - 1); j++) |
|
| 191 |
+ {
|
|
| 192 |
+ char cChar = string.at(j).toLatin1(); |
|
| 193 |
+ |
|
| 194 |
+ if(cChar > 0) |
|
| 195 |
+ {
|
|
| 196 |
+ flashItem->getDataVector().append(static_cast<unsigned char>(cChar)); |
|
| 197 |
+ } |
|
| 198 |
+ else |
|
| 199 |
+ {
|
|
| 200 |
+ compiled = false; |
|
| 201 |
+ break; |
|
| 202 |
+ } |
|
| 203 |
+ } |
|
| 204 |
+ |
|
| 205 |
+ flashItem->getDataVector().append(0x00); |
|
| 206 |
+ } |
|
| 207 |
+ } |
|
| 208 |
+ |
|
| 209 |
+ if(!isString) |
|
| 210 |
+ {
|
|
| 211 |
+ if(!flashItem->getValueList().empty()) |
|
| 212 |
+ {
|
|
| 213 |
+ for(int j = 0; j < flashItem->getValueList().size(); j++) |
|
| 214 |
+ {
|
|
| 215 |
+ unsigned char value; |
|
| 216 |
+ |
|
| 217 |
+ if(this->parseParamVal256(flashItem->getValueList().at(j), value)) |
|
| 218 |
+ {
|
|
| 219 |
+ flashItem->getDataVector().append(value); |
|
| 220 |
+ } |
|
| 221 |
+ else |
|
| 222 |
+ {
|
|
| 223 |
+ compiled = false; |
|
| 224 |
+ break; |
|
| 225 |
+ } |
|
| 226 |
+ } |
|
| 227 |
+ } |
|
| 228 |
+ else |
|
| 229 |
+ {
|
|
| 230 |
+ compiled = false; |
|
| 231 |
+ } |
|
| 232 |
+ } |
|
| 233 |
+ |
|
| 234 |
+ if(!compiled) |
|
| 235 |
+ {
|
|
| 236 |
+ out << QString("ERROR: Syntax error at line %1 in file: \"%2\"\n").arg(flashItem->getLine()).arg(data.getFileName());
|
|
| 237 |
+ return(false); |
|
| 238 |
+ } |
|
| 239 |
+ } |
|
| 240 |
+ |
|
| 241 |
+ return(true); |
|
| 242 |
+} |
|
| 243 |
+ |
|
| 244 |
+/** |
|
| 245 |
+ * Compile the code items |
|
| 246 |
+ * |
|
| 247 |
+ * @param data Data of the parsed application |
|
| 248 |
+ * |
|
| 249 |
+ * @return Status of compiling the code items |
|
| 250 |
+ */ |
|
| 251 |
+bool Compiler::compileCode(Data &data) |
|
| 252 |
+{
|
|
| 253 |
+ QTextStream out(stdout); |
|
| 254 |
+ |
|
| 255 |
+ for(const QSharedPointer<CodeSection> &codeSection : data.getCodeSectionList()) |
|
| 256 |
+ {
|
|
| 257 |
+ for(const QSharedPointer<CodeItem> &codeItem : codeSection->getCodeItemList()) |
|
| 258 |
+ {
|
|
| 259 |
+ bool compiled = false; |
|
| 260 |
+ |
|
| 261 |
+ QVector<QList<Instruction::Arg>> arg(3); |
|
| 262 |
+ |
|
| 263 |
+ if(codeItem->getParamList().length() == 3) |
|
| 264 |
+ {
|
|
| 265 |
+ arg[0].append(this->checkParamType(codeItem->getParamList().at(0))); |
|
| 266 |
+ arg[1].append(this->checkParamType(codeItem->getParamList().at(1))); |
|
| 267 |
+ arg[2].append(this->checkParamType(codeItem->getParamList().at(2))); |
|
| 268 |
+ |
|
| 269 |
+ for(const Instruction &instruction : this->instructionList) |
|
| 270 |
+ {
|
|
| 271 |
+ if(!instruction.getName().compare(codeItem->getName(), Qt::CaseInsensitive)) |
|
| 272 |
+ {
|
|
| 273 |
+ if(arg[0].contains(instruction.getArgList().at(0)) && arg[1].contains(instruction.getArgList().at(1)) && arg[2].contains(instruction.getArgList().at(2))) |
|
| 274 |
+ {
|
|
| 275 |
+ QVector<unsigned char> dataList; |
|
| 276 |
+ QVector<unsigned char> tmp(2); |
|
| 277 |
+ unsigned char opCode = instruction.getOpcode(); |
|
| 278 |
+ bool isOk = true; |
|
| 279 |
+ |
|
| 280 |
+ if(instruction.getArgList().at(0) == Instruction::Arg::AB) |
|
| 281 |
+ {
|
|
| 282 |
+ isOk &= this->parseParamAB(codeItem->getParamList().at(0), tmp[0]); |
|
| 283 |
+ opCode |= (tmp[0] << 2); |
|
| 284 |
+ |
|
| 285 |
+ if(instruction.getArgList().at(1) == Instruction::Arg::ABXY) |
|
| 286 |
+ {
|
|
| 287 |
+ isOk &= this->parseParamABXY(codeItem->getParamList().at(1), tmp[0]); |
|
| 288 |
+ opCode |= tmp[0]; |
|
| 289 |
+ } |
|
| 290 |
+ else |
|
| 291 |
+ {
|
|
| 292 |
+ isOk = false; |
|
| 293 |
+ } |
|
| 294 |
+ } |
|
| 295 |
+ else if(instruction.getArgList().at(1) == Instruction::Arg::ABXY) |
|
| 296 |
+ {
|
|
| 297 |
+ isOk &= this->parseParamABXY(codeItem->getParamList().at(1), tmp[0]); |
|
| 298 |
+ opCode |= tmp[0]; |
|
| 299 |
+ } |
|
| 300 |
+ |
|
| 301 |
+ dataList.append(opCode); |
|
| 302 |
+ |
|
| 303 |
+ if(instruction.getArgList().at(0) == Instruction::Arg::Val256) |
|
| 304 |
+ {
|
|
| 305 |
+ isOk &= this->parseParamVal256(codeItem->getParamList().at(0), tmp[0]); |
|
| 306 |
+ |
|
| 307 |
+ dataList.append(tmp[0]); |
|
| 308 |
+ } |
|
| 309 |
+ |
|
| 310 |
+ if(instruction.getArgList().at(2) == Instruction::Arg::Addr) |
|
| 311 |
+ {
|
|
| 312 |
+ if(isOk && this->isAddrLabel(codeItem->getParamList().at(2))) |
|
| 313 |
+ {
|
|
| 314 |
+ codeItem->getToFillUpHash().insert(codeItem->getParamList().at(2), static_cast<unsigned int>(dataList.size())); |
|
| 315 |
+ } |
|
| 316 |
+ else |
|
| 317 |
+ {
|
|
| 318 |
+ isOk &= this->parseParamAddr(codeItem->getParamList().at(2), tmp[0], tmp[1]); |
|
| 319 |
+ } |
|
| 320 |
+ |
|
| 321 |
+ dataList.append(tmp[0]); |
|
| 322 |
+ dataList.append(tmp[1]); |
|
| 323 |
+ } |
|
| 324 |
+ |
|
| 325 |
+ if(isOk) |
|
| 326 |
+ {
|
|
| 327 |
+ codeItem->getDataVector().append(dataList); |
|
| 328 |
+ compiled = true; |
|
| 329 |
+ } |
|
| 330 |
+ |
|
| 331 |
+ break; |
|
| 332 |
+ } |
|
| 333 |
+ } |
|
| 334 |
+ } |
|
| 335 |
+ } |
|
| 336 |
+ else if(codeItem->getParamList().length() == 2) |
|
| 337 |
+ {
|
|
| 338 |
+ arg[0].append(this->checkParamType(codeItem->getParamList().at(0))); |
|
| 339 |
+ arg[1].append(this->checkParamType(codeItem->getParamList().at(1))); |
|
| 340 |
+ |
|
| 341 |
+ for(const Instruction &instruction : this->instructionList) |
|
| 342 |
+ {
|
|
| 343 |
+ if(!instruction.getName().compare(codeItem->getName(), Qt::CaseInsensitive)) |
|
| 344 |
+ {
|
|
| 345 |
+ if(arg[0].contains(instruction.getArgList().at(0)) && arg[1].contains(instruction.getArgList().at(1)) && (instruction.getArgList().at(2) == Instruction::Arg::None)) |
|
| 346 |
+ {
|
|
| 347 |
+ QVector<unsigned char> dataList; |
|
| 348 |
+ QVector<unsigned char> tmp(2); |
|
| 349 |
+ unsigned char opCode = instruction.getOpcode(); |
|
| 350 |
+ bool isOk = true; |
|
| 351 |
+ |
|
| 352 |
+ if(instruction.getArgList().at(0) == Instruction::Arg::AB) |
|
| 353 |
+ {
|
|
| 354 |
+ isOk &= this->parseParamAB(codeItem->getParamList().at(0), tmp[0]); |
|
| 355 |
+ opCode |= (tmp[0] << 2); |
|
| 356 |
+ |
|
| 357 |
+ if(instruction.getArgList().at(1) == Instruction::Arg::ABXY) |
|
| 358 |
+ {
|
|
| 359 |
+ isOk &= this->parseParamABXY(codeItem->getParamList().at(1), tmp[0]); |
|
| 360 |
+ opCode |= tmp[0]; |
|
| 361 |
+ } |
|
| 362 |
+ else |
|
| 363 |
+ {
|
|
| 364 |
+ isOk = false; |
|
| 365 |
+ } |
|
| 366 |
+ } |
|
| 367 |
+ else if(instruction.getArgList().at(0) == Instruction::Arg::ABXY) |
|
| 368 |
+ {
|
|
| 369 |
+ isOk &= this->parseParamABXY(codeItem->getParamList().at(0), tmp[0]); |
|
| 370 |
+ |
|
| 371 |
+ if(instruction.getArgList().at(1) == Instruction::Arg::ABXY) |
|
| 372 |
+ {
|
|
| 373 |
+ isOk &= this->parseParamABXY(codeItem->getParamList().at(1), tmp[1]); |
|
| 374 |
+ opCode |= ((tmp[0] << 2) | tmp[1]); |
|
| 375 |
+ } |
|
| 376 |
+ else |
|
| 377 |
+ {
|
|
| 378 |
+ opCode |= tmp[0]; |
|
| 379 |
+ } |
|
| 380 |
+ } |
|
| 381 |
+ else if(instruction.getArgList().at(1) == Instruction::Arg::ABXY) |
|
| 382 |
+ {
|
|
| 383 |
+ isOk &= this->parseParamABXY(codeItem->getParamList().at(1), tmp[0]); |
|
| 384 |
+ opCode |= tmp[0]; |
|
| 385 |
+ } |
|
| 386 |
+ |
|
| 387 |
+ dataList.append(opCode); |
|
| 388 |
+ |
|
| 389 |
+ if(instruction.getArgList().at(0) == Instruction::Arg::Val256) |
|
| 390 |
+ {
|
|
| 391 |
+ if(isOk && this->isAddrPartLabel(codeItem->getParamList().at(0))) |
|
| 392 |
+ {
|
|
| 393 |
+ codeItem->getToFillUpHash().insert(codeItem->getParamList().at(0), static_cast<unsigned int>(dataList.size())); |
|
| 394 |
+ } |
|
| 395 |
+ else |
|
| 396 |
+ {
|
|
| 397 |
+ isOk &= this->parseParamVal256(codeItem->getParamList().at(0), tmp[0]); |
|
| 398 |
+ } |
|
| 399 |
+ |
|
| 400 |
+ dataList.append(tmp[0]); |
|
| 401 |
+ |
|
| 402 |
+ } |
|
| 403 |
+ else if(instruction.getArgList().at(0) == Instruction::Arg::Addr) |
|
| 404 |
+ {
|
|
| 405 |
+ if(isOk && this->isAddrLabel(codeItem->getParamList().at(0))) |
|
| 406 |
+ {
|
|
| 407 |
+ codeItem->getToFillUpHash().insert(codeItem->getParamList().at(0), static_cast<unsigned int>(dataList.size())); |
|
| 408 |
+ } |
|
| 409 |
+ else |
|
| 410 |
+ {
|
|
| 411 |
+ isOk &= this->parseParamAddr(codeItem->getParamList().at(0), tmp[0], tmp[1]); |
|
| 412 |
+ } |
|
| 413 |
+ |
|
| 414 |
+ dataList.append(tmp[0]); |
|
| 415 |
+ dataList.append(tmp[1]); |
|
| 416 |
+ } |
|
| 417 |
+ |
|
| 418 |
+ if(instruction.getArgList().at(1) == Instruction::Arg::Addr) |
|
| 419 |
+ {
|
|
| 420 |
+ if(isOk && this->isAddrLabel(codeItem->getParamList().at(1))) |
|
| 421 |
+ {
|
|
| 422 |
+ codeItem->getToFillUpHash().insert(codeItem->getParamList().at(1), static_cast<unsigned int>(dataList.size())); |
|
| 423 |
+ } |
|
| 424 |
+ else |
|
| 425 |
+ {
|
|
| 426 |
+ isOk &= this->parseParamAddr(codeItem->getParamList().at(1), tmp[0], tmp[1]); |
|
| 427 |
+ } |
|
| 428 |
+ |
|
| 429 |
+ dataList.append(tmp[0]); |
|
| 430 |
+ dataList.append(tmp[1]); |
|
| 431 |
+ } |
|
| 432 |
+ if(isOk) |
|
| 433 |
+ {
|
|
| 434 |
+ if(instruction.getOpcodeSecond() != 0) |
|
| 435 |
+ {
|
|
| 436 |
+ opCode = instruction.getOpcodeSecond(); |
|
| 437 |
+ |
|
| 438 |
+ if(instruction.getArgSecondList().at(0) == Instruction::Arg::ABXY) |
|
| 439 |
+ {
|
|
| 440 |
+ isOk &= this->parseParamABXY(codeItem->getParamList().at(0), tmp[0]); |
|
| 441 |
+ opCode |= tmp[0]; |
|
| 442 |
+ } |
|
| 443 |
+ |
|
| 444 |
+ dataList.append(opCode); |
|
| 445 |
+ } |
|
| 446 |
+ |
|
| 447 |
+ if(isOk) |
|
| 448 |
+ {
|
|
| 449 |
+ codeItem->getDataVector().append(dataList); |
|
| 450 |
+ compiled = true; |
|
| 451 |
+ } |
|
| 452 |
+ } |
|
| 453 |
+ |
|
| 454 |
+ break; |
|
| 455 |
+ } |
|
| 456 |
+ } |
|
| 457 |
+ } |
|
| 458 |
+ } |
|
| 459 |
+ else if(codeItem->getParamList().length() == 1) |
|
| 460 |
+ {
|
|
| 461 |
+ arg[0].append(this->checkParamType(codeItem->getParamList().at(0))); |
|
| 462 |
+ |
|
| 463 |
+ for(const Instruction &instruction : this->instructionList) |
|
| 464 |
+ {
|
|
| 465 |
+ if(!instruction.getName().compare(codeItem->getName(), Qt::CaseInsensitive)) |
|
| 466 |
+ {
|
|
| 467 |
+ if(arg[0].contains(instruction.getArgList().at(0)) && (instruction.getArgList().at(1) == Instruction::Arg::None) && (instruction.getArgList().at(2) == Instruction::Arg::None)) |
|
| 468 |
+ {
|
|
| 469 |
+ QVector<unsigned char> dataList; |
|
| 470 |
+ QVector<unsigned char> tmp(2); |
|
| 471 |
+ unsigned char opCode = instruction.getOpcode(); |
|
| 472 |
+ bool isOk = true; |
|
| 473 |
+ |
|
| 474 |
+ if(instruction.getArgList().at(0) == Instruction::Arg::ABXY) |
|
| 475 |
+ {
|
|
| 476 |
+ isOk &= this->parseParamABXY(codeItem->getParamList().at(0), tmp[0]); |
|
| 477 |
+ opCode |= tmp[0]; |
|
| 478 |
+ } |
|
| 479 |
+ |
|
| 480 |
+ dataList.append(opCode); |
|
| 481 |
+ |
|
| 482 |
+ if(instruction.getArgList().at(0) == Instruction::Arg::Val256) |
|
| 483 |
+ {
|
|
| 484 |
+ if(isOk && this->isAddrPartLabel(codeItem->getParamList().at(0))) |
|
| 485 |
+ {
|
|
| 486 |
+ codeItem->getToFillUpHash().insert(codeItem->getParamList().at(0), static_cast<unsigned int>(dataList.size())); |
|
| 487 |
+ } |
|
| 488 |
+ else |
|
| 489 |
+ {
|
|
| 490 |
+ isOk &= this->parseParamVal256(codeItem->getParamList().at(0), tmp[0]); |
|
| 491 |
+ } |
|
| 492 |
+ |
|
| 493 |
+ dataList.append(tmp[0]); |
|
| 494 |
+ } |
|
| 495 |
+ else if(instruction.getArgList().at(0) == Instruction::Arg::Addr) |
|
| 496 |
+ {
|
|
| 497 |
+ if(isOk && this->isAddrLabel(codeItem->getParamList().at(0))) |
|
| 498 |
+ {
|
|
| 499 |
+ codeItem->getToFillUpHash().insert(codeItem->getParamList().at(0), static_cast<unsigned int>(dataList.size())); |
|
| 500 |
+ } |
|
| 501 |
+ else |
|
| 502 |
+ {
|
|
| 503 |
+ isOk &= this->parseParamAddr(codeItem->getParamList().at(0), tmp[0], tmp[1]); |
|
| 504 |
+ } |
|
| 505 |
+ |
|
| 506 |
+ dataList.append(tmp[0]); |
|
| 507 |
+ dataList.append(tmp[1]); |
|
| 508 |
+ } |
|
| 509 |
+ |
|
| 510 |
+ if(isOk) |
|
| 511 |
+ {
|
|
| 512 |
+ codeItem->getDataVector().append(dataList); |
|
| 513 |
+ compiled = true; |
|
| 514 |
+ } |
|
| 515 |
+ |
|
| 516 |
+ break; |
|
| 517 |
+ } |
|
| 518 |
+ } |
|
| 519 |
+ } |
|
| 520 |
+ } |
|
| 521 |
+ else |
|
| 522 |
+ {
|
|
| 523 |
+ for(const Instruction &instruction : this->instructionList) |
|
| 524 |
+ {
|
|
| 525 |
+ if(!instruction.getName().compare(codeItem->getName(), Qt::CaseInsensitive)) |
|
| 526 |
+ {
|
|
| 527 |
+ if((instruction.getArgList().at(0) == Instruction::Arg::None) && (instruction.getArgList().at(1) == Instruction::Arg::None) && (instruction.getArgList().at(2) == Instruction::Arg::None)) |
|
| 528 |
+ {
|
|
| 529 |
+ codeItem->getDataVector().append(instruction.getOpcode()); |
|
| 530 |
+ compiled = true; |
|
| 531 |
+ |
|
| 532 |
+ break; |
|
| 533 |
+ } |
|
| 534 |
+ } |
|
| 535 |
+ } |
|
| 536 |
+ } |
|
| 537 |
+ |
|
| 538 |
+ if(!compiled) |
|
| 539 |
+ {
|
|
| 540 |
+ out << QString("ERROR: Syntax error at line %1 in file: \"%2\"\n").arg(codeItem->getLine()).arg(data.getFileName());
|
|
| 541 |
+ return(false); |
|
| 542 |
+ } |
|
| 543 |
+ } |
|
| 544 |
+ } |
|
| 545 |
+ |
|
| 546 |
+ return(true); |
|
| 547 |
+} |
|
| 548 |
+ |
|
| 549 |
+/** |
|
| 550 |
+ * Parse the string and return AB |
|
| 551 |
+ * |
|
| 552 |
+ * @param param String to parsing |
|
| 553 |
+ * @param value Parsed value |
|
| 554 |
+ * |
|
| 555 |
+ * @return Status of parsing the string |
|
| 556 |
+ */ |
|
| 557 |
+bool Compiler::parseParamAB(const QString ¶m, unsigned char &value) |
|
| 558 |
+{
|
|
| 559 |
+ if(!param.compare("a", Qt::CaseInsensitive))
|
|
| 560 |
+ {
|
|
| 561 |
+ value = 0; |
|
| 562 |
+ } |
|
| 563 |
+ else if(!param.compare("b", Qt::CaseInsensitive))
|
|
| 564 |
+ {
|
|
| 565 |
+ value = 1; |
|
| 566 |
+ } |
|
| 567 |
+ else |
|
| 568 |
+ {
|
|
| 569 |
+ return(false); |
|
| 570 |
+ } |
|
| 571 |
+ |
|
| 572 |
+ return(true); |
|
| 573 |
+} |
|
| 574 |
+ |
|
| 575 |
+/** |
|
| 576 |
+ * Parse the string and return ABXY |
|
| 577 |
+ * |
|
| 578 |
+ * @param param String to parsing |
|
| 579 |
+ * @param value Parsed value |
|
| 580 |
+ * |
|
| 581 |
+ * @return Status of parsing the string |
|
| 582 |
+ */ |
|
| 583 |
+bool Compiler::parseParamABXY(const QString ¶m, unsigned char &value) |
|
| 584 |
+{
|
|
| 585 |
+ if(!param.compare("a", Qt::CaseInsensitive))
|
|
| 586 |
+ {
|
|
| 587 |
+ value = 0; |
|
| 588 |
+ } |
|
| 589 |
+ else if(!param.compare("b", Qt::CaseInsensitive))
|
|
| 590 |
+ {
|
|
| 591 |
+ value = 1; |
|
| 592 |
+ } |
|
| 593 |
+ else if(!param.compare("x", Qt::CaseInsensitive))
|
|
| 594 |
+ {
|
|
| 595 |
+ value = 2; |
|
| 596 |
+ } |
|
| 597 |
+ else if(!param.compare("y", Qt::CaseInsensitive))
|
|
| 598 |
+ {
|
|
| 599 |
+ value = 3; |
|
| 600 |
+ } |
|
| 601 |
+ else |
|
| 602 |
+ {
|
|
| 603 |
+ return(false); |
|
| 604 |
+ } |
|
| 605 |
+ |
|
| 606 |
+ return(true); |
|
| 607 |
+} |
|
| 608 |
+ |
|
| 609 |
+/** |
|
| 610 |
+ * Parse the string and return Val256 |
|
| 611 |
+ * |
|
| 612 |
+ * @param param String to parsing |
|
| 613 |
+ * @param value Parsed value |
|
| 614 |
+ * |
|
| 615 |
+ * @return Status of parsing the string |
|
| 616 |
+ */ |
|
| 617 |
+bool Compiler::parseParamVal256(const QString ¶m, unsigned char &value) |
|
| 618 |
+{
|
|
| 619 |
+ bool isOk = false; |
|
| 620 |
+ unsigned int number = 0; |
|
| 621 |
+ |
|
| 622 |
+ if(param.contains(QRegularExpression("^([0-9]+)$")))
|
|
| 623 |
+ {
|
|
| 624 |
+ number = param.toUInt(&isOk, 10); |
|
| 625 |
+ } |
|
| 626 |
+ else if(param.contains(QRegularExpression("^(0b[01]+)$")))
|
|
| 627 |
+ {
|
|
| 628 |
+ number = param.midRef(2).toUInt(&isOk, 2); |
|
| 629 |
+ } |
|
| 630 |
+ else if(param.contains(QRegularExpression("^(0x[0-9abcdefABCDEF]+)$")))
|
|
| 631 |
+ {
|
|
| 632 |
+ number = param.midRef(2).toUInt(&isOk, 16); |
|
| 633 |
+ } |
|
| 634 |
+ else if(param.contains(QRegularExpression("^('.')$")))
|
|
| 635 |
+ {
|
|
| 636 |
+ char cChar = param.at(1).toLatin1(); |
|
| 637 |
+ |
|
| 638 |
+ if(cChar > 0) |
|
| 639 |
+ {
|
|
| 640 |
+ number = static_cast<unsigned int>(cChar); |
|
| 641 |
+ isOk = true; |
|
| 642 |
+ } |
|
| 643 |
+ } |
|
| 644 |
+ |
|
| 645 |
+ if(isOk) |
|
| 646 |
+ {
|
|
| 647 |
+ if(number < 256) |
|
| 648 |
+ {
|
|
| 649 |
+ value = static_cast<unsigned char>(number); |
|
| 650 |
+ } |
|
| 651 |
+ else |
|
| 652 |
+ {
|
|
| 653 |
+ isOk = false; |
|
| 654 |
+ } |
|
| 655 |
+ } |
|
| 656 |
+ |
|
| 657 |
+ return(isOk); |
|
| 658 |
+} |
|
| 659 |
+ |
|
| 660 |
+/** |
|
| 661 |
+ * Parse the string and return address |
|
| 662 |
+ * |
|
| 663 |
+ * @param param String to parsing |
|
| 664 |
+ * @param valueLow Parsed lower byte of the value |
|
| 665 |
+ * @param valueHigh Parsed higher byte of the value |
|
| 666 |
+ * |
|
| 667 |
+ * @return Status of parsing the string |
|
| 668 |
+ */ |
|
| 669 |
+bool Compiler::parseParamAddr(const QString ¶m, unsigned char &valueLow, unsigned char &valueHigh) |
|
| 670 |
+{
|
|
| 671 |
+ bool isOk = false; |
|
| 672 |
+ unsigned int number = 0; |
|
| 673 |
+ |
|
| 674 |
+ if(param.contains(QRegularExpression("^(0x[0-9abcdefABCDEF]+)$")))
|
|
| 675 |
+ {
|
|
| 676 |
+ number = param.midRef(2).toUInt(&isOk, 16); |
|
| 677 |
+ } |
|
| 678 |
+ |
|
| 679 |
+ if(isOk) |
|
| 680 |
+ {
|
|
| 681 |
+ if(number < Data::MEMORY_SIZE) |
|
| 682 |
+ {
|
|
| 683 |
+ valueLow = static_cast<unsigned char>(number % 256); |
|
| 684 |
+ valueHigh = static_cast<unsigned char>(number / 256); |
|
| 685 |
+ } |
|
| 686 |
+ else |
|
| 687 |
+ {
|
|
| 688 |
+ isOk = false; |
|
| 689 |
+ } |
|
| 690 |
+ } |
|
| 691 |
+ |
|
| 692 |
+ return(isOk); |
|
| 693 |
+} |
|
| 694 |
+ |
|
| 695 |
+/** |
|
| 696 |
+ * Check if the param is an address label |
|
| 697 |
+ * |
|
| 698 |
+ * @param param String to check |
|
| 699 |
+ * |
|
| 700 |
+ * @return Status of the check |
|
| 701 |
+ */ |
|
| 702 |
+bool Compiler::isAddrLabel(const QString ¶m) const |
|
| 703 |
+{
|
|
| 704 |
+ if(param.contains(QRegularExpression(R"(^(\.[0-9a-zA-Z_-]+)$)"))) |
|
| 705 |
+ {
|
|
| 706 |
+ return(true); |
|
| 707 |
+ } |
|
| 708 |
+ else if(param.contains(QRegularExpression(R"(^(\*[0-9a-zA-Z_-]+)$)"))) |
|
| 709 |
+ {
|
|
| 710 |
+ return(true); |
|
| 711 |
+ } |
|
| 712 |
+ else if(param.contains(QRegularExpression(R"(^(\*[0-9a-zA-Z_-]+\[[0-9]+\])$)"))) |
|
| 713 |
+ {
|
|
| 714 |
+ return(true); |
|
| 715 |
+ } |
|
| 716 |
+ |
|
| 717 |
+ return(false); |
|
| 718 |
+} |
|
| 719 |
+ |
|
| 720 |
+/** |
|
| 721 |
+ * Check if the param is a low or high address |
|
| 722 |
+ * |
|
| 723 |
+ * @param param String to check |
|
| 724 |
+ * |
|
| 725 |
+ * @return Status of the check |
|
| 726 |
+ */ |
|
| 727 |
+bool Compiler::isAddrPartLabel(const QString ¶m) const |
|
| 728 |
+{
|
|
| 729 |
+ if(param.contains(QRegularExpression(R"(^((low|high)\(\.[0-9a-zA-Z_-]+\))$)"))) |
|
| 730 |
+ {
|
|
| 731 |
+ return(true); |
|
| 732 |
+ } |
|
| 733 |
+ else if(param.contains(QRegularExpression(R"(^((low|high)\(\*[0-9a-zA-Z_-]+\))$)"))) |
|
| 734 |
+ {
|
|
| 735 |
+ return(true); |
|
| 736 |
+ } |
|
| 737 |
+ else if(param.contains(QRegularExpression(R"(^((low|high)\(\*[0-9a-zA-Z_-]+\[[0-9]+\]\))$)"))) |
|
| 738 |
+ {
|
|
| 739 |
+ return(true); |
|
| 740 |
+ } |
|
| 741 |
+ |
|
| 742 |
+ return(false); |
|
| 743 |
+} |
| 0 | 744 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,57 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef COMPILER_H |
|
| 13 |
+#define COMPILER_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+#include <QTextStream> |
|
| 17 |
+#include <QList> |
|
| 18 |
+#include <QRegularExpression> |
|
| 19 |
+#include <QVector> |
|
| 20 |
+ |
|
| 21 |
+#include "instruction.h" |
|
| 22 |
+#include "codeitem.h" |
|
| 23 |
+#include "codesection.h" |
|
| 24 |
+#include "ramitem.h" |
|
| 25 |
+#include "flashitem.h" |
|
| 26 |
+#include "data.h" |
|
| 27 |
+#include "datalist.h" |
|
| 28 |
+ |
|
| 29 |
+//! This class transforms a parsed code to the binary executable form |
|
| 30 |
+class Compiler |
|
| 31 |
+{
|
|
| 32 |
+ public: |
|
| 33 |
+ Compiler(DataList &dataList); |
|
| 34 |
+ |
|
| 35 |
+ void addInstruction(const Instruction &instruction); |
|
| 36 |
+ bool compile(); |
|
| 37 |
+ |
|
| 38 |
+ private: |
|
| 39 |
+ QList<Instruction::Arg> checkParamType(const QString ¶m); |
|
| 40 |
+ |
|
| 41 |
+ bool compileRam(Data &data); |
|
| 42 |
+ bool compileFlash(Data &data); |
|
| 43 |
+ bool compileCode(Data &data); |
|
| 44 |
+ |
|
| 45 |
+ bool parseParamAB(const QString ¶m, unsigned char &value); |
|
| 46 |
+ bool parseParamABXY(const QString ¶m, unsigned char &value); |
|
| 47 |
+ bool parseParamVal256(const QString ¶m, unsigned char &value); |
|
| 48 |
+ bool parseParamAddr(const QString ¶m, unsigned char &valueLow, unsigned char &valueHigh); |
|
| 49 |
+ |
|
| 50 |
+ bool isAddrLabel(const QString ¶m) const; |
|
| 51 |
+ bool isAddrPartLabel(const QString ¶m) const; |
|
| 52 |
+ |
|
| 53 |
+ DataList &dataList; //!< List of data for each source file |
|
| 54 |
+ QList<Instruction> instructionList; //!< List of instructions supported by the CPU |
|
| 55 |
+}; |
|
| 56 |
+ |
|
| 57 |
+#endif |
| 0 | 58 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,144 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "data.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor for creating a data |
|
| 16 |
+ * |
|
| 17 |
+ * @param fileName Name of the source file |
|
| 18 |
+ */ |
|
| 19 |
+Data::Data(const QString &fileName) |
|
| 20 |
+{
|
|
| 21 |
+ this->fileName = fileName; |
|
| 22 |
+} |
|
| 23 |
+ |
|
| 24 |
+/** |
|
| 25 |
+ * Get the source file name |
|
| 26 |
+ * |
|
| 27 |
+ * @return Source file name |
|
| 28 |
+ */ |
|
| 29 |
+const QString &Data::getFileName() const |
|
| 30 |
+{
|
|
| 31 |
+ return(this->fileName); |
|
| 32 |
+} |
|
| 33 |
+ |
|
| 34 |
+/** |
|
| 35 |
+ * Add a code section to the data |
|
| 36 |
+ * |
|
| 37 |
+ * @param codeSection Code section |
|
| 38 |
+ * |
|
| 39 |
+ * @return Status of adding the item |
|
| 40 |
+ */ |
|
| 41 |
+bool Data::addCodeSection(const QSharedPointer<CodeSection> &codeSection) |
|
| 42 |
+{
|
|
| 43 |
+ for(const QSharedPointer<CodeSection> &codeSectionFor : this->codeSectionList) |
|
| 44 |
+ {
|
|
| 45 |
+ if(!codeSectionFor->getName().compare(codeSection->getName(), Qt::CaseInsensitive)) |
|
| 46 |
+ {
|
|
| 47 |
+ return(false); |
|
| 48 |
+ } |
|
| 49 |
+ } |
|
| 50 |
+ |
|
| 51 |
+ this->codeSectionList.append(codeSection); |
|
| 52 |
+ |
|
| 53 |
+ return(true); |
|
| 54 |
+} |
|
| 55 |
+ |
|
| 56 |
+/** |
|
| 57 |
+ * Add a RAM item to the data |
|
| 58 |
+ * |
|
| 59 |
+ * @param ramItem RAM item |
|
| 60 |
+ * |
|
| 61 |
+ * @return Status of adding the item |
|
| 62 |
+ */ |
|
| 63 |
+bool Data::addRamItem(const QSharedPointer<RamItem> &ramItem) |
|
| 64 |
+{
|
|
| 65 |
+ for(const QSharedPointer<RamItem> &ramItemFor : this->ramItemList) |
|
| 66 |
+ {
|
|
| 67 |
+ if(!ramItemFor->getName().compare(ramItem->getName(), Qt::CaseInsensitive)) |
|
| 68 |
+ {
|
|
| 69 |
+ return(false); |
|
| 70 |
+ } |
|
| 71 |
+ } |
|
| 72 |
+ |
|
| 73 |
+ for(const QSharedPointer<FlashItem> &flashItemFor : this->flashItemList) |
|
| 74 |
+ {
|
|
| 75 |
+ if(!flashItemFor->getName().compare(ramItem->getName(), Qt::CaseInsensitive)) |
|
| 76 |
+ {
|
|
| 77 |
+ return(false); |
|
| 78 |
+ } |
|
| 79 |
+ } |
|
| 80 |
+ |
|
| 81 |
+ this->ramItemList.append(ramItem); |
|
| 82 |
+ |
|
| 83 |
+ return(true); |
|
| 84 |
+} |
|
| 85 |
+ |
|
| 86 |
+/** |
|
| 87 |
+ * Add a Flash item to the data |
|
| 88 |
+ * |
|
| 89 |
+ * @param flashItem Flash item |
|
| 90 |
+ * |
|
| 91 |
+ * @return Status of adding the item |
|
| 92 |
+ */ |
|
| 93 |
+bool Data::addFlashItem(const QSharedPointer<FlashItem> &flashItem) |
|
| 94 |
+{
|
|
| 95 |
+ for(const QSharedPointer<FlashItem> &flashItemFor : this->flashItemList) |
|
| 96 |
+ {
|
|
| 97 |
+ if(!flashItemFor->getName().compare(flashItem->getName(), Qt::CaseInsensitive)) |
|
| 98 |
+ {
|
|
| 99 |
+ return(false); |
|
| 100 |
+ } |
|
| 101 |
+ } |
|
| 102 |
+ |
|
| 103 |
+ for(const QSharedPointer<RamItem> &ramItemFor : this->ramItemList) |
|
| 104 |
+ {
|
|
| 105 |
+ if(!ramItemFor->getName().compare(flashItem->getName(), Qt::CaseInsensitive)) |
|
| 106 |
+ {
|
|
| 107 |
+ return(false); |
|
| 108 |
+ } |
|
| 109 |
+ } |
|
| 110 |
+ |
|
| 111 |
+ this->flashItemList.append(flashItem); |
|
| 112 |
+ |
|
| 113 |
+ return(true); |
|
| 114 |
+} |
|
| 115 |
+ |
|
| 116 |
+/** |
|
| 117 |
+ * Get the code section list |
|
| 118 |
+ * |
|
| 119 |
+ * @return Code section list |
|
| 120 |
+ */ |
|
| 121 |
+QList<QSharedPointer<CodeSection>> &Data::getCodeSectionList() |
|
| 122 |
+{
|
|
| 123 |
+ return(this->codeSectionList); |
|
| 124 |
+} |
|
| 125 |
+ |
|
| 126 |
+/** |
|
| 127 |
+ * Get the RAM item list |
|
| 128 |
+ * |
|
| 129 |
+ * @return RAM item list |
|
| 130 |
+ */ |
|
| 131 |
+QList<QSharedPointer<RamItem>> &Data::getRamItemList() |
|
| 132 |
+{
|
|
| 133 |
+ return(this->ramItemList); |
|
| 134 |
+} |
|
| 135 |
+ |
|
| 136 |
+/** |
|
| 137 |
+ * Get the Flash item list |
|
| 138 |
+ * |
|
| 139 |
+ * @return Flash item list |
|
| 140 |
+ */ |
|
| 141 |
+QList<QSharedPointer<FlashItem>> &Data::getFlashItemList() |
|
| 142 |
+{
|
|
| 143 |
+ return(this->flashItemList); |
|
| 144 |
+} |
| 0 | 145 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,49 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef DATA_H |
|
| 13 |
+#define DATA_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+#include <QList> |
|
| 17 |
+#include <QSharedPointer> |
|
| 18 |
+ |
|
| 19 |
+#include "codesection.h" |
|
| 20 |
+#include "ramitem.h" |
|
| 21 |
+#include "flashitem.h" |
|
| 22 |
+ |
|
| 23 |
+//! This class contains all parsed sections of code, RAM and Flash for one source file |
|
| 24 |
+class Data |
|
| 25 |
+{
|
|
| 26 |
+ public: |
|
| 27 |
+ static const int MEMORY_SIZE = 65536; //!< Maximum size of memory |
|
| 28 |
+ |
|
| 29 |
+ Data(const QString &fileName); |
|
| 30 |
+ |
|
| 31 |
+ const QString &getFileName() const; |
|
| 32 |
+ |
|
| 33 |
+ bool addCodeSection(const QSharedPointer<CodeSection> &codeSection); |
|
| 34 |
+ bool addRamItem(const QSharedPointer<RamItem> &ramItem); |
|
| 35 |
+ bool addFlashItem(const QSharedPointer<FlashItem> &flashItem); |
|
| 36 |
+ |
|
| 37 |
+ QList<QSharedPointer<CodeSection>> &getCodeSectionList(); |
|
| 38 |
+ QList<QSharedPointer<RamItem>> &getRamItemList(); |
|
| 39 |
+ QList<QSharedPointer<FlashItem>> &getFlashItemList(); |
|
| 40 |
+ |
|
| 41 |
+ private: |
|
| 42 |
+ QString fileName; //!< Name of the source file |
|
| 43 |
+ |
|
| 44 |
+ QList<QSharedPointer<CodeSection>> codeSectionList; //!< List of code sections |
|
| 45 |
+ QList<QSharedPointer<RamItem>> ramItemList; //!< List of RAM items |
|
| 46 |
+ QList<QSharedPointer<FlashItem>> flashItemList; //!< List of Flash items |
|
| 47 |
+}; |
|
| 48 |
+ |
|
| 49 |
+#endif |
| 0 | 50 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,231 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "datalist.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor for creating a data list |
|
| 16 |
+ * |
|
| 17 |
+ * @param mode Mode selection for how the application should be compiled and where in memory it will reside |
|
| 18 |
+ */ |
|
| 19 |
+DataList::DataList(DataList::Mode mode) |
|
| 20 |
+{
|
|
| 21 |
+ this->mode = mode; |
|
| 22 |
+} |
|
| 23 |
+ |
|
| 24 |
+/** |
|
| 25 |
+ * Get the mode |
|
| 26 |
+ * |
|
| 27 |
+ * @return Mode |
|
| 28 |
+ */ |
|
| 29 |
+DataList::Mode DataList::getMode() const |
|
| 30 |
+{
|
|
| 31 |
+ return(this->mode); |
|
| 32 |
+} |
|
| 33 |
+ |
|
| 34 |
+/** |
|
| 35 |
+ * Add an external code section to the data list |
|
| 36 |
+ * |
|
| 37 |
+ * @param codeSection External code section |
|
| 38 |
+ * |
|
| 39 |
+ * @return Status of adding the item |
|
| 40 |
+ */ |
|
| 41 |
+bool DataList::addExternalCodeSection(const QSharedPointer<CodeSection> &codeSection) |
|
| 42 |
+{
|
|
| 43 |
+ if(this->addGlobalCodeSection(codeSection)) |
|
| 44 |
+ {
|
|
| 45 |
+ this->externalCodeSectionList.append(codeSection); |
|
| 46 |
+ |
|
| 47 |
+ return(true); |
|
| 48 |
+ } |
|
| 49 |
+ |
|
| 50 |
+ return(false); |
|
| 51 |
+} |
|
| 52 |
+ |
|
| 53 |
+/** |
|
| 54 |
+ * Add an external RAM item to the data list |
|
| 55 |
+ * |
|
| 56 |
+ * @param ramItem External RAM item |
|
| 57 |
+ * |
|
| 58 |
+ * @return Status of adding the item |
|
| 59 |
+ */ |
|
| 60 |
+bool DataList::addExternalRamItem(const QSharedPointer<RamItem> &ramItem) |
|
| 61 |
+{
|
|
| 62 |
+ if(this->addGlobalRamItem(ramItem)) |
|
| 63 |
+ {
|
|
| 64 |
+ this->externalRamItemList.append(ramItem); |
|
| 65 |
+ |
|
| 66 |
+ return(true); |
|
| 67 |
+ } |
|
| 68 |
+ |
|
| 69 |
+ return(false); |
|
| 70 |
+} |
|
| 71 |
+ |
|
| 72 |
+/** |
|
| 73 |
+ * Add an external Flash item to the data list |
|
| 74 |
+ * |
|
| 75 |
+ * @param flashItem External Flash item |
|
| 76 |
+ * |
|
| 77 |
+ * @return Status of adding the item |
|
| 78 |
+ */ |
|
| 79 |
+bool DataList::addExternalFlashItem(const QSharedPointer<FlashItem> &flashItem) |
|
| 80 |
+{
|
|
| 81 |
+ if(this->addGlobalFlashItem(flashItem)) |
|
| 82 |
+ {
|
|
| 83 |
+ this->externalFlashItemList.append(flashItem); |
|
| 84 |
+ |
|
| 85 |
+ return(true); |
|
| 86 |
+ } |
|
| 87 |
+ |
|
| 88 |
+ return(false); |
|
| 89 |
+} |
|
| 90 |
+ |
|
| 91 |
+/** |
|
| 92 |
+ * Add a global code section to the data list |
|
| 93 |
+ * |
|
| 94 |
+ * @param codeSection Global code section |
|
| 95 |
+ * |
|
| 96 |
+ * @return Status of adding the item |
|
| 97 |
+ */ |
|
| 98 |
+bool DataList::addGlobalCodeSection(const QSharedPointer<CodeSection> &codeSection) |
|
| 99 |
+{
|
|
| 100 |
+ for(const QSharedPointer<CodeSection> &codeSectionFor : this->globalCodeSectionList) |
|
| 101 |
+ {
|
|
| 102 |
+ if(!codeSectionFor->getName().compare(codeSection->getName(), Qt::CaseInsensitive)) |
|
| 103 |
+ {
|
|
| 104 |
+ return(false); |
|
| 105 |
+ } |
|
| 106 |
+ } |
|
| 107 |
+ |
|
| 108 |
+ this->globalCodeSectionList.append(codeSection); |
|
| 109 |
+ |
|
| 110 |
+ return(true); |
|
| 111 |
+} |
|
| 112 |
+ |
|
| 113 |
+/** |
|
| 114 |
+ * Add a global RAM item to the data list |
|
| 115 |
+ * |
|
| 116 |
+ * @param ramItem Global RAM item |
|
| 117 |
+ * |
|
| 118 |
+ * @return Status of adding the item |
|
| 119 |
+ */ |
|
| 120 |
+bool DataList::addGlobalRamItem(const QSharedPointer<RamItem> &ramItem) |
|
| 121 |
+{
|
|
| 122 |
+ for(const QSharedPointer<RamItem> &ramItemFor : this->globalRamItemList) |
|
| 123 |
+ {
|
|
| 124 |
+ if(!ramItemFor->getName().compare(ramItem->getName(), Qt::CaseInsensitive)) |
|
| 125 |
+ {
|
|
| 126 |
+ return(false); |
|
| 127 |
+ } |
|
| 128 |
+ } |
|
| 129 |
+ |
|
| 130 |
+ for(const QSharedPointer<FlashItem> &flashItemFor : this->globalFlashItemList) |
|
| 131 |
+ {
|
|
| 132 |
+ if(!flashItemFor->getName().compare(ramItem->getName(), Qt::CaseInsensitive)) |
|
| 133 |
+ {
|
|
| 134 |
+ return(false); |
|
| 135 |
+ } |
|
| 136 |
+ } |
|
| 137 |
+ |
|
| 138 |
+ this->globalRamItemList.append(ramItem); |
|
| 139 |
+ |
|
| 140 |
+ return(true); |
|
| 141 |
+} |
|
| 142 |
+ |
|
| 143 |
+/** |
|
| 144 |
+ * Add a global Flash item to the data list |
|
| 145 |
+ * |
|
| 146 |
+ * @param flashItem Global Flash item |
|
| 147 |
+ * |
|
| 148 |
+ * @return Status of adding the item |
|
| 149 |
+ */ |
|
| 150 |
+bool DataList::addGlobalFlashItem(const QSharedPointer<FlashItem> &flashItem) |
|
| 151 |
+{
|
|
| 152 |
+ for(const QSharedPointer<FlashItem> &flashItemFor : this->globalFlashItemList) |
|
| 153 |
+ {
|
|
| 154 |
+ if(!flashItemFor->getName().compare(flashItem->getName(), Qt::CaseInsensitive)) |
|
| 155 |
+ {
|
|
| 156 |
+ return(false); |
|
| 157 |
+ } |
|
| 158 |
+ } |
|
| 159 |
+ |
|
| 160 |
+ for(const QSharedPointer<RamItem> &ramItemFor : this->globalRamItemList) |
|
| 161 |
+ {
|
|
| 162 |
+ if(!ramItemFor->getName().compare(flashItem->getName(), Qt::CaseInsensitive)) |
|
| 163 |
+ {
|
|
| 164 |
+ return(false); |
|
| 165 |
+ } |
|
| 166 |
+ } |
|
| 167 |
+ |
|
| 168 |
+ this->globalFlashItemList.append(flashItem); |
|
| 169 |
+ |
|
| 170 |
+ return(true); |
|
| 171 |
+} |
|
| 172 |
+ |
|
| 173 |
+/** |
|
| 174 |
+ * Get the external code section list |
|
| 175 |
+ * |
|
| 176 |
+ * @return External code section list |
|
| 177 |
+ */ |
|
| 178 |
+QList<QSharedPointer<CodeSection>> &DataList::getExternalCodeSectionList() |
|
| 179 |
+{
|
|
| 180 |
+ return(this->externalCodeSectionList); |
|
| 181 |
+} |
|
| 182 |
+ |
|
| 183 |
+/** |
|
| 184 |
+ * Get the external RAM item list |
|
| 185 |
+ * |
|
| 186 |
+ * @return External RAM item list |
|
| 187 |
+ */ |
|
| 188 |
+QList<QSharedPointer<RamItem>> &DataList::getExternalRamItemList() |
|
| 189 |
+{
|
|
| 190 |
+ return(this->externalRamItemList); |
|
| 191 |
+} |
|
| 192 |
+ |
|
| 193 |
+/** |
|
| 194 |
+ * Get the external Flash item list |
|
| 195 |
+ * |
|
| 196 |
+ * @return External Flash item list |
|
| 197 |
+ */ |
|
| 198 |
+QList<QSharedPointer<FlashItem>> &DataList::getExternalFlashItemList() |
|
| 199 |
+{
|
|
| 200 |
+ return(this->externalFlashItemList); |
|
| 201 |
+} |
|
| 202 |
+ |
|
| 203 |
+/** |
|
| 204 |
+ * Get the global code section list |
|
| 205 |
+ * |
|
| 206 |
+ * @return Global code section list |
|
| 207 |
+ */ |
|
| 208 |
+QList<QSharedPointer<CodeSection>> &DataList::getGlobalCodeSectionList() |
|
| 209 |
+{
|
|
| 210 |
+ return(this->globalCodeSectionList); |
|
| 211 |
+} |
|
| 212 |
+ |
|
| 213 |
+/** |
|
| 214 |
+ * Get the global RAM item list |
|
| 215 |
+ * |
|
| 216 |
+ * @return Global RAM item list |
|
| 217 |
+ */ |
|
| 218 |
+QList<QSharedPointer<RamItem>> &DataList::getGlobalRamItemList() |
|
| 219 |
+{
|
|
| 220 |
+ return(this->globalRamItemList); |
|
| 221 |
+} |
|
| 222 |
+ |
|
| 223 |
+/** |
|
| 224 |
+ * Get the global Flash item list |
|
| 225 |
+ * |
|
| 226 |
+ * @return Global Flash item list |
|
| 227 |
+ */ |
|
| 228 |
+QList<QSharedPointer<FlashItem>> &DataList::getGlobalFlashItemList() |
|
| 229 |
+{
|
|
| 230 |
+ return(this->globalFlashItemList); |
|
| 231 |
+} |
| 0 | 232 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,70 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef DATALIST_H |
|
| 13 |
+#define DATALIST_H |
|
| 14 |
+ |
|
| 15 |
+#include <QList> |
|
| 16 |
+#include <QSharedPointer> |
|
| 17 |
+ |
|
| 18 |
+#include "codesection.h" |
|
| 19 |
+#include "ramitem.h" |
|
| 20 |
+#include "flashitem.h" |
|
| 21 |
+#include "data.h" |
|
| 22 |
+ |
|
| 23 |
+/** |
|
| 24 |
+ * This class contains all parsed data for each source file. |
|
| 25 |
+ * It allows in a simply way to collect all external or global sections of code, RAM items and Flash items. |
|
| 26 |
+ * It contains too a selection of which mode is used to compile the application. |
|
| 27 |
+ */ |
|
| 28 |
+class DataList : public QList<QSharedPointer<Data>> |
|
| 29 |
+{
|
|
| 30 |
+ public: |
|
| 31 |
+ //! List of possible compile modes |
|
| 32 |
+ enum class Mode |
|
| 33 |
+ {
|
|
| 34 |
+ Rom, //!< Flash residing mode. Mostly for kernel. It generates *.map file. |
|
| 35 |
+ App //!< RAM residing mode. Mostly for user applications. It can use *.map files. |
|
| 36 |
+ }; |
|
| 37 |
+ |
|
| 38 |
+ DataList(Mode mode); |
|
| 39 |
+ |
|
| 40 |
+ Mode getMode() const; |
|
| 41 |
+ |
|
| 42 |
+ bool addExternalCodeSection(const QSharedPointer<CodeSection> &codeSection); |
|
| 43 |
+ bool addExternalRamItem(const QSharedPointer<RamItem> &ramItem); |
|
| 44 |
+ bool addExternalFlashItem(const QSharedPointer<FlashItem> &flashItem); |
|
| 45 |
+ |
|
| 46 |
+ bool addGlobalCodeSection(const QSharedPointer<CodeSection> &codeSection); |
|
| 47 |
+ bool addGlobalRamItem(const QSharedPointer<RamItem> &ramItem); |
|
| 48 |
+ bool addGlobalFlashItem(const QSharedPointer<FlashItem> &flashItem); |
|
| 49 |
+ |
|
| 50 |
+ QList<QSharedPointer<CodeSection>> &getExternalCodeSectionList(); |
|
| 51 |
+ QList<QSharedPointer<RamItem>> &getExternalRamItemList(); |
|
| 52 |
+ QList<QSharedPointer<FlashItem>> &getExternalFlashItemList(); |
|
| 53 |
+ |
|
| 54 |
+ QList<QSharedPointer<CodeSection>> &getGlobalCodeSectionList(); |
|
| 55 |
+ QList<QSharedPointer<RamItem>> &getGlobalRamItemList(); |
|
| 56 |
+ QList<QSharedPointer<FlashItem>> &getGlobalFlashItemList(); |
|
| 57 |
+ |
|
| 58 |
+ private: |
|
| 59 |
+ Mode mode; //!< Which mode is used to compilation the code |
|
| 60 |
+ |
|
| 61 |
+ QList<QSharedPointer<CodeSection>> externalCodeSectionList; //!< List of external code sections |
|
| 62 |
+ QList<QSharedPointer<RamItem>> externalRamItemList; //!< List of external RAM items |
|
| 63 |
+ QList<QSharedPointer<FlashItem>> externalFlashItemList; //!< List of external Flash items |
|
| 64 |
+ |
|
| 65 |
+ QList<QSharedPointer<CodeSection>> globalCodeSectionList; //!< List of global code section |
|
| 66 |
+ QList<QSharedPointer<RamItem>> globalRamItemList; //!< List of global RAM item |
|
| 67 |
+ QList<QSharedPointer<FlashItem>> globalFlashItemList; //!< List of global Flash items |
|
| 68 |
+}; |
|
| 69 |
+ |
|
| 70 |
+#endif |
| 0 | 71 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,98 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "flashitem.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor for creating a Flash item |
|
| 16 |
+ * |
|
| 17 |
+ * @param line Line number in the source file |
|
| 18 |
+ * @param name Name of the const data |
|
| 19 |
+ * @param valueList List of const data which will be stored in the Flash |
|
| 20 |
+ */ |
|
| 21 |
+FlashItem::FlashItem(int line, const QString &name, const QList<QString> &valueList) |
|
| 22 |
+{
|
|
| 23 |
+ this->line = line; |
|
| 24 |
+ this->name = name; |
|
| 25 |
+ |
|
| 26 |
+ this->valueList = valueList; |
|
| 27 |
+ this->address = 0; |
|
| 28 |
+} |
|
| 29 |
+ |
|
| 30 |
+/** |
|
| 31 |
+ * Get the line number where the const data occurred |
|
| 32 |
+ * |
|
| 33 |
+ * @return Line number in the source file |
|
| 34 |
+ */ |
|
| 35 |
+int FlashItem::getLine() const |
|
| 36 |
+{
|
|
| 37 |
+ return(this->line); |
|
| 38 |
+} |
|
| 39 |
+ |
|
| 40 |
+/** |
|
| 41 |
+ * Get the name of the const data |
|
| 42 |
+ * |
|
| 43 |
+ * @return Name of the const data |
|
| 44 |
+ */ |
|
| 45 |
+const QString &FlashItem::getName() const |
|
| 46 |
+{
|
|
| 47 |
+ return(this->name); |
|
| 48 |
+} |
|
| 49 |
+ |
|
| 50 |
+/** |
|
| 51 |
+ * Get the list of the const data in a raw form |
|
| 52 |
+ * |
|
| 53 |
+ * @return List of the const data in a raw form |
|
| 54 |
+ */ |
|
| 55 |
+const QList<QString> &FlashItem::getValueList() const |
|
| 56 |
+{
|
|
| 57 |
+ return(this->valueList); |
|
| 58 |
+} |
|
| 59 |
+ |
|
| 60 |
+/** |
|
| 61 |
+ * Get the size of the const data |
|
| 62 |
+ * |
|
| 63 |
+ * @return Size of the const data |
|
| 64 |
+ */ |
|
| 65 |
+int FlashItem::getDataSize() const |
|
| 66 |
+{
|
|
| 67 |
+ return(this->dataVector.size()); |
|
| 68 |
+} |
|
| 69 |
+ |
|
| 70 |
+/** |
|
| 71 |
+ * Get the list of the const data in a binary form |
|
| 72 |
+ * |
|
| 73 |
+ * @return List of the const data in a binary form |
|
| 74 |
+ */ |
|
| 75 |
+QVector<unsigned char> &FlashItem::getDataVector() |
|
| 76 |
+{
|
|
| 77 |
+ return(this->dataVector); |
|
| 78 |
+} |
|
| 79 |
+ |
|
| 80 |
+/** |
|
| 81 |
+ * Set the address in the memory |
|
| 82 |
+ * |
|
| 83 |
+ * @param address Address in the memory |
|
| 84 |
+ */ |
|
| 85 |
+void FlashItem::setAddress(unsigned int address) |
|
| 86 |
+{
|
|
| 87 |
+ this->address = address; |
|
| 88 |
+} |
|
| 89 |
+ |
|
| 90 |
+/** |
|
| 91 |
+ * Get the address in the memory |
|
| 92 |
+ * |
|
| 93 |
+ * @return Address in the memory |
|
| 94 |
+ */ |
|
| 95 |
+unsigned int FlashItem::getAddress() const |
|
| 96 |
+{
|
|
| 97 |
+ return(this->address); |
|
| 98 |
+} |
| 0 | 99 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,47 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef FLASHITEM_H |
|
| 13 |
+#define FLASHITEM_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+#include <QList> |
|
| 17 |
+#include <QVector> |
|
| 18 |
+#include <QHash> |
|
| 19 |
+ |
|
| 20 |
+//! This class contains a one initialized read-only data item stored in the flash |
|
| 21 |
+class FlashItem |
|
| 22 |
+{
|
|
| 23 |
+ public: |
|
| 24 |
+ FlashItem(int line, const QString &name, const QList<QString> &valueList); |
|
| 25 |
+ |
|
| 26 |
+ int getLine() const; |
|
| 27 |
+ const QString &getName() const; |
|
| 28 |
+ |
|
| 29 |
+ const QList<QString> &getValueList() const; |
|
| 30 |
+ |
|
| 31 |
+ int getDataSize() const; |
|
| 32 |
+ QVector<unsigned char> &getDataVector(); |
|
| 33 |
+ |
|
| 34 |
+ void setAddress(unsigned int address); |
|
| 35 |
+ unsigned int getAddress() const; |
|
| 36 |
+ |
|
| 37 |
+ private: |
|
| 38 |
+ int line; //!< Line number from the source file |
|
| 39 |
+ QString name; //!< Name of the data item |
|
| 40 |
+ |
|
| 41 |
+ QList<QString> valueList; //!< List of data values in raw text format |
|
| 42 |
+ |
|
| 43 |
+ QVector<unsigned char> dataVector;//!< List of bytes generated from the data declaration |
|
| 44 |
+ unsigned int address; //!< Address in memory after linking |
|
| 45 |
+}; |
|
| 46 |
+ |
|
| 47 |
+#endif |
| 0 | 48 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,92 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "instruction.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor using for create an instruction with a defined opcode |
|
| 16 |
+ * |
|
| 17 |
+ * @param name Name of the instruction |
|
| 18 |
+ * @param opcode Opcode number |
|
| 19 |
+ * @param arg0 First argument type |
|
| 20 |
+ * @param arg1 Second argument type |
|
| 21 |
+ * @param arg2 Third argument type |
|
| 22 |
+ * @param opcodeSecond Second optional opcode number |
|
| 23 |
+ * @param arg0Second First argument type of the second optional opcode |
|
| 24 |
+ * @param arg1Second Second argument type of the second optional opcode |
|
| 25 |
+ * @param arg2Second Third argument type of the second optional opcode |
|
| 26 |
+ */ |
|
| 27 |
+Instruction::Instruction(const QString &name, unsigned char opcode, Instruction::Arg arg0, Instruction::Arg arg1, Instruction::Arg arg2, unsigned char opcodeSecond, Arg arg0Second, Arg arg1Second, Arg arg2Second) |
|
| 28 |
+{
|
|
| 29 |
+ this->name = name; |
|
| 30 |
+ this->opcode = opcode; |
|
| 31 |
+ |
|
| 32 |
+ this->argList.append(arg0); |
|
| 33 |
+ this->argList.append(arg1); |
|
| 34 |
+ this->argList.append(arg2); |
|
| 35 |
+ |
|
| 36 |
+ this->opcodeSecond = opcodeSecond; |
|
| 37 |
+ |
|
| 38 |
+ this->argSecondList.append(arg0Second); |
|
| 39 |
+ this->argSecondList.append(arg1Second); |
|
| 40 |
+ this->argSecondList.append(arg2Second); |
|
| 41 |
+} |
|
| 42 |
+ |
|
| 43 |
+/** |
|
| 44 |
+ * Get the name of the instruction |
|
| 45 |
+ * |
|
| 46 |
+ * @return Name of the instruction |
|
| 47 |
+ */ |
|
| 48 |
+const QString &Instruction::getName() const |
|
| 49 |
+{
|
|
| 50 |
+ return(this->name); |
|
| 51 |
+} |
|
| 52 |
+ |
|
| 53 |
+/** |
|
| 54 |
+ * Get the opcode number of the instruction |
|
| 55 |
+ * |
|
| 56 |
+ * @return Opcode of the instruction |
|
| 57 |
+ */ |
|
| 58 |
+unsigned char Instruction::getOpcode() const |
|
| 59 |
+{
|
|
| 60 |
+ return(this->opcode); |
|
| 61 |
+} |
|
| 62 |
+ |
|
| 63 |
+/** |
|
| 64 |
+ * Get the argument type list of the instruction |
|
| 65 |
+ * |
|
| 66 |
+ * @return Argument type list |
|
| 67 |
+ */ |
|
| 68 |
+const QList<Instruction::Arg> &Instruction::getArgList() const |
|
| 69 |
+{
|
|
| 70 |
+ return(this->argList); |
|
| 71 |
+} |
|
| 72 |
+ |
|
| 73 |
+/** |
|
| 74 |
+ * Get the second optional opcode number of the instruction |
|
| 75 |
+ * |
|
| 76 |
+ * @return Second optional opcode of the instruction |
|
| 77 |
+ */ |
|
| 78 |
+unsigned char Instruction::getOpcodeSecond() const |
|
| 79 |
+{
|
|
| 80 |
+ return(this->opcodeSecond); |
|
| 81 |
+} |
|
| 82 |
+ |
|
| 83 |
+/** |
|
| 84 |
+ * Get the second optional argument type list of the instruction |
|
| 85 |
+ * |
|
| 86 |
+ * @return Second optional argument type list |
|
| 87 |
+ */ |
|
| 88 |
+const QList<Instruction::Arg> &Instruction::getArgSecondList() const |
|
| 89 |
+{
|
|
| 90 |
+ return(this->argSecondList); |
|
| 91 |
+} |
|
| 92 |
+ |
| 0 | 93 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,50 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef INSTRUCTION_H |
|
| 13 |
+#define INSTRUCTION_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+#include <QList> |
|
| 17 |
+ |
|
| 18 |
+//! This class contains a one description of the CPU instruction |
|
| 19 |
+class Instruction |
|
| 20 |
+{
|
|
| 21 |
+ public: |
|
| 22 |
+ //! Definitions of the instruction argument types |
|
| 23 |
+ enum class Arg |
|
| 24 |
+ {
|
|
| 25 |
+ None, //!< No argument |
|
| 26 |
+ ABXY, //!< Main and auxiliary registers |
|
| 27 |
+ AB, //!< Only main registers |
|
| 28 |
+ Val256, //!< 8 bit unsigned value |
|
| 29 |
+ Addr //!< 16 bit unsigned address |
|
| 30 |
+ }; |
|
| 31 |
+ |
|
| 32 |
+ Instruction(const QString &name, unsigned char opcode, Arg arg0 = Arg::None, Arg arg1 = Arg::None, Arg arg2 = Arg::None, unsigned char opcodeSecond = 0, Arg arg0Second = Arg::None, Arg arg1Second = Arg::None, Arg arg2Second = Arg::None); |
|
| 33 |
+ |
|
| 34 |
+ const QString &getName() const; |
|
| 35 |
+ unsigned char getOpcode() const; |
|
| 36 |
+ const QList<Arg> &getArgList() const; |
|
| 37 |
+ |
|
| 38 |
+ unsigned char getOpcodeSecond() const; |
|
| 39 |
+ const QList<Arg> &getArgSecondList() const; |
|
| 40 |
+ |
|
| 41 |
+ private: |
|
| 42 |
+ QString name; //!< Instruction name |
|
| 43 |
+ unsigned char opcode; //!< Opcode of the defined instruction |
|
| 44 |
+ QList<Arg> argList; //!< Argument list of the defined instruction |
|
| 45 |
+ |
|
| 46 |
+ unsigned char opcodeSecond; //!< Second optional opcode of the defined instruction used for a two-step instruction type |
|
| 47 |
+ QList<Arg> argSecondList; //!< Second optional argument list of the defined instruction used for a two-step instruction type |
|
| 48 |
+}; |
|
| 49 |
+ |
|
| 50 |
+#endif |
| 0 | 51 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,372 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "linker.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor of the linker |
|
| 16 |
+ * |
|
| 17 |
+ * @param dataList Data list |
|
| 18 |
+ */ |
|
| 19 |
+Linker::Linker(DataList &dataList) : dataList(dataList) |
|
| 20 |
+{
|
|
| 21 |
+} |
|
| 22 |
+ |
|
| 23 |
+/** |
|
| 24 |
+ * Link all parts of the application together and fill addresses |
|
| 25 |
+ * |
|
| 26 |
+ * @return Status of linking the application |
|
| 27 |
+ */ |
|
| 28 |
+bool Linker::link() |
|
| 29 |
+{
|
|
| 30 |
+ QTextStream out(stdout); |
|
| 31 |
+ |
|
| 32 |
+ unsigned int ramSize = ((this->dataList.getMode() == DataList::Mode::Rom) ? ROM_RAM_SIZE : APP_RAM_SIZE); |
|
| 33 |
+ unsigned int flashSize = ((this->dataList.getMode() == DataList::Mode::Rom) ? ROM_FLASH_SIZE : APP_FLASH_SIZE); |
|
| 34 |
+ |
|
| 35 |
+ unsigned int ramOffset = ((this->dataList.getMode() == DataList::Mode::Rom) ? ROM_RAM_OFFSET : APP_RAM_OFFSET); |
|
| 36 |
+ unsigned int flashOffset = ((this->dataList.getMode() == DataList::Mode::Rom) ? ROM_FLASH_OFFSET : APP_FLASH_OFFSET); |
|
| 37 |
+ |
|
| 38 |
+ unsigned int ramUsage = 0; |
|
| 39 |
+ unsigned int flashUsage = 0; |
|
| 40 |
+ |
|
| 41 |
+ this->flashVector.clear(); |
|
| 42 |
+ |
|
| 43 |
+ // Move code to flash |
|
| 44 |
+ for(const QSharedPointer<Data> &data : this->dataList) |
|
| 45 |
+ {
|
|
| 46 |
+ // Copy code to flash list |
|
| 47 |
+ for(const QSharedPointer<CodeSection> &codeSection : data->getCodeSectionList()) |
|
| 48 |
+ {
|
|
| 49 |
+ codeSection->setAddress(flashUsage + flashOffset); |
|
| 50 |
+ |
|
| 51 |
+ for(const QSharedPointer<CodeItem> &codeItem : codeSection->getCodeItemList()) |
|
| 52 |
+ {
|
|
| 53 |
+ codeItem->setAddress(flashUsage + flashOffset); |
|
| 54 |
+ |
|
| 55 |
+ flashUsage += static_cast<unsigned int>(codeItem->getDataVector().length()); |
|
| 56 |
+ |
|
| 57 |
+ this->flashVector.append(codeItem->getDataVector()); |
|
| 58 |
+ } |
|
| 59 |
+ } |
|
| 60 |
+ } |
|
| 61 |
+ |
|
| 62 |
+ // Move data to ram and flash |
|
| 63 |
+ for(const QSharedPointer<Data> &data : this->dataList) |
|
| 64 |
+ {
|
|
| 65 |
+ // Count ram |
|
| 66 |
+ for(const QSharedPointer<RamItem> &ramItem : data->getRamItemList()) |
|
| 67 |
+ {
|
|
| 68 |
+ ramItem->setAddress(ramUsage + ramOffset); |
|
| 69 |
+ |
|
| 70 |
+ ramUsage += ramItem->getDataSize(); |
|
| 71 |
+ } |
|
| 72 |
+ |
|
| 73 |
+ // Copy flash to flash list |
|
| 74 |
+ for(const QSharedPointer<FlashItem> &flashItem : data->getFlashItemList()) |
|
| 75 |
+ {
|
|
| 76 |
+ flashItem->setAddress(flashUsage + flashOffset); |
|
| 77 |
+ |
|
| 78 |
+ flashUsage += static_cast<unsigned int>(flashItem->getDataSize()); |
|
| 79 |
+ |
|
| 80 |
+ this->flashVector.append(flashItem->getDataVector()); |
|
| 81 |
+ } |
|
| 82 |
+ } |
|
| 83 |
+ |
|
| 84 |
+ if(ramUsage > ramSize) |
|
| 85 |
+ {
|
|
| 86 |
+ out << QString("ERROR: %1 of %2 (%3%) bytes of RAM are used\n").arg(ramUsage).arg(ramSize).arg(QString::asprintf("%.1f", ((static_cast<double>(ramUsage) / static_cast<double>(ramSize)) * 100.0)));
|
|
| 87 |
+ return(false); |
|
| 88 |
+ } |
|
| 89 |
+ |
|
| 90 |
+ if(flashUsage > flashSize) |
|
| 91 |
+ {
|
|
| 92 |
+ out << QString("ERROR: %1 of %2 (%3%) bytes of FLASH are used\n").arg(flashUsage).arg(flashSize).arg(QString::asprintf("%.1f", ((static_cast<double>(flashUsage) / static_cast<double>(flashSize)) * 100.0)));
|
|
| 93 |
+ return(false); |
|
| 94 |
+ } |
|
| 95 |
+ |
|
| 96 |
+ // Update addresses |
|
| 97 |
+ for(const QSharedPointer<Data> &data : this->dataList) |
|
| 98 |
+ {
|
|
| 99 |
+ for(const QSharedPointer<CodeSection> &codeSection : data->getCodeSectionList()) |
|
| 100 |
+ {
|
|
| 101 |
+ for(const QSharedPointer<CodeItem> &codeItem : codeSection->getCodeItemList()) |
|
| 102 |
+ {
|
|
| 103 |
+ QHashIterator<QString, unsigned int> it(codeItem->getToFillUpHash()); |
|
| 104 |
+ |
|
| 105 |
+ while(it.hasNext()) |
|
| 106 |
+ {
|
|
| 107 |
+ it.next(); |
|
| 108 |
+ |
|
| 109 |
+ const QString &label = it.key(); |
|
| 110 |
+ unsigned int offset = it.value(); |
|
| 111 |
+ |
|
| 112 |
+ unsigned int address; |
|
| 113 |
+ |
|
| 114 |
+ offset += (codeItem->getAddress() - flashOffset); |
|
| 115 |
+ |
|
| 116 |
+ bool isOk = false; |
|
| 117 |
+ |
|
| 118 |
+ if((label.left(1) == ".") || (label.left(1) == "*")) |
|
| 119 |
+ {
|
|
| 120 |
+ if(this->findAddress(*data, label, address)) |
|
| 121 |
+ {
|
|
| 122 |
+ this->flashVector.replace(static_cast<int>(offset), static_cast<unsigned char>(address % 256)); |
|
| 123 |
+ this->flashVector.replace(static_cast<int>(offset + 1), static_cast<unsigned char>(address / 256)); |
|
| 124 |
+ |
|
| 125 |
+ isOk = true; |
|
| 126 |
+ } |
|
| 127 |
+ } |
|
| 128 |
+ else if(!label.leftRef(3).compare(QString("low"), Qt::CaseInsensitive))
|
|
| 129 |
+ {
|
|
| 130 |
+ QString tLabel = label.mid(4, (label.length() - 5)); |
|
| 131 |
+ |
|
| 132 |
+ if(this->findAddress(*data, tLabel, address)) |
|
| 133 |
+ {
|
|
| 134 |
+ this->flashVector.replace(static_cast<int>(offset), static_cast<unsigned char>(address % 256)); |
|
| 135 |
+ |
|
| 136 |
+ isOk = true; |
|
| 137 |
+ } |
|
| 138 |
+ } |
|
| 139 |
+ else if(!label.leftRef(4).compare(QString("high"), Qt::CaseInsensitive))
|
|
| 140 |
+ {
|
|
| 141 |
+ QString tLabel = label.mid(5, (label.length() - 6)); |
|
| 142 |
+ |
|
| 143 |
+ if(this->findAddress(*data, tLabel, address)) |
|
| 144 |
+ {
|
|
| 145 |
+ this->flashVector.replace(static_cast<int>(offset), static_cast<unsigned char>(address / 256)); |
|
| 146 |
+ |
|
| 147 |
+ isOk = true; |
|
| 148 |
+ } |
|
| 149 |
+ } |
|
| 150 |
+ |
|
| 151 |
+ if(!isOk) |
|
| 152 |
+ {
|
|
| 153 |
+ out << QString("ERROR: Unknown label name \"%1\" at line %2 in file: \"%3\"\n").arg(label).arg(codeItem->getLine()).arg(data->getFileName());
|
|
| 154 |
+ return(false); |
|
| 155 |
+ } |
|
| 156 |
+ } |
|
| 157 |
+ } |
|
| 158 |
+ } |
|
| 159 |
+ } |
|
| 160 |
+ |
|
| 161 |
+ out << QString("INFO: %1 of %2 (%3%) bytes of RAM are used\n").arg(ramUsage).arg(ramSize).arg(QString::asprintf("%.1f", ((static_cast<double>(ramUsage) / static_cast<double>(ramSize)) * 100.0)));
|
|
| 162 |
+ out << QString("INFO: %1 of %2 (%3%) bytes of FLASH are used\n").arg(flashUsage).arg(flashSize).arg(QString::asprintf("%.1f", ((static_cast<double>(flashUsage) / static_cast<double>(flashSize)) * 100.0)));
|
|
| 163 |
+ |
|
| 164 |
+ return(true); |
|
| 165 |
+} |
|
| 166 |
+ |
|
| 167 |
+/** |
|
| 168 |
+ * Save the binary to the file |
|
| 169 |
+ * |
|
| 170 |
+ * @param path Path to the binary file |
|
| 171 |
+ * @param pathMap Path to the map file |
|
| 172 |
+ * |
|
| 173 |
+ * @return Status of saving data to the file |
|
| 174 |
+ */ |
|
| 175 |
+bool Linker::saveFile(const QString &path, const QString &pathMap) |
|
| 176 |
+{
|
|
| 177 |
+ if(!this->flashVector.empty()) |
|
| 178 |
+ {
|
|
| 179 |
+ if(this->flashVector.size() > ROM_FLASH_SIZE) |
|
| 180 |
+ {
|
|
| 181 |
+ return(false); |
|
| 182 |
+ } |
|
| 183 |
+ |
|
| 184 |
+ if(this->dataList.getMode() == DataList::Mode::Rom) |
|
| 185 |
+ {
|
|
| 186 |
+ this->flashVector.append(QVector<unsigned char>((ROM_FLASH_SIZE - this->flashVector.size()), 0)); |
|
| 187 |
+ } |
|
| 188 |
+ |
|
| 189 |
+ QFile file(path); |
|
| 190 |
+ |
|
| 191 |
+ if(file.open(QIODevice::WriteOnly)) |
|
| 192 |
+ {
|
|
| 193 |
+ file.write(reinterpret_cast<const char *>(this->flashVector.constData()), this->flashVector.size()); |
|
| 194 |
+ file.close(); |
|
| 195 |
+ } |
|
| 196 |
+ else |
|
| 197 |
+ {
|
|
| 198 |
+ return(false); |
|
| 199 |
+ } |
|
| 200 |
+ } |
|
| 201 |
+ else |
|
| 202 |
+ {
|
|
| 203 |
+ return(false); |
|
| 204 |
+ } |
|
| 205 |
+ |
|
| 206 |
+ if(this->dataList.getMode() == DataList::Mode::Rom) |
|
| 207 |
+ {
|
|
| 208 |
+ QFile file(pathMap); |
|
| 209 |
+ |
|
| 210 |
+ if(file.open(QIODevice::WriteOnly)) |
|
| 211 |
+ {
|
|
| 212 |
+ for(const QSharedPointer<RamItem> &ramItem : this->dataList.getExternalRamItemList()) |
|
| 213 |
+ {
|
|
| 214 |
+ QString line = QString("external var %1 = 0x%2\n").arg(ramItem->getName()).arg(ramItem->getAddress(), 4, 16, QChar('0'));
|
|
| 215 |
+ |
|
| 216 |
+ file.write(line.toUtf8()); |
|
| 217 |
+ } |
|
| 218 |
+ |
|
| 219 |
+ for(const QSharedPointer<FlashItem> &flashItem : this->dataList.getExternalFlashItemList()) |
|
| 220 |
+ {
|
|
| 221 |
+ QString line = QString("external const %1 = 0x%2\n").arg(flashItem->getName()).arg(flashItem->getAddress(), 4, 16, QChar('0'));
|
|
| 222 |
+ |
|
| 223 |
+ file.write(line.toUtf8()); |
|
| 224 |
+ } |
|
| 225 |
+ |
|
| 226 |
+ for(const QSharedPointer<CodeSection> &codeSection : this->dataList.getExternalCodeSectionList()) |
|
| 227 |
+ {
|
|
| 228 |
+ QString line = QString("%1 = 0x%2\n").arg(codeSection->getName()).arg(codeSection->getAddress(), 4, 16, QChar('0'));
|
|
| 229 |
+ |
|
| 230 |
+ file.write(line.toUtf8()); |
|
| 231 |
+ } |
|
| 232 |
+ |
|
| 233 |
+ file.close(); |
|
| 234 |
+ } |
|
| 235 |
+ else |
|
| 236 |
+ {
|
|
| 237 |
+ return(false); |
|
| 238 |
+ } |
|
| 239 |
+ } |
|
| 240 |
+ |
|
| 241 |
+ return(true); |
|
| 242 |
+} |
|
| 243 |
+ |
|
| 244 |
+/** |
|
| 245 |
+ * Find the correct address in memory |
|
| 246 |
+ * |
|
| 247 |
+ * @param data Data of the compiled application |
|
| 248 |
+ * @param label Label name to find |
|
| 249 |
+ * @param address Found address |
|
| 250 |
+ * |
|
| 251 |
+ * @return Status of searching the address |
|
| 252 |
+ */ |
|
| 253 |
+bool Linker::findAddress(Data &data, const QString &label, unsigned int &address) |
|
| 254 |
+{
|
|
| 255 |
+ QString name; |
|
| 256 |
+ |
|
| 257 |
+ if(label.contains(QRegularExpression(R"(^(\.[0-9a-zA-Z_-]+)$)"))) |
|
| 258 |
+ {
|
|
| 259 |
+ name = label; |
|
| 260 |
+ |
|
| 261 |
+ return(this->findCodeAddress(data, name, address)); |
|
| 262 |
+ } |
|
| 263 |
+ else if(label.contains(QRegularExpression(R"(^(\*[0-9a-zA-Z_-]+)$)"))) |
|
| 264 |
+ {
|
|
| 265 |
+ name = label.mid(1); |
|
| 266 |
+ |
|
| 267 |
+ return(this->findMemoryAddress(data, name, address)); |
|
| 268 |
+ } |
|
| 269 |
+ else if(label.contains(QRegularExpression(R"(^(\*[0-9a-zA-Z_-]+\[[0-9]+\])$)"))) |
|
| 270 |
+ {
|
|
| 271 |
+ int cOffset = label.indexOf("[");
|
|
| 272 |
+ name = label.mid(1, (cOffset - 1)); |
|
| 273 |
+ unsigned int offset = label.midRef((cOffset + 1), (label.length() - cOffset - 2)).toUInt(); |
|
| 274 |
+ |
|
| 275 |
+ if(this->findMemoryAddress(data, name, address)) |
|
| 276 |
+ {
|
|
| 277 |
+ address += offset; |
|
| 278 |
+ |
|
| 279 |
+ return(true); |
|
| 280 |
+ } |
|
| 281 |
+ } |
|
| 282 |
+ |
|
| 283 |
+ return(false); |
|
| 284 |
+} |
|
| 285 |
+ |
|
| 286 |
+/** |
|
| 287 |
+ * Find the correct address of code in memory |
|
| 288 |
+ * |
|
| 289 |
+ * @param data Data of the compiled application |
|
| 290 |
+ * @param name Name to find |
|
| 291 |
+ * @param address Found address |
|
| 292 |
+ * |
|
| 293 |
+ * @return Status of searching the address |
|
| 294 |
+ */ |
|
| 295 |
+bool Linker::findCodeAddress(Data &data, const QString &name, unsigned int &address) |
|
| 296 |
+{
|
|
| 297 |
+ for(const QSharedPointer<CodeSection> &codeSection : data.getCodeSectionList()) |
|
| 298 |
+ {
|
|
| 299 |
+ if(!codeSection->getName().compare(name, Qt::CaseInsensitive)) |
|
| 300 |
+ {
|
|
| 301 |
+ address = codeSection->getAddress(); |
|
| 302 |
+ |
|
| 303 |
+ return(true); |
|
| 304 |
+ } |
|
| 305 |
+ } |
|
| 306 |
+ |
|
| 307 |
+ for(const QSharedPointer<CodeSection> &codeSection : this->dataList.getGlobalCodeSectionList()) |
|
| 308 |
+ {
|
|
| 309 |
+ if(!codeSection->getName().compare(name, Qt::CaseInsensitive)) |
|
| 310 |
+ {
|
|
| 311 |
+ address = codeSection->getAddress(); |
|
| 312 |
+ |
|
| 313 |
+ return(true); |
|
| 314 |
+ } |
|
| 315 |
+ } |
|
| 316 |
+ |
|
| 317 |
+ return(false); |
|
| 318 |
+} |
|
| 319 |
+ |
|
| 320 |
+/** |
|
| 321 |
+ * Find the correct address of variable or const in memory |
|
| 322 |
+ * |
|
| 323 |
+ * @param data Data of the compiled application |
|
| 324 |
+ * @param name Name to find |
|
| 325 |
+ * @param address Found address |
|
| 326 |
+ * |
|
| 327 |
+ * @return Status of searching the address |
|
| 328 |
+ */ |
|
| 329 |
+bool Linker::findMemoryAddress(Data &data, const QString &name, unsigned int &address) |
|
| 330 |
+{
|
|
| 331 |
+ for(const QSharedPointer<RamItem> &ramItem : data.getRamItemList()) |
|
| 332 |
+ {
|
|
| 333 |
+ if(!ramItem->getName().compare(name, Qt::CaseInsensitive)) |
|
| 334 |
+ {
|
|
| 335 |
+ address = ramItem->getAddress(); |
|
| 336 |
+ |
|
| 337 |
+ return(true); |
|
| 338 |
+ } |
|
| 339 |
+ } |
|
| 340 |
+ |
|
| 341 |
+ for(const QSharedPointer<FlashItem> &flashItem : data.getFlashItemList()) |
|
| 342 |
+ {
|
|
| 343 |
+ if(!flashItem->getName().compare(name, Qt::CaseInsensitive)) |
|
| 344 |
+ {
|
|
| 345 |
+ address = flashItem->getAddress(); |
|
| 346 |
+ |
|
| 347 |
+ return(true); |
|
| 348 |
+ } |
|
| 349 |
+ } |
|
| 350 |
+ |
|
| 351 |
+ for(const QSharedPointer<RamItem> &ramItem : this->dataList.getGlobalRamItemList()) |
|
| 352 |
+ {
|
|
| 353 |
+ if(!ramItem->getName().compare(name, Qt::CaseInsensitive)) |
|
| 354 |
+ {
|
|
| 355 |
+ address = ramItem->getAddress(); |
|
| 356 |
+ |
|
| 357 |
+ return(true); |
|
| 358 |
+ } |
|
| 359 |
+ } |
|
| 360 |
+ |
|
| 361 |
+ for(const QSharedPointer<FlashItem> &flashItem : this->dataList.getGlobalFlashItemList()) |
|
| 362 |
+ {
|
|
| 363 |
+ if(!flashItem->getName().compare(name, Qt::CaseInsensitive)) |
|
| 364 |
+ {
|
|
| 365 |
+ address = flashItem->getAddress(); |
|
| 366 |
+ |
|
| 367 |
+ return(true); |
|
| 368 |
+ } |
|
| 369 |
+ } |
|
| 370 |
+ |
|
| 371 |
+ return(false); |
|
| 372 |
+} |
| 0 | 373 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,58 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef LINKER_H |
|
| 13 |
+#define LINKER_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+#include <QTextStream> |
|
| 17 |
+#include <QVector> |
|
| 18 |
+#include <QHash> |
|
| 19 |
+#include <QRegularExpression> |
|
| 20 |
+#include <QFile> |
|
| 21 |
+#include <QIODevice> |
|
| 22 |
+ |
|
| 23 |
+#include "codeitem.h" |
|
| 24 |
+#include "codesection.h" |
|
| 25 |
+#include "ramitem.h" |
|
| 26 |
+#include "flashitem.h" |
|
| 27 |
+#include "data.h" |
|
| 28 |
+#include "datalist.h" |
|
| 29 |
+ |
|
| 30 |
+//! This class glues all binary parts from the compilation part and set correct memory addresses |
|
| 31 |
+class Linker |
|
| 32 |
+{
|
|
| 33 |
+ public: |
|
| 34 |
+ static const int ROM_RAM_SIZE = 3840; //!< Size of RAM reserved for the kernel |
|
| 35 |
+ static const int ROM_FLASH_SIZE = 32768; //!< Size of Flash reserved for the kernel |
|
| 36 |
+ static const int ROM_RAM_OFFSET = 0; //!< Start of RAM reserved for the kernel |
|
| 37 |
+ static const int ROM_FLASH_OFFSET = 0; //!< Start of Flash reserved for the kernel |
|
| 38 |
+ |
|
| 39 |
+ static const int APP_RAM_SIZE = 28672; //!< Size of RAM reserved for a user application |
|
| 40 |
+ static const int APP_FLASH_SIZE = 32768; //!< Size of Flash reserved for a user application |
|
| 41 |
+ static const int APP_RAM_OFFSET = 4096; //!< Start of RAM reserved for a user application |
|
| 42 |
+ static const int APP_FLASH_OFFSET = 32768; //!< Start of Flash reserved for a user application |
|
| 43 |
+ |
|
| 44 |
+ Linker(DataList &dataList); |
|
| 45 |
+ |
|
| 46 |
+ bool link(); |
|
| 47 |
+ bool saveFile(const QString &path, const QString &pathMap); |
|
| 48 |
+ |
|
| 49 |
+ private: |
|
| 50 |
+ DataList &dataList; //!< List of data for each source file |
|
| 51 |
+ QVector<unsigned char> flashVector; //!< Buffer with a compiled, parsed and linked binary code |
|
| 52 |
+ |
|
| 53 |
+ bool findAddress(Data &data, const QString &label, unsigned int &address); |
|
| 54 |
+ bool findCodeAddress(Data &data, const QString &name, unsigned int &address); |
|
| 55 |
+ bool findMemoryAddress(Data &data, const QString &name, unsigned int &address); |
|
| 56 |
+}; |
|
| 57 |
+ |
|
| 58 |
+#endif |
| 0 | 59 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,87 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include <QCoreApplication> |
|
| 13 |
+#include <QTextStream> |
|
| 14 |
+ |
|
| 15 |
+#include "asm.h" |
|
| 16 |
+ |
|
| 17 |
+/** |
|
| 18 |
+ * Print an exit message and the usage prompt if needed |
|
| 19 |
+ * |
|
| 20 |
+ * @param message Message to print |
|
| 21 |
+ * @param showUsage Show or not the usage prompt |
|
| 22 |
+ */ |
|
| 23 |
+static void printExitMessage(const QString &message, const bool showUsage = false) |
|
| 24 |
+{
|
|
| 25 |
+ QTextStream out(stdout); |
|
| 26 |
+ |
|
| 27 |
+ out << message << "\n\n"; |
|
| 28 |
+ |
|
| 29 |
+ if(showUsage) |
|
| 30 |
+ {
|
|
| 31 |
+ out << "Run as ROM build:\n"; |
|
| 32 |
+ out << " asm rom [input_file] [output_bin] [output_map]\n\n"; |
|
| 33 |
+ out << "Run as APP build:\n"; |
|
| 34 |
+ out << " asm app [input_file] [output_bin]\n\n"; |
|
| 35 |
+ } |
|
| 36 |
+} |
|
| 37 |
+ |
|
| 38 |
+/** |
|
| 39 |
+ * Main entry function of the application |
|
| 40 |
+ * |
|
| 41 |
+ * @param argc Arguments count |
|
| 42 |
+ * @param argv Arguments list stored in an array |
|
| 43 |
+ */ |
|
| 44 |
+int main(int argc, char *argv[]) |
|
| 45 |
+{
|
|
| 46 |
+ QString inputFile; |
|
| 47 |
+ QString outputFile; |
|
| 48 |
+ QString outputMapFile; |
|
| 49 |
+ |
|
| 50 |
+ // Prepare the assembler |
|
| 51 |
+ Asm assembler = Asm(); |
|
| 52 |
+ |
|
| 53 |
+ if(argc >= 2) |
|
| 54 |
+ {
|
|
| 55 |
+ if(!QString(argv[1]).compare("rom", Qt::CaseInsensitive))
|
|
| 56 |
+ {
|
|
| 57 |
+ if(argc == 5) |
|
| 58 |
+ {
|
|
| 59 |
+ inputFile = QString(argv[2]); |
|
| 60 |
+ outputFile = QString(argv[3]); |
|
| 61 |
+ outputMapFile = QString(argv[4]); |
|
| 62 |
+ |
|
| 63 |
+ // Compile the kernel |
|
| 64 |
+ return(assembler.compileRom(inputFile, outputFile, outputMapFile)); |
|
| 65 |
+ } |
|
| 66 |
+ } |
|
| 67 |
+ else if(!QString(argv[1]).compare("app", Qt::CaseInsensitive))
|
|
| 68 |
+ {
|
|
| 69 |
+ if(argc == 4) |
|
| 70 |
+ {
|
|
| 71 |
+ inputFile = QString(argv[2]); |
|
| 72 |
+ outputFile = QString(argv[3]); |
|
| 73 |
+ |
|
| 74 |
+ // Compile the application |
|
| 75 |
+ return(assembler.compileApp(inputFile, outputFile)); |
|
| 76 |
+ } |
|
| 77 |
+ } |
|
| 78 |
+ else |
|
| 79 |
+ {
|
|
| 80 |
+ printExitMessage(QString("ERROR: Unknow compilation mode"), true);
|
|
| 81 |
+ return(-1); |
|
| 82 |
+ } |
|
| 83 |
+ } |
|
| 84 |
+ |
|
| 85 |
+ printExitMessage(QString("ERROR: Bad number of arguments"), true);
|
|
| 86 |
+ return(-1); |
|
| 87 |
+} |
| 0 | 88 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,687 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "parser.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor of the parser |
|
| 16 |
+ * |
|
| 17 |
+ * @param dataList Data list |
|
| 18 |
+ */ |
|
| 19 |
+Parser::Parser(DataList &dataList) : dataList(dataList) |
|
| 20 |
+{
|
|
| 21 |
+} |
|
| 22 |
+ |
|
| 23 |
+/** |
|
| 24 |
+ * Parse a file |
|
| 25 |
+ * |
|
| 26 |
+ * @param path Path to the file |
|
| 27 |
+ * |
|
| 28 |
+ * @return Status of parsing the file |
|
| 29 |
+ */ |
|
| 30 |
+bool Parser::parseFile(const QString &path) |
|
| 31 |
+{
|
|
| 32 |
+ QTextStream out(stdout); |
|
| 33 |
+ QList<QString> fileList; |
|
| 34 |
+ QList<QString> mapList; |
|
| 35 |
+ |
|
| 36 |
+ fileList.append(QFileInfo(path).absoluteFilePath()); |
|
| 37 |
+ |
|
| 38 |
+ for(int i = 0; i < fileList.size(); i++) |
|
| 39 |
+ {
|
|
| 40 |
+ QString filePath = fileList.at(i); |
|
| 41 |
+ QFile file(filePath); |
|
| 42 |
+ QStringList lineList; |
|
| 43 |
+ |
|
| 44 |
+ if(!file.open(QIODevice::ReadOnly)) |
|
| 45 |
+ {
|
|
| 46 |
+ out << QString("ERROR: Cannot open file: \"%1\"\n").arg(filePath);
|
|
| 47 |
+ return(false); |
|
| 48 |
+ } |
|
| 49 |
+ |
|
| 50 |
+ while(!file.atEnd()) |
|
| 51 |
+ {
|
|
| 52 |
+ lineList.append(file.readLine().trimmed()); |
|
| 53 |
+ } |
|
| 54 |
+ |
|
| 55 |
+ file.close(); |
|
| 56 |
+ |
|
| 57 |
+ QSharedPointer<Data> data(new Data(filePath)); |
|
| 58 |
+ QSharedPointer<CodeSection> codeSection(new CodeSection(""));
|
|
| 59 |
+ |
|
| 60 |
+ for(int j = 0; j < lineList.size(); j++) |
|
| 61 |
+ {
|
|
| 62 |
+ // Trimm line |
|
| 63 |
+ QString line = lineList.at(j); |
|
| 64 |
+ int offset = line.indexOf(QRegularExpression("(?<!\\\\);|^;"));
|
|
| 65 |
+ |
|
| 66 |
+ if(offset >= 0) |
|
| 67 |
+ {
|
|
| 68 |
+ line = line.left(offset).trimmed(); |
|
| 69 |
+ } |
|
| 70 |
+ |
|
| 71 |
+ if(line.length() <= 0) |
|
| 72 |
+ {
|
|
| 73 |
+ continue; |
|
| 74 |
+ } |
|
| 75 |
+ |
|
| 76 |
+ // Find label |
|
| 77 |
+ offset = line.indexOf(QRegularExpression("\\s+"));
|
|
| 78 |
+ QString label; |
|
| 79 |
+ |
|
| 80 |
+ if(offset > 0) |
|
| 81 |
+ {
|
|
| 82 |
+ label = line.left(offset).trimmed(); |
|
| 83 |
+ } |
|
| 84 |
+ else |
|
| 85 |
+ {
|
|
| 86 |
+ label = line; |
|
| 87 |
+ } |
|
| 88 |
+ |
|
| 89 |
+ line = line.mid(label.length()).trimmed(); |
|
| 90 |
+ |
|
| 91 |
+ // Find external or global |
|
| 92 |
+ bool isExternal = false; |
|
| 93 |
+ bool isGlobal = false; |
|
| 94 |
+ |
|
| 95 |
+ if(!label.compare("external", Qt::CaseInsensitive))
|
|
| 96 |
+ {
|
|
| 97 |
+ if(this->dataList.getMode() == DataList::Mode::Rom) |
|
| 98 |
+ {
|
|
| 99 |
+ isExternal = true; |
|
| 100 |
+ } |
|
| 101 |
+ else |
|
| 102 |
+ {
|
|
| 103 |
+ out << QString("ERROR: Special keyword \"external\" is not allowed in APP mode, found at line %1 in file: \"%2\"\n").arg(j + 1).arg(filePath);
|
|
| 104 |
+ return(false); |
|
| 105 |
+ } |
|
| 106 |
+ } |
|
| 107 |
+ |
|
| 108 |
+ if(!label.compare("global", Qt::CaseInsensitive))
|
|
| 109 |
+ {
|
|
| 110 |
+ isGlobal = true; |
|
| 111 |
+ } |
|
| 112 |
+ |
|
| 113 |
+ if(isExternal || isGlobal) |
|
| 114 |
+ {
|
|
| 115 |
+ offset = line.indexOf(QRegularExpression("\\s+"));
|
|
| 116 |
+ |
|
| 117 |
+ if(offset > 0) |
|
| 118 |
+ {
|
|
| 119 |
+ label = line.left(offset).trimmed(); |
|
| 120 |
+ } |
|
| 121 |
+ else |
|
| 122 |
+ {
|
|
| 123 |
+ label = line; |
|
| 124 |
+ } |
|
| 125 |
+ |
|
| 126 |
+ line = line.mid(label.length()).trimmed(); |
|
| 127 |
+ } |
|
| 128 |
+ |
|
| 129 |
+ // Find code section |
|
| 130 |
+ if((label.left(1) == ".") && (label.right(1) == ":")) |
|
| 131 |
+ {
|
|
| 132 |
+ if(label.mid(1, (label.length() - 2)).contains(QRegularExpression("^([0-9a-zA-Z_-]+)$")))
|
|
| 133 |
+ {
|
|
| 134 |
+ if(!data->addCodeSection(codeSection)) |
|
| 135 |
+ {
|
|
| 136 |
+ out << QString("ERROR: Reuse of section name: \"%1\", found at line %2 in file: \"%3\"\n").arg(codeSection->getName()).arg(j + 1).arg(filePath);
|
|
| 137 |
+ return(false); |
|
| 138 |
+ } |
|
| 139 |
+ |
|
| 140 |
+ codeSection = QSharedPointer<CodeSection>(new CodeSection(label.left(label.length() - 1))); |
|
| 141 |
+ |
|
| 142 |
+ if(isExternal) |
|
| 143 |
+ {
|
|
| 144 |
+ if(!this->dataList.addExternalCodeSection(codeSection)) |
|
| 145 |
+ {
|
|
| 146 |
+ out << QString("ERROR: Reuse of external section name: \"%1\", found at line %2 in file: \"%3\"\n").arg(codeSection->getName()).arg(j + 1).arg(filePath);
|
|
| 147 |
+ return(false); |
|
| 148 |
+ } |
|
| 149 |
+ } |
|
| 150 |
+ else if(isGlobal) |
|
| 151 |
+ {
|
|
| 152 |
+ if(!this->dataList.addGlobalCodeSection(codeSection)) |
|
| 153 |
+ {
|
|
| 154 |
+ out << QString("ERROR: Reuse of global section name: \"%1\", found at line %2 in file: \"%3\"\n").arg(codeSection->getName()).arg(j + 1).arg(filePath);
|
|
| 155 |
+ return(false); |
|
| 156 |
+ } |
|
| 157 |
+ } |
|
| 158 |
+ |
|
| 159 |
+ if(line.length() == 0) |
|
| 160 |
+ {
|
|
| 161 |
+ continue; |
|
| 162 |
+ } |
|
| 163 |
+ |
|
| 164 |
+ offset = line.indexOf(QRegularExpression("\\s+"));
|
|
| 165 |
+ |
|
| 166 |
+ if(offset > 0) |
|
| 167 |
+ {
|
|
| 168 |
+ label = line.left(offset).trimmed(); |
|
| 169 |
+ } |
|
| 170 |
+ else |
|
| 171 |
+ {
|
|
| 172 |
+ label = line; |
|
| 173 |
+ } |
|
| 174 |
+ |
|
| 175 |
+ line = line.mid(label.length()).trimmed(); |
|
| 176 |
+ } |
|
| 177 |
+ else |
|
| 178 |
+ {
|
|
| 179 |
+ out << QString("ERROR: Syntax error at line %1 in file: \"%2\"\n").arg(j + 1).arg(filePath);
|
|
| 180 |
+ return(false); |
|
| 181 |
+ } |
|
| 182 |
+ } |
|
| 183 |
+ |
|
| 184 |
+ // Parse include |
|
| 185 |
+ if(!label.compare("include", Qt::CaseInsensitive))
|
|
| 186 |
+ {
|
|
| 187 |
+ QString tPath; |
|
| 188 |
+ |
|
| 189 |
+ if(QFileInfo(line).isAbsolute()) |
|
| 190 |
+ {
|
|
| 191 |
+ tPath = line; |
|
| 192 |
+ } |
|
| 193 |
+ else |
|
| 194 |
+ {
|
|
| 195 |
+ tPath = QFileInfo(QFileInfo(filePath).absolutePath().append("/").append(line)).absoluteFilePath();
|
|
| 196 |
+ } |
|
| 197 |
+ |
|
| 198 |
+ bool exists = false; |
|
| 199 |
+ |
|
| 200 |
+ for(int j = 0; j < this->dataList.size(); j++) |
|
| 201 |
+ {
|
|
| 202 |
+ if(this->dataList.at(j)->getFileName() == tPath) |
|
| 203 |
+ {
|
|
| 204 |
+ exists = true; |
|
| 205 |
+ break; |
|
| 206 |
+ } |
|
| 207 |
+ } |
|
| 208 |
+ |
|
| 209 |
+ if(!exists) |
|
| 210 |
+ {
|
|
| 211 |
+ for(const QString &fileFor : fileList) |
|
| 212 |
+ {
|
|
| 213 |
+ if(fileFor == tPath) |
|
| 214 |
+ {
|
|
| 215 |
+ exists = true; |
|
| 216 |
+ break; |
|
| 217 |
+ } |
|
| 218 |
+ } |
|
| 219 |
+ } |
|
| 220 |
+ |
|
| 221 |
+ if(!exists) |
|
| 222 |
+ {
|
|
| 223 |
+ fileList.append(tPath); |
|
| 224 |
+ } |
|
| 225 |
+ |
|
| 226 |
+ continue; |
|
| 227 |
+ } |
|
| 228 |
+ |
|
| 229 |
+ // Parse map |
|
| 230 |
+ if(!label.compare("map", Qt::CaseInsensitive))
|
|
| 231 |
+ {
|
|
| 232 |
+ if(this->dataList.getMode() != DataList::Mode::App) |
|
| 233 |
+ {
|
|
| 234 |
+ out << QString("ERROR: Special keyword \"map\" is not allowed in ROM mode, found at line %1 in file: \"%2\"\n").arg(j + 1).arg(filePath);
|
|
| 235 |
+ return(false); |
|
| 236 |
+ } |
|
| 237 |
+ |
|
| 238 |
+ QString tPath; |
|
| 239 |
+ |
|
| 240 |
+ if(QFileInfo(line).isAbsolute()) |
|
| 241 |
+ {
|
|
| 242 |
+ tPath = line; |
|
| 243 |
+ } |
|
| 244 |
+ else |
|
| 245 |
+ {
|
|
| 246 |
+ tPath = QFileInfo(QFileInfo(filePath).absolutePath().append("/").append(line)).absoluteFilePath();
|
|
| 247 |
+ } |
|
| 248 |
+ |
|
| 249 |
+ bool exists = false; |
|
| 250 |
+ |
|
| 251 |
+ for(int k = 0; k < this->dataList.size(); k++) |
|
| 252 |
+ {
|
|
| 253 |
+ if(this->dataList.at(k)->getFileName() == tPath) |
|
| 254 |
+ {
|
|
| 255 |
+ exists = true; |
|
| 256 |
+ break; |
|
| 257 |
+ } |
|
| 258 |
+ } |
|
| 259 |
+ |
|
| 260 |
+ if(!exists) |
|
| 261 |
+ {
|
|
| 262 |
+ for(const QString &mapFor : mapList) |
|
| 263 |
+ {
|
|
| 264 |
+ if(mapFor == tPath) |
|
| 265 |
+ {
|
|
| 266 |
+ exists = true; |
|
| 267 |
+ break; |
|
| 268 |
+ } |
|
| 269 |
+ } |
|
| 270 |
+ } |
|
| 271 |
+ |
|
| 272 |
+ if(!exists) |
|
| 273 |
+ {
|
|
| 274 |
+ mapList.append(tPath); |
|
| 275 |
+ } |
|
| 276 |
+ |
|
| 277 |
+ QFile file(tPath); |
|
| 278 |
+ QStringList lineList; |
|
| 279 |
+ |
|
| 280 |
+ if(!file.open(QIODevice::ReadOnly)) |
|
| 281 |
+ {
|
|
| 282 |
+ out << QString("ERROR: Cannot open file: \"%1\"\n").arg(tPath);
|
|
| 283 |
+ return(false); |
|
| 284 |
+ } |
|
| 285 |
+ |
|
| 286 |
+ while(!file.atEnd()) |
|
| 287 |
+ {
|
|
| 288 |
+ lineList.append(file.readLine().trimmed()); |
|
| 289 |
+ } |
|
| 290 |
+ |
|
| 291 |
+ file.close(); |
|
| 292 |
+ |
|
| 293 |
+ for(int j = 0; j < lineList.size(); j++) |
|
| 294 |
+ {
|
|
| 295 |
+ // Trimm line |
|
| 296 |
+ QString line = lineList.at(j); |
|
| 297 |
+ int offset = line.indexOf(QRegularExpression("(?<!\\\\);|^;"));
|
|
| 298 |
+ |
|
| 299 |
+ if(offset >= 0) |
|
| 300 |
+ {
|
|
| 301 |
+ line = line.left(offset).trimmed(); |
|
| 302 |
+ } |
|
| 303 |
+ |
|
| 304 |
+ if(line.length() <= 0) |
|
| 305 |
+ {
|
|
| 306 |
+ continue; |
|
| 307 |
+ } |
|
| 308 |
+ |
|
| 309 |
+ QStringList lineItems = line.split(QRegularExpression("\\s+"));
|
|
| 310 |
+ |
|
| 311 |
+ if(!this->parseMap(j, tPath, lineItems)) |
|
| 312 |
+ {
|
|
| 313 |
+ return(false); |
|
| 314 |
+ } |
|
| 315 |
+ } |
|
| 316 |
+ |
|
| 317 |
+ continue; |
|
| 318 |
+ } |
|
| 319 |
+ |
|
| 320 |
+ // Parse ram |
|
| 321 |
+ if(!label.compare("var", Qt::CaseInsensitive))
|
|
| 322 |
+ {
|
|
| 323 |
+ QSharedPointer<RamItem> ramItem = this->parseRam(j, line); |
|
| 324 |
+ |
|
| 325 |
+ if(!ramItem.isNull()) |
|
| 326 |
+ {
|
|
| 327 |
+ if(!data->addRamItem(ramItem)) |
|
| 328 |
+ {
|
|
| 329 |
+ out << QString("ERROR: Reuse of name: \"%1\", found at line %2 in file: \"%3\"\n").arg(ramItem->getName()).arg(j + 1).arg(filePath);
|
|
| 330 |
+ return(false); |
|
| 331 |
+ } |
|
| 332 |
+ |
|
| 333 |
+ if(isExternal) |
|
| 334 |
+ {
|
|
| 335 |
+ if(!this->dataList.addExternalRamItem(ramItem)) |
|
| 336 |
+ {
|
|
| 337 |
+ out << QString("ERROR: Reuse of external name: \"%1\", found at line %2 in file: \"%3\"\n").arg(ramItem->getName()).arg(j + 1).arg(filePath);
|
|
| 338 |
+ return(false); |
|
| 339 |
+ } |
|
| 340 |
+ } |
|
| 341 |
+ else if(isGlobal) |
|
| 342 |
+ {
|
|
| 343 |
+ if(!this->dataList.addGlobalRamItem(ramItem)) |
|
| 344 |
+ {
|
|
| 345 |
+ out << QString("ERROR: Reuse of global name: \"%1\", found at line %2 in file: \"%3\"\n").arg(ramItem->getName()).arg(j + 1).arg(filePath);
|
|
| 346 |
+ return(false); |
|
| 347 |
+ } |
|
| 348 |
+ } |
|
| 349 |
+ } |
|
| 350 |
+ else |
|
| 351 |
+ {
|
|
| 352 |
+ out << QString("ERROR: Syntax error at line %1 in file: \"%2\"\n").arg(j + 1).arg(filePath);
|
|
| 353 |
+ return(false); |
|
| 354 |
+ } |
|
| 355 |
+ |
|
| 356 |
+ continue; |
|
| 357 |
+ } |
|
| 358 |
+ |
|
| 359 |
+ // Parse flash |
|
| 360 |
+ if(!label.compare("const", Qt::CaseInsensitive))
|
|
| 361 |
+ {
|
|
| 362 |
+ QSharedPointer<FlashItem> flashItem = this->parseFlash(j, line); |
|
| 363 |
+ |
|
| 364 |
+ if(!flashItem.isNull()) |
|
| 365 |
+ {
|
|
| 366 |
+ if(!data->addFlashItem(flashItem)) |
|
| 367 |
+ {
|
|
| 368 |
+ out << QString("ERROR: Reuse of name: \"%1\", found at line %2 in file: \"%3\"\n").arg(flashItem->getName()).arg(j + 1).arg(filePath);
|
|
| 369 |
+ return(false); |
|
| 370 |
+ } |
|
| 371 |
+ |
|
| 372 |
+ if(isExternal) |
|
| 373 |
+ {
|
|
| 374 |
+ if(!this->dataList.addExternalFlashItem(flashItem)) |
|
| 375 |
+ {
|
|
| 376 |
+ out << QString("ERROR: Reuse of external name: \"%1\", found at line %2 in file: \"%3\"\n").arg(flashItem->getName()).arg(j + 1).arg(filePath);
|
|
| 377 |
+ return(false); |
|
| 378 |
+ } |
|
| 379 |
+ } |
|
| 380 |
+ else if(isGlobal) |
|
| 381 |
+ {
|
|
| 382 |
+ if(!this->dataList.addGlobalFlashItem(flashItem)) |
|
| 383 |
+ {
|
|
| 384 |
+ out << QString("ERROR: Reuse of global name: \"%1\", found at line %2 in file: \"%3\"\n").arg(flashItem->getName()).arg(j + 1).arg(filePath);
|
|
| 385 |
+ return(false); |
|
| 386 |
+ } |
|
| 387 |
+ } |
|
| 388 |
+ } |
|
| 389 |
+ else |
|
| 390 |
+ {
|
|
| 391 |
+ out << QString("ERROR: Syntax error at line %1 in file: \"%2\"\n").arg(j + 1).arg(filePath);
|
|
| 392 |
+ return(false); |
|
| 393 |
+ } |
|
| 394 |
+ |
|
| 395 |
+ continue; |
|
| 396 |
+ } |
|
| 397 |
+ |
|
| 398 |
+ // Parse code |
|
| 399 |
+ QSharedPointer<CodeItem> codeItem = this->parseCode(j, label, line); |
|
| 400 |
+ |
|
| 401 |
+ if(!codeItem.isNull()) |
|
| 402 |
+ {
|
|
| 403 |
+ codeSection->addCodeItem(codeItem); |
|
| 404 |
+ } |
|
| 405 |
+ else |
|
| 406 |
+ {
|
|
| 407 |
+ out << QString("ERROR: Syntax error at line %1 in file: \"%2\"\n").arg(j + 1).arg(filePath);
|
|
| 408 |
+ return(false); |
|
| 409 |
+ } |
|
| 410 |
+ } |
|
| 411 |
+ |
|
| 412 |
+ if(!data->addCodeSection(codeSection)) |
|
| 413 |
+ {
|
|
| 414 |
+ out << QString("ERROR: Reuse of section name: \"%1\", found in file: \"%2\"\n").arg(codeSection->getName(), filePath);
|
|
| 415 |
+ return(false); |
|
| 416 |
+ } |
|
| 417 |
+ |
|
| 418 |
+ this->dataList.append(data); |
|
| 419 |
+ } |
|
| 420 |
+ |
|
| 421 |
+ return(true); |
|
| 422 |
+} |
|
| 423 |
+ |
|
| 424 |
+/** |
|
| 425 |
+ * Parse a map |
|
| 426 |
+ * |
|
| 427 |
+ * @param i Line number |
|
| 428 |
+ * @param mapPath Path to the map file |
|
| 429 |
+ * @param lineItems List of the line items |
|
| 430 |
+ * |
|
| 431 |
+ * @return Status of parsing the map |
|
| 432 |
+ */ |
|
| 433 |
+bool Parser::parseMap(int i, const QString &mapPath, const QStringList &lineItems) |
|
| 434 |
+{
|
|
| 435 |
+ QTextStream out(stdout); |
|
| 436 |
+ |
|
| 437 |
+ QString name; |
|
| 438 |
+ unsigned int address; |
|
| 439 |
+ QString tAddress; |
|
| 440 |
+ |
|
| 441 |
+ if(lineItems.size() == 3) |
|
| 442 |
+ {
|
|
| 443 |
+ name = lineItems.at(0); |
|
| 444 |
+ tAddress = lineItems.at(2); |
|
| 445 |
+ |
|
| 446 |
+ if((name.left(1) == ".") && (lineItems.at(1) == "=")) |
|
| 447 |
+ {
|
|
| 448 |
+ if(name.mid(1).contains(QRegularExpression("^([0-9a-zA-Z_-]+)$")))
|
|
| 449 |
+ {
|
|
| 450 |
+ if(tAddress.contains(QRegularExpression("^(0x[0-9abcdefABCDEF]+)$")))
|
|
| 451 |
+ {
|
|
| 452 |
+ bool tOk; |
|
| 453 |
+ address = tAddress.midRef(2).toUInt(&tOk, 16); |
|
| 454 |
+ |
|
| 455 |
+ if(tOk) |
|
| 456 |
+ {
|
|
| 457 |
+ if(address < Data::MEMORY_SIZE) |
|
| 458 |
+ {
|
|
| 459 |
+ QSharedPointer<CodeSection> codeSection(new CodeSection(name)); |
|
| 460 |
+ codeSection->setAddress(address); |
|
| 461 |
+ |
|
| 462 |
+ if(!this->dataList.addExternalCodeSection(codeSection)) |
|
| 463 |
+ {
|
|
| 464 |
+ out << QString("ERROR: Reuse of external section name: \"%1\", found at line %2 in file: \"%3\"\n").arg(name).arg(i + 1).arg(mapPath);
|
|
| 465 |
+ return(false); |
|
| 466 |
+ } |
|
| 467 |
+ |
|
| 468 |
+ return(true); |
|
| 469 |
+ } |
|
| 470 |
+ } |
|
| 471 |
+ } |
|
| 472 |
+ } |
|
| 473 |
+ } |
|
| 474 |
+ } |
|
| 475 |
+ else if(lineItems.size() == 5) |
|
| 476 |
+ {
|
|
| 477 |
+ name = lineItems.at(2); |
|
| 478 |
+ tAddress = lineItems.at(4); |
|
| 479 |
+ |
|
| 480 |
+ if((!lineItems.at(0).compare("external", Qt::CaseInsensitive)) && (lineItems.at(3) == "="))
|
|
| 481 |
+ {
|
|
| 482 |
+ if(name.contains(QRegularExpression("^([0-9a-zA-Z_-]+)$")))
|
|
| 483 |
+ {
|
|
| 484 |
+ if(tAddress.contains(QRegularExpression("^(0x[0-9abcdefABCDEF]+)$")))
|
|
| 485 |
+ {
|
|
| 486 |
+ bool tOk; |
|
| 487 |
+ address = tAddress.midRef(2).toUInt(&tOk, 16); |
|
| 488 |
+ |
|
| 489 |
+ if(tOk) |
|
| 490 |
+ {
|
|
| 491 |
+ if(address < Data::MEMORY_SIZE) |
|
| 492 |
+ {
|
|
| 493 |
+ if(!lineItems.at(1).compare("var", Qt::CaseInsensitive))
|
|
| 494 |
+ {
|
|
| 495 |
+ QSharedPointer<RamItem> ramItem(new RamItem(0, name, "")); |
|
| 496 |
+ ramItem->setAddress(address); |
|
| 497 |
+ |
|
| 498 |
+ if(!this->dataList.addExternalRamItem(ramItem)) |
|
| 499 |
+ {
|
|
| 500 |
+ out << QString("ERROR: Reuse of external section name: \"%1\", found at line %2 in file: \"%3\"\n").arg(name).arg(i + 1).arg(mapPath);
|
|
| 501 |
+ return(false); |
|
| 502 |
+ } |
|
| 503 |
+ } |
|
| 504 |
+ else if(!lineItems.at(1).compare("const", Qt::CaseInsensitive))
|
|
| 505 |
+ {
|
|
| 506 |
+ QSharedPointer<FlashItem> flashItem(new FlashItem(0, name, QList<QString>())); |
|
| 507 |
+ flashItem->setAddress(address); |
|
| 508 |
+ |
|
| 509 |
+ if(!this->dataList.addExternalFlashItem(flashItem)) |
|
| 510 |
+ {
|
|
| 511 |
+ out << QString("ERROR: Reuse of external section name: \"%1\", found at line %2 in file: \"%3\"\n").arg(name).arg(i + 1).arg(mapPath);
|
|
| 512 |
+ return(false); |
|
| 513 |
+ } |
|
| 514 |
+ } |
|
| 515 |
+ |
|
| 516 |
+ return(true); |
|
| 517 |
+ } |
|
| 518 |
+ } |
|
| 519 |
+ } |
|
| 520 |
+ } |
|
| 521 |
+ } |
|
| 522 |
+ } |
|
| 523 |
+ |
|
| 524 |
+ out << QString("ERROR: Syntax error at line %1 in file: \"%2\"\n").arg(i + 1).arg(mapPath);
|
|
| 525 |
+ |
|
| 526 |
+ return(false); |
|
| 527 |
+} |
|
| 528 |
+ |
|
| 529 |
+/** |
|
| 530 |
+ * Parse a variable line |
|
| 531 |
+ * |
|
| 532 |
+ * @param i Line number |
|
| 533 |
+ * @param line Line raw data |
|
| 534 |
+ * |
|
| 535 |
+ * @return RAM Item object |
|
| 536 |
+ */ |
|
| 537 |
+QSharedPointer<RamItem> Parser::parseRam(int i, QString &line) |
|
| 538 |
+{
|
|
| 539 |
+ QSharedPointer<RamItem> ramItem(nullptr); |
|
| 540 |
+ bool parseError = false; |
|
| 541 |
+ |
|
| 542 |
+ QString name; |
|
| 543 |
+ QString arraySize; |
|
| 544 |
+ |
|
| 545 |
+ if(line.length() == 0) |
|
| 546 |
+ {
|
|
| 547 |
+ parseError = true; |
|
| 548 |
+ } |
|
| 549 |
+ |
|
| 550 |
+ if(line.contains(QRegularExpression("^([a-zA-Z0-9_-]+)$")))
|
|
| 551 |
+ {
|
|
| 552 |
+ name = line.trimmed(); |
|
| 553 |
+ } |
|
| 554 |
+ else if(line.contains(QRegularExpression(R"(^([a-zA-Z0-9_-]+)\[([0-9]+)\]$)"))) |
|
| 555 |
+ {
|
|
| 556 |
+ int offset = line.indexOf("[");
|
|
| 557 |
+ |
|
| 558 |
+ name = line.left(offset).trimmed(); |
|
| 559 |
+ arraySize = line.mid((offset + 1), (line.length() - offset - 2)); |
|
| 560 |
+ } |
|
| 561 |
+ else |
|
| 562 |
+ {
|
|
| 563 |
+ parseError = true; |
|
| 564 |
+ } |
|
| 565 |
+ |
|
| 566 |
+ if(!parseError) |
|
| 567 |
+ {
|
|
| 568 |
+ ramItem.reset(new RamItem((i + 1), name, arraySize)); |
|
| 569 |
+ } |
|
| 570 |
+ |
|
| 571 |
+ return(ramItem); |
|
| 572 |
+} |
|
| 573 |
+ |
|
| 574 |
+/** |
|
| 575 |
+ * Parse a const line |
|
| 576 |
+ * |
|
| 577 |
+ * @param i Line number |
|
| 578 |
+ * @param line Line raw data |
|
| 579 |
+ * |
|
| 580 |
+ * @return Flash Item object |
|
| 581 |
+ */ |
|
| 582 |
+QSharedPointer<FlashItem> Parser::parseFlash(int i, QString &line) |
|
| 583 |
+{
|
|
| 584 |
+ QSharedPointer<FlashItem> flashItem(nullptr); |
|
| 585 |
+ bool parseError = false; |
|
| 586 |
+ |
|
| 587 |
+ QString name; |
|
| 588 |
+ QStringList valueList; |
|
| 589 |
+ |
|
| 590 |
+ int offset = line.indexOf(QRegularExpression("\\s+"));
|
|
| 591 |
+ |
|
| 592 |
+ if(offset > 0) |
|
| 593 |
+ {
|
|
| 594 |
+ name = line.left(offset).trimmed(); |
|
| 595 |
+ line = line.mid(name.length()).trimmed(); |
|
| 596 |
+ |
|
| 597 |
+ if(line.length() > 0) |
|
| 598 |
+ {
|
|
| 599 |
+ valueList = line.split(QRegularExpression(R"((?<!\\),)")); |
|
| 600 |
+ } |
|
| 601 |
+ |
|
| 602 |
+ if(valueList.empty()) |
|
| 603 |
+ {
|
|
| 604 |
+ parseError = true; |
|
| 605 |
+ } |
|
| 606 |
+ } |
|
| 607 |
+ else |
|
| 608 |
+ {
|
|
| 609 |
+ parseError = true; |
|
| 610 |
+ } |
|
| 611 |
+ |
|
| 612 |
+ if(!parseError) |
|
| 613 |
+ {
|
|
| 614 |
+ for(int i = 0; i < valueList.size(); i++) |
|
| 615 |
+ {
|
|
| 616 |
+ QString value = valueList.at(i); |
|
| 617 |
+ value = value.remove(QRegularExpression(R"((?<!\\)\\)")).trimmed(); |
|
| 618 |
+ |
|
| 619 |
+ valueList.replace(i, value); |
|
| 620 |
+ |
|
| 621 |
+ if(valueList.at(i).length() == 0) |
|
| 622 |
+ {
|
|
| 623 |
+ parseError = true; |
|
| 624 |
+ break; |
|
| 625 |
+ } |
|
| 626 |
+ } |
|
| 627 |
+ |
|
| 628 |
+ if(!parseError) |
|
| 629 |
+ {
|
|
| 630 |
+ flashItem.reset(new FlashItem((i + 1), name, valueList)); |
|
| 631 |
+ } |
|
| 632 |
+ } |
|
| 633 |
+ |
|
| 634 |
+ return(flashItem); |
|
| 635 |
+} |
|
| 636 |
+ |
|
| 637 |
+/** |
|
| 638 |
+ * Parse a code line |
|
| 639 |
+ * |
|
| 640 |
+ * @param i Line number |
|
| 641 |
+ * @param label Name of the label |
|
| 642 |
+ * @param line Line raw data |
|
| 643 |
+ * |
|
| 644 |
+ * @return Code Item object |
|
| 645 |
+ */ |
|
| 646 |
+QSharedPointer<CodeItem> Parser::parseCode(int i, const QString &label, QString &line) |
|
| 647 |
+{
|
|
| 648 |
+ QSharedPointer<CodeItem> codeItem(nullptr); |
|
| 649 |
+ bool parseError = false; |
|
| 650 |
+ |
|
| 651 |
+ QStringList paramList; |
|
| 652 |
+ |
|
| 653 |
+ if(line.length() > 0) |
|
| 654 |
+ {
|
|
| 655 |
+ paramList = line.split(QRegularExpression("(?<!\\\\),"));
|
|
| 656 |
+ } |
|
| 657 |
+ |
|
| 658 |
+ for(int i = 0; i < paramList.length(); i++) |
|
| 659 |
+ {
|
|
| 660 |
+ paramList.replace(i, paramList.at(i).trimmed()); |
|
| 661 |
+ |
|
| 662 |
+ if(paramList.at(i).isEmpty()) |
|
| 663 |
+ {
|
|
| 664 |
+ parseError = true; |
|
| 665 |
+ break; |
|
| 666 |
+ } |
|
| 667 |
+ } |
|
| 668 |
+ |
|
| 669 |
+ if(!parseError) |
|
| 670 |
+ {
|
|
| 671 |
+ for(int i = 0; i < paramList.length(); i++) |
|
| 672 |
+ {
|
|
| 673 |
+ if(paramList.at(i).at(0) != "'") |
|
| 674 |
+ {
|
|
| 675 |
+ paramList.replace(i, paramList.at(i)); |
|
| 676 |
+ } |
|
| 677 |
+ else |
|
| 678 |
+ {
|
|
| 679 |
+ paramList.replace(i, QString(paramList.at(i)).remove(QRegularExpression(R"((?<!\\)\\)")).trimmed()); |
|
| 680 |
+ } |
|
| 681 |
+ } |
|
| 682 |
+ |
|
| 683 |
+ codeItem.reset(new CodeItem((i + 1), label, paramList)); |
|
| 684 |
+ } |
|
| 685 |
+ |
|
| 686 |
+ return(codeItem); |
|
| 687 |
+} |
| 0 | 688 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,49 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef PARSER_H |
|
| 13 |
+#define PARSER_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+#include <QStringList> |
|
| 17 |
+#include <QTextStream> |
|
| 18 |
+#include <QList> |
|
| 19 |
+#include <QRegularExpression> |
|
| 20 |
+#include <QFile> |
|
| 21 |
+#include <QFileInfo> |
|
| 22 |
+#include <QSharedPointer> |
|
| 23 |
+ |
|
| 24 |
+#include "codeitem.h" |
|
| 25 |
+#include "codesection.h" |
|
| 26 |
+#include "ramitem.h" |
|
| 27 |
+#include "flashitem.h" |
|
| 28 |
+#include "data.h" |
|
| 29 |
+#include "datalist.h" |
|
| 30 |
+ |
|
| 31 |
+//! This class parses all input source files for later compilation process |
|
| 32 |
+class Parser |
|
| 33 |
+{
|
|
| 34 |
+ public: |
|
| 35 |
+ Parser(DataList &dataList); |
|
| 36 |
+ |
|
| 37 |
+ bool parseFile(const QString &path); |
|
| 38 |
+ |
|
| 39 |
+ private: |
|
| 40 |
+ DataList &dataList; //!< List of data for each source file |
|
| 41 |
+ |
|
| 42 |
+ bool parseMap(int i, const QString &mapPath, const QStringList &lineItems); |
|
| 43 |
+ |
|
| 44 |
+ QSharedPointer<RamItem> parseRam(int i, QString &line); |
|
| 45 |
+ QSharedPointer<FlashItem> parseFlash(int i, QString &line); |
|
| 46 |
+ QSharedPointer<CodeItem> parseCode(int i, const QString &label, QString &line); |
|
| 47 |
+}; |
|
| 48 |
+ |
|
| 49 |
+#endif |
| 0 | 50 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,99 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#include "ramitem.h" |
|
| 13 |
+ |
|
| 14 |
+/** |
|
| 15 |
+ * Constructor for creating a RAM item |
|
| 16 |
+ * |
|
| 17 |
+ * @param line Line number in the source file |
|
| 18 |
+ * @param name Name of the variable |
|
| 19 |
+ * @param arraySize Array size in a raw form |
|
| 20 |
+ */ |
|
| 21 |
+RamItem::RamItem(int line, const QString &name, const QString &arraySize) |
|
| 22 |
+{
|
|
| 23 |
+ this->line = line; |
|
| 24 |
+ this->name = name; |
|
| 25 |
+ this->arraySize = arraySize; |
|
| 26 |
+ |
|
| 27 |
+ this->dataSize = 0; |
|
| 28 |
+ this->address = 0; |
|
| 29 |
+} |
|
| 30 |
+ |
|
| 31 |
+/** |
|
| 32 |
+ * Get the line number where the variable occurred |
|
| 33 |
+ * |
|
| 34 |
+ * @return Line number in the source file |
|
| 35 |
+ */ |
|
| 36 |
+int RamItem::getLine() const |
|
| 37 |
+{
|
|
| 38 |
+ return(this->line); |
|
| 39 |
+} |
|
| 40 |
+ |
|
| 41 |
+/** |
|
| 42 |
+ * Get the name of the variable |
|
| 43 |
+ * |
|
| 44 |
+ * @return Name of the variable |
|
| 45 |
+ */ |
|
| 46 |
+const QString &RamItem::getName() const |
|
| 47 |
+{
|
|
| 48 |
+ return(this->name); |
|
| 49 |
+} |
|
| 50 |
+ |
|
| 51 |
+/** |
|
| 52 |
+ * Get the variable size in a raw form |
|
| 53 |
+ * |
|
| 54 |
+ * @return Variable size in a raw form |
|
| 55 |
+ */ |
|
| 56 |
+const QString &RamItem::getArraySize() const |
|
| 57 |
+{
|
|
| 58 |
+ return(this->arraySize); |
|
| 59 |
+} |
|
| 60 |
+ |
|
| 61 |
+/** |
|
| 62 |
+ * Set the size of the variable |
|
| 63 |
+ * |
|
| 64 |
+ * @param size Size of the variable |
|
| 65 |
+ */ |
|
| 66 |
+void RamItem::setDataSize(unsigned int size) |
|
| 67 |
+{
|
|
| 68 |
+ this->dataSize = size; |
|
| 69 |
+} |
|
| 70 |
+ |
|
| 71 |
+/** |
|
| 72 |
+ * Get the size of the variable |
|
| 73 |
+ * |
|
| 74 |
+ * @return Size of the variable |
|
| 75 |
+ */ |
|
| 76 |
+unsigned int RamItem::getDataSize() const |
|
| 77 |
+{
|
|
| 78 |
+ return(this->dataSize); |
|
| 79 |
+} |
|
| 80 |
+ |
|
| 81 |
+/** |
|
| 82 |
+ * Set the address in the memory |
|
| 83 |
+ * |
|
| 84 |
+ * @param address Address in the memory |
|
| 85 |
+ */ |
|
| 86 |
+void RamItem::setAddress(unsigned int address) |
|
| 87 |
+{
|
|
| 88 |
+ this->address = address; |
|
| 89 |
+} |
|
| 90 |
+ |
|
| 91 |
+/** |
|
| 92 |
+ * Get the address in the memory |
|
| 93 |
+ * |
|
| 94 |
+ * @return Address in the memory |
|
| 95 |
+ */ |
|
| 96 |
+unsigned int RamItem::getAddress() const |
|
| 97 |
+{
|
|
| 98 |
+ return(this->address); |
|
| 99 |
+} |
| 0 | 100 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,42 @@ |
| 1 |
+/* |
|
| 2 |
+ * Author: Pawel Jablonski |
|
| 3 |
+ * E-mail: pj@xirx.net |
|
| 4 |
+ * WWW: xirx.net |
|
| 5 |
+ * GIT: git.xirx.net |
|
| 6 |
+ * |
|
| 7 |
+ * License: You can use this code however you like |
|
| 8 |
+ * but leave information about the original author. |
|
| 9 |
+ * Code is free for non-commercial and commercial use. |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+#ifndef RAMITEM_H |
|
| 13 |
+#define RAMITEM_H |
|
| 14 |
+ |
|
| 15 |
+#include <QString> |
|
| 16 |
+ |
|
| 17 |
+//! This class contains a one non-initialized read-write data item stored in the ram |
|
| 18 |
+class RamItem |
|
| 19 |
+{
|
|
| 20 |
+ public: |
|
| 21 |
+ RamItem(int line, const QString &name, const QString &arraySize); |
|
| 22 |
+ |
|
| 23 |
+ int getLine() const; |
|
| 24 |
+ const QString &getName() const; |
|
| 25 |
+ const QString &getArraySize() const; |
|
| 26 |
+ |
|
| 27 |
+ void setDataSize(unsigned int size); |
|
| 28 |
+ unsigned int getDataSize() const; |
|
| 29 |
+ |
|
| 30 |
+ void setAddress(unsigned int address); |
|
| 31 |
+ unsigned int getAddress() const; |
|
| 32 |
+ |
|
| 33 |
+ private: |
|
| 34 |
+ int line; //!< Line number from the source file |
|
| 35 |
+ QString name; //!< Name of the data item |
|
| 36 |
+ QString arraySize; //!< Data size in raw text format |
|
| 37 |
+ |
|
| 38 |
+ unsigned int dataSize; //!< Data size |
|
| 39 |
+ unsigned int address; //!< Address in memory after linking |
|
| 40 |
+}; |
|
| 41 |
+ |
|
| 42 |
+#endif |