diff --git a/LICENSE.txt b/LICENSE.txt
index 9675216..344804e 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -14,10 +14,6 @@ The Python package is distributed under the terms of the PYTHON
LICENSE AGREEMENT, included in the file PYTHON_LICENSE.txt in the
qtools/open-source subdirectory.
-The TCL/TK package is distributed under the terms of the TCL
-LICENSE AGREEMENT, included in the file TCL_LICENSE.txt in the
-qtools/open-source subdirectory.
-
The LMFlash utility for Windows is is distributed under the terms
of the LMFlash license, included in the file LMFlash_LICENSE.rtf
in the qtools/open-source subdirectory. Specifically, the LMFlash
diff --git a/README.md b/README.md
index cd15a9c..c234aa2 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ at: https://www.state-machine.com/qtools/
# About QTools
QTools is a collection of various open source tools for working with the
[QP Real-Time Embedded Frameworks (RTEFs)][QP] on desktop platforms, such
-as Windows, Linux, and Mac OS X.
+as Windows, Linux, and macOS.
The following open-source tools are currently provided (NOTE: tools
starting with 'q' are contributed by Quantum Leaps)
@@ -28,15 +28,15 @@ starting with 'q' are contributed by Quantum Leaps)
real-time data from embedded targets running the QS
software tracing.
-2. qutest - Tcl extension of the QSPY host application for **uint testing**
+2. qutest - Python extension of the QSPY host application for **uint testing**
specifically designed for embedded systems, but also supports
unit testing of embedded code on host computers
("dual targeting").
-3. qspyview - Tcl/Tk extension of the QSPY host application for
+3. qview - Python extension of the QSPY host application for
visualization and monitoring of the QS real-time tracing
- data from embedded targets at real-time. QSpyView enables
- developers to rapidly build both GUI-based and "headless"
+ data from embedded targets at real-time. QView enables
+ developers to quickly build both GUI-based and "headless"
scripts for their specific applications.
4. qwin - QWIN GUI toolkit for prototyping embedded systems on
@@ -50,9 +50,7 @@ starting with 'q' are contributed by Quantum Leaps)
6. qfsgen - for generating ROM-based file systems to be used
in embedded web pages served by the HTTP server
-7. qcalc - programmer's calculator with C-syntax expressions
-
-8. Unity - traditional unit testing harness (framework) for embedded C
+7. Unity - traditional unit testing harness (framework) for embedded C
(version 2.4.3)
Additionally, QTools for Windows contains the following open-source,
@@ -64,13 +62,9 @@ Additionally, QTools for Windows contains the following open-source,
12. GNU C/C++ toolset for ARM-EABI (GCC version 9.2.1)
-13. Python for Windows (32-bit version 3.8.0 for x86)
-
-14. Tcl/Tk for Windows (32-bit version 8.6) with UDP sockets extension
+13. Python for Windows (version 3.8.5 32-bit)
-15. ResEdit utility (32-bit version 1.6.6-x64)
-
-16. LMFlash for Windows (32-bit build 1613)
+14. LMFlash for Windows (32-bit build 1613)
---------------------------------------------------------------------------
@@ -108,7 +102,7 @@ installation directory of QTools.
--------------------
-## QTools on Linux/MacOS
+## QTools on Linux/macOS
On Linux/MacOS, installation of QTools consists of unzipping the
`qtools-posix_.zip` archive into a directory of your choice,
although the recommended default is `~/qp`.
@@ -143,45 +137,12 @@ The Python package is distributed under the terms of the PYTHON LICENSE
AGREEMENT, included in the file PYTHON_LICENSE.txt in the licenses/
subdirectory of the QTools distribution.
-The TCL/TK package is distributed under the terms of the TCL LICENSE
-AGREEMENT, included in the file TCL_LICENSE.txt in the licenses/
-subdirectory of the QTools distribution.
-
The LMFlash utility for Windows is is distributed under the terms of the
LMFlash license, included in the file LMFlash_LICENSE.rtf in the licenses/
subdirectory of the QTools distribution. Specifically, the LMFlash utility
is distributed according to Section 2a "Demonstration License".
----------------------------------------------------------------------------
-# Documentation
-The links to the documentation of the tools are provided in the
-`\doc\` directory.
-
-### QUTest Python Scripting Support
-The QUTest Python scripting support for the QSPY utility are located in the
-`\qspy\py\` directory.
-
-### QUTest Tcl Scripting Support
-The QUTest Tcl scripting support for the QSPY utility are located in the
-`\qspy\tcl\` directory.
-
-A web-link to the TCL/TK documentation is provided in the shortcut
-[tcl_tk_8.6](https://www.tcl.tk/man/tcl8.6/).
-
-### QSPYView Tcl/Tk Scripts
-The QSpyView Tcl/Tk scripts for the QSPY utility are located in the
-`\qspy\tcl\` directory.
-
-### QSPY Matlab Scripts
-The Matlab/GNU Octave scripts for the QSPY utility are located in the
-`\qspy\matlab\` directory.
-
-### Unity Unit Testing Framework
-The documentation of the Unity Testing Framework for Embedded C is
-located in the `\unity\doc\` directory.
-
-
---------------------------------------------------------------------------
# Source Code
In compliance with GPL, this distribution contains the source code for
diff --git a/bin/python.bat b/bin/python3.bat
similarity index 100%
rename from bin/python.bat
rename to bin/python3.bat
diff --git a/bin/pythonw.bat b/bin/pythonw.bat
deleted file mode 100644
index eb34966..0000000
--- a/bin/pythonw.bat
+++ /dev/null
@@ -1 +0,0 @@
-%~dp0..\Python38\pythonw.exe %1 %2 %3 %4 %5 %6 %7 %8
\ No newline at end of file
diff --git a/bin/qcalc.tcl b/bin/qcalc.tcl
deleted file mode 100644
index 7e416a8..0000000
--- a/bin/qcalc.tcl
+++ /dev/null
@@ -1,232 +0,0 @@
-#-----------------------------------------------------------------------------
-# Product: QCalc -- Desktop Calculator with C syntax and hex/binary displays
-# Last updated for version 6.6.0
-# Last updated on 2019-07-30
-#
-# Q u a n t u m L e a P s
-# ---------------------------
-# innovating embedded systems
-#
-# Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved.
-#
-# This program is open source software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-# Documentation:
-# https://www.state-machine.com/qtools/qcalc.html
-#
-# Contact information:
-# www.state-machine.com
-# info@state-machine.com
-#-----------------------------------------------------------------------------
-
-# the input and answer variables
-set input 0
-set ans 0
-set var x
-
-# history of inputs...
-array set history {
- 0 ""
- 1 ""
- 2 ""
- 3 ""
- 4 ""
- 5 ""
- 6 ""
- 7 ""
-}
-set history_max 8
-set history_len 0
-set history_idx 0
-
-# binary constants...
-set 0000 0
-set 0001 1
-set 0010 2
-set 0011 3
-set 0100 4
-set 0101 5
-set 0110 6
-set 0111 7
-set 1000 8
-set 1001 9
-set 1010 10
-set 1011 11
-set 1100 12
-set 1101 13
-set 1110 14
-set 1111 15
-set 0 0
-set 1 1
-set 10 2
-set 11 3
-set 100 4
-set 101 5
-set 110 6
-set 111 7
-
-# the pi constant
-set pi [expr acos(0)*2.0]
-
-#-----------------------------------------------------------------------------
-# callbacks...
-proc onEnter {} {
- global input ans var
-
- if {[string first {=} $input] == 0} { ;# variable assignment?
- if {$ans == ""} {
- report_error "no value for a variable"
- } else {
- set var [string range $input 1 end]
- set var [string trim $var]
- if {[regexp {^[_a-zA-Z][_a-zA-Z0-9]*$} $var]} {
- if {[catch {uplevel 1 {set $var $ans}} msg]} {
- report_error $msg
- } else {
- history_add $input
- }
- } else {
- report_error "incorrect variable name"
- }
- }
- } elseif {[catch {uplevel 1 {expr $input}} ans]} { ;# expression
- report_error $ans
- } else {
- history_add $input
-
- if {[catch {expr int($ans) & 0xFFFFFFFF} ans_int]} {
- .ans.hex configure -text "> MAX_INT"
- .ans_bin configure -text "> MAX_INT"
- } elseif {$ans == [expr floor($ans)]} {
- set ans $ans_int
- set int0 [expr $ans_int& 0xFFFF]
- set int1 [expr ($ans_int>> 16) & 0xFFFF]
- .ans.hex configure -text [format "0x%04X,%04X" $int1 $int0]
-
- set byte0 [dec2bin [expr $ans_int & 0xFF]]
- set byte1 [dec2bin [expr ($ans_int >> 8) & 0xFF]]
- set byte2 [dec2bin [expr ($ans_int >> 16) & 0xFF]]
- set byte3 [dec2bin [expr ($ans_int >> 24) & 0xFF]]
- .ans_bin configure -text "0b$byte3,$byte2,$byte1,$byte0"
- } else {
- .ans.hex configure -text ""
- .ans_bin configure -text ""
- }
- }
-
- .ans.dec configure -text $ans
-}
-#.............................................................................
-proc onUp {} {
- global input history history_len history_idx
- if {$history_len > 0} {
- incr history_idx
- if {$history_idx > [expr $history_len - 1]} {
- set history_idx [expr $history_len - 1]
- }
- set input $history($history_idx)
- #.ans.dec configure -text ""
- #.ans.hex configure -text ""
- #.ans_bin configure -text ""
- }
-}
-#.............................................................................
-proc onDown {} {
- global input history history_len history_idx
- if {$history_len > 0} {
- incr history_idx -1
- if {$history_idx < 0} {
- set history_idx 0
- }
- set input $history($history_idx)
- #.ans.dec configure -text ""
- #.ans.hex configure -text ""
- #.ans_bin configure -text ""
- }
-}
-
-#-----------------------------------------------------------------------------
-# helpers...
-
-proc history_add {inp} {
- global input history history_len history_idx history_max
- if {$history($history_idx) != $inp} {
- incr history_len
- if {$history_len > $history_max} {
- set history_len $history_max
- }
- for {set i [expr $history_len - 1]} {$i > 0} {incr i -1} {
- set history($i) $history([expr $i - 1])
- }
- set history(0) $inp
- set history_idx 0
- }
-}
-#.............................................................................
-proc dec2bin {int} {
- set binRep [binary format c $int]
- binary scan $binRep B* binStr
- return $binStr
-}
-#.............................................................................
-proc report_error {msg} {
- global ans
- set ans ""
- .ans.dec configure -text Error
- .ans.hex configure -text ""
- .ans_bin configure -text $msg
-}
-
-#-----------------------------------------------------------------------------
-# QCalc GUI...
-
-wm title . "state-machine.com/qtools/qcalc.html"
-wm iconname . "QCalc"
-
-option add *inxFont -*-courier-medium-r-normal--*-160-* startupFile
-set inx_font [option get . inxFont InxFont]
-option add *Label*font $inx_font startupFile
-option add *Button*font $inx_font startupFile
-option add *Entry.font $inx_font startupFile
-option add *Entry.background white startupFile
-
-frame .entry -borderwidth 3 -relief raised
-entry .entry.inp -xscrollcommand ".entry.scrl set" -textvariable input
-
-scrollbar .entry.scrl -relief sunken -orient horiz \
--command ".entry.inp xview"
-bind .entry.inp { onEnter }
-bind .entry.inp { onUp }
-bind .entry.inp { onDown }
-pack .entry.inp -side top -fill x -expand 1
-pack .entry.scrl -side top -fill x -expand 1
-pack .entry -side top -fill x -expand 1
-
-frame .ans -borderwidth 1
-label .ans.dec -relief sunken -width 25 -anchor w -text ""
-label .ans.hex -relief sunken -width 11 -anchor e -text ""
-pack .ans.dec -side left -padx 1 -pady 1 -fill x -expand 1
-pack .ans.hex -side left -padx 1 -pady 1 -fill x -expand 1
-pack .ans -side top -padx 1 -pady 1 -fill x -expand 1
-
-label .ans_bin -relief sunken -width 36 -anchor e -text ""
-pack .ans_bin -side top -padx 2 -pady 2 -fill x -expand 1
-
-focus .entry.inp
-
-onEnter
-
-update idletasks
-wm minsize . [winfo reqwidth .] [winfo reqheight .]
-wm resizable . true false
diff --git a/bin/qclean b/bin/qclean
index 643cbce..e2fb16a 100644
Binary files a/bin/qclean and b/bin/qclean differ
diff --git a/bin/qfsgen b/bin/qfsgen
new file mode 100644
index 0000000..1427e24
Binary files /dev/null and b/bin/qfsgen differ
diff --git a/bin/qspy b/bin/qspy
new file mode 100644
index 0000000..ebf39b4
Binary files /dev/null and b/bin/qspy differ
diff --git a/bin/tclsh.bat b/bin/tclsh.bat
deleted file mode 100644
index 4fb135c..0000000
--- a/bin/tclsh.bat
+++ /dev/null
@@ -1 +0,0 @@
-%~dp0..\tcl_8.6\bin\tclsh86.exe %1 %2 %3 %4 %5 %6 %7 %8
\ No newline at end of file
diff --git a/bin/wish.bat b/bin/wish.bat
deleted file mode 100644
index 92b376d..0000000
--- a/bin/wish.bat
+++ /dev/null
@@ -1 +0,0 @@
-%~dp0..\tcl_8.6\bin\wish86.exe %1 %2 %3 %4 %5 %6 %7 %8
\ No newline at end of file
diff --git a/doxygen/Doxyfile b/doxygen/Doxyfile
index 5e709b2..18f3ac8 100644
--- a/doxygen/Doxyfile
+++ b/doxygen/Doxyfile
@@ -1,825 +1,118 @@
# Doxyfile 1.8.18
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed in
-# front of the TAG it is preceding.
-#
-# All text after a single hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists, items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (\" \").
-
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the configuration
-# file that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
-# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
-# The default value is: UTF-8.
-
DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
-# double-quotes, unless you are using Doxywizard) that should identify the
-# project for which the documentation is generated. This name is used in the
-# title of most generated pages and in a few other places.
-# The default value is: My Project.
-
PROJECT_NAME = "QTools"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
-# could be handy for archiving the generated documentation or if some version
-# control system is used.
-
-PROJECT_NUMBER = "6.8.2"
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
-# quick idea about the purpose of the project. Keep the description short.
-
+PROJECT_NUMBER = "6.9.0"
PROJECT_BRIEF =
-
-# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
-# in the documentation. The maximum height of the logo should not exceed 55
-# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
-# the logo to the output directory.
-
PROJECT_LOGO = images/header_logo_ql.png
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
-# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
-# left blank the current directory will be used.
-
OUTPUT_DIRECTORY =
-
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
-# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
-# The default value is: NO.
-
CREATE_SUBDIRS = NO
-
-# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
-# characters to appear in the names of generated files. If set to NO, non-ASCII
-# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
-# U+3044.
-# The default value is: NO.
-
ALLOW_UNICODE_NAMES = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
-# The default value is: English.
-
OUTPUT_LANGUAGE = English
-
-# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all generated output in the proper direction.
-# Possible values are: None, LTR, RTL and Context.
-# The default value is: None.
-
OUTPUT_TEXT_DIRECTION = None
-
-# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
-# descriptions after the members that are listed in the file and class
-# documentation (similar to Javadoc). Set to NO to disable this.
-# The default value is: YES.
-
BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
-# description of a member or function before the detailed description
-#
-# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-# The default value is: YES.
-
REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator that is
-# used to form the text in various listings. Each string in this list, if found
-# as the leading text of the brief description, will be stripped from the text
-# and the result, after processing the whole list, is used as the annotated
-# text. Otherwise, the brief description is used as-is. If left blank, the
-# following values are used ($name is automatically replaced with the name of
-# the entity):The $name class, The $name widget, The $name file, is, provides,
-# specifies, contains, represents, a, an and the.
-
ABBREVIATE_BRIEF =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
-# description.
-# The default value is: NO.
-
ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-# The default value is: NO.
-
INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
-# before files name in the file list and in the header files. If set to NO the
-# shortest path that makes the file name unique will be used
-# The default value is: YES.
-
FULL_PATH_NAMES = NO
-
-# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
-# Stripping is only done if one of the specified strings matches the left-hand
-# part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
-# strip.
-#
-# Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
-# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-
STRIP_FROM_PATH =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
-# path mentioned in the documentation of a class, which tells the reader which
-# header file to include in order to use a class. If left blank only the name of
-# the header file containing the class definition is used. Otherwise one should
-# specify the list of include paths that are normally passed to the compiler
-# using the -I flag.
-
STRIP_FROM_INC_PATH =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
-# less readable) file names. This can be useful is your file systems doesn't
-# support long names like on DOS, Mac, or CD-ROM.
-# The default value is: NO.
-
SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
-# first line (until the first dot) of a Javadoc-style comment as the brief
-# description. If set to NO, the Javadoc-style will behave just like regular Qt-
-# style comments (thus requiring an explicit @brief command for a brief
-# description.)
-# The default value is: NO.
-
-JAVADOC_AUTOBRIEF = NO
-
-# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
-# such as
-# /***************
-# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
-# Javadoc-style will behave just like regular comments and it will not be
-# interpreted by doxygen.
-# The default value is: NO.
-
+JAVADOC_AUTOBRIEF = YES
JAVADOC_BANNER = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
-# line (until the first dot) of a Qt-style comment as the brief description. If
-# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
-# requiring an explicit \brief command for a brief description.)
-# The default value is: NO.
-
QT_AUTOBRIEF = YES
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
-# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
-# a brief description. This used to be the default behavior. The new default is
-# to treat a multi-line C++ comment block as a detailed description. Set this
-# tag to YES if you prefer the old behavior instead.
-#
-# Note that setting this tag to YES also means that rational rose comments are
-# not recognized any more.
-# The default value is: NO.
-
MULTILINE_CPP_IS_BRIEF = YES
-
-# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
-# documentation from any documented member that it re-implements.
-# The default value is: YES.
-
INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
-# page for each member. If set to NO, the documentation of a member will be part
-# of the file/class/namespace that contains it.
-# The default value is: NO.
-
SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
-# uses this value to replace tabs by spaces in code fragments.
-# Minimum value: 1, maximum value: 16, default value: 4.
-
TAB_SIZE = 4
-
-# This tag can be used to specify a number of aliases that act as commands in
-# the documentation. An alias has the form:
-# name=value
-# For example adding
-# "sideeffect=@par Side Effects:\n"
-# will allow you to put the command \sideeffect (or @sideeffect) in the
-# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines (in the resulting output). You can put ^^ in the value part of an
-# alias to insert a newline as if a physical newline was in the original file.
-# When you need a literal { or } or , in the value part of an alias you have to
-# escape them by means of a backslash (\), this can lead to conflicts with the
-# commands \{ and \} for these it is advised to use the version @{ and @} or use
-# a double escape (\\{ and \\})
-
ALIASES = "next{1}=Next: @ref \1
" \
"description=@par Description" \
"hint=@par Hint" \
"usage=@par Usage" \
+ "caption{1}=\1
" \
"reqdef{2}=
@anchor \1 " \
"reqref{1}=@ref \1 \"\1\"" \
"termdef{2}=@anchor term_\1 @par \2" \
"termref{1}=@ref term_\1"
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C. For
-# instance, some of the names that are used will be different. The list of all
-# members will be omitted, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_FOR_C = YES
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
-# Python sources only. Doxygen will then generate output that is more tailored
-# for that language. For instance, namespaces will be presented as packages,
-# qualified scopes will look different, etc.
-# The default value is: NO.
-
+OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources. Doxygen will then generate output that is tailored for Fortran.
-# The default value is: NO.
-
OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for VHDL.
-# The default value is: NO.
-
OPTIMIZE_OUTPUT_VHDL = NO
-
-# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
-# sources only. Doxygen will then generate output that is more tailored for that
-# language. For instance, namespaces will be presented as modules, types will be
-# separated into more groups, etc.
-# The default value is: NO.
-
OPTIMIZE_OUTPUT_SLICE = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
-# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
-# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
-# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
-# tries to guess whether the code is fixed or free formatted code, this is the
-# default for Fortran type files). For instance to make doxygen treat .inc files
-# as Fortran files (default is PHP), and .f files as C (default is Fortran),
-# use: inc=Fortran f=C.
-#
-# Note: For files without extension you can use no_extension as a placeholder.
-#
-# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
-
EXTENSION_MAPPING = lnt=Objective-C
-
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
-# according to the Markdown format, which allows for more readable
-# documentation. See https://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
-# case of backward compatibilities issues.
-# The default value is: YES.
-
MARKDOWN_SUPPORT = YES
-
-# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
-# to that level are automatically included in the table of contents, even if
-# they do not have an id attribute.
-# Note: This feature currently applies only to Markdown headings.
-# Minimum value: 0, maximum value: 99, default value: 5.
-# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
-
TOC_INCLUDE_HEADINGS = 4
-
-# When enabled doxygen tries to link words that correspond to documented
-# classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by putting a % sign in front of the word or
-# globally by setting AUTOLINK_SUPPORT to NO.
-# The default value is: YES.
-
AUTOLINK_SUPPORT = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-# The default value is: NO.
-
BUILTIN_STL_SUPPORT = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-# The default value is: NO.
-
CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
-# The default value is: NO.
-
SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate
-# getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
-# This will only work if the methods are indeed getting or setting a simple
-# type. If this is not the case, or you want to show the methods anyway, you
-# should set this option to NO.
-# The default value is: YES.
-
IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-# The default value is: NO.
-
DISTRIBUTE_GROUP_DOC = NO
-
-# If one adds a struct or class to a group and this option is enabled, then also
-# any nested class or struct is added to the same group. By default this option
-# is disabled and one has to add nested compounds explicitly via \ingroup.
-# The default value is: NO.
-
GROUP_NESTED_COMPOUNDS = NO
-
-# Set the SUBGROUPING tag to YES to allow class member groups of the same type
-# (for instance a group of public functions) to be put as a subgroup of that
-# type (e.g. under the Public Functions section). Set it to NO to prevent
-# subgrouping. Alternatively, this can be done per class using the
-# \nosubgrouping command.
-# The default value is: YES.
-
SUBGROUPING = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
-# are shown inside the group in which they are included (e.g. using \ingroup)
-# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
-# and RTF).
-#
-# Note that this feature does not work in combination with
-# SEPARATE_MEMBER_PAGES.
-# The default value is: NO.
-
INLINE_GROUPED_CLASSES = YES
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
-# with only public data fields or simple typedef fields will be shown inline in
-# the documentation of the scope in which they are defined (i.e. file,
-# namespace, or group documentation), provided this scope is documented. If set
-# to NO, structs, classes, and unions are shown on a separate page (for HTML and
-# Man pages) or section (for LaTeX and RTF).
-# The default value is: NO.
-
INLINE_SIMPLE_STRUCTS = YES
-
-# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
-# enum is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically be
-# useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-# The default value is: NO.
-
TYPEDEF_HIDES_STRUCT = YES
-
-# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
-# cache is used to resolve symbols given their name and scope. Since this can be
-# an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
-# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
-# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
-# the optimal cache size from a speed point of view.
-# Minimum value: 0, maximum value: 9, default value: 0.
-
LOOKUP_CACHE_SIZE = 0
-
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
-# documentation are documented, even if no documentation was available. Private
-# class members and static file members will be hidden unless the
-# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
-# Note: This will also disable the warnings about undocumented members that are
-# normally produced when WARNINGS is set to YES.
-# The default value is: NO.
-
EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
-# be included in the documentation.
-# The default value is: NO.
-
EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
-# methods of a class will be included in the documentation.
-# The default value is: NO.
-
EXTRACT_PRIV_VIRTUAL = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
-# scope will be included in the documentation.
-# The default value is: NO.
-
EXTRACT_PACKAGE = YES
-
-# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
-# included in the documentation.
-# The default value is: NO.
-
EXTRACT_STATIC = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO,
-# only classes defined in header files are included. Does not have any effect
-# for Java sources.
-# The default value is: YES.
-
-EXTRACT_LOCAL_CLASSES = YES
-
-# This flag is only useful for Objective-C code. If set to YES, local methods,
-# which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO, only methods in the interface are
-# included.
-# The default value is: NO.
-
+EXTRACT_LOCAL_CLASSES = NO
EXTRACT_LOCAL_METHODS = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base name of
-# the file that contains the anonymous namespace. By default anonymous namespace
-# are hidden.
-# The default value is: NO.
-
EXTRACT_ANON_NSPACES = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
-# undocumented members inside documented classes or files. If set to NO these
-# members will be included in the various overviews, but no documentation
-# section is generated. This option has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy. If set
-# to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# declarations. If set to NO, these declarations will be included in the
-# documentation.
-# The default value is: NO.
-
+HIDE_UNDOC_MEMBERS = YES
+HIDE_UNDOC_CLASSES = YES
HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO, these
-# blocks will be appended to the function's detailed documentation block.
-# The default value is: NO.
-
HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation that is typed after a
-# \internal command is included. If the tag is set to NO then the documentation
-# will be excluded. Set it to YES to include the internal documentation.
-# The default value is: NO.
-
INTERNAL_DOCS = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# (including Cygwin) ands Mac users are advised to set this option to NO.
-# The default value is: system dependent.
-
CASE_SENSE_NAMES = NO
-
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES, the
-# scope will be hidden.
-# The default value is: NO.
-
HIDE_SCOPE_NAMES = YES
-
-# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
-# append additional text to a page's title, such as Class Reference. If set to
-# YES the compound reference will be hidden.
-# The default value is: NO.
-
-HIDE_COMPOUND_REFERENCE= NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
-# the files that are included by a file in the documentation of that file.
-# The default value is: YES.
-
+HIDE_COMPOUND_REFERENCE= YES
SHOW_INCLUDE_FILES = YES
-
-# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
-# grouped member an include statement to the documentation, telling the reader
-# which file to include in order to use the member.
-# The default value is: NO.
-
SHOW_GROUPED_MEMB_INC = NO
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
-# files with double quotes in the documentation rather than with sharp brackets.
-# The default value is: NO.
-
FORCE_LOCAL_INCLUDES = NO
-
-# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
-# documentation for inline members.
-# The default value is: YES.
-
INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
-# (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order.
-# The default value is: YES.
-
SORT_MEMBER_DOCS = NO
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
-# descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order. Note that
-# this will also influence the order of the classes in the class list.
-# The default value is: NO.
-
SORT_BRIEF_DOCS = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
-# (brief and detailed) documentation of class members so that constructors and
-# destructors are listed first. If set to NO the constructors will appear in the
-# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
-# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
-# member documentation.
-# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
-# detailed member documentation.
-# The default value is: NO.
-
SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
-# of group names into alphabetical order. If set to NO the group names will
-# appear in their defined order.
-# The default value is: NO.
-
SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
-# fully-qualified names, including namespaces. If set to NO, the class list will
-# be sorted only by class name, not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the alphabetical
-# list.
-# The default value is: NO.
-
SORT_BY_SCOPE_NAME = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
-# type resolution of all parameters of a function it will reject a match between
-# the prototype and the implementation of a member function even if there is
-# only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
-# accept a match between prototype and implementation in such cases.
-# The default value is: NO.
-
STRICT_PROTO_MATCHING = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
-# list. This list is created by putting \todo commands in the documentation.
-# The default value is: YES.
-
GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
-# list. This list is created by putting \test commands in the documentation.
-# The default value is: YES.
-
GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
-# list. This list is created by putting \bug commands in the documentation.
-# The default value is: YES.
-
GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
-# the deprecated list. This list is created by putting \deprecated commands in
-# the documentation.
-# The default value is: YES.
-
GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional documentation
-# sections, marked by \if ... \endif and \cond
-# ... \endcond blocks.
-
ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
-# initial value of a variable or macro / define can have for it to appear in the
-# documentation. If the initializer consists of more lines than specified here
-# it will be hidden. Use a value of 0 to hide initializers completely. The
-# appearance of the value of individual variables and macros / defines can be
-# controlled using \showinitializer or \hideinitializer command in the
-# documentation regardless of this setting.
-# Minimum value: 0, maximum value: 10000, default value: 30.
-
MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES, the
-# list will mention the files that were used to generate the documentation.
-# The default value is: YES.
-
SHOW_USED_FILES = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
-# will remove the Files entry from the Quick Index and from the Folder Tree View
-# (if specified).
-# The default value is: YES.
-
SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
-# page. This will remove the Namespaces entry from the Quick Index and from the
-# Folder Tree View (if specified).
-# The default value is: YES.
-
SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command command input-file, where command is the value of the
-# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
-# version. For an example see the documentation.
-
FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
-# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
-#
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
-# tag is left empty.
-
LAYOUT_FILE =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
-# the reference definitions. This must be a list of .bib files. The .bib
-# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
-# For LaTeX the style of the bibliography can be controlled using
-# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. See also \cite for info how to create references.
-
CITE_BIB_FILES =
-
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
-# messages are off.
-# The default value is: NO.
-
QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
-# this implies that the warnings are on.
-#
-# Tip: Turn warnings on while writing the documentation.
-# The default value is: YES.
-
WARNINGS = YES
-
-# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
-# will automatically be disabled.
-# The default value is: YES.
-
WARN_IF_UNDOCUMENTED = YES
-
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
-# The default value is: YES.
-
WARN_IF_DOC_ERROR = YES
-
-# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
-# are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation. If
-# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
-# The default value is: NO.
-
WARN_NO_PARAMDOC = NO
-
-# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
-# The default value is: NO.
-
WARN_AS_ERROR = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
-# can produce. The string should contain the $file, $line, and $text tags, which
-# will be replaced by the file and line number from which the warning originated
-# and the warning text. Optionally the format may contain $version, which will
-# be replaced by the version of the file (if it could be obtained via
-# FILE_VERSION_FILTER)
-# The default value is: $file:$line: $text.
-
WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning and error
-# messages should be written. If left blank the output is written to standard
-# error (stderr).
-
WARN_LOGFILE =
-
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
-
-# The INPUT tag is used to specify the files and/or directories that contain
-# documented source files. You may enter file names like myfile.cpp or
-# directories like /usr/src/myproject. Separate the files or directories with
-# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
-# Note: If this tag is empty the current directory is searched.
-
INPUT = main.dox \
gs.dox \
qpspy.dox \
@@ -828,1736 +121,245 @@ INPUT = main.dox \
qutest.dox \
qutest_tut.dox \
qutest_ref.dox \
- qspyview.dox \
+ qview.dox \
qwin.dox \
qclean.dox \
- qcalc.dox \
qfsgen.dox \
history.dox \
modules.dox \
macros.h \
../qspy/include/qs_copy.h \
../qspy/include/qspy.h \
- ../qspy/py/qutest.py \
- ../qspy/py/qutest_dsl.py \
+ ../qutest/qutest_dsl.py \
+ ../qview/qview.py \
../qwin/qwin_gui.h \
../qwin/qwin_gui.c \
../../doxygen/help.dox
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
-# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
-# possible encodings.
-# The default value is: UTF-8.
-
INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# read by doxygen.
-#
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
-# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen
-# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
-# *.vhdl, *.ucf, *.qsf and *.ice.
-
FILE_PATTERNS = *.dox \
*.h \
*.c \
*.hpp \
*.cpp \
- *.py \
- *.tcl
-
-# The RECURSIVE tag can be used to specify whether or not subdirectories should
-# be searched for input files as well.
-# The default value is: NO.
-
+ *.py
RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-#
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-# The default value is: NO.
-
EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories for example use the pattern */test/*
-
EXCLUDE_PATTERNS =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or directories
-# that contain example code fragments that are included (see the \include
-# command).
-
+EXCLUDE_SYMBOLS = _*Dialog
EXAMPLE_PATH = snippets
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank all
-# files are included.
-
EXAMPLE_PATTERNS = *
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude commands
-# irrespective of the value of the RECURSIVE tag.
-# The default value is: NO.
-
EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or directories
-# that contain images that are to be included in the documentation (see the
-# \image command).
-
IMAGE_PATH = images \
../../doxygen/images
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command:
-#
-#
-#
-# where is the value of the INPUT_FILTER tag, and is the
-# name of an input file. Doxygen will then use the output that the filter
-# program writes to standard output. If FILTER_PATTERNS is specified, this tag
-# will be ignored.
-#
-# Note that the filter must not add or remove lines; it is applied before the
-# code is scanned, but not when the output code is generated. If lines are added
-# or removed, the anchors will not be placed correctly.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form: pattern=filter
-# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
-# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
-# patterns match the file name, INPUT_FILTER is applied.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will also be used to filter the input files that are used for
-# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
-# The default value is: NO.
-
FILTER_SOURCE_FILES = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
-# it is also possible to disable source filtering for a specific pattern using
-# *.ext= (so without naming a filter).
-# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-
FILTER_SOURCE_PATTERNS =
-
-# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
-
USE_MDFILE_AS_MAINPAGE =
-
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
-# generated. Documented entities will be cross-referenced with these sources.
-#
-# Note: To get rid of all source code in the generated output, make sure that
-# also VERBATIM_HEADERS is set to NO.
-# The default value is: NO.
-
SOURCE_BROWSER = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
-# The default value is: NO.
-
INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
-# special comment blocks from generated source code fragments. Normal C, C++ and
-# Fortran comments will always remain visible.
-# The default value is: YES.
-
STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# entity all documented functions referencing it will be listed.
-# The default value is: NO.
-
REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES then for each documented function
-# all documented entities called/used by that function will be listed.
-# The default value is: NO.
-
REFERENCES_RELATION = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES then the hyperlinks from functions in REFERENCES_RELATION and
-# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
-# link to the documentation.
-# The default value is: YES.
-
REFERENCES_LINK_SOURCE = YES
-
-# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
-# source code will show a tooltip with additional information such as prototype,
-# brief description and links to the definition and documentation. Since this
-# will make the HTML file larger and loading of large files a bit slower, you
-# can opt to disable this feature.
-# The default value is: YES.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
SOURCE_TOOLTIPS = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
-# source browser. The htags tool is part of GNU's global source tagging system
-# (see https://www.gnu.org/software/global/global.html). You will need version
-# 4.8.6 or higher.
-#
-# To use it do the following:
-# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
-# - Make sure the INPUT points to the root of the source tree
-# - Run doxygen as normal
-#
-# Doxygen will invoke htags (and that will in turn invoke gtags), so these
-# tools must be available from the command line (i.e. in the search path).
-#
-# The result: instead of the source browser generated by doxygen, the links to
-# source code will now point to the output of htags.
-# The default value is: NO.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
-# verbatim copy of the header file for each class for which an include is
-# specified. Set to NO to disable this.
-# See also: Section \class.
-# The default value is: YES.
-
VERBATIM_HEADERS = YES
-
-# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
-# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
-# cost of reduced performance. This can be particularly helpful with template
-# rich C++ code for which doxygen's built-in parser lacks the necessary type
-# information.
-# Note: The availability of this option depends on whether or not doxygen was
-# generated with the -Duse_libclang=ON option for CMake.
-# The default value is: NO.
-
CLANG_ASSISTED_PARSING = NO
-
-# If clang assisted parsing is enabled you can provide the compiler with command
-# line options that you would normally use when invoking the compiler. Note that
-# the include paths will already be set by doxygen for the files and directories
-# specified with INPUT and INCLUDE_PATH.
-# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
-
CLANG_OPTIONS =
-
-# If clang assisted parsing is enabled you can provide the clang parser with the
-# path to the compilation database (see:
-# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files
-# were built. This is equivalent to specifying the "-p" option to a clang tool,
-# such as clang-check. These options will then be passed to the parser.
-# Note: The availability of this option depends on whether or not doxygen was
-# generated with the -Duse_libclang=ON option for CMake.
-
CLANG_DATABASE_PATH =
-
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
-# compounds will be generated. Enable this if the project contains a lot of
-# classes, structs, unions or interfaces.
-# The default value is: YES.
-
ALPHABETICAL_INDEX = YES
-
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
IGNORE_PREFIX =
-
#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
-# The default value is: YES.
-
GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_OUTPUT = ../html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
-# generated HTML page (for example: .htm, .php, .asp).
-# The default value is: .html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
-# standard header.
-#
-# To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
-# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
-# default header using
-# doxygen -w html new_header.html new_footer.html new_stylesheet.css
-# YourConfigFile
-# and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
-# uses.
-# Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
-# of the possible markers and block names see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_HEADER = ../../doxygen/header.html
-
-# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
-# footer. See HTML_HEADER for more information on how to generate a default
-# footer and what special commands can be used inside the footer. See also
-# section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_FOOTER = ../../doxygen/footer.html
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
-# sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
-# See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
-# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
-# it is more robust and this tag (HTML_STYLESHEET) will in the future become
-# obsolete.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_STYLESHEET =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# cascading style sheets that are included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
-# This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefore more robust against future updates.
-# Doxygen will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_EXTRA_STYLESHEET = ../../doxygen/ql.css
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
-# files will be copied as-is; there are no commands or markers available.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_EXTRA_FILES =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
-# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
-# purple, and 360 is red again.
-# Minimum value: 0, maximum value: 359, default value: 220.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_COLORSTYLE_HUE = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
-# value of 255 will produce the most vivid colors.
-# Minimum value: 0, maximum value: 255, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_COLORSTYLE_SAT = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
-# luminance component of the colors in the HTML output. Values below 100
-# gradually make the output lighter, whereas values above 100 make the output
-# darker. The value divided by 100 is the actual gamma applied, so 80 represents
-# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
-# change the gamma.
-# Minimum value: 40, maximum value: 240, default value: 80.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_COLORSTYLE_GAMMA = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_TIMESTAMP = NO
-
-# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
-# documentation will contain a main index with vertical navigation menus that
-# are dynamically created via JavaScript. If disabled, the navigation index will
-# consists of multiple levels of tabs that are statically embedded in every HTML
-# page. Disable this option to support browsers that do not have JavaScript,
-# like the Qt help browser.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_DYNAMIC_MENUS = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_DYNAMIC_SECTIONS = NO
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
-# shown in the various tree structured indices initially; the user can expand
-# and collapse entries dynamically later on. Doxygen will expand the tree to
-# such a level that at most the specified number of entries are visible (unless
-# a fully collapsed tree already exceeds this amount). So setting the number of
-# entries 1 will produce a full collapsed tree by default. 0 is a special value
-# representing an infinite number of entries and will result in a full expanded
-# tree by default.
-# Minimum value: 0, maximum value: 9999, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files will be
-# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: https://developer.apple.com/xcode/), introduced with OSX
-# 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
-# genXcode/_index.html for more information.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_DOCSET = NO
-
-# This tag determines the name of the docset feed. A documentation feed provides
-# an umbrella under which multiple documentation sets from a single provider
-# (such as a company or product suite) can be grouped.
-# The default value is: Doxygen generated docs.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# This tag specifies a string that should uniquely identify the documentation
-# set bundle. This should be a reverse domain-name style string, e.g.
-# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
DOCSET_BUNDLE_ID = com.state-machine.doc
-
-# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-# The default value is: org.doxygen.Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
DOCSET_PUBLISHER_ID = com.state-machine.doc
-
-# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
-# The default value is: Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
DOCSET_PUBLISHER_NAME = QuantumLeaps
-
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
-# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
-# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
-#
-# The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
-# files are now used as the Windows 98 help format, and will replace the old
-# Windows help format (.hlp) on all Windows platforms in the future. Compressed
-# HTML files also contain an index, a table of contents, and you can search for
-# words in the documentation. The HTML workshop also contains a viewer for
-# compressed HTML files.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_HTMLHELP = NO
-
-# The CHM_FILE tag can be used to specify the file name of the resulting .chm
-# file. You can add a path in front of the file if the result should not be
-# written to the html output directory.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
CHM_FILE = ../qtools.chm
-
-# The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler (hhc.exe). If non-empty,
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
-# The file has to be specified with full path.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
HHC_LOCATION =
-
-# The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
GENERATE_CHI = NO
-
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
-# and project file content.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
CHM_INDEX_ENCODING =
-
-# The BINARY_TOC flag controls whether a binary table of contents is generated
-# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
-# enables the Previous and Next buttons.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
BINARY_TOC = YES
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members to
-# the table of contents of the HTML help documentation and to the tree view.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
TOC_EXPAND = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
-# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
-# (.qch) of the generated HTML documentation.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
-# the file name of the resulting .qch file. The path specified is relative to
-# the HTML output folder.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
-# Project output. For more information please see Qt Help Project / Namespace
-# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_NAMESPACE = com.state-machine.qp
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
-# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
-# folders).
-# The default value is: doc.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_VIRTUAL_FOLDER = doc
-
-# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
-# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_CUST_FILTER_NAME =
-
-# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_CUST_FILTER_ATTRS =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_SECT_FILTER_ATTRS =
-
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHG_LOCATION =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
-# generated, together with the HTML files, they form an Eclipse help plugin. To
-# install this plugin and make it available under the help contents menu in
-# Eclipse, the contents of the directory containing the HTML and XML files needs
-# to be copied into the plugins directory of eclipse. The name of the directory
-# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
-# After copying Eclipse needs to be restarted before the help appears.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_ECLIPSEHELP = NO
-
-# A unique identifier for the Eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have this
-# name. Each documentation set should have its own identifier.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
-
ECLIPSE_DOC_ID = com.state-machine.qp
-
-# If you want full control over the layout of the generated HTML pages it might
-# be necessary to disable the index and replace it with your own. The
-# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
-# of each HTML page. A value of NO enables the index and the value YES disables
-# it. Since the tabs in the index contain the same information as the navigation
-# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
DISABLE_INDEX = YES
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information. If the tag
-# value is set to YES, a side panel will be generated containing a tree-like
-# index structure (just like the one that is generated for HTML Help). For this
-# to work a browser that supports JavaScript, DHTML, CSS and frames is required
-# (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_TREEVIEW = YES
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
-#
-# Note that a value of 0 will completely suppress the enum values from appearing
-# in the overview section.
-# Minimum value: 0, maximum value: 20, default value: 4.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
ENUM_VALUES_PER_LINE = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
-# to set the initial width (in pixels) of the frame in which the tree is shown.
-# Minimum value: 0, maximum value: 1500, default value: 250.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
TREEVIEW_WIDTH = 180
-
-# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
-# external symbols imported via tag files in a separate window.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
EXT_LINKS_IN_WINDOW = NO
-
-# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
-# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
-# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
-# the HTML output. These images will generally look nicer at scaled resolutions.
-# Possible values are: png The default and svg Looks nicer but requires the
-# pdf2svg tool.
-# The default value is: png.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_FORMULA_FORMAT = png
-
-# Use this tag to change the font size of LaTeX formulas included as images in
-# the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
-# output directory to force them to be regenerated.
-# Minimum value: 8, maximum value: 50, default value: 10.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
FORMULA_FONTSIZE = 10
-
-# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
FORMULA_TRANSPARENT = YES
-
-# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
-# to create new LaTeX commands to be used in formulas as building blocks. See
-# the section "Including formulas" for details.
-
FORMULA_MACROFILE =
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# https://www.mathjax.org) which uses client side JavaScript for the rendering
-# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
-# installed or if you want to formulas look prettier in the HTML output. When
-# enabled you may also need to install MathJax separately and configure the path
-# to it using the MATHJAX_RELPATH option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
USE_MATHJAX = NO
-
-# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
-# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
-# The default value is: HTML-CSS.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
MATHJAX_FORMAT = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the HTML
-# output directory using the MATHJAX_RELPATH option. The destination directory
-# should contain the MathJax.js script. For instance, if the mathjax directory
-# is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
-# Content Delivery Network so you can quickly see the result without installing
-# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from https://www.mathjax.org before deployment.
-# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
-# extension names that should be enabled during MathJax rendering. For example
-# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
MATHJAX_EXTENSIONS =
-
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
-# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
-# example see the documentation.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
MATHJAX_CODEFILE =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
-# should work on any modern browser. Note that when using HTML help
-# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
-# there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
-# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
-# search using the keyboard; to jump to the search box use + S
-# (what the is depends on the OS and browser, but it is typically
-# , /, or both). Inside the search box use the to jump into the search results window, the results can be navigated
-# using the . Press to select an item or to cancel
-# the search. The filter options can be selected when the cursor is inside the
-# search box by pressing +. Also here use the
-# to select a filter and or to activate or cancel the filter
-# option.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
SEARCHENGINE = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using JavaScript. There
-# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
-# setting. When disabled, doxygen will generate a PHP script for searching and
-# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
-# and searching needs to be provided by external tools. See the section
-# "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
SERVER_BASED_SEARCH = NO
-
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
-# script for searching. Instead the search results are written to an XML file
-# which needs to be processed by an external indexer. Doxygen will invoke an
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
-# search results.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/).
-#
-# See the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
EXTERNAL_SEARCH = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server
-# which will return the search results when EXTERNAL_SEARCH is enabled.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/). See the section "External Indexing and
-# Searching" for details.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
SEARCHENGINE_URL =
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
-# search data is written to a file for indexing by an external tool. With the
-# SEARCHDATA_FILE tag the name of this file can be specified.
-# The default file is: searchdata.xml.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
SEARCHDATA_FILE = searchdata.xml
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
-# projects and redirect the results back to the right project.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
EXTERNAL_SEARCH_ID =
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
-# projects other than the one defined by this configuration file, but that are
-# all added to the same external search index. Each project needs to have a
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
-# to a relative location where the documentation can be found. The format is:
-# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
EXTRA_SEARCH_MAPPINGS =
-
#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
-# The default value is: YES.
-
GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked.
-#
-# Note that when not enabling USE_PDFLATEX the default is latex when enabling
-# USE_PDFLATEX the default is pdflatex and when in the later case latex is
-# chosen this is overwritten by pdflatex. For specific output languages the
-# default can have been set differently, this depends on the implementation of
-# the output language.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
-# index for LaTeX.
-# Note: This tag is used in the Makefile / make.bat.
-# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
-# (.tex).
-# The default file is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
MAKEINDEX_CMD_NAME = makeindex
-
-# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
-# generate index for LaTeX. In case there is no backslash (\) as first character
-# it will be automatically added in the LaTeX code.
-# Note: This tag is used in the generated output file (.tex).
-# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
-# The default value is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_MAKEINDEX_CMD = makeindex
-
-# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used by the
-# printer.
-# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
-# 14 inches) and executive (7.25 x 10.5 inches).
-# The default value is: a4.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
PAPER_TYPE = letter
-
-# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. The package can be specified just
-# by its name or with the correct syntax as to be used with the LaTeX
-# \usepackage command. To get the times font for instance you can specify :
-# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
-# To use the option intlimits with the amsmath package you can specify:
-# EXTRA_PACKAGES=[intlimits]{amsmath}
-# If left blank no extra packages will be included.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
-#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_HEADER =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
-# LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_FOOTER =
-
-# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# LaTeX style sheets that are included after the standard style sheets created
-# by doxygen. Using this option one can overrule certain style aspects. Doxygen
-# will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list).
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_EXTRA_STYLESHEET =
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the LATEX_OUTPUT output
-# directory. Note that the files will be copied as-is; there are no commands or
-# markers available.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_EXTRA_FILES =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
-# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
-# contain links (just like the HTML output) instead of page references. This
-# makes the output suitable for online browsing using a PDF viewer.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_BATCHMODE = NO
-
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
-# index chapters (such as File Index, Compound Index, etc.) in the output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_HIDE_INDICES = NO
-
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_SOURCE_CODE = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. See
-# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
-# The default value is: plain.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_BIB_STYLE = plain
-
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_TIMESTAMP = NO
-
-# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
-# path from which the emoji images will be read. If a relative path is entered,
-# it will be relative to the LATEX_OUTPUT directory. If left blank the
-# LATEX_OUTPUT directory will be used.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_EMOJI_DIRECTORY =
-
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
-# RTF output is optimized for Word 97 and may not look too pretty with other RTF
-# readers/editors.
-# The default value is: NO.
-
GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: rtf.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
-# contain hyperlink fields. The RTF file will contain links (just like the HTML
-# output) instead of page references. This makes the output suitable for online
-# browsing using Word or some other Word compatible readers that support those
-# fields.
-#
-# Note: WordPad (write) and others do not support links.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# configuration file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-#
-# See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's configuration file. A template extensions file can be
-# generated using doxygen -e rtf extensionFile.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_EXTENSIONS_FILE =
-
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_SOURCE_CODE = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
-# classes and files.
-# The default value is: NO.
-
GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it. A directory man3 will be created inside the directory specified by
-# MAN_OUTPUT.
-# The default directory is: man.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to the generated
-# man pages. In case the manual section does not start with a number, the number
-# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
-# optional.
-# The default value is: .3.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
MAN_EXTENSION = .3
-
-# The MAN_SUBDIR tag determines the name of the directory created within
-# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
-# MAN_EXTENSION with the initial . removed.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
MAN_SUBDIR =
-
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
-# will generate one additional man file for each entity documented in the real
-# man page(s). These additional files only source the real man page, but without
-# them the man command would be unable to find the correct page.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
MAN_LINKS = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
-# captures the structure of the code including all documentation.
-# The default value is: NO.
-
GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: xml.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
XML_OUTPUT = xml
-
-# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
-# listings (including syntax highlighting and cross-referencing information) to
-# the XML output. Note that enabling this will significantly increase the size
-# of the XML output.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
XML_PROGRAMLISTING = YES
-
-# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
-# namespace members in file scope as well, matching the HTML output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
XML_NS_MEMB_FILE_SCOPE = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
-# that can be used to generate PDF.
-# The default value is: NO.
-
GENERATE_DOCBOOK = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
-# front of it.
-# The default directory is: docbook.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
DOCBOOK_OUTPUT = docbook
-
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
DOCBOOK_PROGRAMLISTING = NO
-
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
-# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
-# the structure of the code including all documentation. Note that this feature
-# is still experimental and incomplete at the moment.
-# The default value is: NO.
-
GENERATE_AUTOGEN_DEF = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
-# file that captures the structure of the code including all documentation.
-#
-# Note that this feature is still experimental and incomplete at the moment.
-# The default value is: NO.
-
GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
-# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
-# output from the Perl module output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
-# formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO, the
-# size of the Perl module output will be much smaller and Perl will parse it
-# just the same.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file are
-# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
-# so different doxyrules.make files included by the same Makefile don't
-# overwrite each other's variables.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
PERLMOD_MAKEVAR_PREFIX =
-
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
-# C-preprocessor directives found in the sources and include files.
-# The default value is: YES.
-
ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
-# in the source code. If set to NO, only conditional compilation will be
-# performed. Macro expansion can be done in a controlled way by setting
-# EXPAND_ONLY_PREDEF to YES.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
-# the macro expansion is limited to the macros specified with the PREDEFINED and
-# EXPAND_AS_DEFINED tags.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES, the include files in the
-# INCLUDE_PATH will be searched if a #include is found.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by the
-# preprocessor.
-# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-
INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will be
-# used.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that are
-# defined before the preprocessor is started (similar to the -D option of e.g.
-# gcc). The argument of the tag is a list of macros of the form: name or
-# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
-# is assumed. To prevent a macro definition from being undefined via #undef or
-# recursively expanded use the := operator instead of the = operator.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
PREDEFINED = Q_SPY \
Q_UTEST
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
-# tag can be used to specify a list of macro names that should be expanded. The
-# macro definition that is found in the sources will be used. Use the PREDEFINED
-# tag if you want to use a different macro definition that overrules the
-# definition found in the source code.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all references to function-like macros that are alone on a line, have
-# an all uppercase name, and do not end with a semicolon. Such function macros
-# are typically used for boiler-plate code, and will confuse the parser if not
-# removed.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
SKIP_FUNCTION_MACROS = YES
-
#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tag files. For each tag
-# file the location of the external documentation should be added. The format of
-# a tag file without this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where loc1 and loc2 can be relative or absolute paths or URLs. See the
-# section "Linking to external documentation" for more information about the use
-# of tag files.
-# Note: Each tag file must have a unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
-# run, you must also specify the path to the tagfile here.
-
TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
-# tag file that is based on the input files it reads. See section "Linking to
-# external documentation" for more information about the usage of tag files.
-
GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
-# the class index. If set to NO, only the inherited external classes will be
-# listed.
-# The default value is: NO.
-
ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will be
-# listed.
-# The default value is: YES.
-
EXTERNAL_GROUPS = YES
-
-# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
-# the related pages index. If set to NO, only the current project's pages will
-# be listed.
-# The default value is: YES.
-
EXTERNAL_PAGES = YES
-
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
CLASS_DIAGRAMS = YES
-
-# You can include diagrams made with dia in doxygen documentation. Doxygen will
-# then run dia to produce the diagram and insert it in the documentation. The
-# DIA_PATH tag allows you to specify the directory where the dia binary resides.
-# If left empty dia is assumed to be found in the default search path.
-
DIA_PATH =
-
-# If set to YES the inheritance and collaboration graphs will hide inheritance
-# and usage relations if the target is undocumented or is not a class.
-# The default value is: YES.
-
HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
-# Bell Labs. The other options in this section have no effect if this option is
-# set to NO
-# The default value is: NO.
-
HAVE_DOT = NO
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
-# processors available in the system. You can set it explicitly to a value
-# larger than 0 to get control over the balance between CPU load and processing
-# speed.
-# Minimum value: 0, maximum value: 32, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_NUM_THREADS = 0
-
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_FONTNAME = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_FONTSIZE = 10
-
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_FONTPATH =
-
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
-# graph for each documented class showing the direct and indirect implementation
-# dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
UML_LOOK = YES
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
-# class node. If there are many fields or methods and many nodes the graph may
-# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
-# number of items for each type to make the size more manageable. Set this to 0
-# for no limit. Note that the threshold may be exceeded by 50% before the limit
-# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
-# but if the number exceeds 15, the total amount of fields shown is limited to
-# 10.
-# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
UML_LIMIT_NUM_FIELDS = 10
-
-# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
-# collaboration graphs will show the relations between templates and their
-# instances.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
TEMPLATE_RELATIONS = NO
-
-# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
-# direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
INCLUDE_GRAPH = YES
-
-# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command. Disabling a call graph can be
-# accomplished by means of the command \hidecallgraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
CALL_GRAPH = NO
-
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command. Disabling a caller graph can be
-# accomplished by means of the command \hidecallergraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
CALLER_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
-# hierarchy of all classes instead of a textual one.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
-# dependencies a directory has on other directories in a graphical way. The
-# dependency relations are determined by the #include relations between the
-# files in the directories.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. For an explanation of the image formats see the section
-# output formats in the documentation of the dot tool (Graphviz (see:
-# http://www.graphviz.org/)).
-# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
-# to make the SVG files visible in IE 9+ (other browsers do not have this
-# requirement).
-# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
-# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
-# png:gdiplus:gdiplus.
-# The default value is: png.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_IMAGE_FORMAT = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-#
-# Note that this requires a modern browser other than Internet Explorer. Tested
-# and working are Firefox, Chrome, Safari, and Opera.
-# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
-# the SVG files visible. Older versions of IE do not have SVG support.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
INTERACTIVE_SVG = NO
-
-# The DOT_PATH tag can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_PATH = C:/tools/graphviz/bin
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the \dotfile
-# command).
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOTFILE_DIRS =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
-
MSCFILE_DIRS =
-
-# The DIAFILE_DIRS tag can be used to specify one or more directories that
-# contain dia files that are included in the documentation (see the \diafile
-# command).
-
DIAFILE_DIRS =
-
-# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
-
PLANTUML_JAR_PATH =
-
-# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
-# configuration file for plantuml.
-
PLANTUML_CFG_FILE =
-
-# When using plantuml, the specified paths are searched for files specified by
-# the !include statement in a plantuml block.
-
PLANTUML_INCLUDE_PATH =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
-# that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
-# children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
-# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-# Minimum value: 0, maximum value: 10000, default value: 50.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_GRAPH_MAX_NODES = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
-# generated by dot. A depth value of 3 means that only nodes reachable from the
-# root by following a path via at most 3 edges will be shown. Nodes that lay
-# further from the root node will be omitted. Note that setting this option to 1
-# or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-# Minimum value: 0, maximum value: 1000, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
MAX_DOT_GRAPH_DEPTH = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10) support
-# this, this feature is disabled by default.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_MULTI_TARGETS = NO
-
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
-# explaining the meaning of the various boxes and arrows in the dot generated
-# graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
-# files that are used to generate the various graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_CLEANUP = YES
diff --git a/doxygen/Doxyfile-CHM b/doxygen/Doxyfile-CHM
index c2e877d..0f3d520 100644
--- a/doxygen/Doxyfile-CHM
+++ b/doxygen/Doxyfile-CHM
@@ -1,825 +1,118 @@
# Doxyfile 1.8.18
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed in
-# front of the TAG it is preceding.
-#
-# All text after a single hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists, items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (\" \").
-
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the configuration
-# file that follow. The default is UTF-8 which is also the encoding used for all
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the
-# iconv built into libc) for the transcoding. See
-# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
-# The default value is: UTF-8.
-
DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
-# double-quotes, unless you are using Doxywizard) that should identify the
-# project for which the documentation is generated. This name is used in the
-# title of most generated pages and in a few other places.
-# The default value is: My Project.
-
PROJECT_NAME = "QTools"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
-# could be handy for archiving the generated documentation or if some version
-# control system is used.
-
-PROJECT_NUMBER = "6.8.2"
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
-# quick idea about the purpose of the project. Keep the description short.
-
+PROJECT_NUMBER = "6.9.0"
PROJECT_BRIEF =
-
-# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
-# in the documentation. The maximum height of the logo should not exceed 55
-# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
-# the logo to the output directory.
-
PROJECT_LOGO = images/header_logo_ql.png
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
-# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
-# left blank the current directory will be used.
-
OUTPUT_DIRECTORY =
-
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
-# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
-# The default value is: NO.
-
CREATE_SUBDIRS = NO
-
-# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
-# characters to appear in the names of generated files. If set to NO, non-ASCII
-# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
-# U+3044.
-# The default value is: NO.
-
ALLOW_UNICODE_NAMES = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
-# The default value is: English.
-
OUTPUT_LANGUAGE = English
-
-# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all generated output in the proper direction.
-# Possible values are: None, LTR, RTL and Context.
-# The default value is: None.
-
OUTPUT_TEXT_DIRECTION = None
-
-# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
-# descriptions after the members that are listed in the file and class
-# documentation (similar to Javadoc). Set to NO to disable this.
-# The default value is: YES.
-
BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
-# description of a member or function before the detailed description
-#
-# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-# The default value is: YES.
-
REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator that is
-# used to form the text in various listings. Each string in this list, if found
-# as the leading text of the brief description, will be stripped from the text
-# and the result, after processing the whole list, is used as the annotated
-# text. Otherwise, the brief description is used as-is. If left blank, the
-# following values are used ($name is automatically replaced with the name of
-# the entity):The $name class, The $name widget, The $name file, is, provides,
-# specifies, contains, represents, a, an and the.
-
ABBREVIATE_BRIEF =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
-# description.
-# The default value is: NO.
-
ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-# The default value is: NO.
-
INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
-# before files name in the file list and in the header files. If set to NO the
-# shortest path that makes the file name unique will be used
-# The default value is: YES.
-
FULL_PATH_NAMES = NO
-
-# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
-# Stripping is only done if one of the specified strings matches the left-hand
-# part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
-# strip.
-#
-# Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
-# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-
STRIP_FROM_PATH =
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
-# path mentioned in the documentation of a class, which tells the reader which
-# header file to include in order to use a class. If left blank only the name of
-# the header file containing the class definition is used. Otherwise one should
-# specify the list of include paths that are normally passed to the compiler
-# using the -I flag.
-
STRIP_FROM_INC_PATH =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
-# less readable) file names. This can be useful is your file systems doesn't
-# support long names like on DOS, Mac, or CD-ROM.
-# The default value is: NO.
-
SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
-# first line (until the first dot) of a Javadoc-style comment as the brief
-# description. If set to NO, the Javadoc-style will behave just like regular Qt-
-# style comments (thus requiring an explicit @brief command for a brief
-# description.)
-# The default value is: NO.
-
JAVADOC_AUTOBRIEF = NO
-
-# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
-# such as
-# /***************
-# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
-# Javadoc-style will behave just like regular comments and it will not be
-# interpreted by doxygen.
-# The default value is: NO.
-
JAVADOC_BANNER = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
-# line (until the first dot) of a Qt-style comment as the brief description. If
-# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
-# requiring an explicit \brief command for a brief description.)
-# The default value is: NO.
-
QT_AUTOBRIEF = YES
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
-# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
-# a brief description. This used to be the default behavior. The new default is
-# to treat a multi-line C++ comment block as a detailed description. Set this
-# tag to YES if you prefer the old behavior instead.
-#
-# Note that setting this tag to YES also means that rational rose comments are
-# not recognized any more.
-# The default value is: NO.
-
MULTILINE_CPP_IS_BRIEF = YES
-
-# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
-# documentation from any documented member that it re-implements.
-# The default value is: YES.
-
INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
-# page for each member. If set to NO, the documentation of a member will be part
-# of the file/class/namespace that contains it.
-# The default value is: NO.
-
SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
-# uses this value to replace tabs by spaces in code fragments.
-# Minimum value: 1, maximum value: 16, default value: 4.
-
TAB_SIZE = 4
-
-# This tag can be used to specify a number of aliases that act as commands in
-# the documentation. An alias has the form:
-# name=value
-# For example adding
-# "sideeffect=@par Side Effects:\n"
-# will allow you to put the command \sideeffect (or @sideeffect) in the
-# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines (in the resulting output). You can put ^^ in the value part of an
-# alias to insert a newline as if a physical newline was in the original file.
-# When you need a literal { or } or , in the value part of an alias you have to
-# escape them by means of a backslash (\), this can lead to conflicts with the
-# commands \{ and \} for these it is advised to use the version @{ and @} or use
-# a double escape (\\{ and \\})
-
ALIASES = "next{1}=Next: @ref \1" \
- "description=@par Description " \
- "hint=@par Hint " \
- "usage=@par Usage " \
+ "description=@par Description" \
+ "hint=@par Hint" \
+ "usage=@par Usage" \
+ "caption{1}=\1
" \
"reqdef{2}=
@anchor \1 " \
"reqref{1}=@ref \1 \"\1\"" \
"termdef{2}=@anchor term_\1 @par \2" \
"termref{1}=@ref term_\1"
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C. For
-# instance, some of the names that are used will be different. The list of all
-# members will be omitted, etc.
-# The default value is: NO.
-
OPTIMIZE_OUTPUT_FOR_C = YES
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
-# Python sources only. Doxygen will then generate output that is more tailored
-# for that language. For instance, namespaces will be presented as packages,
-# qualified scopes will look different, etc.
-# The default value is: NO.
-
OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources. Doxygen will then generate output that is tailored for Fortran.
-# The default value is: NO.
-
OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for VHDL.
-# The default value is: NO.
-
OPTIMIZE_OUTPUT_VHDL = NO
-
-# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
-# sources only. Doxygen will then generate output that is more tailored for that
-# language. For instance, namespaces will be presented as modules, types will be
-# separated into more groups, etc.
-# The default value is: NO.
-
OPTIMIZE_OUTPUT_SLICE = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
-# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
-# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
-# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
-# tries to guess whether the code is fixed or free formatted code, this is the
-# default for Fortran type files). For instance to make doxygen treat .inc files
-# as Fortran files (default is PHP), and .f files as C (default is Fortran),
-# use: inc=Fortran f=C.
-#
-# Note: For files without extension you can use no_extension as a placeholder.
-#
-# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
-
EXTENSION_MAPPING = lnt=Objective-C
-
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
-# according to the Markdown format, which allows for more readable
-# documentation. See https://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
-# case of backward compatibilities issues.
-# The default value is: YES.
-
MARKDOWN_SUPPORT = YES
-
-# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
-# to that level are automatically included in the table of contents, even if
-# they do not have an id attribute.
-# Note: This feature currently applies only to Markdown headings.
-# Minimum value: 0, maximum value: 99, default value: 5.
-# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
-
TOC_INCLUDE_HEADINGS = 4
-
-# When enabled doxygen tries to link words that correspond to documented
-# classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by putting a % sign in front of the word or
-# globally by setting AUTOLINK_SUPPORT to NO.
-# The default value is: YES.
-
AUTOLINK_SUPPORT = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-# The default value is: NO.
-
BUILTIN_STL_SUPPORT = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-# The default value is: NO.
-
CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
-# The default value is: NO.
-
SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate
-# getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
-# This will only work if the methods are indeed getting or setting a simple
-# type. If this is not the case, or you want to show the methods anyway, you
-# should set this option to NO.
-# The default value is: YES.
-
IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-# The default value is: NO.
-
DISTRIBUTE_GROUP_DOC = NO
-
-# If one adds a struct or class to a group and this option is enabled, then also
-# any nested class or struct is added to the same group. By default this option
-# is disabled and one has to add nested compounds explicitly via \ingroup.
-# The default value is: NO.
-
GROUP_NESTED_COMPOUNDS = NO
-
-# Set the SUBGROUPING tag to YES to allow class member groups of the same type
-# (for instance a group of public functions) to be put as a subgroup of that
-# type (e.g. under the Public Functions section). Set it to NO to prevent
-# subgrouping. Alternatively, this can be done per class using the
-# \nosubgrouping command.
-# The default value is: YES.
-
SUBGROUPING = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
-# are shown inside the group in which they are included (e.g. using \ingroup)
-# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
-# and RTF).
-#
-# Note that this feature does not work in combination with
-# SEPARATE_MEMBER_PAGES.
-# The default value is: NO.
-
INLINE_GROUPED_CLASSES = YES
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
-# with only public data fields or simple typedef fields will be shown inline in
-# the documentation of the scope in which they are defined (i.e. file,
-# namespace, or group documentation), provided this scope is documented. If set
-# to NO, structs, classes, and unions are shown on a separate page (for HTML and
-# Man pages) or section (for LaTeX and RTF).
-# The default value is: NO.
-
INLINE_SIMPLE_STRUCTS = YES
-
-# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
-# enum is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically be
-# useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-# The default value is: NO.
-
TYPEDEF_HIDES_STRUCT = YES
-
-# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
-# cache is used to resolve symbols given their name and scope. Since this can be
-# an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
-# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
-# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
-# the optimal cache size from a speed point of view.
-# Minimum value: 0, maximum value: 9, default value: 0.
-
LOOKUP_CACHE_SIZE = 0
-
#---------------------------------------------------------------------------
# Build related configuration options
#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
-# documentation are documented, even if no documentation was available. Private
-# class members and static file members will be hidden unless the
-# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
-# Note: This will also disable the warnings about undocumented members that are
-# normally produced when WARNINGS is set to YES.
-# The default value is: NO.
-
EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
-# be included in the documentation.
-# The default value is: NO.
-
EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
-# methods of a class will be included in the documentation.
-# The default value is: NO.
-
EXTRACT_PRIV_VIRTUAL = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
-# scope will be included in the documentation.
-# The default value is: NO.
-
EXTRACT_PACKAGE = YES
-
-# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
-# included in the documentation.
-# The default value is: NO.
-
EXTRACT_STATIC = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO,
-# only classes defined in header files are included. Does not have any effect
-# for Java sources.
-# The default value is: YES.
-
EXTRACT_LOCAL_CLASSES = YES
-
-# This flag is only useful for Objective-C code. If set to YES, local methods,
-# which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO, only methods in the interface are
-# included.
-# The default value is: NO.
-
EXTRACT_LOCAL_METHODS = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base name of
-# the file that contains the anonymous namespace. By default anonymous namespace
-# are hidden.
-# The default value is: NO.
-
EXTRACT_ANON_NSPACES = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
-# undocumented members inside documented classes or files. If set to NO these
-# members will be included in the various overviews, but no documentation
-# section is generated. This option has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy. If set
-# to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# declarations. If set to NO, these declarations will be included in the
-# documentation.
-# The default value is: NO.
-
HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO, these
-# blocks will be appended to the function's detailed documentation block.
-# The default value is: NO.
-
HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation that is typed after a
-# \internal command is included. If the tag is set to NO then the documentation
-# will be excluded. Set it to YES to include the internal documentation.
-# The default value is: NO.
-
INTERNAL_DOCS = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# (including Cygwin) ands Mac users are advised to set this option to NO.
-# The default value is: system dependent.
-
CASE_SENSE_NAMES = NO
-
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES, the
-# scope will be hidden.
-# The default value is: NO.
-
HIDE_SCOPE_NAMES = YES
-
-# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
-# append additional text to a page's title, such as Class Reference. If set to
-# YES the compound reference will be hidden.
-# The default value is: NO.
-
HIDE_COMPOUND_REFERENCE= NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
-# the files that are included by a file in the documentation of that file.
-# The default value is: YES.
-
SHOW_INCLUDE_FILES = YES
-
-# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
-# grouped member an include statement to the documentation, telling the reader
-# which file to include in order to use the member.
-# The default value is: NO.
-
SHOW_GROUPED_MEMB_INC = NO
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
-# files with double quotes in the documentation rather than with sharp brackets.
-# The default value is: NO.
-
FORCE_LOCAL_INCLUDES = NO
-
-# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
-# documentation for inline members.
-# The default value is: YES.
-
INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
-# (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order.
-# The default value is: YES.
-
SORT_MEMBER_DOCS = NO
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
-# descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order. Note that
-# this will also influence the order of the classes in the class list.
-# The default value is: NO.
-
SORT_BRIEF_DOCS = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
-# (brief and detailed) documentation of class members so that constructors and
-# destructors are listed first. If set to NO the constructors will appear in the
-# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
-# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
-# member documentation.
-# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
-# detailed member documentation.
-# The default value is: NO.
-
SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
-# of group names into alphabetical order. If set to NO the group names will
-# appear in their defined order.
-# The default value is: NO.
-
SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
-# fully-qualified names, including namespaces. If set to NO, the class list will
-# be sorted only by class name, not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the alphabetical
-# list.
-# The default value is: NO.
-
SORT_BY_SCOPE_NAME = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
-# type resolution of all parameters of a function it will reject a match between
-# the prototype and the implementation of a member function even if there is
-# only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
-# accept a match between prototype and implementation in such cases.
-# The default value is: NO.
-
STRICT_PROTO_MATCHING = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
-# list. This list is created by putting \todo commands in the documentation.
-# The default value is: YES.
-
GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
-# list. This list is created by putting \test commands in the documentation.
-# The default value is: YES.
-
GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
-# list. This list is created by putting \bug commands in the documentation.
-# The default value is: YES.
-
GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
-# the deprecated list. This list is created by putting \deprecated commands in
-# the documentation.
-# The default value is: YES.
-
GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional documentation
-# sections, marked by \if ... \endif and \cond
-# ... \endcond blocks.
-
ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
-# initial value of a variable or macro / define can have for it to appear in the
-# documentation. If the initializer consists of more lines than specified here
-# it will be hidden. Use a value of 0 to hide initializers completely. The
-# appearance of the value of individual variables and macros / defines can be
-# controlled using \showinitializer or \hideinitializer command in the
-# documentation regardless of this setting.
-# Minimum value: 0, maximum value: 10000, default value: 30.
-
MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES, the
-# list will mention the files that were used to generate the documentation.
-# The default value is: YES.
-
SHOW_USED_FILES = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
-# will remove the Files entry from the Quick Index and from the Folder Tree View
-# (if specified).
-# The default value is: YES.
-
SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
-# page. This will remove the Namespaces entry from the Quick Index and from the
-# Folder Tree View (if specified).
-# The default value is: YES.
-
SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command command input-file, where command is the value of the
-# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
-# version. For an example see the documentation.
-
FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
-# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
-#
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
-# tag is left empty.
-
LAYOUT_FILE =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
-# the reference definitions. This must be a list of .bib files. The .bib
-# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
-# For LaTeX the style of the bibliography can be controlled using
-# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. See also \cite for info how to create references.
-
CITE_BIB_FILES =
-
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
-# messages are off.
-# The default value is: NO.
-
QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
-# this implies that the warnings are on.
-#
-# Tip: Turn warnings on while writing the documentation.
-# The default value is: YES.
-
WARNINGS = YES
-
-# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
-# will automatically be disabled.
-# The default value is: YES.
-
WARN_IF_UNDOCUMENTED = YES
-
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
-# The default value is: YES.
-
WARN_IF_DOC_ERROR = YES
-
-# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
-# are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation. If
-# EXTRACT_ALL is set to YES then this flag will automatically be disabled.
-# The default value is: NO.
-
WARN_NO_PARAMDOC = NO
-
-# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
-# The default value is: NO.
-
WARN_AS_ERROR = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
-# can produce. The string should contain the $file, $line, and $text tags, which
-# will be replaced by the file and line number from which the warning originated
-# and the warning text. Optionally the format may contain $version, which will
-# be replaced by the version of the file (if it could be obtained via
-# FILE_VERSION_FILTER)
-# The default value is: $file:$line: $text.
-
WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning and error
-# messages should be written. If left blank the output is written to standard
-# error (stderr).
-
WARN_LOGFILE =
-
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
-
-# The INPUT tag is used to specify the files and/or directories that contain
-# documented source files. You may enter file names like myfile.cpp or
-# directories like /usr/src/myproject. Separate the files or directories with
-# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
-# Note: If this tag is empty the current directory is searched.
-
INPUT = main.dox \
gs.dox \
qpspy.dox \
@@ -828,1739 +121,245 @@ INPUT = main.dox \
qutest.dox \
qutest_tut.dox \
qutest_ref.dox \
- qspyview.dox \
+ qview.dox \
qwin.dox \
qclean.dox \
- qcalc.dox \
qfsgen.dox \
history.dox \
modules.dox \
macros.h \
../qspy/include/qs_copy.h \
../qspy/include/qspy.h \
- ../qspy/py/qutest.py \
- ../qspy/py/qutest_dsl.py \
+ ../qutest/qutest_dsl.py \
+ ../qview/qview.py \
../qwin/qwin_gui.h \
../qwin/qwin_gui.c \
- ../qclean/source/main.cpp \
- ../qfsgen/source/main.cpp \
- ../../doxygen/help.dox \
- ../../doxygen/glossary.dox
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
-# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
-# possible encodings.
-# The default value is: UTF-8.
-
+ ../../doxygen/help.dox
INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# read by doxygen.
-#
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
-# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen
-# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
-# *.vhdl, *.ucf, *.qsf and *.ice.
-
FILE_PATTERNS = *.dox \
*.h \
*.c \
*.hpp \
*.cpp \
- *.py \
- *.tcl
-
-# The RECURSIVE tag can be used to specify whether or not subdirectories should
-# be searched for input files as well.
-# The default value is: NO.
-
+ *.py
RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-#
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-# The default value is: NO.
-
EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories for example use the pattern */test/*
-
EXCLUDE_PATTERNS =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
-
-EXCLUDE_SYMBOLS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or directories
-# that contain example code fragments that are included (see the \include
-# command).
-
+EXCLUDE_SYMBOLS = _*Dialog
EXAMPLE_PATH = snippets
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank all
-# files are included.
-
EXAMPLE_PATTERNS = *
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude commands
-# irrespective of the value of the RECURSIVE tag.
-# The default value is: NO.
-
EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or directories
-# that contain images that are to be included in the documentation (see the
-# \image command).
-
IMAGE_PATH = images \
../../doxygen/images
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command:
-#
-#
-#
-# where is the value of the INPUT_FILTER tag, and is the
-# name of an input file. Doxygen will then use the output that the filter
-# program writes to standard output. If FILTER_PATTERNS is specified, this tag
-# will be ignored.
-#
-# Note that the filter must not add or remove lines; it is applied before the
-# code is scanned, but not when the output code is generated. If lines are added
-# or removed, the anchors will not be placed correctly.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form: pattern=filter
-# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
-# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
-# patterns match the file name, INPUT_FILTER is applied.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will also be used to filter the input files that are used for
-# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
-# The default value is: NO.
-
FILTER_SOURCE_FILES = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
-# it is also possible to disable source filtering for a specific pattern using
-# *.ext= (so without naming a filter).
-# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-
FILTER_SOURCE_PATTERNS =
-
-# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
-
USE_MDFILE_AS_MAINPAGE =
-
#---------------------------------------------------------------------------
# Configuration options related to source browsing
#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
-# generated. Documented entities will be cross-referenced with these sources.
-#
-# Note: To get rid of all source code in the generated output, make sure that
-# also VERBATIM_HEADERS is set to NO.
-# The default value is: NO.
-
SOURCE_BROWSER = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
-# The default value is: NO.
-
INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
-# special comment blocks from generated source code fragments. Normal C, C++ and
-# Fortran comments will always remain visible.
-# The default value is: YES.
-
STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# entity all documented functions referencing it will be listed.
-# The default value is: NO.
-
REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES then for each documented function
-# all documented entities called/used by that function will be listed.
-# The default value is: NO.
-
REFERENCES_RELATION = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES then the hyperlinks from functions in REFERENCES_RELATION and
-# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
-# link to the documentation.
-# The default value is: YES.
-
REFERENCES_LINK_SOURCE = YES
-
-# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
-# source code will show a tooltip with additional information such as prototype,
-# brief description and links to the definition and documentation. Since this
-# will make the HTML file larger and loading of large files a bit slower, you
-# can opt to disable this feature.
-# The default value is: YES.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
SOURCE_TOOLTIPS = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
-# source browser. The htags tool is part of GNU's global source tagging system
-# (see https://www.gnu.org/software/global/global.html). You will need version
-# 4.8.6 or higher.
-#
-# To use it do the following:
-# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
-# - Make sure the INPUT points to the root of the source tree
-# - Run doxygen as normal
-#
-# Doxygen will invoke htags (and that will in turn invoke gtags), so these
-# tools must be available from the command line (i.e. in the search path).
-#
-# The result: instead of the source browser generated by doxygen, the links to
-# source code will now point to the output of htags.
-# The default value is: NO.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
-# verbatim copy of the header file for each class for which an include is
-# specified. Set to NO to disable this.
-# See also: Section \class.
-# The default value is: YES.
-
VERBATIM_HEADERS = YES
-
-# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
-# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
-# cost of reduced performance. This can be particularly helpful with template
-# rich C++ code for which doxygen's built-in parser lacks the necessary type
-# information.
-# Note: The availability of this option depends on whether or not doxygen was
-# generated with the -Duse_libclang=ON option for CMake.
-# The default value is: NO.
-
CLANG_ASSISTED_PARSING = NO
-
-# If clang assisted parsing is enabled you can provide the compiler with command
-# line options that you would normally use when invoking the compiler. Note that
-# the include paths will already be set by doxygen for the files and directories
-# specified with INPUT and INCLUDE_PATH.
-# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
-
CLANG_OPTIONS =
-
-# If clang assisted parsing is enabled you can provide the clang parser with the
-# path to the compilation database (see:
-# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files
-# were built. This is equivalent to specifying the "-p" option to a clang tool,
-# such as clang-check. These options will then be passed to the parser.
-# Note: The availability of this option depends on whether or not doxygen was
-# generated with the -Duse_libclang=ON option for CMake.
-
CLANG_DATABASE_PATH =
-
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
-# compounds will be generated. Enable this if the project contains a lot of
-# classes, structs, unions or interfaces.
-# The default value is: YES.
-
ALPHABETICAL_INDEX = YES
-
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
IGNORE_PREFIX =
-
#---------------------------------------------------------------------------
# Configuration options related to the HTML output
#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
-# The default value is: YES.
-
GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_OUTPUT = tmp
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
-# generated HTML page (for example: .htm, .php, .asp).
-# The default value is: .html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
-# standard header.
-#
-# To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
-# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
-# default header using
-# doxygen -w html new_header.html new_footer.html new_stylesheet.css
-# YourConfigFile
-# and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
-# uses.
-# Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
-# of the possible markers and block names see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_HEADER = ../../doxygen/header.html
-
-# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
-# footer. See HTML_HEADER for more information on how to generate a default
-# footer and what special commands can be used inside the footer. See also
-# section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_FOOTER = ../../doxygen/footer.html
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
-# sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
-# See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
-# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
-# it is more robust and this tag (HTML_STYLESHEET) will in the future become
-# obsolete.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_STYLESHEET =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# cascading style sheets that are included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
-# This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefore more robust against future updates.
-# Doxygen will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_EXTRA_STYLESHEET = ../../doxygen/ql.css
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
-# files will be copied as-is; there are no commands or markers available.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_EXTRA_FILES =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
-# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
-# purple, and 360 is red again.
-# Minimum value: 0, maximum value: 359, default value: 220.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_COLORSTYLE_HUE = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
-# value of 255 will produce the most vivid colors.
-# Minimum value: 0, maximum value: 255, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_COLORSTYLE_SAT = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
-# luminance component of the colors in the HTML output. Values below 100
-# gradually make the output lighter, whereas values above 100 make the output
-# darker. The value divided by 100 is the actual gamma applied, so 80 represents
-# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
-# change the gamma.
-# Minimum value: 40, maximum value: 240, default value: 80.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_COLORSTYLE_GAMMA = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_TIMESTAMP = NO
-
-# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
-# documentation will contain a main index with vertical navigation menus that
-# are dynamically created via JavaScript. If disabled, the navigation index will
-# consists of multiple levels of tabs that are statically embedded in every HTML
-# page. Disable this option to support browsers that do not have JavaScript,
-# like the Qt help browser.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_DYNAMIC_MENUS = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_DYNAMIC_SECTIONS = NO
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
-# shown in the various tree structured indices initially; the user can expand
-# and collapse entries dynamically later on. Doxygen will expand the tree to
-# such a level that at most the specified number of entries are visible (unless
-# a fully collapsed tree already exceeds this amount). So setting the number of
-# entries 1 will produce a full collapsed tree by default. 0 is a special value
-# representing an infinite number of entries and will result in a full expanded
-# tree by default.
-# Minimum value: 0, maximum value: 9999, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files will be
-# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: https://developer.apple.com/xcode/), introduced with OSX
-# 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
-# genXcode/_index.html for more information.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_DOCSET = NO
-
-# This tag determines the name of the docset feed. A documentation feed provides
-# an umbrella under which multiple documentation sets from a single provider
-# (such as a company or product suite) can be grouped.
-# The default value is: Doxygen generated docs.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# This tag specifies a string that should uniquely identify the documentation
-# set bundle. This should be a reverse domain-name style string, e.g.
-# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
DOCSET_BUNDLE_ID = com.state-machine.doc
-
-# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-# The default value is: org.doxygen.Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
DOCSET_PUBLISHER_ID = com.state-machine.doc
-
-# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
-# The default value is: Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
DOCSET_PUBLISHER_NAME = QuantumLeaps
-
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
-# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
-# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
-#
-# The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
-# files are now used as the Windows 98 help format, and will replace the old
-# Windows help format (.hlp) on all Windows platforms in the future. Compressed
-# HTML files also contain an index, a table of contents, and you can search for
-# words in the documentation. The HTML workshop also contains a viewer for
-# compressed HTML files.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_HTMLHELP = YES
-
-# The CHM_FILE tag can be used to specify the file name of the resulting .chm
-# file. You can add a path in front of the file if the result should not be
-# written to the html output directory.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
CHM_FILE = ../qtools.chm
-
-# The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler (hhc.exe). If non-empty,
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
-# The file has to be specified with full path.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
HHC_LOCATION =
-
-# The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
GENERATE_CHI = NO
-
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
-# and project file content.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
CHM_INDEX_ENCODING =
-
-# The BINARY_TOC flag controls whether a binary table of contents is generated
-# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
-# enables the Previous and Next buttons.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
BINARY_TOC = YES
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members to
-# the table of contents of the HTML help documentation and to the tree view.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
TOC_EXPAND = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
-# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
-# (.qch) of the generated HTML documentation.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
-# the file name of the resulting .qch file. The path specified is relative to
-# the HTML output folder.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
-# Project output. For more information please see Qt Help Project / Namespace
-# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_NAMESPACE = com.state-machine.qp
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
-# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-
-# folders).
-# The default value is: doc.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_VIRTUAL_FOLDER = doc
-
-# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
-# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_CUST_FILTER_NAME =
-
-# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-
-# filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_CUST_FILTER_ATTRS =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHP_SECT_FILTER_ATTRS =
-
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
QHG_LOCATION =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
-# generated, together with the HTML files, they form an Eclipse help plugin. To
-# install this plugin and make it available under the help contents menu in
-# Eclipse, the contents of the directory containing the HTML and XML files needs
-# to be copied into the plugins directory of eclipse. The name of the directory
-# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
-# After copying Eclipse needs to be restarted before the help appears.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_ECLIPSEHELP = NO
-
-# A unique identifier for the Eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have this
-# name. Each documentation set should have its own identifier.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
-
ECLIPSE_DOC_ID = com.state-machine.qp
-
-# If you want full control over the layout of the generated HTML pages it might
-# be necessary to disable the index and replace it with your own. The
-# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
-# of each HTML page. A value of NO enables the index and the value YES disables
-# it. Since the tabs in the index contain the same information as the navigation
-# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
DISABLE_INDEX = YES
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information. If the tag
-# value is set to YES, a side panel will be generated containing a tree-like
-# index structure (just like the one that is generated for HTML Help). For this
-# to work a browser that supports JavaScript, DHTML, CSS and frames is required
-# (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
GENERATE_TREEVIEW = YES
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
-#
-# Note that a value of 0 will completely suppress the enum values from appearing
-# in the overview section.
-# Minimum value: 0, maximum value: 20, default value: 4.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
ENUM_VALUES_PER_LINE = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
-# to set the initial width (in pixels) of the frame in which the tree is shown.
-# Minimum value: 0, maximum value: 1500, default value: 250.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
TREEVIEW_WIDTH = 180
-
-# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
-# external symbols imported via tag files in a separate window.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
EXT_LINKS_IN_WINDOW = NO
-
-# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
-# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
-# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
-# the HTML output. These images will generally look nicer at scaled resolutions.
-# Possible values are: png The default and svg Looks nicer but requires the
-# pdf2svg tool.
-# The default value is: png.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
HTML_FORMULA_FORMAT = png
-
-# Use this tag to change the font size of LaTeX formulas included as images in
-# the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
-# output directory to force them to be regenerated.
-# Minimum value: 8, maximum value: 50, default value: 10.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
FORMULA_FONTSIZE = 10
-
-# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
FORMULA_TRANSPARENT = YES
-
-# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
-# to create new LaTeX commands to be used in formulas as building blocks. See
-# the section "Including formulas" for details.
-
FORMULA_MACROFILE =
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# https://www.mathjax.org) which uses client side JavaScript for the rendering
-# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
-# installed or if you want to formulas look prettier in the HTML output. When
-# enabled you may also need to install MathJax separately and configure the path
-# to it using the MATHJAX_RELPATH option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
USE_MATHJAX = NO
-
-# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
-# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
-# The default value is: HTML-CSS.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
MATHJAX_FORMAT = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the HTML
-# output directory using the MATHJAX_RELPATH option. The destination directory
-# should contain the MathJax.js script. For instance, if the mathjax directory
-# is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
-# Content Delivery Network so you can quickly see the result without installing
-# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from https://www.mathjax.org before deployment.
-# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
-# extension names that should be enabled during MathJax rendering. For example
-# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
MATHJAX_EXTENSIONS =
-
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
-# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
-# example see the documentation.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
MATHJAX_CODEFILE =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
-# should work on any modern browser. Note that when using HTML help
-# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
-# there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
-# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
-# search using the keyboard; to jump to the search box use + S
-# (what the is depends on the OS and browser, but it is typically
-# , /, or both). Inside the search box use the to jump into the search results window, the results can be navigated
-# using the . Press to select an item or to cancel
-# the search. The filter options can be selected when the cursor is inside the
-# search box by pressing +. Also here use the
-# to select a filter and or to activate or cancel the filter
-# option.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
SEARCHENGINE = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using JavaScript. There
-# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
-# setting. When disabled, doxygen will generate a PHP script for searching and
-# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
-# and searching needs to be provided by external tools. See the section
-# "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
SERVER_BASED_SEARCH = NO
-
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
-# script for searching. Instead the search results are written to an XML file
-# which needs to be processed by an external indexer. Doxygen will invoke an
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
-# search results.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/).
-#
-# See the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
EXTERNAL_SEARCH = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server
-# which will return the search results when EXTERNAL_SEARCH is enabled.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/). See the section "External Indexing and
-# Searching" for details.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
SEARCHENGINE_URL =
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
-# search data is written to a file for indexing by an external tool. With the
-# SEARCHDATA_FILE tag the name of this file can be specified.
-# The default file is: searchdata.xml.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
SEARCHDATA_FILE = searchdata.xml
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
-# projects and redirect the results back to the right project.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
EXTERNAL_SEARCH_ID =
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
-# projects other than the one defined by this configuration file, but that are
-# all added to the same external search index. Each project needs to have a
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
-# to a relative location where the documentation can be found. The format is:
-# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
EXTRA_SEARCH_MAPPINGS =
-
#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
-# The default value is: YES.
-
GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked.
-#
-# Note that when not enabling USE_PDFLATEX the default is latex when enabling
-# USE_PDFLATEX the default is pdflatex and when in the later case latex is
-# chosen this is overwritten by pdflatex. For specific output languages the
-# default can have been set differently, this depends on the implementation of
-# the output language.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
-# index for LaTeX.
-# Note: This tag is used in the Makefile / make.bat.
-# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
-# (.tex).
-# The default file is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
MAKEINDEX_CMD_NAME = makeindex
-
-# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
-# generate index for LaTeX. In case there is no backslash (\) as first character
-# it will be automatically added in the LaTeX code.
-# Note: This tag is used in the generated output file (.tex).
-# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
-# The default value is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_MAKEINDEX_CMD = makeindex
-
-# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used by the
-# printer.
-# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
-# 14 inches) and executive (7.25 x 10.5 inches).
-# The default value is: a4.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
PAPER_TYPE = letter
-
-# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. The package can be specified just
-# by its name or with the correct syntax as to be used with the LaTeX
-# \usepackage command. To get the times font for instance you can specify :
-# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
-# To use the option intlimits with the amsmath package you can specify:
-# EXTRA_PACKAGES=[intlimits]{amsmath}
-# If left blank no extra packages will be included.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
-#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_HEADER =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
-# LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_FOOTER =
-
-# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# LaTeX style sheets that are included after the standard style sheets created
-# by doxygen. Using this option one can overrule certain style aspects. Doxygen
-# will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list).
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_EXTRA_STYLESHEET =
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the LATEX_OUTPUT output
-# directory. Note that the files will be copied as-is; there are no commands or
-# markers available.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_EXTRA_FILES =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
-# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
-# contain links (just like the HTML output) instead of page references. This
-# makes the output suitable for online browsing using a PDF viewer.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_BATCHMODE = NO
-
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
-# index chapters (such as File Index, Compound Index, etc.) in the output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_HIDE_INDICES = NO
-
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_SOURCE_CODE = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. See
-# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
-# The default value is: plain.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_BIB_STYLE = plain
-
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_TIMESTAMP = NO
-
-# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
-# path from which the emoji images will be read. If a relative path is entered,
-# it will be relative to the LATEX_OUTPUT directory. If left blank the
-# LATEX_OUTPUT directory will be used.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
LATEX_EMOJI_DIRECTORY =
-
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
-# RTF output is optimized for Word 97 and may not look too pretty with other RTF
-# readers/editors.
-# The default value is: NO.
-
GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: rtf.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
-# contain hyperlink fields. The RTF file will contain links (just like the HTML
-# output) instead of page references. This makes the output suitable for online
-# browsing using Word or some other Word compatible readers that support those
-# fields.
-#
-# Note: WordPad (write) and others do not support links.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# configuration file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-#
-# See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's configuration file. A template extensions file can be
-# generated using doxygen -e rtf extensionFile.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_EXTENSIONS_FILE =
-
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
RTF_SOURCE_CODE = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the man page output
#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
-# classes and files.
-# The default value is: NO.
-
GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it. A directory man3 will be created inside the directory specified by
-# MAN_OUTPUT.
-# The default directory is: man.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to the generated
-# man pages. In case the manual section does not start with a number, the number
-# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
-# optional.
-# The default value is: .3.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
MAN_EXTENSION = .3
-
-# The MAN_SUBDIR tag determines the name of the directory created within
-# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
-# MAN_EXTENSION with the initial . removed.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
MAN_SUBDIR =
-
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
-# will generate one additional man file for each entity documented in the real
-# man page(s). These additional files only source the real man page, but without
-# them the man command would be unable to find the correct page.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
MAN_LINKS = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the XML output
#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
-# captures the structure of the code including all documentation.
-# The default value is: NO.
-
GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: xml.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
XML_OUTPUT = xml
-
-# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
-# listings (including syntax highlighting and cross-referencing information) to
-# the XML output. Note that enabling this will significantly increase the size
-# of the XML output.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
XML_PROGRAMLISTING = YES
-
-# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
-# namespace members in file scope as well, matching the HTML output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
XML_NS_MEMB_FILE_SCOPE = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
-# that can be used to generate PDF.
-# The default value is: NO.
-
GENERATE_DOCBOOK = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
-# front of it.
-# The default directory is: docbook.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
DOCBOOK_OUTPUT = docbook
-
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
DOCBOOK_PROGRAMLISTING = NO
-
#---------------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
-# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
-# the structure of the code including all documentation. Note that this feature
-# is still experimental and incomplete at the moment.
-# The default value is: NO.
-
GENERATE_AUTOGEN_DEF = NO
-
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
-# file that captures the structure of the code including all documentation.
-#
-# Note that this feature is still experimental and incomplete at the moment.
-# The default value is: NO.
-
GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
-# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
-# output from the Perl module output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
-# formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO, the
-# size of the Perl module output will be much smaller and Perl will parse it
-# just the same.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file are
-# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
-# so different doxyrules.make files included by the same Makefile don't
-# overwrite each other's variables.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
PERLMOD_MAKEVAR_PREFIX =
-
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
-# C-preprocessor directives found in the sources and include files.
-# The default value is: YES.
-
ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
-# in the source code. If set to NO, only conditional compilation will be
-# performed. Macro expansion can be done in a controlled way by setting
-# EXPAND_ONLY_PREDEF to YES.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
-# the macro expansion is limited to the macros specified with the PREDEFINED and
-# EXPAND_AS_DEFINED tags.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES, the include files in the
-# INCLUDE_PATH will be searched if a #include is found.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by the
-# preprocessor.
-# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-
INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will be
-# used.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that are
-# defined before the preprocessor is started (similar to the -D option of e.g.
-# gcc). The argument of the tag is a list of macros of the form: name or
-# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
-# is assumed. To prevent a macro definition from being undefined via #undef or
-# recursively expanded use the := operator instead of the = operator.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
PREDEFINED = Q_SPY \
Q_UTEST
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
-# tag can be used to specify a list of macro names that should be expanded. The
-# macro definition that is found in the sources will be used. Use the PREDEFINED
-# tag if you want to use a different macro definition that overrules the
-# definition found in the source code.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all references to function-like macros that are alone on a line, have
-# an all uppercase name, and do not end with a semicolon. Such function macros
-# are typically used for boiler-plate code, and will confuse the parser if not
-# removed.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
SKIP_FUNCTION_MACROS = YES
-
#---------------------------------------------------------------------------
# Configuration options related to external references
#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tag files. For each tag
-# file the location of the external documentation should be added. The format of
-# a tag file without this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where loc1 and loc2 can be relative or absolute paths or URLs. See the
-# section "Linking to external documentation" for more information about the use
-# of tag files.
-# Note: Each tag file must have a unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
-# run, you must also specify the path to the tagfile here.
-
TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
-# tag file that is based on the input files it reads. See section "Linking to
-# external documentation" for more information about the usage of tag files.
-
GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
-# the class index. If set to NO, only the inherited external classes will be
-# listed.
-# The default value is: NO.
-
ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will be
-# listed.
-# The default value is: YES.
-
EXTERNAL_GROUPS = YES
-
-# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
-# the related pages index. If set to NO, only the current project's pages will
-# be listed.
-# The default value is: YES.
-
EXTERNAL_PAGES = YES
-
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
CLASS_DIAGRAMS = YES
-
-# You can include diagrams made with dia in doxygen documentation. Doxygen will
-# then run dia to produce the diagram and insert it in the documentation. The
-# DIA_PATH tag allows you to specify the directory where the dia binary resides.
-# If left empty dia is assumed to be found in the default search path.
-
DIA_PATH =
-
-# If set to YES the inheritance and collaboration graphs will hide inheritance
-# and usage relations if the target is undocumented or is not a class.
-# The default value is: YES.
-
HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
-# Bell Labs. The other options in this section have no effect if this option is
-# set to NO
-# The default value is: NO.
-
HAVE_DOT = NO
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
-# processors available in the system. You can set it explicitly to a value
-# larger than 0 to get control over the balance between CPU load and processing
-# speed.
-# Minimum value: 0, maximum value: 32, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_NUM_THREADS = 0
-
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_FONTNAME = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_FONTSIZE = 10
-
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_FONTPATH =
-
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
-# graph for each documented class showing the direct and indirect implementation
-# dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
UML_LOOK = YES
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
-# class node. If there are many fields or methods and many nodes the graph may
-# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
-# number of items for each type to make the size more manageable. Set this to 0
-# for no limit. Note that the threshold may be exceeded by 50% before the limit
-# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
-# but if the number exceeds 15, the total amount of fields shown is limited to
-# 10.
-# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
UML_LIMIT_NUM_FIELDS = 10
-
-# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
-# collaboration graphs will show the relations between templates and their
-# instances.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
TEMPLATE_RELATIONS = NO
-
-# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
-# direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
INCLUDE_GRAPH = YES
-
-# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command. Disabling a call graph can be
-# accomplished by means of the command \hidecallgraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
CALL_GRAPH = NO
-
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command. Disabling a caller graph can be
-# accomplished by means of the command \hidecallergraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
CALLER_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
-# hierarchy of all classes instead of a textual one.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
-# dependencies a directory has on other directories in a graphical way. The
-# dependency relations are determined by the #include relations between the
-# files in the directories.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. For an explanation of the image formats see the section
-# output formats in the documentation of the dot tool (Graphviz (see:
-# http://www.graphviz.org/)).
-# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
-# to make the SVG files visible in IE 9+ (other browsers do not have this
-# requirement).
-# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
-# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
-# png:gdiplus:gdiplus.
-# The default value is: png.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_IMAGE_FORMAT = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-#
-# Note that this requires a modern browser other than Internet Explorer. Tested
-# and working are Firefox, Chrome, Safari, and Opera.
-# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
-# the SVG files visible. Older versions of IE do not have SVG support.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
INTERACTIVE_SVG = NO
-
-# The DOT_PATH tag can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_PATH = C:/tools/graphviz/bin
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the \dotfile
-# command).
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOTFILE_DIRS =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
-
MSCFILE_DIRS =
-
-# The DIAFILE_DIRS tag can be used to specify one or more directories that
-# contain dia files that are included in the documentation (see the \diafile
-# command).
-
DIAFILE_DIRS =
-
-# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
-
PLANTUML_JAR_PATH =
-
-# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
-# configuration file for plantuml.
-
PLANTUML_CFG_FILE =
-
-# When using plantuml, the specified paths are searched for files specified by
-# the !include statement in a plantuml block.
-
PLANTUML_INCLUDE_PATH =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
-# that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
-# children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
-# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-# Minimum value: 0, maximum value: 10000, default value: 50.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_GRAPH_MAX_NODES = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
-# generated by dot. A depth value of 3 means that only nodes reachable from the
-# root by following a path via at most 3 edges will be shown. Nodes that lay
-# further from the root node will be omitted. Note that setting this option to 1
-# or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-# Minimum value: 0, maximum value: 1000, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
MAX_DOT_GRAPH_DEPTH = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10) support
-# this, this feature is disabled by default.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_MULTI_TARGETS = NO
-
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
-# explaining the meaning of the various boxes and arrows in the dot generated
-# graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
-# files that are used to generate the various graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
DOT_CLEANUP = YES
diff --git a/doxygen/gs.dox b/doxygen/gs.dox
index cf2c032..40edcec 100644
--- a/doxygen/gs.dox
+++ b/doxygen/gs.dox
@@ -30,7 +30,7 @@ set QTOOLS=C:\qp\qtools
@endverbatim
@note
-Defining the `QTOOLS` environment variable is required to run @ref qutest "QUTest Unit Testing" and @ref qspyview "QSpyView Visualization and Monitoring" utilities.
+Defining the `QTOOLS` environment variable is required to run @ref qutest "QUTest Unit Testing" and @ref qview "QView Visualization and Monitoring" utilities.
@@ -49,7 +49,7 @@ export QTOOLS=~/qp/qtools
@endverbatim
@note
-Defining the `QTOOLS` environment variable is required to run @ref qutest "QUTest Unit Testing" and @ref qspyview "QSpyView Visualization and Monitoring" utilities.
+Defining the `QTOOLS` environment variable is required to run @ref qutest "QUTest Unit Testing" and @ref qview "QView Visualization and Monitoring" utilities.
@@ -64,13 +64,10 @@ The following annotated directory tree in the standard QTools™`qspy.exe` — @ref qspy "QSPY executable"
`qclean.exe` — @ref qclean
`qfsgen.exe` — @ref qfsgen
- `qcalc.tcl` — @ref qcalc
~ ~ ~
`make.exe` — make utility
`rm.exe` — rm (remove) utility
`python.bat` — Batch file to call Python
- `tclsh.bat` — Batch file to call Tcl interpreter
- `wish.bat` — Batch file to call Tk interpreter
qspy — @ref qspy "QSPY tool" for software tracing and testing
@@ -79,16 +76,13 @@ The following annotated directory tree in the standard QTools™posix — QSPY port to POSIX (Linux, macOS)
py — Python support (@ref qutest "QUTest")
win32 — QSPY port to Windows
- tcl — Tcl/Tk scripts (@ref qspyview "QSpyView")
- matlab — @ref qspy_matlab "QSPY MATLAB Support"
- *** The following directories are present in QTools for Windows only ***
+ The following directories are present in QTools for Windows only
qwin — @ref qwin
MinGW — GNU C/C++ toolset for Windows (32-bit)
gnu_arm-none-eabi — GNU ARM-EABI toolset for Windows
Python38 — Python 3.8 for Windows
- tcl_8.6 — Tcl/Tk 8.6 for Windows
diff --git a/doxygen/history.dox b/doxygen/history.dox
index c044d2f..3e14eaa 100644
--- a/doxygen/history.dox
+++ b/doxygen/history.dox
@@ -1,6 +1,53 @@
/**
@page history Revision History
+@section qtools_6_9_0 Version 6.9.0, 2020-08-21
+
+This release represents a major overhaul of QTools. Specifically, this release brings the new @ref qview component, which replaces QSpyView written originally in Tcl/Tk. The new @ref qview "QView" is written in **Python** (3.3.+) and brings much commonality with the @ref qutest, which has also been re-structured and improved.
+
+@note
+Starting with this version, both @ref qview and @ref qutest require **Python3** (3.3+) and are **no longer compatible** with Python2. The support for Tcl/Tk has been dropped entirely in QTools.
+
+
+__Changes in Directory Structure__
+
+The new new @ref qview "QView" and the updated @ref qutest "QUTest" components are now located directly under the `qtools` folder and are no longer in the `qtools\qspy` folder. Here is the new `qtools` directory structure:
+
+@code{py}
+qtools/
++---bin/
++---gnu_arm-none-eabi/
++---matlab/
++---mingw32/
++---Python38/
++---qclean/
++---qspy/
++---qutest/ # <== new qutest location
++---qview/ # <== new qview location
++---qwin/
++---Unity/
+@endcode
+
+@note
+The changes in the QTools directory structure have impact on the QUTest testing, because the Makefiles (or any other build tools you might be using) need to be adjusted to the new location of the `qutest.py` script.
+
+
+__Changes in QSPY:__
+
+- The @ref qspy "QSPY host utility" has been extended with @ref qspy_seq "Sequence Diagram Output".
+This new feature replaces the previous support for MscGen and is no longer reliant on any such external tools.
+
+- QSPY now recognizes the new QS trace record #QS_QF_RUN
+
+@note
+The #QS_QF_RUN record is now generated in @ref qutest "QUTest", which requires adjustments in the existing @ref qutest_script "test scripts". Specifically, the test scripts that provide their own on_reset() callback must now also call expect_run().
+
+
+__Bug Fixes:__
+
+- [bug#153 QSPY Creating corrupt MscGen files](https://sourceforge.net/p/qpc/bugs/153/)
+
+
@section qtools_6_8_2 Version 6.8.2, 2020-07-17
- Changed the QS trace record name QS_QF_ACTIVE_POST_FIFO to ::QS_QF_ACTIVE_POST and QS_QF_EQUEUE_POST_FIFO to ::QS_QF_EQUEUE_POST. This refactoring now better matches the QP/C/C++ API QACTIVE_POST() and QEQueue_post().
@@ -8,10 +55,9 @@
- Applied new, clearer styling to the Doxygen documentation.
-
@section qtools_6_8_1 Version 6.8.1, 2020-04-04
-Fixed the following bugs:
+__Bug Fixes:__
- [bug#263 QSPY handles incorrectly empty strings ](https://sourceforge.net/p/qpc/bugs/263/)
Also, improved some comments in QUTest scripting documentation (qutest.py).
diff --git a/doxygen/images/qspy_qspyview.gif b/doxygen/images/qspy_qspyview.gif
deleted file mode 100644
index 64935ef..0000000
Binary files a/doxygen/images/qspy_qspyview.gif and /dev/null differ
diff --git a/doxygen/images/qspy_qview.gif b/doxygen/images/qspy_qview.gif
new file mode 100644
index 0000000..9380b6e
Binary files /dev/null and b/doxygen/images/qspy_qview.gif differ
diff --git a/doxygen/images/qspyview.gif b/doxygen/images/qspyview.gif
deleted file mode 100644
index b0eeeef..0000000
Binary files a/doxygen/images/qspyview.gif and /dev/null differ
diff --git a/doxygen/images/qspyview.png b/doxygen/images/qspyview.png
deleted file mode 100644
index a8ec4b8..0000000
Binary files a/doxygen/images/qspyview.png and /dev/null differ
diff --git a/doxygen/images/qspyview_before.gif b/doxygen/images/qspyview_before.gif
deleted file mode 100644
index 4719bbb..0000000
Binary files a/doxygen/images/qspyview_before.gif and /dev/null differ
diff --git a/doxygen/images/qspyview_ex.gif b/doxygen/images/qspyview_ex.gif
deleted file mode 100644
index a697865..0000000
Binary files a/doxygen/images/qspyview_ex.gif and /dev/null differ
diff --git a/doxygen/images/qspyview_ex.png b/doxygen/images/qspyview_ex.png
deleted file mode 100644
index 891b307..0000000
Binary files a/doxygen/images/qspyview_ex.png and /dev/null differ
diff --git a/doxygen/images/qspyview_file.gif b/doxygen/images/qspyview_file.gif
deleted file mode 100644
index f0f8a4b..0000000
Binary files a/doxygen/images/qspyview_file.gif and /dev/null differ
diff --git a/doxygen/images/qspyview_help.gif b/doxygen/images/qspyview_help.gif
deleted file mode 100644
index d6b79e1..0000000
Binary files a/doxygen/images/qspyview_help.gif and /dev/null differ
diff --git a/doxygen/images/qspyview_known.gif b/doxygen/images/qspyview_known.gif
deleted file mode 100644
index 0341ff7..0000000
Binary files a/doxygen/images/qspyview_known.gif and /dev/null differ
diff --git a/doxygen/images/qspyview_shortcut.gif b/doxygen/images/qspyview_shortcut.gif
deleted file mode 100644
index e1a8f5f..0000000
Binary files a/doxygen/images/qspyview_shortcut.gif and /dev/null differ
diff --git a/doxygen/images/qspyview_unknown.gif b/doxygen/images/qspyview_unknown.gif
deleted file mode 100644
index b746263..0000000
Binary files a/doxygen/images/qspyview_unknown.gif and /dev/null differ
diff --git a/doxygen/images/qspyview_view.gif b/doxygen/images/qspyview_view.gif
deleted file mode 100644
index 504c618..0000000
Binary files a/doxygen/images/qspyview_view.gif and /dev/null differ
diff --git a/doxygen/images/qutest_banner.jpg b/doxygen/images/qutest_banner.jpg
index 5a3c46f..5ec2981 100644
Binary files a/doxygen/images/qutest_banner.jpg and b/doxygen/images/qutest_banner.jpg differ
diff --git a/doxygen/images/qview.gif b/doxygen/images/qview.gif
new file mode 100644
index 0000000..1f6b781
Binary files /dev/null and b/doxygen/images/qview.gif differ
diff --git a/doxygen/images/qview.jpg b/doxygen/images/qview.jpg
new file mode 100644
index 0000000..7935a37
Binary files /dev/null and b/doxygen/images/qview.jpg differ
diff --git a/doxygen/images/qview.png b/doxygen/images/qview.png
new file mode 100644
index 0000000..60c437d
Binary files /dev/null and b/doxygen/images/qview.png differ
diff --git a/doxygen/images/qspyview1.png b/doxygen/images/qview1.png
similarity index 100%
rename from doxygen/images/qspyview1.png
rename to doxygen/images/qview1.png
diff --git a/doxygen/images/qspyview_ao.png b/doxygen/images/qview_ao.png
similarity index 100%
rename from doxygen/images/qspyview_ao.png
rename to doxygen/images/qview_ao.png
diff --git a/doxygen/images/qview_attach.gif b/doxygen/images/qview_attach.gif
new file mode 100644
index 0000000..094a5c8
Binary files /dev/null and b/doxygen/images/qview_attach.gif differ
diff --git a/doxygen/images/qview_banner.jpg b/doxygen/images/qview_banner.jpg
new file mode 100644
index 0000000..02076c1
Binary files /dev/null and b/doxygen/images/qview_banner.jpg differ
diff --git a/doxygen/images/qview_before.gif b/doxygen/images/qview_before.gif
new file mode 100644
index 0000000..857acaf
Binary files /dev/null and b/doxygen/images/qview_before.gif differ
diff --git a/doxygen/images/qspyview_canv_dpp.gif b/doxygen/images/qview_canv_dpp.gif
similarity index 100%
rename from doxygen/images/qspyview_canv_dpp.gif
rename to doxygen/images/qview_canv_dpp.gif
diff --git a/doxygen/images/qspyview_canvas.gif b/doxygen/images/qview_canvas.gif
similarity index 100%
rename from doxygen/images/qspyview_canvas.gif
rename to doxygen/images/qview_canvas.gif
diff --git a/doxygen/images/qspyview_canvas.png b/doxygen/images/qview_canvas.png
similarity index 100%
rename from doxygen/images/qspyview_canvas.png
rename to doxygen/images/qview_canvas.png
diff --git a/doxygen/images/qview_cmd.gif b/doxygen/images/qview_cmd.gif
new file mode 100644
index 0000000..35fc6b3
Binary files /dev/null and b/doxygen/images/qview_cmd.gif differ
diff --git a/doxygen/images/qspyview_cmd.png b/doxygen/images/qview_cmd.png
similarity index 100%
rename from doxygen/images/qspyview_cmd.png
rename to doxygen/images/qview_cmd.png
diff --git a/doxygen/images/qview_cmd_dlg.gif b/doxygen/images/qview_cmd_dlg.gif
new file mode 100644
index 0000000..c31d47c
Binary files /dev/null and b/doxygen/images/qview_cmd_dlg.gif differ
diff --git a/doxygen/images/qview_cmd_peek.gif b/doxygen/images/qview_cmd_peek.gif
new file mode 100644
index 0000000..4410dde
Binary files /dev/null and b/doxygen/images/qview_cmd_peek.gif differ
diff --git a/doxygen/images/qview_cmd_poke.gif b/doxygen/images/qview_cmd_poke.gif
new file mode 100644
index 0000000..90b13ac
Binary files /dev/null and b/doxygen/images/qview_cmd_poke.gif differ
diff --git a/doxygen/images/qspyview_commands.gif b/doxygen/images/qview_commands.gif
similarity index 100%
rename from doxygen/images/qspyview_commands.gif
rename to doxygen/images/qview_commands.gif
diff --git a/doxygen/images/qspyview_commands.png b/doxygen/images/qview_commands.png
similarity index 100%
rename from doxygen/images/qspyview_commands.png
rename to doxygen/images/qview_commands.png
diff --git a/doxygen/images/qview_curr.gif b/doxygen/images/qview_curr.gif
new file mode 100644
index 0000000..93ba7bd
Binary files /dev/null and b/doxygen/images/qview_curr.gif differ
diff --git a/doxygen/images/qview_curr_dlg.gif b/doxygen/images/qview_curr_dlg.gif
new file mode 100644
index 0000000..4fe44c9
Binary files /dev/null and b/doxygen/images/qview_curr_dlg.gif differ
diff --git a/doxygen/images/qview_cust.gif b/doxygen/images/qview_cust.gif
new file mode 100644
index 0000000..1eaeb47
Binary files /dev/null and b/doxygen/images/qview_cust.gif differ
diff --git a/doxygen/images/qspyview_custom.gif b/doxygen/images/qview_custom.gif
similarity index 100%
rename from doxygen/images/qspyview_custom.gif
rename to doxygen/images/qview_custom.gif
diff --git a/doxygen/images/qview_dpp-fedora.gif b/doxygen/images/qview_dpp-fedora.gif
new file mode 100644
index 0000000..cb8a1f1
Binary files /dev/null and b/doxygen/images/qview_dpp-fedora.gif differ
diff --git a/doxygen/images/qview_event.gif b/doxygen/images/qview_event.gif
new file mode 100644
index 0000000..3b7760e
Binary files /dev/null and b/doxygen/images/qview_event.gif differ
diff --git a/doxygen/images/qspyview_event.png b/doxygen/images/qview_event.png
similarity index 100%
rename from doxygen/images/qspyview_event.png
rename to doxygen/images/qview_event.png
diff --git a/doxygen/images/qspyview_events.gif b/doxygen/images/qview_events.gif
similarity index 100%
rename from doxygen/images/qspyview_events.gif
rename to doxygen/images/qview_events.gif
diff --git a/doxygen/images/qview_evt_dlg.gif b/doxygen/images/qview_evt_dlg.gif
new file mode 100644
index 0000000..fb7d9eb
Binary files /dev/null and b/doxygen/images/qview_evt_dlg.gif differ
diff --git a/doxygen/images/qview_ex.gif b/doxygen/images/qview_ex.gif
new file mode 100644
index 0000000..2cb54dc
Binary files /dev/null and b/doxygen/images/qview_ex.gif differ
diff --git a/doxygen/images/qview_ex.png b/doxygen/images/qview_ex.png
new file mode 100644
index 0000000..5440aac
Binary files /dev/null and b/doxygen/images/qview_ex.png differ
diff --git a/doxygen/images/qview_file.gif b/doxygen/images/qview_file.gif
new file mode 100644
index 0000000..e9598d5
Binary files /dev/null and b/doxygen/images/qview_file.gif differ
diff --git a/doxygen/images/qspyview_filters.gif b/doxygen/images/qview_filters.gif
similarity index 100%
rename from doxygen/images/qspyview_filters.gif
rename to doxygen/images/qview_filters.gif
diff --git a/doxygen/images/qview_glob.gif b/doxygen/images/qview_glob.gif
new file mode 100644
index 0000000..2420636
Binary files /dev/null and b/doxygen/images/qview_glob.gif differ
diff --git a/doxygen/images/qview_glob_dlg.gif b/doxygen/images/qview_glob_dlg.gif
new file mode 100644
index 0000000..925c7b5
Binary files /dev/null and b/doxygen/images/qview_glob_dlg.gif differ
diff --git a/doxygen/images/qspyview_global.gif b/doxygen/images/qview_global.gif
similarity index 100%
rename from doxygen/images/qspyview_global.gif
rename to doxygen/images/qview_global.gif
diff --git a/doxygen/images/qview_help.gif b/doxygen/images/qview_help.gif
new file mode 100644
index 0000000..1f237e6
Binary files /dev/null and b/doxygen/images/qview_help.gif differ
diff --git a/doxygen/images/qview_known.gif b/doxygen/images/qview_known.gif
new file mode 100644
index 0000000..9dd1fc8
Binary files /dev/null and b/doxygen/images/qview_known.gif differ
diff --git a/doxygen/images/qview_loc.gif b/doxygen/images/qview_loc.gif
new file mode 100644
index 0000000..8351cd3
Binary files /dev/null and b/doxygen/images/qview_loc.gif differ
diff --git a/doxygen/images/qview_loc_dlg.gif b/doxygen/images/qview_loc_dlg.gif
new file mode 100644
index 0000000..d527e21
Binary files /dev/null and b/doxygen/images/qview_loc_dlg.gif differ
diff --git a/doxygen/images/qspyview_local.png b/doxygen/images/qview_local.png
similarity index 100%
rename from doxygen/images/qspyview_local.png
rename to doxygen/images/qview_local.png
diff --git a/doxygen/images/qspyview_menu.gif b/doxygen/images/qview_menu.gif
similarity index 100%
rename from doxygen/images/qspyview_menu.gif
rename to doxygen/images/qview_menu.gif
diff --git a/doxygen/images/qspyview_no_text.gif b/doxygen/images/qview_no_text.gif
similarity index 100%
rename from doxygen/images/qspyview_no_text.gif
rename to doxygen/images/qview_no_text.gif
diff --git a/doxygen/images/qspyview_peek.png b/doxygen/images/qview_peek.png
similarity index 100%
rename from doxygen/images/qspyview_peek.png
rename to doxygen/images/qview_peek.png
diff --git a/doxygen/images/qspyview_poke.png b/doxygen/images/qview_poke.png
similarity index 100%
rename from doxygen/images/qspyview_poke.png
rename to doxygen/images/qview_poke.png
diff --git a/doxygen/images/qspyview_screen.png b/doxygen/images/qview_screen.png
similarity index 100%
rename from doxygen/images/qspyview_screen.png
rename to doxygen/images/qview_screen.png
diff --git a/doxygen/images/qview_shortcut.gif b/doxygen/images/qview_shortcut.gif
new file mode 100644
index 0000000..0606eff
Binary files /dev/null and b/doxygen/images/qview_shortcut.gif differ
diff --git a/doxygen/images/qspyview_unknonw.gif b/doxygen/images/qview_unknonw.gif
similarity index 100%
rename from doxygen/images/qspyview_unknonw.gif
rename to doxygen/images/qview_unknonw.gif
diff --git a/doxygen/images/qview_unknown.gif b/doxygen/images/qview_unknown.gif
new file mode 100644
index 0000000..b7a61f4
Binary files /dev/null and b/doxygen/images/qview_unknown.gif differ
diff --git a/doxygen/images/qview_view.gif b/doxygen/images/qview_view.gif
new file mode 100644
index 0000000..86df474
Binary files /dev/null and b/doxygen/images/qview_view.gif differ
diff --git a/doxygen/images/seq_defer.gif b/doxygen/images/seq_defer.gif
new file mode 100644
index 0000000..2141a7a
Binary files /dev/null and b/doxygen/images/seq_defer.gif differ
diff --git a/doxygen/images/seq_dpp.gif b/doxygen/images/seq_dpp.gif
new file mode 100644
index 0000000..cadbe5f
Binary files /dev/null and b/doxygen/images/seq_dpp.gif differ
diff --git a/doxygen/img/img.htm b/doxygen/img/img.htm
index a07e8c5..23c0c23 100644
--- a/doxygen/img/img.htm
+++ b/doxygen/img/img.htm
@@ -7,6 +7,10 @@
+
+
+
+
diff --git a/doxygen/img/logo_linux48.png b/doxygen/img/logo_linux48.png
new file mode 100644
index 0000000..b71bb3d
Binary files /dev/null and b/doxygen/img/logo_linux48.png differ
diff --git a/doxygen/img/logo_macos48.png b/doxygen/img/logo_macos48.png
new file mode 100644
index 0000000..5f9440d
Binary files /dev/null and b/doxygen/img/logo_macos48.png differ
diff --git a/doxygen/img/logo_python3.gif b/doxygen/img/logo_python3.gif
new file mode 100644
index 0000000..c5c9a01
Binary files /dev/null and b/doxygen/img/logo_python3.gif differ
diff --git a/doxygen/img/logo_ql.gif b/doxygen/img/logo_ql.gif
deleted file mode 100644
index 2c04ce7..0000000
Binary files a/doxygen/img/logo_ql.gif and /dev/null differ
diff --git a/doxygen/img/logo_win48.png b/doxygen/img/logo_win48.png
new file mode 100644
index 0000000..0ae940c
Binary files /dev/null and b/doxygen/img/logo_win48.png differ
diff --git a/doxygen/main.dox b/doxygen/main.dox
index e234cc9..ed3dfab 100644
--- a/doxygen/main.dox
+++ b/doxygen/main.dox
@@ -13,12 +13,11 @@ QTools™ is a collection of open source tools for embedded software develop
- @ref qpspy "QP/Spy software tracing and testing for embedded systems", which includes:
+ @ref qs "QS™ Target-Resident Component"
+ @ref qspy "QSPY™ Host Application"
- + @ref qutest "QUTest™ Unit Testing Harness"
- + @ref qspyview "QSpyView™ Visualization & Monitoring"
++ @ref qutest "QUTest™ Unit Testing Harness"
++ @ref qview "QView™ Visualization & Monitoring"
- @ref qwin "QWin GUI toolkit for prototyping embedded systems on Windows in C or C++"
- @ref qclean "QClean utility for cleaning the white space in the source code"
- @ref qfsgen "QFSGen utility for building ROM-based file systems"
-- @ref qcalc "QCalc C programmer's calculator"
@section qtools_win QTools™ on Windows
@@ -27,18 +26,14 @@ The QTools Collection for Windows contains additionally the following open-sourc
- GNU-make for Windows (version 4.2.1)
- GNU C/C++ toolchain for Windows (MinGW version 9.2.0)
- GNU C/C++ toolchain for ARM Cortex-M and Cortex-R ([GNU Arm Embedded Toolchain](https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/))
-- Python for Windows (version 3.8 embeddable)
-- Tcl/Tk for Windows (version 8.6) with **UDP sockets extension**
-
-
+- Python for Windows (version 3.8 with tkinter)
+
@section qtools_licensing Licensing QTools™
Most tools included in the QTools™ collection are distributed under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. The text of GPL version 2 is included in the
file GPLv2.txt in the root directory of the QTools distribution.
-
-The Python package is distributed under the terms of the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2, included in the file LICENSE.txt in the Python38 sub-directory of the QTools distribution.
-The Tcl/Tk package is distributed under the terms of the TCL LICENSE AGREEMENT, included in the file LICENSE.txt in the tcl_8.6 sub-directory of the QTools distribution.
+The Python package is distributed under the terms of the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2, included in the file LICENSE.txt in the Python38 sub-directory of the QTools distribution.
@section qtools_source Source Code
@@ -49,7 +44,6 @@ subdirectory, except for the QSPY source code, which is provided in the
have been developed and are copyrighted by Quantum Leaps.
-
@subsection qtools_mingw The MinGW C and C++ compilers for Windows
Have been taken from the MinGW project at:
@@ -68,7 +62,6 @@ https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
The source code is available from the download page under "Source Invariant".
-
@subsection qtools_make The GNU make executable for Windows
Has been taken from the MinGW project at:
@@ -80,7 +73,6 @@ project at:
http://www.gnu.org/software/make
-
@subsection qtools_util The file and diff utilities
Have been taken from the UnixUtils project at SourceForge.net:
@@ -93,15 +85,14 @@ been taken from:
https://prdownloads.sourceforge.net/unxutils/UnxUtilsSrc.zip
-
@section qtools_help How to get help?
Please post any **technical questions** to the Free Support Forum hosted on SourceForge.net. Posts to this forum benefit the whole community and are typically answered the same day.
Direct [commercial support](https://www.state-machine.com/licensing/#Support) is available to the commercial licensees. Every commercial license includes one year of Technical Support for the licensed software. The support term can be extended annually.
-[Training and consulting](https://www.state-machine.com/support/training) services are also available from Quantum Leaps.
+[Training and consulting](https://www.state-machine.com/support/training) services are also available from Quantum Leaps.
+
-
@next{gs}
*/
diff --git a/doxygen/qcalc.dox b/doxygen/qcalc.dox
deleted file mode 100644
index 6091f92..0000000
--- a/doxygen/qcalc.dox
+++ /dev/null
@@ -1,97 +0,0 @@
-/*! @page qcalc QCalc Programmer's Calculator
-
-@tableofcontents
-
-QCalc is a powerful, cross-platform calculator specifically designed for embedded systems programmers. The calculator accepts *whole expressions* in the @ref qcalc_expr "C-syntax" and displays results simultaneously in decimal, hexadecimal, and binary without the need to explicitly convert the result to these bases.
-
-
-@image html qcalc.png "QCalc user interface"
-
-@note
-The calculator GUI provides a resizable *user input* filed, where you can type **complete C expressions**. You can also **copy-and-paste** expressions into and from the *input filed* to use them directly in **your C code**.
-
-
-
-@section qcalc_usage QCalc Usage
-QCalc is included in the QTools Collection in the sub-directory qtools/bin/ and consists of a single file qcalc.tcl . To launch QCalc, you need to open this file with the wish Tk interpreter.
-
-@note
-The wish Tk interpreter is included in the QTools collection for Windows and is also pre-installed in most Linux distributions.
-
-
-You use QCalc by typing (or pasting) an expression in the *user input* field and pressing Enter to evaluate the expression. You can conveniently edit any expression already inside the *user input* field, and you can @ref qcacl_hist "recall the previous expressions" by means of the Up and Down keys. You can also resize the QCalc window to see more or less of the *input field*.
-
-
-@subsection qcalc_win QCalc on Windows
-The wish Tk interpreter is conveniently provided in the same qtools/bin/ directory as the qcalc.tcl script. The directory contains also a shortcut qcalc , which you can copy to your desktop.
-
-@image html qcalc_lnk.png "Shortcut for launching QCalc on Windows"
-
-
-
-@subsection qcalc_linux QCalc on Linux
-Most Linux distributions contain the Tk interpreter, which you can use to launch QCalc. You can do this either from a terminal, by typing `wish $QTOOLS/qcalc.tcl &` or by creating a shortcut to `wish` with the command-line argument `$QTOOLS/qcalc.tcl`.
-
-@image html qcalc_linux.png "Calc on Linux"
-
-
-
-@section qcalc_features QCalc Features
-
-@subsection qcalc_expr Expressions in C-Syntax
-The most important feature of QCalc is that it accepts expressions in the **C-syntax** -- with the same operands and precedence rules as in the C or C++ source code. Among others, the expressions can contain all bit-wise operators (`<<`, `>>`, `|`, `&`, `^`, `~`) as well as mixed decimal, **hexadecimal** and even @ref qcalc_bin "binary" constants. QCalc is also a powerful floating-point scientific calculator and supports all mathematical functions (`sin()`, `cos()`, `tan()`, `exp()`, `ln()`, ...). Some examples of acceptable expressions are:
-
-`((0xBEEF << 16) | 1280) & ~0xFF` -- binary operators, mixed hex and decimal numbers@n
-`($1011 << 24) | (1280 >> 8) ^ 0xFFF0` -- mixed @ref qcalc_bin "binary", dec and hex numbers@n
-`(1234 % 55) + 4321/33` -- remainder, integer division@n
-`pow(sin($pi),2) + pow(cos($pi),2)` -- scientific floating-point calculations, pi-constant@n
-`($0111 & $GPIO_EXTIPINSELL_EXTIPINSEL0_MASK) << ($GPIO_EXTIPINSELL_EXTIPINSEL1_SHIFT * 12)` - @ref qcalc_var "user defined variables"@n
-
-@note
-QCalc internally uses the Tcl command expr to evaluate the expressions. Please refer to the documentation of the Tcl expr command for more details of supported syntax and features.
-
-
-
-@subsection qcalc_conv Automatic conversion to hexadecimal and binary
-If the result of expression evaluation is integer (as opposed to floating point), QCalc automatically displays the result in hexadecimal and binary formats (see QCalc GUI). For better readability the hex display shows a comma between the two 16-bit half-words (e.g., `0xDEAD,BEEF`). Similarly, the binary output shows a comma between the four 8-bit bytes (e.g., `0b11011110,10101101,10111110,11101111`).
-
-
-
-@subsection qcalc_bin Binary constants
-As the extension to the C-syntax, QCalc supports **binary numbers** in the range from 0-15 (0b0000-0b1111). These binary constants are represented as `$0000`, `$0001`, `$0010`,..., `$1110`, and `$1111` and can be mixed into expressions. Here are a few examples of such expressions:
-
-`($0110 << 14) & 0xDEADBEEF` @n
-`($0010 | $1000) * 123` @n
-
-
-
-@subsection qcalc_hist History of inputs
-QCalc remembers the history of up to 8 most recently entered expressions. You can recall and navigate the history of previously entered expressions by pressing the Up / Down keys.
-
-
-@subsection qcalc_ans The $ans variable
-QCalc stores the result of the last computation in the **$ans** variable (note the dollar sign `$` in front of the variable name). Here are some examples of expressions with the `$ans` variable:
-
-`1/$ans` -- find the inverse of the last computation@n
-`log($ans)/log(2)` -- find log-base-2 of the last computation@n
-
-
-@subsection qcalc_var User variables
-QCalc allows you also to define any number of your own **user variables**. To set a variable, you simply type the expression `=alpha` in the *user input* field. This will define the variable `alpha` and assign it the value of the last computation (`$ans`). Subsequently, you can use your `alpha` variable in expressions by typing $ `alpha` (note the dollar sign `$` in front of the variable name). Here is example of defining and using variable `$GPIO_BASE`:
-
-`0xE000E000` -- set some value into `$ans`@n
-`=GPIO_BASE` -- define user variable `GPIO_BASE` and set it to `$ans`@n
-`$GPIO_BASE + 0x400` -- use the variable `$GPIO_BASE` in an expression@n
-
-
-@note
-The names of user variables are case-sensitive.
-
-
-@subsection qcalc_error Error handling
-Expressions that you enter into QCalc might have all kinds of errors: syntax errors, computation errors (e.g., division by zero), undefined variable errors, etc. In all these cases, QCalc responds with the `Error` message and the explanation of the error:
-
-@image html qcalc_err.png "QCalc reacting to a syntax error"
-
-@next{qfsgen}
-*/
diff --git a/doxygen/qclean.dox b/doxygen/qclean.dox
index cab1e9c..85a1d05 100644
--- a/doxygen/qclean.dox
+++ b/doxygen/qclean.dox
@@ -88,8 +88,9 @@ FILE TYPE | END-OF-LINE | TRAILING WS | TABS | LONG-LINES
`.md` | DOS (CR,LF) | remove | remove | don't check
`.bat` | DOS (CR,LF) | remove | remove | don't check
`.ld` | Unix (LF) | remove | remove | check
-`.tcl` | Unix (LF) | remove | remove | check
`.py` | Unix (LF) | remove | remove | check
+`.pyw` | Unix (LF) | remove | remove | check
+`.tcl` | Unix (LF) | remove | remove | check
`.java` | Unix (LF) | remove | remove | check
`Makefile` | Unix (LF) | remove | leave | check
`.mak` | Unix (LF) | remove | leave | check
@@ -109,5 +110,5 @@ The cleanup rules specified in the table above can be easily customized by editi
@attention
For best code portability, QClean enforces the consistent use of the specified End-Of-Line convention (typically Unix (LF)), **regardless of the native EOL of the platform**. The DOS/Windows EOL convention (CR,LF) is typically not applied because it causes compilation problems on Unix-like systems (Specifically, the C preprocessor doesn't correctly parse the multi-line macros.) On the other hand, most DOS/Windows compilers seem to tolerate the Unix EOL convention without problems.
-@next{qcalc}
+@next{qfsgen}
*/
diff --git a/doxygen/qpspy.dox b/doxygen/qpspy.dox
index cac8dd9..8e21601 100644
--- a/doxygen/qpspy.dox
+++ b/doxygen/qpspy.dox
@@ -22,7 +22,7 @@ Software tracing is particularly effective and powerful in combination with the
@image html qpspy0.gif "Software tracing data records flowing from Target to the Host"
@remarks
-QP/Spy can also (optionally) send commands and data **to the embedded target** (see @ref qpspy_rx "Bi-Directional QP/Spy"), which serves as the basis for @ref qutest "Unit Testing" and for @ref qspyview "Visualization" subsystems of the QP/Spy system.
+QP/Spy can also (optionally) send commands and data **to the embedded target** (see @ref qpspy_rx "Bi-Directional QP/Spy"), which serves as the basis for @ref qutest "Unit Testing" and for @ref qview "Visualization and Monitoring" subsystems of the QP/Spy system.
@@ -71,13 +71,13 @@ Finally, the tracing facility must allow consolidating data from all parts of th
@subsection qpspy_rx Bi-Directional Connection to the Target
-While traditional software tracing systems support only uni-directional output of trace data from the embedded Target to a Host computer, QP/Spy supports bi-directional communication to the target as well. This capability allows users to send commands and data to the Target and form the basis for @ref qutest "Unit Testing" and @ref qspyview "Visualization and Monitoring" of embedded Targets.
+While traditional software tracing systems support only uni-directional output of trace data from the embedded Target to a Host computer, QP/Spy supports bi-directional communication to the target as well. This capability allows users to send commands and data to the Target and form the basis for @ref qutest "Unit Testing" and @ref qview "Visualization and Monitoring" of embedded Targets.
@image html qpspy1.gif "Bi-directional data exchange between the Target and the Host"
@subsection qpspy_udp UDP Socket Extension
-The QP/Spy system provides a @ref qspy_udp "UDP socket", which is open for communication with various Front-Ends (GUI-based or "headless"). Currently, the UDP connection point is used by the @ref qutest "QUTest" headless (console-based) front-end and GUI-based @ref qspyview "QSpyView" front-end.
+The QP/Spy system provides a @ref qspy_udp "UDP socket", which is open for communication with various Front-Ends (GUI-based or "headless"). Currently, the UDP connection point is used by the @ref qutest "QUTest" headless (console-based) front-end and GUI-based @ref qview "QView" front-end.
diff --git a/doxygen/qs.dox b/doxygen/qs.dox
index 9b52253..a49bdd7 100644
--- a/doxygen/qs.dox
+++ b/doxygen/qs.dox
@@ -175,7 +175,7 @@ QS_END()
Obviously, QS cannot eliminate completely the overhead of software tracing. But with the fine-granularity filters available in QS, you can make this impact as small as necessary. For greatest flexibility, QS uses two complementary levels of filters: **Global Filters** and **Local Filters** described below. Combination of such two complementary filtering criteria results in very selective tracing capabilities.
@note
-The Global and Local filters are initialized in the Target. Subsequently, if the QS receive channel is enabled (@ref qs_rx "QS-RX"), the filters can be changed from the @ref qutest "QUTest" or @ref qspyview "QSpyView" front-ends at **runtime**.
+The Global and Local filters are initialized in the Target. Subsequently, if the QS receive channel is enabled (@ref qs_rx "QS-RX"), the filters can be changed from the @ref qutest "QUTest" or @ref qview "QView" front-ends at **runtime**.
@@ -201,12 +201,12 @@ Memory@n Pool | QS_FILTER_ON(QS_MP_RECORDS);@n QS_FILTER_OFF(QS_MP_RECORDS); |
Time@n Event | QS_FILTER_ON(QS_TE_RECORDS);@n QS_FILTER_OFF(QS_TE_RECORDS); | #QS_QF_TICK,@n #QS_QF_TIMEEVT_ARM,@n #QS_QF_TIMEEVT_AUTO_DISARM,@n #QS_QF_TIMEEVT_DISARM_ATTEMPT,@n #QS_QF_TIMEEVT_DISARM,@n #QS_QF_TIMEEVT_REARM,@n #QS_QF_TIMEEVT_POST
Event Management (QF) | QS_FILTER_ON(QS_QF_RECORDS);@n QS_FILTER_OFF(QS_QF_RECORDS); | #QS_QF_NEW,@n #QS_QF_GC_ATTEMPT,@n #QS_QF_GC,@n #QS_QF_TIMEEVT_DISARM_ATTEMPT,@n #QS_QF_TICK,@n
Scheduler | QS_FILTER_ON(QS_SC_RECORDS);@n QS_FILTER_OFF(QS_SC_RECORDS); | #QS_SCHED_LOCK,@n #QS_SCHED_UNLOCK,@n #QS_SCHED_NEXT,@n #QS_SCHED_IDLE,@n #QS_SCHED_RESUME,@n #QS_QF_TIMEEVT_DISARM_ATTEMPT,@n #QS_QF_TICK,@n
-User Group-0 | QS_FILTER_ON(QS_U0_RECORDS);@n QS_FILTER_OFF(QS_U0_RECORDS); | #QS_USER + 0 .. #QS_USER + 9
-User Group-1 | QS_FILTER_ON(QS_U1_RECORDS);@n QS_FILTER_OFF(QS_U1_RECORDS); | #QS_USER + 10 .. #QS_USER + 19
-User Group-2 | QS_FILTER_ON(QS_U2_RECORDS);@n QS_FILTER_OFF(QS_U2_RECORDS); | #QS_USER + 20 .. #QS_USER + 29
-User Group-3 | QS_FILTER_ON(QS_U3_RECORDS);@n QS_FILTER_OFF(QS_U3_RECORDS); | #QS_USER + 30 .. #QS_USER + 39
-User Group-4 | QS_FILTER_ON(QS_U4_RECORDS);@n QS_FILTER_OFF(QS_U4_RECORDS); | #QS_USER + 40 .. #QS_USER + 54
-User-All | QS_FILTER_ON(QS_UA_RECORDS);@n QS_FILTER_OFF(QS_UA_RECORDS); | #QS_USER + 0 .. #QS_USER + 54
+User Group-0 | QS_FILTER_ON(QS_U0_RECORDS);@n QS_FILTER_OFF(QS_U0_RECORDS); | #QS_USER + 0 .. #QS_USER + 4
+User Group-1 | QS_FILTER_ON(QS_U1_RECORDS);@n QS_FILTER_OFF(QS_U1_RECORDS); | #QS_USER + 5 .. #QS_USER + 9
+User Group-2 | QS_FILTER_ON(QS_U2_RECORDS);@n QS_FILTER_OFF(QS_U2_RECORDS); | #QS_USER + 10 .. #QS_USER + 14
+User Group-3 | QS_FILTER_ON(QS_U3_RECORDS);@n QS_FILTER_OFF(QS_U3_RECORDS); | #QS_USER + 15 .. #QS_USER + 19
+User Group-4 | QS_FILTER_ON(QS_U4_RECORDS);@n QS_FILTER_OFF(QS_U4_RECORDS); | #QS_USER + 20 .. #QS_USER + 24
+User-All | QS_FILTER_ON(QS_UA_RECORDS);@n QS_FILTER_OFF(QS_UA_RECORDS); | #QS_USER + 0 .. #QS_USER + 24
@n
@@ -257,7 +257,7 @@ The QS Target-resident component provides special **dictionary trace records** d
The dictionary trace records are typically generated during the system initialization and this is the only time when they are sent to the @ref qspy "QSPY" host component. It is **your** responsibility to code them in (by means of the `QS_???_DICTIONARY()` macros). The following code snippet provides some examples of generating QS dictionaries:
-@code
+@code{c}
void main(void) {
~ ~ ~
/* global filter */
@@ -296,7 +296,7 @@ The QS target component contains the receive-channel (QS-RX), which can receive
- Store a @ref qutest_fixture-probe "Test Probe" supplied from @ref qspy "QSPY" inside the Target
@note
-The QS-RX channel is the backbone for interacting with the target system and implemeting such features as @ref qutest "Unit Testing" and @ref qspyview "Visualization/Monitoring" of the target system.
+The QS-RX channel is the backbone for interacting with the target system and implemeting such features as @ref qutest "Unit Testing" and @ref qview "Visualization/Monitoring" of the target system.
@next{qspy}
*/
diff --git a/doxygen/qspy.dox b/doxygen/qspy.dox
index aea8c20..d0c305a 100644
--- a/doxygen/qspy.dox
+++ b/doxygen/qspy.dox
@@ -6,15 +6,14 @@
As described in the @ref qpspy "previous section", **QSPY** is the host-resident component in the QP/Spy software tracing system. QSPY is a simple console application without a GUI, because its main purpose is to provide @ref qspy_link "communication" with the @ref qs "QS target-resident component", parsing of the @ref qpspy_proto "QP/Spy Data Protocol" and displaying the data in a simple @ref qspy_text "human-readable format".
-QSPY can also export the data in various other formats, such as format suitable for @ref qspy_matlab "MATLAB/GNU-Octave", and format suitable for generating message sequence diagrams with @ref qspy_mscgen "MscGen". Additionally, QSPY can also save the symbolic information about the Target objects in form of @ref qspy_dict "QSPY dictionaries". An example of a @ref qpspy_exa "QSPY session" is shown in the Introduction to QP/Spy.
+QSPY can also export the data in various other formats, such as format suitable for @ref qspy_matlab "MATLAB/GNU-Octave", and format suitable for generating @ref qspy_seq "sequence diagrams". Additionally, QSPY can also save the symbolic information about the Target objects in form of @ref qspy_dict "QSPY dictionaries". An example of a @ref qpspy_exa "QSPY session" is shown in the Introduction to QP/Spy.
-Finally, QSPY supports also extensible @ref qspy_udp "UDP-socket" connection, which allows it to serve as a "Back-End" for attaching various "Front-Ends" (such as the @ref qutest "QUTest" Front-End and @ref qspyview "QSpyView" Front-End).
+Finally, QSPY supports also extensible @ref qspy_udp "UDP-socket" connection, which allows it to serve as a "Back-End" for attaching various "Front-Ends" (such as the @ref qutest "QUTest" Front-End and @ref qview "QView" Front-End).
@remark
QSPY is written in portable C with ports to Windows and POSIX (Linux, macOS) provided. QSPY is also designed to be adaptable to various target-host communication links. Out of the box, the QSPY host application supports serial (RS232), TCP/IP, and file communication links. Adding other communication links is straightforward, because the data link is accessed only through a generic Platform Abstraction Layer (PAL).
--
@section qspy_command QSPY Command-Line Parameters
The QSPY application accepts several command-line parameters to configure the data link to the Target, backwards-compatibly with previous versions, and target dependencies, such as pointer sizes, signal sizes, etc. This means that the single QSPY host application can process data from any Target running the QS component. QSPY has been tested with wide range of 8-, 16-, 32-, and 64-bit CPUs.
@@ -99,11 +98,11 @@ ALIGN="center" VALIGN="middle">
- -g
- -g
+ -g [object-list]
+ -g Table::inst,Philo::inst[0],Philo::inst[1]
(key-g)
- Produce @ref qspy_mscgen "MscGen output" to a file
+ Produce @ref qspy_seq "Sequence output" to a file
@@ -284,8 +283,6 @@ The default QSPY configuration is specifically designed for running @ref qutest
The default QSPY configuration (without any parameters) is also backwards-compatible with the following invocation: `qspy -u -t`, which is recommended for running QUTest tests on the host computer. Starting with QSPY version 7.x.y, you can use the simpler `qspy` invocation.
-
--
@section qspy_keyboard QSPY Keyboard Commands
The QSPY console application accepts keyboard input. The following table shows the currently supported key-strokes:
@@ -304,14 +301,13 @@ Key | Action
`o` | toggle @ref qspy_text "QSPY Human-Readable Output" to a file (open/close)
`s`/`b` | toggle binary file output (open/close)
`m` | toggle @ref qspy_matlab "MATLAB Output" to a file (open/close)
-`g` | toggle @ref qspy_mscgen "MscGen Output" to a file (open/close)
+`g` | toggle @ref qspy_seq "Sequence Output" to a file (open/close)
@note
-QSPY can send many more sophisticated commands to the Target by means of the @ref qspyview "Front-End extension mechanism".
+QSPY can send many more sophisticated commands to the Target by means of the @ref qview "Front-End extension mechanism".
--
@section qspy_link QSPY Communication with the Target
QSPY currently provides the following communication links to the @ref qs "QS target-resident component":
@@ -324,7 +320,6 @@ Binaly File | `-f `
Other link@n(e.g., JTAG debug probe) | can be added to the QSPY Platform Abstraction Layer
--
@section qspy_saving Saving Files from QSPY
QSPY can save the tracing data from the Target in various formats into files. QSPY assigns file names **automatically**. Also, QSPY can open/close various files multiple times in a single session, so it is no longer necessary to exit QSPY and launch it again with different command-line parameters to save data to a different file.
@@ -340,7 +335,7 @@ Command-Line@n Option | Keyboard@n Option| File@n Extension | Example | Commen
`-s` | `s` | `.qs` | `qspy150914_132234.qs` | @ref qpspy_proto "raw binary output"
`-d` | `d` | `.dic` | `qspy150901_101203.dic` | @ref qspy_dict "dictionary output"
`-m` | `m` | `.mat` | `qspy150914_132234.mat` | @ref qspy_matlab "MATLAB output"
-`-g` | `g` | `.msc` | `qspy150914_132234.msg` | @ref qspy_mscgen "MscGen output"
+`-g` | `g` | `.seq` | `qspy150914_132234.seq` | @ref qspy_seq "Sequence output"
@note
All files except the dictionary output are time-stamped with the local time of the Host. The **dictionary** output is time-stamped with the build-time of the Target image.
@@ -352,8 +347,8 @@ The following sub-sections explain the following QSPY features:
- @subpage qspy_text "text (screen) output"
- @subpage qspy_dict "dictionary output"
- @subpage qspy_udp "UDP socket interface"
+- @subpage qspy_seq "Sequence output"
- @subpage qspy_matlab "MATLAB output"
-- @subpage qspy_mscgen "MscGen output"
@next{qspy_text}
*/
@@ -370,81 +365,97 @@ The following sub-sections explain the following QSPY features:
In the process of adapting QSPY for supporting @ref qutest "QUTest Unit Testing", the QSPY human-redable output has been changed to avoid any special characters used in regular expressions, such as `*, [, ], ?, !`. This is because the QUTest scripts use regular expressions to match QSPY textuall output with the expected output.
--
@section qspy_text_exa Screen Output Example
For example, the following listing shows the QSPY text output when the @ref qs_dict "dictionaries" **are** available:
+
@verbatim
-C:\qp\qpc\examples\arm-cm\dpp_efm32-slstk3401a\qxk\gnu>qspy -cCOM6
-QSPY host utility 5.9.0
-Copyright (c) 2005-2017 Quantum Leaps (state-machine.com)
-Time Stamp: 170519_115355
--cCOM6
--v590
--T4
--O4
--F4
--S2
--E2
--Q1
--P2
--B2
--C2
+QSPY 6.9.0 Copyright (c) 2005-2020 Quantum Leaps
+Documentation: https://www.state-machine.com/qtools/qspy.html
+Current timestamp: 200827_093625
+-c COM7
+-u 7701
+-v 620
+-T 4
+-O 4
+-F 4
+-S 2
+-E 2
+-Q 1
+-P 2
+-B 2
+-C 2
-########## Trg-RST QP-Ver=590,Build=170519_093948
- Obj-Dict 0x000055A6->QS_RX
- Obj-Dict 0x000051F2->l_SysTick_Handler
- Obj-Dict 0x000051F1->l_GPIO_EVEN_IRQHandler
- Usr-Dict 00000070->PHILO_STAT
- Usr-Dict 00000071->PAUSED_STAT
- Usr-Dict 00000072->COMMAND_STAT
- Obj-Dict 0x20000D40->smlPoolSto
- Obj-Dict 0x20000DB4->tableQueueSto
-. . . . .
- Obj-Dict 0x200012F8->l_philo<4>
- Obj-Dict 0x20001328->l_philo<4>.timeEvt
- Fun-Dict 0x00000B8D->Philo_initial
- Fun-Dict 0x00000DD5->Philo_thinking
-. . . . .
- Sig-Dict 00000010,Obj=0x200011F8->HUNGRY_SIG
- Sig-Dict 00000011,Obj=0x200011F8->TIMEOUT_SIG
-===RTC===> St-Init Obj=l_philo<0>,State=0x00001B05->Philo_thinking
-===RTC===> St-Entry Obj=l_philo<0>,State=Philo_thinking
-0000190000 Init===> Obj=l_philo<0>,State=Philo_thinking
- Sig-Dict 00000010,Obj=0x20001238->HUNGRY_SIG
-. . . . .
-===RTC===> St-Init Obj=l_philo<4>,State=0x00001B05->Philo_thinking
-===RTC===> St-Entry Obj=l_philo<4>,State=Philo_thinking
-0000190000 Init===> Obj=l_philo<4>,State=Philo_thinking
- Obj-Dict 0x2000133C->l_table
- Fun-Dict 0x00001B05->QHsm_top
-. . . . .
- Sig-Dict 00000010,Obj=0x2000133C->HUNGRY_SIG
-0000190000 PHILO_STAT 0 thinking
-0000190000 PHILO_STAT 1 thinking
-0000190000 PHILO_STAT 2 thinking
-0000190000 PHILO_STAT 3 thinking
-0000190000 PHILO_STAT 4 thinking
-===RTC===> St-Init Obj=l_table,State=QHsm_top->Table_serving
-===RTC===> St-Entry Obj=l_table,State=Table_serving
-0000190000 Init===> Obj=l_table,State=Table_serving
-0000380805 Disp===> Obj=l_table,Sig=SERVE_SIG,State=Table_serving
-0000381523 =>Ignore Obj=l_table,Sig=SERVE_SIG,State=Table_serving
-0009691003 Disp===> Obj=l_philo<4>,Sig=TIMEOUT_SIG,State=Philo_thinking
-===RTC===> St-Exit Obj=l_philo<4>,State=Philo_thinking
-0009692721 Disp===> Obj=l_table,Sig=HUNGRY_SIG,State=Table_serving
-0009693389 PHILO_STAT 4 hungry
-0009695383 PHILO_STAT 4 eating
-0009695932 =>Intern Obj=l_table,Sig=HUNGRY_SIG,State=Table_serving
-===RTC===> St-Entry Obj=l_philo<4>,State=Philo_hungry
-0009697188 ===>Tran Obj=l_philo<4>,Sig=TIMEOUT_SIG,State=Philo_thinking->Philo_hungry
-0009698052 Disp===> Obj=l_philo<4>,Sig=EAT_SIG,State=Philo_hungry
-===RTC===> St-Entry Obj=l_philo<4>,State=Philo_eating
-0009699697 ===>Tran Obj=l_philo<4>,Sig=EAT_SIG,State=Philo_hungry->Philo_eating
-0009700602 Disp===> Obj=l_philo<3>,Sig=EAT_SIG,State=Philo_thinking
-0009701247 =>Intern Obj=l_philo<3>,Sig=EAT_SIG,State=Philo_thinking
+########## Trg-RST QP-Ver=690,Build=200824_123230
+ Obj-Dict 0x20001048->QS_RX
+ Obj-Dict 0x08004009->l_SysTick_Handler
+ Usr-Dict 00000100->PHILO_STAT
+ Obj-Dict 0x20000EE0->AO_Table
+ Obj-Dict 0x20000DDC->AO_Philo[0]
+ Obj-Dict 0x20000E10->AO_Philo[1]
+ . . . . .
+ Obj-Dict 0x20000F94->EvtPool1
+ Obj-Dict 0x20000DDC->Philo_inst[0]
+ Obj-Dict 0x20000E00->Philo_inst[0].timeEvt
+ Obj-Dict 0x20000E10->Philo_inst[1]
+ Obj-Dict 0x20000E34->Philo_inst[1].timeEvt
+ Obj-Dict 0x20000E44->Philo_inst[2]
+ . . . . .
+ Fun-Dict 0x080006A9->Philo_initial
+ Fun-Dict 0x08000915->Philo_thinking
+ Fun-Dict 0x08000871->Philo_hungry
+ Fun-Dict 0x080007C5->Philo_eating
+ Sig-Dict 00000010,Obj=0x20000DDC->HUNGRY_SIG
+ Sig-Dict 00000011,Obj=0x20000DDC->TIMEOUT_SIG
+0000000000 AO-Subsc Obj=Philo_inst[0],Sig=00000004,Obj=0x20000DDC
+0000000000 AO-Subsc Obj=Philo_inst[0],Sig=00000008,Obj=0x20000DDC
+===RTC===> St-Init Obj=Philo_inst[0],State=0x08001099->Philo_thinking
+0000000000 TE0-Arm Obj=Philo_inst[0].timeEvt,AO=Philo_inst[0],Tim=84,Int=0
+===RTC===> St-Entry Obj=Philo_inst[0],State=Philo_thinking
+0000000000 Init===> Obj=Philo_inst[0],State=Philo_thinking
+ Sig-Dict 00000010,Obj=0x20000E10->HUNGRY_SIG
+ Sig-Dict 00000011,Obj=0x20000E10->TIMEOUT_SIG
+ . . . . .
+ . . . . .
+===RTC===> St-Init Obj=Table_inst,State=0x08001099->Table_serving
+===RTC===> St-Entry Obj=Table_inst,State=Table_serving
+0000000000 Init===> Obj=Table_inst,State=Table_serving
+ QF_RUN
+4294946722 QF-Pub Sdr=l_SysTick_Handler,Evt
+4294947277 AO-Post Sdr=l_SysTick_Handler,Obj=Table_inst,Evt,Que
+4294948158 Sch-Next Pri=0->6
+4294948490 AO-GetL Obj=Table_inst,Evt
+4294949010 Disp===> Obj=Table_inst,Sig=SERVE_SIG,State=Table_serving
+4294949660 =>Ignore Obj=Table_inst,Sig=SERVE_SIG,State=Table_serving
+4294950254 Sch-Idle Pri=6->0
+ TE0-ADis Obj=Philo_inst[4].timeEvt,AO=Philo_inst[4]
+4294946907 TE0-Post Obj=Philo_inst[4].timeEvt,Sig=TIMEOUT_SIG,AO=Philo_inst[4]
+4294947535 AO-Post Sdr=l_SysTick_Handler,Obj=Philo_inst[4],Evt,Que
+4294948568 Sch-Next Pri=0->5
+4294948900 AO-GetL Obj=Philo_inst[4],Evt
+4294949419 Disp===> Obj=Philo_inst[4],Sig=TIMEOUT_SIG,State=Philo_thinking
+4294950135 TE0-DisA Obj=Philo_inst[4].timeEvt,AO=Philo_inst[4]
+===RTC===> St-Exit Obj=Philo_inst[4],State=Philo_thinking
+4294951090 QF-New Sig=HUNGRY_SIG,Size=6
+4294951506 MP-Get Obj=EvtPool1,Free=9,Min=9
+4294952081 AO-Post Sdr=Philo_inst[4],Obj=Table_inst,Evt,Que
+4294952841 Sch-Next Pri=5->6
+4294953173 AO-GetL Obj=Table_inst,Evt
+4294953692 Disp===> Obj=Table_inst,Sig=HUNGRY_SIG,State=Table_serving
+4294954299 PHILO_STAT 4 hungry
+4294954817 QF-New Sig=EAT_SIG,Size=6
+4294955233 MP-Get Obj=EvtPool1,Free=8,Min=8
+4294955759 QF-Pub Sdr=Table_inst,Evt
+4294956277 Sch-Lock Ceil=0->5
+4294956667 AO-Post Sdr=Table_inst,Obj=Philo_inst[4],Evt,Que
+4294957464 AO-Post Sdr=Table_inst,Obj=Philo_inst[3],Evt,Que
+4294958261 AO-Post Sdr=Table_inst,Obj=Philo_inst[2],Evt,Que
+4294959058 AO-Post Sdr=Table_inst,Obj=Philo_inst[1],Evt,Que
+4294959855 AO-Post Sdr=Table_inst,Obj=Philo_inst[0],Evt,Que
+4294960624 Sch-Unlk Ceil=5->0
. . . . . .
@endverbatim
+
The QS trace log shown in the listing above contains quite detailed information, because most QS records are enabled (are not blocked in the @ref qs_filters "QS filters"). The following bullet items highlight the most interesting parts of the trace and illustrate how you can interpret the trace data:
@@ -457,7 +468,6 @@ The QS trace log shown in the listing above contains quite detailed information,
- After this you see that at the time-stamp `0000380805` an event was dispatched (`Disp===>` record) to `l_table`, but it was subsequently `Ignored`, while `l_table` was in the state `Table_serving`.
--
@section qspy_pre Predefined Trace Records
The following table summarizes the text output format used for all predefined QS trace records (see ::QSpyRecords).
@@ -997,10 +1007,10 @@ To better adapt QSPY to support @ref qutest "QUTest Unit Testing", the QSPY huma
- 70
+ 100
#QS_USER + xxx
` USER+xxx`
- @ref qs_app "application-specific" (user) QS records
+ @ref qs_app "application-specific" (user) QS records (100..124)
@@ -1062,21 +1072,21 @@ And here is the exact same trace data when the "dictionaries" **are** available:
0009693389 PHILO_STAT 4 hungry
0009695383 PHILO_STAT 4 eating
0009695932 =>Intern Obj=l_table,Sig=HUNGRY_SIG,State=Table_serving
-===RTC===> St-Entry Obj=l_philo<4>,State=Philo_hungry
-0009697188 ===>Tran Obj=l_philo<4>,Sig=TIMEOUT_SIG,State=Philo_thinking->Philo_hungry
-0009698052 Disp===> Obj=l_philo<4>,Sig=EAT_SIG,State=Philo_hungry
-===RTC===> St-Entry Obj=l_philo<4>,State=Philo_eating
-0009699697 ===>Tran Obj=l_philo<4>,Sig=EAT_SIG,State=Philo_hungry->Philo_eating
-0009700602 Disp===> Obj=l_philo<3>,Sig=EAT_SIG,State=Philo_thinking
-0009701247 =>Intern Obj=l_philo<3>,Sig=EAT_SIG,State=Philo_thinking
-0009702038 Disp===> Obj=l_philo<2>,Sig=EAT_SIG,State=Philo_thinking
-0009702677 =>Intern Obj=l_philo<2>,Sig=EAT_SIG,State=Philo_thinking
-0009703468 Disp===> Obj=l_philo<1>,Sig=EAT_SIG,State=Philo_thinking
-0009704107 =>Intern Obj=l_philo<1>,Sig=EAT_SIG,State=Philo_thinking
-0009704899 Disp===> Obj=l_philo<0>,Sig=EAT_SIG,State=Philo_thinking
-0009705538 =>Intern Obj=l_philo<0>,Sig=EAT_SIG,State=Philo_thinking
-0015961105 Disp===> Obj=l_philo<0>,Sig=TIMEOUT_SIG,State=Philo_thinking
-===RTC===> St-Exit Obj=l_philo<0>,State=Philo_thinking
+===RTC===> St-Entry Obj=l_philo[4],State=Philo_hungry
+0009697188 ===>Tran Obj=l_philo[4],Sig=TIMEOUT_SIG,State=Philo_thinking->Philo_hungry
+0009698052 Disp===> Obj=l_philo[4],Sig=EAT_SIG,State=Philo_hungry
+===RTC===> St-Entry Obj=l_philo[4],State=Philo_eating
+0009699697 ===>Tran Obj=l_philo[4],Sig=EAT_SIG,State=Philo_hungry->Philo_eating
+0009700602 Disp===> Obj=l_philo[3],Sig=EAT_SIG,State=Philo_thinking
+0009701247 =>Intern Obj=l_philo[3],Sig=EAT_SIG,State=Philo_thinking
+0009702038 Disp===> Obj=l_philo[2],Sig=EAT_SIG,State=Philo_thinking
+0009702677 =>Intern Obj=l_philo[2],Sig=EAT_SIG,State=Philo_thinking
+0009703468 Disp===> Obj=l_philo[1],Sig=EAT_SIG,State=Philo_thinking
+0009704107 =>Intern Obj=l_philo[1],Sig=EAT_SIG,State=Philo_thinking
+0009704899 Disp===> Obj=l_philo[0],Sig=EAT_SIG,State=Philo_thinking
+0009705538 =>Intern Obj=l_philo[0],Sig=EAT_SIG,State=Philo_thinking
+0015961105 Disp===> Obj=l_philo[0],Sig=TIMEOUT_SIG,State=Philo_thinking
+===RTC===> St-Exit Obj=l_philo[0],State=Philo_thinking
0015962823 Disp===> Obj=l_table,Sig=HUNGRY_SIG,State=Table_serving
0015963491 PHILO_STAT 0 hungry
. . . . . .
@@ -1085,23 +1095,23 @@ And here is the exact same trace data when the "dictionaries" **are** available:
As you can see, the difference in readability is quite dramatic.
--
@section qspy_dict_get Acquiring Dictionaries
The QS Target-resident component generates the dictionary trace records during the initialization of active objects components in the Target code, that is, typically right after the reset. Consequently, the best way to acquire the dictionaries is to capture the trace when the Target performs the reset. This can be done in a couple of ways:
- Start QSPY **before** the Target resets
- Manually reset the Target while QSPY is running (e.g., press a Reset button on the Target board)
- Send the @ref qspy_keyboard "RESET command" to the Target from QSPY while it is running
-Either way, the dictionary records should be produced and acquired by the Target. The following listing shows the dictionary records sent by the DPP example application running on the EFM32-SLSTK3401A board:
+Either way, the dictionary records should be produced and acquired by the Target. The following listing shows the dictionary records sent by the DPP example application running on a STM32 NUCLEO board:
+
@verbatim
-C:\qp\qpc\examples\arm-cm\dpp_efm32-slstk3401a\qxk\gnu>qspy -cCOM6
-QSPY 6.1.0 Copyright (c) 2005-2018 Quantum Leaps
+C:\qp\qpc\examples\arm-cm\dpp_nucleo-l152re\qk\gnu>qspy -cCOM7
+QQSPY 6.9.0 Copyright (c) 2005-2020 Quantum Leaps
Documentation: https://www.state-machine.com/qtools/qspy.html
-Current timestamp: 180119_195728
--u 7701
+Current timestamp: 200827_093625
-c COM7
--v 600
+-u 7701
+-v 620
-T 4
-O 4
-F 4
@@ -1112,51 +1122,96 @@ Current timestamp: 180119_195728
-B 2
-C 2
-########## Trg-RST QP-Ver=604,Build=180117_155932
- Obj-Dict 0x00007322->QS_RX
- Obj-Dict 0x20000D3C->l_SysTick_Handler
- Obj-Dict 0x20000D3D->l_GPIOPortA_IRQHandler
- Usr-Dict 00000070->PHILO_STAT
- Usr-Dict 00000071->PAUSED_STAT
- Usr-Dict 00000072->COMMAND_STAT
- Obj-Dict 0x200015D0->smlPoolSto
- Obj-Dict 0x20001684->tableQueueSto
- Obj-Dict 0x20001620->philoQueueSto<0>
- Obj-Dict 0x20001634->philoQueueSto<1>
- Obj-Dict 0x20001648->philoQueueSto<2>
- Obj-Dict 0x2000165C->philoQueueSto<3>
- Obj-Dict 0x20001670->philoQueueSto<4>
- Obj-Dict 0x20001AEC->l_philo<0>
- Obj-Dict 0x20001B14->l_philo<0>.m_timeEvt
- Obj-Dict 0x20001B24->l_philo<1>
- Obj-Dict 0x20001B4C->l_philo<1>.m_timeEvt
- Obj-Dict 0x20001B5C->l_philo<2>
- Obj-Dict 0x20001B84->l_philo<2>.m_timeEvt
- Obj-Dict 0x20001B94->l_philo<3>
- Obj-Dict 0x20001BBC->l_philo<3>.m_timeEvt
- Obj-Dict 0x20001BCC->l_philo<4>
- Obj-Dict 0x20001BF4->l_philo<4>.m_timeEvt
- Fun-Dict 0x000026C5->Philo::initial
- Fun-Dict 0x000027E1->Philo::thinking
- Fun-Dict 0x0000287D->Philo::hungry
- Fun-Dict 0x00002925->Philo::eating
- Sig-Dict 00000010,Obj=0x20001AEC->HUNGRY_SIG
- Sig-Dict 00000011,Obj=0x20001AEC->TIMEOUT_SIG
-. . . . . .
- Obj-Dict 0x20001C08->l_table
- Fun-Dict 0x000030CB->QP::QHsm::top
- Fun-Dict 0x00002A79->Table::initial
- Fun-Dict 0x00002B8D->Table::active
- Fun-Dict 0x00002BB9->Table::serving
- Fun-Dict 0x00002E29->Table::paused
+########## Trg-RST QP-Ver=690,Build=200824_123230
+ Obj-Dict 0x20001048->QS_RX
+ Obj-Dict 0x08004009->l_SysTick_Handler
+ Usr-Dict 00000100->PHILO_STAT
+ Obj-Dict 0x20000EE0->AO_Table
+ Obj-Dict 0x20000DDC->AO_Philo[0]
+ Obj-Dict 0x20000E10->AO_Philo[1]
+ Obj-Dict 0x20000E44->AO_Philo[2]
+ Obj-Dict 0x20000E78->AO_Philo[3]
+ Obj-Dict 0x20000EAC->AO_Philo[4]
+ Obj-Dict 0x20000F94->EvtPool1
+ Obj-Dict 0x20000DDC->Philo_inst[0]
+ Obj-Dict 0x20000E00->Philo_inst[0].timeEvt
+ Obj-Dict 0x20000E10->Philo_inst[1]
+ Obj-Dict 0x20000E34->Philo_inst[1].timeEvt
+ Obj-Dict 0x20000E44->Philo_inst[2]
+ Obj-Dict 0x20000E68->Philo_inst[2].timeEvt
+ Obj-Dict 0x20000E78->Philo_inst[3]
+ Obj-Dict 0x20000E9C->Philo_inst[3].timeEvt
+ Obj-Dict 0x20000EAC->Philo_inst[4]
+ Obj-Dict 0x20000ED0->Philo_inst[4].timeEvt
+ Fun-Dict 0x080006A9->Philo_initial
+ Fun-Dict 0x08000915->Philo_thinking
+ Fun-Dict 0x08000871->Philo_hungry
+ Fun-Dict 0x080007C5->Philo_eating
+ Sig-Dict 00000010,Obj=0x20000DDC->HUNGRY_SIG
+ Sig-Dict 00000011,Obj=0x20000DDC->TIMEOUT_SIG
+0000000000 AO-Subsc Obj=Philo_inst[0],Sig=00000004,Obj=0x20000DDC
+0000000000 AO-Subsc Obj=Philo_inst[0],Sig=00000008,Obj=0x20000DDC
+===RTC===> St-Init Obj=Philo_inst[0],State=0x08001099->Philo_thinking
+0000000000 TE0-Arm Obj=Philo_inst[0].timeEvt,AO=Philo_inst[0],Tim=84,Int=0
+===RTC===> St-Entry Obj=Philo_inst[0],State=Philo_thinking
+0000000000 Init===> Obj=Philo_inst[0],State=Philo_thinking
+ Sig-Dict 00000010,Obj=0x20000E10->HUNGRY_SIG
+ Sig-Dict 00000011,Obj=0x20000E10->TIMEOUT_SIG
+0000000000 AO-Subsc Obj=Philo_inst[1],Sig=00000004,Obj=0x20000E10
+0000000000 AO-Subsc Obj=Philo_inst[1],Sig=00000008,Obj=0x20000E10
+===RTC===> St-Init Obj=Philo_inst[1],State=0x08001099->Philo_thinking
+0000000000 TE0-Arm Obj=Philo_inst[1].timeEvt,AO=Philo_inst[1],Tim=107,Int=0
+===RTC===> St-Entry Obj=Philo_inst[1],State=Philo_thinking
+0000000000 Init===> Obj=Philo_inst[1],State=Philo_thinking
+ Sig-Dict 00000010,Obj=0x20000E44->HUNGRY_SIG
+ Sig-Dict 00000011,Obj=0x20000E44->TIMEOUT_SIG
+0000000000 AO-Subsc Obj=Philo_inst[2],Sig=00000004,Obj=0x20000E44
+0000000000 AO-Subsc Obj=Philo_inst[2],Sig=00000008,Obj=0x20000E44
+===RTC===> St-Init Obj=Philo_inst[2],State=0x08001099->Philo_thinking
+0000000000 TE0-Arm Obj=Philo_inst[2].timeEvt,AO=Philo_inst[2],Tim=102,Int=0
+===RTC===> St-Entry Obj=Philo_inst[2],State=Philo_thinking
+0000000000 Init===> Obj=Philo_inst[2],State=Philo_thinking
+ Sig-Dict 00000010,Obj=0x20000E78->HUNGRY_SIG
+ Sig-Dict 00000011,Obj=0x20000E78->TIMEOUT_SIG
+0000000000 AO-Subsc Obj=Philo_inst[3],Sig=00000004,Obj=0x20000E78
+0000000000 AO-Subsc Obj=Philo_inst[3],Sig=00000008,Obj=0x20000E78
+===RTC===> St-Init Obj=Philo_inst[3],State=0x08001099->Philo_thinking
+0000000000 TE0-Arm Obj=Philo_inst[3].timeEvt,AO=Philo_inst[3],Tim=148,Int=0
+===RTC===> St-Entry Obj=Philo_inst[3],State=Philo_thinking
+0000000000 Init===> Obj=Philo_inst[3],State=Philo_thinking
+ Sig-Dict 00000010,Obj=0x20000EAC->HUNGRY_SIG
+ Sig-Dict 00000011,Obj=0x20000EAC->TIMEOUT_SIG
+0000000000 AO-Subsc Obj=Philo_inst[4],Sig=00000004,Obj=0x20000EAC
+0000000000 AO-Subsc Obj=Philo_inst[4],Sig=00000008,Obj=0x20000EAC
+===RTC===> St-Init Obj=Philo_inst[4],State=0x08001099->Philo_thinking
+0000000000 TE0-Arm Obj=Philo_inst[4].timeEvt,AO=Philo_inst[4],Tim=51,Int=0
+===RTC===> St-Entry Obj=Philo_inst[4],State=Philo_thinking
+0000000000 Init===> Obj=Philo_inst[4],State=Philo_thinking
+ Obj-Dict 0x20000EE0->Table_inst
Sig-Dict 00000005,Obj=0x00000000->DONE_SIG
Sig-Dict 00000004,Obj=0x00000000->EAT_SIG
Sig-Dict 00000006,Obj=0x00000000->PAUSE_SIG
Sig-Dict 00000007,Obj=0x00000000->SERVE_SIG
Sig-Dict 00000008,Obj=0x00000000->TEST_SIG
- Sig-Dict 00000010,Obj=0x20001C08->HUNGRY_SIG
-. . . . . .
+ Sig-Dict 00000010,Obj=0x20000EE0->HUNGRY_SIG
+0000000000 AO-Subsc Obj=Table_inst,Sig=DONE_SIG
+0000000000 AO-Subsc Obj=Table_inst,Sig=PAUSE_SIG
+0000000000 AO-Subsc Obj=Table_inst,Sig=SERVE_SIG
+0000000000 AO-Subsc Obj=Table_inst,Sig=TEST_SIG
+0000000000 PHILO_STAT 0 thinking
+0000000000 PHILO_STAT 1 thinking
+0000000000 PHILO_STAT 2 thinking
+0000000000 PHILO_STAT 3 thinking
+0000000000 PHILO_STAT 4 thinking
+ Fun-Dict 0x08000BB5->Table_active
+ Fun-Dict 0x08000BDD->Table_serving
+ Fun-Dict 0x08000AD1->Table_paused
+===RTC===> St-Init Obj=Table_inst,State=0x08001099->Table_serving
+===RTC===> St-Entry Obj=Table_inst,State=Table_serving
+0000000000 Init===> Obj=Table_inst,State=Table_serving
+ QF_RUN
@endverbatim
+
Once QSPY acquires the dictionaries, it keeps them in the memory and applies them to display the data in symbolic form (rather than hex addresses).
@@ -1164,13 +1219,12 @@ Once QSPY acquires the dictionaries, it keeps them in the memory and applies the
The dictionaries do not need to be complete to be useful. QSPY simply applies the symbolic information whenever it can find a match in the dictionaries acquired so far. When a dictionary entry is not available, QSPY displays only hex addresses.
--
@section qspy_dict_save Saving Dictionaries to a File
-QSPY can save the dictionaries acquired thus far into a file. This must be triggered by the user (by means of the `d` @ref qspy_keyboard "keyboard command" or from QSpyView menu "File->Save Dictionaries"), because QSPY does not "know" when the dictionaries are "complete", therefore it cannot know when to save them automatically.
+QSPY can save the dictionaries acquired thus far into a file. This is triggered by the #QS_QF_RUN trace record from the Target, but it can also be triggered by the user (by means of the `d` @ref qspy_keyboard "keyboard command" or from @ref qview_file "QView menu File->Save Dictionaries"), because QSPY does not "know" when the dictionaries are "complete", therefore it cannot know when to save them automatically.
@note
-For dictionaries to be saved to a file, the QSPY host application must be lauched with the `-d [file]` @ref qspy_command "command-line option", with of without the optional `[file]` parameter.
+For dictionaries to be saved to a file, the QSPY host application must be launched with the `-d` @ref qspy_command "command-line option", with of without the optional `[file]` parameter.
On the other hand, QSPY generates automatically the file name for saving dictionaries. This file name has always the form `qspy.dic`, where `` unambiguously identifies the Target build date and time. For example, the Target code last built on August 31, 2015 at 14:42:29 will have the name `qspy150831_144229.dic`.
@@ -1178,10 +1232,12 @@ On the other hand, QSPY generates automatically the file name for saving diction
@attention
The internal addresses of objects can change by every code re-build, so dictionaries are applicable only to the specific Target build and must be freshly re-acquired after every new Target code build.
-The dictionaries are saved to a file in ASCII format. The following listing shows the dictionaries from the DPP example application running on the EK-TM4C123GXL board:
+The dictionaries are saved to a file in ASCII format. The following listing shows the dictionaries from the DPP example application running on a STM32 NUCLEO board:
+
+
@verbatim
--v604
+-v690
-T4
-O4
-F4
@@ -1191,76 +1247,73 @@ The dictionaries are saved to a file in ASCII format. The following listing show
-P2
-B2
-C2
--t180117_155932
+-t200824_123230
+
Obj-Dic:
-21 4
-0x00007322 QS_RX
-0x20000D3C l_SysTick_Handler
-0x20000D3D l_GPIOPortA_IRQHandler
-0x200015D0 smlPoolSto
-0x20001620 philoQueueSto<0>
-0x20001634 philoQueueSto<1>
-0x20001648 philoQueueSto<2>
-0x2000165C philoQueueSto<3>
-0x20001670 philoQueueSto<4>
-0x20001684 tableQueueSto
-0x20001AEC l_philo<0>
-0x20001B14 l_philo<0>.m_timeEvt
-0x20001B24 l_philo<1>
-0x20001B4C l_philo<1>.m_timeEvt
-0x20001B5C l_philo<2>
-0x20001B84 l_philo<2>.m_timeEvt
-0x20001B94 l_philo<3>
-0x20001BBC l_philo<3>.m_timeEvt
-0x20001BCC l_philo<4>
-0x20001BF4 l_philo<4>.m_timeEvt
-0x20001C08 l_table
+4
+0x08004009 l_SysTick_Handler
+0x20000DDC Philo_inst[0]
+0x20000E00 Philo_inst[0].timeEvt
+0x20000E10 Philo_inst[1]
+0x20000E34 Philo_inst[1].timeEvt
+0x20000E44 Philo_inst[2]
+0x20000E68 Philo_inst[2].timeEvt
+0x20000E78 Philo_inst[3]
+0x20000E9C Philo_inst[3].timeEvt
+0x20000EAC Philo_inst[4]
+0x20000ED0 Philo_inst[4].timeEvt
+0x20000EE0 Table_inst
+0x20000F94 EvtPool1
+0x20001048 QS_RX
+***
Fun-Dic:
-9 4
-0x000026C5 Philo::initial
-0x000027E1 Philo::thinking
-0x0000287D Philo::hungry
-0x00002925 Philo::eating
-0x00002A79 Table::initial
-0x00002B8D Table::active
-0x00002BB9 Table::serving
-0x00002E29 Table::paused
-0x000030CB QP::QHsm::top
+4
+0x080006A9 Philo_initial
+0x080007C5 Philo_eating
+0x08000871 Philo_hungry
+0x08000915 Philo_thinking
+0x08000AD1 Table_paused
+0x08000BB5 Table_active
+0x08000BDD Table_serving
+***
Usr-Dic:
-3 1
-0x00000046 PHILO_STAT
-0x00000047 PAUSED_STAT
-0x00000048 COMMAND_STAT
+1
+0x00000064 PHILO_STAT
+0x0000007C QUTEST_ON_POST
+***
Sig-Dic:
-16 4
+4
00000004 0x00000000 EAT_SIG
00000005 0x00000000 DONE_SIG
00000006 0x00000000 PAUSE_SIG
00000007 0x00000000 SERVE_SIG
00000008 0x00000000 TEST_SIG
-00000010 0x20001B5C HUNGRY_SIG
-00000010 0x20001BCC HUNGRY_SIG
-00000010 0x20001B94 HUNGRY_SIG
-00000010 0x20001AEC HUNGRY_SIG
-00000010 0x20001B24 HUNGRY_SIG
-00000010 0x20001C08 HUNGRY_SIG
-00000011 0x20001B94 TIMEOUT_SIG
-00000011 0x20001BCC TIMEOUT_SIG
-00000011 0x20001B5C TIMEOUT_SIG
-00000011 0x20001AEC TIMEOUT_SIG
-00000011 0x20001B24 TIMEOUT_SIG
-Msc-Dic:
-0 4
+00000010 0x20000E44 HUNGRY_SIG
+00000010 0x20000EAC HUNGRY_SIG
+00000010 0x20000E78 HUNGRY_SIG
+00000010 0x20000DDC HUNGRY_SIG
+00000010 0x20000E10 HUNGRY_SIG
+00000010 0x20000EE0 HUNGRY_SIG
+00000011 0x20000E78 TIMEOUT_SIG
+00000011 0x20000EAC TIMEOUT_SIG
+00000011 0x20000E44 TIMEOUT_SIG
+00000011 0x20000DDC TIMEOUT_SIG
+00000011 0x20000E10 TIMEOUT_SIG
+***
@endverbatim
+
--
@section qspy_dict_use Using Dictionary File
The dictionary file saved in previous QSPY sessions can be used in two ways:
- you can specify the dictionary file in the `-d ` @ref qspy_command "command-line option" to QSPY. In this case QSPY reads the dictionaries from the provided `` before processing any trace records from the Target. (**NOTE:** in this case you don't need to provide any of the upper-case command-line options, because they are read from the dictionary file.) For example: command line: `qspy -d qspy180117_155932.dic` will attempt to read the dictionaries from the specified file.
-- you can specify the dictionary option without the dictionary file `-d` @ref qspy_command "command-line option" to QSPY. Subsequently, once you run QSPY, you can query the Target information (by means of the `i` or `r` @ref qspy_keyboard "keyboard command" or from QSpyView menu "Commands->Query Target Info"). When the Target replies and provides its build-time-stamp, QSPY looks for the corresponding dictionary file in the current directory and if such a file is found, QSPY reads the dictionaries from it. (**NOTE:** this option requires that the Target implements the QS receive channel, QS-RX, so that it can receive commands from QSPY).
+- you can specify the dictionary option without the dictionary file `-d` @ref qspy_command "command-line option" to QSPY. Subsequently, once you run QSPY, you can query the Target information (by means of the `i` or `r` @ref qspy_keyboard "keyboard command" or from @ref qview_menu "QView menu Commands->Query Target Info"). When the Target replies and provides its build-time-stamp, QSPY looks for the corresponding dictionary file in the current directory and if such a file is found, QSPY reads the dictionaries from it.
+
+
+@note
+That last option requires that the Target implements the @ref qs_rx "QS receive channel, QS-RX" so that it can receive commands from QSPY.
@next{qspy_udp}
*/
@@ -1270,24 +1323,20 @@ The dictionary file saved in previous QSPY sessions can be used in two ways:
@tableofcontents
-This section describes the structure of the UDP packets exchanged between the QSPY Back-End and the various front-ends, such as @ref qutest "QUTest" and @ref qspyview "QSpyView" (blue arrows in the sequence diagram below). The UDP interface is implemented in the qspy.tcl script.
+
This section describes the structure of the UDP packets exchanged between the QSPY Back-End and the various front-ends, such as @ref qutest "QUTest" and @ref qview "QView" (blue arrows in the sequence diagram below).
-@image html qspy_comm.gif "Communication between Target, QSPY, and QSpyView"
+@image html qspy_comm.gif "Communication between Target, QSPY, and QView"
@n
-@note
-For better readability, the qspy.tcl script uses a convention in which UDP packets to and from the Target (red arrows ) are called **Records**, while the word **Packets** is used for communication to and from the QSPY Back-End (blue arrows ). For consistency, the following sections apply the same naming convention: Records for Target communication and Packets for QSPY communication.
-
-
@section udp_top General UDP Packet Structure
@image html qspy_udp.gif "UDP packet structure"
-The UDP packets exchanged between the QSPY Back-End and the `QSpyView` Front-End consists of:
+The UDP packets exchanged between the QSPY Back-End and the `QView` Front-End consists of:
-- 1-byte **Sequence-No**, which increments by 1 for every packet and wraps naturally from 0xFF to 0. The sequence number allows `QSpyView` to detect any data discontinuities.
+- 1-byte **Sequence-No**, which increments by 1 for every packet and wraps naturally from 0xFF to 0. The sequence number allows `QView` to detect any data discontinuities.
- 1-byte **Record-ID**. The Record-IDs are divided into two categories:
- Records to and from the Target have Record-IDs in the range 0..127 . Specifically, QS records originated from the Target are enumerated in ::QSpyRecords. Records destined to the Target are enumerated in ::QSpyRxRecords.
@@ -1305,30 +1354,21 @@ The QSPY UDP socket supports two "channels":
A Front-End can choose the "data channels" when "attaching" to the QSPY host application (see qspy::attach()). The data channels are not exclusive, meaning that a front-end can "attach" simultaneously to both binary and text channels. In this case, the front-end would receive each packet as both binary and text formats.
@remark
-The binary-channel (1) is used by the @ref qspyview "QSpyView" GUI front-end, while the text-channel (2) is used by the @ref qutest "QUTest" Unit Testing front-end.
-
-
-
-@subsection udp_sendPkt Programming Interface
-The qspy.tcl script provides the Tcl procedure `::qspy::sendPkt` for sending a UDP packet to the QSPY Back-End. The procedure takes one parameter `pkt`, which contains the Record-ID byte followed by the optional Data Payload. For example, here is how to send a packet to @ref udp_AO_FILTER for Active Object with priority 5:
-
-@code
-::qspy::sendPkt [binary format cc $::qspy::QS_RX(AO_FILTER) 5]
-@endcode
-
+The binary-channel (0x01) is used by the @ref qview "QView" GUI front-end, while the text-channel (0x02) is used by the @ref qutest "QUTest" Unit Testing front-end.
@section udp_Target Records to the Target
-@note
-To understand the following detailed UDP packet descriptions, it is highly recommended to read the Tcl documentation for the binary Tcl command .
-
-
-
@subsection udp_INFO Query Target Info (INFO)
This packet has Record-ID==INFO and has no Data Payload.
+@note
+To understand the following detailed UDP packet descriptions, it is highly recommended to read the Python documentation for the Python struct.pack() command .@n
+@n
+All data to and from the Target are sent according to the @ref qpspy_proto "QP/Spy™ Data Protocol" in **little endian**.
+
+
Code Example:
@code
::qspy::sendPkt [binary format c $::qspy::QS_RX(INFO)]
@@ -1339,40 +1379,21 @@ This packet has Record-ID==INFO and has no Data Payload.
@subsection udp_COMMAND Execute a User-Defined Command in the Target (COMMAND)
This packet has Record-ID==COMMAND and Data Payload of the form:
-Data item | binary format | description
------------|---------------|-------------
-Command-ID | c | command number
-Command-Par| i | command parameter
-
-
-Code Example:
-@code
-::qspy::sendPkt [binary format cci $::qspy::QS_RX(COMMAND) 12 0x11223344]
-@endcode
-
+Data item | binary format | description
+-----------|-----------------------------|-------------
+Command-ID | B (byte) | command number
+Command-Par| I (unsigned 4-byte integer) | command parameter
@subsection udp_RESET Reset the Target (RESET)
This packet has Record-ID==RESET and has no Data Payload.
-Code Example:
-@code
-::qspy::sendPkt [binary format c $::qspy::QS_RX(RESET)]
-@endcode
-
-
@subsection udp_TICK Call QF_TICK_X() in the Target (TICK)
Data item | binary format | description
-----------|---------------|-------------
-Tick-rate | c | system tick rate number
-
-Code Example:
-@code
-::qspy::sendPkt [binary format cc $::qspy::QS_RX(TICK) 0]
-@endcode
-
+Tick-rate | B (byte) | system tick rate number
@subsection udp_PEEK Peek Target Memory (PEEK)
@@ -1380,15 +1401,8 @@ This packet has Record-ID==PEEK and Data Payload of the form:
Data item | binary format | description
-----------|---------------|-------------
-Peek-addr | Target-dependent@n Typically i | Address of the data in the Target
-Peek-length| c | Number of bytes to peek
-
-Code Example:
-@code
-::qspy::sendPkt [binary format c$::qspy::theFmt(objPtr)c \
- $::qspy::QS_RX(PEEK) 0x20000123 16]
-@endcode
-
+Peek-addr | Target-dependent@n Typically I | Address of the data in the Target
+Peek-length| B (byte) | Number of bytes to peek
@subsection udp_POKE Poke Target Memory (POKE)
@@ -1396,35 +1410,21 @@ This packet has Record-ID==POKE and Data Payload of the form:
Data item | binary format | description
-----------|---------------|-------------
-Poke-addr | Target-dependent@n Typically i | Address of the data in the Target
-Poke-length| c | Number of bytes to poke (<= 8)
+Poke-addr | Target-dependent@n Typically I | Address of the data in the Target
+Poke-length| B (byte) | Number of bytes to poke (<= 8)
Poke-data | user-defined | Binary data to poke to the Target (8 bytes maximum)
@note
The Poke-data part of the Data Payload must be formatted with the particular endianness of the Target and with any padding required for proper alignment of objects in the Target memory.
-Code Example:
-@code
-::qspy::sendPkt [binary format c$::qspy::theFmt(objPtr)cccs \
- $::qspy::QS_RX(POKE) 0x20000123 0x11 0x22 0x1122]
-@endcode
-
-
@subsection udp_GLB_FILTER Set Global Filters in the Target (GLB_FILTER)
This packet has Record-ID==GLB_FILTER and Data Payload of the form:
Data item | binary format | description
-----------|---------------|-------------
-Data Len | c | Number of bytes sent (currently 16)
-Filters | b128 | 128 bits, each bit corresponding to Global Filter
-
-Code Example:
-@code
-::qspy::sendPkt \
- [binary format ccb128 $::qspy::QS_RX(GLB_FILTER) 16 $theGlbFilter]
-@endcode
-
+Data Len | B (byte) | Number of bytes sent (currently 16)
+Filters | 16B | 8-bytes (128-bits), each bit corresponding to Global Filter
@subsection udp_LOC_FILTER Set Local Filters in the Target (LOC_FILTER)
@@ -1432,8 +1432,8 @@ This packet has Record-ID==LOC_FILTER and Data Payload of the form:
Data item | binary format | description
-----------|---------------|-------------
-Local filter #| c | The Number of the Local Filter
-Object-addr | Target-dependent@n Typically i | Address of the object in the Target
+Local filter #| B (byte) | The Number of the Local Filter
+Object-addr | Target-dependent@n Typically I | Address of the object in the Target
The Local filters are numbered as follows:
@@ -1444,13 +1444,6 @@ The Local filters are numbered as follows:
4. Time Event Local Filter (TE)
5. Application-Specific Local Filter (AP)
-Code Example:
-@code
-::qspy::sendPkt [binary format cc$::qspy::theFmt(objPtr) \
- $::qspy::QS_RX(LOC_FILTER) 0 $theLocFilter(SM)]
-@endcode
-
-
@subsection udp_AO_FILTER Set Local AO Filter in the Target (AO_FILTER)
This packet provides a shortcut for setting the Active Object Local Filter by providing just the unique priority of the AO.
@@ -1458,12 +1451,7 @@ The packet has Record-ID==AO_FILTER and Data Payload of the form:
Data item | binary format | description
-----------|---------------|-------------
-AO prio | c | Priority of the AO to filter (0 to disable the AO filter)
-
-Code Example:
-@code
-::qspy::sendPkt [binary format cc $::qspy::QS_RX(AO_FILTER) 5]
-@endcode
+AO prio | B (byte) | Priority of the AO to filter (0 to disable the AO filter)
@@ -1472,85 +1460,59 @@ This packet has Record-ID==EVENT and Data Payload of the form:
Data item | binary format | description
-----------|---------------|-------------
-AO prio | c | Priority of the recipient AO (0 to publish the event)
-signal | Target-dependent@n Typically s | signal of the event
+AO prio | B (byte) | Priority of the recipient AO (0 to publish the event)
+signal | Target-dependent@n Typically H | signal of the event
parameters | user-defined | Binary data corresponding to all event parameters
-The Event signal and parameters must be formatted with the particular endianness of the Target and with any padding required for proper alignment of objects in the Target memory.
+The Event signal `sig` must be formatted according to the Target configuration (see Q_SIGNAL_SIZE )
-The event signal `sig` must be formatted according to the Target configuration (see Q_SIGNAL_SIZE )
+The Event **parameters** must be formatted with the particular **endianness** of the Target and with any padding required for proper alignment of objects in the Target memory.
-The parameters need to match exactly the event memory layout in your Target, including the endianness and any padding that the Target compiler might be using. (To test the right binary format and padding, you can use the @ref qspyview_events "Generate Event..." command).
+The parameters need to match exactly the event memory layout in your Target, including the endianness and any padding that the Target compiler might be using. (To test the right binary format and padding, you can use the @ref qview_events "Generate Event..." command).
-For example, let's assume that the parameters of your event are: a byte, followed by a 2-byte integer, followed by a 4-byte integer. Also, let's assume that your Target is little endian. From the @ref qspyview_events "Generate Event..." command you discover that to format this event correctly you need to use the following event parameters:
+For example, let's assume that the parameters of your event are: a byte, followed by a 2-byte integer, followed by a 4-byte integer. Also, let's assume that your Target is little endian. From the @ref qview_events "Generate Event..." command you discover that to format this event correctly you need to use the following event parameters:
Par # | format | data (example)
------|--------|-------------
-par1: | c | 0x11
-par2: | c | 0x00
-par3: | s | 0x1122
-par4: | i | 0x11223344
-
-As you can see, you need to use "padding" (par2) after the first byte. You also use little endian encoding (`s`, `i`, format specification as opposed to `S`, `I`).
-
-With this information, you can generate the packet programmatically.
-
-Code Example:
-@code
-::qspy::sendEvent 7 5 [binary format ccsi 0x11 0x00 0x1122 0x11223344]
-@endcode
-
-@note
-The qspy.tcl module provides specialized procedure `::qspy::sendEvent prio sig par` for injecting events to the Target.
-
+par1: | B | 0x11
+par2: | B | 0x00
+par3: | H | 0x1122
+par4: | I | 0x11223344
@section udp_QSPY Packets to the QSPY Back-End
-
@subsection udp_ATTACH Attach to the QSPY Back-End (ATTACH)
This packet has Record-ID==ATTACH and Data Payload of the form:
Data item | binary format | description
-----------|---------------|-------------
-channels | c | Binary bitmask of @ref udp_channel "QSPY channels" to attach to
-
-Code Example:
-@code
-::qspy::sendPkt [binary format cc $QSPY(ATTACH) $channels]
-@endcode
-
+channels | B (byte) | Binary bitmask of @ref udp_channel "QSPY channels" to attach to
@subsection udp_DETACH Detach from the QSPY Back-End (DETACH)
This packet has Record-ID==DETACH and has no Data Payload.
-
@subsection udp_SAVE_DIC Save Dictionaries to a File in QSPY (SAVE_DIC)
This packet has Record-ID==SAVE_DIC and has no Data Payload.
-
@subsection udp_SCREEN_OUT Toggle Screen Output to a File in QSPY (SCREEN_OUT)
This packet has Record-ID==SCREEN_OUT and has no Data Payload.
-
@subsection udp_BIN_OUT Toggle Binary Output to a File in QSPY (BIN_OUT)
This packet has Record-ID==BIN_OUT and has no Data Payload.
-
@subsection udp_MATLAB_OUT Toggle MATLAB Output to a File in QSPY (MATLAB_OUT)
This packet has Record-ID==MATLAB_OUT and has no Data Payload.
-
-@subsection udp_MSCGEN_OUT Toggle MscGen Output to a File in QSPY (MSCGEN_OUT)
-This packet has Record-ID==MSCGEN_OUT and has no Data Payload.
-
+@subsection udp_SEQUENCE_OUT Toggle Sequence Output to a File in QSPY (SEQUENCE_OUT)
+This packet has Record-ID==SEQUENCE_OUT and has no Data Payload.
@@ -1560,15 +1522,216 @@ This packet has Record-ID==MSCGEN_OUT and has no Data Payload.
@subsection udp_from_ATTACH Attach Response from the QSPY Back-End (ATTACH)
This packet has Record-ID==ATTACH and has no Data Payload.
-@note
-This packet is handled internally by the qspy.tcl script (see the ::qspy::pkt128 procedure)
-
@subsection udp_from_DETACH Detach Request from the QSPY Back-End (DETACH)
This packet has Record-ID==DETACH and has no Data Payload.
+
+@next{qspy_seq}
+*/
+/*###########################################################################*/
+/**
+@page qspy_seq QSPY Sequence Output
+
+@tableofcontents
+The QSPY host application can also present the tracing data as a **sequence diagram**. To generate a Sequence file, you need to invoke QSPY with the `-g [obj-list]` @ref qspy_command "command-line option".
+
+
+The `[obj-list]` is a comma-separated list of objects shown in the sequence. The names in the list must correspond exactly to the @ref qs_dict "object dictionaries" produced by the Target. Examples of the valid `-g` options are shown below:
+
+- `-g -g l_SysTick_Handler,Table::inst,Philo::inst[0],Philo::inst[1]`
+- `-g l_QF_onClockTick,TServer::inst`
+
+Additionally, the list could include `?` (questionmark), which denotes @ref qspy_seq_sys "System Border".
+
+- `-g -g Table::inst,Philo::inst[0],Philo::inst[1],?`
+- `-g ?,l_QF_onClockTick,TServer::inst`
+
+
@note
-This packet is handled internally by the qspy.tcl script (see the ::qspy::pkt129 procedure)
+The Sequence diagram can show only information actually sent from the Target. Therefore, by adjusting @ref qs_filters "QS filters" you can control the kind of information displayed in the sequence.
+
+
+The following QS trace records produce the most interesting output:
+- #QS_QF_ACTIVE_POST,
+- #QS_QF_ACTIVE_POST_ATTEMPT,
+- #QS_QF_ACTIVE_POST_LIFO,
+- #QS_QF_PUBLISH, and
+- #QS_QF_TICK.
+
+
+Additional annotations of the sequence diagrams are also available if the following QS trace records are enabled:
+- #QS_QEP_TRAN,
+- #QS_QF_ACTIVE_DEFER,
+- #QS_QF_ACTIVE_RECALL, and
+- #QS_QF_ACTIVE_RECALL_ATTEMPT.
+
+
+
+@section qspy_seq_ref Sequence Elements
+The main elements of the QSPY sequence diagram shown in the following sequence output are marked with the `[xx]` labels, which are explained below the listing.
+
+@note
+The sequence output generated by QSPY is a **simple ASCII file**, which you can browse even with the most basic text editor, or a web browser. **No special tools are needed to view the sequence diagrams produced from your data**.
+
+
+@verbatim
+[1] -g ?,l_QF_onClockTick,TServer::inst
+
+ +-------+-------+ +-------+-------+ +-------+-------+
+[2] | ? | |l_QF_onClockTic| | TServer::inst |
+ +-------+-------+ +-------+-------+ +-------+-------+
+[3] 3115372171 / | |
+[4] 3127751904 *--NEW_REQUEST_SIG--+------------------>|
+[5] 3127792184 / |
+ 3144424365 / *--RECEIVED_SIG---->|
+ 3144429488 / |
+ 3177742936 / *--AUTHORIZED_SIG-->|
+[6] 3177796020 / | (RcallA)
+ 3177816231 / |
+ 3190753295 *--NEW_REQUEST_SIG--+------------------>|
+ 3190792988 / |
+ 3200126862 *--NEW_REQUEST_SIG--+------------------>|
+[7] 3200127346 / | (Defer)
+ 3207429692 / *--RECEIVED_SIG---->|
+ 3207435638 / |
+ 3240835283 / *--AUTHORIZED_SIG-->|
+[8] 3240884412 / | *<=NEW_REQUEST_SIG]
+ 3240884486 / | (RCall)
+ 3240902469 / |
+ . . . . . . . . . . . . . .
+@endverbatim
+
+
+ 1 The sequence diagram starts with repeating the `-g [obj-list]` option, so that you can conveniently copy-and-paste this option to run the same sequence again.
+
+ 2 Below that, you can see the header containing the boxes of participating objects from the `[obj-list]`. From each box descends a **lifeline** that runs vertically down the page and represents the ordering of exchanged events and other interesting occurrences involving a given object.
+> **NOTE:** This first object in this particular sequence diagram, denoted as`?', is the @ref qspy_seq_sys explained below.
+
+> **NOTE:** The names in the sequence diagram are **truncated** to the first 15 characters.
+
+> **NOTE:** The sequence header is **repeated** every 100 lines of the sequence output.
+
+ 3 Each output line starts with the **timestamp** followed by the life-lines of all participating objects with event arrows or annotations.
+
+ 4 This line shows a **event posting** (with FIFO policy), which corresponds to the QS records #QS_QF_ACTIVE_POST and #QS_QF_ACTIVE_POST_ATTEMPT. The event **source** is marked with `*`, the event **target** is pointed to with `>` or `<`. The source and target are connected with a line `*----->`. The line is annotated with the **signal** of the posted event.
+
+ 5 This line shows a **state change**, which corresponds to the QS record #QS_QEP_TRAN. The lifeline of the object is annotated with new **state** assumed by the object. The state-name is placed between `<` or `>`.
+
+ 6 This line shows a **event recall**, which corresponds to the QS records #QS_QF_ACTIVE_RECALL, and #QS_QF_ACTIVE_RECALL_ATTEMPT. The lifeline of the object is annotated with `(Rcall)` or `(RcallA)`, respectively.
+
+ 7 This line shows a **event deferral**, which corresponds to the QS record #QS_QF_ACTIVE_DEFER. The lifeline of the object is annotated with `(Defer)`.
+
+ 8 This line shows a **event self-posting** with LIFO policy, which corresponds to the QS record #QS_QF_ACTIVE_POST_LIFO. The event **source/target** is marked with `*<`, the LIFO policy of the event posting is denoted by the `=` line right before the **signal** of the posted event.
+
+
+
+
+
+@section qspy_seq_sys The System Border Object
+As mentioned before, the `[obj-list]` that specifies objects participating in the sequence might include `?` (questionmark), which denotes @ref qspy_seq_sys "System Border". The system border is the "environment" that can produce and consume events. The "System Border" denotes possibly **multiple objects** that are not explicitly listed in the `[obj-list]`, including even objects without @ref qs_dict "object dictionaries". The sequence diagram in the previous section shows the "System Border", labeled as `?` and life-line shown as `//////`.
+
+@note
+You can place the "System Border" (the `?`) anywhere in the `[obj-list]`. However, it is customary to place it either as the very first or the very last object in the list, as shown in the sequence diagram below:
+
+
+The listing below shows a sequence output (`.seq`) generated from the Deferred Event example application with the following `-g` option:
+
+`-g ?,l_QF_onClockTick,TServer::inst`
+
+
+
+@section qspy_seq_exa More Involved Example
+The listing below shows an example of a more involved sequence diagram output (`.seq`) generated from the Dining Philosophers Problem (DPP) application with the following `-g` option:
+
+`-g l_SysTick_Handler,Table::inst,Philo::inst[0],Philo::inst[1],Philo::inst[2],Philo::inst[3],Philo::inst[4]`
+
+
+In addition to the elements described above, this sequence diagram illustrates the **event publishing**, which corresponds to the #QS_QF_PUBLISH trace record. The event multicasting is represented as a horizontal line `. . . .`, with the event **source** marked as `*`.
+
+
+
+@verbatim
+-g l_SysTick_Handler,Table::inst,Philo::inst[0],Philo::inst[1],Philo::inst[2],Philo::inst[3],Philo::inst[4]
+
+ +-------+-------+ +-------+-------+ +-------+-------+ +-------+-------+ +-------+-------+ +-------+-------+ +-------+-------+
+ |l_SysTick_Handl| | Table::inst | |Philo::inst[0] | |Philo::inst[1] | |Philo::inst[2] | |Philo::inst[3] | |Philo::inst[4] |
+ +-------+-------+ +-------+-------+ +-------+-------+ +-------+-------+ +-------+-------+ +-------+-------+ +-------+-------+
+0000042339 . . . . * .SERVE_SIG. . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0000042896 *--SERVE_SIG------->| | | | | |
+0001070723 *--TIMEOUT_SIG------+-------------------+-------------------+-------------------+-------------------+------------------>|
+0001075362 | |<------------------+-------------------+-------------------+-------------------+-------HUNGRY_SIG--*
+0001079065 . . . . | . . . . . . . . . * .EAT_SIG. . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0001079975 | *--EAT_SIG----------+-------------------+-------------------+-------------------+------------------>|
+0001080774 | *--EAT_SIG----------+-------------------+-------------------+------------------>| |
+0001081583 | *--EAT_SIG----------+-------------------+------------------>| | |
+0001082382 | *--EAT_SIG----------+------------------>| | | |
+0001083181 | *--EAT_SIG--------->| | | | |
+0001087412 | | | | | |
+0001091293 | | | | | |
+0001762885 *--TIMEOUT_SIG------+------------------>| | | | |
+0001767416 | |<------HUNGRY_SIG--* | | | |
+0001772368 | | | | | |
+0002097460 . . . . * .PAUSE_SIG. . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0002098016 *--PAUSE_SIG------->| | | | | |
+0002101049 | | | | | |
+0002140275 *--TIMEOUT_SIG------+-------------------+-------------------+------------------>| | |
+0002144842 | |<------------------+-------------------+-------HUNGRY_SIG--* | |
+0002149765 | | | | | |
+0002245145 *--TIMEOUT_SIG------+-------------------+------------------>| | | |
+0002249676 | |<------------------+-------HUNGRY_SIG--* | | |
+0002254599 | | | | | |
+0003104906 *--TIMEOUT_SIG------+-------------------+-------------------+-------------------+------------------>| |
+0003109447 | |<------------------+-------------------+-------------------+-------HUNGRY_SIG--* |
+0003114370 | | | | | |
+0005013277 *--TIMEOUT_SIG------+-------------------+-------------------+-------------------+-------------------+------------------>|
+0005016745 . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . DONE_SIG. * . . .
+0005017655 | |<------------------+-------------------+-------------------+-------------------+---------DONE_SIG--*
+0005025076 | | | | | |
+0007760487 *--TIMEOUT_SIG------+-------------------+-------------------+-------------------+-------------------+------------------>|
+0007764998 | |<------------------+-------------------+-------------------+-------------------+-------HUNGRY_SIG--*
+0007769921 | | | | | |
+0011827861 . . . . * .SERVE_SIG. . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0011828417 *--SERVE_SIG------->| | | | | |
+0011832381 . . . . | . . . . . . . . . * .EAT_SIG. . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0011833291 | *--EAT_SIG----------+-------------------+-------------------+-------------------+------------------>|
+0011834089 | *--EAT_SIG----------+-------------------+-------------------+------------------>| |
+0011834887 | *--EAT_SIG----------+-------------------+------------------>| | |
+0011835685 | *--EAT_SIG----------+------------------>| | | |
+0011836483 | *--EAT_SIG--------->| | | | |
+0011839510 . . . . | . . . . . . . . . * .EAT_SIG. . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0011840421 | *--EAT_SIG----------+-------------------+-------------------+-------------------+------------------>|
+0011841199 | *--EAT_SIG----------+-------------------+-------------------+------------------>| |
+0011841977 | *--EAT_SIG----------+-------------------+------------------>| | |
+0011842755 | *--EAT_SIG----------+------------------>| | | |
+0011843533 | *--EAT_SIG--------->| | | | |
+0011846001 | | | | | |
+0011864225 | | | | | |
+0011874191 | | | | | |
+0015268086 *--TIMEOUT_SIG------+-------------------+-------------------+------------------>| | |
+0015271590 . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . * .DONE_SIG . . . . | . . . . . . . . . | . . .
+0015272500 | |<------------------+-------------------+---------DONE_SIG--* | |
+0015276635 . . . . | . . . . . . . . . * .EAT_SIG. . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0015277545 | *--EAT_SIG----------+-------------------+-------------------+-------------------+------------------>|
+0015278343 | *--EAT_SIG----------+-------------------+-------------------+------------------>| |
+0015279141 | *--EAT_SIG----------+-------------------+------------------>| | |
+0015279939 | *--EAT_SIG----------+------------------>| | | |
+0015280737 | *--EAT_SIG--------->| | | | |
+0015289641 | | | | | |
+0015294035 | | | | | |
+0015540732 *--TIMEOUT_SIG------+------------------>| | | | |
+0015544272 . . . . | . . . . . . . . . | . . . . . . . . . * .DONE_SIG . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0015545182 | |<--------DONE_SIG--* | | | |
+0015549317 . . . . | . . . . . . . . . * .EAT_SIG. . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . . . . . . . . | . . .
+0015550227 | *--EAT_SIG----------+-------------------+-------------------+-------------------+------------------>|
+0015551025 | *--EAT_SIG----------+-------------------+-------------------+------------------>| |
+0015551823 | *--EAT_SIG----------+-------------------+------------------>| | |
+0015552621 | *--EAT_SIG----------+------------------>| | | |
+0015553419 | *--EAT_SIG--------->| | | | |
+0015567245 | | | | | |
+0015571639 | | | | | |
+@endverbatim
+
@next{qspy_matlab}
*/
@@ -1600,7 +1763,6 @@ through the rows. Therefore, a data set consisting of twenty four time samples o
- @ref MATLAB_Q_SCHED
--
@section MATLAB_Q_STATE Q_STATE Matrix
The N-by-6 @c Q_STATE matrix stores all QS records generated by the QEP hierarchical event processor and pertaining to all the state machines in the system. The following table summarizes how the QS records are stored in the matrix:
@@ -1772,7 +1934,6 @@ For example, the following MATLAB plot shows the timing diagrams for all Philo s
@image html FigQSPY.01.jpg "Timing diagrams for all Philo state machines."
--
@section MATLAB_Q_ACTIVE Q_ACTIVE Matrix
The N-by-5 @c Q_ACTIVE matrix stores QS records pertaining to adding/removing active objects and subscribing/unsubscribing to events from active objects. The following table summarizes how the QS records are stored in the matrix:
@@ -1837,7 +1998,6 @@ ALIGN="center">
--
@section MATLAB_Q_EQUEUE Q_EQUEUE Matrix
The N-by-10 @c Q_EQUEUE matrix stores QS records pertaining to queuing events in the QF. Both the active object event queues and the "raw" thread-safe queues are included. The 'nUsed' field denotes the current number of used entries in the queue. The 'Maximum nUsed' filed denotes the maximum number of used entries since initialization (high watermark). Both fields contain the number of used entries in the queues ring-buffer plus one, to account for the extra location at the front of the queue. The following table summarizes how the QS records are stored in the matrix:
@@ -2037,7 +2197,6 @@ ALIGN="center">
--
@section MATLAB_Q_MPOOL Q_MPOOL Matrix
The N-by-5 @c Q_MPOOL matrix stores QS records pertaining to memory pools in the QF. The 'nFree' field denotes the current number of free blocks in the event pool. The 'Minimum nFree' filed denotes the minimal number of free blocks since initialization (low watermark). The following table summarizes how the QS records are stored in the matrix:
@@ -2107,7 +2266,6 @@ ALIGN="center">
--
@section MATLAB_Q_NEW Q_NEW Matrix
The N-by-6 @c Q_NEW matrix stores QS records pertaining to dynamic event allocation and automatic event recycling (garbage collection) in the QF. The following table summarizes how the QS records are stored in the matrix:
@@ -2196,7 +2354,6 @@ ALIGN="center">
--
@section MATLAB_Q_PUB Q_PUB Matrix
The N-by-7 @c Q_PUB matrix stores QS records pertaining to publishing events in QF. The following table summarizes how the QS records are stored in the matrix:
@@ -2253,7 +2410,6 @@ ALIGN="center">
--
@section MATLAB_Q_TIME Q_TIME Matrix
The N-by-7 @c Q_TIME matrix stores QS records pertaining to time events in QF. The following table summarizes how the QS records are stored in the matrix:
@@ -2414,7 +2570,6 @@ ALIGN="center">
--
@section MATLAB_Q_INT Q_INT Matrix
The N-by-3 @c Q_INT matrix stores QS records pertaining to interrupt disabling and enabling. The following table summarizes how the QS records are stored in the matrix:
@@ -2475,7 +2630,6 @@ ALIGN="center">
--
@section MATLAB_Q_ISR Q_ISR Matrix
The N-by-4 @c Q_ISR matrix stores QS records pertaining to interrupt entry and exit. The following table summarizes how the QS records are stored in the matrix:
@@ -2538,7 +2692,6 @@ ALIGN="center">
--
@section MATLAB_Q_MUTEX Q_MUTEX Matrix
The N-by-4 @c Q_MUTEX matrix stores QS records pertaining to the priority-ceiling mutex activity in QK. The following table summarizes how the QS records are stored in the matrix:
@@ -2605,7 +2758,6 @@ ALIGN="center">
--
@section MATLAB_Q_SCHED Q_SCHED Matrix
The N-by-3 @c Q_SCHED matrix stores QS records pertaining to scheduling next task in QK. The following table summarizes how the QS records are stored in the matrix:
@@ -2635,34 +2787,5 @@ ALIGN="center">
-@next{qspy_mscgen}
-*/
-/*###########################################################################*/
-/**
-@page qspy_mscgen QSPY MscGen Support
-
-The QSPY host application can also save the tracing data in the format suitable for the MscGen utility to generate sequence diagrams .
-
-@note The MscGen utility is also available in the Qtools collection (the same that contains QSPY itself, see @ref install "Installing").
-
-To generate an MscGen file, you need to invoke QSPY with the `-g` @ref qspy_command "command-line option", or to hit the `g` @ref qspy_keyboard "key-stroke" while QSPY is running.
-
-
-@note
-The generation of sequence diagrams relies on the following QS trace records being enabled: #QS_QF_ACTIVE_POST, #QS_QF_ACTIVE_POST_LIFO. Additional annotations of the sequence diagrams are also available if the following QS trace records are enabled: #QS_QF_PUBLISH, #QS_QF_TICK, and #QS_QEP_TRAN.
-
-Subsequently, you need to invoke the MscGen utility to convert the generated file to graphical format, such as .PNG, .EPS, .SVG, or .ISMAP. For example, the following command generates a sequence diagram in .SVG from the dpp.msc file.
-
-@verbatim
-mscgen -Tsvg -idpp.msc
-@endverbatim
-
-The following screen shot shows a sequence diagram generated from the Dining Philosophers Problem (DPP) application. The .MSC file has been converted to .SVG and viewed in a web browser (Google Chrome in this case).
-
-@image html mscgen_dpp.gif
-
-@note
-The numbers proceeding the signal names in the diagram are the Target time-stamps.
-
@next{qutest}
*/
diff --git a/doxygen/qspyview.dox b/doxygen/qspyview.dox
deleted file mode 100644
index fe0a93c..0000000
--- a/doxygen/qspyview.dox
+++ /dev/null
@@ -1,467 +0,0 @@
-/*! @page qspyview QSpyView™ Visualization & Monitoring
-
-@tableofcontents
-
-@section qspyview_about About QSpyView™
-QSpyView™ is a powerful **Visualization and Monitoring** facility, which allows embedded developers to rapidly create _virtual Graphical User Interfaces_ to monitor and control their embedded devices from a host (desktop) computer. The interfaces created by QSpyView™ can visualize the tracing data produced by QP/Spy™ and can also **send** various commands to the embedded target.
-
-
-@note
-A visualization and monitoring system like QSpyView™ can be used in all stages of development, manufacturing, and after the deployment, for in-field servicing of embedded devices.
-
-
-@image html qspyview_ex.png "Example of a QSpyView™ session on an embedded board (EFM32-SLSTK)"
-
-As you can see in the figure above, a QSpyView™ user interface consists of the text box with extensible menus plus a customizable canvas that can display the QP/Spy™ data in an attractive graphical format, such as animations, graphs, etc. and can contain controls, such as buttons, sliders, etc. The actual functionality of the _virtual GUI_ obviously depends on the target system and the embedded code it is running. Therefore, the QSpyView™ provides only a skeleton, which is then **customized** by user-supplied scripts.
-
-
-@subsection qspyview_special What's Special About QSpyView™?
-The GUIs created with QSpyView™ are naturally platform-neutral and run without any changes on Windows, Linux, or macOS.
-
-QSpyView™ currently supports the following @subpage qspyview_ui "commands" (NOTE: QSpyView™ is @subpage qspyview_cust "extensible" with functionality specific to the project at hand, so it can provide many more features on top of the basic functionality enumerated below):
-
-- Set @ref qs_global "global QS filters" inside the Target
-- Set @ref qs_local "local QS filters" inside the Target
-- Inject an arbitrary event to the Target (direct post or publish)
-- Execute a user-defined callback function inside the Target with arguments supplied from QSpyView™
-- Peek data inside the Target and send to QSpyView™
-- Poke data (supplied from QSpyView™) into the Target
-- Execute clock tick inside the Target
-- Request target information (version, all sizes of objects, build time-stamp)
-- Remotely reset the Target
-
-@remark
-Why UDP? The @ref qspy_udp "communication between QSPY and QSpyView" is based on UDP, because UDP is inherently packet-oriented (as opposed to TCP, which is stream-oriented) and preserves the packet boundaries .
-
-
-
-@section qspyview_struct QSpyView™ Structure
-The sequence diagram below shows the general structure of QSpyView™. The embedded Target is running an instrumented code that communicates with the @ref qspy "QSPY Host application" over the @ref qspy_link "Target data link" (red arrows ). This communication is based on the @ref qpspy_proto "QP/Spy Protocol".
-
-The QSpyView™ (Tcl/Tk script) attaches to the QSPY host application by means of the @ref qspy_udp "UDP socket" that QSPY opens when the `-u` @ref qspy_command "command-line option" is selected. This communication (blue arrows ) uses the same packet structure as the @ref qpspy_proto "QP/Spy Protocol", but without the HDLC framing, without transparency (escaping), and without the checksum.
-
-@note
-The QSpyView Front-End attaches to the @ref udp_channel "binary-channel" of the UDP socket served by QSPY (blue arrows in the sequence diagram below).
-
-
-@attention
-The @ref udp_channel "QSPY UDP channel" should **not** be confused with the @ref qspy_link "QSPY target communication channel" (red arrows in the sequence diagram below), which can be serial-port, TCP/IP, or a binary-file.
-
-
-@image html qspy_qspyview.gif "Communication between Target, QSPY, and QSpyView"
-
-
-
- A The QSPY Back-End forwards **all** trace records produced by the Target to the UDP Socket, so that any attached Front-End (such as QSpyView™) receives all this data.
-
-
- B The QSPY Back-End relays all UDP packets with @ref qpspy_proto "Record-ID" in the range `0..127` to the Target.
-
-
- C UDP packets with @ref qpspy_proto "Record-ID" in the range `128..255` are not relayed to the Target, but instead are used for communication between the QSpyView™ Front-End and the QSPY Back-End.
-
-
-
--
-@section qspyview_install Installing QSpyView™ and Tcl/Tk
-QSpyView™ is bundled with QSPY and is installed automatically when you @ref install "install QTools". Specifically, QSpyView™ consists of the qspy.tcl and qspyview.tcl Tcl scripts located in the @ref qspy_files "qtools\qspy\qspyview" folder.
-
-
-@subsection qspyview_windows Windows
-In order to run QSpyView™, you need the Tk interpreter called **wish** installed on your machine. `Wish` (version 8.4) is included in the QTools collection for Windows, so it will be available if you install QTools. Also, the Tcl/Tk distribution included in QTools has been already extended with the UDP-Sockets for Tcl, so you can use the `tclsh` and `wish` interpreters "as is" without any additional modifications.
-
-
-@subsection qspyview_linux Linux
-On Linux, Tcl/Tk is usually installed, but you need to augment the standard Tcl/Tk distribution with the UDP Sockets for Tcl.
-
-@note
-All the tools and instructions of adding UDP Sockets to Tcl are included in the QTools collection for Linux, in the tcludp folder (see @ref qspy_files "QSPY directories and files")
-
-
--
-@section qspyview_run Running QSpyView™
-Being a Tcl/Tk application, QSpyView™ requires the Tk interpreter called **wish** (windowing shell) to run. This Tcl/Tk interpreter needs to be augmented with the UDP socket extension , because the standard Tcl/Tk distributions typically don't support UDP. (NOTE: The Tcl/Tk interpreters included in the QTools collection for Windows are already augmented with the UDP socket extension, so you don't need to do anything to use them for QSpyView™).
-
-In the simplest form, QSpyView™ might be started by changing to the folder `qtools\qspy\qspyview` and double-clicking on the qspyview.tcl script. Alternatively, you might open the Command Prompt and type:
-
-@verbatim
-wish qspyview.tcl
-@endverbatim
-
-This would launch QSpyView™ in the "default" configuration, without any @ref qspyview_cust "customization" specific to a project at hand.
-
-However, it also possible to launch QSpyView™ @ref qspyview_cust "customized to a particular project", such as the DPP application, by providing commands and views specific to the project at hand. For this QSpyView™ provides an extension mechanism to provide another script as a command-line parameter to the qspyview.tcl script.
-
-@note
-QSpyView takes up to three optional command-line parameters, with the following usage:@n@n
-`wish qspyview.tcl [ [ []]]`@n@n
-where `` is the customization script (e.g., `dpp.tcl`), `` is the network host name or IP address of the host running the QSPY "Back-End", and `` is the UDP port number opened by the QSPY "Back-End". If the parameters `` and `` are not provided, the defaults of `localhost` and `7701` are assumed.
-
-For example, the DPP example provides the extension script named dpp.tcl , located in the QP examples directory. In this case, you need to choose from which directory you want to launch QSpyView™. If you choose to launch it from the directory containing the extension script, you need to fully-qualify the location of the qspyview.tcl script, as follows:
-
-@verbatim
-wish %QTOOLS%\qspy\qspyview\qspyview.tcl dpp.tcl
-@endverbatim
-
-
-@note
-In practice, the easiest way to launch QSpyView™ is to define a shortcut , like the one provided with the DPP example:@n@n
-@image html qspyview_shortcut.gif "qspyview shortcut properties"
-
-
-
-@subsection qspyview_attaching Attaching QSpyView to QSPY
-In contrast to TCP, which is stream-oriented, UDP is packet-oriented, so the only way to "attach" two ends of communication is to exchange packets. Consequently, immediately after QSpyView™ is launched, it tries to **attach** by sending the @ref udp_ATTACH "ATTACH" packet to QSPY. If QSPY responds with the @ref udp_in_ATTACH "ATTACH" response, QSpyView™ considers that it is "attached".
-
-However, if the @ref udp_in_ATTACH "ATTACH" response does not arrive within a second or two (because perhaps QSPY is not running), QSpyView™ opens a modal dialog box that reminds you to run QSPY with the `-u` command-line option, as shown in the screen-shot below:
-
-@image html qspyview_before.gif "Attach to QSPY dialog box"
-
-Depending how you start @ref qspy "QSPY", the dialog box might close automatically, which means that QSpyView has successfully **attached** to QSPY. However, if the dialog box does not close, you need to click the **OK** button to send @ref udp_ATTACH "ATTACH" packet to QSPY, until QSpyView™ receives the @ref udp_in_ATTACH "ATTACH" response from QSPY. If you can't "attach", you can click the **Cancel** button to close QSpyView™.
-
-@note
-Because UDP works over networks, the QSPY Back-End can run on a different machine (e.g., a lab computer) that the the QSpyView™ Front-End (e.g., office computer). These two machines can even run different operating systems, for example Linux on the lab computer and Windows in the office, or vice versa. All you need to do is to provide the host-name parameter as the third command-line argument to the `qspyview.tcl` script (e.g., `wish qspyview.tcl dpp.tcl 192.168.1.101`).
-
-
-
-@subsection qspyview_tstamp Recognizing the Target
-Before QSpyView™ can correctly interpret any data from the Target, it needs to obtain certain information about the Target, such as the sizes of object pointers, function pointers, event signals, etc. This information is provided in the ::QS_TARGET_INFO trace record coming from the Target.
-
-To inform you about the Target status, QSpyView™ displays the **Target: UNKNOWN** in the status bar when the target is "unknown":
-
-@image html qspyview_unknown.gif "Target UNKNONW status"
-
-If this happens, you can explicitly request the Target information by means of the "Commands->Query Target Info" menu:
-
-@image html qspyview_known.gif "Target KNONW status (build time-stamp)"
-
-After the Target information is received, the QSpyView™ status bar shows the build time-stamp of the Target image.
-
-@next{qspyview_ui}
-*/
-/*###########################################################################*/
-/**
-@page qspyview_ui QSpyView User Interface
-
-@tableofcontents
-
-The qspyview.tcl script provides a simple Graphical User Interface (GUI) consisting of the main menu, the text view, the canvas view, and the status bar.
-
-@image html qspyview.gif "QSpyView user interface"
-
-The main menu includes several useful commands, which are quickly reviewed and the following sections. The main menu might subsequently be augmented in your own @ref qspyview_cust "customizations".
-
-
--
-@section qspyview_file File Menu
-The File menu provides interface to the @ref qspy_saving "QSPY saving files" feature. This menu allows you to trigger QSPY to save @ref qspy_dict "dictionaries", as well as to open/close all other file formats supported by QSPY.
-
-@image html qspyview_file.gif
-
-
--
-@section qspyview_view View Menu
-The View menu allows you to toggle (show/hide) the two main views: the Text view and the Canvas view.
-
-@image html qspyview_view.gif "Text-view and Canvas-view menus"
-
-@image html qspyview_canvas.gif "Canvas-view enabled"
-
-@image html qspyview_no_text.gif "Text-view disabled"
-
-@note
-The provided screen shots of the Text-view and the Canvas-view are specific to the DPP example application (see @ref qspyview_cust).
-
-
--
-@section qspyview_filters Filters Menu
-The Filters menu opens dialog boxes through which you can set the @ref qspy_filters "QSPY filters".
-
-@image html qspyview_filters.gif
-
-
-@subsection qspyview_global Setting Global Filters
-The Q-SPY Global Filter dialog box allows you to turn each individual @ref qspy_global "global trace record" on and off. The Global Filter has two main components: the standard Q-SPY trace records (see ::QSpyRecords), and the User-specific trace records (starting with the offset ::QS_USER). The User QS Records are visible when you **scroll down** the "Global Filters" dialog box.
-
-@image html qspyview_global.gif
-
-@note
-The "Global Filter" dialog box does not show the "Miscellaneous" QS trace records (such as ::QS_OBJ_DICT, ::QS_TARGET_INFO, etc.), because these trace records are "not maskable", meaning that they are always enabled and cannot be turned off by the Global Filter.
-
-
-@subsection qspyview_local Setting Local Filters
-The Q-SPY Local Filter dialog box allows you to set each individual @ref qspy_local "local filter".
-
-@image html qspyview_local.png
-
-@note
-The dialog box accepts the addresses of the objects in decimal and in hexadecimal (with the `0x` prefix), as shown in the screen-shot above.
-
-
-@subsection qspyview_ao Setting Active Object Filter
-The "Active Object" filter is a shortcut to setting the @ref qspy_local "Q-SPY local filter" for a given active object in the Target. Specifically, the "Active Object" filter sets the two local filters ::QS_FILTER_AO_OBJ and ::QS_FILTER_SM_OBJ to the same Active Object with the specified priority (NOTE: Each Active Object has a unique priority in QP).
-
-![setting Active Object filter to AO with priority 6](qspyview_ao.png)
-
-
--
-@section qspyview_commands Commands Menu
-The Commands menu allows you to execute simple commands (without parameters) in the Target, such as Reset the Target, Query the Target, and clock Tick at rate 0 and rate 1. Also, this menu allows you to execute commands with parameters, which are quickly discussed below
-
-![](qspyview_commands.png)
-
-
-@subsection qspyview_user Executing User Command
-The "User Command..." menu allows you to invoke a command in the Target and pass up to three parameters to this command. (**NOTE:** a command is an application-specific callback function that the QS-RX component executes in the Target).
-
-The following screen shot shows how to execute User Command number `21` with the parameters: `111`, `0x222` and `333`. Both the command number and the parameters can be specified in hexadecimal (with the `0x` prefix).
-
-![](qspyview_cmd.png)
-
-
-
-@subsection qspyview_peek Peek Command
-The Peek Obj/Addr... command opens a dialog box, in which you can provide the Target object or address (RAM or ROM) (**NOTE:** You can provide either the object name, which must be known by its object-dictionary, or numerical address, which **must** be a valid RAM/ROM address, or the Target might crash.)
-
-As shown in the screen shot below, the PEEK command takes additionally the offset into the object [bytes], the size of the item [1/2/4 bytes] and the number of units (1..255) you wish to "peek".
-
-![](qspyview_peek.png)
-@n
-
-The Target responds with a ::QS_PEEK_DATA trace record, which you can view in QSPY human-readable output (the packet is also sent to QSpyView, where you can react to it in your @ref qspyview_cust "customization".)
-
-@verbatim
- Trg-Ack QS_RX_CURR_OBJ
-3558939043 Trg-Peek Offs=0,Size=4,Num=10,Data=<00012345,00000000,00000000,00000000,0000000
-0,00000000,00000000,00000000,00000000,00000000>
-@endverbatim
-
-
-@note
-The Peek Command can be used to view any **readable** address, such as ROM, RAM, and also **peripheral registers** in your Target.
-
-
-
-@subsection qspyview_poke Poke Command
-The "Poke Obj/Addr..." command allows you to write data to the specified object or address in Target's RAM (**NOTE:** You can provide either the object name, which must be known by its object-dictionary, or numerical address, which **must** be a valid RAM address, or the Target might crash.)
-
-As shown in the screen shot below, the POKE command takes additionally the offset into the object [bytes], the **format** of the data (c for byte, s for little-endian uint16_t, S for big-endian uint16_t, i for little-endian uint32_t and I for big-endian uint32_t) and the data (might be in hex).
-
-![](qspyview_poke.png)
-@n
-
-The Target responds with `Trg-Ack QS_RX_CURR_OBJ` and `Trg-Ack QS_RX_POKE`. The qspy output below shows additionally an output generated by the PEEK command that verifies that the value `0xDEAD` has been poked into the object.
-
-@verbatim
- Trg-Ack QS_RX_CURR_OBJ
- Trg-Ack QS_RX_POKE
- Trg-Ack QS_RX_CURR_OBJ
-3953414540 Trg-Peek Offs=0,Size=4,Num=10,Data=<00012345,0000DEAD,00000000,00000000,0000000
-0,00000000,00000000,00000000,00000000,00000000>
-@endverbatim
-
-@note
-The Poke Command can be used to change any **writable** address, such as RAM, but also **peripheral registers** in your Target.
-
-
--
-@section qspyview_events Events Menu
-The "Generate Event..." menu allows you to send an arbitrary event (with up to 10 different parameters) to the Target. The event will be either posted directly to the specified Active Object, or it will be published.
-
-As shown in the screen-shot below, you need to provide the `prio` of the recipient active object. (If `prio` is greater than zero, the event will be posted directly to the AO with that priority, otherwise the event will be published). You also need to specify the numerical value of the event signal (`sig`).
-
-![](qspyview_event.png)
-
-The optional "Event Parameters" section allows you to specify up to 10 arbitrary parameters. Each parameter is specified as a pair of **format** followed by data. The format is any valid specification of the format for the binary format Tcl command. For example, here the format `c` means a byte, while the format `i` means that the `data` should be encoded as 32-bit integer in little-endian byte order. (NOTE: The endianness you specify in the `format` field must match the endianness of the Target.
-
-@attention
-All the specified parameters are appended to the event packet for the target in the exact order and the specified binary format. If the event structure is represented in the Target memory with some **padding**, you need to provide such padding explicitly (as one of the parameters).
-
-@note
-The main purpose of the "Generate Event..." menu is to allow you to determine experimentally the correct format of events that you wish to inject into the Target. Once the correct format has been confirmed, you can generate the events programmatically in your @ref qspyview_cust "customization".
-
-
--
-@section qspyview_custom Custom Menu
-This top-level menu is provided for your customization. It's intent is to let you add your own commands in your script.
-
-@image html qspyview_custom.gif
-
-
--
-@section qspyview_help Help Menu
-This menu allows you to access the online Q-SPY help in HTML, and also allows you to open the "About" dialog box.
-
-@image html qspyview_help.gif
-
-
-@next{qspyview_cust}
-*/
-/*###########################################################################*/
-/**
-@page qspyview_cust Customizing and Extending QSpyView
-
-@tableofcontents
-
-The QSpyView Front-End has been specifically designed for extensibility, so that you can quickly customize its behavior to your specific project. In fact, as mentioned in the section about @ref qspyview_run "running QSpyView", the qspyview.tcl script takes a command-line parameter, which is another Tcl script designed specifically to extend and customize the basic functionality. This section describes how to write this extension script, so that you can turn QSpyView into a powerful custom Human-Machine Interface (HMI) for your projects.
-
-@note
-You don't need to change the qspyview.tcl script to customize and extend it for your project. The customization you make go into a separate script, which is specific to your project. That way, you can have many different customization scripts and you don't pollute (and possibly break) the original code.
-
-
--
-@section qspyview_files QSpyView files
-
-The QSpyView Front-End has a modular source code, consisting of the following files and folders:
-
-
- qtools
-
-
- qspy — @ref qspy "QSPY tool"
-
-
- qspyview — @ref qspyview "QSpyView" sources
-
-
- img — images used by QSpyView™
-
- qspy.tcl — Tcl script for UDP communication with the QSPY Back-End
-
- qspyview.tcl — QSpyView Tcl/Tk script
-
- default.tcl — the default customization of the QSpyView Tcl/Tk script
-
-
-
-
-
-
-As you can see, the QSpyView source code is broken down into three scripts. The qspy.tcl script implements the UDP communication with the QSPY Back-End. This script is specifically written in pure Tcl an **no** Tk, so that it can be used both with and without a GUI (head-less scripts). This script is not standalone but rather it needs to be included (`source`ed) in other scripts.
-
-The main functionality of QSpyView is implemented in the qspyview.tcl script, which uses Tk for the GUI. This script takes up to three optional command-line parameters: ``, ``, and ``. The `` the customization script that will be included (`source`ed) by `qspyview.tcl`. If you don't provide this parameter, the default customization script default.tcl will be used.
-
-@note
-The QSpyView folder does not contain the customization for the DPP example application, because it makes much more sense to co-locate this customization with the DPP project. Consequently, the dpp.tcl is located in the QP/C/C++ example directory `\examples\arm-cm\dpp_ek-tm4c123gxl\qspy`, where `` stands for QP/C or QP/C++ installation directory on your machine.
-
-
--
-@section qspyview_script Your Customization Script
-The easiest way to customize QSpyView is to copy the provided default.tcl script (or the dpp.tcl example), rename it, and add your own extensions.
-
-When you open default.tcl , you will see that it consists of the following sections:
-
-- @ref qspyview_cust_commands "command handlers" are Tcl procedures for your custom commands
-
-- @ref qspyview_cust_menu "additional menu options" are your own menu items added to the @ref qspyview_ui "top-level menu"
-
-- @ref qspyview_cust_canvas "custom canvas" for your project, where you can provide the User Interface for your project
-
-- @ref qspyview_cust_user "user record handlers" are Tcl procedures for handling application-specific (User) trace records
-
-- @ref qspyview_cust_special "special record handlers" are Tcl procedures to handle special trace records (RESET and Target INFO)
-
-- @ref qspyview_cust_standard "standard record handlers" are Tcl procedures to handle standard QS records from the Target
-
-
-
-@subsection qspyview_cust_commands Adding Custom Commands
-Custom commands can come in two forms: commands with and without user-supplied parameters. A command without parameter can be simply coded as a Tcl procedure, which will be @ref qspyview_cust_menu "attached to a menu item". A command requiring user-supplied input needs to be implemented as a dialog box. The qspyview.tcl script provides plenty of examples of such dialog boxes.
-
-A command procedure typically will end with sending a packet to the Target or to the QSPY Back-End. The qspy.tcl script provides the procedure `::qspy::sendPkt` for this purpose. Please refer to the example code (default.tcl or dpp.tcl) for examples of sending packets.
-
-
-@subsection qspyview_cust_menu Additional Menu Options
-Menu options can be added very simply. For example, the following line of Tcl adds the menu option "MyCommand" to the menu bar `.mber.cust`, which will call the procedure `onMyCommand`:
-
-@verbatim
-.mbar.cust add command -label "MyCommand" -command onMyCommand
-@endverbatim
-
-
-@subsection qspyview_cust_canvas Custom Canvas (HMI)
-The Canvas view can provide a complete custom Human-Machine Interface (HMI) to your embedded Target. The Canvas can display the changing status of the application and also it can provide actuators to control the Target.
-
-@image html qspyview_canv_dpp.gif "Custom Canvas for the DPP Application"
-
-The screen shot above shows the Canvas customization from the dpp.tcl script. Please note that the button in the center of the screen allows you to interact with the Target by sending commands to it. Please refer to this script code for the details of how various effects have been achieved.
-
-@note
-Many Tk widget packages and libraries (e.g. BWidgets, IWidgets, etc.) are available to aid you in developing your custom canvas. With such widget libraries, you can display the data in an attractive form: as gauges, bars, graphs, and sliders. The attractiveness of the GUI is limited only by your creativity.
-
-
-
-@subsection qspyview_cust_user User Record Handlers
-The User trace records are the application-specific trace records that are produced by your embedded application (as opposed to the QP framework). These trace records very likely require custom handling, because QSPY cannot really "know" what they represent.
-
-The DPP project provides two examples of User trace records (`PHILO_STAT` and `COMMAND_STAT`, see `bsp.c` in the `qpc\examples\arm-cm\dpp_ek-tm4c123gxl\qk` directory). The following picture shows the structure of the `PHILO_STAT` trace record:
-
-@image html qspy9.gif "PHILO_STAT User trace record"
-
-
-As all trace records, user records start with the sequence number, followed by the record-ID. However, you should also known that all user records contain a time-stamp and that all data fields are preceded by a format-byte. This format byte helps QSPY to correctly display all data fields, but is really unnecessary for you, who knows the layout of the data.) As a concrete example, here is the complete User record handler for `PHILO_STAT == QS_USER + 0 == 70`:
-
-@code{tcl}
-# user record handlers [70..0x7C] --------------------------------------------
-proc ::qspy::rec70 {} { ;# QS_USER
- variable thePkt
- variable theFmt
- binary scan $thePkt xx$theFmt(tstamp)xcxa* \
- tstamp philoNum stat
-
- dispTxt [format "%010u Philo %1d is %s" $tstamp $philoNum $stat]
-
- global thePhiloId
- set img [string index $stat 0]
- .canv.c itemconfigure [expr $thePhiloId + $philoNum] -image ::img::$img
-}
-@endcode
-
-
- line 2 The record-handler procedure is always starts with `proc ::qspy::rec {}`, where `` is the trace record number in decimal. The procedure takes no parameters.
-
-
- line 3 The packet content is provided as variable `$thePkt`.
-
-
- line 4 The formats of QSPY objects are provided as the (associative) array `$theFmt`. You will need the format of time-stamp to parse the User packet.
-
-
- lines 5-6 The parsing of the packet is accomplished by the `binary scan` Tcl command. The meaning of the format fields is as follows: `x` skip sequence number, `x` skip record-ID, `$theFmt(timestamp)` extract the specified number of bytes and assign to the local variable `tstamp`, `x` skip the format byte, `c` extract a byte and assign to the local variable `philoNum`, `x` skip the format byte, `a*` extract a zero-terminated string and assign to local variable `stat`.
-
-
- line 8 the `dispTxt` command (implemented in qspyview.tcl) displays the specified string in the @ref qspyview_ui "text view".
-
-
- line 12 the Canvas is updated with the new image of the "Philosopher", which reflects its current status. This accomplishes animation of the images on the Canvas.
-
-
-
-
-
-@subsection qspyview_cust_special Special Record Handlers
-The custom script offers you an option to add your own customization for the special events, such as Reset of the Target and the arrival of the Target INFO. You can add your code inside the following procedures:
-
-@verbatim
-proc ::qspy::recRESET {} { ;# target reset callback
-}
-proc ::qspy::recINFO {} { ;# target info callback
-}
-@endverbatim
-
-
-@subsection qspyview_cust_standard Standard Record Handlers
-As mentioned before, the QSpyView Front-End receives **all** trace records produced by the Target. This includes all standard QS records (see ::QSpyRecords). All these record-handler procedures have the general form:
-
-@verbatim
-proc ::qspy::rec {}
-@endverbatim
-
-where `` is a decimal trace record number in the range 1..69.
-
-@note
-In order to parse the standard QS trace records, you could view the `qspy.c` implementation, where all the standard trace records are parsed and displayed to the screen.
-
-@next{history}
-*/
-
diff --git a/doxygen/qutest.dox b/doxygen/qutest.dox
index d0e0401..c4cdacc 100644
--- a/doxygen/qutest.dox
+++ b/doxygen/qutest.dox
@@ -1,6 +1,12 @@
/*! @page qutest QUTest™ Unit Testing Harness
-![](qutest_banner.jpg)
+@image html qutest_banner.jpg
+
+@subpage qutest_tut " "
+@subpage qutest_rtc " "
+@subpage qutest_fixture " "
+@subpage qutest_script " "
+
@section qutest_about About QUTest™
QUTest™ (pronounced "cutest") is a **unit testing harness** (a.k.a. *unit testing framework*), which is specifically designed for deeply embedded systems, but also supports unit testing of embedded code on host computers ("dual targeting"). QUTest™ is the fundamental tooling for Test-Driven Development (TDD) of QP/C/C++ applications , which is a highly recommended best-practice.
@@ -26,19 +32,19 @@ The process of testing embedded code with QUTest™ involves the following c
@n
-![Communication between Target, QSPY, and QUTest](qutest_targ.gif)
+@image html qutest_targ.gif "Communication between Target, QSPY, and QUTest"
@remark
-The separation between CUT execution and checking the test results has many benefits. One of the most important ones is that CUT execution (*test fixture*) and checking the results (*test script*) can be done in *different programming languages*. To this end QUTest™ provides support for writing the @ref qutest_script "test scripts in Python" (2.7+ and 3+).
+The separation between CUT execution and checking the test results has many benefits. One of the most important ones is that CUT execution (*test fixture*) and checking the results (*test script*) can be done in *different programming languages*. To this end QUTest™ provides support for writing the @ref qutest_script "test scripts in Python".
@n
-![](logo_python27-python3.gif)
+@image html img/logo_python3.gif
The general QUTest™ structure just described corresponds to running tests on an embedded Target. But QUTest™ can also execute tests on the **host computer**. In that case (shown in the figure below), the **test fixture** is a host executable that communicates with the QSPY host application via a TCP/IP socket (QSPY started with the `-t` @ref qspy_command "command-line option"). In this case all QUTest™ components execute on the host computer.
-![QUTest with Host Executable](qutest_host.gif)
+@image html qutest_host.gif "QUTest with Host Executable"
@remark
@@ -55,7 +61,7 @@ Unlike other existing unit testing harnesses for embedded systems (e.g., **NOTE:** QUTest™ supports *test scripts* written either in [Python](https://www.python.org) (2.7 or 3.x).
+> **NOTE:** QUTest™ supports *test scripts* written in [Python](https://www.python.org) (3.3+).
- QUTest™ supports **resetting the Target** for each individual test, if needed. This goes far beyond providing test `setup()` and `teardown()` functions that other test fixtures offer (and of course QUTest supports as well). Clean reset of the Target avoids erroneous tests that implicitly rely on side effects from previously executed code. This is particularly important for embedded systems and for state machines, so that each test can start from a known reset condition.
@@ -73,17 +79,114 @@ Even though QUTest™ is particularly suitable for running tests on deeply e
-@subsection qutest_inst Downloading and Installing QUTest™
-QUTest™ is automatically installed as part of the @ref gs_obtain "QTools™ Collection".
+@section qutest_use Installation & Use
+The qutest.py script can be used standalone, without any installation in your Python system (see @ref qutest_run below).
@note
-To run Python @ref qutest_script "test scripts" you need to install Python on your machine and you need to add `python` to your `PATH`.
+The qutest.py script is included in the @ref qtools_about "QTools™ collection". Also, the @ref qtools_win "QTools™ collection for Windows" already includes Python (3.8), so you don't need to install anything extra.
-@subpage qutest_tut " "
-@subpage qutest_rtc " "
-@subpage qutest_fixture " "
-@subpage qutest_script " "
+Alternatively, you can use *your own Python** installation, into which you can install the latest QUTest™ with `pip` from the [PyPi index ](https://pypi.org/project/qutest/) by executing the following command:
+
+@verbatim
+pip install qutest
+@endverbatim
+
+
+@subsection qutest_run Running QUTest™
+If you are using QUTest™ as a standalone Python script, you invoke it as follows:
+
+@verbatim
+python3 /qutest.py [-x] [test-scripts] [host_exe] [qspy_host[:udp_port]] [qspy_tcp_port]
+@endverbatim
+
+Alternatively, if you've installed QView™ with `pip`, you invoke it as follows:
+
+@verbatim
+qutest [-x] [test-scripts] [host_exe] [qspy_host[:udp_port]] [qspy_tcp_port]
+@endverbatim
+
+
+
+@subsection qutest_command Command-line Options
+
+- `-x` - optional flag that causes qutest to exit on first test failure.
+
+- `test_scripts` - optional specification of the Python test scripts to run. If not specified, qutest will try to run all *.py files in the current directory as test scripts
+
+- `host_exe | DEBUG` - optional specification of the test-fixture compiled for the host (host executable) for testing on the host computer. The special value DEBUG means that qutest will run in the "debug mode", in which it will NOT launch the host executables and it will wait for the Target reset and other responses from the Target. If host_exe is not specified, an embedded target is assumed (which is loaded with the test fixture already).
+
+- `qspy_host[:udp_port]` - optional host-name/IP-address:port for the host running the QSPY host utility. If not specified, the default is 'localhost:7701'.
+
+- `tcp_port`- optional the QSpy TCP port number for connecting host executables. If not specified, the default is `6601`.
+
+
+@subsection qutest_exa Examples
+
+Windows Hosts
+
+@verbatim
+python3 %QTOOLS%\qutest\qutest.py
+@endverbatim
+
+runs all the test scripts (`*.py`) in the current directory.
+
+@verbatim
+python3 %QTOOLS%\qutest\qutest.py *.py
+@endverbatim
+
+runs the test scripts (`*.py`) in the current directory.
+
+@verbatim
+python3 %QTOOLS%\qutest\qutest.py *.py build\dpp.exe
+@endverbatim
+
+runs the test scripts (`*.py`) in the current directory and uses the host executable: `build\dpp.exe`
+
+@verbatim
+qutest *.py build\dpp.exe 192.168.1.100:7705
+@endverbatim
+
+runs "qutest" (**installed with pip**) to execute the test scripts (`*.py`) in the current directory, uses the host executable: `build\dpp.exe`, and connects to QSPY at `192.168.1.100:7705`
+
+@verbatim
+qutest *.py build\dpp.exe localhost:7701 6605
+@endverbatim
+
+runs "qutest" (**installed with pip**) to execute the test scripts (`*.py`) in the current directory, uses the host executable: `build\dpp.exe`, and connects to QSPY at `localhost:7701`, using the local UDP port `6605`
+
+
+Linux/MacOS Hosts
+
+@verbatim
+python3 $(QTOOLS)/qutest/qutest.py
+@endverbatim
+
+runs all the test scripts (`*.py`) in the current directory.
+
+@verbatim
+python3 $(QTOOLS)/qutest/utest.py *.py
+@endverbatim
+
+runs the test scripts (`*.py`) in the current directory.
+
+@verbatim
+python3 $(QTOOLS)/qutest/qutest.py *.py build/dpp
+@endverbatim
+
+runs the test scripts (`*.py`) in the current directory and uses the host executable: `build/dpp`
+
+@verbatim
+qutest *.py build/dpp 192.168.1.100:7705
+@endverbatim
+
+runs "qutest" (**installed with pip**) to execute the test scripts (`*.py`) in the current directory, uses the host executable: `build/dpp`, and connects to QSPY at `192.168.1.100:7705`
+
+@verbatim
+qutest *.py build/dpp localhost:7701 6605
+@endverbatim
+
+runs "qutest" (**installed with pip**) to execute the test scripts (`*.py`) in the current directory, uses the host executable: `build/dpp`, and connects to QSPY at `localhost:7701`, using the local UDP port `6605`
@next{qutest_tut}
@@ -116,44 +219,44 @@ Most individual tests in a *test script*, start with a clean **target reset**. T
![Target reset](qutest_reset.gif)
- [0] A *test script* executes the test() command.
+ 0 A *test script* executes the test() command.
- [1] By default, each test starts with calling an internal function reset() to reset the Target. This reset() function sends the `QS_RX_RESET` request to the *test fixture*. After this, the *test script* enters a wait state in which it waits for `QS_TARGET_INFO` reply from the Target.
+ 1 By default, each test starts with calling an internal function reset() to reset the Target. This reset() function sends the `QS_RX_RESET` request to the *test fixture*. After this, the *test script* enters a wait state in which it waits for `QS_TARGET_INFO` reply from the Target.
> **NOTE:** The Target reset can be suppressed by the `NORESET` option given in the test() command, which is illustrated in the @ref qutest_noreset "NORESET Tests" sequence diagram. Please note, however, that the first test in a *test script* (test group) and any test immediately following an "assertion-test" **must** cleanly reset the Target (so it cannot use the `NORESET` option).
- [2] The *test fixture* processes the #QS_RX_RESET request immediately by calling the QS_onReset() callback inside the Target.
+ 2 The *test fixture* processes the #QS_RX_RESET request immediately by calling the QS_onReset() callback inside the Target.
> **NOTE:** Embedded Targets reboot automatically after resetting. In case of a **host executable**, however, QUTest™ (qutest.py) launches it again.@n
- [3] The Target starts executing the *test fixture* code from the beginning. After QS gets initialized (QS_INIT()), the *test fixture* sends the `QS_TARGET_INFO` reply to the *test script*.
+ 3 The Target starts executing the *test fixture* code from the beginning. After QS gets initialized (QS_INIT()), the *test fixture* sends the `QS_TARGET_INFO` reply to the *test script*.
- [4] Upon reception of the awaited `QS_TARGET_INFO` reply, the *test script* attempts to execute the `on_reset()` procedure. If `on_reset()` is defined in the script, it runs at this time. (This scenario assumes that `on_reset()` is defined and runs until step [8]).
+ 4 Upon reception of the awaited `QS_TARGET_INFO` reply, the *test script* attempts to execute the `on_reset()` procedure. If `on_reset()` is defined in the script, it runs at this time. (This scenario assumes that `on_reset()` is defined and runs until step [8]).
- [5] A *test fixture* continues the initialization RTC step and typically produces some @ref qs_dict "QS dictionaries".
+ 5 A *test fixture* continues the initialization RTC step and typically produces some @ref qs_dict "QS dictionaries".
> **NOTE:** The @ref qs_dict "QS dictionaries" are consumed by QSPY and are **not** forwarded to the *test script*.
- [6] The *test fixture* might also produce some output that **is** forwarded to the *test script*.
+ 6 The *test fixture* might also produce some output that **is** forwarded to the *test script*.
- [7] Any such output needs to be explicitly expected by the *test script*. The `on_reset()` procedure is the ideal place to handle such output.
+ 7 Any such output needs to be explicitly expected by the *test script*. The `on_reset()` procedure is the ideal place to handle such output.
> **NOTE:** The main purpose of the `on_reset()` procedure is to consume any output generated during the reset RTC step as well as to perform any setup that should follow the Target reset. In principle, instead of coding `on_reset()`, you could place all this code directly at every test, but this would be repetitious and defining `on_reset()` allows you to avoid such repetitions.
- [8] The `on_reset()` procedure ends and the *test script* sends `QS_RX_TEST_SETUP` to the Target.
+ 8 The `on_reset()` procedure ends and the *test script* sends `QS_RX_TEST_SETUP` to the Target.
- [9] `QS_RX_TEST_SETUP` typically arrives while the *test fixture* still runs the initialization RTC. Therefore, `QS_RX_TEST_SETUP` is **not** processed immediately and its processing is delayed until the end of the current RTC step.
+ 9 `QS_RX_TEST_SETUP` typically arrives while the *test fixture* still runs the initialization RTC. Therefore, `QS_RX_TEST_SETUP` is **not** processed immediately and its processing is delayed until the end of the current RTC step.
- [10] A *test fixture* continues the initialization RTC step and might still produce some @ref qs_dict "QS dictionaries".
+ 10 A *test fixture* continues the initialization RTC step and might still produce some @ref qs_dict "QS dictionaries".
- [11] Finally, the *test fixture* completes the initialization RTC by calling `QF_run()`. `QF_run()` runs an event loop, in which it processes commands that have accumulated from the *test script*.
+ 11 Finally, the *test fixture* completes the initialization RTC by calling `QF_run()`. `QF_run()` runs an event loop, in which it processes commands that have accumulated from the *test script*.
- [12] The first such command is `QS_RX_TEST_SETUP`, which has been waiting in the input buffer.
+ 12 The first such command is `QS_RX_TEST_SETUP`, which has been waiting in the input buffer.
- [13] The acknowledgement for the `QS_RX_TEST_SETUP` is sent back to the *test script*
+ 13 The acknowledgement for the `QS_RX_TEST_SETUP` is sent back to the *test script*
- [14] Upon reception of `Trg-Ack QS_RX_TEST_SETUP`, the *test script* attempts to execute the `on_setup()` procedure. If `on_setup()` is defined in the script, it runs at this time.
+ 14 Upon reception of `Trg-Ack QS_RX_TEST_SETUP`, the *test script* attempts to execute the `on_setup()` procedure. If `on_setup()` is defined in the script, it runs at this time.
> **NOTE:** The main purpose of the `on_setup()` procedure is to consume any output generated from the `QS_onTestSetup()` callback in the *test fixture* invoked in the next step [15]. Note also the `QS_onTestSetup()` runs in all tests, including @ref qutest_noreset "NORESET tests".
- [15] The *test fixture* calls the `QS_onTestSetup()` callback function in the Target.
+ 15 The *test fixture* calls the `QS_onTestSetup()` callback function in the Target.
- [16] The *test script* proceeds with commands defined after the test() command. Processing of these commands is explained in sections @ref qutest_simple and @ref qutest_complex.
+ 16 The *test script* proceeds with commands defined after the test() command. Processing of these commands is explained in sections @ref qutest_simple and @ref qutest_complex.
@@ -212,9 +315,9 @@ The following *test fixture* code illustrates the use of the QS_TEST_PAUSE() mac
@endcode
- [1] The QS_TEST_PAUSE() macro pauses the initialization RTC after producing QS dictionaries, but before starting active objects.
+ 1 The QS_TEST_PAUSE() macro pauses the initialization RTC after producing QS dictionaries, but before starting active objects.
- [2] The QF_run() function completes the initialization RTC.
+ 2 The QF_run() function completes the initialization RTC.
@@ -224,22 +327,22 @@ The following sequence diagram shows the details of pausing a test. The explanat
![Pausing a test](qutest_pause.gif)
- [1] The target reset proceeds as before and produces the QS_TARGET_INFO trace record.
+ 1 The target reset proceeds as before and produces the QS_TARGET_INFO trace record.
- [2] At some point, however, the *test fixture* executes QS_TEST_PAUSE() , which sends QS_TEST_PAUSED record to the *test script*. At this point, the *test fixture* enters the event loop, so the initialization RTC finishes and the *test fixture* is now responsive to commands.
+ 2 At some point, however, the *test fixture* executes QS_TEST_PAUSE() , which sends QS_TEST_PAUSED record to the *test script*. At this point, the *test fixture* enters the event loop, so the initialization RTC finishes and the *test fixture* is now responsive to commands.
- [3] At this point, the *test script* must be explicitily expecting QS_TEST_PAUSE by means of the expect_pause() command.
+ 3 At this point, the *test script* must be explicitily expecting QS_TEST_PAUSE by means of the expect_pause() command.
> **NOTE:** The best place to put expect_pause() is the on_reset() callback function, which should be defined in *test scripts* corresponding to *test fixtures* that call QS_TEST_PAUSE().
- [4] The on_reset() callack can now execute commands that are processed **immediately** in the *test fixture*.
+ 4 The on_reset() callack can now execute commands that are processed **immediately** in the *test fixture*.
- [5] Eventually the on_reset() callback releases the *test fixture* from the pause by executing the continue_test() command. This command sends QS_RX_TEST_CONTINUE to the *test fixture*.
+ 5 Eventually the on_reset() callback releases the *test fixture* from the pause by executing the continue_test() command. This command sends QS_RX_TEST_CONTINUE to the *test fixture*.
- [6] Upon reception of QS_RX_TEST_CONTINUE, the *test fixture* continues the initialization in another RTC step.
+ 6 Upon reception of QS_RX_TEST_CONTINUE, the *test fixture* continues the initialization in another RTC step.
- [7] The on_reset() callback ends and the test script sends QS_RX_TEST_SETUP to the Target.
+ 7 The on_reset() callback ends and the test script sends QS_RX_TEST_SETUP to the Target.
- [8] The test proceeds as before.
+ 8 The test proceeds as before.
@@ -276,22 +379,22 @@ The following sequence diagram shows the details of this process. The explanatio
![NORESET Test](qutest_noreset.gif)
- [0] The *test fixture* is done processing commands from any previous test(s) and is running an event loop.
+ 0 The *test fixture* is done processing commands from any previous test(s) and is running an event loop.
- [1] The *test script* executes the @ref test() "test(..., NORESET)" command.
+ 1 The *test script* executes the @ref test() "test(..., NORESET)" command.
- [2] The @ref test() "test(..., NORESET)" command sends QS_RX_TEST_SETUP command to the *test fixture*.
+ 2 The @ref test() "test(..., NORESET)" command sends QS_RX_TEST_SETUP command to the *test fixture*.
- [3] The *test fixture* processes QS_RX_TEST_SETUP immediately, because it is running event loop.
+ 3 The *test fixture* processes QS_RX_TEST_SETUP immediately, because it is running event loop.
- [4] The *test fixture* responds with Trg-Ack QS_RX_TEST_SETUP.
+ 4 The *test fixture* responds with Trg-Ack QS_RX_TEST_SETUP.
- [5] Upon reception of Trg-Ack QS_RX_TEST_SETUP, the *test script* attempts to execute the on_setup() callback. If on_setup() is defined in the script, it runs at this time.
+ 5 Upon reception of Trg-Ack QS_RX_TEST_SETUP, the *test script* attempts to execute the on_setup() callback. If on_setup() is defined in the script, it runs at this time.
> **NOTE**: The main purpose of the on_setup() callback is to consume any output generated from the QS_onTestSetup() callback in the test fixture invoked in the next step [6].
- [6] The *test fixture* calls the QS_onTestSetup() callback function in the Target.
+ 6 The *test fixture* calls the QS_onTestSetup() callback function in the Target.
- [7] The *test script* proceeds with commands defined after the test() command. Processing of these commands is explained in sections @ref qutest_simple and @ref qutest_complex.
+ 7 The *test script* proceeds with commands defined after the test() command. Processing of these commands is explained in sections @ref qutest_simple and @ref qutest_complex.
@@ -334,40 +437,39 @@ Simple *test script* commands do not produce any output from the Target, except
![Simple command processing](qutest_simple.gif)
- [1] A *test script* sends a `` to the *test fixture*.
+ 1 A *test script* sends a `` to the *test fixture*.
- [2] The *test fixture* receives the command and immediately starts processing it.
+ 2 The *test fixture* receives the command and immediately starts processing it.
- [3] Processing of a command triggers an RTC step and produces only the "Trg-Ack " (acknowledgement of the specific ``).
+ 3 Processing of a command triggers an RTC step and produces only the "Trg-Ack " (acknowledgement of the specific ``).
- [4] Immediately after sending the ``, the *test script* enters an implicit expect state, in which it waits for the "Trg-Ack " output from the Target. The processing of the `` ends when the next output received from the Target matches exactly the expected output.
+ 4 Immediately after sending the ``, the *test script* enters an implicit expect state, in which it waits for the "Trg-Ack " output from the Target. The processing of the `` ends when the next output received from the Target matches exactly the expected output.
-
@section qutest_complex Complex Commands
Complex *test script* commands might produce some output from the Target, not just the "Trg-Ack" (acknowledgement). Examples of `` include dispatch(), post() and tick(),
![Complex command processing](qutest_complex.gif)
- [1] A *test script* sends a `` to the *test fixture*.
+ 1 A *test script* sends a `` to the *test fixture*.
- [2] The *test fixture* receives the command and immediately starts processing it.
+ 2 The *test fixture* receives the command and immediately starts processing it.
- [3] Processing of a command triggers an RTC step and produces only the "Trg-Ack " (acknowledgement of the specific ``).
+ 3 Processing of a command triggers an RTC step and produces only the "Trg-Ack " (acknowledgement of the specific ``).
- [4] The `` must be followed in the *test script* by the explicit expect() commands that concume any ouptu produced by the command.
+ 4 The `` must be followed in the *test script* by the explicit expect() commands that concume any ouptu produced by the command.
- [5-6] The *test fixture* produces some output.
+ 5-6 The *test fixture* produces some output.
- [7] Each such ouput is consumed by the matching expect() command.
+ 7 Each such ouput is consumed by the matching expect() command.
- [8] The *test fixture* sends additional QS record "Trg-Done ", which explicitly delimits the output from this parricualr command.
+ 8 The *test fixture* sends additional QS record "Trg-Done ", which explicitly delimits the output from this parricualr command.
- [8] The *test script* must consume the "Trg-Done " record by an explicit expect() command.
+ 8 The *test script* must consume the "Trg-Done " record by an explicit expect() command.
diff --git a/doxygen/qutest_ref.dox b/doxygen/qutest_ref.dox
index bce6194..347638b 100644
--- a/doxygen/qutest_ref.dox
+++ b/doxygen/qutest_ref.dox
@@ -78,24 +78,22 @@ Once the the test-probe variable is defined and initialized, it can be tested wi
A QUTest *test script* contains a group of related tests (a *test group*). The basic job of these tests is to send commands to the @ref qutest_fixture "test fixture" running in the Target and to compare the @ref qspy_text "QSPY textual output" produced by the Target with the expectations of the tests.
-The QUTest *test scripts* are executed in the host by the "QUTest front-end" that communicates with the @ref qspy "QSPY" host application via the @ref qspy_udp "UDP interface". The "QUTest front-end" is itself implemented in [Python ](https://www.python.org/) (both Python 2+ and Python 3+ can be used).
+The QUTest *test scripts* are executed in the host by the "QUTest front-end" that communicates with the @ref qspy "QSPY" host application via the @ref qspy_udp "UDP interface". The "QUTest front-end" is itself implemented in [Python ](https://www.python.org/) (Python 3.3+).
-![](logo_python27-python3.gif)
+![](logo_python3.gif)
-@section qutest_run Running the Test Scripts
+@section qutest_script-run Running the Test Scripts
@note
-To run any test script(s), you first need to make sure that the @ref qspy "QSPY" console application (version 6.x or higher) is running with the @ref qspy_command "-u option"
-(the -u option opens up the UDP socket for attaching "front-ends"). Once QSPY is running, you can "attach" to the UDP socket and start
-communicating with the QSPY back-end or to the Target (through QSPY).
+To run any test script(s), you first need to make sure that the @ref qspy "QSPY" console application (version 6.x or higher) is running. Once QSPY is running, you can "attach" to the UDP socket and start communicating with the QSPY back-end or to the Target (through QSPY).
The Python test scripts are executed by the Python module qtools/qspy/py/qutest.py , with the following usage:
@verbatim
-python qutest.py [-x] [test-scripts] [host_exe] [qspy_host[:udp_port]] [qspy_tcp_port]
+python3 qutest.py [-x] [test-scripts] [host_exe] [qspy_host[:udp_port]] [qspy_tcp_port]
@endverbatim
where:@n
@@ -123,26 +121,26 @@ where:@n
Usage examples (for Windows):
@verbatim
-python %QTOOLS%\qspy\py\qutest.py
-python %QTOOLS%\qspy\py\qutest.py *.py
-python %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe
-python %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe 192.168.1.100:7705
-python %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe localhost:7701 6605
-python %QTOOLS%\qspy\py\qutest.py *.py DEBUG
-python %QTOOLS%\qspy\py\qutest.py *.py DEBUG localhost:7701 6605
+python3 %QTOOLS%\qspy\py\qutest.py
+python3 %QTOOLS%\qspy\py\qutest.py *.py
+python3 %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe
+python3 %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe 192.168.1.100:7705
+python3 %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe localhost:7701 6605
+python3 %QTOOLS%\qspy\py\qutest.py *.py DEBUG
+python3 %QTOOLS%\qspy\py\qutest.py *.py DEBUG localhost:7701 6605
@endverbatim
Usage examples (for Linux/MacOS):
@verbatim
-python $(QTOOLS)/qspy/py/qutest.py
-python $(QTOOLS)/qspy/py/qutest.py *.py
-python $(QTOOLS)/qspy/py/qutest.py *.py build/dpp
-python $(QTOOLS)/qspy/py/qutest.py *.py build/dpp 192.168.1.100:7705
-python $(QTOOLS)/qspy/py/qutest.py *.py build/dpp localhost:7701 6605
-python $(QTOOLS)/qspy/py/qutest.py *.py DEBUG
-python $(QTOOLS)/qspy/py/qutest.py *.py DEBUG localhost:7701 6605
+python3 $(QTOOLS)/qspy/py/qutest.py
+python3 $(QTOOLS)/qspy/py/qutest.py *.py
+python3 $(QTOOLS)/qspy/py/qutest.py *.py build/dpp
+python3 $(QTOOLS)/qspy/py/qutest.py *.py build/dpp 192.168.1.100:7705
+python3 $(QTOOLS)/qspy/py/qutest.py *.py build/dpp localhost:7701 6605
+python3 $(QTOOLS)/qspy/py/qutest.py *.py DEBUG
+python3 $(QTOOLS)/qspy/py/qutest.py *.py DEBUG localhost:7701 6605
@endverbatim
@@ -197,16 +195,16 @@ To write effective *test scripts* you need to understand the main categories of
![Categories of QSPY output](qspy_cat.png)
- [0] Information output generated internally by QSPY. This output is *not* sent to *test scripts*.
+ 0 Information output generated internally by QSPY. This output is *not* sent to *test scripts*.
- [1] Dictionary trace records generated by the Target. This output is *not* forwarded to *test scripts*.
+ 1 Dictionary trace records generated by the Target. This output is *not* forwarded to *test scripts*.
- [2] Acknowledgement trace records generated by the Target. This output *is* forwarded to *test scripts*, but is checked automatically and implicitly by the *test commands*.
+ 2 Acknowledgement trace records generated by the Target. This output *is* forwarded to *test scripts*, but is checked automatically and implicitly by the *test commands*.
- [3] Trace records generated by the Target. This output *is* forwarded to *test scripts* and must be checked **explicitly** by test expectations.
+ 3 Trace records generated by the Target. This output *is* forwarded to *test scripts* and must be checked **explicitly** by test expectations.
-@next{qspyview}
+@next{qview}
*/
diff --git a/doxygen/qutest_tut.dox b/doxygen/qutest_tut.dox
index adeddc8..19e5a8d 100644
--- a/doxygen/qutest_tut.dox
+++ b/doxygen/qutest_tut.dox
@@ -31,8 +31,7 @@ This Tutorial consists of the following lessons:
@remark
This simple example runs QUTest tests on the host (Windows, Linux, or MacOS) for both Unity and QUTest. The QUTest version also runs on embedded boards (TivaC LaunchPad from Texas Instruments and EFM32 Pearl-Gecko board from Silicon Labs). The instructions for building and running the code on the embedded boards are located at the end of this lesson.
@n
-![](platforms.png)
-
+@image html platforms.png
@section qutest_unity-cut Code Under Test (CUT)
@@ -61,7 +60,7 @@ The provided `Makefile` will also work on Linux and MacOS. The only difference f
This will build the @ref qutest_unity-fixture "test fixture" as a host executable and then it will run it. The screen shot below shows the output produced from the make command.
-![Unity example_1 test build and run with Unity](unity_basic_unity.png)
+@image html unity_basic_unity.png "Unity example_1 test build and run with Unity"
@remark
@@ -73,10 +72,10 @@ As you can see, two out of five Unity tests **fail**. This is intentional, becau
The complete code for the basic Unity example is provided in the QP/C framework, directory `C:\qp\qpc\examples\qutest\unity_basic\test` . To run the basic test (on Windows), open a command prompt and type:
@verbatim
-qspy -u -t
+qspy
@endverbatim
-This will start the @ref qspy "QSPY host utility" with the UDP socket (`-u` @ref qspy_command "option") and TCP/IP connection to the Target (`-t` @ref qspy_command "option").
+This will start the @ref qspy "QSPY host utility" with the TCP/IP connection to the Target.
Next, open a **second** command prompt window and type:
@@ -91,7 +90,8 @@ The provided `Makefile` will also work on Linux and MacOS. The only difference f
This will build the @ref qutest_unity-fixture "test fixture" as a host executable and then it will run the @ref qutest_unity-script "test script" (in Python). The screen shot below shows the output produced in these two command-prompt windows.
-![Unity example_1 test build and run with QUTest (left) and QSPY output (right).](unity_basic_qutest.png)
+@image html unity_basic_qutest.png "Unity example_1 test build and run with QUTest (left) and QSPY output (right)."
+
@remark
As you can see, two out of five QUTest tests **fail**. These are the same tests (adapted for QUTest) that failed during testing with Unity above.
@@ -198,57 +198,57 @@ The following listing shows the complete QUTest *test fixture* for the basic tes
- [1] The `"qpc.h"` header file contains the [QP/C framework](https://www.state-machine.com/qpc/) API, which includes the QUTest interface. Typically, you need to include this header file in QUTest test doubles.
+ 1 The `"qpc.h"` header file contains the [QP/C framework](https://www.state-machine.com/qpc/) API, which includes the QUTest interface. Typically, you need to include this header file in QUTest test doubles.
> **NOTE:** for test fixtures based on the [QP/C++ framework](https://www.state-machine.com/qpcpp/), you need to include the `"qpcpp.h"` header file.
- [2] You also need to include the interface to the CUT, which is `ProductionCode.h` in this case.
+ 2 You also need to include the interface to the CUT, which is `ProductionCode.h` in this case.
- [3] The macro `Q_DEFINE_THIS_FILE` is needed for DbC assertions (they have nothing to do with test assertions ). Later in this file, a DbC assertion is used to guard against failure in the initialization of the @ref qs "QS" target-resident component (see step [7]).
+ 3 The macro `Q_DEFINE_THIS_FILE` is needed for DbC assertions (they have nothing to do with test assertions ). Later in this file, a DbC assertion is used to guard against failure in the initialization of the @ref qs "QS" target-resident component (see step [7]).
- [4] The variable `Counter` is used to control the return value from the CUT (see @ref qutest_tut_basic-cut "ProductionCode.c" line 4).
+ 4 The variable `Counter` is used to control the return value from the CUT (see @ref qutest_tut_basic-cut "ProductionCode.c" line 4).
> NOTE: this approach breaks encapsulation of the CUT, but it is copied here from the original Unity test.
- [5] A QUTest *test fixture* code needs the `main()` function. This `main()` function can be in a separate file, but in this simple example it is placed in `test_ProductionCode.c`. Either way, the `main()` function has the usual structure of a QP/C application (and in fact in the more advanced tests it can be *the same* function as used by the actual QP/C application). But here, it contains the bare minimum function calls, as described below.
+ 5 A QUTest *test fixture* code needs the `main()` function. This `main()` function can be in a separate file, but in this simple example it is placed in `test_ProductionCode.c`. Either way, the `main()` function has the usual structure of a QP/C application (and in fact in the more advanced tests it can be *the same* function as used by the actual QP/C application). But here, it contains the bare minimum function calls, as described below.
- [6] The `main()` function must start with calling `QF_init()` to initialize the QP framework.
+ 6 The `main()` function must start with calling `QF_init()` to initialize the QP framework.
- [7] Next, you need to initialize the @ref qs "QS" target-resident component (QS_INIT()). This macro is wrapped with the Q_ALLEGE() assertion, which will fire if the QS initialization fails. (In which case continuationon of the test makes no sense).
+ 7 Next, you need to initialize the @ref qs "QS" target-resident component (QS_INIT()). This macro is wrapped with the Q_ALLEGE() assertion, which will fire if the QS initialization fails. (In which case continuationon of the test makes no sense).
- [8-10] Next, you produce @ref qs_dict "QS dictionaries" for all functions you wish to test as well as objects you might need to inspect.
+ 8-10 Next, you produce @ref qs_dict "QS dictionaries" for all functions you wish to test as well as objects you might need to inspect.
> NOTE: you need to do this, so that the test scripts can refer to the functions and objects by the same symbolic names as the CUT/test-fixture.
- [11] The QS_FILTER_ON() macro sets the @ref qs_global "global filter" in the Target. Here all output is enabled (::QS_ALL_RECORDS).
+ 11 The QS_FILTER_ON() macro sets the @ref qs_global "global filter" in the Target. Here all output is enabled (::QS_ALL_RECORDS).
- [12] Finally, at the end of `main()` you need to call `QF_run()` to run the tests.
+ 12 Finally, at the end of `main()` you need to call `QF_run()` to run the tests.
- [13] The callback function `QS_onTestSetup()` allows you to include code that will be run at the beginning of each test. Here this simple CUT does not need any setup, but you still need to provide (an empty) implementation to satisfy the linker.
+ 13 The callback function `QS_onTestSetup()` allows you to include code that will be run at the beginning of each test. Here this simple CUT does not need any setup, but you still need to provide (an empty) implementation to satisfy the linker.
- [14] The callback function `QS_onTestTeardown()` allows you to include code that will be run at the end of each test. Here this simple CUT does not need any teardown, but you still need to provide (an empty) implementation to satisfy the linker.
+ 14 The callback function `QS_onTestTeardown()` allows you to include code that will be run at the end of each test. Here this simple CUT does not need any teardown, but you still need to provide (an empty) implementation to satisfy the linker.
- [15] The callback function `QS_onCommand()` allows you to remotely execute commands inside the Target. Here is where you execute the CUT and report results back to QSPY.
+ 15 The callback function `QS_onCommand()` allows you to remotely execute commands inside the Target. Here is where you execute the CUT and report results back to QSPY.
- [16] The command with `cmdId==0` will be used to call the `FindFunction_WhichIsBroken()` CUT.
+ 16 The command with `cmdId==0` will be used to call the `FindFunction_WhichIsBroken()` CUT.
> NOTE: You can use other `cmdId`s to call other pieces of CUT or to provide different variants of calling the same CUT, as you see fit. Much of the art of writing *test fixtures* lies in constructing flexible remote commands that exercise your CUT.
- [17] The `QS_BEGIN()` macro starts the @ref qs_app "application-specific" trace record that will report results of calling the `FindFunction_WhichIsBroken()` CUT to the test script.
+ 17 The `QS_BEGIN()` macro starts the @ref qs_app "application-specific" trace record that will report results of calling the `FindFunction_WhichIsBroken()` CUT to the test script.
- [18] The `QS_FUN()` macro sends the address of the function to the test script. This address will be converted to the name of the function, because the dictionary for this function has been generated in setp 8.
+ 18 The `QS_FUN()` macro sends the address of the function to the test script. This address will be converted to the name of the function, because the dictionary for this function has been generated in setp 8.
- [19] The `QS_I32()` macro sends a 32-bit signed integer (`int32_t`) to the test script. Here you output the return value from `FindFunction_WhichIsBroken()`.
+ 19 The `QS_I32()` macro sends a 32-bit signed integer (`int32_t`) to the test script. Here you output the return value from `FindFunction_WhichIsBroken()`.
- [20] The `QS_I16()` macro sends a 16-bit signed integer (`int16_t`) to the test script. Here you output the argument passed to `FindFunction_WhichIsBroken()`.
+ 20 The `QS_I16()` macro sends a 16-bit signed integer (`int16_t`) to the test script. Here you output the argument passed to `FindFunction_WhichIsBroken()`.
- [21] The `QS_END()` macro ends the @ref qs_app "application-specific" trace record.
+ 21 The `QS_END()` macro ends the @ref qs_app "application-specific" trace record.
@n
- [22] The command with `cmdId==1` will be used to call the `FunctionWhichReturnsLocalVariable()` CUT.
+ 22 The command with `cmdId==1` will be used to call the `FunctionWhichReturnsLocalVariable()` CUT.
- [23-26] Again, the @ref qs_app "application-specific" trace record gets generated that reports the function address and the return value from this function call.
+ 23-26 Again, the @ref qs_app "application-specific" trace record gets generated that reports the function address and the return value from this function call.
@n
- [27] The `QS_onTestEvt()` callback function is not used in this test, but needs to be provided to satisfy the linker.
+ 27 The `QS_onTestEvt()` callback function is not used in this test, but needs to be provided to satisfy the linker.
- [28] The `QS_onTestPost()` callback function is not used in this test, but needs to be provided to satisfy the linker.
+ 28 The `QS_onTestPost()` callback function is not used in this test, but needs to be provided to satisfy the linker.
@@ -308,30 +308,30 @@ The following test script performs the same tests as the Unity test fixture
- [1] Lines starting with a pound sign ('#') or empty lines are comments which are ignored by QUTest.
+ 1 Lines starting with a pound sign ('#') or empty lines are comments which are ignored by QUTest.
@@ -339,11 +339,11 @@ The following test script performs the same tests as the Unity test fixture "preamble"
defines the startup code common to all tests in the group:
- [2] The function on_setup() is executed at the beginning of each test in the group (see test()), including both tests that reset and do not reset the Target.
+ 2 The function on_setup() is executed at the beginning of each test in the group (see test()), including both tests that reset and do not reset the Target.
- [3] The current_obj() command sets the "current object" of the application-specific kind (`OBJ_AP`) in the Target. Subsequent commands (such as poke() in the next step) will act on this "current object".
+ 3 The current_obj() command sets the "current object" of the application-specific kind (`OBJ_AP`) in the Target. Subsequent commands (such as poke() in the next step) will act on this "current object".
- [4] The poke() command pokes the specified "Application Current Object" starting with the specified offset from the beginning of the object in memory (here 0) with the data elements of size 4 (the second argument) with the data provided in the third argument `pack()` "pack("4 The poke() command pokes the specified "Application Current Object" starting with the specified offset from the beginning of the object in memory (here 0) with the data elements of size 4 (the second argument) with the data provided in the third argument `pack()` "pack("
@@ -351,20 +351,20 @@ The following test script performs the same tests as the Unity test fixture Test: "FindFunction_WhichIsBroken() Should Return Zero..." checks that the CUT returns 0 when a given number is not found:
- [5] The test() command starts a test and gives it a name (in double quotes). The name of test will be displayed as the test is executed and should be a quick reminder about the objective of this test. This test command also @ref qutest_reset "resets the Target", which brings the Target into a well-defined initial state and produces the @ref qs_dict "QS dictionary records" (see @ref qutest_unity-fixture "test-fixture"[12])
+ 5 The test() command starts a test and gives it a name (in double quotes). The name of test will be displayed as the test is executed and should be a quick reminder about the objective of this test. This test command also @ref qutest_reset "resets the Target", which brings the Target into a well-defined initial state and produces the @ref qs_dict "QS dictionary records" (see @ref qutest_unity-fixture "test-fixture"[12])
> NOTE: The ability to perform the full Target reset is a unique feature of QUTest. Other unit testing frameworks, including Unity and CppUTest, don't reset the Target. They merely call the test `setup()/tearDown()` functions at the beginning and end of the test, respectively. QUTest also calls `onReset()/onSetup()/onTeardown()`, but obviously the full Target reset is a much better guarantee that the Target starts in exactly the same state.
- [6] The command() command causes the invocation of the `QS_onCommand()` callback inside the Target. The argument 0 is the `cmdId` parameter (see @ref qutest_unity-fixture "test-fixture"[16])
+ 6 The command() command causes the invocation of the `QS_onCommand()` callback inside the Target. The argument 0 is the `cmdId` parameter (see @ref qutest_unity-fixture "test-fixture"[16])
> **NOTE:** The first parameter of command() "command" here is just a number (0), but it is also possible to use a **symbolic name** for the first parameter. This symbolic name will be looked up in the user dictionary (QS_USR_DICTIONARY())
- [7] The expect() command represents an expectation of this test (a.k.a. test assertion ). This is the expected output generated by the `command(0)` command from the previous step. You need to consult the test fixture to determine what you should expect in this case.
+ 7 The expect() command represents an expectation of this test (a.k.a. test assertion ). This is the expected output generated by the `command(0)` command from the previous step. You need to consult the test fixture to determine what you should expect in this case.
> NOTE: the expected string starts with a number `0000000001`, which is the @ref qs_tstamp "Target Time-Stamp". In QUTest, the "timestamp" simply counts all the QS trace records produced, so that you know that no entries have been lost. In the later tests you will see how you can count the steps automatically with the `@timestamp` placeholder.
- [8] The test finishes with the expectation for the `Trg-Done QS_RX_COMMAND` trace record, which means that all output generated by command() has been generated.
+ 8 The test finishes with the expectation for the `Trg-Done QS_RX_COMMAND` trace record, which means that all output generated by command() has been generated.
- [9] This expect() command illustrate the use of the `@timestamp` placeholder to account for the test steps automatically .
+ 9 This expect() command illustrate the use of the `@timestamp` placeholder to account for the test steps automatically .
- [10] This command() illustrates how to pass **negative numbers** as arguments. As you can see, you need to binary-and the number with the all-bits-on bitmask `0xFFFFFFFF`.
+ 10 This command() illustrates how to pass **negative numbers** as arguments. As you can see, you need to binary-and the number with the all-bits-on bitmask `0xFFFFFFFF`.
@@ -372,11 +372,11 @@ The following test script performs the same tests as the Unity test fixture Test: "FindFunction_WhichIsBroken() Should Return The Index..." checks that the CUT fails to return the expected index, because of the internal bug:
- [11] The test() command starts a next test.
+ 11 The test() command starts a next test.
- [12] This `command(0, 34)` should cause the function `FindFunction_WhichIsBroken()` to return index `1`, because the number `34` is actually in the list.
+ 12 This `command(0, 34)` should cause the function `FindFunction_WhichIsBroken()` to return index `1`, because the number `34` is actually in the list.
- [13] This expect() command codifies the expected result of the function call.
+ 13 This expect() command codifies the expected result of the function call.
> NOTE: Due to the bug in the CUT, however, the expectation will fail, in which case the rest of the test is skipped until the **next** test() command.
@@ -385,19 +385,22 @@ The following test script performs the same tests as the Unity test fixture Test: "FunctionWhichReturnsLocalVariable() Should Return The Current Counter Value":
- [14] The test() command starts a next test.
+ 14 The test() command starts a next test.
- [15] This `command(1)` runs the second function `FunctionWhichReturnsLocalVariable()` in the CUT.
+ 15 This `command(1)` runs the second function `FunctionWhichReturnsLocalVariable()` in the CUT.
- [16] This poke() command changes the value of the `Counter` variable, because this is the "current AP object" established in the on_setup() callback in step [3].
+ 16 This poke() command changes the value of the `Counter` variable, because this is the "current AP object" established in the on_setup() callback in step [3].
+@attention
+The unusually long function name `FunctionWhichReturnsLocalVariable` has been **truncated** in the test expectations to `FunctionWhichReturnsLocalVariab`. This is because the QSPY host application limits the @ref qs_dict "QS dictionaries" to the **first 31 characters** only. Please keep this limit in mind when choosing various names in your application.
+
Test: "FunctionWhichReturnsLocalVariable() Should Return The Current Counter..." checks whether `FunctionWhichReturnsLocalVariable()` CUT returns the value poked into the `Counter` variable:
- [17] The test() command starts a next test.
+ 17 The test() command starts a next test.
> NOTE: Unlike all previous tests so far, this test does **not** reset the Target (argument @ref qutest_reset "NORESET")
@@ -411,17 +414,17 @@ As an exercise you should modify the file `ProductionCode.c` to fix the bug and
@section qutest_unity-embed Running the Test on Embedded Targets
As mentioned at the initial description of this example, the directory `C:\qp\qpc\examples\qutest\unity_basic\test` contains makefiles to build the code and run the tests on the embedded boards (TivaC LaunchPad from Texas Instruments and EFM32 Pearl-Gecko board from Silicon Labs). Both these boards open a virtual COM port on the machine they are attached to via the USB cable. This virtual COM port provides an ideal connection for the @ref qs "QS communication" with the @ref qspy "QSPY host utility".
-![Targets for running QUTests. From the left: host computer, TivaC LaunchPad and EFM32 Pearl-Gecko](platforms.png)
+@image html platforms.png "Targets for running QUTests. From the left: host computer, TivaC LaunchPad and EFM32 Pearl-Gecko"
For example, to test the EFM32 Pearl-Gecko board (ARM Cortex-M4), open a command prompt (on Windows) and type:
@verbatim
-qspy -u -c COM6
+qspy -c COM6
@endverbatim
-This will start the QSPY host utility with the UDP socket (-u option) and serial connection to the embedded board. Of course, you need to adjust the serial port number to the actual number of the virtual COM port on your machine.
+This will start the QSPY host utility with com-port connection to the embedded board. Of course, you need to adjust the serial port number to the actual number of the virtual COM port on your machine.
Next, open a **second** command prompt window and type:
@@ -461,7 +464,7 @@ Since the @ref qutest_mock-cut "CUT" is in C, the Mock Unity example is only ava
@n
This example runs QUTest tests on the host (Windows, Linux, or MacOS) for both Unity and QUTest. The QUTest version also runs on embedded boards (TivaC LaunchPad from Texas Instruments and EFM32 Pearl-Gecko board from Silicon Labs). The instructions for building and running the code on the embedded boards are located at the end of this lesson.
@n
-![](platforms.png)
+@image html platforms.png
@@ -469,33 +472,33 @@ This example runs QUTest tests on the host (Windows, Linux, or MacOS) for both U
The CUT in this example implements a simple bar of 5 LEDs that display percentage, as shown in the animation below. The "LedBar device" interacts with the discrete LEDs by turning them on and off, to achieve the desired effect. The main objective of this example is to demonstrate how to verify the **collaboration** with the discrete LEDs, even without the actual hardware.
-![Bar of 5 LEDs displaying the percentage.](ledbar5.gif)
+@image html ledbar5.gif "Bar of 5 LEDs displaying the percentage."
+
The LedBar CUT is located in the file `LedBar.c` in the directory `qpc\examples\qutest\unity_mock\src` . The CUT consists of just one function `LedBar_setPercent()`, which turns the individual LEDs on and off such that they display the desired `percent` parameter. The function `LedBar_setPercent()` returns the total power consumption (in microwatts) of all LEDs that are turned on.
@anchor qutest_tut_mock-cut
@includelineno LedBar.c
-file LedBar.c
+@caption{file LedBar.c}
+
The low-level interface to the LEDs is defined below (`Led.h` ). The individual LEDs are selected by an `index` parameter. Each individual LED can be turned on by means of the `LED_on()` function. The `LED_on()` function returns a value, which corresponds to power consumption of this LED while on. The LED can be turned off by the `LED_off()` function, which returns `void`.
@includelineno Led.h
-file Led.c
+@caption{file Led.c}
The diagram below shows the relationships between the CUT and the test code: Unity case on the left and QUTest case on the right. In both cases, the `LedBar` CUT interacts with the hardware through the `Led.h` interface. The explanation section below the diagram clarifies the interesting elements of the diagram.
-![Components of the Unity Mock test: Unity left and QUTest right](qutest_mock.gif)
-
-
+@image html qutest_mock.gif "Components of the Unity Mock test: Unity left and QUTest right"
Center: Code Under Test
- [1] The `LedBar.c` file contains the @ref qutest_mock-cut "Code Under Test (CUT)".
+ 1 The `LedBar.c` file contains the @ref qutest_mock-cut "Code Under Test (CUT)".
- [2] The CUT interacts with the hardware through the `Led.h` interface. This interface abstracts the LEDs and is all that the CUT needs to "know" about the hardware.
+ 2 The CUT interacts with the hardware through the `Led.h` interface. This interface abstracts the LEDs and is all that the CUT needs to "know" about the hardware.
@@ -505,11 +508,11 @@ The diagram below shows the relationships between the CUT and the test code: Uni
Left: Unity testing framework (traditional approach)
- [3] The `TestLedBar.c` file implements the Unity test fixture, which calls the CUT and verifies that it performs as expected.
+ 3 The `TestLedBar.c` file implements the Unity test fixture, which calls the CUT and verifies that it performs as expected.
> NOTE: A Unity test fixture for a mock requires a special "test runner", which initializes and cleans up after the mock. This "test runner" must typically be generated automatically, as it is too complex to code manually.
- [4]
+ 4
The Unity test fixture uses the `MockLed.c` implementation of the `Led.h` interface. The mock object implemented in `MockLed.c` needs to be "programmed" for each expected scenario **before** calling the CUT. Thus the structure of conventional tests with a mock is "backwards", meaning that you first specify the expectations and the test ends with a call to the CUT.
> NOTE: This mock-object must typically be generated automatically, as it is too complex to code manually. Here, the mock- object was generated by means of the CMock tool .
@@ -520,20 +523,19 @@ The Unity test fixture uses the `MockLed.c` implementation of the `Led.h` interf
Right: QUTest testing framework (simplified approach)
-
- [5] The `test_LedBar.c` file implements the @ref qutest_mock-fixture "QUTest test fixture", which calls the CUT, but it does **NOT** check whether it performs as expected.
+ 5
+The `test_LedBar.c` file implements the @ref qutest_mock-fixture "QUTest test fixture", which calls the CUT, but it does **NOT** check whether it performs as expected.
- [6]
+ 6
The QUTest test fixture uses the `spy_Led.c` implementation of the `Led.h` interface. This spy test double is much simpler than mock-object used by Unity, so it can easily be @ref qutest_mock-spy "coded manually".
- [7]
+ 7
The QUTest test is driven by the `test_LedBar.py` @ref qutest_mock-script "test script". This test script sends commands to the `test_LedBar.c` fixture and verifies the generated output against the expectations of the test.
-
@section qutest_mock-run0 Running the Test with Unity
The complete code for the mock Unity example is provided in the QP/C framework, directory `C:\qp\qpc\examples\qutest\unity_mock\test_unity` . To run the mock Unity test (on Windows), open a command-prompt and type:
@verbatim
@@ -547,7 +549,7 @@ The provided `Makefile` will also work on Linux and MacOS. The only difference f
This will build the @ref qutest_mock-fixture "test fixture" as a host executable and then it will run it. The screen shot below shows the output produced from the make command.
-![Unity mock test build and run with Unity](unity_mock_unity.png)
+@image html unity_mock_unity.png "Unity mock test build and run with Unity"
@@ -555,10 +557,10 @@ This will build the @ref qutest_mock-fixture "test fixture" as a host executable
The complete code for the mock Unity example is provided in the QP/C framework, directory `C:\qp\qpc\examples\qutest\unity_mock\test` . To run the mock test (on Windows), open a command prompt and type:
@verbatim
-qspy -u -t
+qspy
@endverbatim
-This will start the @ref qspy "QSPY host utility" with the UDP socket (`-u` @ref qspy_command "option") and TCP/IP connection to the Target (`-t` @ref qspy_command "option").
+This will start the @ref qspy "QSPY host utility" with the TCP/IP connection to the Target.
Next, open a **second** command prompt window and type:
@@ -573,7 +575,7 @@ The provided `Makefile` will also work on Linux and MacOS. The only difference f
This will build the @ref qutest_mock-fixture "test fixture" as a host executable and then it will run the @ref qutest_mock-script "test script" (in Python). The screen shot below shows the output produced in these two command-prompt windows.
-![Unity mock test build and run with QUTest (left) and QSPY output (right).](unity_mock_qutest.png)
+@image html unity_mock_qutest.png "Unity mock test build and run with QUTest (left) and QSPY output (right)."
@@ -632,37 +634,37 @@ The following listing shows the "spy-object" (file `spy
@endcode
- [1] The `"qpc.h"` header file includes the QP/C framework, which contains the QUTest interface. Typically, you need to include this header file in QUTest test doubles.
+ 1 The `"qpc.h"` header file includes the QP/C framework, which contains the QUTest interface. Typically, you need to include this header file in QUTest test doubles.
- [2] The `"Led.h"` header file specifies the interface to the code being impersonated by this "spy-object". The whole purpose of the spy-object is to implement this interface such that the CUT can call use it as its collaborator.
+ 2 The `"Led.h"` header file specifies the interface to the code being impersonated by this "spy-object". The whole purpose of the spy-object is to implement this interface such that the CUT can call use it as its collaborator.
> NOTE: The CUT does not "know" that it is collaborating with a _test double_ (the spy-object in this case).
- [3] This enumeration lists the @ref qs_app "application-specific QS trace records" that will be produced by the fake LED operations. The enumeration starts with #QS_USER1 offset, which is the second group of user-specific records. The first group (#QS_USER0 offset) is used by the main @ref qutest_mock-fixture "test fixture".
+ 3 This enumeration lists the @ref qs_app "application-specific QS trace records" that will be produced by the fake LED operations. The enumeration starts with #QS_USER1 offset, which is the second group of user-specific records. The first group (#QS_USER0 offset) is used by the main @ref qutest_mock-fixture "test fixture".
- [4] The `led_power[]` array contains the default power ratings for the individual LEDs in the LED-bar. These values will be returned from the fake `Led_on()` implementation (if not overridden by the "Test Probe").
+ 4 The `led_power[]` array contains the default power ratings for the individual LEDs in the LED-bar. These values will be returned from the fake `Led_on()` implementation (if not overridden by the "Test Probe").
- [5] The `Led_DICTIONARY()` function produced the dictionaries for the spy-object. This function is not part of the real LED interface (see `Led.h` in the `src` directory), but is needed only for testing.
+ 5 The `Led_DICTIONARY()` function produced the dictionaries for the spy-object. This function is not part of the real LED interface (see `Led.h` in the `src` directory), but is needed only for testing.
- [6] This is a fake `Led_off()` implementation, which generates an @ref qs_app "application-specific QS trace record" to report the call and the parameter to QSPY.
+ 6 This is a fake `Led_off()` implementation, which generates an @ref qs_app "application-specific QS trace record" to report the call and the parameter to QSPY.
- [7] This is a fake `Led_on()` implementation.
+ 7 This is a fake `Led_on()` implementation.
- [8] The `ret` variable will be the power rating for this LED returned from this function. The variable is initialized from the `led_power[]` array, which contains the default power rating for the LEDs.
+ 8 The `ret` variable will be the power rating for this LED returned from this function. The variable is initialized from the `led_power[]` array, which contains the default power rating for the LEDs.
- [9] The macro `QS_TEST_PROBE_DEF()` defines a @ref qutest_fixture-probe "Test Probe" for this function (notice the @c &Led_on function-pointer parameter). This Test Probe retreives a value set for this function from the test-script. (If no value has been set, the `QS_TEST_PROBE_DEF()` retreives value 0).
+ 9 The macro `QS_TEST_PROBE_DEF()` defines a @ref qutest_fixture-probe "Test Probe" for this function (notice the @c &Led_on function-pointer parameter). This Test Probe retreives a value set for this function from the test-script. (If no value has been set, the `QS_TEST_PROBE_DEF()` retreives value 0).
- [10] The `QS_TEST_PROBE()` macro executes the enclosed snipped of code only if the Test Probe (defined at label [9]) is not zero.
+ 10 The `QS_TEST_PROBE()` macro executes the enclosed snipped of code only if the Test Probe (defined at label [9]) is not zero.
- [11] If the Test Probe is not zero (it has been set from the test script), the `ret` value is updated from the value of the Test Probe `qs_tp_`.
+ 11 If the Test Probe is not zero (it has been set from the test script), the `ret` value is updated from the value of the Test Probe `qs_tp_`.
> NOTE: this demonstrates how to program a **return value** in a spy-object. This corresponds directly to the same capability of traditional mock-objects.
> NOTE: Test Probe is just one way in which a pre-programmed value can be returned from a fake function. This option is illustrated in @ref qutest_mock-script25 "test script [25]". Another way in QUTest is to use the poke() test command to alter the values in the `led_power[]` array. This option is illustrated in @ref qutest_mock-script21 "test script [21]"
- [12] An @ref qs_app "application-specific QS trace record" is generated to report the call, the parameter, and the return value to QSPY.
+ 12 An @ref qs_app "application-specific QS trace record" is generated to report the call, the parameter, and the return value to QSPY.
- [13] The `ret` value is returned to the caller (CUT).
+ 13 The `ret` value is returned to the caller (CUT).
@@ -750,24 +752,24 @@ The following listing shows the test fixture for the LedBar tests (file
- [1] The `"qpc.h"` header file includes the [QP/C framework](https://www.state-machine.com/qpc/), which contains the QUTest interface. Typically, you need to include this header file in QUTest test doubles.
+ 1 The `"qpc.h"` header file includes the [QP/C framework](https://www.state-machine.com/qpc/), which contains the QUTest interface. Typically, you need to include this header file in QUTest test doubles.
> **NOTE:** for test fixtures based on the [QP/C++ framework](https://www.state-machine.com/qpcpp/), you need to include the `"qpcpp.h"` header file.
- [2] The `"LedBar.h"` header file specifies the interface to the CUT.
+ 2 The `"LedBar.h"` header file specifies the interface to the CUT.
- [3] The `Led_DICTIONARY()` function prototype is declared directly in the test fixture. This is the only extension from the `"Led.h"` interface implemented in the @ref qutest_mock-spy "spy-object".
+ 3 The `Led_DICTIONARY()` function prototype is declared directly in the test fixture. This is the only extension from the `"Led.h"` interface implemented in the @ref qutest_mock-spy "spy-object".
- [4] As usual the `main()` funciton of the test fixture initialzies the QF framework.
+ 4 As usual the `main()` funciton of the test fixture initialzies the QF framework.
- [5] As usual the `main()` funciton of the test fixture initalizes the QS software tracing.
+ 5 As usual the `main()` funciton of the test fixture initalizes the QS software tracing.
- [6] The call to the `Led_DICTIONARY()` funciton outputs the @ref qs_dict "QS dictionaries" for the @ref qutest_mock-spy "spy-object".
+ 6 The call to the `Led_DICTIONARY()` funciton outputs the @ref qs_dict "QS dictionaries" for the @ref qutest_mock-spy "spy-object".
- [7] The @ref qs_dict "QS dictionary" for the `LedBar_setPercentn()` CUT is produced as well.
+ 7 The @ref qs_dict "QS dictionary" for the `LedBar_setPercentn()` CUT is produced as well.
- [8] The @ref qs_global "QS global filter" is set up to output all QS records.
+ 8 The @ref qs_global "QS global filter" is set up to output all QS records.
- [9] The `QF_run()` funciton enters the event loop to wait for commands from the @ref qutest_mock-script "test script".
+ 9 The `QF_run()` funciton enters the event loop to wait for commands from the @ref qutest_mock-script "test script".
@@ -852,7 +854,7 @@ The following test script performs the same tests as the `TestLedBar.c` Unity te
@endcode
- [1] The preamble is empty, because no special actionas are needed on reset/setup/teardown.
+ 1 The preamble is empty, because no special actionas are needed on reset/setup/teardown.
@@ -860,15 +862,15 @@ The following test script performs the same tests as the `TestLedBar.c` Unity te
Test: "LedBar 0% all off" checks that that all LEDs are turned off to display 0%
- [2] The test() command starts the test
+ 2 The test() command starts the test
- [3] The @ref command() "command(0, 0)" calls the `LedBar_setPercent()` CUT with the 0 percent argument.
+ 3 The @ref command() "command(0, 0)" calls the `LedBar_setPercent()` CUT with the 0 percent argument.
- [4] This expect() command verifies the output produced by calling the `LED_off()` function from the spy-object.
+ 4 This expect() command verifies the output produced by calling the `LED_off()` function from the spy-object.
- [5] This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is zero.
+ 5 This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is zero.
- [6] This expect() command verifies that all output from the origianl @ref command() "command(0, 0)" has been produced.
+ 6 This expect() command verifies that all output from the origianl @ref command() "command(0, 0)" has been produced.
@@ -876,13 +878,13 @@ The following test script performs the same tests as the `TestLedBar.c` Unity te
Test: "LedBar 100% all on" checks that that all LEDs are turned on to display 100%
- [8] The test() command starts the test
+ 8 The test() command starts the test
- [9] The @ref command() "command(0, 100)" calls the `LedBar_setPercent()` CUT with the 100 percent argument.
+ 9 The @ref command() "command(0, 100)" calls the `LedBar_setPercent()` CUT with the 100 percent argument.
- [10] This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 70.
+ 10 This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 70.
- [11] This expect() command verifies that all output from the origianl @ref command() "command(0, 100)" has been produced.
+ 11 This expect() command verifies that all output from the origianl @ref command() "command(0, 100)" has been produced.
@@ -890,13 +892,13 @@ The following test script performs the same tests as the `TestLedBar.c` Unity te
Test: "LedBar 19% all off" checks that that all LEDs are turned off to display 19%
- [12] The test() command starts the test (NOTE: this is a NORESET test)
+ 12 The test() command starts the test (NOTE: this is a NORESET test)
- [13] The @ref command() "command(0, 19)" calls the `LedBar_setPercent()` CUT with the 19 percent argument.
+ 13 The @ref command() "command(0, 19)" calls the `LedBar_setPercent()` CUT with the 19 percent argument.
- [14] This expect() command verifies the output produced by calling the `LED_off()` function from the spy-object.
+ 14 This expect() command verifies the output produced by calling the `LED_off()` function from the spy-object.
- [15] This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 0.
+ 15 This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 0.
@@ -904,11 +906,11 @@ The following test script performs the same tests as the `TestLedBar.c` Unity te
Test: "LedBar 20% one on" checks that that all LEDs are turned off to display 20%
- [16] The test() command starts the test (NOTE: this is a NORESET test)
+ 16 The test() command starts the test (NOTE: this is a NORESET test)
- [17] The @ref command() "command(0, 20)" calls the `LedBar_setPercent()` CUT with the 20 percent argument.
+ 17 The @ref command() "command(0, 20)" calls the `LedBar_setPercent()` CUT with the 20 percent argument.
- [18] This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 10.
+ 18 This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 10.
@@ -916,17 +918,17 @@ The following test script performs the same tests as the `TestLedBar.c` Unity te
Test: "LedBar 50% two on" checks that that two LEDs is turned on to display 50%
- [19] The test() command starts the test (NOTE: this is a NORESET test)
+ 19 The test() command starts the test (NOTE: this is a NORESET test)
- [20] The @ref current_obj() "current_obj(OBJ_AP, "led_power")" command sets the "current application object" to "led_power" (see @ref qutest_mock-spy "spy-object"[4]).
+ 20 The @ref current_obj() "current_obj(OBJ_AP, "led_power")" command sets the "current application object" to "led_power" (see @ref qutest_mock-spy "spy-object"[4]).
- [21]
+ 21]
@anchor qutest_mock-script21
The @ref poke() "poke(0, 4, pack("
- [22] The @ref command() "command(0, 50)" calls the `LedBar_setPercent()` CUT with the 50 percent argument.
+ 22 The @ref command() "command(0, 50)" calls the `LedBar_setPercent()` CUT with the 50 percent argument.
- [23] This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 40, which is due to poking the data into the `led_power` array.
+ 23 This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 40, which is due to poking the data into the `led_power` array.
@@ -934,25 +936,25 @@ The following test script performs the same tests as the `TestLedBar.c` Unity te
Test: "LedBar 99% two on" checks that that two LEDs is turned on to display 99%
- [24] The test() command starts the test (NOTE: this is a NORESET test)
+ 24 The test() command starts the test (NOTE: this is a NORESET test)
- [25]
+ 25]
@anchor qutest_mock-script25
The @ref probe() "probe("Led_on", 17)" command sends the @ref qutest_fixture-probe "test-probe" value 17 for function `Led_on`
- [26] The @ref probe() "probe("Led_on", 13)" command sends another the @ref qutest_fixture-probe "test-probe" value 13 for function `Led_on`
+ 26 The @ref probe() "probe("Led_on", 13)" command sends another the @ref qutest_fixture-probe "test-probe" value 13 for function `Led_on`
- [27] The @ref command() "command(0, 99)" calls the `LedBar_setPercent()` CUT with the 99 percent argument.
+ 27 The @ref command() "command(0, 99)" calls the `LedBar_setPercent()` CUT with the 99 percent argument.
- [28] This expect() command verifies the test-probe sent at step [25] has been retreived.
+ 28 This expect() command verifies the test-probe sent at step [25] has been retreived.
- [29] This expect() command verifies the function `Led_on` has been called, and that it returned 17.
+ 29 This expect() command verifies the function `Led_on` has been called, and that it returned 17.
- [30] This expect() command verifies the test-probe sent at step [26] has been retreived.
+ 30 This expect() command verifies the test-probe sent at step [26] has been retreived.
- [31] This expect() command verifies the function `Led_on` has been called, and that it returned 13.
+ 31 This expect() command verifies the function `Led_on` has been called, and that it returned 13.
- [32] This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 60, which is due to using test-probes to alter the return values returned from `Led_on()`.
+ 32 This expect() command verifies the output produced by calling the `LedBar_setPercent()` function from the CUT. Note that the returned total power consumption is 60, which is due to using test-probes to alter the return values returned from `Led_on()`.
@@ -985,7 +987,7 @@ This example is available in both [QP/C ](https://www.state-machine.com/qp
The hierarchical state machine used in this example is artificial, but it has been specifically designed to contain all possible state transition topologies for up to 4 levels of state nesting. The code representing this state machine (the CUT here), has been generated automatically by the [QM modeling tool](https://www.state-machine.com/qm/) from the model shown in the screen-shot below:
-![QHsmTst state machine in QM](qhsmtst_qm.png)
+@image html qhsmtst_qm.png "QHsmTst state machine in QM"
The state machine executes actions on every entry/exit to states, on state transitions and on internal state transitions. These actions are all implemented by calling the `BSP_display()` function that outputs a succinct message about the location of the action within the state machine. For example, the entry action to state "s2" calls `BSP_display("s2-ENTRY;")` and the exit action from state "s2" calls `BSP_display("s2-EXIT;")`. These actions then are used for @ref qutest_qhsm-funct-script "functional testing" of the state machine.
@@ -995,10 +997,10 @@ The state machine executes actions on every entry/exit to states, on state trans
To run the `qhsm` tests (on Windows), open a command prompt and type:
@verbatim
-qspy -u -t
+qspy
@endverbatim
-This will start the @ref qspy "QSPY" host application with the UDP socket (`-u` @ref qspy_command "option") and TCP/IP connection to the Target (`-t` @ref qspy_command "option").
+This will start the @ref qspy "QSPY" host application with the TCP/IP connection to the Target.
Next, open another command prompt window and type:
@@ -1009,7 +1011,7 @@ make
This will build the @ref qutest_qhsm-fixture "test fixture" as a Windows executable and then it will run the @ref qutest_qhsm-funct-script "test script". The screen shot below shows the output produced in these two command-prompt windows.
-![QUTest QHsm test run](test_qhsm.png)
+@image html test_qhsm.png "QUTest QHsm test run"
@@ -1095,16 +1097,16 @@ The following listing shows the test fixture for the QHsm tests (file
- [1] The `BSP_DISPLAY` enumeration will be used as the record-ID for the @ref qs_app "application-specific trace record".
+ 1 The `BSP_DISPLAY` enumeration will be used as the record-ID for the @ref qs_app "application-specific trace record".
> **NOTE:** The record-ID is offset by #QS_USER.
- [2] This line produces a @ref qs_dict "function dictionary" for the [QHsm_top() function](https://www.state-machine.com/qpc/qep_8h.html#ac8ae4728dfab5ce26a907fc624f6e104).
+ 2 This line produces a @ref qs_dict "function dictionary" for the [QHsm_top() function](https://www.state-machine.com/qpc/qep_8h.html#ac8ae4728dfab5ce26a907fc624f6e104).
- [3] This line produces a @ref qs_dict "object dictionary" for the `l_hsm` state machine object to test.
+ 3 This line produces a @ref qs_dict "object dictionary" for the `l_hsm` state machine object to test.
- [4] This line produces a @ref qs_dict "user dictionary" for the application-specific trace record defined at label [1].
+ 4 This line produces a @ref qs_dict "user dictionary" for the application-specific trace record defined at label [1].
- [5] The "constructor" of the state machine object is called.
+ 5 The "constructor" of the state machine object is called.
> **NOTE:** The explicit "constructor" call is needed only in C. In C++ static constructors are called automatically as part of the startup sequence.
@@ -1116,11 +1118,11 @@ The following listing shows the test fixture for the QHsm tests (file
- [6] The function `BSP_display()` is called from all actions of the state machine. Inside the test fixture, this function is defined to produce QS output. This is a classic example of a "spy" test double.
+ 6 The function `BSP_display()` is called from all actions of the state machine. Inside the test fixture, this function is defined to produce QS output. This is a classic example of a "spy" test double.
- [7] The QS output is produced with an @ref qs_app "application-specific trace record" enumerated at label [1]. The second argument to the QS_BEGIN() macro is zero, which means that this record does not use any @ref qs_local "local filter".
+ 7 The QS output is produced with an @ref qs_app "application-specific trace record" enumerated at label [1]. The second argument to the QS_BEGIN() macro is zero, which means that this record does not use any @ref qs_local "local filter".
- [8] The QS_STR() data element outputs the message string.
+ 8 The QS_STR() data element outputs the message string.
@@ -1172,11 +1174,11 @@ The following listing shows the *test script* for the QHsm tests (file
- [1] The script procedure `on_reset()` is executed after each reset of the target. This is in contrast to the procedure `on_setup()`, which is executed at the begin of all tests, including tests that don't reset the target.
+ 1 The script procedure `on_reset()` is executed after each reset of the target. This is in contrast to the procedure `on_setup()`, which is executed at the begin of all tests, including tests that don't reset the target.
- [2] The @ref qs_global "global filter" is set to `GRP_UA`, which means «group-user-all » trace records. This filter setting determines the character of the test to be a **functional** test, because the focus is on the trace records produced by actions (@ref qs_app "user-defined" records) rather than the @ref qs_pre "pre-defined records" generated by executing a state machine.
+ 2 The @ref qs_global "global filter" is set to `GRP_UA`, which means «group-user-all » trace records. This filter setting determines the character of the test to be a **functional** test, because the focus is on the trace records produced by actions (@ref qs_app "user-defined" records) rather than the @ref qs_pre "pre-defined records" generated by executing a state machine.
- [3] The command current_obj() sets the current state machine object to `"the_hsm"`. Because this is performed in the on_reset() callack, this current object will be set before every test (except the NORESET-tests, which do not call on_reset()).
+ 3 The command current_obj() sets the current state machine object to `"the_hsm"`. Because this is performed in the on_reset() callack, this current object will be set before every test (except the NORESET-tests, which do not call on_reset()).
@@ -1184,11 +1186,11 @@ The following listing shows the *test script* for the QHsm tests (file Test: "QHsmTst init" tests the top-most initial transition
- [4] The test() command starts the test.
+ 4 The test() command starts the test.
- [5] The init() command triggers the initial transition in the current state-machine object (see label [3]).
+ 5 The init() command triggers the initial transition in the current state-machine object (see label [3]).
- [6] The following expect() commands verify that all steps of the top-most initial transition are taken in the right order.
+ 6 The following expect() commands verify that all steps of the top-most initial transition are taken in the right order.
@@ -1196,13 +1198,13 @@ The following listing shows the *test script* for the QHsm tests (file Test: "QHsmTst dispatch" tests dispatching various events to the state machine
- [7] The test() command starts the test.
+ 7 The test() command starts the test.
- [8] The dispatch() command dispatches a given event to the state machine
+ 8 The dispatch() command dispatches a given event to the state machine
- [9] The expect() commands verify that the state machine **actions** (`BSP_display()` function) happened.
+ 9 The expect() commands verify that the state machine **actions** (`BSP_display()` function) happened.
- [10] This expect() command verifies that the processing of the event (see dispatch() at label [8]) has completed.
+ 10 This expect() command verifies that the processing of the event (see dispatch() at label [8]) has completed.
@@ -1255,11 +1257,11 @@ The following listing shows the *test script* for the QHsm tests (file
- [1] The script procedure `on_reset()` is executed after each reset of the target. This is in contrast to the procedure `on_setup()`, which is executed at the begin of all tests, including tests that don't reset the target.
+ 1 The script procedure `on_reset()` is executed after each reset of the target. This is in contrast to the procedure `on_setup()`, which is executed at the begin of all tests, including tests that don't reset the target.
- [2] The @ref qs_global "global filter" is set to `GRP_SM`, which means «group-state-machine » trace records. This filter setting determines the character of the test to be a **structural** test, because the focus is on the @ref qs_pre "pre-defined records" generated by executing a state machine, rather than trace records produced by actions (user trace records).
+ 2 The @ref qs_global "global filter" is set to `GRP_SM`, which means «group-state-machine » trace records. This filter setting determines the character of the test to be a **structural** test, because the focus is on the @ref qs_pre "pre-defined records" generated by executing a state machine, rather than trace records produced by actions (user trace records).
- [3] The command current_obj() sets the current state machine object to `"the_hsm"`. Because this is performed in the on_reset() callack, this current object will be set before every test (except the NORESET-tests, which do not call on_reset()).
+ 3 The command current_obj() sets the current state machine object to `"the_hsm"`. Because this is performed in the on_reset() callack, this current object will be set before every test (except the NORESET-tests, which do not call on_reset()).
@@ -1267,11 +1269,11 @@ The following listing shows the *test script* for the QHsm tests (file Test: "QHsmTst init" tests the top-most initial transition
- [4] The test() command starts the test.
+ 4 The test() command starts the test.
- [5] The init() command triggers the initial transition in the current state-machine object (see label [3]).
+ 5 The init() command triggers the initial transition in the current state-machine object (see label [3]).
- [6] The following expect() commands verify that all steps of the top-most initial transition are taken in the right order.
+ 6 The following expect() commands verify that all steps of the top-most initial transition are taken in the right order.
@@ -1279,13 +1281,13 @@ The following listing shows the *test script* for the QHsm tests (file Test: "QHsmTst dispatch" tests dispatching various events to the state machine
- [7] The test() command starts the test.
+ 7 The test() command starts the test.
- [8] The dispatch() command dispatches a given event to the state machine
+ 8 The dispatch() command dispatches a given event to the state machine
- [9] The expect() commands verify that the state machine RTC (Run-To-Completion) steps have been executed.
+ 9 The expect() commands verify that the state machine RTC (Run-To-Completion) steps have been executed.
- [10] This expect() command verifies that the processing of the event (see dispatch() at label [8]) has completed.
+ 10 This expect() command verifies that the processing of the event (see dispatch() at label [8]) has completed.
@@ -1306,7 +1308,7 @@ The following listing shows the *test script* for the QHsm tests (file QP/C](https://www.state-machine.com/qpc) as well as in [QP/C++ ](https://www.state-machine.com/qpcpp) frameworks. The complete code for the Blinky example is provided in the directory `\examples\qutest\blinky\test` .
-![Blinky model in QM.](qutest_blinky_qm.png)
+@image html qutest_blinky_qm.png "Blinky model in QM."
@@ -1314,10 +1316,10 @@ This example is available in both [QP/C ](https://www.state-machine.com/qp
To run the `Blinky` test (on Windows), open a command prompt and type:
@verbatim
-qspy -u -t
+qspy
@endverbatim
-This will start the @ref qspy "QSPY host utility" with the UDP socket (`-u` @ref qspy_command "option") and TCP/IP connection to the Target (`-t` @ref qspy_command "option").
+This will start the @ref qspy "QSPY host utility" with the TCP/IP connection to the Target.
Next, open a **second** command prompt window and type:
@@ -1332,7 +1334,7 @@ The provided `Makefile` will also work on Linux and MacOS. The only difference f
This will build the @ref qutest_fixture "test fixture" as a host executable and then it will run the @ref qutest_script "test script" (in Python). The screen shot below shows the output produced in these two command-prompt windows.
-![Blinky test build and run with QUTest (left) and QSPY output (right).](test_blinky.png)
+@image html test_blinky.png "Blinky test build and run with QUTest (left) and QSPY output (right)."
@@ -1358,10 +1360,10 @@ This example is available in both [QP/C ](https://www.state-machine.com/qp
To run the DPP test (on Windows), open a command prompt and type:
@verbatim
-qspy -u -t
+qspy
@endverbatim
-This will start the @ref qspy "QSPY host utility" with the UDP socket (`-u` @ref qspy_command "option") and TCP/IP connection to the Target (`-t` @ref qspy_command "option").
+This will start the @ref qspy "QSPY host utility" with the TCP/IP connection to the Target.
Next, open a **second** command prompt window and type:
@@ -1376,7 +1378,7 @@ The provided `Makefile` will also work on Linux and MacOS. The only difference f
This will build the @ref qutest_fixture "test fixture" as a host executable and then it will run the @ref qutest_script "test script" (in Python). The screen shot below shows the output produced in these two command-prompt windows.
-![DPP test build and run with QUTest (left) and QSPY output (right).](test_dpp.png)
+@image html test_dpp.png "DPP test build and run with QUTest (left) and QSPY output (right)."
@next{qutest_rtc}
diff --git a/doxygen/qview.dox b/doxygen/qview.dox
new file mode 100644
index 0000000..90d57a9
--- /dev/null
+++ b/doxygen/qview.dox
@@ -0,0 +1,695 @@
+/*! @page qview QView™ Visualization & Monitoring
+
+![](qview_banner.jpg)
+
+@subpage qview_ui " "
+@subpage qview_cust " "
+
+
+@section qview_about About QView™
+
+@htmlonly
+
+@endhtmlonly
+
+QView™ is a powerful **Visualization and Monitoring** facility, which allows embedded developers to rapidly create **remote graphical user-interfaces** to monitor and control their embedded devices from a host (desktop) computer. The interfaces created by QView™ can visualize the tracing data produced by QP/Spy™ and can also **interact with the target** by sending commands and injecting events to the embedded target.
+
+
+As you can see in the screen shots below, a QView™ user interface consists of the text box with extensible menus plus a **customizable canvas** that can serve as a remote graphical user-interface to your embedded device. The canvas can contain various "widgets", such as buttons, sliders, guages, graphs, animations etc. The actual functionality of the _virtual GUI_ obviously depends on the target system and the embedded code it is running. Therefore, the QView™ provides only a skeleton, which is then @ref qview_cust "customized" by user-supplied scripts written in Python (version 3).
+
+
+
+@image html qview_ex.gif "Example of a QView™ session on an embedded board (Windows host)"
+
+@n
+@image html qview_dpp-fedora.gif "Example of a QView™ session (Linux host)"
+
+
+@subsection qview_special What's Special About It?
+
+QView™ has been specifically designed for extensibility, so that you can quickly @ref qview_cust "customize its GUI and behavior" to your specific embedded project, so that you can use QView™ as a powerful custom Human-Machine Interface (HMI) for your projects. The cusomization is accomplished in Python (version 3), which means that it is naturally platform-neutral and runs without any changes on Windows, Linux, or macOS.
+
+Out of the box, QView™ supports the following @ref qview_ui "commands" (NOTE: This basic functionality can be extended in the @ref qview_cust "QView™ customization"):
+
+- Set @ref qs_global "global QS filters" inside the Target
+- Set @ref qs_local "local QS filters" inside the Target
+- Inject an arbitrary event to the Target (direct post or publish)
+- Execute a user-defined command function inside the Target with arguments supplied from QView™
+- Peek data inside the Target and send to QView™
+- Poke data (supplied from QView™) into the Target
+- Execute clock tick inside the Target
+- Remotely reset the Target
+
+@note
+A visualization and monitoring system like QView™ can be used in all stages of development, manufacturing, and after the deployment, for in-field servicing of embedded devices.
+
+
+
+@section qview_struct QView™ Structure
+The sequence diagram below shows the general structure of QView™. The embedded Target is running an instrumented code that communicates with the @ref qspy "QSPY Host application" over the @ref qspy_link "Target data link" (red arrows ). This communication is based on the @ref qpspy_proto "QP/Spy Protocol".
+
+@attention
+The Target must be running the "Spy" build configuration, in which the @ref qpspy is enabled. Additionally, the QP/Spy implementation in the Target must support the @ref qpspy_rx "bi-directional" communication with @ref qspy "QSPY".
+
+
+The QView™ (Python script) attaches to the QSPY host application by means of the @ref qspy_udp "UDP socket" that QSPY opens specifically for attaching various "front-ends". This communication (blue arrows ) uses the same packet structure as the @ref qpspy_proto "QP/Spy Protocol", but without the HDLC framing, without transparency (escaping), and without the checksum.
+
+
+@image html qspy_qview.gif "Communication between Target, QSPY, and QView"
+
+
+ A A Target produces QS trace records, which the @ref qspy "QSPY Back-End" forwards to the @ref qpspy_udp "UDP Socket", so that any attached Front-End (such as QView™) receives all this data.
+
+
+ B The Front-End (QView™) sends commands as @ref qpspy_udp "UDP packets to QSPY". For some of those packets, the @ref qspy "QSPY Back-End" supplies additional information (e.g., translation between symbolic names and binary addresses according to the @ref qs_dict "QS dictionaries" collected from the Target).
+
+
+ C The @ref qspy "QSPY Back-End" then forwards the modified packets to the Target.
+
+
+
+
+@remark
+Why UDP? The @ref qspy_udp "communication between QSPY and QView" is based on UDP, because UDP is inherently packet-oriented (as opposed to TCP, which is stream-oriented) and preserves the packet boundaries .
+
+
+
+@section qview_use Installation & Use
+The qview.py script can be used standalone, without any installation in your Python system (see @ref qview_run below).
+
+@note
+The qview.py script is included in the @ref qtools_about "QTools™ collection". Also, the @ref qtools_win "QTools™ collection for Windows" already includes Python (3.8), so you don't need to install anything extra.
+
+
+Alternatively, you can use *your own Python** installation, into which you can install the latest QView™ with `pip` from the [PyPi index ](https://pypi.org/project/qview/) by executing the following command:
+
+@verbatim
+pip install qview
+@endverbatim
+
+
+@subsection qview_run Running QView™
+If you are using QView™ as a standalone Python script, you invoke it as follows:
+
+@verbatim
+python3 /qview.py [ [ []]]
+@endverbatim
+
+Alternatively, if you've installed QView™ with `pip`, you invoke it as follows:
+
+@verbatim
+qview [cust_script] [qspy_host[:udp_port]] [local_port]
+@endverbatim
+
+
+
+@subsection qview_command Command-line Options
+
+- `cust_script` - optional @ref qview_cust "customization Python script" for your specific target system. If not specified, qview will provide only the @ref qview_ui "generic user interface" for interacting with the target (e.g., reset, setting QS filters, posting events, etc.)
+
+- `qspy_host[:udp_port]` - optional host-name/IP-address:port for the host running the QSPY host utility. If not specified, the default is 'localhost:7701'.
+
+- `local_port` - optional the local UDP port to be used by "qview". If not specified, the default is '0', which means that the operating system will choose an open port.
+
+
+@subsection qview_exa Examples
+
+Windows Hosts
+
+@verbatim
+python3 %QTOOLS%\qview\qview.py
+@endverbatim
+
+opens the generic (not customized) "qview".
+
+@verbatim
+python3 %QTOOLS%\qview\qview.py dpp.py
+@endverbatim
+
+opens "qview" with the customization provided in the dpp.py script located in the current directory.
+
+@verbatim
+qview ..\qview\dpp.py localhost:7701
+@endverbatim
+
+opens "qview" (**installed with pip**) with the customization provided in the dpp.py script located in the directory ..\qview. The "qview" will attach to the QSPY utility running at localhost:7701.
+
+@verbatim
+qview dpp.py 192.168.1.100:7705
+@endverbatim
+
+opens "qview" (**installed with pip**) with the customization provided in the dpp.py script located in the current directory. The "qview" will attach to the QSPY utility running remotely at IP address 192.168.1.100:7705.
+
+
+Linux/MacOS Hosts
+
+@verbatim
+python3 $(QTOOLS)/qview/qview.py
+@endverbatim
+
+opens the generic (not customized) "qview".
+
+@verbatim
+python3 $(QTOOLS)/qview/qview.py dpp.py
+@endverbatim
+
+opens "qview" with the customization provided in the dpp.py script located in the current directory.
+
+@verbatim
+qview *.py ../qview/dpp.py localhost:7701
+@endverbatim
+
+opens "qview" (**installed with pip**) with the customization provided in the dpp.py script located in the directory ../qview. The "qview" will attach to the QSPY utility running at localhost:7701.
+
+@verbatim
+qview dpp.py 192.168.1.100:7705
+@endverbatim
+
+opens "qview" (**installed with pip**) with the customization provided in the dpp.py script located in the current directory. The "qview" will attach to the QSPY utility running remotely at IP address 192.168.1.100:7705.
+
+
+@note
+In practice, the easiest way to launch QView™ is to define a shortcut , like the one provided with the DPP example:@n@n
+@image html qview_shortcut.gif "qview shortcut properties"
+
+
+
+@section qview_attaching Attaching QView to QSPY
+In contrast to TCP, which is stream-oriented, UDP is packet-oriented, so the only way to "attach" two ends of communication is to exchange packets. Consequently, immediately after QView™ is launched, it tries to **attach** by sending the @ref udp_ATTACH "ATTACH" packet to QSPY. If QSPY responds with the @ref udp_in_ATTACH "ATTACH" response, QView™ considers that it is "attached".
+
+However, if the @ref udp_in_ATTACH "ATTACH" response does not arrive within a second or two (because perhaps QSPY is not running), QView™ opens a modal dialog box that reminds you to run QSPY, as shown in the screen-shot below:
+
+@image html qview_attach.gif "Attach to QSPY dialog box"
+qview_before.gif
+Depending how you start @ref qspy "QSPY", the dialog box might close automatically, which means that QView has successfully **attached** to QSPY. However, if the dialog box does not close, you need to click the **Attach** button to send @ref udp_ATTACH "ATTACH" packet to QSPY, until QView™ receives the @ref udp_in_ATTACH "ATTACH" response from QSPY. If you can't "attach", you can click the **Close** button to close QView™.
+
+@note
+Because UDP works over networks, the QSPY Back-End can run on a **different machine** (e.g., a lab computer) that the the QView™ Front-End (e.g., office computer). These two machines can even run different operating systems, for example Linux on the lab computer and Windows in the office, or vice versa. All you need to do is to provide the host-name parameter as the third command-line argument to the qview.py script (e.g., `python3 qview.py dpp.py 192.168.1.101`).
+
+
+@subsection qview_tstamp Recognizing the Target
+Before QView™ can correctly interpret any data from the Target, it needs to obtain certain information about the Target, such as the sizes of object pointers, function pointers, event signals, etc. This information is provided in the ::QS_TARGET_INFO trace record coming from the Target.
+
+To inform you about the Target status, QView™ displays the **Target: UNKNOWN** in the status bar when the target is "unknown":
+
+@image html qview_unknown.gif "Target UNKNOWN status"
+
+If this happens, you can explicitly request the Target information by means of the "Commands->Query Target Info" menu:
+
+@image html qview_known.gif "Target KNOWN status (build time-stamp)"
+
+After the Target information is received, the QView™ status bar shows the build time-stamp of the Target image.
+
+@next{qview_ui}
+*/
+/*###########################################################################*/
+/**
+@page qview_ui QView User Interface
+
+The qview.py script provides a Graphical User Interface (GUI) consisting of the main menu, the text view, the status bar, and the customizable canvas view.
+
+
+@image html qview.jpg "QView user interface"
+
+The **main menu** includes several useful commands, which are quickly reviewed and the following sections. The main menu might subsequently be augmented in your own @ref qview_cust "customizations".
+
+
+
+@section qview_file File Menu
+The File menu provides interface to the @ref qspy_saving "QSPY saving files" feature. This menu allows you to trigger QSPY to save @ref qspy_dict "dictionaries", as well as to open/close all other file formats supported by QSPY.
+
+@image html qview_file.gif
+
+
+
+@section qview_view View Menu
+The View menu allows you to toggle (show/hide) the Canvas view.
+
+@image html qview_view.gif "Text-view and Canvas-view menus"
+
+@image html qview_canvas.gif "Canvas-view enabled"
+
+@note
+The provided screen shot of the Canvas-view is specific to the DPP example application (see @ref qview_cust).
+
+
+
+@section qview_glob Global Filters Menu
+The Filters menu opens dialog boxes through which you can set the @ref qspy_filters "QSPY global filters" for QS record types.
+
+The Global Filter menu opens dialog boxes for each *group* of global filters. For example, the screen shot below shows the "SM Group" (State Machine Group). In this "SM Group" dialog box you can check/uncheck the individual filters, or you can "Select ALL" or "Clear ALL" filters in the group.
+
+@image html qview_glob_dlg.gif "Global Filter SM-Group Dialog Box"
+
+
+@note
+The Global-Filters menu reflects the status of the whole group by the following status-indicators:
+- `[-]`- no filters in the group selected
+- `[+-]` - some filters in the group selected
+- `[+]` - all filters in the group selected
+
+
+
+@section qview_loc Local Filters Menu
+The Filters menu opens dialog boxes through which you can set the @ref qspy_filters "QSPY filters".
+
+The Local Filter menu opens dialog boxes for each local filter object. For example, the screen shot below shows the "AO_OBJ" (Active Object filter). In this "Local Filter" dialog box you can specify the object either by its name (must match the QS dictionary), or as addresses of the objects in decimal and in hexadecimal (with the `0x` prefix).
+
+@image html qview_loc_dlg.gif "Local Filter AO_OBJ Dialog Box"
+
+@note
+The Local-Filters menu reflects the selected local filters, which are listed to the right of the filter (e.g. `Philo_inst[0].timeEvt`).
+
+
+
+@section qview_curr Current-Obj Menu
+The Curr-Obj menu opens dialog boxes through which you can set the @ref qs_curr "QS Current Objects".
+
+The Curr-Obj menu opens dialog boxes for each local current object. For example, the screen shot below shows the "AO_OBJ" (current Active Object). In this "Curr-Obj" dialog box you can specify the object either by its name (must match the QS dictionary), or as addresses of the objects in decimal and in hexadecimal (with the `0x` prefix).
+
+@image html qview_curr_dlg.gif "Current Object AO_OBJ Dialog Box"
+
+@note
+The Curr-Obj menu reflects the selected current objects, which are listed to the right of the filter (e.g. `Table_inst`).
+
+
+@section qview_commands Commands Menu
+The Commands menu allows you to execute simple commands (without parameters) in the Target, such as Reset the Target, Query the Target, and clock Tick at rate 0 and rate 1. Also, this menu allows you to execute commands with parameters, which are quickly discussed below
+
+@image html qview_cmd.gif "Commands Menu"
+
+
+@subsection qview_user Executing User Command
+The "User Command..." menu allows you to invoke a command in the Target and pass up to three parameters to this command. (**NOTE:** a command is an application-specific callback function that the QS-RX component executes in the Target).
+
+@image html qview_cmd_dlg.gif "Command Dialog Box"
+
+The screen shot above shows how to execute User Command number `0` with the parameters: `12345`, `0xDEADBEEF` and `0` (default). Both the command number and the parameters can be specified in hexadecimal (with the `0x` prefix).
+
+
+@subsection qview_peek Peek Command
+The Peek Obj/Addr... command opens a dialog box, in which you can provide the Target object or address (RAM or ROM) (**NOTE:** You can provide either the object name, which must be known by its object-dictionary, or numerical address, which **must** be a valid RAM/ROM address, or the Target might crash.)
+
+@attention
+The "Peek..." menu requires the "Current-Obj AP_OBJ" to be set in the @ref qview_curr, because this is the object within the Target which will be "peeked". The "Peek..." menu is **inactive** (grayed-out) when the "Current-Obj AP_OBJ" is not specified.
+
+
+@note
+The Peek Command can be used to view any **readable** address, such as ROM, RAM, and also **peripheral registers** in your Target.
+
+
+As shown in the screen shot below, the PEEK command takes additionally the offset into the object [bytes] (offset of 0 is default if not specified), the size of the item [8-bit, 16-bit, 32-bit] and the number of units (n-units) [1..255] you wish to "peek".
+
+@image html qview_cmd_peek.gif "Peek Command Dialog Box"
+@n
+
+The Target responds with a #QS_PEEK_DATA trace record, which you can view in QSPY human-readable output (the packet is also sent to QView, where you can react to it in your @ref qview_cust "customization".)
+
+@verbatim
+4294965703 Trg-Peek Offs=0,Size=4,Num=4,Data=<20000D2C,20000D2C,20000D74,000A0008>
+@endverbatim
+
+
+
+@subsection qview_poke Poke Command
+The "Poke Obj/Addr..." command allows you to write data to the specified object or address in Target's RAM (**NOTE:** You can provide either the object name, which must be known by its object-dictionary, or numerical address, which **must** be a valid RAM address, or the Target might crash.)
+
+@attention
+The "Poke..." menu requires the "Current-Obj AP_OBJ" to be set in the @ref qview_curr, because this is the object within the Target which will be "poked". The "Poke..." menu is **inactive** (grayed-out) when the "Current-Obj AP_OBJ" is not specified.
+
+
+@note
+The Poke Command can be used to change any **writable** address, such as RAM, but also **peripheral registers** in your Target.
+
+
+As shown in the screen shot below, the POKE command takes additionally the offset into the object [bytes], the size of the item [8-bit, 16-bit, 32-bit], and the data to "poke", which can be either decimal or hexadecimal (`0x` prefix).
+
+@image html qview_cmd_poke.gif "Poke Command Dialog Box"
+@n
+
+The Target responds with `Trg-Ack QS_RX_POKE`:
+
+@verbatim
+ Trg-Ack QS_RX_POKE
+@endverbatim
+
+
+@section qview_events Events Menu
+The "Events" menu allows you to Publish, Post, or Dispatch an event to the Target. Additionally, you can also "Initialize" a state machine by triggering the top-most initial transition in it.
+
+@attention
+The "Post..." menu requires the "Current-Obj AO_OBJ" to be set in the @ref qview_curr, because this is the Ative Object within the Target which will be "posted". The "Dispatch..." and "Init SM..." menus require the "Current-Obj SM_OBJ" to be set in the @ref qview_curr, because this is the State Machine within the Target which will be "dispatched" or "initialized". These menus are **inactive** (grayed-out) when the expected "Current-Objects" are not specified.
+
+@image html qview_evt_dlg.gif "Events Menu with Post-Event Dialog Box"
+
+
+As shown in the screen-shot above, you define the custom event by providing the sig (signal), which can be either symbolic name (must correspond to the Signal Dictionary) or a numerical value.
+
+The signal is followed by up to 9 optional event parameters par1..par9. Each parameter is specified as a pair of the size of the parameter [8-bit, 16-bit, 32-bit], and the value of the parameter, which can be either decimal or hexadecimal (`0x` prefix).
+
+@attention
+The parameters are sent using the **endianness** reported by the Target. Also, all the specified parameters are packed in the exact order without any "alignment". If the event structure is represented in the Target memory with some **padding**, you need to provide such padding explicitly (as one of the parameters).
+
+
+@section qview_custom Custom Menu
+This top-level menu is provided for your customization. It's intent is to let you add your own commands in your script.
+
+@image html qview_cust.gif
+
+
+@section qview_help Help Menu
+This menu allows you to access the online Q-SPY help in HTML, and also allows you to open the "About" dialog box.
+
+@image html qview_help.gif
+
+
+@next{qview_cust}
+*/
+/*###########################################################################*/
+/**
+@page qview_cust Customizing & Extending QView™
+
+@tableofcontents
+
+QView™ has been specifically designed for extensibility, so that you can customize its behavior to your specific project. In fact, as mentioned in the section about @ref qview_run "running QView", the qview.py script takes the `` @ref qview_command "command-line parameter", which is another Python script designed specifically to extend and customize the basic functionality. This section describes how to write this @ref qview_script "customization script", so that you can turn QView™ into a powerful remote **Human-Machine Interface** (HMI) for your embedded system.
+
+@remark
+You don't need to change the qview.py script to customize and extend it for your project. The customization you make go into a separate script, which is specific to your project. That way, you can have many different customization scripts and you don't pollute (and possibly break) the original code.
+
+
+@section qview_cust_menu Custom Menu
+The simple way of customizing QView™ is to add **custom menus**.
+
+@image html qview_cust.gif
+
+
+@section qview_canvas Custom Canvas
+The main part of the QView™ interface that you customize for your specific embedded system is the **custom Canvas**. The custom Canvas can show a complete custom Human-Machine Interface (HMI) to your embedded Target. The Canvas can display the changing status of the application and also it can provide **actuators**, like buttons, sliders, etc. to **interact** with the embedded Target. The following animation shows the custom Canvas for the DPP example (dpp.py script explained later). Please note that the button in the center of the screen allows you to interact with the Target by posting events to it. Please refer to this script code for the details of how various effects have been achieved.
+
+@image html qview_canv_dpp.gif "Custom Canvas for the DPP Application"
+
+@n
+@note
+QView™ GUI is based on the [Tkinter ](https://docs.python.org/3/library/tkinter.html) and therefore it is highly recommended that you get familiar with this Python library. Specifically of interest for customizing QView™ is the [Tkinter Canvas ](https://www.tutorialspoint.com/python/tk_canvas.htm).@n
+@n
+Many Python widget libraries (e.g. [tk_tools](https://github.com/slightlynybbled/tk_tools), etc.) are available to aid you in developing your custom canvas. With such widget libraries, you can display the data in an attractive form: as gauges, bars, graphs, and sliders. The attractiveness of the GUI is limited only by your creativity.
+
+
+@section qview_script Customization Script
+The easiest way to customize QView is to copy the provided example script (dpp.py located in /examples/workstation/dpp/qview folder), rename it, and add your own extensions. The explanation section following the listing clarifies the interesting lines of code (lines starting with `[xx]` labels).
+
+@code{py}
+[1] class DPP:
+[2] def __init__(self):
+
+ # request target reset on startup...
+[3] reset_target()
+
+ # add commands to the Custom menu...
+[4] QView.custom_menu.add_command(label="Custom command",
+ command=self.cust_command)
+
+ # configure the custom QView.canvas...
+[5] QView.show_canvas() # make the canvas visible
+[6] QView.canvas.configure(width=400, height=260)
+
+ # tuple of activity images (correspond to self._philo_state)
+[7] self._act_img = (
+[8] PhotoImage(file=HOME_DIR + "/img/thinking.gif"),
+ PhotoImage(file=HOME_DIR + "/img/hungry.gif"),
+ PhotoImage(file=HOME_DIR + "/img/eating.gif"),
+ )
+ # tuple of philo canvas images (correspond to self._philo_obj)
+ self._philo_img = (\
+ QView.canvas.create_image(190, 57, image=self._act_img[0]),
+ QView.canvas.create_image(273, 100, image=self._act_img[0]),
+ QView.canvas.create_image(237, 185, image=self._act_img[0]),
+ QView.canvas.create_image(146, 185, image=self._act_img[0]),
+ QView.canvas.create_image(107, 100, image=self._act_img[0])
+ )
+
+ # button images for UP and DOWN
+ self.img_UP = PhotoImage(file=HOME_DIR + "/img/BTN_UP.gif")
+ self.img_DWN = PhotoImage(file=HOME_DIR + "/img/BTN_DWN.gif")
+
+ # images of a button for pause/serve
+ self.btn = QView.canvas.create_image(200, 120, image=self.img_UP)
+[9] QView.canvas.tag_bind(self.btn, "", self.cust_pause)
+
+
+ # on_reset() callback
+[10] def on_reset(self):
+ # clear the lists
+[11] self._philo_obj = [0, 0, 0, 0, 0]
+ self._philo_state = [0, 0, 0]
+
+ # on_run() callback
+[20] def on_run(self):
+[21] glb_filter("QS_USER_00")
+
+ # NOTE: the names of objects for loc_filter() and current_obj()
+ # must match the QS Object Dictionaries produced by the application.
+[22] current_obj(OBJ_AO, "Table_inst")
+[23] loc_filter(OBJ_TE, "l_philo[0].timeEvt")
+
+ # turn lists into tuples for better performance
+[24] self._philo_obj = tuple(self._philo_obj)
+ self._philo_state = tuple(self._philo_state)
+
+
+ # example of a custom command
+[30] def cust_command(self):
+[31] command(1, 12345)
+
+ # example of a custom interaction with a canvas object (pause/serve)
+[40] def cust_pause(self, event):
+[41] if QView.canvas.itemcget(self.btn, "image") != str(self.img_UP):
+[42] QView.canvas.itemconfig(self.btn, image=self.img_UP)
+[43] post("SERVE_SIG")
+[44] QView.print_text("Table SERVING")
+ else:
+ QView.canvas.itemconfig(self.btn, image=self.img_DWN)
+ post("PAUSE_SIG")
+ QView.print_text("Table PAUSED")
+
+ # intercept the QS_USER_00 application-specific packet
+ # this packet has the following structure (see bsp.c:displayPhilStat()):
+ # record-ID, seq-num, Timestamp, format-byte, Philo-num,
+ # format-bye, Zero-terminated string (status)
+[50] def QS_USER_00(self, packet):
+ # unpack: Timestamp->data[0], Philo-num->data[1], status->data[3]
+[51] data = qunpack("xxTxBxZ", packet)
+ i = data[1]
+ j = ("t", "h", "e").index(data[2][0]) # the first letter
+
+ # animate the given philo image according to its activity
+ QView.canvas.itemconfig(self._philo_img[i], image=self._act_img[j])
+
+ # print a message to the text view
+ QView.print_text("%010d Philo %1d is %s"%(data[0], i, data[2]))
+
+ #=============================================================================
+[60] QView.customize(DPP()) # set the QView customization
+
+@endcode
+
+@subsection qview_cust_init Initialization
+
+
+ 1 Every QView™ customization consists of a Python __class__, which does not extend any other class and can be called with any name you see fit.
+
+ 2 The constructor of your customization class sets up the GUI and optionally resets the target.
+
+ 3 The reset_target() command allows you to remotely reset the embedded Target.
+> **NOTE:** Normally, for an embedded application you would like to start with resetting the Target, to start clean with @ref qs_dict "QS dictionaries", etc. However, if you run your application on the **host** (e.g., `/examples/workstation/dpp`), you typically don't want to reset the target. Instead, you simply launch the host executable *after* opening QView™, so that it will "see" all the QS dictionaries, etc. This alternative is shown in the DPP example for the host located in `/examples/workstation/dpp`).
+
+ 4 The @ref qview.QView.custom_menu "QView.custom_menu" object allows you to extend the @ref qview_custom "Custom Menu" with your own commands. Here, you just add the command "Custom command". Later you will write the function that handles this menu item.
+> **NOTE:** The @ref qview.QView.custom_menu "QView.custom_menu" object uses the [Tkinter Menu interface](https://www.tutorialspoint.com/python/tk_menu.htm)
+
+
+
+
+
+@subsection qview_cust_canvas Setting Up the Canvas
+The Custom Canvas is setup in the **constructor** of the customization clss `__init__(self)`) using the @ref qview.QView.canvas "QView.canvas" object:
+
+
+ 5 The @ref qview.QView.show_canvas() "QView.show_canvas()" function lets you @ref show the canvas from the beginning. This corresponds to setting the Canvas checkbox in the @ref qview_view.
+
+ 6 The @ref qview.QView.canvas "QView.canvas" object can be configured to the desired size using the standard tkinter functionality.
+> **NOTE:** The @ref qview.QView.canvas "QView.canvas" object uses the [Tkinter Canvas interface](https://www.tutorialspoint.com/python/tk_canvas.htm)
+
+ 7-8 You need to organize the GUI elements for the canvas, so that they easily map to your specific customization. Here, the images representing the Dining Philosophers activities and Philosophers themselves sitting around the table are represented as [Python tuples](https://www.tutorialspoint.com/python/python_tuples.htm).
+> **NOTE:** The proper design of the data structures for your application can vastly simplify the customization script. Please remember to take advantage of the rich Python data structures, such as lists, tuples, dictionaries and arrays.
+
+ 9 This line demonstrates how to provide a **keyboard binding** to a canvas element (the center button `self.btn` in this case).
+
+
+
+
+
+@subsection qview_cust_reset The on_reset() Callback
+The main qview.py script calls the on_reset() callback function in your customization script when it receives the @ref #QS_TARGET_INFO "reset packet" from the Target. This gives you an opportunity to clear your internal data structures to get them ready for new data coming from the Target (e.g. @ref qs_dict).
+
+
+ 10 The @ref on_reset() callback must be member of the customization class (note the `self` parameter).
+
+ 11 Here, the callback clears the internal lists used by customization.
+
+
+
+
+
+@subsection qview_cust_run The on_run() Callback
+The main qview.py script calls the on_run() callback function in your customization script when it receives the @ref #QS_QF_RUN trace record from the Target. This record typically marks the end of the Target initialization and, specifically, the completion of the @qs_dict. This gives you an opportunity to set the @ref qs_filters, @ref qs_curr, using their **symbolic names**.
+
+@note
+The **symbolic names** inside the Target are known to QSPY only *after* the Target produces the @ref qs_dict.
+
+
+
+ 20 The @ref on_run() callback must be member of the customization class (note the `self` parameter).
+
+ 21 Here, the callback sets the @ref qs_global "Global Filter" by means of the glb_filter() facility provided in the qview.py script.
+
+ 22 Here, the callback sets the @ref qs_curr "Current Objects" by means of the current_obj() facility provided in the qview.py script.
+
+ 23 Here, the callback sets the @ref qs_local "Local Filter" by means of the loc_filter() facility provided in the qview.py script.
+
+
+
+
+@note
+The glb_filter(), current_obj(), and loc_filter() facilities in QView™ are **identical** as in the @ref qutest "QUTest". This commonality between @ref qview "QView™" and @ref qutest "QUTest™" is intentional.
+
+
+@subsection qview_cust_cmd Custom Commands
+The Custom Command added either to the @ref qview.QView.custom_menu "QView.custom_menu" or attached to the Canvas elements need to be implemented as a member functions of the customization class:
+
+
+ 30 The function name must match the `command=self.cust_command` parameter in the `menu.add_command()` (see step [4] of the script)
+
+ 31 Here, the function invokes the command() facility provided in the qview.py script.
+
+
+
+ 40 The function name must match the `...tag_bind(... self.cust_pause)` parameter (see step [9] of the script)
+
+ 41 Here, the function **checks the Canvas elements** (using the standard Tkinter functionality).
+
+ 42 Here, the function **configures the Canvas elements** (using the standard Tkinter functionality).
+
+ 43 Here, the function **posts an event** to the Target by means of the post() facility provided in the qview.py script.
+
+ 43 Here, the function **prints text** to the @ref qview_ui "Text View" by means of the @ref qview.QView.print_text() "QView.print_text()" facility provided in the qview.py script.
+
+
+
+
+@note
+The command() and post() facilities in QView™ are **identical** as in the @ref qutest "QUTest". This commonality between @ref qview "QView™" and @ref qutest "QUTest™" is intentional.
+
+
+@subsection qview_cust_handler Custom Packet Handlers
+The most important feature of QView™ is that it can display the **live** status of the embedded system. QView™ achieves it by receiving the QS software tracing packets from the Target. Consequently, one of the most important activities of the customization script is to intercept and parse the incoming packets.
+
+To this end, the qview.py script provides special accumulations:
+
+- the qview.py script provides a **packet-specific callback** for every QS trace record from the Target. The name of the callback is identical to the enumerated names of the #QSpyRecords of the trace records. For example, the packet-handler for the QS trace record #QS_QEP_TRAN is named `QS_QEP_TRAN()`.
+
+- the qview.py script provides the qunpack() facility, specifically designed to parse and unpack the QS trace records.
+
+
+
+ 50 The packet-handler name must match the enumeration #QSpyRecords. Here, the packet-handler is for the #QS_USER_00 trace record
+
+ 51 Here, the packet-handler calls the qunpack() facility to "unpack" the binary data form the received packet into the Python tuple `data`. Each element in this tuple corresponds to the explicitly specified format. For example, with the format "xxTxBxZ": the "T" format (timestamp) is unpacked into `data[0]`, the "B" format (byte) is unpacked into `data[1]`, and the "Z" format (zero-terminated ASCII string) is unpacked into `data[2]`. Subsequently, in the body of the function the `data[]` elements are used according to their meaning.
+
+
+
+
+@note
+The qunpack() facility "understands" all formats supported by the Python `struct.unpack()` plus formats specific to the QP/Spy, such as: "T" for timestamp, "S" for event signal, ""
+
+
+@subsection qview_cust_set Registering Customization in QView™
+
+
+ 60 Every QView™ customization script must end with a call to @ref qview.QView.customize() "QView.customize()" function, to which you need to pass the instance of your Customization class (here your `DPP` class).
+
+
+
+
+
+@section qview_pre App-Specific Vs. Predefined Trace Records
+The customization script discussed in the previous section was based on the @ref qs_app "application-specific trace record" (`QS_USER_00`), which was specifically produced by the DPP application. This trace record delivered the information abou the changing status of the Dining Philosophers, which allowed the customization script to animate the Philosopher images on the custom canvas.
+
+However, it is also possible to use a different strategy based on the @ref qs_pre "predefined QS trace records". The advantage is that **no additional instrumentation** is needed in the application, because the information is already produced by the framework. All you need to do is to enable (in the global filter) the appropriate QS trace record.
+
+This alternative strategy is illustrated in the dpp1.py script (located in the same directory as the dpp.py script discussed earlier). The dpp1.py script is based on the predefined QS record #QS_QEP_TRAN, which provides the information about the **state changes** in the Philo objects in the application.
+
+The most tricky part in this approach is to correctly unpack the predefined record. And here, the biggest challenge is to translate the binary addresses of the objects to their **symbolic names**. For that, the dpp1.py script intercepts the @ref qs_dict "QS dictionary" records #QS_OBJ_DICT and #QS_FUN_DICT, from which the script retrieves the binary addresses of the specific objects. Below are the relevant snippets from the dpp.py script. Please note the use of Python lists, tuples, and dictionaries to organize the data for easy access by the index number of the Philo objects or by the state name.
+
+@code{py}
+class DPP:
+ . . .
+ # intercept the QS_OBJ_DICT stadard packet
+ # this packet has the following structure:
+ # record-ID, seq-num, Object-ptr, Zero-terminated string
+ def QS_OBJ_DICT(self, packet):
+ data = qunpack("xxOZ", packet)
+ try:
+ # NOTE: the names of objects must match the QS Object Dictionaries
+ # produced by the application.
+ i = ("Philo_inst[0]",
+ "Philo_inst[1]",
+ "Philo_inst[2]",
+ "Philo_inst[3]",
+ "Philo_inst[4]").index(data[1])
+ self._philo_obj[i] = data[0]
+ except:
+ pass # dictionary for a different object
+
+ # intercept the QS_FUN_DICT stadard packet
+ # this packet has the following structure:
+ # record-ID, seq-num, Function-ptr, Zero-terminated string
+ def QS_FUN_DICT(self, packet):
+ data = qunpack("xxFZ", packet)
+ try:
+ # NOTE: the names of states must match the QS Object Dictionaries
+ # produced by the application.
+ j = ("Philo_thinking",
+ "Philo_hungry",
+ "Philo_eating").index(data[1])
+ self._philo_state[j] = data[0]
+ except:
+ pass # dictionary for a different state
+
+ # intercept the QS_QEP_TRAN stadard packet
+ # this packet has the following structure:
+ # record-ID, seq-num, Timestamp, Signal, Object-ptr,
+ # Function-ptr (source state), Function-ptr (new active state)
+ def QS_QEP_TRAN(self, packet):
+ data = qunpack("xxTSOFF", packet)
+ try:
+ i = self._philo_obj.index(data[2])
+ j = self._philo_state.index(data[4])
+
+ # animate the given philo image according to its activity
+ QView.canvas.itemconfig(self._philo_img[i],
+ image=self._act_img[j])
+ # print a message to the text view
+ QView.print_text("%010d Philo %d is %s"\
+ %(data[0], i, ("thinking", "hungry", "eating")[j]))
+ except:
+ pass # state-entry in a different object
+ . . .
+@endcode
+
+@n
+@note
+The presented strategy of intercepting the @ref qs_dict "QS dictionary" records #QS_OBJ_DICT and #QS_FUN_DICT is quite generic and can be easily adapted in your own customization scripts.
+
+@next{qwin}
+*/
+
diff --git a/doxygen/snippets/LedBar.c b/doxygen/snippets/LedBar.c
index a6e7df5..174dfe2 100644
--- a/doxygen/snippets/LedBar.c
+++ b/doxygen/snippets/LedBar.c
@@ -2,6 +2,31 @@
#include "LedBar.h"
#include "Led.h"
+/*
+ Example sequence diagram for the LedBar_setPercent() implementation:
+
+ +----------+ +------+ +------+ +------+ +------+ +------+
+ | LedBar | |LED[0]| |LED[1]| |LED[2]| |LED[3]| |LED[4]|
+ +----------+ +------+ +------+ +------+ +------+ +------+
+ | | | | | |
+ +-+ Led_on() | | | | |
+ | |------------->| | | | |
+ | | | | | | |
+ | | Led_on() | | | | |
+ | |----------------------->| | | |
+ | | | | | | |
+ | | Led_on() | | | | |
+ | |--------------------------------->| | |
+ | | | | | | |
+ | | Led_off() | | | | |
+ | |------------------------------------------->| |
+ | | | | | | |
+ | | Led_off() | | | | |
+ | |----------------------------------------------------->|
+ | | | | | | |
+ +-+ | | | | |
+ | | | | | |
+*/
uint32_t LedBar_setPercent(uint8_t percent) {
uint8_t n = (uint8_t)((percent * MAX_LED) / 100);
uint8_t i;
diff --git a/doxygen/snippets/command.py b/doxygen/snippets/command.py
new file mode 100644
index 0000000..62605d7
--- /dev/null
+++ b/doxygen/snippets/command.py
@@ -0,0 +1,5 @@
+test("...")
+...
+command(0, 78) # <===
+expect("...")
+...
diff --git a/doxygen/snippets/continue_test.py b/doxygen/snippets/continue_test.py
new file mode 100644
index 0000000..ed2bc3c
--- /dev/null
+++ b/doxygen/snippets/continue_test.py
@@ -0,0 +1,6 @@
+def on_reset():
+ expect_pause()
+ glb_filter(GRP_UA)
+ current_obj(OBJ_SM_AO, "AO_MyAO")
+ continue_test() # <====
+ expect_run()
diff --git a/doxygen/snippets/current_obj.py b/doxygen/snippets/current_obj.py
new file mode 100644
index 0000000..bf6e67f
--- /dev/null
+++ b/doxygen/snippets/current_obj.py
@@ -0,0 +1,9 @@
+current_obj(OBJ_SM, "my_state_machine")
+
+current_obj(OBJ_MP, "EvtPool1")
+
+current_obj(OBJ_AP, "my_object")
+
+current_obj(OBJ_SM_AO, "Philo[2]")
+
+current_obj(OBJ_AP, 0x20001234)
diff --git a/doxygen/snippets/expect.py b/doxygen/snippets/expect.py
new file mode 100644
index 0000000..79ea0e0
--- /dev/null
+++ b/doxygen/snippets/expect.py
@@ -0,0 +1,7 @@
+expect("0000000001 USER+000 FindFunction_WhichIsBroken 0 78")
+
+expect("@timestamp Trg-Done QS_RX_COMMAND")
+
+expect(" Tick<0> Ctr=*")
+
+expect("@timestamp IO_CALL IO_Write %d %d" %(CommandReg, ProgramCmd))
diff --git a/doxygen/snippets/expect_pause.py b/doxygen/snippets/expect_pause.py
new file mode 100644
index 0000000..da13159
--- /dev/null
+++ b/doxygen/snippets/expect_pause.py
@@ -0,0 +1,6 @@
+def on_reset():
+ expect_pause() # <====
+ glb_filter(GRP_UA)
+ current_obj(OBJ_SM_AO, "AO_MyAO")
+ continue_test()
+ expect_run()
diff --git a/doxygen/snippets/expect_run.py b/doxygen/snippets/expect_run.py
new file mode 100644
index 0000000..39482cf
--- /dev/null
+++ b/doxygen/snippets/expect_run.py
@@ -0,0 +1,6 @@
+def on_reset():
+ expect_pause()
+ glb_filter(GRP_UA)
+ current_obj(OBJ_SM_AO, "AO_MyAO")
+ continue_test()
+ expect_run() # <====
diff --git a/doxygen/snippets/glb_filter.py b/doxygen/snippets/glb_filter.py
new file mode 100644
index 0000000..06d5f86
--- /dev/null
+++ b/doxygen/snippets/glb_filter.py
@@ -0,0 +1,11 @@
+glb_filter() # clears all global filters
+
+glb_filter(GRP_ON) # sets all global filters
+
+glb_filter(GRP_SM, GRP_AO) # sets SM-group and AO-group
+
+glb_filter(GRP_ON, -GRP_SC) # sets all global filters, but clears the SC-group
+
+glb_filter(GRP_QF, "-QS_QF_TICK") # sets the QF-group, but clears the QS_QF_TICK filter
+
+glb_filter(GRP_AO, 78)` # sets the AO-group and the QS record 78
diff --git a/doxygen/snippets/loc_filter.py b/doxygen/snippets/loc_filter.py
new file mode 100644
index 0000000..1c5e85f
--- /dev/null
+++ b/doxygen/snippets/loc_filter.py
@@ -0,0 +1,9 @@
+loc_filter(OBJ_SM, "my_state_machine") # sets SM-local-filter to "my_state_machine"
+
+loc_filter(OBJ_MP, "EvtPool1") # sets the MP-local-filter to "EvtPool1"
+
+loc_filter(OBJ_AP, "my_object") # sets the AP-local-filter to "my_object"
+
+loc_filter(OBJ_SM, "Philo[2]") # sets the SM-local-filter to "Philo[2]"
+
+loc_filter(OBJ_AP, 0x20001234) # sets the AP-local-filter to the given address
\ No newline at end of file
diff --git a/doxygen/snippets/qunpack.py b/doxygen/snippets/qunpack.py
new file mode 100644
index 0000000..a40427a
--- /dev/null
+++ b/doxygen/snippets/qunpack.py
@@ -0,0 +1,6 @@
+data = qunpack("xxTxBxZ", packet)
+
+# returns:
+# data[0], corresponds to 'T' format (QP/Spy timestamp)
+# data[1], corresponds to 'B' format (standard struct.unpack())
+# data[2], corresponds to 'Z' format (QP/Spy zero-terminated string)
diff --git a/doxygen/snippets/tick.py b/doxygen/snippets/tick.py
new file mode 100644
index 0000000..c157de6
--- /dev/null
+++ b/doxygen/snippets/tick.py
@@ -0,0 +1,7 @@
+# tests...
+test("tick")
+glb_filter(GRP_ON)
+current_obj(OBJ_TE, "l_philo<2>.timeEvt")
+tick() # <====
+expect("...")
+...
\ No newline at end of file
diff --git a/qclean/include/qclean.h b/qclean/include/qclean.h
index c47f47f..f73739c 100644
--- a/qclean/include/qclean.h
+++ b/qclean/include/qclean.h
@@ -4,8 +4,8 @@
* @ingroup qclean
* @cond
******************************************************************************
-* Last updated for version 6.8.2
-* Last updated on 2020-07-17
+* Last updated for version 6.9.0
+* Last updated on 2020-08-06
*
* Q u a n t u m L e a P s
* ------------------------
@@ -40,7 +40,7 @@
#ifndef qclean_h
#define qclean_h
-#define VERSION "6.8.2"
+#define VERSION "6.9.0"
unsigned isMatching (char const *fullPath);
void onMatchFound(char const *fullPath, unsigned flags, int ro_info);
diff --git a/qclean/include/safe_std.h b/qclean/include/safe_std.h
index c2a4f70..2cb5394 100644
--- a/qclean/include/safe_std.h
+++ b/qclean/include/safe_std.h
@@ -4,8 +4,8 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 6.8.1
-* Last updated on 2020-03-31
+* Last updated for version 6.9.0
+* Last updated on 2020-08-24
*
* Q u a n t u m L e a P s
* ------------------------
@@ -49,8 +49,8 @@
#define MEMMOVE_S(dest_, num_, src_, count_) \
memmove_s(dest_, num_, src_, count_)
-#define STRCPY_S(dest_, destsiz_, src_) \
- strcpy_s(dest_, destsiz_, src_)
+#define STRNCPY_S(dest_, destsiz_, src_) \
+ strncpy_s(dest_, destsiz_, src_, _TRUNCATE)
#define STRCAT_S(dest_, destsiz_, src_) \
strcat_s(dest_, destsiz_, src_)
@@ -85,11 +85,13 @@ if (fopen_s(&fp_, fName_, mode_) != 0) { \
#define MEMMOVE_S(dest_, num_, src_, count_) \
memmove(dest_, src_, count_)
-#define STRCPY_S(dest_, destsiz_, src_) \
- strcpy(dest_, src_)
+#define STRNCPY_S(dest_, destsiz_, src_) do { \
+ strncpy(dest_, src_, destsiz_); \
+ dest_[(destsiz_) - 1] = '\0'; \
+} while (false)
#define STRCAT_S(dest_, destsiz_, src_) \
- strcat(dest_, src)
+ strcat(dest_, src_)
#define SNPRINTF_S(buf_, bufsiz_, format_, ...) \
snprintf(buf_, bufsiz_, format_, ##__VA_ARGS__)
diff --git a/qclean/source/main.c b/qclean/source/main.c
index b2526e4..7356211 100644
--- a/qclean/source/main.c
+++ b/qclean/source/main.c
@@ -4,8 +4,8 @@
* @ingroup qclean
* @cond
******************************************************************************
-* Last updated for version 6.7.0
-* Last updated on 2020-01-05
+* Last updated for version 6.9.0
+* Last updated on 2020-08-06
*
* Q u a n t u m L e a P s
* ------------------------
@@ -95,6 +95,7 @@ static FileType l_fileTypes[] = {
{ ".ld", 3, CR_FLG | TAB_FLG | LONG_LINE_FLG }, /* GNU ld */
{ ".tcl", 4, CR_FLG | TAB_FLG | LONG_LINE_FLG },
{ ".py", 3, CR_FLG | TAB_FLG | LONG_LINE_FLG },
+ { ".pyw", 4, CR_FLG | TAB_FLG | LONG_LINE_FLG },
{ ".java", 5, CR_FLG | TAB_FLG | LONG_LINE_FLG },
{ "Makefile", 8, CR_FLG | LONG_LINE_FLG },
{ ".mak", 4, CR_FLG | LONG_LINE_FLG },
diff --git a/qclean/win32/make.bat b/qclean/win32/make.bat
index bb7cbd0..bb609e6 100644
--- a/qclean/win32/make.bat
+++ b/qclean/win32/make.bat
@@ -1 +1,24 @@
-call msbuild qclean Release
+:: Batch file for building the specified PROJ (solution) prepared for
+:: Microsoft Visual Studio
+::
+:: usage:
+:: make
+::
+@setlocal
+
+:: specifiy project and build configuration (Debug|Release|Spy)
+@set PROJ=qclean
+@set CONF=Release
+
+:: adjust the MSBuild location for your system
+@set MSBuild="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe"
+
+:: execute the build...
+%MSBuild% %PROJ%.sln -t:Build -p:Configuration=%CONF% -p:Platform=Win32
+
+:: cleanup after the build...
+rmdir /S /Q %CONF%\%PROJ%.tlog
+del %CONF%\%PROJ%.vcxproj* %CONF%\%PROJ%.log %CONF%\*.obj %CONF%\*.pdb
+
+@endlocal
+
diff --git a/qfsgen/include/qfsgen.h b/qfsgen/include/qfsgen.h
index fe7e365..dce8c4d 100644
--- a/qfsgen/include/qfsgen.h
+++ b/qfsgen/include/qfsgen.h
@@ -4,8 +4,8 @@
* @ingroup qfsgen
* @cond
******************************************************************************
-* Last updated for version 6.8.2
-* Last updated on 2020-07-17
+* Last updated for version 6.9.0
+* Last updated on 2020-08-22
*
* Q u a n t u m L e a P s
* ------------------------
@@ -41,7 +41,7 @@
#ifndef qfsgen_h
#define qfsgen_h
-#define VERSION "6.8.2"
+#define VERSION "6.9.0"
unsigned isMatching (char const *fullPath);
void onMatchFound(char const *fullPath, unsigned flags, int ro_info);
diff --git a/qfsgen/include/safe_std.h b/qfsgen/include/safe_std.h
index c2a4f70..2cb5394 100644
--- a/qfsgen/include/safe_std.h
+++ b/qfsgen/include/safe_std.h
@@ -4,8 +4,8 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 6.8.1
-* Last updated on 2020-03-31
+* Last updated for version 6.9.0
+* Last updated on 2020-08-24
*
* Q u a n t u m L e a P s
* ------------------------
@@ -49,8 +49,8 @@
#define MEMMOVE_S(dest_, num_, src_, count_) \
memmove_s(dest_, num_, src_, count_)
-#define STRCPY_S(dest_, destsiz_, src_) \
- strcpy_s(dest_, destsiz_, src_)
+#define STRNCPY_S(dest_, destsiz_, src_) \
+ strncpy_s(dest_, destsiz_, src_, _TRUNCATE)
#define STRCAT_S(dest_, destsiz_, src_) \
strcat_s(dest_, destsiz_, src_)
@@ -85,11 +85,13 @@ if (fopen_s(&fp_, fName_, mode_) != 0) { \
#define MEMMOVE_S(dest_, num_, src_, count_) \
memmove(dest_, src_, count_)
-#define STRCPY_S(dest_, destsiz_, src_) \
- strcpy(dest_, src_)
+#define STRNCPY_S(dest_, destsiz_, src_) do { \
+ strncpy(dest_, src_, destsiz_); \
+ dest_[(destsiz_) - 1] = '\0'; \
+} while (false)
#define STRCAT_S(dest_, destsiz_, src_) \
- strcat(dest_, src)
+ strcat(dest_, src_)
#define SNPRINTF_S(buf_, bufsiz_, format_, ...) \
snprintf(buf_, bufsiz_, format_, ##__VA_ARGS__)
diff --git a/qfsgen/source/main.c b/qfsgen/source/main.c
index 9b4bd5e..e32463c 100644
--- a/qfsgen/source/main.c
+++ b/qfsgen/source/main.c
@@ -4,8 +4,8 @@
* @ingroup qfsgen
* @cond
******************************************************************************
-* Last updated for version 6.7.0
-* Last updated on 2020-01-05
+* Last updated for version 6.9.0
+* Last updated on 2020-08-25
*
* Q u a n t u m L e a P s
* ------------------------
@@ -57,26 +57,26 @@ static void dumpStrHex(char const *s) {
if (i == 0) { /* new line? */
++i;
if (len == 0) { /* beginning of the file? */
- FPRINTF_S(l_file, " ");
+ FPRINTF_S(l_file, "%s", " ");
}
else {
- FPRINTF_S(l_file, ",\x0A ");
+ FPRINTF_S(l_file, "%s", ",\x0A ");
}
}
else if (i < 9) { /* inside the line? */
++i;
- FPRINTF_S(l_file, ", ");
+ FPRINTF_S(l_file, "%s", ", ");
}
else { /* end of line */
i = 0;
- FPRINTF_S(l_file, ", ");
+ FPRINTF_S(l_file, "%s", ", ");
}
FPRINTF_S(l_file, "0x%02X", ((unsigned)*s & 0xFF));
++s;
++len;
}
if (i == 0) {
- FPRINTF_S(l_file, " ");
+ FPRINTF_S(l_file, "%s", " ");
}
}
/*..........................................................................*/
@@ -155,19 +155,19 @@ void onMatchFound(char const *fullPath, unsigned flags, int ro_info) {
*d = '\0';
FPRINTF_S(l_file, "static unsigned char const data_%s[] = {\x0A", fvar);
- FPRINTF_S(l_file, " /* name: */\x0A");
+ FPRINTF_S(l_file, "%s", " /* name: */\x0A");
dumpStrHex(buf); /* dump the file name */
- FPRINTF_S(l_file, ", 0x00,\x0A"); /* zero-terminate */
+ FPRINTF_S(l_file, "%s", ", 0x00,\x0A"); /* zero-terminate */
if (l_genHttpHeaders) { /* encode HTTP header, if option -h provided */
if (strstr(fname, "404") != 0) {
- STRCPY_S(buf, sizeof(buf), "HTTP/1.0 404 File not found\r\x0A");
+ STRNCPY_S(buf, sizeof(buf), "HTTP/1.0 404 File not found\r\x0A");
}
else {
- STRCPY_S(buf, sizeof(buf), "HTTP/1.0 200 OK\r\x0A");
+ STRNCPY_S(buf, sizeof(buf), "HTTP/1.0 200 OK\r\x0A");
}
STRCAT_S(buf, sizeof(buf),
- "Server: QL (https://state-machine.com)\r\x0A");
+ "Server: QL (https://state-machine.com)\r\x0A");
/* analyze the file type... */
s = strrchr(fname, '.');
@@ -215,12 +215,12 @@ void onMatchFound(char const *fullPath, unsigned flags, int ro_info) {
}
STRCAT_S(buf, sizeof(buf), "\r\x0A");
- FPRINTF_S(l_file, " /* HTTP header: */\x0A");
+ FPRINTF_S(l_file, "%s", " /* HTTP header: */\x0A");
dumpStrHex(buf);
- FPRINTF_S(l_file, ",\x0A");
+ FPRINTF_S(l_file, "%s", ",\x0A");
}
- FPRINTF_S(l_file, " /* data: */\x0A");
+ FPRINTF_S(l_file, "%s", " /* data: */\x0A");
len = 0;
i = 0;
while ((nBytes = fread(buf, 1, sizeof(buf), fin)) != 0) {
@@ -230,45 +230,46 @@ void onMatchFound(char const *fullPath, unsigned flags, int ro_info) {
if (i == 0) { /* new line? */
++i;
if (len == 0) { /* beginning of the file? */
- FPRINTF_S(l_file, " ");
+ FPRINTF_S(l_file, "%s", " ");
}
else {
- FPRINTF_S(l_file, ",\x0A ");
+ FPRINTF_S(l_file, "%s", ",\x0A ");
}
}
else if (i < 9) { /* inside the line? */
++i;
- FPRINTF_S(l_file, ", ");
+ FPRINTF_S(l_file, "%s", ", ");
}
else { /* end of line */
i = 0;
- FPRINTF_S(l_file, ", ");
+ FPRINTF_S(l_file, "%s", ", ");
}
FPRINTF_S(l_file, "0x%02X", ((unsigned)*pc & 0xFF));
++pc;
len += nBytes;
}
}
- FPRINTF_S(l_file, "\x0A};\x0A\x0A");
+ FPRINTF_S(l_file, "%s", "\x0A};\x0A\x0A");
fclose(fin);
FPRINTF_S(l_file, "struct fsdata_file const file_%s[] = {\x0A {\x0A",
- fvar);
+ fvar);
FPRINTF_S(l_file, " %s,\x0A", l_prevFile);
FPRINTF_S(l_file, " data_%s,\x0A", fvar);
FPRINTF_S(l_file, " data_%s + %d,\x0A",
fvar, (int)(strlen(fvar) + 2));
FPRINTF_S(l_file, " sizeof(data_%s) - %d\x0A",
fvar, (int)(strlen(fvar) + 2));
- FPRINTF_S(l_file, " }\x0A};\x0A\x0A");
+ FPRINTF_S(l_file, "%s", " }\x0A};\x0A\x0A");
SNPRINTF_S(l_prevFile, sizeof(l_prevFile) - 1U, "file_%s", fvar);
}
/*..........................................................................*/
int main(int argc, char *argv[]) {
char const *fileName = "fsdata.h";
- PRINTF_S("QFSGen " VERSION " Copyright (c) 2005-2020 Quantum Leaps\n"
- "Documentation: https://state-machine.com/qtools/qfsgen.html\n");
+ PRINTF_S("QFSGen %s Copyright (c) 2005-2020 Quantum Leaps\n"
+ "Documentation: https://state-machine.com/qtools/qfsgen.html\n",
+ VERSION);
PRINTF_S("Usage: qfsgen fs-dir [output-file] [-h]\n"
" fs-dir file-system directory (must be provided)\n"
" output-file optional (default is %s)\n"
@@ -277,7 +278,7 @@ int main(int argc, char *argv[]) {
/* parse the command line... */
if (argc < 2) {
- PRINTF_S("the fs-dir argument must be provided\n");
+ PRINTF_S("%s", "the fs-dir argument must be provided\n");
return -1;
}
else {
@@ -308,10 +309,10 @@ int main(int argc, char *argv[]) {
return -1;
}
- FPRINTF_S(l_file, "/* This file has been generated "
+ FPRINTF_S(l_file, "%s", "/* This file has been generated "
"with the qfsgen utility. */\x0A\x0A");
l_nFiles = 0;
- STRCPY_S(l_prevFile, sizeof(l_prevFile), "(struct fsdata_file *)0");
+ STRNCPY_S(l_prevFile, sizeof(l_prevFile), "(struct fsdata_file *)0");
filesearch(l_fsDir); /* search through the file-system directory tree */
FPRINTF_S(l_file, "#define FS_ROOT %s\x0A\x0A", l_prevFile);
FPRINTF_S(l_file, "#define FS_NUMFILES %d\x0A", l_nFiles);
diff --git a/qfsgen/win32/make.bat b/qfsgen/win32/make.bat
index 54c05ad..e4d4d14 100644
--- a/qfsgen/win32/make.bat
+++ b/qfsgen/win32/make.bat
@@ -1 +1,24 @@
-call msbuild qfsgen Release
+:: Batch file for building the specified PROJ (solution) prepared for
+:: Microsoft Visual Studio
+::
+:: usage:
+:: make
+::
+@setlocal
+
+:: specifiy project and build configuration (Debug|Release|Spy)
+@set PROJ=qfsgen
+@set CONF=Release
+
+:: adjust the MSBuild location for your system
+@set MSBuild="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe"
+
+:: execute the build...
+%MSBuild% %PROJ%.sln -t:Build -p:Configuration=%CONF% -p:Platform=Win32
+
+:: cleanup after the build...
+rmdir /S /Q %CONF%\%PROJ%.tlog
+del %CONF%\%PROJ%.vcxproj* %CONF%\%PROJ%.log %CONF%\*.obj %CONF%\*.pdb
+
+@endlocal
+
diff --git a/qspy/include/be.h b/qspy/include/be.h
index 220f31e..9efaf26 100644
--- a/qspy/include/be.h
+++ b/qspy/include/be.h
@@ -4,14 +4,14 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 5.9.0
-* Last updated on 2017-05-12
+* Last updated for version 6.8.3
+* Last updated on 2020-07-28
*
-* Q u a n t u m L e a P s
-* ---------------------------
-* innovating embedded systems
+* Q u a n t u m L e a P s
+* ------------------------
+* Modern Embedded Software
*
-* Copyright (C) Quantum Leaps, LLC. All rights reserved.
+* Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved.
*
* This program is open source software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
@@ -29,11 +29,11 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
-* along with this program. If not, see .
+* along with this program. If not, see .
*
* Contact information:
-* https://state-machine.com
-* mailto:info@state-machine.com
+*
+*
******************************************************************************
* @endcond
*/
@@ -50,16 +50,8 @@ int BE_parseRecFromTarget(QSpyRecord * const qrec); /*see QSPY_CustParseFun*/
void BE_onStartup(void);
void BE_onCleanup(void);
-
-void BE_sendPkt(int pktId); /* send the packet to the Front-End */
void BE_sendLine(void); /* send the QSPY parsed line to the Front-End */
-void BE_putU8(uint8_t d);
-void BE_putU16(uint16_t d);
-void BE_putU32(uint32_t d);
-void BE_putStr(char const *str);
-void BE_putMem(uint8_t const *mem, uint8_t size);
-
#ifdef __cplusplus
}
#endif
diff --git a/qspy/include/qs_copy.h b/qspy/include/qs_copy.h
index 768f2cb..35819a3 100644
--- a/qspy/include/qs_copy.h
+++ b/qspy/include/qs_copy.h
@@ -91,13 +91,14 @@ enum QSpyRecords {
QS_QF_EQUEUE_GET, /*!< get an event and queue still not empty */
QS_QF_EQUEUE_GET_LAST,/*!< get the last event from the queue */
- QS_QF_RESERVED2,
+ /* [23] Reserved QS records */
+ QS_RESERVED_23,
/* [24] Memory Pool (MP) records */
QS_QF_MPOOL_GET, /*!< a memory block was removed from memory pool */
QS_QF_MPOOL_PUT, /*!< a memory block was returned to memory pool */
- /* [26] QF records */
+ /* [26] Framework (QF) records */
QS_QF_PUBLISH, /*!< an event was published */
QS_QF_NEW_REF, /*!< new event reference was created */
QS_QF_NEW, /*!< new event was created */
@@ -113,7 +114,7 @@ enum QSpyRecords {
QS_QF_TIMEEVT_REARM, /*!< rearming of a time event */
QS_QF_TIMEEVT_POST, /*!< a time event posted itself directly to an AO */
- /* [38] Additional QF records */
+ /* [38] Additional Framework (QF) records */
QS_QF_DELETE_REF, /*!< an event reference is about to be deleted */
QS_QF_CRIT_ENTRY, /*!< critical section was entered */
QS_QF_CRIT_EXIT, /*!< critical section was exited */
@@ -158,9 +159,9 @@ enum QSpyRecords {
QS_QUERY_DATA, /*!< reports the data from "current object" query */
QS_PEEK_DATA, /*!< reports the data from the PEEK query */
QS_ASSERT_FAIL, /*!< assertion failed in the code */
+ QS_QF_RUN, /*!< QF_run() was entered */
- /* [70] Reserved QS records */
- QS_RESERVED_70,
+ /* [71] Reserved QS records */
QS_RESERVED_71,
QS_RESERVED_72,
QS_RESERVED_73,
diff --git a/qspy/include/qspy.h b/qspy/include/qspy.h
index 1f3698f..adc84db 100644
--- a/qspy/include/qspy.h
+++ b/qspy/include/qspy.h
@@ -4,8 +4,8 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 6.8.2
-* Last updated on 2020-06-23
+* Last updated for version 6.9.0
+* Last updated on 2020-08-21
*
* Q u a n t u m L e a P s
* ------------------------
@@ -40,7 +40,7 @@
#ifndef QSPY_H
#define QSPY_H
-#define QSPY_VER "6.8.2"
+#define QSPY_VER "6.9.0"
#ifdef __cplusplus
extern "C" {
@@ -60,7 +60,7 @@ typedef enum {
QSPY_SCREEN_OUT, /*!< toggle screen output to a file in QSPY */
QSPY_BIN_OUT, /*!< toggle binary output to a file in QSPY */
QSPY_MATLAB_OUT, /*!< toggle Matlab output to a file in QSPY */
- QSPY_MSCGEN_OUT, /*!< toggle MscGen output to a file in QSPY */
+ QSPY_SEQUENCE_OUT, /*!< toggle Sequence output to a file in QSPY */
QSPY_SEND_EVENT, /*!< send event (QSPY supplying signal) */
QSPY_SEND_LOC_FILTER, /*!< send Local Filter (QSPY supplying addr) */
QSPY_SEND_CURR_OBJ, /*!< send current Object (QSPY supplying addr) */
@@ -81,6 +81,7 @@ typedef struct {
/*! QSPY configuration parameters. @sa QSPY_config() */
typedef struct {
uint16_t version;
+ uint8_t endianness;
uint8_t objPtrSize;
uint8_t funPtrSize;
uint8_t tstampSize;
@@ -97,11 +98,14 @@ typedef uint64_t KeyType;
typedef uint32_t SigType;
typedef uint64_t ObjType;
-/* the largest valid QS record size [bytes] */
-#define QS_MAX_RECORD_SIZE 512
-
-/* the maximum length of a single QSPY line [chars] */
-#define QS_MAX_LINE_LENGTH 1000
+/* limits */
+enum {
+ QS_RECORD_SIZE_MAX = 512, /* max QS record size [bytes] */
+ QS_LINE_LEN_MAX = 1000, /* max length of a QSPY line [chars] */
+ QS_FNAME_LEN_MAX = 256, /* max length of filenames [chars] */
+ QS_SEQ_LIST_LEN_MAX = 300, /* max length of the Seq list [chars] */
+ QS_DNAME_LEN_MAX = 32, /* max dictionary name length [chars] */
+};
/* pointer to the callback function for customized QS record parsing */
typedef int (*QSPY_CustParseFun)(QSpyRecord * const me);
@@ -120,25 +124,15 @@ uint8_t const *QSpyRecord_getMem(QSpyRecord * const me,
uint32_t *pNum);
/* QSPY configuration and high-level interface .............................*/
-void QSPY_config(
- uint16_t version,
- uint8_t objPtrSize,
- uint8_t funPtrSize,
- uint8_t tstampSize,
- uint8_t sigSize,
- uint8_t evtSize,
- uint8_t queueCtrSize,
- uint8_t poolCtrSize,
- uint8_t poolBlkSize,
- uint8_t tevtCtrSize,
+void QSPY_config(QSpyConfig const *config,
void *matFile,
- void *mscFile,
+ void *seqFile, char const *seqList,
QSPY_CustParseFun custParseFun);
QSpyConfig const *QSPY_getConfig(void);
void QSPY_configTxReset(QSPY_resetFun txResetFun);
void QSPY_configMatFile(void *matFile);
-void QSPY_configMscFile(void *mscFile);
+void QSPY_configSeqFile(void *seqFile);
void QSPY_reset(void);
void QSPY_parse(uint8_t const *buf, uint32_t nBytes);
@@ -166,12 +160,13 @@ KeyType QSPY_findFun(char const *name);
KeyType QSPY_findUsr(char const *name);
void QSPY_stop(void); /* orderly close all used files */
+char const* QSPY_tstampStr(void);
/* last human-readable line of output from QSPY */
#define QS_LINE_OFFSET 8
enum QSPY_LastOutputType { REG_OUT, INF_OUT, ERR_OUT };
typedef struct {
- char buf[QS_LINE_OFFSET + QS_MAX_LINE_LENGTH];
+ char buf[QS_LINE_OFFSET + QS_LINE_LEN_MAX];
int len; /* the length of the composed string */
int rec; /* the corresponding QS record ID */
int type; /* the type of the output */
@@ -183,26 +178,26 @@ void QSPY_onPrintLn(void); /* callback to print the last line of output */
#define SNPRINTF_LINE(format_, ...) do { \
int n_ = SNPRINTF_S(&QSPY_output.buf[QS_LINE_OFFSET], \
- (QS_MAX_LINE_LENGTH - QS_LINE_OFFSET), \
+ (QS_LINE_LEN_MAX - QS_LINE_OFFSET), \
format_, ##__VA_ARGS__); \
- if ((0 < n_) && (n_ < QS_MAX_LINE_LENGTH - QS_LINE_OFFSET)) {\
+ if ((0 < n_) && (n_ < QS_LINE_LEN_MAX - QS_LINE_OFFSET)) {\
QSPY_output.len = n_; \
} \
else { \
- QSPY_output.len = QS_MAX_LINE_LENGTH - QS_LINE_OFFSET; \
+ QSPY_output.len = QS_LINE_LEN_MAX - QS_LINE_OFFSET; \
} \
} while (0)
#define SNPRINTF_APPEND(format_, ...) do { \
int n_ = SNPRINTF_S(&QSPY_output.buf[QS_LINE_OFFSET + QSPY_output.len],\
- (QS_MAX_LINE_LENGTH - QS_LINE_OFFSET - QSPY_output.len), \
+ (QS_LINE_LEN_MAX - QS_LINE_OFFSET - QSPY_output.len), \
format_, ##__VA_ARGS__); \
if ((0 < n_) \
- && (n_ < QS_MAX_LINE_LENGTH - QS_LINE_OFFSET - QSPY_output.len)) { \
+ && (n_ < QS_LINE_LEN_MAX - QS_LINE_OFFSET - QSPY_output.len)) { \
QSPY_output.len += n_; \
} \
else { \
- QSPY_output.len = QS_MAX_LINE_LENGTH - QS_LINE_OFFSET; \
+ QSPY_output.len = QS_LINE_LEN_MAX - QS_LINE_OFFSET; \
} \
} while (0)
diff --git a/qspy/include/safe_std.h b/qspy/include/safe_std.h
index c2a4f70..2cb5394 100644
--- a/qspy/include/safe_std.h
+++ b/qspy/include/safe_std.h
@@ -4,8 +4,8 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 6.8.1
-* Last updated on 2020-03-31
+* Last updated for version 6.9.0
+* Last updated on 2020-08-24
*
* Q u a n t u m L e a P s
* ------------------------
@@ -49,8 +49,8 @@
#define MEMMOVE_S(dest_, num_, src_, count_) \
memmove_s(dest_, num_, src_, count_)
-#define STRCPY_S(dest_, destsiz_, src_) \
- strcpy_s(dest_, destsiz_, src_)
+#define STRNCPY_S(dest_, destsiz_, src_) \
+ strncpy_s(dest_, destsiz_, src_, _TRUNCATE)
#define STRCAT_S(dest_, destsiz_, src_) \
strcat_s(dest_, destsiz_, src_)
@@ -85,11 +85,13 @@ if (fopen_s(&fp_, fName_, mode_) != 0) { \
#define MEMMOVE_S(dest_, num_, src_, count_) \
memmove(dest_, src_, count_)
-#define STRCPY_S(dest_, destsiz_, src_) \
- strcpy(dest_, src_)
+#define STRNCPY_S(dest_, destsiz_, src_) do { \
+ strncpy(dest_, src_, destsiz_); \
+ dest_[(destsiz_) - 1] = '\0'; \
+} while (false)
#define STRCAT_S(dest_, destsiz_, src_) \
- strcat(dest_, src)
+ strcat(dest_, src_)
#define SNPRINTF_S(buf_, bufsiz_, format_, ...) \
snprintf(buf_, bufsiz_, format_, ##__VA_ARGS__)
diff --git a/qspy/posix/pal.c b/qspy/posix/pal.c
index 82db8eb..25a2752 100644
--- a/qspy/posix/pal.c
+++ b/qspy/posix/pal.c
@@ -4,14 +4,14 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 6.7.0
-* Last updated on 2020-02-06
+* Last updated for version 6.9.0
+* Last updated on 2020-08-24
*
* Q u a n t u m L e a P s
* ------------------------
* Modern Embedded Software
*
-* Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved.
+* Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved.
*
* This program is open source software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
@@ -85,27 +85,33 @@ static QSPYEvtType kbd_receive(fd_set const *pReadSet,
static void updateReadySet(int targetConn);
/*..........................................................................*/
-#define INVALID_SOCKET -1
-#define SOCKET_ERROR -1
+enum PAL_Constants { /* local constants... */
+ INVALID_SOCKET = -1,
+ SOCKET_ERROR = -1,
+ FE_DETACHED = 0, /* Front-End detached */
+ PAL_TOUT_MS = 10, /* determines how long to wait for an event [ms] */
+};
+
+/* fron-end address */
+typedef union {
+ uint64_t data[2];
+ struct sockaddr addr;
+} fe_addr;
static int l_serFD = 0; /* Serial port file descriptor */
static int l_serverSock = INVALID_SOCKET;
static int l_clientSock = INVALID_SOCKET;
static int l_beSock = INVALID_SOCKET;
+static fe_addr l_feAddr;
+static socklen_t l_feAddrSize = FE_DETACHED;
+
+static FILE *l_file = (FILE *)0;
static struct termios l_termios_saved; /* saved terminal attributes */
static fd_set l_readSet; /* descriptor set for reading all input sources */
static int l_maxFd; /* maximum file descriptor for select() */
-static struct sockaddr l_beReturnAddr;
-static socklen_t l_beReturnAddrSize;
-
-static FILE *l_file = (FILE *)0;
-
-/* PAL timeout determines how long to wait for an event [ms] */
-#define PAL_TOUT_MS 10
-
/*==========================================================================*/
/* POSIX serial communication with the Target */
QSpyStatus PAL_openTargetSer(char const *comName, int baudRate) {
@@ -624,7 +630,7 @@ QSpyStatus PAL_openBE(int portNum) {
/*..........................................................................*/
void PAL_closeBE(void) {
if (l_beSock != INVALID_SOCKET) {
- if (l_beReturnAddrSize > 0) { /* front-end attached? */
+ if (l_feAddrSize != FE_DETACHED) { /* front-end attached? */
fd_set writeSet;
struct timeval delay;
@@ -652,9 +658,9 @@ void PAL_closeBE(void) {
}
/*..........................................................................*/
void PAL_send2FE(unsigned char const *buf, size_t nBytes) {
- if (l_beReturnAddrSize > 0) { /* front-end attached? */
+ if (l_feAddrSize != FE_DETACHED) { /* front-end attached? */
if (sendto(l_beSock, (char *)buf, (int)nBytes, 0,
- &l_beReturnAddr, l_beReturnAddrSize) == SOCKET_ERROR)
+ &l_feAddr.addr, l_feAddrSize) == SOCKET_ERROR)
{
PAL_detachFE(); /* detach the Front-End */
@@ -666,7 +672,7 @@ void PAL_send2FE(unsigned char const *buf, size_t nBytes) {
}
/*..........................................................................*/
void PAL_detachFE(void) {
- l_beReturnAddrSize = 0;
+ l_feAddrSize = FE_DETACHED;
}
/*..........................................................................*/
@@ -682,28 +688,47 @@ void PAL_clearScreen(void) {
static QSPYEvtType be_receive(fd_set const *pReadSet,
unsigned char *buf, size_t *pBytes)
{
- if (l_beSock == INVALID_SOCKET) { /* Back-End socket not initialized? */
+ fe_addr feAddr;
+ socklen_t feAddrSize;
+ ssize_t nBytes;
+
+ if ((l_beSock == INVALID_SOCKET) /* Back-End socket not initialized? */
+ || !FD_ISSET(l_beSock, pReadSet)) /* Front-End socket has no data? */
+ {
return QSPY_NO_EVT;
}
- /* attempt to receive packet from the Back-End socket */
- if (FD_ISSET(l_beSock, pReadSet)) {
- socklen_t beReturnAddrSize = sizeof(l_beReturnAddr);
- ssize_t nBytes = recvfrom(l_beSock, buf, *pBytes, 0,
- &l_beReturnAddr, &beReturnAddrSize);
- if (nBytes > 0) { /* reception succeeded? */
- l_beReturnAddrSize = beReturnAddrSize; /* attach connection */
- *pBytes = (size_t)nBytes;
+ /* receive a packet from the Back-End socket */
+ feAddrSize = sizeof(feAddr);
+ nBytes = recvfrom(l_beSock, buf, *pBytes, 0,
+ &feAddr.addr, &feAddrSize);
+
+ if (nBytes == 0) { /* socket error */
+ PAL_detachFE(); /* detach from the Front-End */
+ SNPRINTF_LINE(" ERROR "
+ "UDP socket recvfrom() errno=%d", errno);
+ QSPY_printError();
+ return QSPY_ERROR_EVT;
+ }
+ else if (l_feAddrSize == 0) { /* not attached yet? */
+ memcpy(&l_feAddr, &feAddr, feAddrSize);
+ l_feAddrSize = feAddrSize; /* attach connection */
+ *pBytes = nBytes;
+ return QSPY_FE_INPUT_EVT;
+ }
+ else { /* already attached */
+ /* is this from the attached front-end address? */
+ if ((feAddrSize == l_feAddrSize)
+ && (feAddr.data[1] == l_feAddr.data[1])
+ && (feAddr.data[0] == l_feAddr.data[0]))
+ {
+ *pBytes = nBytes;
return QSPY_FE_INPUT_EVT;
}
else {
- if (nBytes < 0) {
- PAL_detachFE(); /* detach from the Front-End */
- SNPRINTF_LINE(" ERROR UDP socket recv() errno=%d",
- errno);
- QSPY_printError();
- return QSPY_ERROR_EVT;
- }
+ SNPRINTF_LINE(" WARN UDP socket in use");
+ QSPY_printError();
+ /* this packet is from a DIFFERENT front-end -- ignore it */
}
}
return QSPY_NO_EVT;
@@ -764,3 +789,25 @@ static void updateReadySet(int targetConn) {
}
}
}
+
+/*..........................................................................*/
+/* simplified strncpy_s() implementation "good enough" for the intended use */
+int strncpy_s(char* strDest, size_t numberOfElements,
+ const char* strSource, size_t count)
+{
+ size_t n;
+ for (n = (numberOfElements < count) ? numberOfElements : count;
+ n > 0;
+ --n, ++strSource, ++strDest)
+ {
+ if (*strSource != '\0') {
+ *strDest = *strSource;
+ }
+ else {
+ *strDest = '\0';
+ return 0; /* destination fits the source */
+ }
+ }
+ strDest[numberOfElements - 1] = '\0';
+ return -1; /* destination holds truncated source */
+}
diff --git a/qspy/py/README.md b/qspy/py/README.md
deleted file mode 100644
index b0ffdad..0000000
--- a/qspy/py/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-About this Directory
-====================
-This directory contains the Python module "qutest.py" that supports
-writing Python test scripts for the QUTest unit testing harness.
-
-The module "qutest_dsl.py" contains the separate Doxygen documentation
-of the small unit-testing "Domain Specific Language" (DSL) for writing
-test scripts in Python.
-
-
-General Requirements
-====================
-The "qutest" package requires Python 2.7+ or Python 3.4+, which are
-freely available from the Internet.
-
-To launch any of the scripts in this directory, you need to first run
-the QSPY console application (version 6.x or higher) with the -u option
-(the -u option opens up the UDP socket for attaching "front-ends").
-Once QSPY is running, you can "attach" to the UDP socket and start
-communicating with the QSPY back-end or to the Target (through QSPY).
-
-
-Using "qutest"
-===============
-The usage of the "qutest" is as follows:
-
-python qutest.py [-x] [test-scripts] [host_exe] [qspy_host[:udp_port]] [qspy_tcp_port]
-
-where:
- - directory with the qutest.py script
-[test_scripts] - optional specification of the Python test scripts to run.
- If not specified, qutest will try to run all *.py files
- in the current directory as test scripts
-
-[host_exe] - optional specification of the host executable to
- launch for testing embedded code on the host computer.
- The special value DEBUG means that qutest.py will start
- in the 'debug' mode, in which it will NOT launch the
- host executables and it will wait for the Target reset
- and other responses from the Target.
- If host_exe is not specified, an embedded target is assumed.
-
-[qspy_host[:udp_port]] - optional host-name/IP-address:port for the host
- running the QSpy utility. If not specified, the default
- is localhost:7701.
-
-[tcp_port] - optional the QSpy TCP port number for connecting
- host executables.
-
-Examples (for Windows):
-python %QTOOLS%\qspy\py\qutest.py
-python %QTOOLS%\qspy\py\qutest.py *.py
-python %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe
-python %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe 192.168.1.100:7705
-python %QTOOLS%\qspy\py\qutest.py *.py build\dpp.exe localhost:7701 6605
-python %QTOOLS%\qspy\py\qutest.py *.py DEBUG
-python %QTOOLS%\qspy\py\qutest.py *.py DEBUG localhost:7701 6605
-
-
-Examples (for Linux/MacOS):
-python $(QTOOLS)/qspy/py/qutest.py
-python $(QTOOLS)/qspy/py/qutest.py *.py
-python $(QTOOLS)/qspy/py/qutest.py *.py build/dpp
-python $(QTOOLS)/qspy/py/qutest.py *.py build/dpp 192.168.1.100:7705
-python $(QTOOLS)/qspy/py/qutest.py *.py build/dpp localhost:7701 6605
-python %QTOOLS%\qspy\py\qutest.py *.py DEBUG
-python %QTOOLS%\qspy\py\qutest.py *.py DEBUG localhost:7701 6605
-
-
-More Information
-================
-More information about the QUTest unit testing harness is available
-online at:
-
-https://www.state-machine.com/qtools/qutest.html
-
-More information about the QP/QSPY software tracing system is available
-online at:
-
-https://www.state-machine.com/qtools/qpspy.html
-
-
diff --git a/qspy/py/README.txt b/qspy/py/README.txt
new file mode 100644
index 0000000..21083c0
--- /dev/null
+++ b/qspy/py/README.txt
@@ -0,0 +1,11 @@
+About this Directory
+====================
+This directory is left for backwards-compatibility only
+and will be removed in the future.
+
+The "qutest.py" Python script has been moved to directory qtools/qutest
+and that location should be used in Makefiles and other build scripts
+for QUTest unit testing.
+
+Quantum Leaps
+August 1, 2020
diff --git a/qspy/qspypy/README.txt b/qspy/qspypy/README.txt
deleted file mode 100644
index ec5af59..0000000
--- a/qspy/qspypy/README.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-About qutestpy
-==============
-This directory used to contain the Python package "qspypy" for
-writing Python test scripts for the QUTest unit testing harness.
-"qspypy" had been originally contributed by Dominic Valentino from
-Lotus Engineering LLC (https://lotusengineeringllc.weebly.com/).
-
-Note about Obsolescence
-=======================
-The "qspypy" Python interface to the QUTest unit testing harness
-is now considered obsolete and has been superseded by the new, simpler
-"py/qutest.py" interface. "qspypy" is no longer provided or supported
-by Quantum Leaps and is NOT RECOMMENDED for writing new test scripts.
-
-Quantum Leaps
-February 25, 2019
-
-
-
diff --git a/qspy/source/be.c b/qspy/source/be.c
index 1fe2208..b7331b8 100644
--- a/qspy/source/be.c
+++ b/qspy/source/be.c
@@ -4,14 +4,14 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 6.7.0
-* Last updated on 2020-01-05
+* Last updated for version 6.9.0
+* Last updated on 2020-08-21
*
* Q u a n t u m L e a P s
* ------------------------
* Modern Embedded Software
*
-* Copyright (C) 2005-2019 Quantum Leaps, LLC. All rights reserved.
+* Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved.
*
* This program is open source software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
@@ -56,11 +56,12 @@ typedef void QEvt;
#ifndef Q_SPY
#define Q_SPY 1
#endif
+#define QS_OBJ_PTR_SIZE 4
+#define QS_FUN_PTR_SIZE 4
+#define Q_SIGNAL_SIZE 2
#include "qs_copy.h" /* copy of the target-resident QS interface */
/*..........................................................................*/
-static uint8_t l_buf[8*1024]; /* the output buffer [bytes] */
-static uint8_t *l_pos; /* current position in the output buffer */
static uint8_t l_rxBeSeq; /* receive Back-End sequence number */
static uint8_t l_txBeSeq; /* transmit Back-End sequence number */
static uint8_t l_channels; /* channels of the output (bitmask) */
@@ -70,6 +71,9 @@ enum Channels {
TEXT_CH = (1 << 1)
};
+/* send a packet to Front-End */
+static void BE_sendShortPkt(int pktId);
+
#define BIN_FORMAT "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BIN(byte_) \
(byte_ & 0x80 ? '1' : '0'), \
@@ -87,7 +91,6 @@ static FILE *l_testFile;
#endif
void BE_onStartup(void) {
- l_pos = &l_buf[0];
l_rxBeSeq = 0U;
l_txBeSeq = 0U;
l_channels = 0U;
@@ -98,7 +101,7 @@ void BE_onStartup(void) {
}
/*..........................................................................*/
void BE_onCleanup(void) {
- BE_sendPkt(QSPY_DETACH);
+ BE_sendShortPkt(QSPY_DETACH);
#ifndef NDEBUG
fclose(l_testFile);
#endif
@@ -129,7 +132,7 @@ void BE_parse(unsigned char *buf, size_t nBytes) {
/* check if this is a packet to be forwarded directly to the Target */
if (buf[1] < 128) {
- static uint8_t qbuf[QS_MAX_RECORD_SIZE]; /* encoded QS record */
+ static uint8_t qbuf[QS_RECORD_SIZE_MAX]; /* encoded QS record */
/* encode the packet according to the QS/QSPY protocol */
size_t len = QSPY_encode(qbuf, sizeof(qbuf), buf, nBytes);
@@ -179,7 +182,7 @@ void BE_parseRecFromFE(QSpyRecord * const qrec) {
l_txBeSeq = 0U; /* re-start the transmit sequence */
/* send the attach confirmation packet back to the Front-End */
- BE_sendPkt(QSPY_ATTACH);
+ BE_sendShortPkt(QSPY_ATTACH);
break;
}
@@ -207,7 +210,7 @@ void BE_parseRecFromFE(QSpyRecord * const qrec) {
QSPY_command('m');
break;
}
- case QSPY_MSCGEN_OUT: {
+ case QSPY_SEQUENCE_OUT: {
QSPY_command('g');
break;
}
@@ -256,32 +259,38 @@ int BE_parseRecFromTarget(QSpyRecord * const qrec) {
}
/*--------------------------------------------------------------------------*/
-void BE_sendPkt(int pktId) {
- if ((pktId >= 128) || ((l_channels & 1U) != 0)) {
- l_pos = &l_buf[0];
+void BE_sendShortPkt(int pktId) {
+ if ((pktId >= 128) || ((l_channels & BINARY_CH) != 0)) {
+ uint8_t buf[4];
+ uint8_t *pos = &buf[0];
++l_txBeSeq;
- *l_pos++ = l_txBeSeq;
- *l_pos++ = (uint8_t)pktId;
- PAL_send2FE(l_buf, (l_pos - &l_buf[0]));
+ *pos++ = l_txBeSeq;
+ *pos++ = (uint8_t)pktId;
+ PAL_send2FE(buf, (pos - &buf[0]));
}
}
/*..........................................................................*/
void BE_sendLine(void) {
- /* global filter for permanently enabled QS records
- * minus the records that generate time stamps
- */
- static uint8_t const glbFilter[32] = {
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
- 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
-
- if ((l_channels & 2U) != 0) {
+ if ((l_channels & TEXT_CH) != 0) {
+ /* filter for permanently enabled QS records
+ * that should NOT be forwarded to BE:
+ * QS_EMPTY,
+ * QS_SIG_DICT,
+ * QS_OBJ_DICT,
+ * QS_FUN_DICT,
+ * QS_USR_DICT,
+ * QS_TARGET_INFO
+ */
+ static uint8_t const dont_forward[32] = {
+ 0x01U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0xF0U,
+ 0x01U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
+ 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U,
+ 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U
+ };
uint8_t rec = (uint8_t)QSPY_output.rec;
- /* is this QS record not permanently blocked? */
- if ((glbFilter[rec >> 3] & (1U << (rec & 7U))) == 0U) {
+ /* should this QS record be forwarded? */
+ if ((dont_forward[rec >> 3] & (1U << (rec & 7U))) == 0U) {
++l_txBeSeq;
/* prepend the BE UDP packet header in front of the string */
@@ -294,34 +303,3 @@ void BE_sendLine(void) {
}
}
}
-
-/*--------------------------------------------------------------------------*/
-void BE_putU8(uint8_t d) {
- *l_pos++ = d;
-}
-/*..........................................................................*/
-void BE_putU16(uint16_t d) {
- *l_pos++ = (uint8_t)d; d >>= 8;
- *l_pos++ = (uint8_t)d;
-}
-/*..........................................................................*/
-void BE_putU32(uint32_t d) {
- *l_pos++ = (uint8_t)d; d >>= 8;
- *l_pos++ = (uint8_t)d; d >>= 8;
- *l_pos++ = (uint8_t)d; d >>= 8;
- *l_pos++ = (uint8_t)d;
-}
-/*..........................................................................*/
-void BE_putStr(char const *str) {
- while (*str != '\0') {
- *l_pos++ = (uint8_t)*str++;
- }
-}
-/*..........................................................................*/
-void BE_putMem(uint8_t const *mem, uint8_t size) {
- *l_pos++ = size;
- while (size > 0) {
- *l_pos++ = (uint8_t)*mem++;
- --size;
- }
-}
diff --git a/qspy/source/getopt.c b/qspy/source/getopt.c
index 6198a41..e7ee7fb 100644
--- a/qspy/source/getopt.c
+++ b/qspy/source/getopt.c
@@ -1,11 +1,16 @@
/*****************************************************************************
* getopt.c - competent and free getopt library.
*
+* getopt() return values:
+* -1 end of processing
+* '?' unknown option
+* '!' unexpected option argument
+* '$' option argument required
+*
* Copyright (c) 2002-2003, Mark K. Kim
* Copyright (c) 2012-2017, Kim Grasman
* Copyright (c) 2018-2020, Quantum Leaps 2018
*
-*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
@@ -46,7 +51,10 @@ static int opt_offset = 0; /* Index into compounded "-option" */
static int dashdash = 0; /* True if "--" option reached */
static int nonopt = 0; /* How many nonopts we've found */
-static void increment_index() {
+static void increment_index(void); /* prototype */
+static int permute_argv_once(void); /* prototype */
+
+static void increment_index(void) {
/* Move onto the next option */
if (argv_index < argv_index2) {
while (prev_argv[++argv_index]
@@ -64,7 +72,7 @@ static void increment_index() {
* Permutes argv[] so that the argument currently being processed is moved
* to the end.
*/
-static int permute_argv_once() {
+static int permute_argv_once(void) {
/* Movability check */
if (argv_index + nonopt >= prev_argc) {
return 1;
@@ -163,10 +171,11 @@ int getopt(int argc, char *argv[], char const *optstr) {
/* Invalid argument */
if (!opt_ptr) {
if (opterr) {
- FPRINTF_S(stderr, "%s: invalid option: -%c\n", argv[0], c);
+ FPRINTF_S(stderr, "\nERROR: -%c command-line option "
+ "takes no arguments\n", optopt);
}
optopt = c;
- c = '?';
+ c = '!'; /* notify the caller about invalid argument */
/* Move onto the next option */
increment_index();
@@ -216,11 +225,11 @@ int getopt(int argc, char *argv[], char const *optstr) {
/* If we got no argument for an option with required argument */
if (optarg == NULL && opt_ptr[2] != ':') {
optopt = c;
- c = '?';
+ c = '$'; /* notify the caller about required argument(s) */
if (opterr) {
- FPRINTF_S(stderr,"%s: option requires an argument: -%c\n",
- argv[0], optopt);
+ FPRINTF_S(stderr, "\nERROR: -%c command-line option "
+ "requires argument(s)\n", optopt);
}
}
}
diff --git a/qspy/source/main.c b/qspy/source/main.c
index 33c61a5..0c1b803 100644
--- a/qspy/source/main.c
+++ b/qspy/source/main.c
@@ -4,8 +4,8 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 6.7.0
-* Last updated on 2019-01-05
+* Last updated for version 6.9.0
+* Last updated on 2020-08-20
*
* Q u a n t u m L e a P s
* ------------------------
@@ -49,9 +49,6 @@
#include "pal.h" /* Platform Abstraction Layer */
#include "getopt.h" /* command-line option processor */
-/*..........................................................................*/
-enum { FNAME_SIZE = 256 };
-
/*..........................................................................*/
typedef enum {
NO_LINK,
@@ -66,26 +63,26 @@ static int l_quiet_ctr = 0;
static FILE *l_outFile = (FILE *)0;
static FILE *l_savFile = (FILE *)0;
static FILE *l_matFile = (FILE *)0;
-static FILE *l_mscFile = (FILE *)0;
+static FILE *l_seqFile = (FILE *)0;
-static char l_comPort [FNAME_SIZE];
-static char l_inpFileName[FNAME_SIZE];
-static char l_outFileName[FNAME_SIZE];
-static char l_savFileName[FNAME_SIZE];
-static char l_matFileName[FNAME_SIZE];
-static char l_mscFileName[FNAME_SIZE];
-static char l_dicFileName[FNAME_SIZE];
+static char l_comPort [QS_FNAME_LEN_MAX];
+static char l_inpFileName[QS_FNAME_LEN_MAX];
+static char l_outFileName[QS_FNAME_LEN_MAX];
+static char l_savFileName[QS_FNAME_LEN_MAX];
+static char l_matFileName[QS_FNAME_LEN_MAX];
+static char l_seqFileName[QS_FNAME_LEN_MAX];
+static char l_dicFileName[QS_FNAME_LEN_MAX];
static char l_tstampStr [16];
+static char l_seqList[QS_SEQ_LIST_LEN_MAX];
static int l_bePort = 7701; /* default UDP port */
static int l_tcpPort = 6601; /* default TCP port */
static int l_baudRate = 115200; /* default serial baudrate */
-static char const l_introStr[] =
- "QSPY %s Copyright (c) 2005-2020 Quantum Leaps\n"
- "Documentation: https://www.state-machine.com/qtools/qspy.html\n"
- "Current timestamp: %s\n";
+#define INTRO_STR "QSPY %s Copyright (c) 2005-2020 Quantum Leaps\n" \
+ "Documentation: https://www.state-machine.com/qtools/qspy.html\n" \
+ "Current timestamp: %s\n"
static char const l_helpStr[] =
"Usage: qspy [options] = required, [arg] = optional\n"
@@ -100,7 +97,7 @@ static char const l_helpStr[] =
"-o (key-o) save screen output to a file\n"
"-s (key-s) save binary QS data to a file\n"
"-m produce Matlab output to a file\n"
- "-g produce MscGen output to a file\n"
+ "-g produce Sequence diagram to a file\n"
"-t [TCP_port] 6601 TCP/IP input with optional port\n"
#ifdef _WIN32
"-c COM1 com port input (default)\n"
@@ -136,12 +133,11 @@ static char const l_kbdHelpStr[] =
" o toggle screen file output (close/re-open)\n"
" s/b toggle binary file output (close/re-open)\n"
" m toggle Matlab file output (close/re-open)\n"
- " g toggle MscGen file output (close/re-open)\n";
+ " g toggle Message sequence output (close/re-open)\n";
/*..........................................................................*/
static QSpyStatus configure(int argc, char *argv[]);
static void cleanup(void);
-static char const *tstampStr(void);
static uint8_t l_buf[8*1024]; /* process input in 8K chunks */
/*..........................................................................*/
@@ -276,36 +272,40 @@ void QSPY_printInfo(void) {
/*..........................................................................*/
static QSpyStatus configure(int argc, char *argv[]) {
static char const getoptStr[] =
- "hq::u::v:osmgc:b:t::p:f:d::T:O:F:S:E:Q:P:B:C:";
+ "hq::u::v:osmg:c:b:t::p:f:d::T:O:F:S:E:Q:P:B:C:";
/* default configuration options... */
- uint16_t version = 620U;
- uint8_t tstampSize = 4U;
- uint8_t objPtrSize = 4U;
- uint8_t funPtrSize = 4U;
- uint8_t sigSize = 2U;
- uint8_t evtSize = 2U;
- uint8_t queueCtrSize = 1U;
- uint8_t poolCtrSize = 2U;
- uint8_t poolBlkSize = 2U;
- uint8_t tevtCtrSize = 2U;
- int optChar;
-
- STRCPY_S(l_outFileName, sizeof(l_outFileName), "OFF");
- STRCPY_S(l_savFileName, sizeof(l_savFileName), "OFF");
- STRCPY_S(l_matFileName, sizeof(l_matFileName), "OFF");
- STRCPY_S(l_mscFileName, sizeof(l_mscFileName), "OFF");
- STRCPY_S(l_dicFileName, sizeof(l_dicFileName), "OFF");
-
- (void)tstampStr();
- PRINTF_S(l_introStr, QSPY_VER, l_tstampStr);
-
- STRCPY_S(l_inpFileName, sizeof(l_inpFileName), "qs.bin");
+ QSpyConfig config = {
+ .version = 620U,
+ .endianness = 0U,
+ .tstampSize = 4U,
+ .objPtrSize = 4U,
+ .funPtrSize = 4U,
+ .sigSize = 2U,
+ .evtSize = 2U,
+ .queueCtrSize = 1U,
+ .poolCtrSize = 2U,
+ .poolBlkSize = 2U,
+ .tevtCtrSize = 2U,
+ };
+ int optChar;
+
+ STRNCPY_S(l_outFileName, sizeof(l_outFileName), "OFF");
+ STRNCPY_S(l_savFileName, sizeof(l_savFileName), "OFF");
+ STRNCPY_S(l_matFileName, sizeof(l_matFileName), "OFF");
+ STRNCPY_S(l_seqFileName, sizeof(l_seqFileName), "OFF");
+ STRNCPY_S(l_dicFileName, sizeof(l_dicFileName), "OFF");
+
+ STRNCPY_S(l_tstampStr, sizeof(l_tstampStr), QSPY_tstampStr());
+ PRINTF_S(INTRO_STR, QSPY_VER, l_tstampStr);
+
+ STRNCPY_S(l_inpFileName, sizeof(l_inpFileName), "qs.bin");
#ifdef _WIN32
- STRCPY_S(l_comPort, sizeof(l_comPort), "COM1");
+ STRNCPY_S(l_comPort, sizeof(l_comPort), "COM1");
#elif (defined __linux) || (defined __linux__) || (defined __posix)
- STRCPY_S(l_comPort, sizeof(l_comPort), "/dev/ttyS0");
+ STRNCPY_S(l_comPort, sizeof(l_comPort), "/dev/ttyS0");
#endif
+ l_seqList[0] = '\0';
/* parse the command-line parameters ...................................*/
while ((optChar = getopt(argc, argv, getoptStr)) != -1) {
@@ -333,8 +333,8 @@ static QSpyStatus configure(int argc, char *argv[]) {
&& (optarg[1] == '.')
&& ('0' <= optarg[2] && optarg[2] <= '9'))
{
- version = (((optarg[0] - '0') * 10)
- + (optarg[2] - '0')) * 10;
+ config.version = (((optarg[0] - '0') * 10)
+ + (optarg[2] - '0')) * 10;
PRINTF_S("-v %c.%c\n", optarg[0], optarg[2]);
}
else {
@@ -361,10 +361,18 @@ static QSpyStatus configure(int argc, char *argv[]) {
PRINTF_S("-m (%s)\n", l_matFileName);
break;
}
- case 'g': { /* MscGen file output */
- SNPRINTF_S(l_mscFileName, sizeof(l_mscFileName) - 1U,
- "qspy%s.msc", l_tstampStr);
- PRINTF_S("-g (%s)\n", l_mscFileName);
+ case 'g': { /* Sequence file output */
+ if (optarg != NULL) { /* is optional argument provided? */
+ STRNCPY_S(l_seqList, sizeof(l_seqList), optarg);
+ }
+ else {
+ FPRINTF_S(stderr,
+ "empty object-list for sequence diagram");
+ return QSPY_ERROR;
+ }
+ SNPRINTF_S(l_seqFileName, sizeof(l_seqFileName) - 1U,
+ "qspy%s.seq", l_tstampStr);
+ PRINTF_S("-g %s (%s)\n", l_seqList, l_seqFileName);
break;
}
case 'c': { /* COM port */
@@ -373,7 +381,7 @@ static QSpyStatus configure(int argc, char *argv[]) {
"The -c option is incompatible with -t/-f\n");
return QSPY_ERROR;
}
- STRCPY_S(l_comPort, sizeof(l_comPort), optarg);
+ STRNCPY_S(l_comPort, sizeof(l_comPort), optarg);
PRINTF_S("-c %s\n", l_comPort);
l_link = SERIAL_LINK;
break;
@@ -399,14 +407,14 @@ static QSpyStatus configure(int argc, char *argv[]) {
"The -f option is incompatible with -c/-b/-t\n");
return QSPY_ERROR;
}
- STRCPY_S(l_inpFileName, sizeof(l_inpFileName), optarg);
+ STRNCPY_S(l_inpFileName, sizeof(l_inpFileName), optarg);
PRINTF_S("-f %s\n", l_inpFileName);
l_link = FILE_LINK;
break;
}
case 'd': { /* Dictionary file */
if (optarg != NULL) { /* is optional argument provided? */
- STRCPY_S(l_dicFileName, sizeof(l_dicFileName), optarg);
+ STRNCPY_S(l_dicFileName, sizeof(l_dicFileName), optarg);
PRINTF_S("-d %s\n", l_dicFileName);
}
else { /* apply the default */
@@ -436,50 +444,54 @@ static QSpyStatus configure(int argc, char *argv[]) {
break;
}
case 'T': { /* timestamp size */
- tstampSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.tstampSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'F': { /* function pointer size */
- funPtrSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.funPtrSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'O': { /* object pointer size */
- objPtrSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.objPtrSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'S': { /* signal size */
- sigSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.sigSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'E': { /* event size */
- evtSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.evtSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'Q': { /* Queue counter size */
- queueCtrSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.queueCtrSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'P': { /* Memory-pool counter size */
- poolCtrSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.poolCtrSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'B': { /* Memory-pool blocksize size */
- poolBlkSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.poolBlkSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'C': { /* Time event counter size */
- tevtCtrSize = (uint8_t)strtoul(optarg, 0, 10);
+ config.tevtCtrSize = (uint8_t)strtoul(optarg, 0, 10);
break;
}
case 'h': { /* help */
PRINTF_S("\n%s\n%s", l_helpStr, l_kbdHelpStr);
return QSPY_ERROR;
}
- default: { /* unknown option */
- FPRINTF_S(stderr, "Unknown option -%c\n", (char)optChar);
+ case '?': /* intentionally fall through */
+ case '!': /* intentionally fall through */
+ case '$': {
PRINTF_S("\n%s\n%s", l_helpStr, l_kbdHelpStr);
return QSPY_ERROR;
}
+ default: {
+ Q_ASSERT(0);
+ }
}
}
if (argc != optind) {
@@ -527,7 +539,7 @@ static QSpyStatus configure(int argc, char *argv[]) {
if (l_outFileName[0] != 'O') { /* "OFF" ? */
FOPEN_S(l_outFile, l_outFileName, "w");
if (l_outFile != (FILE *)0) {
- FPRINTF_S(l_outFile, l_introStr, QSPY_VER, l_tstampStr);
+ FPRINTF_S(l_outFile, INTRO_STR, QSPY_VER, l_tstampStr);
}
else {
PRINTF_S(" Cannot open File=%s\n", l_outFileName);
@@ -548,25 +560,17 @@ static QSpyStatus configure(int argc, char *argv[]) {
return QSPY_ERROR;
}
}
- if (l_mscFileName[0] != 'O') { /* "OFF" ? */
- FOPEN_S(l_mscFile, l_mscFileName, "w");
- if (l_mscFile == (FILE *)0) {
- PRINTF_S(" Cannot open File=%s\n", l_mscFileName);
+ if (l_seqFileName[0] != 'O') { /* "OFF" ? */
+ FOPEN_S(l_seqFile, l_seqFileName, "w");
+ if (l_seqFile == (FILE *)0) {
+ PRINTF_S(" Cannot open File=%s\n", l_seqFileName);
return QSPY_ERROR;
}
}
- QSPY_config(version,
- objPtrSize,
- funPtrSize,
- tstampSize,
- sigSize,
- evtSize,
- queueCtrSize,
- poolCtrSize,
- poolBlkSize,
- tevtCtrSize,
+ QSPY_config(&config,
l_matFile,
- l_mscFile,
+ l_seqFile,
+ l_seqList,
(l_bePort != 0)
? &BE_parseRecFromTarget
: (QSPY_CustParseFun)0);
@@ -600,10 +604,10 @@ bool QSPY_command(uint8_t cmdId) {
else {
PRINTF_S("Quiet Mode [q]: %d\n", l_quiet);
}
- PRINTF_S("Screen Output [o]: %s\n", l_outFileName);
- PRINTF_S("Binary Output [s]: %s\n", l_savFileName);
- PRINTF_S("Matlab Output [m]: %s\n", l_matFileName);
- PRINTF_S("MscGen Output [g]: %s\n", l_mscFileName);
+ PRINTF_S("Screen Output [o]: %s\n", l_outFileName);
+ PRINTF_S("Binary Output [s]: %s\n", l_savFileName);
+ PRINTF_S("Matlab Output [m]: %s\n", l_matFileName);
+ PRINTF_S("Sequence Output [g]: %s\n", l_seqFileName);
break;
case 'r': /* send RESET command to the Target */
@@ -658,20 +662,21 @@ bool QSPY_command(uint8_t cmdId) {
if (l_outFile != (FILE *)0) {
fclose(l_outFile);
l_outFile = (FILE *)0;
- STRCPY_S(l_outFileName, sizeof(l_outFileName), "OFF");
+ STRNCPY_S(l_outFileName, sizeof(l_outFileName), "OFF");
}
else {
+ STRNCPY_S(l_tstampStr, sizeof(l_tstampStr), QSPY_tstampStr());
SNPRINTF_S(l_outFileName, sizeof(l_outFileName),
- "qspy%s.txt", tstampStr());
+ "qspy%s.txt", l_tstampStr);
FOPEN_S(l_outFile, l_outFileName, "w");
if (l_outFile != (FILE *)0) {
- FPRINTF_S(l_outFile, l_introStr, QSPY_VER,
- l_tstampStr);
+ FPRINTF_S(l_outFile, INTRO_STR, QSPY_VER,
+ l_tstampStr);
}
else {
PRINTF_S(" Cannot open File=%s for writing\n",
- l_outFileName);
- STRCPY_S(l_outFileName, sizeof(l_outFileName), "OFF");
+ l_outFileName);
+ STRNCPY_S(l_outFileName, sizeof(l_outFileName), "OFF");
}
}
PRINTF_S(" Screen Output [o] File=%s\n", l_outFileName);
@@ -682,16 +687,16 @@ bool QSPY_command(uint8_t cmdId) {
if (l_savFile != (FILE *)0) {
fclose(l_savFile);
l_savFile = (FILE *)0;
- STRCPY_S(l_savFileName, sizeof(l_savFileName), "OFF");
+ STRNCPY_S(l_savFileName, sizeof(l_savFileName), "OFF");
}
else {
SNPRINTF_S(l_savFileName, sizeof(l_savFileName),
- "qspy%s.bin", tstampStr());
+ "qspy%s.bin", QSPY_tstampStr());
FOPEN_S(l_savFile, l_savFileName, "wb");
if (l_savFile == (FILE *)0) {
PRINTF_S(" Cannot open File=%s for writing\n",
- l_savFileName);
- STRCPY_S(l_savFileName, sizeof(l_savFileName), "OFF");
+ l_savFileName);
+ STRNCPY_S(l_savFileName, sizeof(l_savFileName), "OFF");
}
}
PRINTF_S(" Binary Output [s] File=%s\n",
@@ -702,46 +707,51 @@ bool QSPY_command(uint8_t cmdId) {
if (l_matFile != (FILE *)0) {
QSPY_configMatFile((void *)0); /* close the Matlab file */
l_matFile = (FILE *)0;
- STRCPY_S(l_matFileName, sizeof(l_matFileName), "OFF");
+ STRNCPY_S(l_matFileName, sizeof(l_matFileName), "OFF");
}
else {
SNPRINTF_S(l_matFileName, sizeof(l_matFileName),
- "qspy%s.mat", tstampStr());
+ "qspy%s.mat", QSPY_tstampStr());
FOPEN_S(l_matFile, l_matFileName, "w");
if (l_matFile != (FILE *)0) {
QSPY_configMatFile(l_matFile);
}
else {
PRINTF_S(" Cannot open File=%s for writing\n",
- l_matFileName);
- STRCPY_S(l_matFileName, sizeof(l_matFileName), "OFF");
+ l_matFileName);
+ STRNCPY_S(l_matFileName, sizeof(l_matFileName), "OFF");
}
}
PRINTF_S(" Matlab Output [m] File=%s\n",
l_matFileName);
break;
- case 'g': /* save MscGen file open/close toggle*/
- if (l_mscFile != (FILE *)0) {
- QSPY_configMscFile((void *)0); /* close the MscGen file */
- l_mscFile = (FILE *)0;
- STRCPY_S(l_mscFileName, sizeof(l_mscFileName), "OFF");
+ case 'g': /* save Sequence file open/close toggle */
+ if (l_seqList[0] == '\0') {
+ SNPRINTF_LINE(" Sequence list NOT provided "
+ "(no -g option)");
+ QSPY_printError();
+ }
+ else if (l_seqFile != (FILE *)0) {
+ QSPY_configSeqFile((void *)0); /* close the Sequence file */
+ l_seqFile = (FILE *)0;
+ STRNCPY_S(l_seqFileName, sizeof(l_seqFileName), "OFF");
}
else {
- SNPRINTF_S(l_mscFileName, sizeof(l_mscFileName),
- "qspy%s.msc", tstampStr());
- FOPEN_S(l_mscFile, l_mscFileName, "w");
- if (l_mscFile != (FILE *)0) {
- QSPY_configMscFile(l_mscFile);
+ SNPRINTF_S(l_seqFileName, sizeof(l_seqFileName),
+ "qspy%s.seq", QSPY_tstampStr());
+ FOPEN_S(l_seqFile, l_seqFileName, "w");
+ if (l_seqFile != (FILE *)0) {
+ QSPY_configSeqFile(l_seqFile);
}
else {
PRINTF_S(" Cannot open File=%s for writing\n",
- l_mscFileName);
- STRCPY_S(l_mscFileName, sizeof(l_mscFileName), "OFF");
+ l_seqFileName);
+ STRNCPY_S(l_seqFileName, sizeof(l_seqFileName), "OFF");
}
}
- PRINTF_S(" MscGen Output [g] File=%s\n",
- l_mscFileName);
+ PRINTF_S(" Sequence Output [g] File=%s\n",
+ l_seqFileName);
break;
case 'x':
@@ -753,20 +763,3 @@ bool QSPY_command(uint8_t cmdId) {
return isRunning;
}
-/*..........................................................................*/
-static char const *tstampStr(void) {
- time_t rawtime = time(NULL);
- struct tm tstamp;
-
- LOCALTIME_S(&tstamp, &rawtime);
-
- SNPRINTF_S(l_tstampStr, sizeof(l_tstampStr), "%02d%02d%02d_%02d%02d%02d",
- (tstamp.tm_year + 1900)%100,
- (tstamp.tm_mon + 1),
- tstamp.tm_mday,
- tstamp.tm_hour,
- tstamp.tm_min,
- tstamp.tm_sec);
-
- return &l_tstampStr[0];
-}
diff --git a/qspy/source/qspy.c b/qspy/source/qspy.c
index 5d42e53..a3ef727 100644
--- a/qspy/source/qspy.c
+++ b/qspy/source/qspy.c
@@ -4,8 +4,8 @@
* @ingroup qpspy
* @cond
******************************************************************************
-* Last updated for version 6.8.2
-* Last updated on 2020-07-17
+* Last updated for version 6.9.0
+* Last updated on 2020-08-22
*
* Q u a n t u m L e a P s
* ------------------------
@@ -58,6 +58,9 @@ typedef void QEvt;
#ifndef Q_SPY
#define Q_SPY 1
#endif
+#define QS_OBJ_PTR_SIZE 4
+#define QS_FUN_PTR_SIZE 4
+#define Q_SIGNAL_SIZE 2
#include "qs_copy.h" /* copy of the target-resident QS interface */
/* global objects ..........................................................*/
@@ -66,15 +69,14 @@ QSPY_LastOutput QSPY_output;
/****************************************************************************/
enum {
- DNAME_SIZE = 64, /* dictionary name length (longer names truncated) */
- FNAME_SIZE = 256, /* file name length (longer names truncated) */
- OLD_QS_USER = 70 /* old QS_USER used in before QS 6.6.0 */
+ OLD_QS_USER = 70, /* old QS_USER used in before QS 6.6.0 */
+ SEQ_ITEMS_MAX = 10, /* max number of items in the Sequence list */
};
/*..........................................................................*/
typedef struct {
KeyType key;
- char name[DNAME_SIZE];
+ char name[QS_DNAME_LEN_MAX];
} DictEntry;
typedef struct {
@@ -106,7 +108,7 @@ static void resetAllDictionaries(void);
typedef struct SigDictEntryTag {
SigType sig;
ObjType obj;
- char name[DNAME_SIZE];
+ char name[QS_DNAME_LEN_MAX];
} SigDictEntry;
typedef struct SigDictionaryTag {
@@ -135,24 +137,41 @@ static bool SigDictionary_read(SigDictionary * const me, FILE *stream);
/*..........................................................................*/
static DictEntry l_funSto[512];
static DictEntry l_objSto[256];
-static DictEntry l_mscSto[64];
+static DictEntry l_seqSto[SEQ_ITEMS_MAX];
static DictEntry l_usrSto[128 + 1 - OLD_QS_USER];
static SigDictEntry l_sigSto[512];
static Dictionary l_funDict;
static Dictionary l_objDict;
-static Dictionary l_mscDict;
+static Dictionary l_seqDict;
static Dictionary l_usrDict;
static SigDictionary l_sigDict;
-static char l_dictFileName[FNAME_SIZE]; /* dictionary file name */
+static char l_dictFileName[QS_FNAME_LEN_MAX]; /* dictionary file name */
/*..........................................................................*/
static QSpyConfig l_config;
static FILE *l_matFile;
-static FILE *l_mscFile;
static uint32_t l_userRec;
static QSPY_CustParseFun l_custParseFun;
static QSPY_resetFun l_txResetFun;
+
+static FILE *l_seqFile;
+static char l_seqList[QS_SEQ_LIST_LEN_MAX];
+static char l_seqNames[SEQ_ITEMS_MAX][QS_DNAME_LEN_MAX];
+static int l_seqNum;
+static int l_seqLines;
+static int l_seqSystem;
+static void seqUpdateDictionary(char const *name, KeyType key);
+static int seqFind(KeyType key);
+static void seqGenHeader(void);
+static void seqGenPost(uint32_t tstamp, int src, int dst, char const* sig,
+ bool isAttempt);
+static void seqGenPostLIFO(uint32_t tstamp, int src, char const* sig);
+static void seqGenTran(uint32_t tstamp, int obj, char const* state);
+static void seqGenPublish(uint32_t tstamp, int obj, char const* sig);
+static void seqGenAnnotation(uint32_t tstamp, int obj, char const* ann);
+static void seqGenTick(uint32_t rate, uint32_t nTick);
+
/* QS record names... NOTE: keep in synch with qs_copy.h */
static char const * l_qs_rec[] = {
"QS_EMPTY",
@@ -178,25 +197,37 @@ static char const * l_qs_rec[] = {
"QS_QF_ACTIVE_GET",
"QS_QF_ACTIVE_GET_LAST",
"QS_QF_ACTIVE_RECALL_ATTEMPT",
+
+ /* [19] Event Queue (EQ) records */
"QS_QF_EQUEUE_POST",
"QS_QF_EQUEUE_POST_LIFO",
"QS_QF_EQUEUE_GET",
"QS_QF_EQUEUE_GET_LAST",
- "QS_QF_RESERVED2",
+
+ /* [23] Reserved QS records */
+ "QS_RESERVED_23",
+
+ /* [24] Memory Pool (MP) records */
"QS_QF_MPOOL_GET",
"QS_QF_MPOOL_PUT",
+
+ /* [26] Additional (QF) records */
"QS_QF_PUBLISH",
"QS_QF_NEW_REF",
"QS_QF_NEW",
"QS_QF_GC_ATTEMPT",
"QS_QF_GC",
"QS_QF_TICK",
+
+ /* [32] Time Event (TE) records */
"QS_QF_TIMEEVT_ARM",
"QS_QF_TIMEEVT_AUTO_DISARM",
"QS_QF_TIMEEVT_DISARM_ATTEMPT",
"QS_QF_TIMEEVT_DISARM",
"QS_QF_TIMEEVT_REARM",
"QS_QF_TIMEEVT_POST",
+
+ /* [38] Additional (QF) records */
"QS_QF_DELETE_REF",
"QS_QF_CRIT_ENTRY",
"QS_QF_CRIT_EXIT",
@@ -204,13 +235,19 @@ static char const * l_qs_rec[] = {
"QS_QF_ISR_EXIT",
"QS_QF_INT_DISABLE",
"QS_QF_INT_ENABLE",
+
+ /* [45] Additional Active Object (AO) records */
"QS_QF_ACTIVE_POST_ATTEMPT",
+
+ /* [46] Additional Event Queue (EQ) records */
"QS_QF_EQUEUE_POST_ATTEMPT",
+
+ /* [47] Additional Memory Pool (MP) records */
"QS_QF_MPOOL_GET_ATTEMPT",
+
+ /* [48] Scheduler (SC) records */
"QS_MUTEX_LOCK",
"QS_MUTEX_UNLOCK",
-
- /* [50] built-in scheduler records */
"QS_SCHED_LOCK",
"QS_SCHED_UNLOCK",
"QS_SCHED_NEXT",
@@ -235,9 +272,9 @@ static char const * l_qs_rec[] = {
"QS_QUERY_DATA",
"QS_PEEK_DATA",
"QS_ASSERT_FAIL"
+ "QS_QF_RUN"
- /* [70] Reserved QS records */
- "QS_RESERVED_70",
+ /* [71] Reserved QS records */
"QS_RESERVED_71",
"QS_RESERVED_72",
"QS_RESERVED_73",
@@ -315,80 +352,115 @@ static char const * l_qs_rx_rec[] = {
} else (void)0
/*..........................................................................*/
-void QSPY_config(uint16_t version,
- uint8_t objPtrSize,
- uint8_t funPtrSize,
- uint8_t tstampSize,
- uint8_t sigSize,
- uint8_t evtSize,
- uint8_t queueCtrSize,
- uint8_t poolCtrSize,
- uint8_t poolBlkSize,
- uint8_t tevtCtrSize,
+static char const *my_strtok(char *str, char delim) {
+ static char *next;
+ char const *token;
+ if (str != (char*)0) {
+ next = str;
+ }
+ token = next;
+ if (token != (char *)0) {
+ char *s = next;
+ for (;;) {
+ if (*s == delim) {
+ *s = '\0';
+ next = s + 1;
+ break;
+ }
+ else if (*s == '\0') {
+ next = (char *)0;
+ break;
+ }
+ else {
+ ++s;
+ }
+ }
+ }
+ return token;
+}
+/*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
+void QSPY_config(QSpyConfig const *config,
void *matFile,
- void *mscFile,
+ void *seqFile, const char *seqList,
QSPY_CustParseFun custParseFun)
{
- l_config.version = version;
- l_config.objPtrSize = objPtrSize;
- l_config.funPtrSize = funPtrSize;
- l_config.tstampSize = tstampSize;
- l_config.sigSize = sigSize;
- l_config.evtSize = evtSize;
- l_config.queueCtrSize = queueCtrSize;
- l_config.poolCtrSize = poolCtrSize;
- l_config.poolBlkSize = poolBlkSize;
- l_config.tevtCtrSize = tevtCtrSize;
+ MEMMOVE_S(&l_config, sizeof(l_config), config, sizeof(*config));
l_matFile = (FILE *)matFile;
- l_mscFile = (FILE *)mscFile;
+ l_seqFile = (FILE *)seqFile;
l_custParseFun = custParseFun;
- if (l_mscFile != (FILE *)0) {
- /* reserve space at the beginning of the MscGen file for the header,
- * which is known only at the end of the run in qsStop().
- */
- FPRINTF_S(l_mscFile,
- " \n"
- " \n"
- " \n"
- " \n"
- " \n"
- " \n"
- " \n"
- " \n");
- }
-
Dictionary_ctor(&l_funDict, l_funSto,
sizeof(l_funSto)/sizeof(l_funSto[0]));
Dictionary_ctor(&l_objDict, l_objSto,
sizeof(l_objSto)/sizeof(l_objSto[0]));
- Dictionary_ctor(&l_mscDict, l_mscSto,
- sizeof(l_mscSto)/sizeof(l_mscSto[0]));
+ Dictionary_ctor(&l_seqDict, l_seqSto,
+ sizeof(l_seqSto)/sizeof(l_seqSto[0]));
Dictionary_ctor(&l_usrDict, l_usrSto,
sizeof(l_usrSto)/sizeof(l_usrSto[0]));
SigDictionary_ctor(&l_sigDict, l_sigSto,
sizeof(l_sigSto)/sizeof(l_sigSto[0]));
Dictionary_config(&l_funDict, l_config.funPtrSize);
Dictionary_config(&l_objDict, l_config.objPtrSize);
+ Dictionary_config(&l_seqDict, l_config.objPtrSize);
Dictionary_config(&l_usrDict, 1);
SigDictionary_config(&l_sigDict, l_config.objPtrSize);
l_config.tstamp[5] = 0U; /* invalidate the year-part of the timestamp */
l_dictFileName[0] = '\0'; /* assume no external dictionary management */
+ l_userRec = ((l_config.version < 660U) ? OLD_QS_USER : QS_USER);
- SNPRINTF_LINE("-v %d", (unsigned)version); QSPY_onPrintLn();
- SNPRINTF_LINE("-T %d", (unsigned)tstampSize); QSPY_onPrintLn();
- SNPRINTF_LINE("-O %d", (unsigned)objPtrSize); QSPY_onPrintLn();
- SNPRINTF_LINE("-F %d", (unsigned)l_config.funPtrSize); QSPY_onPrintLn();
- SNPRINTF_LINE("-S %d", (unsigned)sigSize); QSPY_onPrintLn();
- SNPRINTF_LINE("-E %d", (unsigned)evtSize); QSPY_onPrintLn();
- SNPRINTF_LINE("-Q %d", (unsigned)queueCtrSize); QSPY_onPrintLn();
- SNPRINTF_LINE("-P %d", (unsigned)poolCtrSize); QSPY_onPrintLn();
- SNPRINTF_LINE("-B %d", (unsigned)poolBlkSize); QSPY_onPrintLn();
- SNPRINTF_LINE("-C %d", (unsigned)tevtCtrSize); QSPY_onPrintLn();
- QSPY_line[0] = '\0'; QSPY_onPrintLn();
+ /* split the comma-separated 'seqList' into string array l_seqNames[] */
+ l_seqNum = 0;
+ l_seqSystem = -1;
+ if ((seqList != (void*)0) && (*seqList != '\0')) {
+ STRNCPY_S(l_seqList, sizeof(l_seqList), seqList);
+
+ char seqTokens[QS_SEQ_LIST_LEN_MAX]; /* local mutable copy */
+ STRNCPY_S(seqTokens, sizeof(seqTokens), l_seqList);
+ char const *token;
+ for (token = my_strtok(seqTokens, ',');
+ (token != (char*)0) && (l_seqNum < SEQ_ITEMS_MAX);
+ token = my_strtok((char *)0, ','), ++l_seqNum)
+ {
+ if (strncmp(token, "?", 2) == 0) { /* system border? */
+ l_seqSystem = l_seqNum;
+ }
+ STRNCPY_S(l_seqNames[l_seqNum], sizeof(l_seqNames[l_seqNum]),
+ token);
+ }
+ if (token != (char*)0) {
+ SNPRINTF_LINE(" Too many names in the Sequence list\n"
+ " %s\n", l_seqList);
+ QSPY_printInfo();
+ }
+ else {
+ l_seqLines = 0;
+ seqGenHeader();
+ }
+ }
- l_userRec = ((l_config.version < 660U) ? OLD_QS_USER : QS_USER);
+ /* echo all the options to the screen... */
+ SNPRINTF_LINE("-v %d", (unsigned)l_config.version);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-T %d", (unsigned)l_config.tstampSize);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-O %d", (unsigned)l_config.objPtrSize);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-F %d", (unsigned)l_config.funPtrSize);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-S %d", (unsigned)l_config.sigSize);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-E %d", (unsigned)l_config.evtSize);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-Q %d", (unsigned)l_config.queueCtrSize);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-P %d", (unsigned)l_config.poolCtrSize);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-B %d", (unsigned)l_config.poolBlkSize);
+ QSPY_onPrintLn();
+ SNPRINTF_LINE("-C %d", (unsigned)l_config.tevtCtrSize);
+ QSPY_onPrintLn();
+ QSPY_line[0] = '\0'; QSPY_onPrintLn();
}
/*..........................................................................*/
void QSPY_configTxReset(QSPY_resetFun txResetFun) {
@@ -402,30 +474,13 @@ void QSPY_configMatFile(void *matFile) {
l_matFile = (FILE *)matFile;
}
/*..........................................................................*/
-void QSPY_configMscFile(void *mscFile) {
- if (l_mscFile != (FILE *)0) {
- int i;
- FPRINTF_S(l_mscFile, "}\n");
- rewind(l_mscFile);
- FPRINTF_S(l_mscFile, "msc {\n");
- for (i = 0; ; ++i) {
- char const *entry = Dictionary_at(&l_mscDict, i);
- if (entry[0] != '\0') {
- if (i == 0) {
- FPRINTF_S(l_mscFile, "\"%s\"", entry);
- }
- else {
- FPRINTF_S(l_mscFile, ",\"%s\"", entry);
- }
- }
- else {
- break;
- }
- }
- FPRINTF_S(l_mscFile, ";\n");
- fclose(l_mscFile);
+void QSPY_configSeqFile(void *seqFile) {
+ if (l_seqFile != (FILE *)0) {
+ fclose(l_seqFile);
}
- l_mscFile = (FILE *)mscFile;
+ l_seqFile = (FILE *)seqFile;
+ l_seqLines = 0;
+ seqGenHeader();
}
/*..........................................................................*/
QSpyConfig const *QSPY_getConfig(void) {
@@ -440,6 +495,9 @@ void QSpyRecord_init(QSpyRecord * const me,
me->len = (uint32_t)(tot_len - 3U);
me->pos = start + 2;
me->rec = start[1];
+
+ /* set the current QS record-ID for any subsequent output */
+ QSPY_output.rec = me->rec;
}
/*..........................................................................*/
QSpyStatus QSpyRecord_OK(QSpyRecord * const me) {
@@ -625,7 +683,6 @@ int64_t QSpyRecord_getInt64(QSpyRecord * const me, uint8_t size) {
char const *QSpyRecord_getStr(QSpyRecord * const me) {
uint8_t const *p;
int32_t l;
- bool esc = false;
/* is the string empty? */
if (*me->pos == 0U) {
@@ -633,44 +690,19 @@ char const *QSpyRecord_getStr(QSpyRecord * const me) {
--me->len;
++me->pos;
- /* explicit empty string as two single-quotes '' */
+ /* return explicit empty string as two single-quotes '' */
return "''";
}
- /* the following loop finds the beginning of the string and removes
- * or replaces special characters on-the-fly. Specifically a leading '&'
- * at the beginning of a string is removed and all un-escaped special
- * characters, such as brackets '[]' are replaced with '<>'. This is
- * to avoid any potential conflicts in QUTEST with matching strings
- *(e.g., with the Python "fnmatchcase" command or regular explerssions).
- */
for (l = me->len, p = me->pos; l > 0; --l, ++p) {
if (*p == 0U) { /* zero-terminated end of the string? */
char const *s = (char const *)me->pos;
- if (*s == '&') {
- ++s; /* skip the leading '&' */
- }
/* adjust the stream for the next token */
me->len = l - 1;
me->pos = p + 1;
return s; /* normal return */
}
- else if (*p == '\033') { /* escape character? */
- esc = true;
- }
- else if (!esc) { /* non-escape character while not escaping? */
- /* handle any un-escaped special characters... */
- if (*p == '[') { /* replace '[' with '<' */
- *((uint8_t *)p) = '<'; /* cast 'const' away */
- }
- else if (*p == ']') { /* replace ']' with '>' */
- *((uint8_t *)p) = '>'; /* cast 'const' away */
- }
- }
- else { /* non-escape character while escaping */
- esc = false;
- }
}
/* error case... */
@@ -897,14 +929,10 @@ static void QSpyRecord_processUser(QSpyRecord * const me) {
static void QSpyRecord_process(QSpyRecord * const me) {
uint32_t t, a, b, c, d, e;
uint64_t p, q, r;
- char buf[FNAME_SIZE];
+ char buf[QS_FNAME_LEN_MAX];
char const *s = 0;
char const *w = 0;
- /* set the current QS record-ID for any output in this function */
- QSPY_output.rec = me->rec;
- QSPY_output.type = REG_OUT;
-
switch (me->rec) {
/* Session start ...................................................*/
case QS_EMPTY: {
@@ -1008,23 +1036,21 @@ static void QSpyRecord_process(QSpyRecord * const me) {
q = QSpyRecord_getUint64(me, l_config.funPtrSize);
r = QSpyRecord_getUint64(me, l_config.funPtrSize);
if (QSpyRecord_OK(me)) {
+ w = Dictionary_get(&l_funDict, r, buf);
SNPRINTF_LINE("%010u ===>Tran "
"Obj=%s,Sig=%s,State=%s->%s",
t,
Dictionary_get(&l_objDict, p, (char *)0),
SigDictionary_get(&l_sigDict, a, p, (char *)0),
Dictionary_get(&l_funDict, q, (char *)0),
- Dictionary_get(&l_funDict, r, buf));
+ w);
QSPY_onPrintLn();
FPRINF_MATFILE("%d %u %u %"PRId64" %"PRId64" %"PRId64"\n",
(int)me->rec, t, a, p, q, r);
- if (l_mscFile != (FILE *)0) {
- if (Dictionary_find(&l_mscDict, p) >= 0) { /* found? */
- FPRINTF_S(l_mscFile,
- "\"%s\" rbox \"%s\" [label=\"%s\"];\n",
- Dictionary_get(&l_mscDict, p, (char *)0),
- Dictionary_get(&l_mscDict, p, buf),
- Dictionary_get(&l_funDict, r, (char *)0));
+ if (l_seqFile != (FILE*)0) {
+ int obj = seqFind(p);
+ if (obj >= 0) {
+ seqGenTran(t, obj, w);
}
}
}
@@ -1110,6 +1136,12 @@ static void QSpyRecord_process(QSpyRecord * const me) {
QSPY_onPrintLn();
FPRINF_MATFILE("%d %u %"PRId64" %"PRId64" %u %u %u\n",
(int)me->rec, t, p, q, a, b, c);
+ if (l_seqFile != (FILE*)0) {
+ int obj = seqFind(p);
+ if (obj >= 0) {
+ seqGenAnnotation(t, obj, s);
+ }
+ }
}
}
else if (me->rec == QS_QF_ACTIVE_RECALL) { /* former... */
@@ -1144,6 +1176,12 @@ static void QSpyRecord_process(QSpyRecord * const me) {
QSPY_onPrintLn();
FPRINF_MATFILE("%d %u %"PRId64" %"PRId64"\n",
(int)me->rec, t, p, q);
+ if (l_seqFile != (FILE*)0) {
+ int obj = seqFind(p);
+ if (obj >= 0) {
+ seqGenAnnotation(t, obj, "RcallA");
+ }
+ }
}
}
else { /* former QS_QF_EQUEUE_INIT */
@@ -1207,6 +1245,7 @@ static void QSpyRecord_process(QSpyRecord * const me) {
d = QSpyRecord_getUint32(me, l_config.queueCtrSize);
e = QSpyRecord_getUint32(me, l_config.queueCtrSize);
if (QSpyRecord_OK(me)) {
+ w = SigDictionary_get(&l_sigDict, a, p, (char *)0);
SNPRINTF_LINE("%010u AO-%s Sdr=%s,Obj=%s,"
"Evt,"
"Que",
@@ -1214,28 +1253,18 @@ static void QSpyRecord_process(QSpyRecord * const me) {
s,
Dictionary_get(&l_objDict, q, (char *)0),
Dictionary_get(&l_objDict, p, buf),
- SigDictionary_get(&l_sigDict, a, p, (char *)0),
+ w,
b, c, d,
(me->rec == QS_QF_ACTIVE_POST ? "Min" : "Mar"),
e);
QSPY_onPrintLn();
FPRINF_MATFILE("%d %u %"PRId64" %u %"PRId64" %u %u %u %u\n",
(int)me->rec, t, q, a, p, b, c, d, e);
- if (l_mscFile != (FILE *)0) {
- if (Dictionary_find(&l_mscDict, q) < 0) { /* not found? */
- Dictionary_put(&l_mscDict, q,
- Dictionary_get(&l_objDict, q, (char *)0));
- }
- if (Dictionary_find(&l_mscDict, p) < 0) { /* not found? */
- Dictionary_put(&l_mscDict, p,
- Dictionary_get(&l_objDict, p, (char *)0));
- }
- FPRINTF_S(l_mscFile,
- "\"%s\"->\"%s\" [label=\"%u:%s\"];\n",
- Dictionary_get(&l_mscDict, q, (char *)0),
- Dictionary_get(&l_mscDict, p, buf),
- t,
- SigDictionary_get(&l_sigDict, a, p, (char *)0));
+ if (l_seqFile != (FILE *)0) {
+ int src = seqFind(q);
+ int dst = seqFind(p);
+ seqGenPost(t, src, dst, w,
+ (me->rec == QS_QF_ACTIVE_POST_ATTEMPT));
}
}
break;
@@ -1256,27 +1285,22 @@ static void QSpyRecord_process(QSpyRecord * const me) {
d = QSpyRecord_getUint32(me, l_config.queueCtrSize);
e = QSpyRecord_getUint32(me, l_config.queueCtrSize);
if (QSpyRecord_OK(me)) {
+ w = SigDictionary_get(&l_sigDict, a, p, (char *)0);
SNPRINTF_LINE("%010u AO-LIFO Obj=%s,"
"Evt,"
"Que",
t,
Dictionary_get(&l_objDict, p, (char *)0),
- SigDictionary_get(&l_sigDict, a, p, (char *)0),
+ w,
b, c, d, e);
QSPY_onPrintLn();
FPRINF_MATFILE("%d %u %u %"PRId64" %u %u %u %u\n",
(int)me->rec, t, a, p, b, c, d, e);
- if (l_mscFile != (FILE *)0) {
- if (Dictionary_find(&l_mscDict, p) < 0) { /* not found? */
- Dictionary_put(&l_mscDict, p,
- Dictionary_get(&l_objDict, p, (char *)0));
+ if (l_seqFile != (FILE*)0) {
+ int src = seqFind(p);
+ if (src >= 0) {
+ seqGenPostLIFO(t, src, w);
}
- FPRINTF_S(l_mscFile,
- "\"%s\"->\"%s\" [label=\"%u:%s-LIFO\"];\n",
- Dictionary_get(&l_mscDict, p, (char *)0),
- Dictionary_get(&l_mscDict, p, buf),
- t,
- SigDictionary_get(&l_sigDict, a, p, (char *)0));
}
}
break;
@@ -1387,7 +1411,7 @@ static void QSpyRecord_process(QSpyRecord * const me) {
}
break;
}
- case QS_QF_RESERVED2: {
+ case QS_RESERVED_23: {
if (l_config.version >= 620U) {
SNPRINTF_LINE(" Unknown Rec=%d,Len=%d",
(int)me->rec, (int)me->len);
@@ -1465,27 +1489,19 @@ static void QSpyRecord_process(QSpyRecord * const me) {
b >>= 6;
}
if (QSpyRecord_OK(me)) {
+ w = SigDictionary_get(&l_sigDict, a, 0, buf);
SNPRINTF_LINE("%010u QF-Pub Sdr=%s,"
"Evt",
t,
Dictionary_get(&l_objDict, p, (char *)0),
- SigDictionary_get(&l_sigDict, a, 0, (char *)0),
+ w,
b, c);
QSPY_onPrintLn();
FPRINF_MATFILE("%d %u %"PRId64" %u %u\n",
(int)me->rec, t, p, a, b);
- if (l_mscFile != (FILE *)0) {
- if (Dictionary_find(&l_mscDict, p) < 0) { /* not found? */
- Dictionary_put(&l_mscDict, p,
- Dictionary_get(&l_objDict, p, (char *)0));
- }
- FPRINTF_S(l_mscFile,
- "\"%s\"->* [label=\"%u:%s\""
- ",textcolour=\"#0000ff\""
- ",linecolour=\"#0000ff\"];\n",
- Dictionary_get(&l_mscDict, p, (char *)0),
- t,
- SigDictionary_get(&l_sigDict, a, p, (char *)0));
+ if (l_seqFile != (FILE *)0) {
+ int obj = seqFind(p);
+ seqGenPublish(t, obj, w);
}
}
break;
@@ -1610,12 +1626,8 @@ static void QSpyRecord_process(QSpyRecord * const me) {
a);
QSPY_onPrintLn();
FPRINF_MATFILE("%d %u\n", (int)me->rec, a);
- if (l_mscFile != (FILE *)0) {
- FPRINTF_S(l_mscFile,
- "--- [label=\"tick %u\""
- ",textcolour=\"#ff0000\""
- ",linecolour=\"#ff0000\"];\n",
- a);
+ if (l_seqFile != (FILE*)0) {
+ seqGenTick(b, a);
}
}
break;
@@ -1906,6 +1918,19 @@ static void QSpyRecord_process(QSpyRecord * const me) {
case QS_OBJ_DICT: {
p = QSpyRecord_getUint64(me, l_config.objPtrSize);
s = QSpyRecord_getStr(me);
+
+ /* for backward compatibilty replace the '['/']' with '<'/'>' */
+ if (l_config.version < 690U) {
+ char *ps;
+ for (ps = (char *)s; *ps != '\0'; ++ps) {
+ if (*ps == '[') {
+ *ps = '<';
+ }
+ else if (*ps == ']') {
+ *ps = '>';
+ }
+ }
+ }
if (QSpyRecord_OK(me)) {
Dictionary_put(&l_objDict, p, s);
if (l_config.objPtrSize <= 4) {
@@ -1919,6 +1944,9 @@ static void QSpyRecord_process(QSpyRecord * const me) {
QSPY_onPrintLn();
FPRINF_MATFILE("%d %s=%"PRId64";\n",
(int)me->rec, getMatDict(s), p);
+
+ /* if needed, update the object in the Sequence dictionary */
+ seqUpdateDictionary(s, p);
}
break;
}
@@ -1976,7 +2004,8 @@ static void QSpyRecord_process(QSpyRecord * const me) {
* find differences from the current config and store in 'd'
*/
d = 0U; /* assume no difference in the target info */
- CONFIG_UPDATE(version , (uint16_t)(b & 0xFFFFU), d);
+ CONFIG_UPDATE(version , (uint16_t)(b & 0x7FFFU), d);
+ CONFIG_UPDATE(endianness, (uint8_t)((b >> 15) & 0x01U), d);
CONFIG_UPDATE(objPtrSize, (uint8_t)(buf[3] & 0xFU), d);
CONFIG_UPDATE(funPtrSize, (uint8_t)((buf[3] >> 4) & 0xFU),d);
CONFIG_UPDATE(tstampSize, (uint8_t)(buf[4] & 0xFU), d);
@@ -2025,7 +2054,7 @@ static void QSpyRecord_process(QSpyRecord * const me) {
if (l_txResetFun != (QSPY_resetFun)0) {
(*l_txResetFun)();
}
- /*TBD: close and re-open MATLAB file, MSC file, etc. */
+ /*TBD: close and re-open MATLAB, Sequence file, etc. */
}
/* should external dictionaries be used (-d option)? */
@@ -2098,10 +2127,6 @@ static void QSpyRecord_process(QSpyRecord * const me) {
case SM_OBJ:
q = QSpyRecord_getUint64(me, l_config.funPtrSize);
break;
- case AO_OBJ:
- b = QSpyRecord_getUint32(me, l_config.queueCtrSize);
- c = QSpyRecord_getUint32(me, l_config.queueCtrSize);
- break;
case MP_OBJ:
b = QSpyRecord_getUint32(me, l_config.poolCtrSize);
c = QSpyRecord_getUint32(me, l_config.poolCtrSize);
@@ -2122,6 +2147,21 @@ static void QSpyRecord_process(QSpyRecord * const me) {
default:
break;
}
+ if (l_config.version < 690U) {
+ switch (a) {
+ case AO_OBJ:
+ b = QSpyRecord_getUint32(me, l_config.queueCtrSize);
+ c = QSpyRecord_getUint32(me, l_config.queueCtrSize);
+ break;
+ }
+ }
+ else {
+ switch (a) {
+ case AO_OBJ:
+ q = QSpyRecord_getUint64(me, l_config.funPtrSize);
+ break;
+ }
+ }
if (QSpyRecord_OK(me)) {
SNPRINTF_LINE("%010u Query-%s Obj=%s",
t,
@@ -2132,10 +2172,6 @@ static void QSpyRecord_process(QSpyRecord * const me) {
SNPRINTF_APPEND(",State=%s",
Dictionary_get(&l_funDict, q, (char *)0));
break;
- case AO_OBJ:
- SNPRINTF_APPEND(",Que",
- b, c);
- break;
case MP_OBJ:
SNPRINTF_APPEND(",Free=%u,Min=%u",
b, c);
@@ -2157,6 +2193,22 @@ static void QSpyRecord_process(QSpyRecord * const me) {
default:
break;
}
+ if (l_config.version < 690U) {
+ switch (a) {
+ case AO_OBJ:
+ SNPRINTF_APPEND(",Que",
+ b, c);
+ break;
+ }
+ }
+ else {
+ switch (a) {
+ case AO_OBJ:
+ SNPRINTF_APPEND(",State=%s",
+ Dictionary_get(&l_funDict, q, (char *)0));
+ break;
+ }
+ }
QSPY_onPrintLn();
}
break;
@@ -2215,33 +2267,60 @@ static void QSpyRecord_process(QSpyRecord * const me) {
break;
}
- /* User records ....................................................*/
- default: {
- if (me->rec >= l_userRec) {
- QSpyRecord_processUser(me);
- }
- else {
- SNPRINTF_LINE(" Unknown Rec=%d,Len=%d",
- (int)me->rec, (int)me->len);
+ case QS_QF_RUN: {
+ if (QSpyRecord_OK(me)) {
+ SNPRINTF_LINE(" QF_RUN");
QSPY_onPrintLn();
+ if (l_dictFileName[0] != '\0') {
+ QSPY_writeDict();
+ }
}
break;
}
+
+ /* Unknown records .................................................*/
+ /* NOTE: the Application-Specific records have been already
+ * sifted out in QSPY_parse()
+ */
+ default: {
+ SNPRINTF_LINE(" Unknown Rec=%d,Len=%d",
+ (int)me->rec, (int)me->len);
+ QSPY_onPrintLn();
+ break;
+ }
}
}
/*..........................................................................*/
void QSPY_stop(void) {
QSPY_configMatFile((void *)0);
- QSPY_configMscFile((void *)0);
+ QSPY_configSeqFile((void *)0);
}
/*..........................................................................*/
void QSPY_printError(void) {
QSPY_output.type = ERR_OUT; /* this is an error message */
QSPY_onPrintLn();
}
+/*..........................................................................*/
+char const* QSPY_tstampStr(void) {
+ time_t rawtime = time(NULL);
+ struct tm tstamp;
+ static char tstampStr[16];
+
+ LOCALTIME_S(&tstamp, &rawtime);
+
+ SNPRINTF_S(tstampStr, sizeof(tstampStr), "%02d%02d%02d_%02d%02d%02d",
+ (tstamp.tm_year + 1900) % 100,
+ (tstamp.tm_mon + 1),
+ tstamp.tm_mday,
+ tstamp.tm_hour,
+ tstamp.tm_min,
+ tstamp.tm_sec);
+
+ return &tstampStr[0];
+}
/****************************************************************************/
-static uint8_t l_record[QS_MAX_RECORD_SIZE];
+static uint8_t l_record[QS_RECORD_SIZE_MAX];
static uint8_t *l_pos = l_record; /* position within the record */
static uint8_t l_chksum = 0U;
static uint8_t l_esc = 0U;
@@ -2304,14 +2383,6 @@ void QSPY_parse(uint8_t const *buf, uint32_t nBytes) {
}
SNPRINTF_APPEND("Seq=%u", (unsigned)l_seq);
QSPY_printError();
-
- if (l_mscFile != (FILE *)0) {
- FPRINTF_S(l_mscFile, "...;\n"
- "--- [label=\"Bad checksum at Seq=%u,Id=%u(?)\""
- ",textbgcolour=\"#ffff00\""
- ",linecolour=\"#ff0000\"];\n",
- (unsigned)l_seq, (unsigned)l_record[1]);
- }
}
}
else if (l_pos < &l_record[3]) { /* record too short? */
@@ -2326,13 +2397,6 @@ void QSPY_parse(uint8_t const *buf, uint32_t nBytes) {
(unsigned)(l_record[1] - l_userRec));
}
QSPY_printError();
- if (l_mscFile != (FILE *)0) {
- FPRINTF_S(l_mscFile, "...;\n"
- "--- [label=\"Record too short at Seq=%u,Id=%u(?)\""
- ",textbgcolour=\"#ffff00\""
- ",linecolour=\"#ff0000\"];\n",
- (unsigned)l_seq, (unsigned)l_record[1]);
- }
}
else { /* a healty record received */
QSpyRecord qrec;
@@ -2350,15 +2414,6 @@ void QSPY_parse(uint8_t const *buf, uint32_t nBytes) {
"Seq=%u->%u",
(unsigned)(l_seq - 1), (unsigned)l_record[0]);
QSPY_printError();
- if (l_mscFile != (FILE *)0) {
- FPRINTF_S(l_mscFile,
- "--- [label=\""
- "Data discontinuity Seq=%u->%u\""
- ",textbgcolour=\"#ffff00\""
- ",linecolour=\"#ff0000\"];\n"
- "...;\n",
- (unsigned)(l_seq - 1), (unsigned)l_record[0]);
- }
}
}
else {
@@ -2377,7 +2432,12 @@ void QSPY_parse(uint8_t const *buf, uint32_t nBytes) {
}
}
if (parse) {
- QSpyRecord_process(&qrec);
+ if (qrec.rec < l_userRec) {
+ QSpyRecord_process(&qrec);
+ }
+ else {
+ QSpyRecord_processUser(&qrec);
+ }
}
}
@@ -2418,7 +2478,7 @@ void QSPY_setExternDict(char const *dictName) {
/*..........................................................................*/
QSpyStatus QSPY_writeDict(void) {
FILE *dictFile = (FILE *)0;
- char buf[FNAME_SIZE];
+ char buf[QS_FNAME_LEN_MAX];
/* no external dictionaries configured? */
if (l_dictFileName[0] == '\0') {
@@ -2483,9 +2543,6 @@ QSpyStatus QSPY_writeDict(void) {
FPRINTF_S(dictFile, "Sig-Dic:\n");
SigDictionary_write(&l_sigDict, dictFile);
- FPRINTF_S(dictFile, "Msc-Dic:\n");
- Dictionary_write(&l_mscDict, dictFile);
-
fclose(dictFile);
SNPRINTF_LINE(" Dictionaries saved to File=%s",
@@ -2497,7 +2554,7 @@ QSpyStatus QSPY_writeDict(void) {
/*..........................................................................*/
QSpyStatus QSPY_readDict(void) {
FILE *dictFile;
- char name[FNAME_SIZE];
+ char name[QS_FNAME_LEN_MAX];
char buf[256];
uint32_t c = l_config.tstamp[5]; /* save the year-part of the tstamp */
uint32_t d = 0U; /* assume no difference in the configuration */
@@ -2582,7 +2639,7 @@ QSpyStatus QSPY_readDict(void) {
CONFIG_UPDATE(poolCtrSize, (buf[2] - '0'), d);
break;
case 'B':
- CONFIG_UPDATE(poolBlkSize, (buf[2] - '0'), d);
+ CONFIG_UPDATE(poolBlkSize, (buf[2] - '0'), d);
break;
case 'C':
CONFIG_UPDATE(tevtCtrSize, (buf[2] - '0'), d);
@@ -2609,7 +2666,7 @@ QSpyStatus QSPY_readDict(void) {
goto error;
}
break;
- case 'O':
+ case 'O': /* object dictionary */
if (!Dictionary_read(&l_objDict, (FILE *)dictFile)) {
SNPRINTF_LINE(" Parsing OBJ dictionaries failed"
" File=%s", name);
@@ -2617,8 +2674,14 @@ QSpyStatus QSPY_readDict(void) {
stat = QSPY_ERROR;
goto error;
}
+ Dictionary_reset(&l_seqDict);
+ int i;
+ for (i = 0; i < l_objDict.entries; ++i) {
+ seqUpdateDictionary(l_objDict.sto[i].name,
+ l_objDict.sto[i].key);
+ }
break;
- case 'F':
+ case 'F': /* function dictionary */
if (!Dictionary_read(&l_funDict, (FILE *)dictFile)) {
SNPRINTF_LINE(" Parsing FUN dictionaries failed"
" File=%s", name);
@@ -2627,7 +2690,7 @@ QSpyStatus QSPY_readDict(void) {
goto error;
}
break;
- case 'U':
+ case 'U': /* user dictionary */
if (!Dictionary_read(&l_usrDict, (FILE *)dictFile)) {
SNPRINTF_LINE(" Parsing USR dictionaries failed"
" File=%s", name);
@@ -2636,7 +2699,7 @@ QSpyStatus QSPY_readDict(void) {
goto error;
}
break;
- case 'S':
+ case 'S': /* signal dictionary */
if (!SigDictionary_read(&l_sigDict, (FILE *)dictFile)) {
SNPRINTF_LINE(" Parsing SIG dictionaries failed"
" File=%s", name);
@@ -2645,18 +2708,10 @@ QSpyStatus QSPY_readDict(void) {
goto error;
}
break;
- case 'M':
- if (!Dictionary_read(&l_mscDict, (FILE *)dictFile)) {
- SNPRINTF_LINE(" Parsing MSC dictionaries failed"
- " File=%s", name);
- QSPY_printError();
- stat = QSPY_ERROR;
- goto error;
- }
- break;
+ /* don't read the sequence dictionary */
default:
SNPRINTF_LINE(" Unexpected line in "
- "Dictionary File=%s,Char=%c", name, buf[0]);
+ "Dictionary File=%s,Char=%c", name, buf[0]);
QSPY_printError();
stat = QSPY_ERROR;
goto error;
@@ -2682,12 +2737,15 @@ QSpyStatus QSPY_readDict(void) {
static void resetAllDictionaries(void) {
Dictionary_reset(&l_funDict);
Dictionary_reset(&l_objDict);
- Dictionary_reset(&l_mscDict);
Dictionary_reset(&l_usrDict);
+ Dictionary_reset(&l_seqDict);
SigDictionary_reset(&l_sigDict);
- /* pre-fill known entries */
+ /* pre-fill known user entries */
Dictionary_put(&l_usrDict, 124, "QUTEST_ON_POST");
+
+ /* find out if NULL needs to be added to the Sequence dictionary... */
+ seqUpdateDictionary("NULL", 0);
}
/*..........................................................................*/
SigType QSPY_findSig(char const *name, ObjType obj) {
@@ -2772,13 +2830,13 @@ static void Dictionary_put(Dictionary * const me,
if (idx >= 0) { /* the key found? */
Q_ASSERT((idx <= n) || (n == 0));
dst = me->sto[idx].name;
- STRCPY_S(dst, sizeof(me->sto[idx].name), name);
+ STRNCPY_S(dst, sizeof(me->sto[idx].name), name);
dst[sizeof(me->sto[idx].name) - 1] = '\0'; /* zero-terminate */
}
else if (n < me->capacity - 1) {
me->sto[n].key = key;
dst = me->sto[n].name;
- STRCPY_S(dst, sizeof(me->sto[n].name), name);
+ STRNCPY_S(dst, sizeof(me->sto[n].name), name);
dst[sizeof(me->sto[idx].name) - 1] = '\0'; /* zero-terminate */
++me->entries;
/* keep the entries sorted by the key */
@@ -2804,10 +2862,10 @@ static char const *Dictionary_get(Dictionary * const me,
}
/* otherwise use the provided buffer... */
if (me->keySize <= 4) {
- SNPRINTF_S(buf, DNAME_SIZE, "0x%08X", (unsigned)key);
+ SNPRINTF_S(buf, QS_DNAME_LEN_MAX, "0x%08X", (unsigned)key);
}
else {
- SNPRINTF_S(buf, DNAME_SIZE, "0x%016"PRIX64"", key);
+ SNPRINTF_S(buf, QS_DNAME_LEN_MAX, "0x%016"PRIX64"", key);
}
//Dictionary_put(me, key, buf); /* put into the dictionary */
return buf;
@@ -2819,19 +2877,20 @@ static int Dictionary_find(Dictionary * const me, KeyType key) {
int mid;
int first = 0;
int last = me->entries;
- while (first <= last) {
- mid = (first + last) / 2;
- if (me->sto[mid].key == key) {
- return mid;
- }
- if (me->sto[mid].key > key) {
- last = mid - 1;
- }
- else {
- first = mid + 1;
+ if (last > 0) { /* not empty? */
+ while (first <= last) {
+ mid = (first + last) / 2;
+ if (me->sto[mid].key == key) {
+ return mid;
+ }
+ if (me->sto[mid].key > key) {
+ last = mid - 1;
+ }
+ else {
+ first = mid + 1;
+ }
}
}
-
return -1; /* entry not found */
}
/*..........................................................................*/
@@ -2955,14 +3014,14 @@ static void SigDictionary_put(SigDictionary * const me,
Q_ASSERT((idx <= n) || (n == 0));
me->sto[idx].obj = obj;
dst = me->sto[idx].name;
- STRCPY_S(dst, sizeof(me->sto[idx].name), name);
+ STRNCPY_S(dst, sizeof(me->sto[idx].name), name);
dst[sizeof(me->sto[idx].name) - 1] = '\0'; /* zero-terminate */
}
else if (n < me->capacity - 1) {
me->sto[n].sig = sig;
me->sto[n].obj = obj;
dst = me->sto[n].name;
- STRCPY_S(dst, sizeof(me->sto[n].name), name);
+ STRNCPY_S(dst, sizeof(me->sto[n].name), name);
dst[sizeof(me->sto[idx].name) - 1] = '\0'; /* zero-terminate */
++me->entries;
/* keep the entries sorted by the sig */
@@ -2988,11 +3047,11 @@ static char const *SigDictionary_get(SigDictionary * const me,
}
/* otherwise use the provided buffer... */
if (me->ptrSize <= 4) {
- SNPRINTF_S(buf, DNAME_SIZE, "%08d,Obj=0x%08X",
+ SNPRINTF_S(buf, QS_DNAME_LEN_MAX, "%08d,Obj=0x%08X",
(int)sig, (int)obj);
}
else {
- SNPRINTF_S(buf, DNAME_SIZE, "%08d,Obj=0x%016"PRIX64"",
+ SNPRINTF_S(buf, QS_DNAME_LEN_MAX, "%08d,Obj=0x%016"PRIX64"",
(int)sig, obj);
}
//SigDictionary_put(me, sig, obj, buf); /* put into the dictionary */
@@ -3144,3 +3203,457 @@ static bool SigDictionary_read(SigDictionary * const me, FILE *stream) {
SigDictionary_reset(me);
return false;
}
+
+/* Sequence diagram facilities =============================================*/
+enum {
+ SEQ_LANE_WIDTH = 20,
+ SEQ_LEFT_OFFSET = 19, /* offset to the middle of the first lane */
+ SEQ_BOX_WIDTH = SEQ_LANE_WIDTH - 3,
+ SEQ_LABEL_MAX = SEQ_LANE_WIDTH - 5,
+ SEQ_HEADER_EVERY = 100, /* # lines between repeated headers */
+};
+
+/*..........................................................................*/
+static void seqUpdateDictionary(char const* name, KeyType key) {
+ int n;
+ for (n = 0; n < l_seqNum; ++n) { /* brute-force search */
+ if (strncmp(l_seqNames[n], name, QS_DNAME_LEN_MAX) == 0) {
+ char str[2];
+ str[0] = (char)n;
+ str[1] = '\0';
+ Dictionary_put(&l_seqDict, key, str);
+ break;
+ }
+ }
+}
+/*..........................................................................*/
+static int seqFind(KeyType key) {
+ int idx = Dictionary_find(&l_seqDict, key);
+ if (idx >= 0) {
+ char const *str = Dictionary_at(&l_seqDict, idx);
+ return (int)str[0];
+ }
+ return -1;
+}
+/*..........................................................................*/
+static void seqGenHeader(void) {
+ if ((l_seqNum == 0) || (l_seqFile == (FILE*)0)) {
+ return;
+ }
+ static char seq_header[(SEQ_LEFT_OFFSET
+ + SEQ_LANE_WIDTH*SEQ_ITEMS_MAX + 4) * 3];
+ static size_t seq_header_len = 0;
+ if (seq_header_len == 0) { /* not initialized yet? */
+ int n;
+ int i = 0;
+ int left_box_edge;
+ char *seq_line = &seq_header[0];
+
+ /* clear the whole header */
+ for (i = 0; (unsigned)i < sizeof(seq_header); ++i) {
+ seq_header[i] = ' ';
+ }
+
+ /* top box edges... */
+ left_box_edge = SEQ_LEFT_OFFSET - SEQ_BOX_WIDTH/2;
+ for (n = 0; n < l_seqNum; ++n, left_box_edge += SEQ_LANE_WIDTH) {
+ i = left_box_edge;
+ seq_line[i] = '+';
+ for (i += 1; i < left_box_edge - 1 + SEQ_BOX_WIDTH; ++i) {
+ seq_line[i] = '-';
+ }
+ seq_line[i - SEQ_BOX_WIDTH / 2] = '+';
+ seq_line[i] = '+'; i += 1;
+ }
+ seq_line[i] = '\n';
+ seq_line = &seq_line[i + 1];
+
+ /* box content... */
+ left_box_edge = SEQ_LEFT_OFFSET - SEQ_BOX_WIDTH/2;
+ for (n = 0; n < l_seqNum; ++n, left_box_edge += SEQ_LANE_WIDTH) {
+ seq_line[left_box_edge] = '|';
+
+ /* write the name */
+ char const *name = l_seqNames[n];
+ int len = strlen(name);
+ i = left_box_edge + 1;
+ if (len < SEQ_BOX_WIDTH - 2) {
+ i += (SEQ_BOX_WIDTH - 2 - len)/2; /* center the name */
+ }
+ for (; (*name != '\0')
+ && (i < left_box_edge + SEQ_BOX_WIDTH - 1);
+ ++name, ++i)
+ {
+ seq_line[i] = *name;
+ }
+
+ i = left_box_edge - 1 + SEQ_BOX_WIDTH;
+ seq_line[i] = '|'; i += 1;
+ }
+ seq_line[i] = '\n';
+ seq_line = &seq_line[i + 1];
+
+ /* bottom box edges... */
+ left_box_edge = SEQ_LEFT_OFFSET - SEQ_BOX_WIDTH/2;
+ for (n = 0; n < l_seqNum; ++n, left_box_edge += SEQ_LANE_WIDTH) {
+ i = left_box_edge;
+ seq_line[i] = '+';
+ for (i += 1; i < left_box_edge - 1 + SEQ_BOX_WIDTH; ++i) {
+ seq_line[i] = '-';
+ }
+ seq_line[i - SEQ_BOX_WIDTH/2] = '+';
+ seq_line[i] = '+'; i += 1;
+ }
+ seq_line[i] = '\n';
+ seq_header_len = &seq_line[i + 1] - &seq_header[0];
+ }
+ if (l_seqLines == 0) {
+ FPRINTF_S(l_seqFile, "-g %s\n\n", l_seqList);
+ }
+ fwrite(seq_header, 1, seq_header_len, l_seqFile);
+ l_seqLines += 3;
+}
+/*..........................................................................*/
+static void seqGenPost(uint32_t tstamp, int src, int dst, char const* sig,
+ bool isAttempt)
+{
+ if ((l_seqNum == 0) || (l_seqFile == (FILE*)0)) {
+ return;
+ }
+ if (src < 0) {
+ src = l_seqSystem;
+ }
+ if (dst < 0) {
+ dst = l_seqSystem;
+ }
+ if ((src < 0) || (dst < 0)) {
+ return;
+ }
+ if ((src == l_seqSystem) && (dst == l_seqSystem)) {
+ return;
+ }
+ if ((l_seqLines % SEQ_HEADER_EVERY) == 0) {
+ seqGenHeader();
+ }
+ char seq_line[SEQ_LEFT_OFFSET+ SEQ_LABEL_MAX
+ + SEQ_LANE_WIDTH*SEQ_ITEMS_MAX];
+ size_t seq_line_len;
+ int i = 0;
+ int j;
+
+ SNPRINTF_S(&seq_line[i], sizeof(seq_line), "%010u", (unsigned)tstamp);
+ i += 10;
+ for (; i < SEQ_LEFT_OFFSET + (l_seqNum - 1)*SEQ_LANE_WIDTH; ++i) {
+ seq_line[i] = ((i - SEQ_LEFT_OFFSET)%SEQ_LANE_WIDTH) == 0
+ ? '|'
+ : ' ';
+ }
+ seq_line[i] = '|'; i += 1;
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ char dash = isAttempt ? '~' : '-';
+ if (src < dst) {
+ for (i = SEQ_LEFT_OFFSET + src*SEQ_LANE_WIDTH;
+ i < SEQ_LEFT_OFFSET + dst*SEQ_LANE_WIDTH; ++i)
+ {
+ seq_line[i] = ((i - SEQ_LEFT_OFFSET) % SEQ_LANE_WIDTH) == 0
+ ? '+'
+ : dash;
+ }
+ seq_line[i - 1] = '>';
+ /* write the signal */
+ for (i = SEQ_LEFT_OFFSET + 3 + src*SEQ_LANE_WIDTH;
+ ((*sig != '\0')
+ && (i < SEQ_LEFT_OFFSET + SEQ_LABEL_MAX + 3
+ + src*SEQ_LANE_WIDTH));
+ ++i, ++sig)
+ {
+ seq_line[i] = *sig;
+ }
+ }
+ else if (src > dst) {
+ i = SEQ_LEFT_OFFSET + dst*SEQ_LANE_WIDTH;
+ for (i = SEQ_LEFT_OFFSET + dst*SEQ_LANE_WIDTH;
+ i < SEQ_LEFT_OFFSET + src* SEQ_LANE_WIDTH; ++i)
+ {
+ seq_line[i] = ((i - SEQ_LEFT_OFFSET)% SEQ_LANE_WIDTH) == 0
+ ? '+'
+ : dash;
+ }
+ seq_line[SEQ_LEFT_OFFSET + 1 + dst*SEQ_LANE_WIDTH] = '<';
+ seq_line[SEQ_LEFT_OFFSET + dst*SEQ_LANE_WIDTH] = '|';
+
+ /* write the signal */
+ int len = strlen(sig);
+ if (len > SEQ_LABEL_MAX) {
+ len = SEQ_LABEL_MAX;
+ }
+ i = SEQ_LEFT_OFFSET - 2 + src*SEQ_LANE_WIDTH - len;
+ j = i + SEQ_LABEL_MAX;
+ for (; (*sig != '\0') && (i < j); ++i, ++sig) {
+ seq_line[i] = *sig;
+ }
+ }
+ else { /* self-posting */
+ /* write the signal */
+ i = SEQ_LEFT_OFFSET + 3 + src*SEQ_LANE_WIDTH;
+ j = i + SEQ_LABEL_MAX;
+ for (; (*sig != '\0') && (i < j); ++i, ++sig) {
+ seq_line[i] = *sig;
+ }
+ seq_line[i] = ']'; i += 1;
+ if (seq_line_len <= (size_t)i) {
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ }
+ i = SEQ_LEFT_OFFSET + src*SEQ_LANE_WIDTH;
+ seq_line[i + 1] = '<';
+ seq_line[i + 2] = '-';
+ }
+ if (l_seqSystem >= 0) {
+ seq_line[SEQ_LEFT_OFFSET + l_seqSystem*SEQ_LANE_WIDTH] = '/';
+ }
+ seq_line[SEQ_LEFT_OFFSET + src*SEQ_LANE_WIDTH] = isAttempt ? 'A' : '*';
+ Q_ASSERT(seq_line_len <= sizeof(seq_line));
+ fwrite(seq_line, 1, seq_line_len, l_seqFile);
+ l_seqLines += 1;
+}
+/*..........................................................................*/
+static void seqGenPostLIFO(uint32_t tstamp, int src, char const* sig) {
+ if ((l_seqNum == 0) || (l_seqFile == (FILE*)0)) {
+ return;
+ }
+ if ((l_seqLines % SEQ_HEADER_EVERY) == 0) {
+ seqGenHeader();
+ }
+ char seq_line[SEQ_LEFT_OFFSET + SEQ_LABEL_MAX
+ + SEQ_LANE_WIDTH*SEQ_ITEMS_MAX];
+ size_t seq_line_len;
+ int i = 0;
+ int j;
+
+ SNPRINTF_S(&seq_line[i], sizeof(seq_line), "%010u", (unsigned)tstamp);
+ i += 10;
+ for (; i < SEQ_LEFT_OFFSET + (l_seqNum - 1)*SEQ_LANE_WIDTH; ++i) {
+ seq_line[i] = ((i - SEQ_LEFT_OFFSET) % SEQ_LANE_WIDTH) == 0
+ ? '|'
+ : ' ';
+ }
+ seq_line[i] = '|'; i += 1;
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+
+ /* write the signal */
+ i = SEQ_LEFT_OFFSET + 3 + src * SEQ_LANE_WIDTH;
+ j = i + SEQ_LABEL_MAX;
+ for (; (*sig != '\0') && (i <= j); ++i, ++sig) {
+ seq_line[i] = *sig;
+ }
+ seq_line[i] = ']'; i += 1;
+ if (seq_line_len <= (size_t)i) {
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ }
+ i = SEQ_LEFT_OFFSET + src * SEQ_LANE_WIDTH;
+ seq_line[i + 1] = '<';
+ seq_line[i + 2] = '=';
+
+ if (l_seqSystem >= 0) {
+ seq_line[SEQ_LEFT_OFFSET + l_seqSystem*SEQ_LANE_WIDTH] = '/';
+ }
+ seq_line[SEQ_LEFT_OFFSET + src * SEQ_LANE_WIDTH] = '*';
+ Q_ASSERT(seq_line_len <= sizeof(seq_line));
+ fwrite(seq_line, 1, seq_line_len, l_seqFile);
+ l_seqLines += 1;
+}
+/*..........................................................................*/
+static void seqGenPublish(uint32_t tstamp, int obj, char const* sig) {
+ if ((l_seqNum == 0) || (l_seqFile == (FILE*)0)) {
+ return;
+ }
+ if (obj < 0) {
+ obj = l_seqSystem;
+ }
+ if (obj < 0) {
+ return;
+ }
+ if ((l_seqLines % SEQ_HEADER_EVERY) == 0) {
+ seqGenHeader();
+ }
+ char seq_line[SEQ_LEFT_OFFSET + SEQ_LABEL_MAX
+ + SEQ_LANE_WIDTH * SEQ_ITEMS_MAX];
+ size_t seq_line_len;
+ int i = 0;
+ int j;
+
+ SNPRINTF_S(&seq_line[i], sizeof(seq_line), "%010u", (unsigned)tstamp);
+ i += 10;
+ for (;
+ i < SEQ_LEFT_OFFSET - SEQ_LANE_WIDTH + SEQ_BOX_WIDTH/2
+ + l_seqNum*SEQ_LANE_WIDTH; ++i)
+ {
+ seq_line[i] = ((i - SEQ_LEFT_OFFSET)%SEQ_LANE_WIDTH) == 0
+ ? '|'
+ : ((i % 2) ? '.' : ' ');
+ }
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ i = SEQ_LEFT_OFFSET + obj * SEQ_LANE_WIDTH;
+
+ /* write the signal */
+ int len = strlen(sig);
+ if (len > SEQ_LABEL_MAX) {
+ len = SEQ_LABEL_MAX;
+ }
+ if (obj < l_seqNum - 1) { /* signal to the right of '*' */
+ i = SEQ_LEFT_OFFSET + 3 + obj*SEQ_LANE_WIDTH;
+ j = i + SEQ_LABEL_MAX;
+ for (; (*sig != '\0') && (i <= j); ++i, ++sig) {
+ seq_line[i] = *sig;
+ }
+ }
+ else { /* signal to the left of '*' */
+ i = SEQ_LEFT_OFFSET - 2 + obj*SEQ_LANE_WIDTH - len;
+ j = i + SEQ_LABEL_MAX;
+ for (; (*sig != '\0') && (i <= j); ++i, ++sig) {
+ seq_line[i] = *sig;
+ }
+ }
+ if (l_seqSystem >= 0) {
+ seq_line[SEQ_LEFT_OFFSET + l_seqSystem*SEQ_LANE_WIDTH] = '/';
+ }
+ seq_line[SEQ_LEFT_OFFSET + obj * SEQ_LANE_WIDTH] = '*';
+ Q_ASSERT(seq_line_len <= sizeof(seq_line));
+ fwrite(seq_line, 1, seq_line_len, l_seqFile);
+ l_seqLines += 1;
+}
+/*..........................................................................*/
+static void seqGenTran(uint32_t tstamp, int obj, char const* state) {
+ if ((l_seqNum == 0) || (l_seqFile == (FILE*)0)) {
+ return;
+ }
+ if ((l_seqLines % SEQ_HEADER_EVERY) == 0) {
+ seqGenHeader();
+ }
+ char seq_line[SEQ_LEFT_OFFSET + SEQ_LABEL_MAX
+ + SEQ_LANE_WIDTH*SEQ_ITEMS_MAX];
+ size_t seq_line_len;
+ int i = 0;
+ int j;
+
+ SNPRINTF_S(&seq_line[i], sizeof(seq_line), "%010u", (unsigned)tstamp);
+ i += 10;
+ for (; i < SEQ_LEFT_OFFSET + (l_seqNum - 1)*SEQ_LANE_WIDTH; ++i) {
+ seq_line[i] = ((i - SEQ_LEFT_OFFSET)% SEQ_LANE_WIDTH) == 0
+ ? '|'
+ : ' ';
+ }
+ seq_line[i] = '|'; i += 1;
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ i = SEQ_LEFT_OFFSET + obj* SEQ_LANE_WIDTH;
+ /* write the state */
+ int len = strlen(state);
+ if (len > SEQ_LABEL_MAX) {
+ len = SEQ_LABEL_MAX;
+ }
+ i = SEQ_LEFT_OFFSET + obj* SEQ_LANE_WIDTH - (len + 1)/2;
+ j = i + SEQ_LABEL_MAX;
+ seq_line[i] = '<'; i += 1;
+ for (; (*state != '\0') && (i <= j); ++i, ++state) {
+ seq_line[i] = *state;
+ }
+ seq_line[i] = '>'; i += 1;
+ if (seq_line_len <= (size_t)i) {
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ }
+ if (l_seqSystem >= 0) {
+ seq_line[SEQ_LEFT_OFFSET + l_seqSystem*SEQ_LANE_WIDTH] = '/';
+ }
+ Q_ASSERT(seq_line_len <= sizeof(seq_line));
+ fwrite(seq_line, 1, seq_line_len, l_seqFile);
+ l_seqLines += 1;
+}
+/*..........................................................................*/
+static void seqGenAnnotation(uint32_t tstamp, int obj, char const* ann) {
+ if ((l_seqNum == 0) || (l_seqFile == (FILE*)0)) {
+ return;
+ }
+ if ((l_seqLines % SEQ_HEADER_EVERY) == 0) {
+ seqGenHeader();
+ }
+ char seq_line[SEQ_LEFT_OFFSET + SEQ_LABEL_MAX
+ + SEQ_LANE_WIDTH*SEQ_ITEMS_MAX];
+ size_t seq_line_len;
+ int i = 0;
+ int j;
+
+ SNPRINTF_S(&seq_line[i], sizeof(seq_line), "%010u", (unsigned)tstamp);
+ i += 10;
+ for (; i < SEQ_LEFT_OFFSET + (l_seqNum - 1)*SEQ_LANE_WIDTH; ++i) {
+ seq_line[i] = ((i - SEQ_LEFT_OFFSET)%SEQ_LANE_WIDTH) == 0
+ ? '|'
+ : ' ';
+ }
+ seq_line[i] = '|'; i += 1;
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ i = SEQ_LEFT_OFFSET + obj*SEQ_LANE_WIDTH;
+ /* write the annotation */
+ int len = strlen(ann);
+ if (len > SEQ_LABEL_MAX) {
+ len = SEQ_LABEL_MAX;
+ }
+ i = SEQ_LEFT_OFFSET + obj*SEQ_LANE_WIDTH - (len + 1) / 2;
+ j = i + SEQ_LABEL_MAX;
+ seq_line[i] = '('; i += 1;
+ for (; (*ann != '\0') && (i <= j); ++i, ++ann) {
+ seq_line[i] = *ann;
+ }
+ seq_line[i] = ')'; i += 1;
+ if (seq_line_len <= (size_t)i) {
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ }
+ if (l_seqSystem >= 0) {
+ seq_line[SEQ_LEFT_OFFSET + l_seqSystem*SEQ_LANE_WIDTH] = '/';
+ }
+ Q_ASSERT(seq_line_len <= sizeof(seq_line));
+ fwrite(seq_line, 1, seq_line_len, l_seqFile);
+ l_seqLines += 1;
+}
+/*..........................................................................*/
+static void seqGenTick(uint32_t rate, uint32_t nTick) {
+ if ((l_seqNum == 0) || (l_seqFile == (FILE*)0)) {
+ return;
+ }
+ if ((l_seqLines % SEQ_HEADER_EVERY) == 0) {
+ seqGenHeader();
+ }
+ char seq_line[SEQ_LEFT_OFFSET + SEQ_LABEL_MAX
+ + SEQ_LANE_WIDTH*SEQ_ITEMS_MAX];
+ size_t seq_line_len;
+ int i = 0;
+
+ SNPRINTF_S(&seq_line[i], sizeof(seq_line),
+ "########## Tick<%1u> Ctr=%010u",
+ (unsigned)rate, (unsigned)nTick);
+ i += 34;
+ for (;
+ i < SEQ_LEFT_OFFSET - SEQ_LANE_WIDTH + SEQ_BOX_WIDTH/2
+ + l_seqNum*SEQ_LANE_WIDTH; ++i)
+ {
+ seq_line[i] = ((i - SEQ_LEFT_OFFSET) % SEQ_LANE_WIDTH) == 0
+ ? '|'
+ : ((i % 2) ? ' ' : '\'');
+ }
+ if (l_seqSystem >= 0) {
+ seq_line[SEQ_LEFT_OFFSET + l_seqSystem*SEQ_LANE_WIDTH] = '/';
+ }
+ seq_line[i] = '\n';
+ seq_line_len = i + 1;
+ Q_ASSERT(seq_line_len <= sizeof(seq_line));
+ fwrite(seq_line, 1, seq_line_len, l_seqFile);
+ l_seqLines += 1;
+}
diff --git a/qspy/source/qspy_tx.c b/qspy/source/qspy_tx.c
index d6a5526..cb91134 100644
--- a/qspy/source/qspy_tx.c
+++ b/qspy/source/qspy_tx.c
@@ -58,6 +58,9 @@ typedef void QEvt;
#ifndef Q_SPY
#define Q_SPY 1
#endif
+#define QS_OBJ_PTR_SIZE 4
+#define QS_FUN_PTR_SIZE 4
+#define Q_SIGNAL_SIZE 2
#include "qs_copy.h" /* copy of the target-resident QS interface */
/*..........................................................................*/
diff --git a/qspy/tcl/README.txt b/qspy/tcl/README.txt
index 54d671e..3e19a45 100644
--- a/qspy/tcl/README.txt
+++ b/qspy/tcl/README.txt
@@ -1,74 +1,11 @@
About this Directory
====================
-This directory contains the Tcl/Tk scripts that implement the "qspyview"
-GUI front-end for the QSPY software tracing "back-end" utility.
+This directory is left for backwards-compatibility only
+and will be removed in the future.
-General Requirements
-====================
-The "front-end" Tcl scripts require Tcl/Tk with the UDP extension,
-which is available in the Qtools collection for Windows.
-
-To launch any of the scripts in this directory, you need to first run
-the QSPY console application (version 5.9.x or higher) with the -u option
-(the -u option opens up the UDP socket for attaching "front-ends").
-Once QSPY is running, you can "attach" to the UDP socket and start
-communicating with the QSPY back-end or to the Target (through QSPY).
-
-
-Using qspyview.tcl
-==================
-The "qspyview.tcl" script is an example of a GUI front-end. The purpose
-of this script is to provide a GUI for your embedded application runnin
-on the host computer (Windows, Linux, MacOS).
-
-The usage of the "qspyview.tcl" script is as follows:
-
-wish qspyview.tcl [extension_script] [host_ip]
-
-where:
-[extension_script] - optional specification of the extension scripts
- that customizes QSpyView for a particular project.
- If not specified, the "default.tcl" extension script
- is used that provides empty placeholders for all QS
- trace records and commands that you can receive from
- and send to the QS Target component.
-
-[host_ip] - optional IP-address:port for the host running the QSpy
-
-
-Customizing QSPYview
---------------------
-The qspyview.tcl script provides also a basic mechanism to customize the
-behavior for specific projects. To customize the behavior you need to copy
-and modify the default.tcl script. The modified script should be renamed
-to the specific project and used as an additional command parameter to the
-qspyview.tcl script. For example, the directory
-
-\examples\arm-cm\dpp_ek-tm4c123gxl\qspy
-
-contains the customization dpp.tcl, which handles specific QS records
-generated by the dpp example application for the EK-TM4C123GXL board.
-To launch this example, change to the directory just mentioned and type
-
-wish qspyview.tcl dpp.tcl
-
-
-The qspy.tcl package
-====================
-The script qspy.tcl encapsulates the basic communication protocol with
-the QSPY back-end. Based on this functionality, you can write your own
-Tcl scripts to exercise the Target.
-
-
-More Information
-================
-More information about the QP/QSPY software tracing system is available
-online at:
-
-https://www.state-machine.com/qtools/qpspy.html
-
-More information about the QSpyView visualization and monitoring
-is available online at:
-
-https://www.state-machine.com/qtools/qspyview.html
+The Tcl/Tk versions of QUTest and QSpyView have been superceded
+by the Python versions located in qtools/qutest and qtools/qview
+directories, respectively.
+Quantum Leaps
+August 1, 2020
diff --git a/qspy/tcl/README.url b/qspy/tcl/README.url
deleted file mode 100644
index 9f899ab..0000000
--- a/qspy/tcl/README.url
+++ /dev/null
@@ -1,7 +0,0 @@
-[InternetShortcut]
-URL=https:/state-machine.com/qtools/qspy/
-IconFile=https://www.state-machine.com/qp.ico
-IDList=
-HotKey=0
-[{000214A0-0000-0000-C000-000000000046}]
-Prop3=19,11
diff --git a/qspy/tcl/default.tcl b/qspy/tcl/default.tcl
deleted file mode 100644
index a24cfac..0000000
--- a/qspy/tcl/default.tcl
+++ /dev/null
@@ -1,397 +0,0 @@
-##
-# @file
-# @ingroup qpspy
-# @brief Customization of the QSPY back-end.
-# @description
-# This script is the default customization of the qspyview.tcl script.
-
-## @cond
-#-----------------------------------------------------------------------------
-# Product: QSPY -- Customization example to extend the qspyview.tcl script
-# Last updated for version 6.3.0
-# Last updated on 2018-05-10
-#
-# Q u a n t u m L e a P s
-# ---------------------------
-# innovating embedded systems
-#
-# Copyright (C) Quantum Leaps, LLC, All rights reserved.
-#
-# This program is open source software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Alternatively, this program may be distributed and modified under the
-# terms of Quantum Leaps commercial licenses, which expressly supersede
-# the GNU General Public License and are specifically designed for
-# licensees interested in retaining the proprietary status of their code.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-# Contact information:
-# https://www.state-machine.com
-# mailto:info@state-machine.com
-#-----------------------------------------------------------------------------
-# @endcond
-
-# command handlers ===========================================================
-## @brief example Custom-Command handler
-proc onMyCommand {} {
- # do something here, for example:
- # - inject an event to the Target
- # - send a command to the Target
- # - peek memory
- # - poke memory
- # - exectute system tick in the Target
- # - open a dialog box...
- # - etc.
-
- # as an example, the following code sends a command to the Target
- variable ::qspy::QS_RX
- ::qspy::sendPkt [binary format cciii $::qspy::QS_RX(COMMAND) 1 12345 0 0]
-}
-
-# additinal menu options =====================================================
-.mbar.cust add command -label "MyCommand" -command onMyCommand
-
-# custom canvas ==============================================================
-
-# QS record handlers =========================================================
-
-# user record handlers [70..0x7C] --------------------------------------------
-## @brief handler for QS_USER
-proc ::qspy::rec70 {} {
-}
-## @brief handler for QS_USER + 1
-proc ::qspy::rec71 {} {
-}
-## @brief handler for QS_USER + 2
-proc ::qspy::rec72 {} {
-}
-## @brief handler for QS_USER + 3
-proc ::qspy::rec73 {} {
-}
-## @brief handler for QS_USER + 4
-proc ::qspy::rec74 {} {
-}
-## @brief handler for QS_USER + 5
-proc ::qspy::rec75 {} {
-}
-## @brief handler for QS_USER + 6
-proc ::qspy::rec76 {} {
-}
-## @brief handler for QS_USER + 7
-proc ::qspy::rec77 {} {
-}
-## @brief handler for QS_USER + 8
-proc ::qspy::rec78 {} {
-}
-## @brief handler for QS_USER + 9
-proc ::qspy::rec79 {} {
-}
-## @brief handler for QS_USER + 10
-proc ::qspy::rec80 {} {
-}
-## @brief handler for QS_USER + 11
-proc ::qspy::rec81 {} {
-}
-## @brief handler for QS_USER + 12
-proc ::qspy::rec82 {} {
-}
-## @brief handler for QS_USER + 13
-proc ::qspy::rec83 {} {
-}
-## @brief handler for QS_USER + 14
-proc ::qspy::rec84 {} {
-}
-## @brief handler for QS_USER + 15
-proc ::qspy::rec85 {} {
-}
-## @brief handler for QS_USER + 16
-proc ::qspy::rec86 {} {
-}
-## @brief handler for QS_USER + 17
-proc ::qspy::rec87 {} {
-}
-## @brief handler for QS_USER + 18
-proc ::qspy::rec88 {} {
-}
-## @brief handler for QS_USER + 19
-proc ::qspy::rec89 {} {
-}
-## @brief handler for QS_USER + 20
-proc ::qspy::rec90 {} {
-}
-## @brief handler for QS_USER + 21
-proc ::qspy::rec91 {} {
-}
-## @brief handler for QS_USER + 22
-proc ::qspy::rec92 {} {
-}
-## @brief handler for QS_USER + 23
-proc ::qspy::rec93 {} {
-}
-## @brief handler for QS_USER + 24
-proc ::qspy::rec94 {} {
-}
-## @brief handler for QS_USER + 25
-proc ::qspy::rec95 {} {
-}
-## @brief handler for QS_USER + 26
-proc ::qspy::rec96 {} {
-}
-## @brief handler for QS_USER + 27
-proc ::qspy::rec97 {} {
-}
-## @brief handler for QS_USER + 28
-proc ::qspy::rec98 {} {
-}
-## @brief handler for QS_USER + 29
-proc ::qspy::rec99 {} {
-}
-## @brief handler for QS_USER + 30
-proc ::qspy::rec100 {} {
-}
-## @brief handler for QS_USER + 31
-proc ::qspy::rec101 {} {
-}
-## @brief handler for QS_USER + 32
-proc ::qspy::rec102 {} {
-}
-## @brief handler for QS_USER + 33
-proc ::qspy::rec103 {} {
-}
-## @brief handler for QS_USER + 34
-proc ::qspy::rec104 {} {
-}
-## @brief handler for QS_USER + 35
-proc ::qspy::rec105 {} {
-}
-## @brief handler for QS_USER + 36
-proc ::qspy::rec106 {} {
-}
-## @brief handler for QS_USER + 37
-proc ::qspy::rec107 {} {
-}
-## @brief handler for QS_USER + 38
-proc ::qspy::rec108 {} {
-}
-## @brief handler for QS_USER + 39
-proc ::qspy::rec109 {} {
-}
-## @brief handler for QS_USER + 40
-proc ::qspy::rec110 {} {
-}
-## @brief handler for QS_USER + 41
-proc ::qspy::rec111 {} {
-}
-## @brief handler for QS_USER + 42
-proc ::qspy::rec112 {} {
-}
-## @brief handler for QS_USER + 43
-proc ::qspy::rec113 {} {
-}
-## @brief handler for QS_USER + 44
-proc ::qspy::rec114 {} {
-}
-## @brief handler for QS_USER + 45
-proc ::qspy::rec115 {} {
-}
-## @brief handler for QS_USER + 46
-proc ::qspy::rec116 {} {
-}
-## @brief handler for QS_USER + 47
-proc ::qspy::rec117 {} {
-}
-## @brief handler for QS_USER + 48
-proc ::qspy::rec118 {} {
-}
-## @brief handler for QS_USER + 49
-proc ::qspy::rec119 {} {
-}
-## @brief handler for QS_USER + 50
-proc ::qspy::rec120 {} {
-}
-## @brief handler for QS_USER + 51
-proc ::qspy::rec121 {} {
-}
-## @brief handler for QS_USER + 52
-proc ::qspy::rec122 {} {
-}
-## @brief handler for QS_USER + 53
-proc ::qspy::rec123 {} {
-}
-## @brief handler for QS_USER + 54
-proc ::qspy::rec124 {} {
-}
-
-# special record handlers ----------------------------------------------------
-## @brief Target reset callback
-proc ::qspy::recRESET {} {
-}
-## @brief Target info callback
-proc ::qspy::recINFO {} {
-}
-
-# standard record handlers [1..54] -------------------------------------------
-## @brief QS_EMPTY record handler
-proc ::qspy::rec0 {} { ;# QS_EMPTY
-}
-
-# [1] QEP records...
-## @brief QS_QEP_STATE_ENTRY record handler
-proc ::qspy::rec1 {} {
-}
-proc ::qspy::rec2 {} { ;# QS_QEP_STATE_EXIT
-}
-proc ::qspy::rec3 {} { ;# QS_QEP_STATE_INIT
-}
-proc ::qspy::rec4 {} { ;# QS_QEP_INIT_TRAN
-}
-proc ::qspy::rec5 {} { ;# QS_QEP_INTERN_TRAN
-}
-proc ::qspy::rec6 {} { ;# QS_QEP_TRAN
-}
-proc ::qspy::rec7 {} { ;# QS_QEP_IGNORED
-}
-proc ::qspy::rec8 {} { ;# QS_QEP_DISPATCH
-}
-proc ::qspy::rec9 {} { ;# QS_QEP_UNHANDLED
-}
-
-# [10] QF records...
-proc ::qspy::rec10 {} { ;# QS_QF_ACTIVE_ADD
-}
-proc ::qspy::rec11 {} { ;# QS_QF_ACTIVE_REMOVE
-}
-proc ::qspy::rec12 {} { ;# QS_QF_ACTIVE_SUBSCRIBE
-}
-proc ::qspy::rec13 {} { ;# QS_QF_ACTIVE_UNSUBSCRIBE
-}
-proc ::qspy::rec14 {} { ;# QS_QF_ACTIVE_POST
-}
-proc ::qspy::rec15 {} { ;# QS_QF_ACTIVE_POST_LIFO
-}
-proc ::qspy::rec16 {} { ;# QS_QF_ACTIVE_GET
-}
-proc ::qspy::rec17 {} { ;# QS_QF_ACTIVE_GET_LAST
-}
-proc ::qspy::rec18 {} { ;# QS_QF_EQUEUE_INIT
-}
-proc ::qspy::rec19 {} { ;# QS_QF_EQUEUE_POST
-}
-proc ::qspy::rec20 {} { ;# QS_QF_EQUEUE_POST_LIFO
-}
-proc ::qspy::rec21 {} { ;# QS_QF_EQUEUE_GET
-}
-proc ::qspy::rec22 {} { ;# QS_QF_EQUEUE_GET_LAST
-}
-proc ::qspy::rec23 {} { ;# QS_QF_MPOOL_INIT
-}
-proc ::qspy::rec24 {} { ;# QS_QF_MPOOL_GET
-}
-proc ::qspy::rec25 {} { ;# QS_QF_MPOOL_PUT
-}
-proc ::qspy::rec26 {} { ;# QS_QF_PUBLISH
-}
-proc ::qspy::rec27 {} { ;# QS_QF_RESERVED8
-}
-proc ::qspy::rec28 {} { ;# QS_QF_NEW
-}
-proc ::qspy::rec29 {} { ;# QS_QF_GC_ATTEMPT
-}
-proc ::qspy::rec30 {} { ;# QS_QF_GC
-}
-proc ::qspy::rec31 {} { ;# QS_QF_TICK
-}
-proc ::qspy::rec32 {} { ;# QS_QF_TIMEEVT_ARM
-}
-proc ::qspy::rec33 {} { ;# QS_QF_TIMEEVT_AUTO_DISARM
-}
-proc ::qspy::rec34 {} { ;# QS_QF_TIMEEVT_DISARM_ATTEMPT
-}
-proc ::qspy::rec35 {} { ;# QS_QF_TIMEEVT_DISARM
-}
-proc ::qspy::rec36 {} { ;# QS_QF_TIMEEVT_REARM
-}
-proc ::qspy::rec37 {} { ;# QS_QF_TIMEEVT_POST
-}
-proc ::qspy::rec38 {} { ;# QS_QF_TIMEEVT_CTR
-}
-proc ::qspy::rec39 {} { ;# QS_QF_CRIT_ENTRY
-}
-proc ::qspy::rec40 {} { ;# QS_QF_CRIT_EXIT
-}
-proc ::qspy::rec41 {} { ;# QS_QF_ISR_ENTRY
-}
-proc ::qspy::rec42 {} { ;# QS_QF_ISR_EXIT
-}
-proc ::qspy::rec43 {} { ;# QS_QF_INT_DISABLE
-}
-proc ::qspy::rec44 {} { ;# QS_QF_INT_ENABLE
-}
-proc ::qspy::rec45 {} { ;# QS_QF_ACTIVE_POST_ATTEMPT
-}
-proc ::qspy::rec46 {} { ;# QS_QF_EQUEUE_POST_ATTEMPT
-}
-proc ::qspy::rec47 {} { ;# QS_QF_MPOOL_GET_ATTEMPT
-}
-proc ::qspy::rec48 {} { ;# QS_QF_RESERVED1
-}
-proc ::qspy::rec49 {} { ;# QS_QF_RESERVED0
-}
-
-# [50] built-in scheduler records
-proc ::qspy::rec50 {} { ;# QS_SCHED_LOCK
-}
-proc ::qspy::rec51 {} { ;# QS_SCHED_UNLOCK
-}
-proc ::qspy::rec52 {} { ;# QS_SCHED_NEXT
-}
-proc ::qspy::rec53 {} { ;# QS_SCHED_IDLE
-}
-proc ::qspy::rec54 {} { ;# QS_SCHED_RESUME
-}
-
-# [55] Additional QEP records
-proc ::qspy::rec55 {} { ;# QS_QEP_TRAN_HIST
-}
-proc ::qspy::rec56 {} { ;# QS_QEP_TRAN_EP
-}
-proc ::qspy::rec57 {} { ;# QS_QEP_TRAN_XP
-}
-proc ::qspy::rec58 {} { ;# QS_QEP_RESERVED1
-}
-proc ::qspy::rec59 {} { ;# QS_QEP_RESERVED0
-}
-
-# Miscellaneous QS records
-proc ::qspy::rec60 {} { ;# QS_SIG_DICT
-}
-proc ::qspy::rec61 {} { ;# QS_OBJ_DICT
-}
-proc ::qspy::rec62 {} { ;# QS_FUN_DICT
-}
-proc ::qspy::rec63 {} { ;# QS_USR_DICT
-}
-
-# proc ::qspy::64 ;# QS_TARGET_INFO not used, see proc recINFO
-
-proc ::qspy::rec65 {} { ;# QS_RESERVED0
-}
-proc ::qspy::rec66 {} { ;# QS_RX_STATUS
-}
-proc ::qspy::rec67 {} { ;# QS_TEST_STATUS
-}
-proc ::qspy::rec68 {} { ;# QS_PEEK_DATA
-}
-proc ::qspy::rec69 {} { ;# QS_ASSERT_FAIL
-}
-
diff --git a/qspy/tcl/img/logo_qp32.gif b/qspy/tcl/img/logo_qp32.gif
deleted file mode 100644
index d6aeba3..0000000
Binary files a/qspy/tcl/img/logo_qp32.gif and /dev/null differ
diff --git a/qspy/tcl/img/logo_qspy128.gif b/qspy/tcl/img/logo_qspy128.gif
deleted file mode 100644
index e2035bd..0000000
Binary files a/qspy/tcl/img/logo_qspy128.gif and /dev/null differ
diff --git a/qspy/tcl/img/logo_qspy32.gif b/qspy/tcl/img/logo_qspy32.gif
deleted file mode 100644
index 3fe3c0f..0000000
Binary files a/qspy/tcl/img/logo_qspy32.gif and /dev/null differ
diff --git a/qspy/tcl/img/logo_qspy64.gif b/qspy/tcl/img/logo_qspy64.gif
deleted file mode 100644
index 6a4a671..0000000
Binary files a/qspy/tcl/img/logo_qspy64.gif and /dev/null differ
diff --git a/qspy/tcl/qspy.tcl b/qspy/tcl/qspy.tcl
deleted file mode 100644
index ff9b893..0000000
--- a/qspy/tcl/qspy.tcl
+++ /dev/null
@@ -1,483 +0,0 @@
-##
-# @file
-# @ingroup qpspy
-# @brief Communication services with the QSPY back-end.
-# @usage
-# This script is to be sourced into QSPY front-ends, such as qutest.tcl or
-# qspyview.tcl
-
-## @cond
-#-----------------------------------------------------------------------------
-# Product: QSPY -- QSPY interface package
-# Last updated for version 6.8.0
-# Last updated on 2020-03-17
-#
-# Q u a n t u m L e a P s
-# ------------------------
-# Modern Embedded Software
-#
-# Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved.
-#
-# This program is open source software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Alternatively, this program may be distributed and modified under the
-# terms of Quantum Leaps commercial licenses, which expressly supersede
-# the GNU General Public License and are specifically designed for
-# licensees interested in retaining the proprietary status of their code.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-# Contact information:
-#
-#
-#-----------------------------------------------------------------------------
-# @endcond
-
-package provide qspy 6.8
-
-package require Tcl 8.4 ;# need at least Tcl 8.4
-package require udp ;# need the UDP sockets for Tcl
-
-## @brief facilities for communication with the @ref qspy "QSPY" back-end
-#
-# @note
-# The QSPY back-end distinguishes between two types of messages:@n
-# 1. messages intended for QSPY only (e.g., attach/detach a front-end).
-# These messages are called **packets**.
-# 2. messages intended for the embedded Target, which the QSPY back-end
-# merely passes to the QS component running inside the Target.
-# These messages are called **records**.
-#
-namespace eval ::qspy {
- # exported commands...
- namespace export \
- attach \
- detach \
- udp_port \
- udp_remote \
- sendPkt \
- sendAttach \
- sendEvent
-
- # variables...
-
- # communication parameters (can be overridden in command-line)
- variable theSocket 0 ;#< UDP socket for communication with QSPY
- variable theIsAttached 0 ;#< is the front-end attached to QSPY?
-
- variable theHaveTarget 0 ;#< have target info
- variable theTstamp "Target: UNKNOWN" ;#< build time stamp from Target
-
- variable thePkt ;#< the current (most recent) packet/record
-
- variable theRxRecCnt 0 ;#< count of records received since attach
- variable theRxRecSeq 0 ;#< the last received record sequence num
- variable theErRecCnt 0 ;#< count of record errors since attach
-
- variable theRxPktCnt 0 ;#< count of packets received since attach
- variable theTxPktCnt 0 ;#< count of packets transmitted since attach
- variable theRxPktSeq 0 ;#< the last received packet sequence num
- variable theTxPktSeq 0 ;#< the last trasmitted packet sequence num
- variable theErPktCnt 0 ;#< count of packet errors since attach
-
- ## array of formats recevied from QS via QSPY
- variable theFmt
- array set theFmt {
- objPtr i
- funPtr i
- tstamp i
- sig s
- evtSize s
- queueCtr c
- poolCtr s
- poolBlk s
- tevtCtr s
- }
-
- ## @brief array of record IDs (to Target).
- # @sa enum QSpyRxRecords in qs.h/qs_copy.h
- variable QS_RX
- array set QS_RX {
- INFO 0
- COMMAND 1
- RESET 2
- TICK 3
- PEEK 4
- POKE 5
- FILL 6
- TEST_SETUP 7
- TEST_TEARDOWN 8
- TEST_PROBE 9
- GLB_FILTER 10
- LOC_FILTER 11
- AO_FILTER 12
- CURR_OBJ 13
- CONTINUE 14
- QUERY_CURR 15
- EVENT 16
- }
-
- ## @brief array of QS object kinds (to Target).
- # @sa enum QSpyObjKind in qs_copy.h
- variable QS_OBJ_KIND
- array set QS_OBJ_KIND {
- SM 0
- AO 1
- MP 2
- EQ 3
- TE 4
- AP 5
- SM_AO 6
- }
-
- ## @brief array of packet IDs (to QSPY Back-End).
- # @sa enum QSpyCommands in qspy.h
- variable QSPY
- array set QSPY {
- ATTACH 128
- DETACH 129
- SAVE_DICT 130
- SCREEN_OUT 131
- BIN_OUT 132
- MATLAB_OUT 133
- MSCGEN_OUT 134
- SEND_EVENT 135
- SEND_LOC_FILTER 136
- SEND_CURR_OBJ 137
- SEND_COMMAND 138
- SEND_TEST_PROBE 139
- }
-
-} ;# namespace eval
-
-# command procedures =========================================================
-
-## @brief attach to the QSPY back-end
-#
-# @description
-# This function "attaches" a given script (front-end) to the QSPY back-end.
-# If the UDP socket could open successfully, the function configures the
-# socket and installs the onRecvPkt() procedure as the event handler for
-# reading from the UDP socket.
-#
-# @param[in] host name or IP address of the host running QSPY back-end.
-# Optionally, the host name might contain the port number
-# provided immediately after ':', e.g.: 192.168.1.24:7705
-# @param[in] local_port local UDP port at which to open connection to QSPY.
-# The default value of 0 means that the system will choose a port.
-# @param[in] channels QSPY data channels (binary or/and text) to connect to.
-#
-# @returns
-# true if the connection has been established or false if not.
-#
-# @sa onRecvPkt()
-#
-proc ::qspy::attach {host {local_port 0} {channels 1}} {
- variable theSocket
- variable theIsAttached
-
- set theIsAttached 0
-
- # open the UDP socket for communication with QSPY...
- if {$local_port} { ;# local_port specificed explicitly?
- set err [catch {udp_open $local_port} theSocket]
- } else { ;# local_port not specified--let the system choose a port
- set err [catch {udp_open} theSocket]
- }
-
- if {$err} {
- return false
- } else {
- # parse the host name and optional port number...
- set host_port [split $host :]
- if {[lindex $host_port 1] == ""} {
- lappend host_port 7701 ;# the default UDP port of QSPY
- }
-
- # configure the UDP socket...
- fconfigure $theSocket -remote $host_port
- fconfigure $theSocket -myport
- fconfigure $theSocket -buffering none
- fconfigure $theSocket -buffersize 4096
- fconfigure $theSocket -translation binary
- fconfigure $theSocket -blocking 1
-
- fileevent $theSocket readable [namespace code onRecvPkt]
-
- sendAttach $channels ;# send the attach packet to QSPY
-
- #puts "UDP local port [udp_conf $theSocket -myport]"
-
- return true
- }
-}
-#.............................................................................
-## @brief detach from the QSPY back-end
-#
-# @description
-# This function should be called to free up the connection to the QSPY
-# back-end.
-#
-# @sa onCleanup()
-#
-proc ::qspy::detach {} {
- variable theSocket
- variable theIsAttached
- variable QSPY
- sendPkt [binary format c $QSPY(DETACH)]
- after 300 ;# wait until the packet comes out
- set theIsAttached 0
- close $theSocket
- set theSocket 0 ;# invalidate the socket
-}
-#.............................................................................
-## @brief obtain the UDP port number
-#
-# @sa http://tcludp.sourceforge.net/#3
-#
-proc ::qspy::udp_port {} {
- variable theSocket
- return [udp_conf $theSocket -myport]
-}
-#.............................................................................
-## @brief obtain the remote host and port number
-#
-# @sa http://tcludp.sourceforge.net/#3
-#
-proc ::qspy::udp_remote {} {
- variable theSocket
- return [udp_conf $theSocket -remote]
-}
-
-
-# receive/send from the QSPY Back-End ========================================
-## @brief fileevent handler for the UDP socket to the QSPY back-end
-#
-# @description
-# This function is called once per each UDP packet received from QSPY.
-#
-# @sa proc attach(), line:@n
-# `fileevent $theSocket readable [namespace code onRecvPkt]`
-proc ::qspy::onRecvPkt {} { ;# socket event handler
- variable theSocket
- variable thePkt
-
- set thePkt [read $theSocket] ;# read the packet from QSPY
- binary scan $thePkt cc seq pktId ;# get the sequence num and packet-ID
- set seq [expr $seq & 0xFF] ;# remove sign-extension
-
- if {$pktId >= 0} { ;# is it QS record from the Target?
- variable theRxRecCnt
- incr theRxRecCnt ;# one more record received
-
- variable theRxRecSeq
- set theRxRecSeq [expr ($theRxRecSeq + 1) & 0xFF]
- if {$theRxRecSeq != $seq} { ;# do we have a sequence error?
- set theRxRecSeq $seq
- variable theErRecCnt
- incr theErRecCnt
- }
-
- eval {rec$pktId} ;# call the record procedure (don't catch errors)
-
- } else { ;# this is QSPY packet to the Front-End
- variable theRxPktCnt
- incr theRxPktCnt ;# one more packet received
-
- variable theRxPktSeq
- set theRxPktSeq [expr ($theRxPktSeq + 1) & 0xFF]
- if {$theRxPktSeq != $seq} { ;# do we have a sequence error?
- set theRxPktSeq $seq
- variable theErPktCnt
- incr theErPktCnt
- }
-
- set pktId [expr $pktId & 0xFF] ;# remove the sign-extension
- eval {pkt$pktId} ;# call the packet procedure (don't catch errors)
- }
-}
-#.............................................................................
-## @brief send a UDP packet to the QSPY back-end
-#
-# @description
-# The function increments the sequence number of transmitted packets
-# and pre-pends it in front of the binary packet data to form the
-# complete UDP packet as expected by the QSPY back-end. This allows
-# the QSPY back-end to detect any dropped packets (gaps in the sequence).
-#
-# @param[in] pkt packet binary data (created by `binary format ...`)
-#
-proc ::qspy::sendPkt {pkt} {
- variable theTxPktSeq
- incr theTxPktSeq ;# increment the transmitted packet sequence number
-
- variable theSocket
- puts -nonewline $theSocket [binary format c $theTxPktSeq]$pkt
-
- variable theTxPktCnt
- incr theTxPktCnt ;# one more packet transmitted
-}
-#.............................................................................
-## @brief send the `ATTACH` packet to the QSPY back-end
-proc ::qspy::sendAttach {{channels 1}} {
- variable QSPY
- sendPkt [binary format cc $QSPY(ATTACH) $channels]
-}
-#.............................................................................
-## @brief send the local-filter packet to the Target/QSPY
-proc ::qspy::sendLocFilter {kind obj} {
- variable QS_RX
- variable QSPY
- variable theFmt
- variable QS_OBJ_KIND
- if [string is integer $obj] { ;# send directly to Target
- sendPkt [binary format cc$theFmt(objPtr) \
- $QS_RX(LOC_FILTER) $QS_OBJ_KIND($kind) $obj]
- } else { ;# set to QSPY to provide 'obj' from Obj Dictionary
- sendPkt [binary format cc$theFmt(objPtr) \
- $QSPY(SEND_LOC_FILTER) $QS_OBJ_KIND($kind) 0]$obj\0
- }
-}
-#.............................................................................
-## @brief send the current-object packet to the Target/QSPY
-proc ::qspy::sendCurrObj {kind obj} {
- variable QS_RX
- variable QSPY
- variable theFmt
- variable QS_OBJ_KIND
- if [string is integer $obj] { ;# send directly to Target
- sendPkt [binary format cc$theFmt(objPtr) \
- $QS_RX(CURR_OBJ) $QS_OBJ_KIND($kind) $obj]
- } else { ;# set to QSPY to provide 'obj' from Obj Dictionary
- sendPkt [binary format cc$theFmt(objPtr) \
- $QSPY(SEND_CURR_OBJ) $QS_OBJ_KIND($kind) 0]$obj\0
- }
-}
-#.............................................................................
-## @brief send the query-current packet to the Target/QSPY
-proc ::qspy::sendQueryCurr {kind} {
- variable QS_RX
- variable QSPY
- variable QS_OBJ_KIND
- sendPkt [binary format cc $QS_RX(QUERY_CURR) $QS_OBJ_KIND($kind)]
-}
-
-#.............................................................................
-## @brief send the current-object packet to the Target/QSPY
-proc ::qspy::sendTestProbe {fun data} {
- variable QS_RX
- variable QSPY
- variable theFmt
- if [string is integer $fun] { ;# set directly to Target
- sendPkt [binary format ci$theFmt(funPtr) \
- $QS_RX(TEST_PROBE) $data $fun]
- } else { ;# set to QSPY to provide 'fun' from Fun Dictionary
- sendPkt [binary format ci$theFmt(funPtr) \
- $QSPY(SEND_TEST_PROBE) $data 0]$fun\0
- }
-}
-#.............................................................................
-## @brief send an event to the Target (via the QSPY back-end)
-#
-# @description
-# The function sends a event to the embedded Target running QS-RX.
-# The event is dynamically allocated inside the Target (with `Q_NEW()`),
-# filled with the provided @p sig and @p par parameters, and posted
-# to the AO object with the given priority @p prio if it is range
-# (1..QF_MAX_ACTIVE). Additionally, the following special values of the
-# @p prio parameter are as follows:@n
-# - 255 dispatch event to the Current Object(SM)
-# - 254 take the top-most initial transition in the Current Object (SM)
-# - 253 post event to the Current Object (AO)
-#
-# @param[in] prio priority of the AO to receive the event or a special value
-# @param[in] sig signal of the event, either number or string from dictionary
-# @param[in] par event parameters (created by `binary format ...`)
-#
-# @note
-# If provided, the optional @p par parameter must be provided in the native
-# binary format expected by the spcific Target system. Specifically, this
-# formatting must use the same endianness as the Target and must include any
-# padding that the Target compiler might apply.
-#
-proc ::qspy::sendEvent {prio sig {par ""}} {
- variable QS_RX
- variable QSPY
- variable theFmt
- set len [string length $par]
-
- #puts "event Sig=$sig,Len=$len"
- if [string is integer $sig] { ;# send directly to Target
- sendPkt [binary format cc$theFmt(sig)s \
- $QS_RX(EVENT) $prio $sig $len]$par
- } else {
- sendPkt [binary format cc$theFmt(sig)s \
- $QSPY(SEND_EVENT) $prio 0 $len]$par$sig\0
- }
-}
-
-# QSPY packet handlers =======================================================
-#.............................................................................
-## @brief handler for the `QSPY_DETACH` reply from QSPY.
-proc ::qspy::pkt129 {} {
- detach
-}
-
-# [60] Miscellaneous QS records ==============================================
-#.............................................................................
-## @brief handler for the `QS_TARGET_INFO` record from the Target.
-proc ::qspy::rec64 {} {
- variable thePkt
-
- variable theIsAttached
- variable theHaveTarget
- variable theTstamp
- variable theRxRecCnt
- variable theErRecCnt
- variable theRxPktCnt
- variable theTxPktCnt
- variable theErPktCnt
-
- binary scan $thePkt xxcsccccccccccccc \
- isReset \
- qpVersion \
- b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b10 b11 b12
-
- variable theFmt
- set fmt [list ? c s ? i ? ? ? w]
- set theFmt(objPtr) [lindex $fmt [expr $b3 & 0x0F]]
- set theFmt(funPtr) [lindex $fmt [expr ($b3 & 0xFF) >> 4]]
- set theFmt(tstamp) [lindex $fmt [expr $b4 & 0x0F]]
- set theFmt(sig) [lindex $fmt [expr $b0 & 0x0F]]
- set theFmt(evtSize) [lindex $fmt [expr ($b0 & 0xFF) >> 4]]
- set theFmt(queueCtr) [lindex $fmt [expr $b1 & 0x0F]]
- set theFmt(poolCtr) [lindex $fmt [expr ($b2 & 0xFF) >> 4]]
- set theFmt(poolBlk) [lindex $fmt [expr $b2 & 0x0F]]
- set theFmt(tevtCtr) [lindex $fmt [expr ($b1 & 0xFF) >> 4]]
-
- # reset the variables for the new connection...
- set theRxRecCnt 0
- set theErRecCnt 0
- set theRxPktCnt 1
- set theErPktCnt 0
- set theIsAttached 1
- set theHaveTarget 1
- set theTstamp [format "Target: %02d%02d%02d_%02d%02d%02d" \
- [expr $b12 & 0xFF] [expr $b11 & 0xFF] [expr $b10 & 0xFF] \
- [expr $b9 & 0xFF] [expr $b8 & 0xFF] [expr $b7 & 0xFF]]
-
- if {$isReset} {
- eval {recRESET} ;# call the record procedure (don't catch errors)
- } else {
- eval {recINFO} ;# call the record procedure (don't catch errors)
- }
-}
diff --git a/qspy/tcl/qspyview.tcl b/qspy/tcl/qspyview.tcl
deleted file mode 100644
index ebfff12..0000000
--- a/qspy/tcl/qspyview.tcl
+++ /dev/null
@@ -1,1220 +0,0 @@
-##
-# @file
-# @ingroup qpspy
-# @brief QSpyView front-end main script.
-# @description
-# QSpyView is a graphical visualization facility for embedded systems.
-# This script implements a GUI-based front-end to the QSPY back-and for
-# displaying the data coming from the Target system and for providing
-# a GUI to the embedded Target.
-#
-# @usage
-# wish qspyview.tcl [extension_script] [host[:port]] [local_port]
-
-## @cond
-#-----------------------------------------------------------------------------
-# Product: QSPY -- GUI front-end to the QSPY host utility
-# Last updated for version 6.8.2
-# Last updated on 2020-07-17
-#
-# Q u a n t u m L e a P s
-# ------------------------
-# Modern Embedded Software
-#
-# Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved.
-#
-# This program is open source software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Alternatively, this program may be distributed and modified under the
-# terms of Quantum Leaps commercial licenses, which expressly supersede
-# the GNU General Public License and are specifically designed for
-# licensees interested in retaining the proprietary status of their code.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-# Contact information:
-#
-#
-#-----------------------------------------------------------------------------
-# @endcond
-
-# this version of qspyview
-set VERSION 6.8.2
-
-package provide qspyview 6.6
-
-package require Tcl 8.4 ;# need at least Tcl 8.4
-package require Tk 8.4 ;# need at least Tk 8.4
-
-# home directory of this Tcl script file
-set HOME [file dirname [file normalize [info script]]]
-
-source $HOME/qspy.tcl ;# QSPY interface
-
-# command procedures =========================================================
-## @brief main entry point to the QSpyView front-end application
-# @description
-# This function processes the command-line arguments and attaches
-# the QSpyView front-end to the indicated QSPY back-end.
-proc main {} {
- # set defaults for communication with the QSPY back-end
- # NOTE (all these can be overridden by command-line options)
- set qspy_host "localhost"
- set local_port 0 ;# the system will choose the local UDP port
-
- # command-line processing...
- # wish qspyview.tcl [extension_script] [host[:port]] [local_port]
- #
- global ::argc ::argv theHostExe
- if {$::argc > 1} { ;# argv(1) -- host/port running QSPY
- set qspy_host [lindex $::argv 1]
- }
- if {$::argc > 2} { ;# argv(2) -- local port
- set local_port [lindex $::argv 2]
- }
-
- # add a trace to monitor the QSPY socket counters
- trace add variable ::qspy::theSocket write traceSocket
-
- # add a trace to monitor the QSPY attachment state
- trace add variable ::qspy::theIsAttached write traceIsAttached
-
- # attach to QSPY...
- if {[::qspy::attach $qspy_host $local_port]} {
- after 200 ;# wait for the Target to respond to the info request
- update
-
- if {!$::qspy::theIsAttached} { ;# attached?
- onAttach ;# open the "Attach..." dialog box
- }
- } else { ;# failed to attach
- tk_messageBox -type ok -icon error -message \
- "Can't open the UDP socket.\n\
- Check if another instance\n\
- of qspyview is already running."
- exit
- }
-
- # default setting of the QS Filters...
- global theGlbFilter
- set theGlbFilter \
- "0000000000000000000000000000000000000000000000000000000000000000"
- append theGlbFilter \
- "0000001111111111111111111111111111111111111111111111111111111000"
-
- global theLocFilter
- array set theLocFilter {
- SM 0
- AO 0
- MP 0
- EQ 0
- TE 0
- AP 0
- }
-
- global theCurrObj
- array set theCurrObj {
- SM 0
- AO 0
- MP 0
- EQ 0
- TE 0
- AP 0
- }
-
- global theAoFilter
- set theAoFilter 0 ;# filter open to all AOs
-
- global theCommand
- array set theCommand {
- cmdId 0
- param1 0
- param2 0
- param3 0
- }
-
- global theEvent
- array set theEvent {
- prio 0
- sig 0
- fmt1 "" dat1 ""
- fmt2 "" dat2 ""
- fmt3 "" dat3 ""
- fmt4 "" dat4 ""
- fmt5 "" dat5 ""
- fmt6 "" dat6 ""
- fmt7 "" dat7 ""
- fmt8 "" dat8 ""
- fmt9 "" dat9 ""
- fmt10 "" dat10 ""
- }
-
- global thePeek
- array set thePeek {
- obj 0
- offs 0
- size 1
- len 0
- }
-
- global thePoke
- array set thePoke {
- obj 0
- offs 0
- fmt c
- data 0
- }
-}
-#.............................................................................
-## @brief handler for the `QSPY_ATTACH` reply from QSPY.
-proc ::qspy::pkt128 {} {
- variable theIsAttached
- set theIsAttached 1
-
- # send the INFO request to the Target
- variable QS_RX
- sendPkt [binary format c $QS_RX(INFO)]
-}
-#.............................................................................
-## @brief trace handler to monitor the QSPY socket counters (see main())
-proc traceSocket {varname key op} {
- upvar $varname var
- if {$var == 0} { ;# socket invalidated?
- exit
- }
-}
-#.............................................................................
-## @brief trace handler to monitor the QSPY attachment state (see main())
-proc traceIsAttached {varname key op} {
- upvar $varname var
- if {$var} {
- variable ::dialog::done
- set ::dialog::done 2 ;# will cause exit from the onAttach dialog
- }
-}
-
-#.............................................................................
-## @brief cleanup before exiting the QSpyView front-end
-proc onCleanup {} {
- ::qspy::detach ;# detach from QSPY
- exit
-}
-#.............................................................................
-## @brief displays the "About" dialog box for QSpyView
-proc onAbout {} {
- global argv VERSION
-
- set top [::dialog::create .aboutDlg "About QspyView"]
- set form $top.form
-
- label $form.logo -image ::img::logo128
- pack $form.logo -side left
-
- label $form.lbl1 -text "QSpyView front-end $VERSION"
- pack $form.lbl1 -side top
- label $form.lbl2 -text "Extension: [join $argv]"
- pack $form.lbl2 -side top
- label $form.lbl3 -text "Documentation:\nhttps://state-machine.com/qspy/"
- pack $form.lbl3 -side top
- label $form.lbl4 -text \
- "Copyright (c) 2005-2018 Quantum Leaps\nstate-machine.com"
- pack $form.lbl4 -side top
-
- variable ::dialog::done
- button $top.controls.btn0 -text " OK " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 0}
-
- ::dialog::wait $top
- destroy $top
-}
-#.............................................................................
-## @brief Attaches QSpyView front-end to the QSPY back-end
-# @description
-# This function uses the information provided to QSpyView in the
-# command-line parameters, such as host, port and local_port
-proc onAttach {} {
- set top [::dialog::create .attachDlg "Attach to QSPY"]
- set form $top.form
- label $form.lbl1 -text "Make sure that QSPY is running"
- pack $form.lbl1 -side top
- label $form.lbl2 -text "and the option -u is used."
- pack $form.lbl2 -side top
- label $form.lbl3 -text "Press OK to re-try to attach or"
- pack $form.lbl3 -side top
- label $form.lbl4 -text "Cancel to quit."
- pack $form.lbl4 -side top
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- # perform cleanup upon closing this dialog
- wm protocol $top WM_DELETE_WINDOW onCleanup
-
- ::qspy::sendAttach ;# re-send the attach command
-
- set retry true
- while {$retry} {
- set done [::dialog::wait $top]
-
- if {$done == 0} { ;# Cancel pressed
- onCleanup
- set retry false
- } elseif {$done == 1} { ;# OK
- ::qspy::sendAttach ;# re-send the attach command
- } else { ;# attached to QSPY
- set retry false
- }
- }
- destroy $top
-}
-#.............................................................................
-## @brief displays the "Global Filters" dialog box for QSpyView
-proc onGlbFilters {} {
-
- set labels [list \
- QS_EMPTY STATE_ENTRY \
- STATE_EXIT STATE_INIT \
- INIT_TRAN INTERN_TRAN \
- TRAN IGNORED \
- DISPATCH UNHANDLED \
- ACTIVE_DEFER ACTIVE_RECALL \
- ACTIVE_SUBSCRIBE ACTIVE_UNSUBSCR \
- ACTIVE_POST ACTIVE_POST_LIFO \
- ACTIVE_GET ACTIVE_GET_LAST \
- ACTIVE_RECALL_ATMPT EQUEUE_POST \
- EQUEUE_POST_LIFO EQUEUE_GET \
- EQUEUE_GET_LAST RESERVED2 \
- MPOOL_GET MPOOL_PUT \
- QF_PUBLISH QF_NEW_REF \
- Q_NEW QF_GC_ATTEMPT \
- QF_GC QF_TICK \
- TIMEEVT_ARM TIMEEVT_AUTO_DARM \
- TIMEEVT_DISARM_ATMPT TIMEEVT_DISARM \
- TIMEEVT_REARM TIMEEVT_POST \
- QF_DELETE_REF QF_CRIT_ENTRY \
- QF_CRIT_EXIT QF_ISR_ENTRY \
- QF_ISR_EXIT QF_INT_DISABLE \
- QF_INT_ENABLE ACTIVE_POST_ATMPT \
- EQUEUE_POST_ATMPT MPOOL_GET_ATMPT \
- MUTEX_LOCK MUTEX_UNLOCK \
- SCHED_LOCK SCHED_UNLOCK \
- SCHED_NEXT SCHED_IDLE \
- SCHED_RESUME TRAN_HIST \
- TRAN_EP TRAN_XP \
- TEST_PAUSED TEST_PROBE_GET \
- QS_SIG_DICT QS_OBJ_DICT \
- QS_FUN_DICT QS_USR_DICT \
- QS_TARGET_INFO QS_TARGET_DONE \
- QS_RX_STATUS QS_MSC_RESERVED1 \
- QS_PEEK_DATA QS_ASSERT_FAIL \
- ]
- global theGlbFilter
- set top [::dialog::create .glbFilter "Global Filters"]
- set form $top.form
-
- # scrollable content...
- scrollbar $form.sbar -command "$form.vport yview"
- pack $form.sbar -side right -fill y
- canvas $form.vport -height 410 -yscrollcommand "$form.sbar set"
- pack $form.vport -side top -fill both -expand true
-
- set pane [frame $form.vport.pane]
- $form.vport create window 0 0 -anchor nw -window $form.vport.pane
- bind $form.vport.pane "filterDlg_resize $form"
-
- global filter
- for {set i 1} {$i < 60} {incr i} {
- checkbutton $pane.f$i -text [lindex $labels $i] -variable filter($i)
- if {[string index $theGlbFilter $i]} {
- $pane.f$i select
- }
- }
- for {set i 100} {$i < 125} {incr i} {
- checkbutton $pane.f$i -variable filter($i) \
- -text "QS_USER($i)"
- if {[string index $theGlbFilter $i]} {
- $pane.f$i select
- }
- }
-
- label $pane.std -text "===== Standard QS recrods ====="
- label $pane.sm -text "SM records..."
- label $pane.ao -text "AO records..."
- label $pane.qf -text "QF records..."
- label $pane.te -text "TE records..."
- label $pane.eq -text "EQ records..."
- label $pane.mp -text "MP records..."
- label $pane.sc -text "SC records..."
- label $pane.tst -text "TEST records..."
- grid $pane.std -columnspan 6
- grid $pane.sm $pane.ao $pane.qf $pane.eq $pane.te
- grid $pane.f1 $pane.f10 $pane.f26 $pane.f19 $pane.f32
- grid $pane.f2 $pane.f11 $pane.f27 $pane.f20 $pane.f33
- grid $pane.f3 $pane.f12 $pane.f28 $pane.f21 $pane.f34
- grid $pane.f4 $pane.f13 $pane.f29 $pane.f22 $pane.f35
- grid $pane.f5 $pane.f14 $pane.f30 $pane.f46 $pane.f36
- grid $pane.f6 $pane.f15 $pane.f31 $pane.sc $pane.f37
- grid $pane.f7 $pane.f16 $pane.f38 $pane.f48 $pane.mp
- grid $pane.f8 $pane.f17 $pane.f39 $pane.f49 $pane.f24
- grid $pane.f9 $pane.f18 $pane.f40 $pane.f50 $pane.f25
- grid $pane.f55 $pane.f45 $pane.f41 $pane.f51 $pane.f47
- grid $pane.f56 x $pane.f42 $pane.f52 $pane.tst
- grid $pane.f57 $pane.f23 $pane.f43 $pane.f53 $pane.f58
- grid x x $pane.f44 $pane.f54 $pane.f59
-
- label $pane.ua -text "===== User QS recrods ====="
- label $pane.u0 -text "U0 records..."
- label $pane.u1 -text "U1 records..."
- label $pane.u2 -text "U2 records..."
- label $pane.u3 -text "U3 records..."
- label $pane.u4 -text "U4 records..."
- grid $pane.ua -columnspan 5
- grid $pane.u0 $pane.u1 $pane.u2 $pane.u3 $pane.u4
- grid $pane.f100 $pane.f105 $pane.f110 $pane.f115 $pane.f120
- grid $pane.f101 $pane.f106 $pane.f111 $pane.f116 $pane.f121
- grid $pane.f102 $pane.f107 $pane.f112 $pane.f117 $pane.f122
- grid $pane.f103 $pane.f108 $pane.f113 $pane.f118 $pane.f123
- grid $pane.f104 $pane.f109 $pane.f114 $pane.f119 $pane.f124
-
- for {set i 1} {$i < 60} {incr i} {
- grid configure $pane.f$i -sticky w
- }
- for {set i 100} {$i < 125} {incr i} {
- grid configure $pane.f$i -sticky w
- }
- grid configure $pane.sm -sticky w
- grid configure $pane.ao -sticky w
- grid configure $pane.qf -sticky w
- grid configure $pane.te -sticky w
- grid configure $pane.eq -sticky w
- grid configure $pane.mp -sticky w
- grid configure $pane.sc -sticky w
- grid configure $pane.tst -sticky w
-
- grid configure $pane.u0 -sticky w
- grid configure $pane.u1 -sticky w
- grid configure $pane.u2 -sticky w
- grid configure $pane.u3 -sticky w
- grid configure $pane.u4 -sticky w
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- # wait for the user selection
- set done [::dialog::wait $top]
-
- if {$done == 1} { ;# dialog accepted?
- set theGlbFilter ""
- for {set i 0} {$i < 128} {incr i} {
- if [info exists filter($i)] {
- if {$filter($i)} {
- append theGlbFilter 1
- } else {
- append theGlbFilter 0
- }
- } else {
- append theGlbFilter 0
- }
- }
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format ccb128 $::qspy::QS_RX(GLB_FILTER) \
- 16 $theGlbFilter]
- }
- destroy $top
-}
-#.............................................................................
-## @brief helper proc for the scrollable Filters dialog box
-proc filterDlg_resize {win} {
- set bbox [$win.vport bbox all]
- set wid [winfo width $win.vport.pane]
- $win.vport configure -width $wid \
- -scrollregion $bbox -yscrollincrement 0.2i
-}
-
-#.............................................................................
-## @brief displays the "Local Filters" dialog box for QSpyView
-proc onLocFilters {} {
- set top [::dialog::create .locFilters "Local Filters"]
- set form $top.form
-
- global theLocFilter
- ::dialog::addEntry $top "QS_FILTER_SM_OBJ:" 16 $theLocFilter(SM)
- ::dialog::addEntry $top "QS_FILTER_AO_OBJ:" 16 $theLocFilter(AO)
- ::dialog::addEntry $top "QS_FILTER_MP_OBJ:" 16 $theLocFilter(MP)
- ::dialog::addEntry $top "QS_FILTER_EQ_OBJ:" 16 $theLocFilter(EQ)
- ::dialog::addEntry $top "QS_FILTER_TE_OBJ:" 16 $theLocFilter(TE)
- ::dialog::addEntry $top "QS_FILTER_AP_OBJ:" 16 $theLocFilter(AP)
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- set done [::dialog::wait $top]
-
- if {$done == 1} { ;# dialog accepted?
- set theLocFilter(SM) [$form.entry1 get]
- set theLocFilter(AO) [$form.entry2 get]
- set theLocFilter(MP) [$form.entry3 get]
- set theLocFilter(EQ) [$form.entry4 get]
- set theLocFilter(TE) [$form.entry5 get]
- set theLocFilter(AP) [$form.entry6 get]
-
- ::qspy::sendLocFilter SM $theLocFilter(SM)
- ::qspy::sendLocFilter AO $theLocFilter(AO)
- ::qspy::sendLocFilter MP $theLocFilter(MP)
- ::qspy::sendLocFilter EQ $theLocFilter(EQ)
- ::qspy::sendLocFilter TE $theLocFilter(TE)
- ::qspy::sendLocFilter AP $theLocFilter(AP)
- }
- destroy $top
-}
-#.............................................................................
-## @brief displays the "Current Objects" dialog box for QSpyView
-proc onCurrObjs {} {
- set top [::dialog::create .currObj "Current Objects"]
- set form $top.form
-
- global theCurrObj
- ::dialog::addEntry $top "SM:" 16 $theCurrObj(SM)
- ::dialog::addEntry $top "AO:" 16 $theCurrObj(AO)
- ::dialog::addEntry $top "MP:" 16 $theCurrObj(MP)
- ::dialog::addEntry $top "EQ:" 16 $theCurrObj(EQ)
- ::dialog::addEntry $top "TE:" 16 $theCurrObj(TE)
- ::dialog::addEntry $top "AP:" 16 $theCurrObj(AP)
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- set done [::dialog::wait $top]
-
- if {$done == 1} { ;# dialog accepted?
- set theCurrObj(SM) [$form.entry1 get]
- set theCurrObj(AO) [$form.entry2 get]
- set theCurrObj(MP) [$form.entry3 get]
- set theCurrObj(EQ) [$form.entry4 get]
- set theCurrObj(TE) [$form.entry5 get]
- set theCurrObj(AP) [$form.entry6 get]
-
- ::qspy::sendCurrObj SM $theCurrObj(SM)
- ::qspy::sendCurrObj AO $theCurrObj(AO)
- ::qspy::sendCurrObj MP $theCurrObj(MP)
- ::qspy::sendCurrObj EQ $theCurrObj(EQ)
- ::qspy::sendCurrObj TE $theCurrObj(TE)
- ::qspy::sendCurrObj AP $theCurrObj(AP)
- }
- destroy $top
-}
-#.............................................................................
-## @brief displays the "Active-Object Filter" dialog box for QSpyView
-proc onAoFilter {} {
- set top [::dialog::create .aoFilter "AO Filter"]
- set form $top.form
-
- global theAoFilter
- ::dialog::addEntry $top "prio:" 3 $theAoFilter
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- focus $form.entry1 ;# so that the user can immediately edit prio
-
- set done [::dialog::wait $top]
-
- if {$done == 1} { ;# dialog accepted?
- set theAoFilter [$form.entry1 get]
-
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format cc $::qspy::QS_RX(AO_FILTER) $theAoFilter]
- }
- destroy $top
-}
-#.............................................................................
-## @brief displays the "Command to Target" dialog box for QSpyView
-proc onCommand {} {
- set top [::dialog::create .command "Command"]
- set form $top.form
-
- global theCommand
- ::dialog::addEntry $top "cmdId :" 6 $theCommand(cmdId)
- ::dialog::addEntry $top "param1:" 16 $theCommand(param1)
- ::dialog::addEntry $top "param2:" 16 $theCommand(param2)
- ::dialog::addEntry $top "param3:" 16 $theCommand(param3)
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- focus $form.entry1 ;# so that the user can immediately edit cmdId
-
- set done [::dialog::wait $top]
-
- if {$done == 1} { ;# dialog accepted?
- set theCommand(cmdId) [$form.entry1 get]
- set theCommand(param1) [$form.entry2 get]
- set theCommand(param2) [$form.entry3 get]
- set theCommand(param3) [$form.entry4 get]
-
- variable ::qspy::QS_RX
- ::qspy::sendPkt [binary format cciii \
- $::qspy::QS_RX(COMMAND) $theCommand(cmdId) \
- $theCommand(param1) $theCommand(param2) $theCommand(param3)]
- }
- destroy $top
-}
-#.............................................................................
-## @brief displays the "Peek" dialog box for QSpyView
-proc onPeek {} {
- set top [::dialog::create .peek "Peek"]
- set form $top.form
-
- global thePeek
- ::dialog::addEntry $top "obj/addr:" 16 $thePeek(obj)
- ::dialog::addEntry $top "offset:" 16 $thePeek(offs)
- ::dialog::addEntry $top "size(1/2/4):" 6 $thePeek(size)
- ::dialog::addEntry $top "n-units:" 6 $thePeek(len)
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- focus $form.entry1 ;# so that the user can immediately edit the obj/addr
-
- set done [::dialog::wait $top]
-
- if {$done == 1} { ;# dialog accepted?
- set thePeek(obj) [$form.entry1 get]
- set thePeek(offs) [$form.entry2 get]
- set thePeek(size) [$form.entry3 get]
- set thePeek(len) [$form.entry4 get]
-
- ::qspy::sendCurrObj AP $thePeek(obj)
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format cscc $::qspy::QS_RX(PEEK) \
- $thePeek(offs) $thePeek(size) $thePeek(len)]
- }
- destroy $top
-}
-#.............................................................................
-## @brief displays the "Poke" dialog box for QSpyView
-proc onPoke {} {
- set top [::dialog::create .poke "Poke"]
- set form $top.form
-
- global thePoke
- ::dialog::addEntry $top "obj/addr:" 16 $thePoke(obj)
- ::dialog::addEntry $top "offset:" 16 $thePoke(offs)
- ::dialog::addEntry $top "fmt(c/s/S/i/I):" 6 $thePoke(fmt)
- ::dialog::addEntry $top "data:" 16 $thePoke(data)
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- focus $form.entry1 ;# so that the user can immediately edit the addr
-
- set done [::dialog::wait $top]
-
- if {$done == 1} { ;# dialog accepted?
- set thePoke(obj) [$form.entry1 get]
- set thePoke(offs) [$form.entry2 get]
- set thePoke(fmt) [$form.entry3 get]
- set thePoke(data) [$form.entry4 get]
-
- ::qspy::sendCurrObj AP $thePoke(obj)
- variable ::qspy::QS_RX
- set data [binary format $thePoke(fmt) $thePoke(data)]
- set size [string length $data]
- ::qspy::sendPkt [binary format cscc $::qspy::QS_RX(POKE) \
- $thePoke(offs) $size 1]$data
- }
- destroy $top
-}
-#.............................................................................
-## @brief handler for the Tick command (trigger a clock tick inside Target)
-proc onTick {rate} {
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format cc $::qspy::QS_RX(TICK) $rate]
-}
-#.............................................................................
-## @brief handler for the Target-Reset command (trigger reset inside Target)
-proc onTargetReset {} {
- variable ::qspy::QS_RX
- ::qspy::sendPkt [binary format c $::qspy::QS_RX(RESET)]
-}
-#.............................................................................
-## @brief handler for the Target-Info command (trigger sending Target info)
-proc onTargetInfo {} {
- variable ::qspy::QS_RX
- ::qspy::sendPkt [binary format c $::qspy::QS_RX(INFO)]
-}
-#.............................................................................
-## @brief handler for the Save-Dictionary command
-# (make QSPY save dictionaries)
-proc onSaveDict {} {
- variable ::qspy::QSPY
- ::qspy::sendPkt [binary format c $::qspy::QSPY(SAVE_DICT)]
-}
-#.............................................................................
-## @brief handler for the Screen-Out command
-proc onScreenOut {} {
- variable ::qspy::QSPY
- ::qspy::sendPkt [binary format c $::qspy::QSPY(SCREEN_OUT)]
-}
-#.............................................................................
-## @brief handler for the Binary-Out command
-# (toggle saving binary file in QSPY)
-proc onBinaryOut {} {
- variable ::qspy::QSPY
- ::qspy::sendPkt [binary format c $::qspy::QSPY(BIN_OUT)]
-}
-#.............................................................................
-## @brief handler for the Matlab-Out command
-# (toggle saving Matlab file in QSPY)
-proc onMatlabOut {} {
- variable ::qspy::QSPY
- ::qspy::sendPkt [binary format c $::qspy::QSPY(MATLAB_OUT)]
-}
-#.............................................................................
-## @brief handler for the MscGen-Out command
-# (toggle saving MscGen file in QSPY)
-proc onMscGenOut {} {
- variable ::qspy::QSPY
- ::qspy::sendPkt [binary format c $::qspy::QSPY(MSCGEN_OUT)]
-}
-
-#.............................................................................
-## @brief displays the "Generate Event" dialog box for QSpyView
-proc onGenEvent {} {
- set top [::dialog::create .genEvent "Generate Event"]
- set form $top.form
-
- global theEvent
-
- label $form.label1 -text "prio:" -anchor e
- entry $form.entry1 -width 8
- $form.entry1 insert 0 $theEvent(prio)
- grid $form.label1 $form.entry1 -
-
- grid configure $form.label1 -sticky e
- grid configure $form.entry1 -sticky w
-
- label $form.label2 -text "sig:" -anchor e
- entry $form.entry2 -width 21
- $form.entry2 insert 0 $theEvent(sig)
- grid $form.label2 $form.entry2 -
-
- grid configure $form.label2 -sticky e
- grid configure $form.entry2 -sticky w
-
- label $top.form.params -text "===== Event Parameters ====="
- grid $top.form.params -columnspan 3
-
- for {set i 1} {$i <= 10} {incr i} {
- label $form.par$i -text "par$i:" -anchor e
- entry $form.fmt$i -width 4
- entry $form.dat$i -width 16
- $form.fmt$i insert 0 $theEvent(fmt$i)
- $form.dat$i insert 0 $theEvent(dat$i)
- grid $form.par$i $form.fmt$i $form.dat$i
-
- grid configure $form.par$i -sticky e
- grid configure $form.fmt$i -sticky w
- grid configure $form.dat$i -sticky w
- }
-
- variable ::dialog::done
- button $top.controls.btn0 -text " Cancel " -command {set ::dialog::done 0}
- pack $top.controls.btn0 -side right -expand yes
- button $top.controls.btn1 -text " OK " -command {set ::dialog::done 1}
- pack $top.controls.btn1 -side right -expand yes
- bind $top {set ::dialog::done 0}
- bind $top {set ::dialog::done 1}
-
- focus $form.entry1 ;# so that the user can immediately type prio
-
- set done [::dialog::wait $top]
-
- if {$done == 1} { ;# dialog accepted?
-
- set theEvent(prio) [$form.entry1 get]
- set theEvent(sig) [$form.entry2 get]
-
- set par ""
- for {set i 1} {$i <= 10} {incr i} {
- set theEvent(fmt$i) [$form.fmt$i get]
- set theEvent(dat$i) [$form.dat$i get]
-
- if {$theEvent(fmt$i) != ""} {
- append par [binary format $theEvent(fmt$i) $theEvent(dat$i)]
- }
- }
-
- ::qspy::sendEvent $theEvent(prio) $theEvent(sig) $par
- }
- destroy $top
-}
-
-# GUI ========================================================================
-# graphics defaults ..........................................................
-#option add *ctrlFont -*-courier-medium-r-normal--*-140-* userDefault
-option add *textFont -*-courier-medium-r-semicondensed--*-110-* userDefault
-
-set theTextFont [option get . textFont TextFont] ;# font used for text
-
-option add *t.font $theTextFont userDefault
-
-# embedded images ............................................................
-image create photo ::img::logo32 -file $HOME/img/logo_qspy32.gif
-image create photo ::img::logo32off -file $HOME/img/logo_qp32.gif
-image create photo ::img::logo64 -file $HOME/img/logo_qspy64.gif
-image create photo ::img::logo128 -file $HOME/img/logo_qspy128.gif
-
-# configure the top-level window .............................................
-wm protocol . WM_DELETE_WINDOW onCleanup
-
-# Main menu ==================================================================
-. configure -menu .mbar
-menu .mbar
-.mbar add cascade -label "File" -menu .mbar.file
-.mbar add cascade -label "View" -menu .mbar.view
-.mbar add cascade -label "Filters" -menu .mbar.filters
-.mbar add cascade -label "Commands" -menu .mbar.commands
-.mbar add cascade -label "Events" -menu .mbar.events
-.mbar add cascade -label "Custom" -menu .mbar.cust
-.mbar add cascade -label "Help" -menu .mbar.help
-
-# sub-menu File --------------------------------------------------------------
-menu .mbar.file -tearoff 0
-# 0
-.mbar.file add command -label "Store Dictionaries" -accelerator Ctrl+d \
- -command onSaveDict
-bind . { .mbar.file invoke 0 }
-# 1
-.mbar.file add command -label "Screen Output" -accelerator Ctrl+o \
- -command onScreenOut
-bind . { .mbar.file invoke 1 }
-# 2
-.mbar.file add command -label "Save QS Binary" -accelerator Ctrl+s \
- -command onBinaryOut
-bind . { .mbar.file invoke 2 }
-# 3
-.mbar.file add command -label "Matlab Output" \
- -command onMatlabOut
-# 3
-.mbar.file add command -label "MscGen Output" \
- -command onMscGenOut
-# 4
-.mbar.file add separator
-# 5
-.mbar.file add command -label "Exit" -accelerator Alt+F4 -command onCleanup
-bind . { .mbar.file invoke 5 }
-
-# sub-menu View --------------------------------------------------------------
-set theSigView 0
-menu .mbar.view -tearoff 0
-# 0
-.mbar.view add checkbutton -label "Text" -variable theTextView \
- -command onTextView
-# 1
-.mbar.view add checkbutton -label "Canvas" -variable theCanvView \
- -command onCanvView
-
-# sub-menu Filters -----------------------------------------------------------
-menu .mbar.filters -tearoff 0
-# 0
-.mbar.filters add command -label "Globl Filters..." -accelerator Ctrl+g \
- -command onGlbFilters
-bind . { .mbar.filters invoke 0 }
-# 1
-.mbar.filters add command -label "Local Filters..." -accelerator Ctrl+l \
- -command onLocFilters
-bind . { .mbar.filters invoke 1 }
-# 2
-.mbar.filters add command -label "AO Filter..." -command onAoFilter
-
-# sub-menu Commands ----------------------------------------------------------
-menu .mbar.commands -tearoff 0
-# 0
-.mbar.commands add command -label "Reset Target" -accelerator Ctrl+r \
- -command onTargetReset
-bind . { .mbar.commands invoke 0 }
-# 1
-.mbar.commands add command -label "Query Target Info" -accelerator Ctrl+i \
- -command onTargetInfo
-bind . { .mbar.commands invoke 1 }
-# 2
-.mbar.commands add command -label "Tick\[0\]" -accelerator Ctrl+t \
- -command { onTick 0 }
-bind . { .mbar.commands invoke 2 }
-# 3
-.mbar.commands add command -label "Tick\[1\]" -accelerator Ctrl+u \
- -command { onTick 1 }
-bind . { .mbar.commands invoke 3 }
-# 4
-.mbar.commands add command -label "User Command..." -accelerator Ctrl+c \
- -command onCommand
-bind . { .mbar.commands invoke 4 }
-# 5
-.mbar.commands add command -label "Peek Obj/Addr..." -command onPeek
-# 6
-.mbar.commands add command -label "Poke Obj/Addr..." -command onPoke
-# 7
-.mbar.commands add separator
-
-# sub-menu Events ------------------------------------------------------------
-# 0
-menu .mbar.events -tearoff 0
-.mbar.events add command -label "Current Objects..." -accelerator Ctrl+o \
- -command onCurrObjs
-bind . { .mbar.events invoke 0 }
-# 1
-.mbar.events add command -label "Generate Event..." -accelerator Ctrl+e \
- -command onGenEvent
-bind . { .mbar.events invoke 1 }
-
-
-# sub-menu Cust --------------------------------------------------------------
-menu .mbar.cust -tearoff 0
-
-# sub-menu Help --------------------------------------------------------------
-menu .mbar.help -tearoff 0
-
-# 0
-.mbar.help add command -label "Online Help" -accelerator F1 -command {
- openURL "https://state-machine.com/qspy/"
-}
-bind . { .mbar.help invoke 0 }
-
-# 1
-.mbar.help add separator
-# 2
-.mbar.help add command -label "About ..." -command onAbout
-
-# status bar =================================================================
-frame .status
-label .status.tstamp -text $::qspy::theTstamp -anchor w
-label .status.erlb1 -text "Err" -anchor w -borderwidth 1
-label .status.erlb2 -text "Err" -anchor w -borderwidth 1
-label .status.er1 -anchor w -width 4 -relief sunken -borderwidth 1
-label .status.er2 -anchor w -width 4 -relief sunken -borderwidth 1
-label .status.rxlb1 -text "Rx" -anchor w -borderwidth 1
-label .status.rxlb2 -text "Rx" -anchor w -borderwidth 1
-label .status.rx1 -anchor w -width 7 -relief sunken -borderwidth 1
-label .status.rx2 -anchor w -width 5 -relief sunken -borderwidth 1
-label .status.txlb -text "Tx" -anchor w -borderwidth 1
-label .status.tx -anchor w -width 5 -relief sunken -borderwidth 1
-checkbutton .status.scroll -justify right \
- -text "scroll" -variable theScrollFlag
-label .status.logo -image ::img::logo32
-frame .status.sep -width 2 -height 24 -borderwidth 1 -relief sunken
-
-pack .status.logo -padx 0 -side right -anchor s
-pack .status.tstamp -padx 2 -pady 0 -side left
-pack .status.er1 -padx 2 -pady 0 -side right
-pack .status.erlb1 -padx 2 -pady 0 -side right
-pack .status.rx1 -padx 2 -pady 0 -side right
-pack .status.rxlb1 -padx 2 -pady 0 -side right
-pack .status.sep -padx 8 -side right
-pack .status.er2 -padx 2 -pady 0 -side right
-pack .status.erlb2 -padx 2 -pady 0 -side right
-pack .status.rx2 -padx 2 -pady 0 -side right
-pack .status.rxlb2 -padx 2 -pady 0 -side right
-pack .status.tx -padx 2 -pady 0 -side right
-pack .status.txlb -padx 2 -pady 0 -side right
-pack .status -side bottom -fill x -pady 0 ;# pack status before text
-
-# add traces for the packet counters to show them in the status bar...
-trace add variable ::qspy::theTstamp write traceTstamp
-trace add variable ::qspy::theErRecCnt write traceErRecCnt
-trace add variable ::qspy::theRxRecCnt write traceRxRecCnt
-trace add variable ::qspy::theTxPktCnt write traceTxPktCnt
-trace add variable ::qspy::theRxPktCnt write traceRxPktCnt
-trace add variable ::qspy::theErPktCnt write traceErPktCnt
-
-## @brief trace handler to monitor the Time-Stamp variable
-proc traceTstamp {varname key op} {
- upvar $varname var
- .status.tstamp configure -text $var
-}
-## @brief trace handler to monitor the Error Count variable
-proc traceErRecCnt {varname key op} {
- upvar $varname var
- .status.er1 configure -text $var
-}
-## @brief trace handler to monitor the Received-Records Count variable
-proc traceRxRecCnt {varname key op} {
- upvar $varname var
- .status.rx1 configure -text $var
-}
-## @brief trace handler to monitor the Transmitted-Packets Count variable
-proc traceTxPktCnt {varname key op} {
- upvar $varname var
- .status.tx configure -text $var
-}
-## @brief trace handler to monitor the Received-Packets Count variable
-proc traceRxPktCnt {varname key op} {
- upvar $varname var
- .status.rx2 configure -text $var
-}
-## @brief trace handler to monitor the Error-Packets Count variable
-proc traceErPktCnt {varname key op} {
- upvar $varname var
- .status.er2 configure -text $var
-}
-
-# Text View ==================================================================
-frame .txt
-text .txt.t -wrap none \
- -xscrollcommand {.txt.x set } -yscrollcommand {.txt.y set }
-scrollbar .txt.x -orient horizontal -command {.txt.t xview}
-scrollbar .txt.y -orient vertical -command {.txt.t yview}
-
-#.txt.t configure -state disabled
-grid .txt.t .txt.y -sticky nsew
-grid .txt.x -sticky nsew
-grid columnconfigure .txt 0 -weight 1
-grid rowconfigure .txt 0 -weight 1
-set theScrollFlag 1
-
-#.............................................................................
-## @brief handler for the Text-View command
-proc onTextView {} {
- global theTextView theScrollFlag
- if {$theTextView == 1} {
- pack .txt -side bottom -expand yes -fill both -padx 2 -pady 2
- pack .status.scroll -before .status.tstamp -padx 2 -pady 0 -side right
- wm geometry . =640x300
- } else {
- pack forget .status.scroll
- pack forget .txt
- wm geometry . =640x40
-# .txt.t configure -state normal
- .txt.t delete 1.0 end
-# .txt.t configure -state disabled
- }
-}
-set theTextView 1
-onTextView
-
-# Canvas View ================================================================
-toplevel .canv
-wm title .canv "Canvas"
-wm group .canv .
-wm protocol .canv WM_DELETE_WINDOW onCanvClose
-canvas .canv.c
-pack .canv.c
-
-## @brief handler for the Canvas-View command
-proc onCanvView {} {
- global theCanvView
- if {$theCanvView} {
- wm state .canv normal
- } else {
- wm withdraw .canv
- }
-}
-## @brief handler for the Canvas-Close command
-proc onCanvClose {} {
- global theCanvView
- set theCanvView 0
- onCanvView
-}
-
-onCanvView
-
-#.............................................................................
-## @brief helper function to display a string in the text-area
-proc dispTxt {str} {
- global theTextView theScrollFlag
-
- if {$theTextView == 0} {
- return
- }
-
- .txt.t insert end \n$str
-
- # prevent unlimited growth of the text beyong the specified num of lines
- if {[lindex [split [.txt.t index end] .] 0] > 1000} {
- .txt.t delete 1.0 "end - 1000 lines"
- }
- if {$theScrollFlag} {
- .txt.t yview moveto 1.0
- }
-}
-
-# simple modal dialog facility ===============================================
-## @brief modal dialog facilities
-namespace eval ::dialog {
- # exported commands...
- namespace export \
- create \
- wait
-
- # variables...
- variable done 0
- variable line 0
-}
-
-## @brief create a modal dialog
-proc ::dialog::create {me class} {
- toplevel $me -class $class
-
- # make the dialog "transient" of top-level.
- # this removes the minimize/maximize decorations from the window bar
- wm transient $me .
-
- frame $me.form
- pack $me.form -expand yes -fill both -padx 4 -pady 4
-
- frame $me.sep -height 2 -borderwidth 1 -relief sunken
- pack $me.sep -fill x -pady 4
-
- frame $me.controls
- pack $me.controls -side left -expand yes -fill x -padx 4 -pady 4
- label $me.logo -image ::img::logo32
- pack $me.logo -side left -expand yes -anchor se
-
- wm title $me $class
- wm group $me .
-
- # clear the numeber of lines in the dialog
- variable line
- set line 0
-
- after idle [format {
- update idletasks
- wm minsize %s [winfo reqwidth %s] [winfo reqheight %s]
- } $me $me $me]
-
- return $me
-}
-#.............................................................................
-## @brief wait in a modal dialog
-proc ::dialog::wait {me} {
- safeguard $me
-
- focus $me
-
- set x [expr [winfo rootx .]+50]
- set y [expr [winfo rooty .]+20]
- wm geometry $me "+$x+$y"
-
- wm deiconify $me
- grab set $me
-
- variable ::dialog::done
- vwait ::dialog::done
-
- grab release $me
- focus -force . ;# added MMS
- wm withdraw $me
-
- return $::dialog::done
-}
-#.............................................................................
-bind modalDialog {
- wm deiconify %W
- raise %W
-}
-#.............................................................................
-## @brief helper function to safeguard the waiting modal dialog (see wait())
-proc ::dialog::safeguard {me} {
- if {[lsearch [bindtags $me] modalDialog] < 0} {
- bindtags $me [linsert [bindtags $me] 0 modalDialog]
- }
-}
-#.............................................................................
-## @brief add an entry to a modal dialog
-proc ::dialog::addEntry {me label wid dflt} {
- variable line
- incr line
-
- set form $me.form
-
- label $form.label$line -text $label -anchor e
- entry $form.entry$line -width $wid
- $form.entry$line insert 0 $dflt
- grid $form.label$line $form.entry$line
-
- grid configure $form.label$line -sticky e
- grid configure $form.entry$line -sticky w
-}
-
-#.............................................................................
-## @brief helper function to open a given URL
-proc openURL {url} {
- global tcl_platform
-
- if {$tcl_platform(platform) == "windows"} {
- if {[catch {eval exec [auto_execok start] $url}] == 0} return
- } elseif {$tcl_platform(os) == "Linux"} {
- if {[catch {exec xdg-open $url &}] == 0} return
- if {[catch {exec kde-open $url &}] == 0} return
- if {[catch {exec gnome-open $url &}] == 0} return
- } else {
- # some other platform (needs code...)
- }
-}
-
-
-#=============================================================================
-if {[llength $argv] > 0} { ;# argv(0) -- extension script
- wm title . "QSpyView $VERSION -- [lindex $argv 0]"
- source [lindex $argv 0] ;# source the provided extension script
-} else {
- wm title . "QSpyView $VERSION -- default.tcl"
- source $HOME/default.tcl ;# source the default extension script
-}
-main
-
diff --git a/qspy/tcl/qutest.tcl b/qspy/tcl/qutest.tcl
deleted file mode 100644
index 38d3095..0000000
--- a/qspy/tcl/qutest.tcl
+++ /dev/null
@@ -1,1323 +0,0 @@
-##
-# @file
-# @ingroup qutest
-# @brief QUTest Unit Testing harness support for Tcl scripting.
-#
-# @description
-# QUTest is a Unit Testing harness (framework) for embedded systems.
-# This Tcl module defines a small Domain Specific Language (DSL) for
-# writing test scripts in Tcl. This script also implements a
-# console-based ("headless") front-end to the QSPY back-and for running
-# such user tests.
-#
-# @usage
-# tclsh qutest.tcl [test-scripts] [host_exe] [host[:port]] [local_port]
-
-## @cond
-#-----------------------------------------------------------------------------
-# Product: QUTEST package
-# Last updated for version 6.8.0
-# Last updated on 2020-03-17
-#
-# Q u a n t u m L e a P s
-# ------------------------
-# Modern Embedded Software
-#
-# Copyright (C) 2005-2020 Quantum Leaps, LLC. All rights reserved.
-#
-# This program is open source software: you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# Alternatively, this program may be distributed and modified under the
-# terms of Quantum Leaps commercial licenses, which expressly supersede
-# the GNU General Public License and are specifically designed for
-# licensees interested in retaining the proprietary status of their code.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-#
-# Contact information:
-#
-#
-#-----------------------------------------------------------------------------
-# @endcond
-
-# this version of qutest
-set VERSION 6.8.0
-
-package provide qutest 6.8
-
-package require Tcl 8.4 ;# need at least Tcl 8.4
-
-# home directory of this Tcl script file
-set HOME [file dirname [file normalize [info script]]]
-
-# use the QSPY interface package
-source $HOME/qspy.tcl
-
-## @brief facilities for building unit testing scripts for @ref qutest "QUTest"
-namespace eval ::qutest {
- variable TIMEOUT_MS 500 ;#< timeout [ms] for waiting on the QSPY response
- variable theTestMs [clock clicks -milliseconds]
-
- #.........................................................................
- ## @brief start a new test
- # @description
- # This command starts a new test and gives it a name.
- #
- # @param[in] name name of the test
- # @param[in] args options {-noreset skip}
- #
- proc test {name args} {
- variable theTestCount
- variable theSkipCount
- variable theErrCount
- variable theCurrState
- variable theNeedReset
- variable theTestMs
-
- #puts "test $name"
-
- ;# parse and validate the test options
- set opt_reset 1
- set opt_skip 0
- foreach opt $args {
- if {$opt == "-noreset"} {
- set opt_reset 0
- } elseif {$opt == "skip"} {
- set opt_skip 1
- } else {
- cleanup
- error "Incorrect test option '$opt'"
- }
- }
-
- switch $theCurrState {
- PRE -
- TEST {
- if {$theCurrState != {PRE}} { ;# any tests executed so far?
- call_on_teardown
- test_passed
- }
-
- set theTestMs [clock clicks -milliseconds]
- incr theTestCount
- if {$opt_skip} {
- puts "$name : SKIPPED"
- incr theSkipCount
- tran SKIP
- } else {
- puts -nonewline "$name : "
- flush stdout
- if {$opt_reset} {
- tran TEST ;# to execute 'reset' in the TEST state
- if {[reset] == 0} { ;# reset timed out?
- variable theNextMatch
- test_failed
- puts "Expected: \"$theNextMatch\""
- puts "Timed-out"
- tran FAIL
- }
- } elseif {$theNeedReset} {
- cleanup
- error "Test option '-noreset' incorrect for this test"
- }
- }
- set theNeedReset 0
- }
- FAIL -
- SKIP {
- incr theTestCount
- if {$opt_skip} {
- tran SKIP
- } else {
- ;# wait until timeout
- while {[wait4input]} {
- }
-
- if {$opt_reset} {
- tran TEST ;# to execute 'reset' in the TEST state
- if {[reset] == 0} { ;# timeout?
- variable theNextMatch
- test_failed
- puts "Expected: \"$theNextMatch\""
- puts "Timed-out"
- tran FAIL
- }
- } elseif {$theNeedReset} {
- cleanup
- error "Test option '-noreset' incorrect for this test"
- }
- puts -nonewline "$name : "
- flush stdout
- tran TEST
- }
- set theNeedReset 0
- }
- END -
- DONE {
- after_end test
- }
- default {
- assert 0
- }
- }
-
- ;# (re)entering the TEST state?
- if {$theCurrState == "TEST"} {
- variable ::qspy::theHaveTarget
- if {$::qspy::theHaveTarget} {
- call_on_setup
- } else {
- test_failed
- if {$opt_reset == 0} {
- puts "NOTE: test should reset the Target (no -noreset)"
- } else {
- puts "NOTE: lost Target connection"
- }
- tran FAIL
- }
- }
- }
- #.........................................................................
- ## @brief specifies the end of tests
- proc end {} {
- variable theTestCount
- variable theCurrState
- switch $theCurrState {
- PRE {
- tran END
- }
- TEST {
- # did the timeout occur? (all expected QSPY output arrived?)
- if {[wait4input] == 0} {
- if {$theTestCount > 0} { ;# any tests executed?
- call_on_teardown
- test_passed
- }
- }
- tran END
- }
- FAIL -
- SKIP {
- while {[wait4input]} { ;# NOT timeout?
- }
- tran DONE
- }
- END -
- DONE {
- after_end end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief specifies to stop processing the rest of tests
- proc stop {} {
- variable theTestCount
- variable theCurrState
- switch $theCurrState {
- PRE {
- }
- TEST {
- # did the timeout occur? (all expected QSPY output arrived?)
- if {[wait4input] == 0} {
- if {$theTestCount > 0} { ;# any tests executed?
- call_on_teardown
- test_passed
- }
- }
- }
- FAIL -
- SKIP {
- while {[wait4input]} { ;# NOT timeout?
- }
- }
- END -
- DONE {
- }
- default {
- assert 0
- }
- }
- tran DONE
- puts "!!! STOP !!!"
- finish
- exit
- }
-
- #.........................................................................
- ## @brief defines an expectation for the current test
- # @description
- # This command defines a new expecation for the textual output produced
- # by QSPY. The @p match parameter is matched to the string received from
- # QSPY by means of the Tcl `[string match ...]` command.
- #
- # @param[in] match the expected match for the QSPY output
- #
- # @sa http://www.tcl.tk/man/tcl8.4/TclCmd/string.htm#M34
- #
- proc expect {match} {
- variable theNextMatch
- variable theTimestamp
-
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- if {([string first @timestamp $match] == 0) || \
- ([string first %timestamp $match] == 0)} {
- incr theTimestamp
- set theNextMatch \
- [format %010d $theTimestamp][string range \
- $match 10 end]
- } elseif [string is integer [string range $match 0 9]] {
- incr theTimestamp
- set theNextMatch $match
- } else {
- set theNextMatch $match
- }
- #puts $theNextMatch
- if {![wait4input]} { ;# timeout?
- test_failed
- puts "Expected: \"$theNextMatch\""
- puts "Timed-out"
-
- set theNextMatch ""
- tran FAIL
- }
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief defines expectation for a Test Pause
- proc expect_pause {} {
- expect " TstPause"
- }
- #.........................................................................
- ## @brief executes a given command in the Target
- # @description
- # This command causes execution of the callback QS_onCommand() inside the
- # the Target system.
- #
- # @param[in] cmdId the command-id first argument to QS_onCommand()
- # @param[in] param1 the 'param1' argument to QS_onCommand() (optional)
- # @param[in] param2 the 'param2' argument to QS_onCommand() (optional)
- # @param[in] param3 the 'param3' argument to QS_onCommand() (optional)
- #
- proc command {cmdId {param1 0} {param2 0} {param3 0} } {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- variable ::qspy::QS_RX
- if [string is integer $cmdId] {
- ::qspy::sendPkt \
- [binary format cciii $::qspy::QS_RX(COMMAND) $cmdId \
- $param1 $param2 $param3]
- } else { ;# cmdId is a name of a user record
- variable ::qspy::QSPY
- variable ::qspy::theFmt
- variable ::qspy::QS_OBJ_KIND
- ::qspy::sendPkt \
- [binary format cciii $::qspy::QSPY(SEND_COMMAND) \
- 0 $param1 $param2 $param3]$cmdId\0
- }
- expect " Trg-Ack QS_RX_COMMAND"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief peeks data into the Target
- # @description
- # This command peeks data at the given offset from the start address
- # of the Application (AP) Current-Object inside the Target.
- #
- # @param[in] offset offset [in bytes] from the start of the current_obj AP
- # @param[in] size size of the data items (1, 2, or 4)
- # @param[in] num number of data items to peek
- #
- proc peek {offs size num} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format cscc $::qspy::QS_RX(PEEK) $offs $size $num]
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief pokes data into the Target
- # @description
- # This command pokes provided data at the given offset from the
- # start address of the Application (AP) Current-Object inside the Target.
- #
- # @param[in] offset offset [in bytes] from the start of the current_obj AP
- # @param[in] data binary data to send
- # @param[in] size size of the data items (1, 2, or 4)
- #
- proc poke {offs size data} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- variable ::qspy::QS_RX
- set len [string length $data]
- set num [expr $len / $size]
- ::qspy::sendPkt [binary format cscc $::qspy::QS_RX(POKE) \
- $offs $size $num]$data
- expect " Trg-Ack QS_RX_POKE"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief fills data into the Target
- # @description
- # This command fills provided data at the given offset from the
- # start address of the Application (AP) Current-Object inside the Target.
- #
- # @param[in] offset offset [in bytes] from the start of the current_obj AP
- # @param[in] size size of the data item (1, 2, or 4)
- # @param[in] num number of data items to fill
- # @param[in] item data item to fill with
- #
- proc fill {offs size num {item 0}} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- variable ::qspy::QS_RX
- array set fmt {
- 1 c
- 2 s
- 4 i
- }
- ::qspy::sendPkt [binary format cscc$fmt($size) \
- $::qspy::QS_RX(FILL) $offs $size $num $item]
- expect " Trg-Ack QS_RX_FILL"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief Set the Global-Filter in the Target
- proc glb_filter {args} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- set filter(0) 0
- set filter(1) 0
- set filter(2) 0
- set filter(3) 0
-
- foreach arg $args {
- if {$arg == {OFF}} { ;# all filters off
- ;
- } elseif {$arg == {ON}} { ;# all filters on
- set filter(0) 0xFFFFFFFF
- set filter(1) 0xFFFFFFFF
- set filter(2) 0xFFFFFFFF
- set filter(3) 0x1FFFFFFF
- break ;# no point in continuing
- } elseif {$arg == {SM}} { ;# state machines
- set filter(0) [expr $filter(0) | 0x000003FE]
- set filter(1) [expr $filter(1) | 0x03800000]
- } elseif {$arg == {AO}} { ;# active objects
- set filter(0) [expr $filter(0) | 0x0007FC00]
- set filter(2) [expr $filter(1) | 0x00002000]
- } elseif {$arg == {EQ}} { ;# raw queues (for deferral)
- set filter(0) [expr $filter(0) | 0x00780000]
- set filter(2) [expr $filter(2) | 0x00004000]
- } elseif {$arg == {MP}} { ;# raw memory pools
- set filter(0) [expr $filter(0) | 0x03000000]
- set filter(2) [expr $filter(2) | 0x00008000]
- } elseif {$arg == {QF}} { ;# framework
- set filter(0) [expr $filter(0) | 0xFC000000]
- set filter(1) [expr $filter(1) | 0x00001FC0]
- } elseif {$arg == {TE}} { ;# time events
- set filter(1) [expr $filter(1) | 0x0000007F]
- } elseif {$arg == {SC}} { ;# scheduler
- set filter(1) [expr $filter(1) | 0x007F0000]
- } elseif {$arg == {U0}} { ;# user 70-79
- set filter(2) [expr $filter(2) | 0x0000FFC0]
- } elseif {$arg == {U1}} { ;# user 80-89
- set filter(2) [expr $filter(2) | 0x03FF0000]
- } elseif {$arg == {U2}} { ;# user 90-99
- set filter(2) [expr $filter(2) | 0xFC000000]
- set filter(3) [expr $filter(3) | 0x0000000F]
- } elseif {$arg == {U3}} { ;# user 100-109
- set filter(3) [expr $filter(3) | 0x00003FF0]
- } elseif {$arg == {U4}} { ;# user 110-124
- set filter(3) [expr $filter(3) | 0x1FFFC000]
- } elseif {$arg == {UA}} { ;# user 70-124 (all)
- set filter(2) [expr $filter(2) | 0xFFFFFFC0]
- set filter(3) [expr $filter(3) | 0x1FFFFFFF]
- } elseif {[string is integer -strict $arg] \
- && ($arg < 0x7F)} { ;# numeric value
- set i [expr $arg / 32]
- set filter($i) [expr $filter($i) | (1 << ($arg % 32))]
- } else {
- assert 0 ;# invalid filter
- }
- }
-
- ;# build and send the GLB_FILTER packet to the Target...
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format cciiii $::qspy::QS_RX(GLB_FILTER) 16 \
- $filter(0) $filter(1) $filter(2) $filter(3)]
- expect " Trg-Ack QS_RX_GLB_FILTER"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief Set the Local Filter in the Target
- proc loc_filter {kind obj} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- ::qspy::sendLocFilter $kind $obj
- expect " Trg-Ack QS_RX_LOC_FILTER"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief Set the Current-Object in the Target
- proc current_obj {kind obj} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- ::qspy::sendCurrObj $kind $obj
- expect " Trg-Ack QS_RX_CURR_OBJ"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief query the "current object" in the Target
- proc query_curr {kind} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- ::qspy::sendQueryCurr $kind
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default { assert 0 }
- }
- }
- #.........................................................................
- ## @brief sends a Test-Probe to the Target
- # @description
- # This function sends the Test-Probe data to the Target. The Target
- # collects these Test-Probe preserving the order in which they were sent.
- # Subsequently, whenever a given API is called inside the Target, it can
- # obtain the Test-Probe by means of the QS_TEST_PROBE_DEF() macro.
- # The QS_TEST_PROBE_DEF() macro returns the Test-Probes in the same
- # order as they were received to the Target. If there are no more Test-
- # Probes for a given API, the Test-Probe is initialized to zero.
- #
- # @param[in] fun the name or raw address of a function (function pointer)
- # @param[in] data the data (uint32_t) for the Test-Probe
- #
- # @note
- # All Test-Probes are cleared when the Target resets and also upon the
- # start of a new test, even if this test does not reset the Target
- # (-noreset tests).
- #
- proc probe {fun data} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- ::qspy::sendTestProbe $fun $data
- expect " Trg-Ack QS_RX_TEST_PROBE"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
- #.........................................................................
- ## @brief sends the CONTINUE packet to the Target to continue a test
- #
- proc continue {} {
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format c $::qspy::QS_RX(CONTINUE)]
- expect " Trg-Ack QS_RX_TEST_CONTINUE"
- }
- #.........................................................................
- ## @brief trigger system clock tick in the Target
- proc tick {{rate 0}} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format cc $::qspy::QS_RX(TICK) $rate]
- expect " Trg-Ack QS_RX_TICK"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default { assert 0 }
- }
- }
- #.........................................................................
- ## @brief dispatch a given event to Current SM-Object in the Target
- proc dispatch {sig {par ""}} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- ::qspy::sendEvent 255 $sig $par
- expect " Trg-Ack QS_RX_EVENT"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default { assert 0 }
- }
- }
- #.........................................................................
- ## @brief post a given event to Current AO-Object in the Target
- proc post {sig {par ""}} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- ::qspy::sendEvent 253 $sig $par
- expect " Trg-Ack QS_RX_EVENT"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default { assert 0 }
- }
- }
- #.........................................................................
- ## @brief publish a given event to subscribers in the Target
- proc publish {sig {par ""}} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- ::qspy::sendEvent 0 $sig $par
- expect " Trg-Ack QS_RX_EVENT"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default { assert 0 }
- }
- }
- #.........................................................................
- ## @brief take the top-most initial transition in the Current-Object
- # in the Target
- proc init {{sig 0} {par ""}} {
- variable theCurrState
- switch $theCurrState {
- PRE {
- before_test
- tran SKIP
- }
- TEST {
- #puts "init Sig=$sig,Par=$par"
- ::qspy::sendEvent 254 $sig $par
- expect " Trg-Ack QS_RX_EVENT"
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END -
- DONE {
- after_end
- }
- default {
- assert 0
- }
- }
- }
-
- #=========================================================================
- ## @brief internal proc for taking transition in the QUTEST state machine
- proc tran {state} {
- variable theCurrState
- #puts "tran($theCurrState->$state)"
- set theCurrState $state
- }
-
- #.........................................................................
- ## @brief internal proc to run a test-group specified in a given test file
- proc run {test_file} {
- ## safe interpreter to run user tests
- variable theTestRunner [interp create -safe]
-
- # test DSL -----------------------------------------------------------
- # The following set of aliases added to the test-runner forms a small
- # Domain Specific Language (DSL) for writing QUTEST tests
- #
- $theTestRunner alias test ::qutest::test
- $theTestRunner alias end ::qutest::end
- $theTestRunner alias stop ::qutest::stop
- $theTestRunner alias expect ::qutest::expect
- $theTestRunner alias expect_pause ::qutest::expect_pause
- $theTestRunner alias command ::qutest::command
- $theTestRunner alias peek ::qutest::peek
- $theTestRunner alias poke ::qutest::poke
- $theTestRunner alias fill ::qutest::fill
- $theTestRunner alias glb_filter ::qutest::glb_filter
- $theTestRunner alias loc_filter ::qutest::loc_filter
- $theTestRunner alias current_obj ::qutest::current_obj
- $theTestRunner alias probe ::qutest::probe
- $theTestRunner alias continue ::qutest::continue
- $theTestRunner alias tick ::qutest::tick
- $theTestRunner alias query_curr ::qutest::query_curr
- $theTestRunner alias dispatch ::qutest::dispatch
- $theTestRunner alias post ::qutest::post
- $theTestRunner alias publish ::qutest::publish
- $theTestRunner alias init ::qutest::init
- $theTestRunner alias puts puts
-
- variable theNextMatch ""
- variable theTestSkip 0
- variable theNeedReset 1
- variable theEvtLoop 1
- variable theAfterId 0
-
- set fid [open $test_file r]
- set test_script [read $fid]
- close $fid
-
- variable theTimestamp 0
- variable theGroupCount
- incr theGroupCount
- tran PRE
-
- variable theCurrGroup $test_file
- puts "----------------------------------------------"
- puts "Group: $theCurrGroup"
- variable theTestRunner
-
- $theTestRunner eval $test_script
-
- interp delete $theTestRunner
- }
- #.........................................................................
- ## @brief internal proc to cleanup in case of an error
- proc cleanup {} {
- variable ::qspy::theHaveTarget
- if {$::qspy::theHaveTarget} {
- variable theHostExe
- if {$theHostExe != ""} { ;# host executable?
- variable ::qspy::QS_RX
- ;# sending the RESET packet terminates the executable
- ::qspy::sendPkt [binary format c $::qspy::QS_RX(RESET)]
- variable TIMEOUT_MS
- after $TIMEOUT_MS
- }
- }
- }
- #.........................................................................
- ## @brief internal proc for starting QUTEST
- proc start {{channels 0x02}} {
- # set defaults for communication with the QSPY back-end
- # NOTE (all these can be overridden by command-line options)
- set qspy_host "localhost:7701"
- set local_port 0 ;# the system will choose the local UDP port
-
- # command-line optional arguments processing...
- # [host_exe] [host[:port]] [local_port]
- #
- global ::argc ::argv
- variable theHostExe ""
- if {$::argc > 0} { ;# argv(0) -- test-files
- # remove any arguments ending in tcl and add to test file list
- set test_files { }
- set new_argv { dummy }
- foreach arg $argv {
- # string compares returns 0 if argument ends in tcl
- if { [string compare -nocase [string range $arg end-3 end] .tcl] } {
- lappend new_argv $arg
- } else {
- # if test file input uses wildcard, find matches
- if { [string match * $arg] } {
- set matched_files [glob -nocomplain $arg]
- foreach f $matched_files {
- lappend test_files $f
- }
- } else {
- lappend test_files $arg
- }
- }
- }
- # make adjustments so that the rest of the argument parsing
- # continues properly
- set ::argv $new_argv
- set ::argc [llength $::argv]
- } else {
- set test_files [glob -nocomplain *.tcl] ;# default *.tcl
- }
- if {$::argc > 1} { ;# argv(1) -- host_exe
- set theHostExe [lindex $::argv 1]
- }
- if {$::argc > 2} { ;# argv(2) -- host running QSPY
- set qspy_host [lindex $::argv 2]
- }
- if {$::argc > 3} { ;# argv(3) -- local port
- set local_port [lindex $::argv 3]
- }
-
- global VERSION
- puts "QUTEST unit testing front-end $VERSION"
- puts "Copyright (c) 2005-2019 Quantum Leaps"
- puts "help at: https://state-machine.com/qtools/qutest.html"
-
- # attach to QSPY...
- variable ::qspy::theIsAttached 0
- if {[::qspy::attach $qspy_host $local_port $channels]} {
- puts -nonewline \
- "Attaching to QSPY ($qspy_host) ... "
- flush stdout
- } else { ;# failed to attach
- puts "Can't open the UDP socket.\n\
- Check if another instance\n\
- of qutest/qspview is already running."
- exit 3 ;# Internal error happened while executing tests
- }
- variable TIMEOUT_MS
- set id [after $TIMEOUT_MS "set ::qspy::theIsAttached 0"]
- vwait ::qspy::theIsAttached ;#<<<<<<< wait until attached to QSPY
-
- if {$::qspy::theIsAttached} { ;# NO time out?
- after cancel $id
- puts "OK"
- } else { ;# timeout while attaching to UDP-port of QSPY
- ::qspy::detach ;# detach from QSPY
- puts "FAIL!"
- exit 3 ;# Internal error happened while executing tests
- }
-
- variable theGroupCount 0
- variable theTestCount 0
- variable theSkipCount 0
- variable theErrCount 0
- variable theCurrGroup ""
- variable theCurrState "PRE"
- variable theStartMs [clock clicks -milliseconds]
- variable theTestMs $theStartMs
- variable theTargetTstamp ""
-
- return $test_files
- }
- #.........................................................................
- ## @brief internal proc for stopping QUTEST and disconnecting from QSPY
- proc finish {} {
- cleanup
- ::qspy::detach ;# detach from QSPY
-
- variable theGroupCount
- variable theTestCount
- variable theSkipCount
- variable theErrCount
- variable theCurrGroup
- variable theCurrState
- variable theStartMs
- variable theTargetTstamp
-
- switch $theCurrState {
- PRE -
- TEST -
- SKIP -
- FAIL {
- if {$theCurrGroup != ""} {
- puts "'end' command missing in $theCurrGroup"
- } else {
- puts "No test scripts found"
- }
- incr theErrCount
- }
- END -
- DONE {
- ;# do nothing
- }
- default {
- assert 0
- }
- }
-
- if {$theTargetTstamp != ""} {
- puts "============= $theTargetTstamp =============="
- } else {
- puts "================= (no target ) ==================="
- }
- puts "$theGroupCount Groups, $theTestCount Tests,\
- $theErrCount Failures, $theSkipCount Skipped\
- ([expr ([clock clicks -milliseconds] - $theStartMs)*0.001]s)"
- variable TIMEOUT_MS
- after $TIMEOUT_MS
-
- if {$theErrCount} {
- puts "FAIL!"
- exit 1 ;# Tests were run but some of the tests failed
- } else {
- puts "OK"
- }
- }
- #.........................................................................
- ## @brief internal proc for resetting the Target
- proc reset {} {
- variable ::qspy::theHaveTarget
- variable ::qspy::QS_RX
- variable theHostExe
- variable TIMEOUT_MS
-
- if {$theHostExe != ""} { ;# running a host executable?
- if {$::qspy::theHaveTarget} {
- ;# send RESET packet to stop and exit the host executable
- set ::qspy::theHaveTarget 0
- ::qspy::sendPkt [binary format c $::qspy::QS_RX(RESET)]
-
- ;# let the Target executable finish
- set id [after $TIMEOUT_MS {set ::qspy::theHaveTarget 0}]
- vwait ::qspy::theHaveTarget ;#<<<<<<< wait until have Target
- if {$::qspy::theHaveTarget} { ;# NO timeout?
- after cancel $id
- }
- }
-
- ;# lauch a new instance of the host executable
- exec $theHostExe &
-
- } else { ;# running on real Target
- set ::qspy::theHaveTarget 0
- ::qspy::sendPkt [binary format c $::qspy::QS_RX(RESET)]
- }
-
- if {$::qspy::theHaveTarget == 0} { ;# don't have Target?
- set id [after $TIMEOUT_MS {set ::qspy::theHaveTarget 0}]
- vwait ::qspy::theHaveTarget ;#<<<<<<< wait until have Target
- if {$::qspy::theHaveTarget} { ;# NO timeout?
- after cancel $id
- } else {
- return 0 ;# reset NOT done (timeout)
- }
- }
- call_on_reset
- return 1 ;# reset done
- }
- #.........................................................................
- ## @brief internal assertion
- proc assert {cond} {
- if {!$cond} {
- cleanup
- variable theCurrState
- error "QUSTEST assert failed State=$theCurrState"
- }
- }
- #.........................................................................
- ## @brief internal error handler for a command used before any test
- proc before_test {} {
- puts "'[lindex [info level -1] 0]' before any 'test'"
- variable theErrCount
- incr theErrCount
- }
- #.........................................................................
- ## @brief internal error handler for a command used after the end
- proc after_end {} {
- puts "'[lindex [info level -1] 0]' following the 'end'"
- variable theErrCount
- incr theErrCount
- }
- #.........................................................................
- ## @brief internal proc for calling the 'on_reset' proc (if defined)
- proc call_on_reset {} {
- variable theTimestamp
- set theTimestamp 0
-
- ;# try to execute the on_reset proc
- variable theTestRunner
- if {[catch {$theTestRunner eval {on_reset}} msg]} {
- if [string equal $msg {invalid command name "on_reset"}] {
- ;# "on_reset" not defined, not a problem
- } else {
- ;# "on_reset" defined, but has errors
- variable theErrCount
- incr theErrCount
- cleanup
- global errorInfo
- error "The stack trace:\n$errorInfo"
- }
- }
- }
- #.........................................................................
- ## @brief internal proc for calling the 'on_setup' proc (if defined)
- proc call_on_setup {} {
- variable theTimestamp 0
-
- variable ::qspy::QS_RX
- ::qspy::sendPkt [binary format c $::qspy::QS_RX(TEST_SETUP)]
- expect " Trg-Ack QS_RX_TEST_SETUP"
-
- variable theTestRunner
- ;# try to execute the on_setup proc
- if {[catch {$theTestRunner eval {on_setup}} msg]} {
- if [string equal $msg {invalid command name "on_setup"}] {
- ;# "on_setup" not defined, not a problem
- } else {
- ;# "on_setup" defined, but has errors
- variable theErrCount
- incr theErrCount
- cleanup
- global errorInfo
- error "The stack trace:\n$errorInfo"
- }
- }
- }
- #.........................................................................
- ## @brief internal proc for calling the 'on_teardown' proc (if defined)
- proc call_on_teardown {} {
- variable ::qspy::theHaveTarget
- if {$::qspy::theHaveTarget} {
- variable ::qspy::QS_RX
- ::qspy::sendPkt \
- [binary format c $::qspy::QS_RX(TEST_TEARDOWN)]
- expect " Trg-Ack QS_RX_TEST_TEARDOWN"
-
- variable theTestRunner
- ;# try to execute the on_teardown proc
- if {[catch {$theTestRunner eval {on_teardown}} msg]} {
- if [string equal $msg \
- {invalid command name "on_teardown"}] {
- ;# "on_teardown" not defined, not a problem
- } else {
- ;# "on_teardown" defined, but has errors
- variable theErrCount
- incr theErrCount
- cleanup
- global errorInfo
- error "The stack trace:\n$errorInfo"
- }
- }
- }
- }
- #.........................................................................
- ## @brief internal proc for reporting a passing test
- proc test_passed {} {
- variable theTestMs
- puts "PASS ([expr ([clock clicks -milliseconds] \
- - $theTestMs)*0.001]s)"
- }
- #.........................................................................
- ## @brief internal proc for reporting a failing test
- proc test_failed {} {
- variable theErrCount
- incr theErrCount
-
- variable theTestMs
- puts "====> FAIL ([expr ([clock clicks -milliseconds] \
- - $theTestMs)*0.001]s) <===="
- }
- #.........................................................................
- ## @brief internal proc for wating for the input from QSPY
- proc wait4input {{cancel 0}} {
- variable theEvtLoop
- variable theAfterId
- variable theCurrState
- variable TIMEOUT_MS
-
- if {$theAfterId != 0} { ;# timeout did NOT occur?
- after cancel $theAfterId
- set theAfterId 0
- }
- if {$cancel == 0} {
- #puts "wait4input State=$theCurrState"
- set theAfterId [after $TIMEOUT_MS \
- {set ::qutest::theEvtLoop 0; set ::qutest::theAfterId 0}]
- vwait ::qutest::theEvtLoop ;# <<<<<< Event-Loop
- } else {
- #puts "wait4input CANCEL State=$theCurrState"
- set theEvtLoop 1
- }
-
- #if {$theEvtLoop != 1} { puts Timeout}
- return $theEvtLoop ;# 1 if no timeout; 0 if timeout
- }
-} ;# namespace ::qutest
-
-# callbacks from ::qspy ======================================================
-## @brief handler for the textual output from QSPY
-proc ::qspy::rec0 {} {
- # the text ouput from QSPY has the following structure:
- # sequence-number : 1 byte
- # packet-ID == 0 : 1 byte
- # record-ID : 1 byte (original QS record or -128 for QSPY Error)
- # line : zero-terminated string (the line)
- variable thePkt
- binary scan $thePkt xxca* recId line
-
- #puts $line
-
- variable ::qutest::theCurrState
- switch $::qutest::theCurrState {
- PRE {
- variable ::qutest::theErrCount
- incr ::qutest::theErrCount
- puts "Unexpected: \"$line\""
- }
- TEST {
- variable ::qutest::theNextMatch
- if {$theNextMatch == ""} {
- ::qutest::test_failed
- puts "Unexpected: \"$line\""
- ::qutest::tran FAIL
- } elseif {[string match $theNextMatch $line]} {
- set theNextMatch "" ;# invalidate the next match
- } else {
- ::qutest::test_failed
- puts "Expected: \"$theNextMatch\""
- puts "Received: \"$line\""
- ::qutest::tran FAIL
- }
- }
- FAIL -
- SKIP {
- ;# ignore
- }
- END {
- ::qutest::test_failed
- puts "Unexpected: \"$line\""
- tran DONE
- }
- DONE {
- ;# ignore
- }
- default {
- assert 0
- }
- }
-
- if {$recId == 69} { ;# QS_ASSERT_FAIL
- variable ::qutest::theNeedReset
- set ::qutest::theNeedReset 1
- }
-
- ::qutest::wait4input cancel
-}
-#.............................................................................
-## @brief handler for the `QSPY_ATTACH` reply from QSPY.
-proc ::qspy::pkt128 {} {
- variable theIsAttached
- set theIsAttached 1
-}
-#.............................................................................
-## @brief handler for the RESET confirmation coming from the Target
-proc ::qspy::recRESET {} {
- variable ::qutest::theTargetTstamp
- if {$::qutest::theTargetTstamp == ""} {
- variable theTstamp
- set ::qutest::theTargetTstamp $theTstamp
- }
-}
-#.............................................................................
-## @brief handler for the INFO confirmation coming from the Target
-proc ::qspy::recINFO {} {
-}
-
-#=============================================================================
-
-set test_files [::qutest::start]
-
-foreach test $test_files {
- if {[catch {::qutest::run $test} msg]} {
- ::qutest::test_failed
- puts $errorInfo
-
- ;# wait until timeout
- while {[::qutest::wait4input]} {
- }
- ::qutest::tran DONE
- }
-}
-
-::qutest::finish
diff --git a/qspy/tcludp/ChangeLog b/qspy/tcludp/ChangeLog
deleted file mode 100644
index edf7b88..0000000
--- a/qspy/tcludp/ChangeLog
+++ /dev/null
@@ -1,249 +0,0 @@
-2014-08-22 Huub Eikens
-
- * generic/udp_tcl.c,tests/*.test:
- - solved tcl8.6.2 incompatility issue (see http://core.tcl.tk/tcl/tktview/1ff0660e6e)
- - updated unit tests
-
-2014-02-14 Huub Eikens
-
- * generic/udp_tcl.c,tests/*.test:
- - added IPV6 support
- - enhanced reuse option for use on all platforms
- - refactored get/set option functions
- - enhanced mcastadd/drop option to be able to specify network interface
-
-2008-07-06 Pat Thoyts
-
- * generic/udp_tcl.c: Applied patch #1828920 (marttj) to prevent a
- * tests/udp.test: crash calling udp_peek with wrong args.
-
- * generic/udp_tcl.c: Applied patch #1838467 (marttj) to avoid a crash
- * tests/udp.test: when exiting with an open mcast socket.
-
- * generic/udp_tcl.c: Applied patch #1838459 (marttj) to properly
- * tests/udp.test: handle appending to a shared list object in
- -mcastadd. Added tests.
-
-2008-07-05 Pat Thoyts
-
- * generic/udp_tcl.c: Applied patch 1848365 (marttj) to accept any
- * tests/udp.test: boolean value for -mcastloop (plus tests).
-
-2007-04-10 Pat Thoyts
-
- * generic/udp_tcl.c: Applied patch 1693037 from Uwe Klein to
- enable setting the SO_REUSEADDR socket option when creating a new
- udp socket.
- Improved error reporting on Windows.
-
-2007-03-30 Pat Thoyts
-
- * generic/udp_tcl.c: Added support for IP_MULTICAST_LOOP for
- Konstantin Khomoutov to control multicast loopback transmission.
- Improved the error reporting by using strerror if available.
- * Makefile.in: Fix 'make shell' to load the built library.
- * configure.in: Incremented version and use TEA 3.6
- * tclconfig/*: Upgraded to TEA 3.6
- * aclocal.m4: Check for strerror presence.
-
-2007-01-31 Pat Thoyts
-
- * generic/udp_tcl.c: Turns out the HP-UX patch break buiding on
- AIX so made the check more specific (from Jeff Hobbs again).
-
-2007-01-21 Pat Thoyts
-
- * generic/udp_tcl.c: Applied HP-UX patch #1639930 from tclguy.
-
-2006-07-11 Pat Thoyts
-
- * generic/udp_tcl.c: Added some timing to tests and changed the
- * tests/udp-srv.tcl: service name lookup (was very slow on linux)
-
-2006-06-20 Pat Thoyts
-
- * TAG: ==== tcludp-1_0_8 ====
- * RELEASE: Released version 1.0.8
-
-2006-06-20 Pat Thoyts
-
- * generic/udp_tcl.c: Stick to ckalloc/ckfree.
- * tests/udp-srv.test: Added new test file which runs a child
- proces as a udp server.
- * tests/all.tcl: Support 8.2 and 8.3 test package.
-
-2006-05-15 Pat Thoyts
-
- * aclocal.m4: Added check for fcntl.h and the FD_CLOEXEC flag
- * generic/udp_tcl.c: bug #1477669 - set the close-on-exec flag for
- the socket to avoid child processes inheriting
- our sockets
- * configure: Regenerated with autoconf 2.59
- * configure.in: Added call to project specific code.
- * tclconfig/tcl.m4: Updated
-
-2006-03-03 Pat Thoyts
-
- * tclconfig/*: Updated to TEA 3.5
- * configure: Regenerated.
- * generic/udp_tcl.c: Applied patch from bug #1245141 to use
- socklen_t type correctly (Tru64 uses a
- 64bit long for socklen_t)
- * generic/udp_tcl.c: Included a Udp_SafeInit function. Some versions
- of MacOSX are wierd about apps testing for
- missing functions in shared libs. (#1439508)
-
-2005-11-27 Pat Thoyts
-
- * generic/udp_tcl.c: bug #1240127 - handle possible missing IP_TTL
- * generic/udp_tcl.c: bug #1358181 - fix for NetBSD 2.0
- * aclocal.m4: bug #1358189 - better method for finding dtplite
- * win/makefile.vc: Increment version to 1.0.8
- * configure.in:
- * configure: regenerated
-
-2005-05-20 Pat Thoyts
-
- * TAG: ==== tcludp-1_0_7 ====
- * RELEASE: Released version 1.0.7
-
-2005-05-19 Pat Thoyts
-
- * generic/udp_tcl.c: Deal with bug #1178996 by changing the code
- used to cleanup sockets under Windows.
- * generic/udp_tcl.c: fconfigure options were returning lists of
- lists. Fixed.
- * tclconfig/*: Updated TEA files to TEA 3.2
- * configure.in:
- * Makefile.in:
-
-2005-05-17 Pat Thoyts
-
- * win/rules.vc: Applied patch 1092432 by westrick85 to handle
- paths with spaces better.
-
-2005-04-27 Pat Thoyts
-
- * demos/bug1158628.tcl: Demo file for this bug.
- * generic/udp_tcl.c: Applied a fix for bug #1158628 from Reinhard
- Max which avoids hanging Tcl while exiting with open channels.
- * configure.in: Moved version to 1.0.7
- * win/makefile.vc:
-
-2004-11-23 Pat Thoyts
-
- * demos/chat.tcl: Sample Tk chat app using multicast udp.
-
-2004-11-22 Pat Thoyts
-
- * TAG: ==== tcludp-1_0_6 ====
-
- * win/makefile.vc: Improved the win build system.
- * demos/*: Added a few sample applications, demos of broadcast,
- multicast and normal operation.
- * tools/mpexpand.tcl: Added app for generating documentation.
-
- * generic/udp_tcl.h: Done some testing with multicast and have
- * generic/udp_tcl.c: rationalised the fconfigure/udp_conf interfaces
- a bit better. The -ttl option will set the multicast ttl if the
- socket has been added to a multicast group.
- Now maintains a list of groups so that this can be inspected and
- when the socket is closed we will call mcastdrop for each item.
-
- * generic/udp_tcl.h: Fixed the -ttl option for Windows.
- * generic/udp_tcl.c: Added support for setting and retrieving the
- TTL option on the socket. The default is specified by the system
- but can be set for individual sockets.
-
-2004-02-09 Pat Thoyts
-
- * generic/udp_tcl.c: Followed up a suggestion in patch #794072 to
- support udp broadcast packets. This can be queried/enabled using
- fconfigure $s -broadcast ?1|0?
-
- * generic/udp_tcl.c: Fixes for some errors in the Win32 code
- in udpClose provided in patch #820255.
-
- * all: INCREMENTED VERSION TO 1.0.6
-
- * generic/udp_tcl.c: Applied fix from bug #833700 to close a
- memory leak in UDP_CheckProc.
-
- * Makefile.in: Fixed to build in directories other than the top
- of the source tree.
-
- * generic/udp_tcl.c: Applied the patch from bug #810572 which
- fixes a memory leak in udp_open - from D. Richard Hipp?
-
- * generic/udp_tcl.h: Fix for missing define WIN32 sometimes.
-
- * win/makefile.vc: Added the standard windows nmake makefiles
- * win/nmakehlp.c: from the sampleextension project.
- * win/rules.vc: Visual Studio project updated as a Makefile
- * win/tcludp.dsp: project.
-
-2003-10-14 Pat Thoyts
-
- * generic/udp_tcl.c: Fix CONSTness for Tcl < 8.4
-
-2003-06-13 Pat Thoyts
-
- * generic/udp_tcl.c: Cleaned up some -Wall warnings under unix.
- * generic/udp_tcl.h: " "
- * win/tcludp.rc: Updated the version number and fixed line endings
- * doc/udp.man: " "
-
-2003-03-21 Pat Thoyts
-
- * generic/udp_tcl.c: define ioctlsocket for unix
-
-2003-03-12 Pat Thoyts
-
- * win/tcludp.dsp:
- * configure.in: bumped patchlevel to 1.0.5
-
-2003-03-05 Pat Thoyts
-
- * generic/udp_tcl.c: General layout rearrangement to put tcl
- command procs, channel handler procs and utility procs together.
- * generic/udp_tcl.c: Added channel option handlers to enable the
- use of 'fconfigure' to hopefully replace udp_conf.
- * generic/udp_tcl.c (udpGetHandle): Fixed to return the handle
- properly.
-
-2003-03-03 Pat Thoyts
-
- * generic/udp_tcl.c: Fix include list to use the autoconfig test
- results. Fixes for CONST Tcl 8.3/8.4 compatability.
- * genetic/udp_tcl.c: Enhanced udp_open and udp_conf to permit the
- use of symbolic port names. Added some tests for this.
-
-2003-02-27 Pat Thoyts
-
- * generic/udp_tcl.c: Stop a crash when udp_conf -remote called
- before setting the remote host.
- * tests: Added tests directory and some basic tests.
- * doc: Added doc directory with doctools format man page.
- * Makefile.in: fixed the documentation in the build.
- * README: rewrote as installation instructions.
- * license.terms: copyright as perl the udp_tcl.c file.
- * tclconfig: brought in the newer versions from tcl cvs.
- * tcludp.dsp: updated.
-
-2003-02-20 Pat Thoyts
-
- * all: Re-structured as a TEA2 compatible package and sorted out
- the configure/make files.
-
-2003-02-20 Pat Thoyts
-
- * udp_tcl.c: Reduced the number of WIN32 sections using a few
- macros and reformatted whitespace. Also CONSITification.
- * udp_tcl.c (udpInput): Fixed a problem with receiving binary data.
-
-2003-01-30 Pat Thoyts
-
- * udp_tcl.c: Added support for stubs and a package declaration.
-
-
-
\ No newline at end of file
diff --git a/qspy/tcludp/Makefile.in b/qspy/tcludp/Makefile.in
deleted file mode 100644
index ad05ec8..0000000
--- a/qspy/tcludp/Makefile.in
+++ /dev/null
@@ -1,450 +0,0 @@
-# Makefile.in --
-#
-# This file is a Makefile for TclUDP. If it has the name
-# "Makefile.in" then it is a template for a Makefile; to generate the
-# actual Makefile, run "./configure", which is a configuration script
-# generated by the "autoconf" program (constructs like "@foo@" will get
-# replaced in the actual Makefile.
-#
-# Copyright (c) 1999 Scriptics Corporation.
-# Copyright (c) 2002-2005 ActiveState Corporation.
-#
-# See the file "license.terms" for information on usage and redistribution
-# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
-#
-# RCS: @(#) $Id: Makefile.in,v 1.9 2007/04/10 12:25:57 patthoyts Exp $
-
-#========================================================================
-# Add additional lines to handle any additional AC_SUBST cases that
-# have been added in a customized configure script.
-#========================================================================
-
-#SAMPLE_NEW_VAR = @SAMPLE_NEW_VAR@
-
-#========================================================================
-# Nothing of the variables below this line should need to be changed.
-# Please check the TARGETS section below to make sure the make targets
-# are correct.
-#========================================================================
-
-#========================================================================
-# The names of the source files is defined in the configure script.
-# The object files are used for linking into the final library.
-# This will be used when a dist target is added to the Makefile.
-# It is not important to specify the directory, as long as it is the
-# $(srcdir) or in the generic, win or unix subdirectory.
-#========================================================================
-
-PKG_SOURCES = @PKG_SOURCES@
-PKG_OBJECTS = @PKG_OBJECTS@
-
-PKG_STUB_SOURCES = @PKG_STUB_SOURCES@
-PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@
-
-#========================================================================
-# PKG_TCL_SOURCES identifies Tcl runtime files that are associated with
-# this package that need to be installed, if any.
-#========================================================================
-
-PKG_TCL_SOURCES = @PKG_TCL_SOURCES@
-
-#========================================================================
-# This is a list of public header files to be installed, if any.
-#========================================================================
-
-PKG_HEADERS = @PKG_HEADERS@
-
-#========================================================================
-# "PKG_LIB_FILE" refers to the library (dynamic or static as per
-# configuration options) composed of the named objects.
-#========================================================================
-
-PKG_LIB_FILE = @PKG_LIB_FILE@
-PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@
-
-lib_BINARIES = $(PKG_LIB_FILE)
-BINARIES = $(lib_BINARIES)
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-libdir = @libdir@
-datadir = @datadir@
-mandir = @mandir@
-includedir = @includedir@
-
-DESTDIR =
-
-PKG_DIR = $(PACKAGE_NAME)$(PACKAGE_VERSION)
-pkgdatadir = $(datadir)/$(PKG_DIR)
-pkglibdir = $(libdir)/$(PKG_DIR)
-pkgincludedir = $(includedir)/$(PKG_DIR)
-
-top_builddir = .
-
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-CC = @CC@
-CFLAGS_DEFAULT = @CFLAGS_DEFAULT@
-CFLAGS_WARNING = @CFLAGS_WARNING@
-CLEANFILES = @CLEANFILES@
-EXEEXT = @EXEEXT@
-LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@
-MAKE_LIB = @MAKE_LIB@
-MAKE_SHARED_LIB = @MAKE_SHARED_LIB@
-MAKE_STATIC_LIB = @MAKE_STATIC_LIB@
-MAKE_STUB_LIB = @MAKE_STUB_LIB@
-OBJEXT = @OBJEXT@
-RANLIB = @RANLIB@
-RANLIB_STUB = @RANLIB_STUB@
-SHLIB_CFLAGS = @SHLIB_CFLAGS@
-SHLIB_LD = @SHLIB_LD@
-SHLIB_LD_LIBS = @SHLIB_LD_LIBS@
-STLIB_LD = @STLIB_LD@
-TCL_DEFS = @TCL_DEFS@
-TCL_BIN_DIR = @TCL_BIN_DIR@
-TCL_SRC_DIR = @TCL_SRC_DIR@
-# This is necessary for packages that use private Tcl headers
-#TCL_TOP_DIR_NATIVE = @TCL_TOP_DIR_NATIVE@
-# Not used, but retained for reference of what libs Tcl required
-TCL_LIBS = @TCL_LIBS@
-
-#========================================================================
-# TCLLIBPATH seeds the auto_path in Tcl's init.tcl so we can test our
-# package without installing. The other environment variables allow us
-# to test against an uninstalled Tcl. Add special env vars that you
-# require for testing here (like TCLX_LIBRARY).
-#========================================================================
-
-EXTRA_PATH = $(top_builddir):$(TCL_BIN_DIR)
-TCLLIBPATH += $(top_builddir)
-TCLSH_ENV = TCL_LIBRARY=`@CYGPATH@ $(TCL_SRC_DIR)/library` \
- @LD_LIBRARY_PATH_VAR@="$(EXTRA_PATH):$(@LD_LIBRARY_PATH_VAR@)" \
- PATH="$(EXTRA_PATH):$(PATH)" \
- TCLLIBPATH="$(TCLLIBPATH)"
-TCLSH_PROG = @TCLSH_PROG@
-TCLSH = $(TCLSH_ENV) $(TCLSH_PROG)
-SHARED_BUILD = @SHARED_BUILD@
-
-INCLUDES = @PKG_INCLUDES@ @TCL_INCLUDES@
-
-PKG_CFLAGS = @PKG_CFLAGS@
-
-# TCL_DEFS is not strictly need here, but if you remove it, then you
-# must make sure that configure.in checks for the necessary components
-# that your library may use. TCL_DEFS can actually be a problem if
-# you do not compile with a similar machine setup as the Tcl core was
-# compiled with.
-#DEFS = $(TCL_DEFS) @DEFS@ $(PKG_CFLAGS)
-DEFS = @DEFS@ $(PKG_CFLAGS)
-
-CONFIG_CLEAN_FILES = Makefile
-
-CPPFLAGS = @CPPFLAGS@
-LIBS = @PKG_LIBS@ @LIBS@
-AR = @AR@
-CFLAGS = @CFLAGS@
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-
-#========================================================================
-# Start of user-definable TARGETS section
-#========================================================================
-
-#========================================================================
-# TEA TARGETS. Please note that the "libraries:" target refers to platform
-# independent files, and the "binaries:" target inclues executable programs and
-# platform-dependent libraries. Modify these targets so that they install
-# the various pieces of your package. The make and install rules
-# for the BINARIES that you specified above have already been done.
-#========================================================================
-
-all: binaries libraries doc
-
-#========================================================================
-# The binaries target builds executable programs, Windows .dll's, unix
-# shared/static libraries, and any other platform-dependent files.
-# The list of targets to build for "binaries:" is specified at the top
-# of the Makefile, in the "BINARIES" variable.
-#========================================================================
-
-binaries: $(BINARIES) pkgIndex.tcl-hand
-
-libraries:
-
-
-#========================================================================
-# Your doc target should differentiate from doc builds (by the developer)
-# and doc installs (see install-doc), which just install the docs on the
-# end user machine when building from source.
-#========================================================================
-
-DTPLITE=@DTPLITE@
-doc: udp.n
-
-udp.n: $(srcdir)/doc/udp.man
- @if [ -n "$(DTPLITE)" -a -x "$(DTPLITE)" ]; then \
- $(DTPLITE) -o $@ nroff $(srcdir)/doc/udp.man ; \
- fi
-
-udp.html: $(srcdir)/doc/udp.man
- @if [ -n "$(DTPLITE)" -a -x "$(DTPLITE)" ]; then \
- $(DTPLITE) -o $@ html $(srcdir)/doc/udp.man ; \
- fi
-
-install: all install-binaries install-libraries install-doc
-
-install-binaries: binaries install-lib-binaries install-bin-binaries
-
-#========================================================================
-# This rule installs platform-independent files, such as header files.
-# The list=...; for p in $$list handles the empty list case x-platform.
-#========================================================================
-
-install-libraries: libraries
- @mkdir -p $(DESTDIR)$(includedir)
- @echo "Installing header files in $(DESTDIR)$(includedir)"
- @list='$(PKG_HEADERS)'; for i in $$list; do \
- echo "Installing $(srcdir)/$$i" ; \
- $(INSTALL_DATA) $(srcdir)/$$i $(DESTDIR)$(includedir) ; \
- done;
-
-#========================================================================
-# Install documentation. Unix manpages should go in the $(mandir)
-# directory.
-#========================================================================
-
-install-doc: doc
- @mkdir -p $(DESTDIR)$(mandir)/mann
- @echo "Installing documentation in $(DESTDIR)$(mandir)"
- @list='$(srcdir)/doc/*.n'; for i in $$list; do \
- echo "Installing $$i"; \
- rm -f $(DESTDIR)$(mandir)/mann/`basename $$i`; \
- $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/mann ; \
- done
-
-test: binaries libraries
- $(TCLSH) `@CYGPATH@ $(srcdir)/tests/all.tcl` $(TESTFLAGS)
-
-shell: binaries libraries
- @$(TCLSH) $(SCRIPT)
-
-gdb:
- @$(TCLSH_ENV) gdb $(TCLSH_PROG) $(SCRIPT)
-
-depend:
-
-#========================================================================
-# $(PKG_LIB_FILE) should be listed as part of the BINARIES variable
-# mentioned above. That will ensure that this target is built when you
-# run "make binaries".
-#
-# The $(PKG_OBJECTS) objects are created and linked into the final
-# library. In most cases these object files will correspond to the
-# source files above.
-#========================================================================
-
-$(PKG_LIB_FILE): $(PKG_OBJECTS)
- -rm -f $(PKG_LIB_FILE)
- ${MAKE_LIB}
- $(RANLIB) $(PKG_LIB_FILE)
-
-$(PKG_STUB_LIB_FILE): $(PKG_STUB_OBJECTS)
- -rm -f $(PKG_STUB_LIB_FILE)
- ${MAKE_STUB_LIB}
- $(RANLIB_STUB) $(PKG_STUB_LIB_FILE)
-
-#========================================================================
-# We need to enumerate the list of .c to .o lines here.
-#
-# In the following lines, $(srcdir) refers to the toplevel directory
-# containing your extension. If your sources are in a subdirectory,
-# you will have to modify the paths to reflect this:
-#
-# sample.$(OBJEXT): $(srcdir)/generic/sample.c
-# $(COMPILE) -c `@CYGPATH@ $(srcdir)/generic/sample.c` -o $@
-#
-# Setting the VPATH variable to a list of paths will cause the makefile
-# to look into these paths when resolving .c to .obj dependencies.
-# As necessary, add $(srcdir):$(srcdir)/compat:....
-#========================================================================
-
-VPATH = $(srcdir):$(srcdir)/generic:$(srcdir)/unix:$(srcdir)/win
-
-.c.@OBJEXT@:
- $(COMPILE) -c `@CYGPATH@ $<` -o $@
-
-#========================================================================
-# Create the pkgIndex.tcl file.
-# It is usually easiest to let Tcl do this for you with pkg_mkIndex, but
-# you may find that you need to customize the package. If so, either
-# modify the -hand version, or create a pkgIndex.tcl.in file and have
-# the configure script output the pkgIndex.tcl by editing configure.in.
-#========================================================================
-
-pkgIndex.tcl: $(PKG_LIB_FILE)
- ( echo pkg_mkIndex . $(PKG_LIB_FILE) \; exit; ) | $(TCLSH)
-
-pkgIndex.tcl-hand:
- (echo 'package ifneeded $(PACKAGE_NAME) $(PACKAGE_VERSION) \
- [list load [file join $$dir $(PKG_LIB_FILE)]]'\
- ) > pkgIndex.tcl
-
-#========================================================================
-# Distribution creation
-# You may need to tweak this target to make it work correctly.
-#========================================================================
-
-#COMPRESS = tar cvf $(PKG_DIR).tar $(PKG_DIR); compress $(PKG_DIR).tar
-COMPRESS = gtar zcvf $(PKG_DIR).tar.gz $(PKG_DIR)
-DIST_ROOT = /tmp/dist
-DIST_DIR = $(DIST_ROOT)/$(PKG_DIR)
-
-dist-clean:
- rm -rf $(DIST_DIR) $(DIST_ROOT)/$(PKG_DIR).tar.*
-
-dist: dist-clean
- mkdir -p $(DIST_DIR)
- cp -p $(srcdir)/ChangeLog $(srcdir)/README* $(srcdir)/license* \
- $(srcdir)/aclocal.m4 $(srcdir)/configure $(srcdir)/*.in \
- $(DIST_DIR)/
- chmod 664 $(DIST_DIR)/Makefile.in $(DIST_DIR)/aclocal.m4
- chmod 775 $(DIST_DIR)/configure $(DIST_DIR)/configure.in
-
- for i in $(srcdir)/*.[ch]; do \
- if [ -f $$i ]; then \
- cp -p $$i $(DIST_DIR)/ ; \
- fi; \
- done;
-
- mkdir $(DIST_DIR)/tclconfig
- cp $(srcdir)/tclconfig/install-sh $(srcdir)/tclconfig/tcl.m4 \
- $(DIST_DIR)/tclconfig/
- chmod 664 $(DIST_DIR)/tclconfig/tcl.m4
- chmod +x $(DIST_DIR)/tclconfig/install-sh
-
- list='demos doc generic library mac tests unix win'; \
- for p in $$list; do \
- if test -d $(srcdir)/$$p ; then \
- mkdir $(DIST_DIR)/$$p; \
- cp -p $(srcdir)/$$p/*.* $(DIST_DIR)/$$p/; \
- fi; \
- done
-
- (cd $(DIST_ROOT); $(COMPRESS);)
-
-#========================================================================
-# End of user-definable section
-#========================================================================
-
-#========================================================================
-# Don't modify the file to clean here. Instead, set the "CLEANFILES"
-# variable in configure.in
-#========================================================================
-
-clean:
- -test -z "$(BINARIES)" || rm -f $(BINARIES)
- -rm -f *.$(OBJEXT) core *.core
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean: clean
- -rm -f *.tab.c
- -rm -f $(CONFIG_CLEAN_FILES)
- -rm -f config.cache config.log config.status
-
-#========================================================================
-# Install binary object libraries. On Windows this includes both .dll and
-# .lib files. Because the .lib files are not explicitly listed anywhere,
-# we need to deduce their existence from the .dll file of the same name.
-# Library files go into the lib directory.
-# In addition, this will generate the pkgIndex.tcl
-# file in the install location (assuming it can find a usable tclsh shell)
-#
-# You should not have to modify this target.
-#========================================================================
-
-install-lib-binaries: binaries
- @mkdir -p $(DESTDIR)$(pkglibdir)
- @list='$(lib_BINARIES)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p"; \
- $(INSTALL_PROGRAM) $$p $(DESTDIR)$(pkglibdir)/$$p; \
- stub=`echo $$p|sed -e "s/.*\(stub\).*/\1/"`; \
- if test "x$$stub" = "xstub"; then \
- echo " $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p"; \
- $(RANLIB_STUB) $(DESTDIR)$(pkglibdir)/$$p; \
- else \
- echo " $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p"; \
- $(RANLIB) $(DESTDIR)$(pkglibdir)/$$p; \
- fi; \
- ext=`echo $$p|sed -e "s/.*\.//"`; \
- if test "x$$ext" = "xdll"; then \
- lib=`basename $$p|sed -e 's/.[^.]*$$//'`.lib; \
- if test -f $$lib; then \
- echo " $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib"; \
- $(INSTALL_DATA) $$lib $(DESTDIR)$(pkglibdir)/$$lib; \
- fi; \
- fi; \
- fi; \
- done
- @list='$(PKG_TCL_SOURCES)'; for p in $$list; do \
- if test -f $(srcdir)/$$p; then \
- destp=`basename $$p`; \
- echo " Install $$destp $(DESTDIR)$(pkglibdir)/$$destp"; \
- $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(pkglibdir)/$$destp; \
- fi; \
- done
- @if test "x$(SHARED_BUILD)" = "x1"; then \
- echo " Install pkgIndex.tcl $(DESTDIR)$(pkglibdir)"; \
- $(INSTALL_DATA) pkgIndex.tcl $(DESTDIR)$(pkglibdir); \
- fi
-
-#========================================================================
-# Install binary executables (e.g. .exe files and dependent .dll files)
-# This is for files that must go in the bin directory (located next to
-# wish and tclsh), like dependent .dll files on Windows.
-#
-# You should not have to modify this target, except to define bin_BINARIES
-# above if necessary.
-#========================================================================
-
-install-bin-binaries: binaries
- @mkdir -p $(DESTDIR)$(bindir)
- @list='$(bin_BINARIES)'; for p in $$list; do \
- if test -f $$p; then \
- echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p"; \
- $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/$$p; \
- fi; \
- done
-
-.SUFFIXES: .c .$(OBJEXT)
-
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) \
- && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
-
-uninstall-binaries:
- list='$(lib_BINARIES)'; for p in $$list; do \
- rm -f $(DESTDIR)$(pkglibdir)/$$p; \
- done
- list='$(PKG_TCL_SOURCES)'; for p in $$list; do \
- p=`basename $$p`; \
- rm -f $(DESTDIR)$(pkglibdir)/$$p; \
- done
- list='$(bin_BINARIES)'; for p in $$list; do \
- rm -f $(DESTDIR)$(bindir)/$$p; \
- done
-
-.PHONY: all binaries clean depend distclean doc install libraries test
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/qspy/tcludp/README b/qspy/tcludp/README
deleted file mode 100644
index bc57d7c..0000000
--- a/qspy/tcludp/README
+++ /dev/null
@@ -1,87 +0,0 @@
-TclUDP
-======
-
-This package provides UDP sockets for Tcl.
-
-INSTALLATION
-============
-
-This package uses the Tcl Extension Architecture (TEA). Please see the
-web page
-
- http://www.tcl.tk/doc/tea/
-
-for more information about TEA.
-
-UNIX BUILD
-==========
-
-Building under most UNIX systems is easy, just run the configure script
-and then run make. For more information about the build process, see
-the tcl/unix/README file in the Tcl src dist.
-
-Following examples use the tclConfig.sh script. This script comes with the
-installation of Tcl and contains useful data about the installation.
-
-Linux
------
-
-To install Tcl, use e.g. 'apt-get|yum install tcl-devel. tcllib'.
-The tclConfig.sh script is located in the folder /usr/lib/
-
- $ cd tcludp
- $ ./configure --with-tcl=/usr/lib/
- $ make
- $ make test
- $ make install
-
-MacOSX
-------
-To install Tcl, use e.g. ActiveState Tcl distribution. The tclConfig.sh script
-is located in the folder /Library/Frameworks/Tcl.framework/
-
- $ cd tcludp
- $ ./configure --with-tcl=/Library/Frameworks/Tcl.framework/
- $ make
- $ make test
- $ make install
-
-WINDOWS BUILD
-=============
-
-See the tcl/win/README file included in the Tcl src dist for details
-about how to build the extension under Windows. We suggest using
-the Msys + Mingw build process since it is significantly easier
-than building with VC++ or Cygwin.
-
-This package includes a Visual Studio project file to help in building
-with VC++.
-
-The package has been built using both VC++6 and Msys + Mingw.
-
-Microsoft Platform SDK 2003 is required for building. The following minimal
-example will install the extension in the C:\Tcl\lib directory.
-
- $ cd tcludp/win
- $ nmake -f makefile.vc realclean all
- $ nmake -f makefile.vc install INSTALLDIR=C:\Tcl\lib
-
-DOCUMENTATION BUILD
-===================
-
-Use the following command to create the UNIX documentation (based on udp.man file):
-
- $ cd tcludp
- $ ./tools/mpexpand.tcl nroff ./doc/udp.man ./doc/udp.n
- $ nroff -man ./doc/udp.n
-
-FEEDBACK
-========
-
-If you have any problem with this extension, please contact Xiaotao Wu
-
-Name : Xiaotao Wu
-Email : xiaotaow@cs.columbia.edu, xw71@columbia.edu
-URL : http://www.cs.columbia.edu/~xiaotaow
-Phone : (212)939-7020, (212)939-7133, Fax: (801)751-0217
-SIP : sip:xiaotaow@conductor.cs.columbia.edu
diff --git a/qspy/tcludp/aclocal.m4 b/qspy/tcludp/aclocal.m4
deleted file mode 100644
index 83a84ab..0000000
--- a/qspy/tcludp/aclocal.m4
+++ /dev/null
@@ -1,119 +0,0 @@
-#
-# Include the TEA standard macro set
-#
-
-builtin(include,tclconfig/tcl.m4)
-
-#
-# Add here whatever m4 macros you want to define for your package
-#
-
-#--------------------------------------------------------------------
-# TEA_ENABLE_INET6
-#
-# Check for Internet Protocol v6 support.
-#
-# Adds a --enable-ipv6 option to the configure program and
-# may define a new macro USE_INET6
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(TEA_ENABLE_INET6, [
- AC_MSG_CHECKING([for INET6 support])
- AC_ARG_ENABLE(inet6, [ --enable-ipv6 build with ipv6],
- [inet6_ok=$enableval], [inet6_ok=no])
- AC_DEFINE(USE_INET6)
- if test "$inet6_ok" = "yes"
- then
- AC_MSG_RESULT([yes])
- USE_INET6=1
-
- AC_CHECK_LIB(c,getaddrinfo,[inet6_ok=yes],[inet6_ok=no])
- if test "$inet6_ok" = "yes"
- then
- #CFLAGS="$CFLAGS -DUSE_INET6"
- TEA_ADD_CFLAGS([-DUSE_INET6])
- else
- USE_INET6=no
- AC_MSG_ERROR([Cannot find getaddrinfo() - inet6 support disabled])
- fi
-
- else
- USE_INET6=0
- AC_MSG_RESULT([no (default)])
- fi
-
- AC_SUBST(USE_INET6)
-])
-
-#-------------------------------------------------------------------------
-# TEA_PROG_DTPLITE
-#
-# Do we have a usable dtplite program to use in document generation?
-#
-# Results
-# Sets up DTPLITE
-#
-#-------------------------------------------------------------------------
-
-AC_DEFUN(TEA_PROG_DTPLITE, [
- AC_PATH_TOOL([DTPLITE], [dtplite], [:])
-])
-
-#-------------------------------------------------------------------------
-# TCLUDP_CHECK_CLOEXEC
-#
-# Do we have the FD_CLOEXEC flag available for fcntl()
-#
-# Results
-# Sets up HAVE_FCNTL_H and HAVE_FLAG_FD_CLOEXEC
-#
-#-------------------------------------------------------------------------
-
-AC_DEFUN(TCLUDP_CHECK_CLOEXEC, [
- AC_CHECK_HEADERS(fcntl.h)
- AC_CACHE_CHECK([for usable FD_CLOEXEC flag],tcludp_cloexec,
- AC_TRY_COMPILE([
-#if HAVE_UNISTD_H
-#include
-#endif
-#if HAVE_FCNTL_H
-#include
-#endif
-],[fcntl(1, F_SETFD, FD_CLOEXEC);],tcludp_cloexec=yes,tcludp_cloexec=no))
- if test "$tcludp_cloexec" = "yes" ; then
- AC_DEFINE(HAVE_FLAG_FD_CLOEXEC, 1, [Can we use FD_CLOEXEC with fcntl?])
- fi
-])
-
-#-------------------------------------------------------------------------
-# TCLUDP_CHECK_STRERROR
-#
-# Do we have strerror()
-#
-# Results
-# Sets HAVE_STRERROR
-#
-#-------------------------------------------------------------------------
-
-AC_DEFUN(TCLUDP_CHECK_STRERROR, [
- AC_CHECK_LIB(c,strerror,[tcludp_strerror_ok=yes],[tcludp_strerror_ok=no])
- if test "$tcludp_strerror_ok" = "yes"; then
- TEA_ADD_CFLAGS([-DHAVE_STRERROR])
- fi
-])
-
-#-------------------------------------------------------------------------
-# TCLUDP_CONFIG
-#
-# Do any TCLUDP specific configuration here.
-#
-# Results
-# See the individual sections referenced.
-#
-#-------------------------------------------------------------------------
-
-AC_DEFUN(TCLUDP_CONFIG, [
- TCLUDP_CHECK_CLOEXEC
- TCLUDP_CHECK_STRERROR
-])
diff --git a/qspy/tcludp/configure b/qspy/tcludp/configure
deleted file mode 100644
index 902df7e..0000000
--- a/qspy/tcludp/configure
+++ /dev/null
@@ -1,10012 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for udp 1.0.11.
-#
-#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
-#
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## -------------------- ##
-## M4sh Initialization. ##
-## -------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '${1+"$@"}'='"$@"'
- setopt NO_GLOB_SUBST
-else
- case `(set -o) 2>/dev/null` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-
-
-as_nl='
-'
-export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- PATH_SEPARATOR=:
- (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
- (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
- PATH_SEPARATOR=';'
- }
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
-# Find who we are. Look in the path if we contain no directory separator.
-as_myself=
-case $0 in #((
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
- done
-IFS=$as_save_IFS
-
- ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
- as_myself=$0
-fi
-if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
- exit 1
-fi
-
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-# Use a proper internal environment variable to ensure we don't fall
- # into an infinite loop, continuously re-executing ourselves.
- if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
- _as_can_reexec=no; export _as_can_reexec;
- # We cannot yet assume a decent shell, so we have to provide a
-# neutralization value for shells without unset; and this also
-# works around shells that cannot unset nonexistent variables.
-# Preserve -v and -x to the replacement shell.
-BASH_ENV=/dev/null
-ENV=/dev/null
-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
-esac
-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
-# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
- fi
- # We don't want this to propagate to other subprocesses.
- { _as_can_reexec=; unset _as_can_reexec;}
-if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
- emulate sh
- NULLCMD=:
- # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
- # is contrary to our usage. Disable this feature.
- alias -g '\${1+\"\$@\"}'='\"\$@\"'
- setopt NO_GLOB_SUBST
-else
- case \`(set -o) 2>/dev/null\` in #(
- *posix*) :
- set -o posix ;; #(
- *) :
- ;;
-esac
-fi
-"
- as_required="as_fn_return () { (exit \$1); }
-as_fn_success () { as_fn_return 0; }
-as_fn_failure () { as_fn_return 1; }
-as_fn_ret_success () { return 0; }
-as_fn_ret_failure () { return 1; }
-
-exitcode=0
-as_fn_success || { exitcode=1; echo as_fn_success failed.; }
-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
-
-else
- exitcode=1; echo positional parameters were not saved.
-fi
-test x\$exitcode = x0 || exit 1
-test -x / || exit 1"
- as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
- as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
- eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
- as_have_required=yes
-else
- as_have_required=no
-fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
-
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-as_found=false
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- as_found=:
- case $as_dir in #(
- /*)
- for as_base in sh bash ksh sh5; do
- # Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
- if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
- CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
- break 2
-fi
-fi
- done;;
- esac
- as_found=false
-done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
-IFS=$as_save_IFS
-
-
- if test "x$CONFIG_SHELL" != x; then :
- export CONFIG_SHELL
- # We cannot yet assume a decent shell, so we have to provide a
-# neutralization value for shells without unset; and this also
-# works around shells that cannot unset nonexistent variables.
-# Preserve -v and -x to the replacement shell.
-BASH_ENV=/dev/null
-ENV=/dev/null
-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
-esac
-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
-# Admittedly, this is quite paranoid, since all the known shells bail
-# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-exit 255
-fi
-
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
- else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
-$0: including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
- fi
- exit 1
-fi
-fi
-fi
-SHELL=${CONFIG_SHELL-/bin/sh}
-export SHELL
-# Unset more variables known to interfere with behavior of common tools.
-CLICOLOR_FORCE= GREP_OPTIONS=
-unset CLICOLOR_FORCE GREP_OPTIONS
-
-## --------------------- ##
-## M4sh Shell Functions. ##
-## --------------------- ##
-# as_fn_unset VAR
-# ---------------
-# Portably unset VAR.
-as_fn_unset ()
-{
- { eval $1=; unset $1;}
-}
-as_unset=as_fn_unset
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
- return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
- set +e
- as_fn_set_status $1
- exit $1
-} # as_fn_exit
-
-# as_fn_mkdir_p
-# -------------
-# Create "$as_dir" as a directory, including parents if necessary.
-as_fn_mkdir_p ()
-{
-
- case $as_dir in #(
- -*) as_dir=./$as_dir;;
- esac
- test -d "$as_dir" || eval $as_mkdir_p || {
- as_dirs=
- while :; do
- case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
- *) as_qdir=$as_dir;;
- esac
- as_dirs="'$as_qdir' $as_dirs"
- as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_dir" : 'X\(//\)[^/]' \| \
- X"$as_dir" : 'X\(//\)$' \| \
- X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- test -d "$as_dir" && break
- done
- test -z "$as_dirs" || eval "mkdir $as_dirs"
- } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
-
-
-} # as_fn_mkdir_p
-
-# as_fn_executable_p FILE
-# -----------------------
-# Test if FILE is an executable regular file.
-as_fn_executable_p ()
-{
- test -f "$1" && test -x "$1"
-} # as_fn_executable_p
-# as_fn_append VAR VALUE
-# ----------------------
-# Append the text in VALUE to the end of the definition contained in VAR. Take
-# advantage of any shell optimizations that allow amortized linear growth over
-# repeated appends, instead of the typical quadratic growth present in naive
-# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
- eval 'as_fn_append ()
- {
- eval $1+=\$2
- }'
-else
- as_fn_append ()
- {
- eval $1=\$$1\$2
- }
-fi # as_fn_append
-
-# as_fn_arith ARG...
-# ------------------
-# Perform arithmetic evaluation on the ARGs, and store the result in the
-# global $as_val. Take advantage of shells that can avoid forks. The arguments
-# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
- eval 'as_fn_arith ()
- {
- as_val=$(( $* ))
- }'
-else
- as_fn_arith ()
- {
- as_val=`expr "$@" || test $? -eq 1`
- }
-fi # as_fn_arith
-
-
-# as_fn_error STATUS ERROR [LINENO LOG_FD]
-# ----------------------------------------
-# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with STATUS, using 1 if that was 0.
-as_fn_error ()
-{
- as_status=$1; test $as_status -eq 0 && as_status=1
- if test "$4"; then
- as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
- fi
- $as_echo "$as_me: error: $2" >&2
- as_fn_exit $as_status
-} # as_fn_error
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
- as_dirname=dirname
-else
- as_dirname=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
-
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-
- as_lineno_1=$LINENO as_lineno_1a=$LINENO
- as_lineno_2=$LINENO as_lineno_2a=$LINENO
- eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
- test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
- # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
- sed -n '
- p
- /[$]LINENO/=
- ' <$as_myself |
- sed '
- s/[$]LINENO.*/&-/
- t lineno
- b
- :lineno
- N
- :loop
- s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
- t loop
- s/-\n.*//
- ' >$as_me.lineno &&
- chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
- # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
- # already done that, so ensure we don't try to do so again and fall
- # in an infinite loop. This has already happened in practice.
- _as_can_reexec=no; export _as_can_reexec
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensitive to this).
- . "./$as_me.lineno"
- # Exit status is that of the last command.
- exit
-}
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in #(((((
--n*)
- case `echo 'xy\c'` in
- *c*) ECHO_T=' ';; # ECHO_T is single tab character.
- xy) ECHO_C='\c';;
- *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
- ECHO_T=' ';;
- esac;;
-*)
- ECHO_N='-n';;
-esac
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
- rm -f conf$$.dir/conf$$.file
-else
- rm -f conf$$.dir
- mkdir conf$$.dir 2>/dev/null
-fi
-if (echo >conf$$.file) 2>/dev/null; then
- if ln -s conf$$.file conf$$ 2>/dev/null; then
- as_ln_s='ln -s'
- # ... but there are two gotchas:
- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -pR'.
- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -pR'
- elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
- else
- as_ln_s='cp -pR'
- fi
-else
- as_ln_s='cp -pR'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
- as_mkdir_p='mkdir -p "$as_dir"'
-else
- test -d ./-p && rmdir ./-p
- as_mkdir_p=false
-fi
-
-as_test_x='test -x'
-as_executable_p=as_fn_executable_p
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-test -n "$DJDIR" || exec 7<&0 &1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-
-# Identity of this package.
-PACKAGE_NAME='udp'
-PACKAGE_TARNAME='udp'
-PACKAGE_VERSION='1.0.11'
-PACKAGE_STRING='udp 1.0.11'
-PACKAGE_BUGREPORT=''
-PACKAGE_URL=''
-
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include
-#ifdef HAVE_SYS_TYPES_H
-# include
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include
-#endif
-#ifdef STDC_HEADERS
-# include
-# include
-#else
-# ifdef HAVE_STDLIB_H
-# include
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include
-# endif
-# include
-#endif
-#ifdef HAVE_STRINGS_H
-# include
-#endif
-#ifdef HAVE_INTTYPES_H
-# include
-#endif
-#ifdef HAVE_STDINT_H
-# include
-#endif
-#ifdef HAVE_UNISTD_H
-# include
-#endif"
-
-ac_subst_vars='LTLIBOBJS
-LIBOBJS
-DTPLITE
-TCLSH_PROG
-VC_MANIFEST_EMBED_EXE
-VC_MANIFEST_EMBED_DLL
-RANLIB_STUB
-MAKE_STUB_LIB
-MAKE_STATIC_LIB
-MAKE_SHARED_LIB
-MAKE_LIB
-TCL_DBGX
-LDFLAGS_DEFAULT
-CFLAGS_DEFAULT
-LD_LIBRARY_PATH_VAR
-SHLIB_CFLAGS
-SHLIB_LD_LIBS
-SHLIB_LD
-STLIB_LD
-CFLAGS_WARNING
-CFLAGS_OPTIMIZE
-CFLAGS_DEBUG
-RC
-CELIB_DIR
-AR
-SHARED_BUILD
-TCL_THREADS
-TCL_INCLUDES
-PKG_OBJECTS
-PKG_SOURCES
-MATH_LIBS
-EGREP
-GREP
-RANLIB
-SET_MAKE
-INSTALL_SCRIPT
-INSTALL_PROGRAM
-INSTALL_DATA
-INSTALL
-CPP
-TCL_SHLIB_LD_LIBS
-TCL_LD_FLAGS
-TCL_EXTRA_CFLAGS
-TCL_DEFS
-TCL_LIBS
-CLEANFILES
-OBJEXT
-ac_ct_CC
-CPPFLAGS
-LDFLAGS
-CFLAGS
-CC
-TCL_STUB_LIB_SPEC
-TCL_STUB_LIB_FLAG
-TCL_STUB_LIB_FILE
-TCL_LIB_SPEC
-TCL_LIB_FLAG
-TCL_LIB_FILE
-TCL_SRC_DIR
-TCL_BIN_DIR
-TCL_PATCH_LEVEL
-TCL_VERSION
-PKG_CFLAGS
-PKG_LIBS
-PKG_INCLUDES
-PKG_HEADERS
-PKG_TCL_SOURCES
-PKG_STUB_OBJECTS
-PKG_STUB_SOURCES
-PKG_STUB_LIB_FILE
-PKG_LIB_FILE
-EXEEXT
-CYGPATH
-target_alias
-host_alias
-build_alias
-LIBS
-ECHO_T
-ECHO_N
-ECHO_C
-DEFS
-mandir
-localedir
-libdir
-psdir
-pdfdir
-dvidir
-htmldir
-infodir
-docdir
-oldincludedir
-includedir
-localstatedir
-sharedstatedir
-sysconfdir
-datadir
-datarootdir
-libexecdir
-sbindir
-bindir
-program_transform_name
-prefix
-exec_prefix
-PACKAGE_URL
-PACKAGE_BUGREPORT
-PACKAGE_STRING
-PACKAGE_VERSION
-PACKAGE_TARNAME
-PACKAGE_NAME
-PATH_SEPARATOR
-SHELL'
-ac_subst_files=''
-ac_user_opts='
-enable_option_checking
-with_tcl
-with_tclinclude
-enable_threads
-enable_shared
-enable_64bit
-enable_64bit_vis
-enable_rpath
-enable_wince
-with_celib
-enable_symbols
-'
- ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-ac_unrecognized_opts=
-ac_unrecognized_sep=
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
- # If the previous option needs an argument, assign it.
- if test -n "$ac_prev"; then
- eval $ac_prev=\$ac_option
- ac_prev=
- continue
- fi
-
- case $ac_option in
- *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
- *=) ac_optarg= ;;
- *) ac_optarg=yes ;;
- esac
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
- case $ac_dashdash$ac_option in
- --)
- ac_dashdash=yes ;;
-
- -bindir | --bindir | --bindi | --bind | --bin | --bi)
- ac_prev=bindir ;;
- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir=$ac_optarg ;;
-
- -build | --build | --buil | --bui | --bu)
- ac_prev=build_alias ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build_alias=$ac_optarg ;;
-
- -cache-file | --cache-file | --cache-fil | --cache-fi \
- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
- ac_prev=cache_file ;;
- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file=$ac_optarg ;;
-
- --config-cache | -C)
- cache_file=config.cache ;;
-
- -datadir | --datadir | --datadi | --datad)
- ac_prev=datadir ;;
- -datadir=* | --datadir=* | --datadi=* | --datad=*)
- datadir=$ac_optarg ;;
-
- -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
- | --dataroo | --dataro | --datar)
- ac_prev=datarootdir ;;
- -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
- | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
- datarootdir=$ac_optarg ;;
-
- -disable-* | --disable-*)
- ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"enable_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval enable_$ac_useropt=no ;;
-
- -docdir | --docdir | --docdi | --doc | --do)
- ac_prev=docdir ;;
- -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
- docdir=$ac_optarg ;;
-
- -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
- ac_prev=dvidir ;;
- -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
- dvidir=$ac_optarg ;;
-
- -enable-* | --enable-*)
- ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"enable_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval enable_$ac_useropt=\$ac_optarg ;;
-
- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
- | --exec | --exe | --ex)
- ac_prev=exec_prefix ;;
- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
- | --exec=* | --exe=* | --ex=*)
- exec_prefix=$ac_optarg ;;
-
- -gas | --gas | --ga | --g)
- # Obsolete; use --with-gas.
- with_gas=yes ;;
-
- -help | --help | --hel | --he | -h)
- ac_init_help=long ;;
- -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
- ac_init_help=recursive ;;
- -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
- ac_init_help=short ;;
-
- -host | --host | --hos | --ho)
- ac_prev=host_alias ;;
- -host=* | --host=* | --hos=* | --ho=*)
- host_alias=$ac_optarg ;;
-
- -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
- ac_prev=htmldir ;;
- -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
- | --ht=*)
- htmldir=$ac_optarg ;;
-
- -includedir | --includedir | --includedi | --included | --include \
- | --includ | --inclu | --incl | --inc)
- ac_prev=includedir ;;
- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
- | --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir=$ac_optarg ;;
-
- -infodir | --infodir | --infodi | --infod | --info | --inf)
- ac_prev=infodir ;;
- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir=$ac_optarg ;;
-
- -libdir | --libdir | --libdi | --libd)
- ac_prev=libdir ;;
- -libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir=$ac_optarg ;;
-
- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
- | --libexe | --libex | --libe)
- ac_prev=libexecdir ;;
- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
- | --libexe=* | --libex=* | --libe=*)
- libexecdir=$ac_optarg ;;
-
- -localedir | --localedir | --localedi | --localed | --locale)
- ac_prev=localedir ;;
- -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
- localedir=$ac_optarg ;;
-
- -localstatedir | --localstatedir | --localstatedi | --localstated \
- | --localstate | --localstat | --localsta | --localst | --locals)
- ac_prev=localstatedir ;;
- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
- | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
- localstatedir=$ac_optarg ;;
-
- -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
- ac_prev=mandir ;;
- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir=$ac_optarg ;;
-
- -nfp | --nfp | --nf)
- # Obsolete; use --without-fp.
- with_fp=no ;;
-
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c | -n)
- no_create=yes ;;
-
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- no_recursion=yes ;;
-
- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
- | --oldin | --oldi | --old | --ol | --o)
- ac_prev=oldincludedir ;;
- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir=$ac_optarg ;;
-
- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
- ac_prev=prefix ;;
- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix=$ac_optarg ;;
-
- -program-prefix | --program-prefix | --program-prefi | --program-pref \
- | --program-pre | --program-pr | --program-p)
- ac_prev=program_prefix ;;
- -program-prefix=* | --program-prefix=* | --program-prefi=* \
- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix=$ac_optarg ;;
-
- -program-suffix | --program-suffix | --program-suffi | --program-suff \
- | --program-suf | --program-su | --program-s)
- ac_prev=program_suffix ;;
- -program-suffix=* | --program-suffix=* | --program-suffi=* \
- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix=$ac_optarg ;;
-
- -program-transform-name | --program-transform-name \
- | --program-transform-nam | --program-transform-na \
- | --program-transform-n | --program-transform- \
- | --program-transform | --program-transfor \
- | --program-transfo | --program-transf \
- | --program-trans | --program-tran \
- | --progr-tra | --program-tr | --program-t)
- ac_prev=program_transform_name ;;
- -program-transform-name=* | --program-transform-name=* \
- | --program-transform-nam=* | --program-transform-na=* \
- | --program-transform-n=* | --program-transform-=* \
- | --program-transform=* | --program-transfor=* \
- | --program-transfo=* | --program-transf=* \
- | --program-trans=* | --program-tran=* \
- | --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name=$ac_optarg ;;
-
- -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
- ac_prev=pdfdir ;;
- -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
- pdfdir=$ac_optarg ;;
-
- -psdir | --psdir | --psdi | --psd | --ps)
- ac_prev=psdir ;;
- -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
- psdir=$ac_optarg ;;
-
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
-
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
- | --sbi=* | --sb=*)
- sbindir=$ac_optarg ;;
-
- -sharedstatedir | --sharedstatedir | --sharedstatedi \
- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
- | --sharedst | --shareds | --shared | --share | --shar \
- | --sha | --sh)
- ac_prev=sharedstatedir ;;
- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
- | --sha=* | --sh=*)
- sharedstatedir=$ac_optarg ;;
-
- -site | --site | --sit)
- ac_prev=site ;;
- -site=* | --site=* | --sit=*)
- site=$ac_optarg ;;
-
- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
- ac_prev=srcdir ;;
- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir=$ac_optarg ;;
-
- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
- | --syscon | --sysco | --sysc | --sys | --sy)
- ac_prev=sysconfdir ;;
- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir=$ac_optarg ;;
-
- -target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target_alias ;;
- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target_alias=$ac_optarg ;;
-
- -v | -verbose | --verbose | --verbos | --verbo | --verb)
- verbose=yes ;;
-
- -version | --version | --versio | --versi | --vers | -V)
- ac_init_version=: ;;
-
- -with-* | --with-*)
- ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"with_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval with_$ac_useropt=\$ac_optarg ;;
-
- -without-* | --without-*)
- ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
- ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
- case $ac_user_opts in
- *"
-"with_$ac_useropt"
-"*) ;;
- *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
- ac_unrecognized_sep=', ';;
- esac
- eval with_$ac_useropt=no ;;
-
- --x)
- # Obsolete; use --with-x.
- with_x=yes ;;
-
- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
- | --x-incl | --x-inc | --x-in | --x-i)
- ac_prev=x_includes ;;
- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes=$ac_optarg ;;
-
- -x-libraries | --x-libraries | --x-librarie | --x-librari \
- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
- ac_prev=x_libraries ;;
- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries=$ac_optarg ;;
-
- -*) as_fn_error $? "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information"
- ;;
-
- *=*)
- ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
- # Reject names that are not valid shell variable names.
- case $ac_envvar in #(
- '' | [0-9]* | *[!_$as_cr_alnum]* )
- as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
- esac
- eval $ac_envvar=\$ac_optarg
- export $ac_envvar ;;
-
- *)
- # FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
- ;;
-
- esac
-done
-
-if test -n "$ac_prev"; then
- ac_option=--`echo $ac_prev | sed 's/_/-/g'`
- as_fn_error $? "missing argument to $ac_option"
-fi
-
-if test -n "$ac_unrecognized_opts"; then
- case $enable_option_checking in
- no) ;;
- fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
- esac
-fi
-
-# Check all directory arguments for consistency.
-for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
- datadir sysconfdir sharedstatedir localstatedir includedir \
- oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
- libdir localedir mandir
-do
- eval ac_val=\$$ac_var
- # Remove trailing slashes.
- case $ac_val in
- */ )
- ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
- eval $ac_var=\$ac_val;;
- esac
- # Be sure to have absolute directory names.
- case $ac_val in
- [\\/$]* | ?:[\\/]* ) continue;;
- NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
- esac
- as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
- as_fn_error $? "working directory cannot be determined"
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
- as_fn_error $? "pwd does not report name of working directory"
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
- ac_srcdir_defaulted=yes
- # Try the directory containing this script, then the parent directory.
- ac_confdir=`$as_dirname -- "$as_myself" ||
-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$as_myself" : 'X\(//\)[^/]' \| \
- X"$as_myself" : 'X\(//\)$' \| \
- X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
- srcdir=$ac_confdir
- if test ! -r "$srcdir/$ac_unique_file"; then
- srcdir=..
- fi
-else
- ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
- test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
- as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
- pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
- srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
- eval ac_env_${ac_var}_set=\${${ac_var}+set}
- eval ac_env_${ac_var}_value=\$${ac_var}
- eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
- eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat <<_ACEOF
-\`configure' configures udp 1.0.11 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE. See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
- -h, --help display this help and exit
- --help=short display options specific to this package
- --help=recursive display the short help of all the included packages
- -V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking ...' messages
- --cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
- -n, --no-create do not create output files
- --srcdir=DIR find the sources in DIR [configure dir or \`..']
-
-Installation directories:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
- --bindir=DIR user executables [EPREFIX/bin]
- --sbindir=DIR system admin executables [EPREFIX/sbin]
- --libexecdir=DIR program executables [EPREFIX/libexec]
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --libdir=DIR object code libraries [EPREFIX/lib]
- --includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
- --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
- --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
- --infodir=DIR info documentation [DATAROOTDIR/info]
- --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
- --mandir=DIR man documentation [DATAROOTDIR/man]
- --docdir=DIR documentation root [DATAROOTDIR/doc/udp]
- --htmldir=DIR html documentation [DOCDIR]
- --dvidir=DIR dvi documentation [DOCDIR]
- --pdfdir=DIR pdf documentation [DOCDIR]
- --psdir=DIR ps documentation [DOCDIR]
-_ACEOF
-
- cat <<\_ACEOF
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
- case $ac_init_help in
- short | recursive ) echo "Configuration of udp 1.0.11:";;
- esac
- cat <<\_ACEOF
-
-Optional Features:
- --disable-option-checking ignore unrecognized --enable/--with options
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --enable-threads build with threads
- --enable-shared build and link with shared libraries (default: on)
- --enable-64bit enable 64bit support (default: off)
- --enable-64bit-vis enable 64bit Sparc VIS support (default: off)
- --disable-rpath disable rpath support (default: on)
- --enable-wince enable Win/CE support (where applicable)
- --enable-symbols build with debugging symbols (default: off)
-
-Optional Packages:
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-tcl directory containing tcl configuration
- (tclConfig.sh)
- --with-tclinclude directory containing the public Tcl header files
- --with-celib=DIR use Windows/CE support library from DIR
-
-Some influential environment variables:
- CC C compiler command
- CFLAGS C compiler flags
- LDFLAGS linker flags, e.g. -L if you have libraries in a
- nonstandard directory
- LIBS libraries to pass to the linker, e.g. -l
- CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if
- you have headers in a nonstandard directory
- CPP C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to the package provider.
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
- # If there are subdirs, report their specific --help.
- for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
- test -d "$ac_dir" ||
- { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
- continue
- ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
- # A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
- case $ac_top_builddir_sub in
- "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
- *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
- esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
- .) # We are building in place.
- ac_srcdir=.
- ac_top_srcdir=$ac_top_builddir_sub
- ac_abs_top_srcdir=$ac_pwd ;;
- [\\/]* | ?:[\\/]* ) # Absolute name.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir
- ac_abs_top_srcdir=$srcdir ;;
- *) # Relative name.
- ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_build_prefix$srcdir
- ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
- cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
- if test -f "$ac_srcdir/configure.gnu"; then
- echo &&
- $SHELL "$ac_srcdir/configure.gnu" --help=recursive
- elif test -f "$ac_srcdir/configure"; then
- echo &&
- $SHELL "$ac_srcdir/configure" --help=recursive
- else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
- fi || ac_status=$?
- cd "$ac_pwd" || { ac_status=$?; break; }
- done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
- cat <<\_ACEOF
-udp configure 1.0.11
-generated by GNU Autoconf 2.69
-
-Copyright (C) 2012 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
- exit
-fi
-
-## ------------------------ ##
-## Autoconf initialization. ##
-## ------------------------ ##
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
- if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
-
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- test -x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-/* Define $2 to an innocuous variant, in case declares $2.
- For example, HP-UX 11i declares gettimeofday. */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer to if __STDC__ is defined, since
- exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include
-#else
-# include
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-int
-main ()
-{
-return $2 ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by udp $as_me 1.0.11, which was
-generated by GNU Autoconf 2.69. Invocation command line was
-
- $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
-
-/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
-/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
-/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
- done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
- for ac_arg
- do
- case $ac_arg in
- -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- continue ;;
- *\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- case $ac_pass in
- 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
- 2)
- as_fn_append ac_configure_args1 " '$ac_arg'"
- if test $ac_must_keep_next = true; then
- ac_must_keep_next=false # Got value, back to normal.
- else
- case $ac_arg in
- *=* | --config-cache | -C | -disable-* | --disable-* \
- | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
- | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
- | -with-* | --with-* | -without-* | --without-* | --x)
- case "$ac_configure_args0 " in
- "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
- esac
- ;;
- -* ) ac_must_keep_next=true ;;
- esac
- fi
- as_fn_append ac_configure_args " '$ac_arg'"
- ;;
- esac
- done
-done
-{ ac_configure_args0=; unset ac_configure_args0;}
-{ ac_configure_args1=; unset ac_configure_args1;}
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log. We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
- # Save into config.log some information that might help in debugging.
- {
- echo
-
- $as_echo "## ---------------- ##
-## Cache variables. ##
-## ---------------- ##"
- echo
- # The following way of writing the cache mishandles newlines in values,
-(
- for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
- eval ac_val=\$$ac_var
- case $ac_val in #(
- *${as_nl}*)
- case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
- esac
- case $ac_var in #(
- _ | IFS | as_nl) ;; #(
- BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
- *) { eval $ac_var=; unset $ac_var;} ;;
- esac ;;
- esac
- done
- (set) 2>&1 |
- case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
- *${as_nl}ac_space=\ *)
- sed -n \
- "s/'\''/'\''\\\\'\'''\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
- ;; #(
- *)
- sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
- ;;
- esac |
- sort
-)
- echo
-
- $as_echo "## ----------------- ##
-## Output variables. ##
-## ----------------- ##"
- echo
- for ac_var in $ac_subst_vars
- do
- eval ac_val=\$$ac_var
- case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
- esac
- $as_echo "$ac_var='\''$ac_val'\''"
- done | sort
- echo
-
- if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
-## File substitutions. ##
-## ------------------- ##"
- echo
- for ac_var in $ac_subst_files
- do
- eval ac_val=\$$ac_var
- case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
- esac
- $as_echo "$ac_var='\''$ac_val'\''"
- done | sort
- echo
- fi
-
- if test -s confdefs.h; then
- $as_echo "## ----------- ##
-## confdefs.h. ##
-## ----------- ##"
- echo
- cat confdefs.h
- echo
- fi
- test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
- } >&5
- rm -f core *.core core.conftest.* &&
- rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
- exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
- trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-$as_echo "/* confdefs.h */" > confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
-if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
-elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
-else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
-fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
-do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
- sed 's/^/| /' "$ac_site_file" >&5
- . "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5; }
- fi
-done
-
-if test -r "$cache_file"; then
- # Some versions of bash will fail to source /dev/null (special files
- # actually), so we avoid doing that. DJGPP emulates it as a regular file.
- if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
- case $cache_file in
- [\\/]* | ?:[\\/]* ) . "$cache_file";;
- *) . "./$cache_file";;
- esac
- fi
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
- >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
- eval ac_old_set=\$ac_cv_env_${ac_var}_set
- eval ac_new_set=\$ac_env_${ac_var}_set
- eval ac_old_val=\$ac_cv_env_${ac_var}_value
- eval ac_new_val=\$ac_env_${ac_var}_value
- case $ac_old_set,$ac_new_set in
- set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,);;
- *)
- if test "x$ac_old_val" != "x$ac_new_val"; then
- # differences in whitespace do not lead to failure.
- ac_old_val_w=`echo x $ac_old_val`
- ac_new_val_w=`echo x $ac_new_val`
- if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
- ac_cache_corrupted=:
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
- eval $ac_var=\$ac_old_val
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
- fi;;
- esac
- # Pass precious variables to config.status.
- if test "$ac_new_set" = set; then
- case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
- *) ac_arg=$ac_var=$ac_new_val ;;
- esac
- case " $ac_configure_args " in
- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) as_fn_append ac_configure_args " '$ac_arg'" ;;
- esac
- fi
-done
-if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
-fi
-## -------------------- ##
-## Main body of script. ##
-## -------------------- ##
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-#--------------------------------------------------------------------
-# Call TEA_INIT as the first TEA_ macro to set up initial vars.
-# This will define a ${TEA_PLATFORM} variable == "unix" or "windows"
-# as well as PKG_LIB_FILE and PKG_STUB_LIB_FILE.
-#--------------------------------------------------------------------
-
-
- # TEA extensions pass this us the version of TEA they think they
- # are compatible with.
- TEA_VERSION="3.9"
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5
-$as_echo_n "checking for correct TEA configuration... " >&6; }
- if test x"${PACKAGE_NAME}" = x ; then
- as_fn_error $? "
-The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5
- fi
- if test x"3.9" = x ; then
- as_fn_error $? "
-TEA version not specified." "$LINENO" 5
- elif test "3.9" != "${TEA_VERSION}" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5
-$as_echo "warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok (TEA ${TEA_VERSION})" >&5
-$as_echo "ok (TEA ${TEA_VERSION})" >&6; }
- fi
-
- # If the user did not set CFLAGS, set it now to keep macros
- # like AC_PROG_CC and AC_TRY_COMPILE from adding "-g -O2".
- if test "${CFLAGS+set}" != "set" ; then
- CFLAGS=""
- fi
-
- case "`uname -s`" in
- *win32*|*WIN32*|*MINGW32_*)
- # Extract the first word of "cygpath", so it can be a program name with args.
-set dummy cygpath; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CYGPATH+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CYGPATH"; then
- ac_cv_prog_CYGPATH="$CYGPATH" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CYGPATH="cygpath -w"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
- test -z "$ac_cv_prog_CYGPATH" && ac_cv_prog_CYGPATH="echo"
-fi
-fi
-CYGPATH=$ac_cv_prog_CYGPATH
-if test -n "$CYGPATH"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5
-$as_echo "$CYGPATH" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- EXEEXT=".exe"
- TEA_PLATFORM="windows"
- ;;
- *CYGWIN_*)
- CYGPATH=echo
- EXEEXT=".exe"
- # TEA_PLATFORM is determined later in LOAD_TCLCONFIG
- ;;
- *)
- CYGPATH=echo
- # Maybe we are cross-compiling....
- case ${host_alias} in
- *mingw32*)
- EXEEXT=".exe"
- TEA_PLATFORM="windows"
- ;;
- *)
- EXEEXT=""
- TEA_PLATFORM="unix"
- ;;
- esac
- ;;
- esac
-
- # Check if exec_prefix is set. If not use fall back to prefix.
- # Note when adjusted, so that TEA_PREFIX can correct for this.
- # This is needed for recursive configures, since autoconf propagates
- # $prefix, but not $exec_prefix (doh!).
- if test x$exec_prefix = xNONE ; then
- exec_prefix_default=yes
- exec_prefix=$prefix
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&5
-$as_echo "$as_me: configuring ${PACKAGE_NAME} ${PACKAGE_VERSION}" >&6;}
-
-
-
-
- # This package name must be replaced statically for AC_SUBST to work
-
- # Substitute STUB_LIB_FILE in case package creates a stub library too.
-
-
- # We AC_SUBST these here to ensure they are subst'ed,
- # in case the user doesn't call TEA_ADD_...
-
-
-
-
-
-
-
-
-
-ac_aux_dir=
-for ac_dir in tclconfig "$srcdir"/tclconfig; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-
-
-
-
-
- #
- # Ok, lets find the tcl configuration
- # First, look for one uninstalled.
- # the alternative search directory is invoked by --with-tcl
- #
-
- if test x"${no_tcl}" = x ; then
- # we reset no_tcl in case something fails here
- no_tcl=true
-
-# Check whether --with-tcl was given.
-if test "${with_tcl+set}" = set; then :
- withval=$with_tcl; with_tclconfig="${withval}"
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5
-$as_echo_n "checking for Tcl configuration... " >&6; }
- if ${ac_cv_c_tclconfig+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
-
- # First check to see if --with-tcl was specified.
- if test x"${with_tclconfig}" != x ; then
- case "${with_tclconfig}" in
- */tclConfig.sh )
- if test -f "${with_tclconfig}"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&5
-$as_echo "$as_me: WARNING: --with-tcl argument should refer to directory containing tclConfig.sh, not to tclConfig.sh itself" >&2;}
- with_tclconfig="`echo "${with_tclconfig}" | sed 's!/tclConfig\.sh$!!'`"
- fi ;;
- esac
- if test -f "${with_tclconfig}/tclConfig.sh" ; then
- ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`"
- else
- as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5
- fi
- fi
-
- # then check for a private Tcl installation
- if test x"${ac_cv_c_tclconfig}" = x ; then
- for i in \
- ../tcl \
- `ls -dr ../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \
- `ls -dr ../tcl[8-9].[0-9] 2>/dev/null` \
- `ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \
- ../../tcl \
- `ls -dr ../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \
- `ls -dr ../../tcl[8-9].[0-9] 2>/dev/null` \
- `ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \
- ../../../tcl \
- `ls -dr ../../../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \
- `ls -dr ../../../tcl[8-9].[0-9] 2>/dev/null` \
- `ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do
- if test "${TEA_PLATFORM}" = "windows" \
- -a -f "$i/win/tclConfig.sh" ; then
- ac_cv_c_tclconfig="`(cd $i/win; pwd)`"
- break
- fi
- if test -f "$i/unix/tclConfig.sh" ; then
- ac_cv_c_tclconfig="`(cd $i/unix; pwd)`"
- break
- fi
- done
- fi
-
- # on Darwin, check in Framework installation locations
- if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then
- for i in `ls -d ~/Library/Frameworks 2>/dev/null` \
- `ls -d /Library/Frameworks 2>/dev/null` \
- `ls -d /Network/Library/Frameworks 2>/dev/null` \
- `ls -d /System/Library/Frameworks 2>/dev/null` \
- ; do
- if test -f "$i/Tcl.framework/tclConfig.sh" ; then
- ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`"
- break
- fi
- done
- fi
-
- # TEA specific: on Windows, check in common installation locations
- if test "${TEA_PLATFORM}" = "windows" \
- -a x"${ac_cv_c_tclconfig}" = x ; then
- for i in `ls -d C:/Tcl/lib 2>/dev/null` \
- `ls -d C:/Progra~1/Tcl/lib 2>/dev/null` \
- ; do
- if test -f "$i/tclConfig.sh" ; then
- ac_cv_c_tclconfig="`(cd $i; pwd)`"
- break
- fi
- done
- fi
-
- # check in a few common install locations
- if test x"${ac_cv_c_tclconfig}" = x ; then
- for i in `ls -d ${libdir} 2>/dev/null` \
- `ls -d ${exec_prefix}/lib 2>/dev/null` \
- `ls -d ${prefix}/lib 2>/dev/null` \
- `ls -d /usr/local/lib 2>/dev/null` \
- `ls -d /usr/contrib/lib 2>/dev/null` \
- `ls -d /usr/lib 2>/dev/null` \
- `ls -d /usr/lib64 2>/dev/null` \
- `ls -d /usr/lib/tcl8.6 2>/dev/null` \
- `ls -d /usr/lib/tcl8.5 2>/dev/null` \
- ; do
- if test -f "$i/tclConfig.sh" ; then
- ac_cv_c_tclconfig="`(cd $i; pwd)`"
- break
- fi
- done
- fi
-
- # check in a few other private locations
- if test x"${ac_cv_c_tclconfig}" = x ; then
- for i in \
- ${srcdir}/../tcl \
- `ls -dr ${srcdir}/../tcl[8-9].[0-9].[0-9]* 2>/dev/null` \
- `ls -dr ${srcdir}/../tcl[8-9].[0-9] 2>/dev/null` \
- `ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do
- if test "${TEA_PLATFORM}" = "windows" \
- -a -f "$i/win/tclConfig.sh" ; then
- ac_cv_c_tclconfig="`(cd $i/win; pwd)`"
- break
- fi
- if test -f "$i/unix/tclConfig.sh" ; then
- ac_cv_c_tclconfig="`(cd $i/unix; pwd)`"
- break
- fi
- done
- fi
-
-fi
-
-
- if test x"${ac_cv_c_tclconfig}" = x ; then
- TCL_BIN_DIR="# no Tcl configs found"
- as_fn_error $? "Can't find Tcl configuration definitions. Use --with-tcl to specify a directory containing tclConfig.sh" "$LINENO" 5
- else
- no_tcl=
- TCL_BIN_DIR="${ac_cv_c_tclconfig}"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found ${TCL_BIN_DIR}/tclConfig.sh" >&5
-$as_echo "found ${TCL_BIN_DIR}/tclConfig.sh" >&6; }
- fi
- fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- fi
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl.exe
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl.exe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CC" && break
-done
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-
-# The possible output files:
-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
-
-ac_rmfiles=
-for ac_file in $ac_files
-do
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- * ) ac_rmfiles="$ac_rmfiles $ac_file";;
- esac
-done
-rm -f $ac_rmfiles
-
-if { { ac_try="$ac_link_default"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link_default") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile. We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
- ;;
- [ab].out )
- # We found the default executable, but exeext='' is most
- # certainly right.
- break;;
- *.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
- then :; else
- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- fi
- # We set ac_cv_exeext here because the later test for it is not
- # safe: cross compilers may not add the suffix if given an `-o'
- # argument, so we may need to know it at that point already.
- # Even if this section looks crufty: it has the advantage of
- # actually working.
- break;;
- * )
- break;;
- esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
- ac_file=''
-fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
-ac_exeext=$ac_cv_exeext
-
-rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
-if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
- test -f "$ac_file" || continue
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- break;;
- * ) break;;
- esac
-done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-int
-main ()
-{
-FILE *f = fopen ("conftest.out", "w");
- return ferror (f) || fclose (f) != 0;
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files="$ac_clean_files conftest.out"
-# Check that the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
-if test "$cross_compiling" != yes; then
- { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
- if { ac_try='./conftest$ac_cv_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- cross_compiling=no
- else
- if test "$cross_compiling" = maybe; then
- cross_compiling=yes
- else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5; }
- fi
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
-
-rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
-ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
- for ac_file in conftest.o conftest.obj conftest.*; do
- test -f "$ac_file" || continue;
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
- break;;
- esac
-done
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GCC=yes
-else
- GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
- ac_c_werror_flag=yes
- ac_cv_prog_cc_g=no
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-#include
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for existence of ${TCL_BIN_DIR}/tclConfig.sh" >&5
-$as_echo_n "checking for existence of ${TCL_BIN_DIR}/tclConfig.sh... " >&6; }
-
- if test -f "${TCL_BIN_DIR}/tclConfig.sh" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: loading" >&5
-$as_echo "loading" >&6; }
- . "${TCL_BIN_DIR}/tclConfig.sh"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find ${TCL_BIN_DIR}/tclConfig.sh" >&5
-$as_echo "could not find ${TCL_BIN_DIR}/tclConfig.sh" >&6; }
- fi
-
- # eval is required to do the TCL_DBGX substitution
- eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\""
- eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""
-
- # If the TCL_BIN_DIR is the build directory (not the install directory),
- # then set the common variable name to the value of the build variables.
- # For example, the variable TCL_LIB_SPEC will be set to the value
- # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC
- # instead of TCL_BUILD_LIB_SPEC since it will work with both an
- # installed and uninstalled version of Tcl.
- if test -f "${TCL_BIN_DIR}/Makefile" ; then
- TCL_LIB_SPEC="${TCL_BUILD_LIB_SPEC}"
- TCL_STUB_LIB_SPEC="${TCL_BUILD_STUB_LIB_SPEC}"
- TCL_STUB_LIB_PATH="${TCL_BUILD_STUB_LIB_PATH}"
- elif test "`uname -s`" = "Darwin"; then
- # If Tcl was built as a framework, attempt to use the libraries
- # from the framework at the given location so that linking works
- # against Tcl.framework installed in an arbitrary location.
- case ${TCL_DEFS} in
- *TCL_FRAMEWORK*)
- if test -f "${TCL_BIN_DIR}/${TCL_LIB_FILE}"; then
- for i in "`cd "${TCL_BIN_DIR}"; pwd`" \
- "`cd "${TCL_BIN_DIR}"/../..; pwd`"; do
- if test "`basename "$i"`" = "${TCL_LIB_FILE}.framework"; then
- TCL_LIB_SPEC="-F`dirname "$i" | sed -e 's/ /\\\\ /g'` -framework ${TCL_LIB_FILE}"
- break
- fi
- done
- fi
- if test -f "${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"; then
- TCL_STUB_LIB_SPEC="-L`echo "${TCL_BIN_DIR}" | sed -e 's/ /\\\\ /g'` ${TCL_STUB_LIB_FLAG}"
- TCL_STUB_LIB_PATH="${TCL_BIN_DIR}/${TCL_STUB_LIB_FILE}"
- fi
- ;;
- esac
- fi
-
- # eval is required to do the TCL_DBGX substitution
- eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\""
- eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\""
- eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\""
- eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\""
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking platform" >&5
-$as_echo_n "checking platform... " >&6; }
- hold_cc=$CC; CC="$TCL_CC"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- #ifdef _WIN32
- #error win32
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- TEA_PLATFORM="unix"
-else
- TEA_PLATFORM="windows"
-
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CC=$hold_cc
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEA_PLATFORM" >&5
-$as_echo "$TEA_PLATFORM" >&6; }
-
- # The BUILD_$pkg is to define the correct extern storage class
- # handling when making this package
-
-cat >>confdefs.h <<_ACEOF
-#define BUILD_${PACKAGE_NAME} /**/
-_ACEOF
-
- # Do this here as we have fully defined TEA_PLATFORM now
- if test "${TEA_PLATFORM}" = "windows" ; then
- EXEEXT=".exe"
- CLEANFILES="$CLEANFILES *.lib *.dll *.pdb *.exp"
- fi
-
- # TEA specific:
-
-
-
-
-
-
-
-
- if test "${prefix}" = "NONE"; then
- prefix_default=yes
- if test x"${TCL_PREFIX}" != x; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&5
-$as_echo "$as_me: --prefix defaulting to TCL_PREFIX ${TCL_PREFIX}" >&6;}
- prefix=${TCL_PREFIX}
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: --prefix defaulting to /usr/local" >&5
-$as_echo "$as_me: --prefix defaulting to /usr/local" >&6;}
- prefix=/usr/local
- fi
- fi
- if test "${exec_prefix}" = "NONE" -a x"${prefix_default}" = x"yes" \
- -o x"${exec_prefix_default}" = x"yes" ; then
- if test x"${TCL_EXEC_PREFIX}" != x; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&5
-$as_echo "$as_me: --exec-prefix defaulting to TCL_EXEC_PREFIX ${TCL_EXEC_PREFIX}" >&6;}
- exec_prefix=${TCL_EXEC_PREFIX}
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: --exec-prefix defaulting to ${prefix}" >&5
-$as_echo "$as_me: --exec-prefix defaulting to ${prefix}" >&6;}
- exec_prefix=$prefix
- fi
- fi
-
-
- # Don't put any macros that use the compiler (e.g. AC_TRY_COMPILE)
- # in this macro, they need to go into TEA_SETUP_COMPILER instead.
-
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- fi
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl.exe
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl.exe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$ac_ct_CC" && break
-done
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-fi
-
-fi
-
-
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GCC=yes
-else
- GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
- ac_c_werror_flag=yes
- ac_cv_prog_cc_g=no
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-#include
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer to if __STDC__ is defined, since
- # exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include
-#else
-# include
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer to if __STDC__ is defined, since
- # exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include
-#else
-# include
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
- INSTALL="\$(SHELL) \$(srcdir)/tclconfig/install-sh -c"
-
- INSTALL_DATA="\${INSTALL} -m 644"
-
- INSTALL_PROGRAM="\${INSTALL}"
-
- INSTALL_SCRIPT="\${INSTALL}"
-
-
- #--------------------------------------------------------------------
- # Checks to see if the make program sets the $MAKE variable.
- #--------------------------------------------------------------------
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
- @echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
- *@@@%%%=?*=@@@%%%*)
- eval ac_cv_prog_make_${ac_make}_set=yes;;
- *)
- eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- SET_MAKE=
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-
- #--------------------------------------------------------------------
- # Find ranlib
- #--------------------------------------------------------------------
-
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
- ac_ct_RANLIB=$RANLIB
- # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_RANLIB"; then
- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_RANLIB="ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_RANLIB" = x; then
- RANLIB=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- RANLIB=$ac_ct_RANLIB
- fi
-else
- RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-
- #--------------------------------------------------------------------
- # Determines the correct binary file extension (.o, .obj, .exe etc.)
- #--------------------------------------------------------------------
-
-
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-#include
-#include
-#include
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-#include
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
- # Any macros that use the compiler (e.g. AC_TRY_COMPILE) have to go here.
-
-
- #------------------------------------------------------------------------
- # If we're using GCC, see if the compiler understands -pipe. If so, use it.
- # It makes compiling go faster. (This is only a performance feature.)
- #------------------------------------------------------------------------
-
- if test -z "$no_pipe" -a -n "$GCC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5
-$as_echo_n "checking if the compiler understands -pipe... " >&6; }
-if ${tcl_cv_cc_pipe+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -pipe"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_cc_pipe=yes
-else
- tcl_cv_cc_pipe=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- CFLAGS=$hold_cflags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_pipe" >&5
-$as_echo "$tcl_cv_cc_pipe" >&6; }
- if test $tcl_cv_cc_pipe = yes; then
- CFLAGS="$CFLAGS -pipe"
- fi
- fi
-
- #--------------------------------------------------------------------
- # Common compiler flag setup
- #--------------------------------------------------------------------
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if ${ac_cv_c_bigendian+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_c_bigendian=unknown
- # See if we're dealing with a universal compiler.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifndef __APPLE_CC__
- not a universal capable compiler
- #endif
- typedef int dummy;
-
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
- # Check for potential -arch flags. It is not universal unless
- # there are at least two -arch flags with different values.
- ac_arch=
- ac_prev=
- for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
- if test -n "$ac_prev"; then
- case $ac_word in
- i?86 | x86_64 | ppc | ppc64)
- if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
- ac_arch=$ac_word
- else
- ac_cv_c_bigendian=universal
- break
- fi
- ;;
- esac
- ac_prev=
- elif test "x$ac_word" = "x-arch"; then
- ac_prev=arch
- fi
- done
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- if test $ac_cv_c_bigendian = unknown; then
- # See if sys/param.h defines the BYTE_ORDER macro.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
- #include
-
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
- && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
- && LITTLE_ENDIAN)
- bogus endian macros
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- # It does; now see whether it defined to BIG_ENDIAN or not.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
- #include
-
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
- not big endian
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_c_bigendian=yes
-else
- ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- if test $ac_cv_c_bigendian = unknown; then
- # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-int
-main ()
-{
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
- bogus endian macros
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- # It does; now see whether it defined to _BIG_ENDIAN or not.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-int
-main ()
-{
-#ifndef _BIG_ENDIAN
- not big endian
- #endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_c_bigendian=yes
-else
- ac_cv_c_bigendian=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- fi
- if test $ac_cv_c_bigendian = unknown; then
- # Compile a test program.
- if test "$cross_compiling" = yes; then :
- # Try to guess by grepping values from an object file.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-short int ascii_mm[] =
- { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
- short int ascii_ii[] =
- { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
- int use_ascii (int i) {
- return ascii_mm[i] + ascii_ii[i];
- }
- short int ebcdic_ii[] =
- { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
- short int ebcdic_mm[] =
- { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
- int use_ebcdic (int i) {
- return ebcdic_mm[i] + ebcdic_ii[i];
- }
- extern int foo;
-
-int
-main ()
-{
-return use_ascii (foo) == use_ebcdic (foo);
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
- ac_cv_c_bigendian=yes
- fi
- if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
- if test "$ac_cv_c_bigendian" = unknown; then
- ac_cv_c_bigendian=no
- else
- # finding both strings is unlikely to happen, but who knows?
- ac_cv_c_bigendian=unknown
- fi
- fi
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$ac_includes_default
-int
-main ()
-{
-
- /* Are we little or big endian? From Harbison&Steele. */
- union
- {
- long int l;
- char c[sizeof (long int)];
- } u;
- u.l = 1;
- return u.c[sizeof (long int) - 1] == 1;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
- ac_cv_c_bigendian=no
-else
- ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
- case $ac_cv_c_bigendian in #(
- yes)
- $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
-;; #(
- no)
- ;; #(
- universal)
-
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
-
- ;; #(
- *)
- as_fn_error $? "unknown endianness
- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
-
- if test "${TEA_PLATFORM}" = "unix" ; then
-
- #--------------------------------------------------------------------
- # On a few very rare systems, all of the libm.a stuff is
- # already in libc.a. Set compiler flags accordingly.
- # Also, Linux requires the "ieee" library for math to work
- # right (and it must appear before "-lm").
- #--------------------------------------------------------------------
-
- ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin"
-if test "x$ac_cv_func_sin" = xyes; then :
- MATH_LIBS=""
-else
- MATH_LIBS="-lm"
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5
-$as_echo_n "checking for main in -lieee... " >&6; }
-if ${ac_cv_lib_ieee_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lieee $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
-int
-main ()
-{
-return main ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_ieee_main=yes
-else
- ac_cv_lib_ieee_main=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5
-$as_echo "$ac_cv_lib_ieee_main" >&6; }
-if test "x$ac_cv_lib_ieee_main" = xyes; then :
- MATH_LIBS="-lieee $MATH_LIBS"
-fi
-
-
- #--------------------------------------------------------------------
- # Interactive UNIX requires -linet instead of -lsocket, plus it
- # needs net/errno.h to define the socket-related error codes.
- #--------------------------------------------------------------------
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5
-$as_echo_n "checking for main in -linet... " >&6; }
-if ${ac_cv_lib_inet_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-linet $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-
-int
-main ()
-{
-return main ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_inet_main=yes
-else
- ac_cv_lib_inet_main=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5
-$as_echo "$ac_cv_lib_inet_main" >&6; }
-if test "x$ac_cv_lib_inet_main" = xyes; then :
- LIBS="$LIBS -linet"
-fi
-
- ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default"
-if test "x$ac_cv_header_net_errno_h" = xyes; then :
-
-
-$as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h
-
-fi
-
-
-
- #--------------------------------------------------------------------
- # Check for the existence of the -lsocket and -lnsl libraries.
- # The order here is important, so that they end up in the right
- # order in the command line generated by make. Here are some
- # special considerations:
- # 1. Use "connect" and "accept" to check for -lsocket, and
- # "gethostbyname" to check for -lnsl.
- # 2. Use each function name only once: can't redo a check because
- # autoconf caches the results of the last check and won't redo it.
- # 3. Use -lnsl and -lsocket only if they supply procedures that
- # aren't already present in the normal libraries. This is because
- # IRIX 5.2 has libraries, but they aren't needed and they're
- # bogus: they goof up name resolution if used.
- # 4. On some SVR4 systems, can't use -lsocket without -lnsl too.
- # To get around this problem, check for both libraries together
- # if -lsocket doesn't work by itself.
- #--------------------------------------------------------------------
-
- tcl_checkBoth=0
- ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
-if test "x$ac_cv_func_connect" = xyes; then :
- tcl_checkSocket=0
-else
- tcl_checkSocket=1
-fi
-
- if test "$tcl_checkSocket" = 1; then
- ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt"
-if test "x$ac_cv_func_setsockopt" = xyes; then :
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5
-$as_echo_n "checking for setsockopt in -lsocket... " >&6; }
-if ${ac_cv_lib_socket_setsockopt+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsocket $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char setsockopt ();
-int
-main ()
-{
-return setsockopt ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_socket_setsockopt=yes
-else
- ac_cv_lib_socket_setsockopt=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5
-$as_echo "$ac_cv_lib_socket_setsockopt" >&6; }
-if test "x$ac_cv_lib_socket_setsockopt" = xyes; then :
- LIBS="$LIBS -lsocket"
-else
- tcl_checkBoth=1
-fi
-
-fi
-
- fi
- if test "$tcl_checkBoth" = 1; then
- tk_oldLibs=$LIBS
- LIBS="$LIBS -lsocket -lnsl"
- ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept"
-if test "x$ac_cv_func_accept" = xyes; then :
- tcl_checkNsl=0
-else
- LIBS=$tk_oldLibs
-fi
-
- fi
- ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
-if test "x$ac_cv_func_gethostbyname" = xyes; then :
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
-$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
-if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lnsl $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char gethostbyname ();
-int
-main ()
-{
-return gethostbyname ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_nsl_gethostbyname=yes
-else
- ac_cv_lib_nsl_gethostbyname=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
-$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
-if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
- LIBS="$LIBS -lnsl"
-fi
-
-fi
-
-
- # TEA specific: Don't perform the eval of the libraries here because
- # DL_LIBS won't be set until we call TEA_CONFIG_CFLAGS
-
- TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
-
-
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5
-$as_echo_n "checking dirent.h... " >&6; }
-if ${tcl_cv_dirent_h+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-#include
-int
-main ()
-{
-
-#ifndef _POSIX_SOURCE
-# ifdef __Lynx__
- /*
- * Generate compilation error to make the test fail: Lynx headers
- * are only valid if really in the POSIX environment.
- */
-
- missing_procedure();
-# endif
-#endif
-DIR *d;
-struct dirent *entryPtr;
-char *p;
-d = opendir("foobar");
-entryPtr = readdir(d);
-p = entryPtr->d_name;
-closedir(d);
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_dirent_h=yes
-else
- tcl_cv_dirent_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_dirent_h" >&5
-$as_echo "$tcl_cv_dirent_h" >&6; }
-
- if test $tcl_cv_dirent_h = no; then
-
-$as_echo "#define NO_DIRENT_H 1" >>confdefs.h
-
- fi
-
- # TEA specific:
- ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default"
-if test "x$ac_cv_header_errno_h" = xyes; then :
-
-else
-
-$as_echo "#define NO_ERRNO_H 1" >>confdefs.h
-
-fi
-
-
- ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default"
-if test "x$ac_cv_header_float_h" = xyes; then :
-
-else
-
-$as_echo "#define NO_FLOAT_H 1" >>confdefs.h
-
-fi
-
-
- ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default"
-if test "x$ac_cv_header_values_h" = xyes; then :
-
-else
-
-$as_echo "#define NO_VALUES_H 1" >>confdefs.h
-
-fi
-
-
- ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default"
-if test "x$ac_cv_header_limits_h" = xyes; then :
-
-$as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h
-
-else
-
-$as_echo "#define NO_LIMITS_H 1" >>confdefs.h
-
-fi
-
-
- ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdlib_h" = xyes; then :
- tcl_ok=1
-else
- tcl_ok=0
-fi
-
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "strtol" >/dev/null 2>&1; then :
-
-else
- tcl_ok=0
-fi
-rm -f conftest*
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "strtoul" >/dev/null 2>&1; then :
-
-else
- tcl_ok=0
-fi
-rm -f conftest*
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "strtod" >/dev/null 2>&1; then :
-
-else
- tcl_ok=0
-fi
-rm -f conftest*
-
- if test $tcl_ok = 0; then
-
-$as_echo "#define NO_STDLIB_H 1" >>confdefs.h
-
- fi
- ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default"
-if test "x$ac_cv_header_string_h" = xyes; then :
- tcl_ok=1
-else
- tcl_ok=0
-fi
-
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "strstr" >/dev/null 2>&1; then :
-
-else
- tcl_ok=0
-fi
-rm -f conftest*
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "strerror" >/dev/null 2>&1; then :
-
-else
- tcl_ok=0
-fi
-rm -f conftest*
-
-
- # See also memmove check below for a place where NO_STRING_H can be
- # set and why.
-
- if test $tcl_ok = 0; then
-
-$as_echo "#define NO_STRING_H 1" >>confdefs.h
-
- fi
-
- ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_wait_h" = xyes; then :
-
-else
-
-$as_echo "#define NO_SYS_WAIT_H 1" >>confdefs.h
-
-fi
-
-
- ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default"
-if test "x$ac_cv_header_dlfcn_h" = xyes; then :
-
-else
-
-$as_echo "#define NO_DLFCN_H 1" >>confdefs.h
-
-fi
-
-
-
- # OS/390 lacks sys/param.h (and doesn't need it, by chance).
- for ac_header in sys/param.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_param_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_SYS_PARAM_H 1
-_ACEOF
-
-fi
-
-done
-
-
- # Let the user call this, because if it triggers, they will
- # need a compat/strtod.c that is correct. Users can also
- # use Tcl_GetDouble(FromObj) instead.
- #TEA_BUGGY_STRTOD
- fi
-
-
-#--------------------------------------------------------------------
-# Check for POSIX-style non-blocking I/O. This defines HAVE_SYS_IOCTL_H
-# HAVE_SYS_FILIO_H, USE_FIONBIO and O_NONBLOCK.
-#--------------------------------------------------------------------
-
-
- for ac_header in sys/ioctl.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_ioctl_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_SYS_IOCTL_H 1
-_ACEOF
-
-fi
-
-done
-
- for ac_header in sys/filio.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "sys/filio.h" "ac_cv_header_sys_filio_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_filio_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_SYS_FILIO_H 1
-_ACEOF
-
-fi
-
-done
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5
-$as_echo_n "checking system version... " >&6; }
-if ${tcl_cv_sys_version+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- # TEA specific:
- if test "${TEA_PLATFORM}" = "windows" ; then
- tcl_cv_sys_version=windows
- else
- tcl_cv_sys_version=`uname -s`-`uname -r`
- if test "$?" -ne 0 ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5
-$as_echo "$as_me: WARNING: can't find uname command" >&2;}
- tcl_cv_sys_version=unknown
- else
- if test "`uname -s`" = "AIX" ; then
- tcl_cv_sys_version=AIX-`uname -v`.`uname -r`
- fi
- fi
- fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5
-$as_echo "$tcl_cv_sys_version" >&6; }
- system=$tcl_cv_sys_version
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking FIONBIO vs. O_NONBLOCK for nonblocking I/O" >&5
-$as_echo_n "checking FIONBIO vs. O_NONBLOCK for nonblocking I/O... " >&6; }
- case $system in
- OSF*)
-
-$as_echo "#define USE_FIONBIO 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5
-$as_echo "FIONBIO" >&6; }
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: O_NONBLOCK" >&5
-$as_echo "O_NONBLOCK" >&6; }
- ;;
- esac
-
-
-#-----------------------------------------------------------------------
-# __CHANGE__
-# Specify the C source files to compile in TEA_ADD_SOURCES,
-# public headers that need to be installed in TEA_ADD_HEADERS,
-# stub library C source files to compile in TEA_ADD_STUB_SOURCES,
-# and runtime Tcl library files in TEA_ADD_TCL_SOURCES.
-# This defines PKG(_STUB)_SOURCES, PKG(_STUB)_OBJECTS, PKG_HEADERS
-# and PKG_TCL_SOURCES.
-#-----------------------------------------------------------------------
-
-
- vars="udp_tcl.c"
- for i in $vars; do
- case $i in
- \$*)
- # allow $-var names
- PKG_SOURCES="$PKG_SOURCES $i"
- PKG_OBJECTS="$PKG_OBJECTS $i"
- ;;
- *)
- # check for existence - allows for generic/win/unix VPATH
- # To add more dirs here (like 'src'), you have to update VPATH
- # in Makefile.in as well
- if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \
- -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \
- -a ! -f "${srcdir}/macosx/$i" \
- ; then
- as_fn_error $? "could not find source file '$i'" "$LINENO" 5
- fi
- PKG_SOURCES="$PKG_SOURCES $i"
- # this assumes it is in a VPATH dir
- i=`basename $i`
- # handle user calling this before or after TEA_SETUP_COMPILER
- if test x"${OBJEXT}" != x ; then
- j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}"
- else
- j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}"
- fi
- PKG_OBJECTS="$PKG_OBJECTS $j"
- ;;
- esac
- done
-
-
-
-
- vars=""
- for i in $vars; do
- # check for existence, be strict because it is installed
- if test ! -f "${srcdir}/$i" ; then
- as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5
- fi
- PKG_HEADERS="$PKG_HEADERS $i"
- done
-
-
-
- vars=""
- for i in $vars; do
- PKG_INCLUDES="$PKG_INCLUDES $i"
- done
-
-
-
- vars=""
- for i in $vars; do
- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then
- # Convert foo.lib to -lfoo for GCC. No-op if not *.lib
- i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'`
- fi
- PKG_LIBS="$PKG_LIBS $i"
- done
-
-
-
- PKG_CFLAGS="$PKG_CFLAGS "
-
-
-
- vars=""
- for i in $vars; do
- # check for existence - allows for generic/win/unix VPATH
- if test ! -f "${srcdir}/$i" -a ! -f "${srcdir}/generic/$i" \
- -a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \
- -a ! -f "${srcdir}/macosx/$i" \
- ; then
- as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5
- fi
- PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i"
- # this assumes it is in a VPATH dir
- i=`basename $i`
- # handle user calling this before or after TEA_SETUP_COMPILER
- if test x"${OBJEXT}" != x ; then
- j="`echo $i | sed -e 's/\.[^.]*$//'`.${OBJEXT}"
- else
- j="`echo $i | sed -e 's/\.[^.]*$//'`.\${OBJEXT}"
- fi
- PKG_STUB_OBJECTS="$PKG_STUB_OBJECTS $j"
- done
-
-
-
-
- vars=""
- for i in $vars; do
- # check for existence, be strict because it is installed
- if test ! -f "${srcdir}/$i" ; then
- as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5
- fi
- PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i"
- done
-
-
-
-#--------------------------------------------------------------------
-# __CHANGE__
-# A few miscellaneous platform-specific items:
-#
-# Define a special symbol for Windows (BUILD_sample in this case) so
-# that we create the export library with the dll.
-#
-# Windows creates a few extra files that need to be cleaned up.
-# You can add more files to clean if your extension creates any extra
-# files.
-#
-# TEA_ADD_* any platform specific compiler/build info here.
-#--------------------------------------------------------------------
-
-if test "${TEA_PLATFORM}" = "windows" ; then
- $as_echo "#define BUILD_udp 1" >>confdefs.h
-
- CLEANFILES="pkgIndex.tcl *.lib *.dll *.exp *.ilk *.pdb vc*.pch"
-
- vars="ws2_32.lib"
- for i in $vars; do
- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then
- # Convert foo.lib to -lfoo for GCC. No-op if not *.lib
- i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'`
- fi
- PKG_LIBS="$PKG_LIBS $i"
- done
-
-
-else
- CLEANFILES="pkgIndex.tcl"
- fi
-
-
-#--------------------------------------------------------------------
-# __CHANGE__
-# Choose which headers you need. Extension authors should try very
-# hard to only rely on the Tcl public header files. Internal headers
-# contain private data structures and are subject to change without
-# notice.
-# This MUST be called after TEA_LOAD_TCLCONFIG / TEA_LOAD_TKCONFIG
-#--------------------------------------------------------------------
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl public headers" >&5
-$as_echo_n "checking for Tcl public headers... " >&6; }
-
-
-# Check whether --with-tclinclude was given.
-if test "${with_tclinclude+set}" = set; then :
- withval=$with_tclinclude; with_tclinclude=${withval}
-fi
-
-
- if ${ac_cv_c_tclh+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- # Use the value from --with-tclinclude, if it was given
-
- if test x"${with_tclinclude}" != x ; then
- if test -f "${with_tclinclude}/tcl.h" ; then
- ac_cv_c_tclh=${with_tclinclude}
- else
- as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5
- fi
- else
- list=""
- if test "`uname -s`" = "Darwin"; then
- # If Tcl was built as a framework, attempt to use
- # the framework's Headers directory
- case ${TCL_DEFS} in
- *TCL_FRAMEWORK*)
- list="`ls -d ${TCL_BIN_DIR}/Headers 2>/dev/null`"
- ;;
- esac
- fi
-
- # Look in the source dir only if Tcl is not installed,
- # and in that situation, look there before installed locations.
- if test -f "${TCL_BIN_DIR}/Makefile" ; then
- list="$list `ls -d ${TCL_SRC_DIR}/generic 2>/dev/null`"
- fi
-
- # Check order: pkg --prefix location, Tcl's --prefix location,
- # relative to directory of tclConfig.sh.
-
- eval "temp_includedir=${includedir}"
- list="$list \
- `ls -d ${temp_includedir} 2>/dev/null` \
- `ls -d ${TCL_PREFIX}/include 2>/dev/null` \
- `ls -d ${TCL_BIN_DIR}/../include 2>/dev/null`"
- if test "${TEA_PLATFORM}" != "windows" -o "$GCC" = "yes"; then
- list="$list /usr/local/include /usr/include"
- if test x"${TCL_INCLUDE_SPEC}" != x ; then
- d=`echo "${TCL_INCLUDE_SPEC}" | sed -e 's/^-I//'`
- list="$list `ls -d ${d} 2>/dev/null`"
- fi
- fi
- for i in $list ; do
- if test -f "$i/tcl.h" ; then
- ac_cv_c_tclh=$i
- break
- fi
- done
- fi
-
-fi
-
-
- # Print a message based on how we determined the include path
-
- if test x"${ac_cv_c_tclh}" = x ; then
- as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5
-$as_echo "${ac_cv_c_tclh}" >&6; }
- fi
-
- # Convert to a native path and substitute into the output files.
-
- INCLUDE_DIR_NATIVE=`${CYGPATH} ${ac_cv_c_tclh}`
-
- TCL_INCLUDES=-I\"${INCLUDE_DIR_NATIVE}\"
-
-
-
-
-#--------------------------------------------------------------------
-# Check whether --enable-threads or --disable-threads was given.
-# This auto-enables if Tcl was compiled threaded.
-#--------------------------------------------------------------------
-
-
- # Check whether --enable-threads was given.
-if test "${enable_threads+set}" = set; then :
- enableval=$enable_threads; tcl_ok=$enableval
-else
- tcl_ok=yes
-fi
-
-
- if test "${enable_threads+set}" = set; then
- enableval="$enable_threads"
- tcl_ok=$enableval
- else
- tcl_ok=yes
- fi
-
- if test "$tcl_ok" = "yes" -o "${TCL_THREADS}" = 1; then
- TCL_THREADS=1
-
- if test "${TEA_PLATFORM}" != "windows" ; then
- # We are always OK on Windows, so check what this platform wants:
-
- # USE_THREAD_ALLOC tells us to try the special thread-based
- # allocator that significantly reduces lock contention
-
-$as_echo "#define USE_THREAD_ALLOC 1" >>confdefs.h
-
-
-$as_echo "#define _REENTRANT 1" >>confdefs.h
-
- if test "`uname -s`" = "SunOS" ; then
-
-$as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
-
- fi
-
-$as_echo "#define _THREAD_SAFE 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5
-$as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_mutex_init ();
-int
-main ()
-{
-return pthread_mutex_init ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_pthread_pthread_mutex_init=yes
-else
- ac_cv_lib_pthread_pthread_mutex_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then :
- tcl_ok=yes
-else
- tcl_ok=no
-fi
-
- if test "$tcl_ok" = "no"; then
- # Check a little harder for __pthread_mutex_init in the same
- # library, as some systems hide it there until pthread.h is
- # defined. We could alternatively do an AC_TRY_COMPILE with
- # pthread.h, but that will work with libpthread really doesn't
- # exist, like AIX 4.2. [Bug: 4359]
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5
-$as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char __pthread_mutex_init ();
-int
-main ()
-{
-return __pthread_mutex_init ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_pthread___pthread_mutex_init=yes
-else
- ac_cv_lib_pthread___pthread_mutex_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5
-$as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; }
-if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then :
- tcl_ok=yes
-else
- tcl_ok=no
-fi
-
- fi
-
- if test "$tcl_ok" = "yes"; then
- # The space is needed
- THREADS_LIBS=" -lpthread"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5
-$as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; }
-if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthreads $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_mutex_init ();
-int
-main ()
-{
-return pthread_mutex_init ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_pthreads_pthread_mutex_init=yes
-else
- ac_cv_lib_pthreads_pthread_mutex_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5
-$as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; }
-if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then :
- tcl_ok=yes
-else
- tcl_ok=no
-fi
-
- if test "$tcl_ok" = "yes"; then
- # The space is needed
- THREADS_LIBS=" -lpthreads"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5
-$as_echo_n "checking for pthread_mutex_init in -lc... " >&6; }
-if ${ac_cv_lib_c_pthread_mutex_init+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lc $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_mutex_init ();
-int
-main ()
-{
-return pthread_mutex_init ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_c_pthread_mutex_init=yes
-else
- ac_cv_lib_c_pthread_mutex_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5
-$as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; }
-if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then :
- tcl_ok=yes
-else
- tcl_ok=no
-fi
-
- if test "$tcl_ok" = "no"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5
-$as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; }
-if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lc_r $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_mutex_init ();
-int
-main ()
-{
-return pthread_mutex_init ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_c_r_pthread_mutex_init=yes
-else
- ac_cv_lib_c_r_pthread_mutex_init=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5
-$as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; }
-if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then :
- tcl_ok=yes
-else
- tcl_ok=no
-fi
-
- if test "$tcl_ok" = "yes"; then
- # The space is needed
- THREADS_LIBS=" -pthread"
- else
- TCL_THREADS=0
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&5
-$as_echo "$as_me: WARNING: Do not know how to find pthread lib on your system - thread support disabled" >&2;}
- fi
- fi
- fi
- fi
- fi
- else
- TCL_THREADS=0
- fi
- # Do checking message here to not mess up interleaved configure output
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for building with threads" >&5
-$as_echo_n "checking for building with threads... " >&6; }
- if test "${TCL_THREADS}" = 1; then
-
-$as_echo "#define TCL_THREADS 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5
-$as_echo "yes (default)" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
- # TCL_THREADS sanity checking. See if our request for building with
- # threads is the same as the way Tcl was built. If not, warn the user.
- case ${TCL_DEFS} in
- *THREADS=1*)
- if test "${TCL_THREADS}" = "0"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
- Building ${PACKAGE_NAME} without threads enabled, but building against Tcl
- that IS thread-enabled. It is recommended to use --enable-threads." >&5
-$as_echo "$as_me: WARNING:
- Building ${PACKAGE_NAME} without threads enabled, but building against Tcl
- that IS thread-enabled. It is recommended to use --enable-threads." >&2;}
- fi
- ;;
- *)
- if test "${TCL_THREADS}" = "1"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
- --enable-threads requested, but building against a Tcl that is NOT
- thread-enabled. This is an OK configuration that will also run in
- a thread-enabled core." >&5
-$as_echo "$as_me: WARNING:
- --enable-threads requested, but building against a Tcl that is NOT
- thread-enabled. This is an OK configuration that will also run in
- a thread-enabled core." >&2;}
- fi
- ;;
- esac
-
-
-
-#--------------------------------------------------------------------
-# The statement below defines a collection of symbols related to
-# building as a shared library instead of a static library.
-#--------------------------------------------------------------------
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to build libraries" >&5
-$as_echo_n "checking how to build libraries... " >&6; }
- # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
- enableval=$enable_shared; tcl_ok=$enableval
-else
- tcl_ok=yes
-fi
-
-
- if test "${enable_shared+set}" = set; then
- enableval="$enable_shared"
- tcl_ok=$enableval
- else
- tcl_ok=yes
- fi
-
- if test "$tcl_ok" = "yes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: shared" >&5
-$as_echo "shared" >&6; }
- SHARED_BUILD=1
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5
-$as_echo "static" >&6; }
- SHARED_BUILD=0
-
-$as_echo "#define STATIC_BUILD 1" >>confdefs.h
-
- fi
-
-
-
-#--------------------------------------------------------------------
-# This macro figures out what flags to use with the compiler/linker
-# when building shared/static debug/optimized objects. This information
-# can be taken from the tclConfig.sh file, but this figures it all out.
-#--------------------------------------------------------------------
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
- ac_ct_RANLIB=$RANLIB
- # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_RANLIB"; then
- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_RANLIB="ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_RANLIB" = x; then
- RANLIB=":"
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- RANLIB=$ac_ct_RANLIB
- fi
-else
- RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-
-
-
- # Step 0.a: Enable 64 bit support?
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit support is requested" >&5
-$as_echo_n "checking if 64bit support is requested... " >&6; }
- # Check whether --enable-64bit was given.
-if test "${enable_64bit+set}" = set; then :
- enableval=$enable_64bit; do64bit=$enableval
-else
- do64bit=no
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bit" >&5
-$as_echo "$do64bit" >&6; }
-
- # Step 0.b: Enable Solaris 64 bit VIS support?
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if 64bit Sparc VIS support is requested" >&5
-$as_echo_n "checking if 64bit Sparc VIS support is requested... " >&6; }
- # Check whether --enable-64bit-vis was given.
-if test "${enable_64bit_vis+set}" = set; then :
- enableval=$enable_64bit_vis; do64bitVIS=$enableval
-else
- do64bitVIS=no
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $do64bitVIS" >&5
-$as_echo "$do64bitVIS" >&6; }
- # Force 64bit on with VIS
- if test "$do64bitVIS" = "yes"; then :
- do64bit=yes
-fi
-
- # Step 0.c: Check if visibility support is available. Do this here so
- # that platform specific alternatives can be used below if this fails.
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5
-$as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; }
-if ${tcl_cv_cc_visibility_hidden+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- hold_cflags=$CFLAGS; CFLAGS="$CFLAGS -Werror"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- extern __attribute__((__visibility__("hidden"))) void f(void);
- void f(void) {}
-int
-main ()
-{
-f();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_cc_visibility_hidden=yes
-else
- tcl_cv_cc_visibility_hidden=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- CFLAGS=$hold_cflags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_visibility_hidden" >&5
-$as_echo "$tcl_cv_cc_visibility_hidden" >&6; }
- if test $tcl_cv_cc_visibility_hidden = yes; then :
-
-
-$as_echo "#define MODULE_SCOPE extern __attribute__((__visibility__(\"hidden\")))" >>confdefs.h
-
-
-$as_echo "#define HAVE_HIDDEN 1" >>confdefs.h
-
-
-fi
-
- # Step 0.d: Disable -rpath support?
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if rpath support is requested" >&5
-$as_echo_n "checking if rpath support is requested... " >&6; }
- # Check whether --enable-rpath was given.
-if test "${enable_rpath+set}" = set; then :
- enableval=$enable_rpath; doRpath=$enableval
-else
- doRpath=yes
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doRpath" >&5
-$as_echo "$doRpath" >&6; }
-
- # TEA specific: Cross-compiling options for Windows/CE builds?
-
- if test "${TEA_PLATFORM}" = windows; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Windows/CE build is requested" >&5
-$as_echo_n "checking if Windows/CE build is requested... " >&6; }
- # Check whether --enable-wince was given.
-if test "${enable_wince+set}" = set; then :
- enableval=$enable_wince; doWince=$enableval
-else
- doWince=no
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $doWince" >&5
-$as_echo "$doWince" >&6; }
-
-fi
-
- # Set the variable "system" to hold the name and version number
- # for the system.
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5
-$as_echo_n "checking system version... " >&6; }
-if ${tcl_cv_sys_version+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- # TEA specific:
- if test "${TEA_PLATFORM}" = "windows" ; then
- tcl_cv_sys_version=windows
- else
- tcl_cv_sys_version=`uname -s`-`uname -r`
- if test "$?" -ne 0 ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: can't find uname command" >&5
-$as_echo "$as_me: WARNING: can't find uname command" >&2;}
- tcl_cv_sys_version=unknown
- else
- if test "`uname -s`" = "AIX" ; then
- tcl_cv_sys_version=AIX-`uname -v`.`uname -r`
- fi
- fi
- fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_sys_version" >&5
-$as_echo "$tcl_cv_sys_version" >&6; }
- system=$tcl_cv_sys_version
-
-
- # Require ranlib early so we can override it in special cases below.
-
-
-
- # Set configuration options based on system name and version.
- # This is similar to Tcl's unix/tcl.m4 except that we've added a
- # "windows" case and removed some core-only vars.
-
- do64bit_ok=no
- # default to '{$LIBS}' and set to "" on per-platform necessary basis
- SHLIB_LD_LIBS='${LIBS}'
- # When ld needs options to work in 64-bit mode, put them in
- # LDFLAGS_ARCH so they eventually end up in LDFLAGS even if [load]
- # is disabled by the user. [Bug 1016796]
- LDFLAGS_ARCH=""
- UNSHARED_LIB_SUFFIX=""
- # TEA specific: use PACKAGE_VERSION instead of VERSION
- TCL_TRIM_DOTS='`echo ${PACKAGE_VERSION} | tr -d .`'
- ECHO_VERSION='`echo ${PACKAGE_VERSION}`'
- TCL_LIB_VERSIONS_OK=ok
- CFLAGS_DEBUG=-g
- if test "$GCC" = yes; then :
-
- CFLAGS_OPTIMIZE=-O2
- CFLAGS_WARNING="-Wall"
-
-else
-
- CFLAGS_OPTIMIZE=-O
- CFLAGS_WARNING=""
-
-fi
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$AR"; then
- ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_AR="${ac_tool_prefix}ar"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_AR"; then
- ac_ct_AR=$AR
- # Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_AR"; then
- ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_AR="ar"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_AR" = x; then
- AR=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- AR=$ac_ct_AR
- fi
-else
- AR="$ac_cv_prog_AR"
-fi
-
- STLIB_LD='${AR} cr'
- LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH"
- if test "x$SHLIB_VERSION" = x; then :
- SHLIB_VERSION="1.0"
-fi
- case $system in
- # TEA specific:
- windows)
- # This is a 2-stage check to make sure we have the 64-bit SDK
- # We have to know where the SDK is installed.
- # This magic is based on MS Platform SDK for Win2003 SP1 - hobbs
- # MACHINE is IX86 for LINK, but this is used by the manifest,
- # which requires x86|amd64|ia64.
- MACHINE="X86"
- if test "$do64bit" != "no" ; then
- if test "x${MSSDK}x" = "xx" ; then
- MSSDK="C:/Progra~1/Microsoft Platform SDK"
- fi
- MSSDK=`echo "$MSSDK" | sed -e 's!\\\!/!g'`
- PATH64=""
- case "$do64bit" in
- amd64|x64|yes)
- MACHINE="AMD64" ; # default to AMD64 64-bit build
- PATH64="${MSSDK}/Bin/Win64/x86/AMD64"
- ;;
- ia64)
- MACHINE="IA64"
- PATH64="${MSSDK}/Bin/Win64"
- ;;
- esac
- if test "$GCC" != "yes" -a ! -d "${PATH64}" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&5
-$as_echo "$as_me: WARNING: Could not find 64-bit $MACHINE SDK to enable 64bit mode" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ensure latest Platform SDK is installed" >&5
-$as_echo "$as_me: WARNING: Ensure latest Platform SDK is installed" >&2;}
- do64bit="no"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using 64-bit $MACHINE mode" >&5
-$as_echo " Using 64-bit $MACHINE mode" >&6; }
- do64bit_ok="yes"
- fi
- fi
-
- if test "$doWince" != "no" ; then
- if test "$do64bit" != "no" ; then
- as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5
- fi
- if test "$GCC" = "yes" ; then
- as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5
- fi
-
- # First, look for one uninstalled.
- # the alternative search directory is invoked by --with-celib
-
- if test x"${no_celib}" = x ; then
- # we reset no_celib in case something fails here
- no_celib=true
-
-# Check whether --with-celib was given.
-if test "${with_celib+set}" = set; then :
- withval=$with_celib; with_celibconfig=${withval}
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5
-$as_echo_n "checking for Windows/CE celib directory... " >&6; }
- if ${ac_cv_c_celibconfig+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- # First check to see if --with-celibconfig was specified.
- if test x"${with_celibconfig}" != x ; then
- if test -d "${with_celibconfig}/inc" ; then
- ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)`
- else
- as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5
- fi
- fi
-
- # then check for a celib library
- if test x"${ac_cv_c_celibconfig}" = x ; then
- for i in \
- ../celib-palm-3.0 \
- ../celib \
- ../../celib-palm-3.0 \
- ../../celib \
- `ls -dr ../celib-*3.[0-9]* 2>/dev/null` \
- ${srcdir}/../celib-palm-3.0 \
- ${srcdir}/../celib \
- `ls -dr ${srcdir}/../celib-*3.[0-9]* 2>/dev/null` \
- ; do
- if test -d "$i/inc" ; then
- ac_cv_c_celibconfig=`(cd $i; pwd)`
- break
- fi
- done
- fi
-
-fi
-
- if test x"${ac_cv_c_celibconfig}" = x ; then
- as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5
- else
- no_celib=
- CELIB_DIR=${ac_cv_c_celibconfig}
- CELIB_DIR=`echo "$CELIB_DIR" | sed -e 's!\\\!/!g'`
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $CELIB_DIR" >&5
-$as_echo "found $CELIB_DIR" >&6; }
- fi
- fi
-
- # Set defaults for common evc4/PPC2003 setup
- # Currently Tcl requires 300+, possibly 420+ for sockets
- CEVERSION=420; # could be 211 300 301 400 420 ...
- TARGETCPU=ARMV4; # could be ARMV4 ARM MIPS SH3 X86 ...
- ARCH=ARM; # could be ARM MIPS X86EM ...
- PLATFORM="Pocket PC 2003"; # or "Pocket PC 2002"
- if test "$doWince" != "yes"; then
- # If !yes then the user specified something
- # Reset ARCH to allow user to skip specifying it
- ARCH=
- eval `echo $doWince | awk -F, '{ \
- if (length($1)) { printf "CEVERSION=\"%s\"\n", $1; \
- if ($1 < 400) { printf "PLATFORM=\"Pocket PC 2002\"\n" } }; \
- if (length($2)) { printf "TARGETCPU=\"%s\"\n", toupper($2) }; \
- if (length($3)) { printf "ARCH=\"%s\"\n", toupper($3) }; \
- if (length($4)) { printf "PLATFORM=\"%s\"\n", $4 }; \
- }'`
- if test "x${ARCH}" = "x" ; then
- ARCH=$TARGETCPU;
- fi
- fi
- OSVERSION=WCE$CEVERSION;
- if test "x${WCEROOT}" = "x" ; then
- WCEROOT="C:/Program Files/Microsoft eMbedded C++ 4.0"
- if test ! -d "${WCEROOT}" ; then
- WCEROOT="C:/Program Files/Microsoft eMbedded Tools"
- fi
- fi
- if test "x${SDKROOT}" = "x" ; then
- SDKROOT="C:/Program Files/Windows CE Tools"
- if test ! -d "${SDKROOT}" ; then
- SDKROOT="C:/Windows CE Tools"
- fi
- fi
- WCEROOT=`echo "$WCEROOT" | sed -e 's!\\\!/!g'`
- SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'`
- if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \
- -o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then
- as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5
- doWince="no"
- else
- # We could PATH_NOSPACE these, but that's not important,
- # as long as we quote them when used.
- CEINCLUDE="${SDKROOT}/${OSVERSION}/${PLATFORM}/include"
- if test -d "${CEINCLUDE}/${TARGETCPU}" ; then
- CEINCLUDE="${CEINCLUDE}/${TARGETCPU}"
- fi
- CELIBPATH="${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}"
- fi
- fi
-
- if test "$GCC" != "yes" ; then
- if test "${SHARED_BUILD}" = "0" ; then
- runtime=-MT
- else
- runtime=-MD
- fi
-
- if test "$do64bit" != "no" ; then
- # All this magic is necessary for the Win64 SDK RC1 - hobbs
- CC="\"${PATH64}/cl.exe\""
- CFLAGS="${CFLAGS} -I\"${MSSDK}/Include\" -I\"${MSSDK}/Include/crt\" -I\"${MSSDK}/Include/crt/sys\""
- RC="\"${MSSDK}/bin/rc.exe\""
- lflags="-nologo -MACHINE:${MACHINE} -LIBPATH:\"${MSSDK}/Lib/${MACHINE}\""
- LINKBIN="\"${PATH64}/link.exe\""
- CFLAGS_DEBUG="-nologo -Zi -Od -W3 ${runtime}d"
- CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}"
- # Avoid 'unresolved external symbol __security_cookie'
- # errors, c.f. http://support.microsoft.com/?id=894573
-
- vars="bufferoverflowU.lib"
- for i in $vars; do
- if test "${TEA_PLATFORM}" = "windows" -a "$GCC" = "yes" ; then
- # Convert foo.lib to -lfoo for GCC. No-op if not *.lib
- i=`echo "$i" | sed -e 's/^\([^-].*\)\.lib$/-l\1/i'`
- fi
- PKG_LIBS="$PKG_LIBS $i"
- done
-
-
- elif test "$doWince" != "no" ; then
- CEBINROOT="${WCEROOT}/EVC/${OSVERSION}/bin"
- if test "${TARGETCPU}" = "X86"; then
- CC="\"${CEBINROOT}/cl.exe\""
- else
- CC="\"${CEBINROOT}/cl${ARCH}.exe\""
- fi
- CFLAGS="$CFLAGS -I\"${CELIB_DIR}/inc\" -I\"${CEINCLUDE}\""
- RC="\"${WCEROOT}/Common/EVC/bin/rc.exe\""
- arch=`echo ${ARCH} | awk '{print tolower($0)}'`
- defs="${ARCH} _${ARCH}_ ${arch} PALM_SIZE _MT _WINDOWS"
- if test "${SHARED_BUILD}" = "1" ; then
- # Static CE builds require static celib as well
- defs="${defs} _DLL"
- fi
- for i in $defs ; do
-
-cat >>confdefs.h <<_ACEOF
-#define $i 1
-_ACEOF
-
- done
-
-cat >>confdefs.h <<_ACEOF
-#define _WIN32_WCE $CEVERSION
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define UNDER_CE $CEVERSION
-_ACEOF
-
- CFLAGS_DEBUG="-nologo -Zi -Od"
- CFLAGS_OPTIMIZE="-nologo -Ox"
- lversion=`echo ${CEVERSION} | sed -e 's/\(.\)\(..\)/\1\.\2/'`
- lflags="-MACHINE:${ARCH} -LIBPATH:\"${CELIBPATH}\" -subsystem:windowsce,${lversion} -nologo"
- LINKBIN="\"${CEBINROOT}/link.exe\""
-
- else
- RC="rc"
- lflags="-nologo"
- LINKBIN="link"
- CFLAGS_DEBUG="-nologo -Z7 -Od -W3 -WX ${runtime}d"
- CFLAGS_OPTIMIZE="-nologo -O2 -W2 ${runtime}"
- fi
- fi
-
- if test "$GCC" = "yes"; then
- # mingw gcc mode
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args.
-set dummy ${ac_tool_prefix}windres; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$RC"; then
- ac_cv_prog_RC="$RC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_RC="${ac_tool_prefix}windres"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-RC=$ac_cv_prog_RC
-if test -n "$RC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RC" >&5
-$as_echo "$RC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RC"; then
- ac_ct_RC=$RC
- # Extract the first word of "windres", so it can be a program name with args.
-set dummy windres; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_RC"; then
- ac_cv_prog_ac_ct_RC="$ac_ct_RC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_RC="windres"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RC=$ac_cv_prog_ac_ct_RC
-if test -n "$ac_ct_RC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RC" >&5
-$as_echo "$ac_ct_RC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_RC" = x; then
- RC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- RC=$ac_ct_RC
- fi
-else
- RC="$ac_cv_prog_RC"
-fi
-
- CFLAGS_DEBUG="-g"
- CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer"
- SHLIB_LD='${CC} -shared'
- UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a'
- LDFLAGS_CONSOLE="-wl,--subsystem,console ${lflags}"
- LDFLAGS_WINDOW="-wl,--subsystem,windows ${lflags}"
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross-compile version of gcc" >&5
-$as_echo_n "checking for cross-compile version of gcc... " >&6; }
-if ${ac_cv_cross+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
- #ifdef _WIN32
- #error cross-compiler
- #endif
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_cross=yes
-else
- ac_cv_cross=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cross" >&5
-$as_echo "$ac_cv_cross" >&6; }
- if test "$ac_cv_cross" = "yes"; then
- case "$do64bit" in
- amd64|x64|yes)
- CC="x86_64-w64-mingw32-gcc"
- LD="x86_64-w64-mingw32-ld"
- AR="x86_64-w64-mingw32-ar"
- RANLIB="x86_64-w64-mingw32-ranlib"
- RC="x86_64-w64-mingw32-windres"
- ;;
- *)
- CC="i686-w64-mingw32-gcc"
- LD="i686-w64-mingw32-ld"
- AR="i686-w64-mingw32-ar"
- RANLIB="i686-w64-mingw32-ranlib"
- RC="i686-w64-mingw32-windres"
- ;;
- esac
- fi
-
- else
- SHLIB_LD="${LINKBIN} -dll ${lflags}"
- # link -lib only works when -lib is the first arg
- STLIB_LD="${LINKBIN} -lib ${lflags}"
- UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.lib'
- PATHTYPE=-w
- # For information on what debugtype is most useful, see:
- # http://msdn.microsoft.com/library/en-us/dnvc60/html/gendepdebug.asp
- # and also
- # http://msdn2.microsoft.com/en-us/library/y0zzbyt4%28VS.80%29.aspx
- # This essentially turns it all on.
- LDFLAGS_DEBUG="-debug -debugtype:cv"
- LDFLAGS_OPTIMIZE="-release"
- if test "$doWince" != "no" ; then
- LDFLAGS_CONSOLE="-link ${lflags}"
- LDFLAGS_WINDOW=${LDFLAGS_CONSOLE}
- else
- LDFLAGS_CONSOLE="-link -subsystem:console ${lflags}"
- LDFLAGS_WINDOW="-link -subsystem:windows ${lflags}"
- fi
- fi
-
- SHLIB_SUFFIX=".dll"
- SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.dll'
-
- TCL_LIB_VERSIONS_OK=nodots
- ;;
- AIX-*)
- if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"; then :
-
- # AIX requires the _r compiler when gcc isn't being used
- case "${CC}" in
- *_r|*_r\ *)
- # ok ...
- ;;
- *)
- # Make sure only first arg gets _r
- CC=`echo "$CC" | sed -e 's/^\([^ ]*\)/\1_r/'`
- ;;
- esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $CC for compiling with threads" >&5
-$as_echo "Using $CC for compiling with threads" >&6; }
-
-fi
- LIBS="$LIBS -lc"
- SHLIB_CFLAGS=""
- SHLIB_SUFFIX=".so"
-
- LD_LIBRARY_PATH_VAR="LIBPATH"
-
- # Check to enable 64-bit flags for compiler/linker
- if test "$do64bit" = yes; then :
-
- if test "$GCC" = yes; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5
-$as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;}
-
-else
-
- do64bit_ok=yes
- CFLAGS="$CFLAGS -q64"
- LDFLAGS_ARCH="-q64"
- RANLIB="${RANLIB} -X64"
- AR="${AR} -X64"
- SHLIB_LD_FLAGS="-b64"
-
-fi
-
-fi
-
- if test "`uname -m`" = ia64; then :
-
- # AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC
- SHLIB_LD="/usr/ccs/bin/ld -G -z text"
- if test "$GCC" = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
-
-else
-
- CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
-
-fi
- LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
-
-else
-
- if test "$GCC" = yes; then :
-
- SHLIB_LD='${CC} -shared -Wl,-bexpall'
-
-else
-
- SHLIB_LD="/bin/ld -bhalt:4 -bM:SRE -bexpall -H512 -T512 -bnoentry"
- LDFLAGS="$LDFLAGS -brtl"
-
-fi
- SHLIB_LD="${SHLIB_LD} ${SHLIB_LD_FLAGS}"
- CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-
-fi
- ;;
- BeOS*)
- SHLIB_CFLAGS="-fPIC"
- SHLIB_LD='${CC} -nostart'
- SHLIB_SUFFIX=".so"
-
- #-----------------------------------------------------------
- # Check for inet_ntoa in -lbind, for BeOS (which also needs
- # -lsocket, even if the network functions are in -lnet which
- # is always linked to, for compatibility.
- #-----------------------------------------------------------
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5
-$as_echo_n "checking for inet_ntoa in -lbind... " >&6; }
-if ${ac_cv_lib_bind_inet_ntoa+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lbind $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char inet_ntoa ();
-int
-main ()
-{
-return inet_ntoa ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_bind_inet_ntoa=yes
-else
- ac_cv_lib_bind_inet_ntoa=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5
-$as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; }
-if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then :
- LIBS="$LIBS -lbind -lsocket"
-fi
-
- ;;
- BSD/OS-4.*)
- SHLIB_CFLAGS="-export-dynamic -fPIC"
- SHLIB_LD='${CC} -shared'
- SHLIB_SUFFIX=".so"
- LDFLAGS="$LDFLAGS -export-dynamic"
- CC_SEARCH_FLAGS=""
- LD_SEARCH_FLAGS=""
- ;;
- CYGWIN_*)
- SHLIB_CFLAGS=""
- SHLIB_LD='${CC} -shared'
- SHLIB_SUFFIX=".dll"
- EXEEXT=".exe"
- do64bit_ok=yes
- CC_SEARCH_FLAGS=""
- LD_SEARCH_FLAGS=""
- ;;
- Haiku*)
- LDFLAGS="$LDFLAGS -Wl,--export-dynamic"
- SHLIB_CFLAGS="-fPIC"
- SHLIB_SUFFIX=".so"
- SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}'
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5
-$as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; }
-if ${ac_cv_lib_network_inet_ntoa+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lnetwork $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char inet_ntoa ();
-int
-main ()
-{
-return inet_ntoa ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_network_inet_ntoa=yes
-else
- ac_cv_lib_network_inet_ntoa=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5
-$as_echo "$ac_cv_lib_network_inet_ntoa" >&6; }
-if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then :
- LIBS="$LIBS -lnetwork"
-fi
-
- ;;
- HP-UX-*.11.*)
- # Use updated header definitions where possible
-
-$as_echo "#define _XOPEN_SOURCE_EXTENDED 1" >>confdefs.h
-
- # TEA specific: Needed by Tcl, but not most extensions
- #AC_DEFINE(_XOPEN_SOURCE, 1, [Do we want to use the XOPEN network library?])
- #LIBS="$LIBS -lxnet" # Use the XOPEN network library
-
- if test "`uname -m`" = ia64; then :
-
- SHLIB_SUFFIX=".so"
- # Use newer C++ library for C++ extensions
- #if test "$GCC" != "yes" ; then
- # CPPFLAGS="-AA"
- #fi
-
-else
-
- SHLIB_SUFFIX=".sl"
-
-fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if ${ac_cv_lib_dld_shl_load+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-/* Override any GCC internal prototype to avoid an error.
- Use char because int might match the return type of a GCC
- builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-int
-main ()
-{
-return shl_load ();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_dld_shl_load=yes
-else
- ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
- tcl_ok=yes
-else
- tcl_ok=no
-fi
-
- if test "$tcl_ok" = yes; then :
-
- LDFLAGS="$LDFLAGS -Wl,-E"
- CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
- LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.'
- LD_LIBRARY_PATH_VAR="SHLIB_PATH"
-
-fi
- if test "$GCC" = yes; then :
-
- SHLIB_LD='${CC} -shared'
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-
-else
-
- CFLAGS="$CFLAGS -z"
- # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc
- #CFLAGS="$CFLAGS +DAportable"
- SHLIB_CFLAGS="+z"
- SHLIB_LD="ld -b"
-
-fi
-
- # Check to enable 64-bit flags for compiler/linker
- if test "$do64bit" = "yes"; then :
-
- if test "$GCC" = yes; then :
-
- case `${CC} -dumpmachine` in
- hppa64*)
- # 64-bit gcc in use. Fix flags for GNU ld.
- do64bit_ok=yes
- SHLIB_LD='${CC} -shared'
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-fi
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5
-$as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;}
- ;;
- esac
-
-else
-
- do64bit_ok=yes
- CFLAGS="$CFLAGS +DD64"
- LDFLAGS_ARCH="+DD64"
-
-fi
-
-fi ;;
- IRIX-6.*)
- SHLIB_CFLAGS=""
- SHLIB_LD="ld -n32 -shared -rdata_shared"
- SHLIB_SUFFIX=".so"
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-fi
- if test "$GCC" = yes; then :
-
- CFLAGS="$CFLAGS -mabi=n32"
- LDFLAGS="$LDFLAGS -mabi=n32"
-
-else
-
- case $system in
- IRIX-6.3)
- # Use to build 6.2 compatible binaries on 6.3.
- CFLAGS="$CFLAGS -n32 -D_OLD_TERMIOS"
- ;;
- *)
- CFLAGS="$CFLAGS -n32"
- ;;
- esac
- LDFLAGS="$LDFLAGS -n32"
-
-fi
- ;;
- IRIX64-6.*)
- SHLIB_CFLAGS=""
- SHLIB_LD="ld -n32 -shared -rdata_shared"
- SHLIB_SUFFIX=".so"
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-fi
-
- # Check to enable 64-bit flags for compiler/linker
-
- if test "$do64bit" = yes; then :
-
- if test "$GCC" = yes; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported by gcc" >&5
-$as_echo "$as_me: WARNING: 64bit mode not supported by gcc" >&2;}
-
-else
-
- do64bit_ok=yes
- SHLIB_LD="ld -64 -shared -rdata_shared"
- CFLAGS="$CFLAGS -64"
- LDFLAGS_ARCH="-64"
-
-fi
-
-fi
- ;;
- Linux*|GNU*|NetBSD-Debian)
- SHLIB_CFLAGS="-fPIC"
- SHLIB_SUFFIX=".so"
-
- # TEA specific:
- CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer"
-
- # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS
- SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS_DEFAULT}'
- LDFLAGS="$LDFLAGS -Wl,--export-dynamic"
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-fi
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
- if test "`uname -m`" = "alpha"; then :
- CFLAGS="$CFLAGS -mieee"
-fi
- if test $do64bit = yes; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5
-$as_echo_n "checking if compiler accepts -m64 flag... " >&6; }
-if ${tcl_cv_cc_m64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- hold_cflags=$CFLAGS
- CFLAGS="$CFLAGS -m64"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_cc_m64=yes
-else
- tcl_cv_cc_m64=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- CFLAGS=$hold_cflags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_m64" >&5
-$as_echo "$tcl_cv_cc_m64" >&6; }
- if test $tcl_cv_cc_m64 = yes; then :
-
- CFLAGS="$CFLAGS -m64"
- do64bit_ok=yes
-
-fi
-
-fi
-
- # The combo of gcc + glibc has a bug related to inlining of
- # functions like strtod(). The -fno-builtin flag should address
- # this problem but it does not work. The -fno-inline flag is kind
- # of overkill but it works. Disable inlining only when one of the
- # files in compat/*.c is being linked in.
-
- if test x"${USE_COMPAT}" != x; then :
- CFLAGS="$CFLAGS -fno-inline"
-fi
- ;;
- Lynx*)
- SHLIB_CFLAGS="-fPIC"
- SHLIB_SUFFIX=".so"
- CFLAGS_OPTIMIZE=-02
- SHLIB_LD='${CC} -shared'
- LD_FLAGS="-Wl,--export-dynamic"
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-fi
- ;;
- OpenBSD-*)
- arch=`arch -s`
- case "$arch" in
- vax)
- SHLIB_SUFFIX=""
- SHARED_LIB_SUFFIX=""
- LDFLAGS=""
- ;;
- *)
- SHLIB_CFLAGS="-fPIC"
- SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}'
- SHLIB_SUFFIX=".so"
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-fi
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
- SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}'
- LDFLAGS="-Wl,-export-dynamic"
- ;;
- esac
- case "$arch" in
- vax)
- CFLAGS_OPTIMIZE="-O1"
- ;;
- *)
- CFLAGS_OPTIMIZE="-O2"
- ;;
- esac
- if test "${TCL_THREADS}" = "1"; then :
-
- # On OpenBSD: Compile with -pthread
- # Don't link with -lpthread
- LIBS=`echo $LIBS | sed s/-lpthread//`
- CFLAGS="$CFLAGS -pthread"
-
-fi
- # OpenBSD doesn't do version numbers with dots.
- UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a'
- TCL_LIB_VERSIONS_OK=nodots
- ;;
- NetBSD-*)
- # NetBSD has ELF and can use 'cc -shared' to build shared libs
- SHLIB_CFLAGS="-fPIC"
- SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}'
- SHLIB_SUFFIX=".so"
- LDFLAGS="$LDFLAGS -export-dynamic"
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-fi
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
- if test "${TCL_THREADS}" = "1"; then :
-
- # The -pthread needs to go in the CFLAGS, not LIBS
- LIBS=`echo $LIBS | sed s/-pthread//`
- CFLAGS="$CFLAGS -pthread"
- LDFLAGS="$LDFLAGS -pthread"
-
-fi
- ;;
- FreeBSD-*)
- # This configuration from FreeBSD Ports.
- SHLIB_CFLAGS="-fPIC"
- SHLIB_LD="${CC} -shared"
- TCL_SHLIB_LD_EXTRAS="-Wl,-soname=\$@"
- TK_SHLIB_LD_EXTRAS="-Wl,-soname,\$@"
- SHLIB_SUFFIX=".so"
- LDFLAGS=""
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-fi
- if test "${TCL_THREADS}" = "1"; then :
-
- # The -pthread needs to go in the LDFLAGS, not LIBS
- LIBS=`echo $LIBS | sed s/-pthread//`
- CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
- LDFLAGS="$LDFLAGS $PTHREAD_LIBS"
-fi
- case $system in
- FreeBSD-3.*)
- # Version numbers are dot-stripped by system policy.
- TCL_TRIM_DOTS=`echo ${VERSION} | tr -d .`
- UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a'
- SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so'
- TCL_LIB_VERSIONS_OK=nodots
- ;;
- esac
- ;;
- Darwin-*)
- CFLAGS_OPTIMIZE="-Os"
- SHLIB_CFLAGS="-fno-common"
- # To avoid discrepancies between what headers configure sees during
- # preprocessing tests and compiling tests, move any -isysroot and
- # -mmacosx-version-min flags from CFLAGS to CPPFLAGS:
- CPPFLAGS="${CPPFLAGS} `echo " ${CFLAGS}" | \
- awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \
- if ($i~/^(isysroot|mmacosx-version-min)/) print "-"$i}'`"
- CFLAGS="`echo " ${CFLAGS}" | \
- awk 'BEGIN {FS=" +-";ORS=" "}; {for (i=2;i<=NF;i++) \
- if (!($i~/^(isysroot|mmacosx-version-min)/)) print "-"$i}'`"
- if test $do64bit = yes; then :
-
- case `arch` in
- ppc)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5
-$as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; }
-if ${tcl_cv_cc_arch_ppc64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- hold_cflags=$CFLAGS
- CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_cc_arch_ppc64=yes
-else
- tcl_cv_cc_arch_ppc64=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- CFLAGS=$hold_cflags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_ppc64" >&5
-$as_echo "$tcl_cv_cc_arch_ppc64" >&6; }
- if test $tcl_cv_cc_arch_ppc64 = yes; then :
-
- CFLAGS="$CFLAGS -arch ppc64 -mpowerpc64 -mcpu=G5"
- do64bit_ok=yes
-
-fi;;
- i386)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5
-$as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; }
-if ${tcl_cv_cc_arch_x86_64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- hold_cflags=$CFLAGS
- CFLAGS="$CFLAGS -arch x86_64"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_cc_arch_x86_64=yes
-else
- tcl_cv_cc_arch_x86_64=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- CFLAGS=$hold_cflags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cc_arch_x86_64" >&5
-$as_echo "$tcl_cv_cc_arch_x86_64" >&6; }
- if test $tcl_cv_cc_arch_x86_64 = yes; then :
-
- CFLAGS="$CFLAGS -arch x86_64"
- do64bit_ok=yes
-
-fi;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&5
-$as_echo "$as_me: WARNING: Don't know how enable 64-bit on architecture \`arch\`" >&2;};;
- esac
-
-else
-
- # Check for combined 32-bit and 64-bit fat build
- if echo "$CFLAGS " |grep -E -q -- '-arch (ppc64|x86_64) ' \
- && echo "$CFLAGS " |grep -E -q -- '-arch (ppc|i386) '; then :
-
- fat_32_64=yes
-fi
-
-fi
- # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS
- SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}'
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5
-$as_echo_n "checking if ld accepts -single_module flag... " >&6; }
-if ${tcl_cv_ld_single_module+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- hold_ldflags=$LDFLAGS
- LDFLAGS="$LDFLAGS -dynamiclib -Wl,-single_module"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-int i;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_ld_single_module=yes
-else
- tcl_cv_ld_single_module=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$hold_ldflags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_single_module" >&5
-$as_echo "$tcl_cv_ld_single_module" >&6; }
- if test $tcl_cv_ld_single_module = yes; then :
-
- SHLIB_LD="${SHLIB_LD} -Wl,-single_module"
-
-fi
- # TEA specific: link shlib with current and compatibility version flags
- vers=`echo ${PACKAGE_VERSION} | sed -e 's/^\([0-9]\{1,5\}\)\(\(\.[0-9]\{1,3\}\)\{0,2\}\).*$/\1\2/p' -e d`
- SHLIB_LD="${SHLIB_LD} -current_version ${vers:-0} -compatibility_version ${vers:-0}"
- SHLIB_SUFFIX=".dylib"
- # Don't use -prebind when building for Mac OS X 10.4 or later only:
- if test "`echo "${MACOSX_DEPLOYMENT_TARGET}" | awk -F '10\\.' '{print int($2)}'`" -lt 4 -a \
- "`echo "${CPPFLAGS}" | awk -F '-mmacosx-version-min=10\\.' '{print int($2)}'`" -lt 4; then :
-
- LDFLAGS="$LDFLAGS -prebind"
-fi
- LDFLAGS="$LDFLAGS -headerpad_max_install_names"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5
-$as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; }
-if ${tcl_cv_ld_search_paths_first+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- hold_ldflags=$LDFLAGS
- LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-int i;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_ld_search_paths_first=yes
-else
- tcl_cv_ld_search_paths_first=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$hold_ldflags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_search_paths_first" >&5
-$as_echo "$tcl_cv_ld_search_paths_first" >&6; }
- if test $tcl_cv_ld_search_paths_first = yes; then :
-
- LDFLAGS="$LDFLAGS -Wl,-search_paths_first"
-
-fi
- if test "$tcl_cv_cc_visibility_hidden" != yes; then :
-
-
-$as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h
-
- tcl_cv_cc_visibility_hidden=yes
-
-fi
- CC_SEARCH_FLAGS=""
- LD_SEARCH_FLAGS=""
- LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH"
- # TEA specific: for combined 32 & 64 bit fat builds of Tk
- # extensions, verify that 64-bit build is possible.
- if test "$fat_32_64" = yes && test -n "${TK_BIN_DIR}"; then :
-
- if test "${TEA_WINDOWINGSYSTEM}" = x11; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5
-$as_echo_n "checking for 64-bit X11... " >&6; }
-if ${tcl_cv_lib_x11_64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- for v in CFLAGS CPPFLAGS LDFLAGS; do
- eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"'
- done
- CPPFLAGS="$CPPFLAGS -I/usr/X11R6/include"
- LDFLAGS="$LDFLAGS -L/usr/X11R6/lib -lX11"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-int
-main ()
-{
-XrmInitialize();
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_lib_x11_64=yes
-else
- tcl_cv_lib_x11_64=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- for v in CFLAGS CPPFLAGS LDFLAGS; do
- eval $v'="$hold_'$v'"'
- done
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_x11_64" >&5
-$as_echo "$tcl_cv_lib_x11_64" >&6; }
-
-fi
- if test "${TEA_WINDOWINGSYSTEM}" = aqua; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5
-$as_echo_n "checking for 64-bit Tk... " >&6; }
-if ${tcl_cv_lib_tk_64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- for v in CFLAGS CPPFLAGS LDFLAGS; do
- eval 'hold_'$v'="$'$v'";'$v'="`echo "$'$v' "|sed -e "s/-arch ppc / /g" -e "s/-arch i386 / /g"`"'
- done
- CPPFLAGS="$CPPFLAGS -DUSE_TCL_STUBS=1 -DUSE_TK_STUBS=1 ${TCL_INCLUDES} ${TK_INCLUDES}"
- LDFLAGS="$LDFLAGS ${TCL_STUB_LIB_SPEC} ${TK_STUB_LIB_SPEC}"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-int
-main ()
-{
-Tk_InitStubs(NULL, "", 0);
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_lib_tk_64=yes
-else
- tcl_cv_lib_tk_64=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- for v in CFLAGS CPPFLAGS LDFLAGS; do
- eval $v'="$hold_'$v'"'
- done
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_lib_tk_64" >&5
-$as_echo "$tcl_cv_lib_tk_64" >&6; }
-
-fi
- # remove 64-bit arch flags from CFLAGS et al. if configuration
- # does not support 64-bit.
- if test "$tcl_cv_lib_tk_64" = no -o "$tcl_cv_lib_x11_64" = no; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: Removing 64-bit architectures from compiler & linker flags" >&5
-$as_echo "$as_me: Removing 64-bit architectures from compiler & linker flags" >&6;}
- for v in CFLAGS CPPFLAGS LDFLAGS; do
- eval $v'="`echo "$'$v' "|sed -e "s/-arch ppc64 / /g" -e "s/-arch x86_64 / /g"`"'
- done
-fi
-
-fi
- ;;
- OS/390-*)
- CFLAGS_OPTIMIZE="" # Optimizer is buggy
-
-$as_echo "#define _OE_SOCKETS 1" >>confdefs.h
-
- ;;
- OSF1-V*)
- # Digital OSF/1
- SHLIB_CFLAGS=""
- if test "$SHARED_BUILD" = 1; then :
-
- SHLIB_LD='ld -shared -expect_unresolved "*"'
-
-else
-
- SHLIB_LD='ld -non_shared -expect_unresolved "*"'
-
-fi
- SHLIB_SUFFIX=".so"
- if test $doRpath = yes; then :
-
- CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-fi
- if test "$GCC" = yes; then :
- CFLAGS="$CFLAGS -mieee"
-else
-
- CFLAGS="$CFLAGS -DHAVE_TZSET -std1 -ieee"
-fi
- # see pthread_intro(3) for pthread support on osf1, k.furukawa
- if test "${TCL_THREADS}" = 1; then :
-
- CFLAGS="$CFLAGS -DHAVE_PTHREAD_ATTR_SETSTACKSIZE"
- CFLAGS="$CFLAGS -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
- LIBS=`echo $LIBS | sed s/-lpthreads//`
- if test "$GCC" = yes; then :
-
- LIBS="$LIBS -lpthread -lmach -lexc"
-
-else
-
- CFLAGS="$CFLAGS -pthread"
- LDFLAGS="$LDFLAGS -pthread"
-
-fi
-
-fi
- ;;
- QNX-6*)
- # QNX RTP
- # This may work for all QNX, but it was only reported for v6.
- SHLIB_CFLAGS="-fPIC"
- SHLIB_LD="ld -Bshareable -x"
- SHLIB_LD_LIBS=""
- SHLIB_SUFFIX=".so"
- CC_SEARCH_FLAGS=""
- LD_SEARCH_FLAGS=""
- ;;
- SCO_SV-3.2*)
- if test "$GCC" = yes; then :
-
- SHLIB_CFLAGS="-fPIC -melf"
- LDFLAGS="$LDFLAGS -melf -Wl,-Bexport"
-
-else
-
- SHLIB_CFLAGS="-Kpic -belf"
- LDFLAGS="$LDFLAGS -belf -Wl,-Bexport"
-
-fi
- SHLIB_LD="ld -G"
- SHLIB_LD_LIBS=""
- SHLIB_SUFFIX=".so"
- CC_SEARCH_FLAGS=""
- LD_SEARCH_FLAGS=""
- ;;
- SunOS-5.[0-6])
- # Careful to not let 5.10+ fall into this case
-
- # Note: If _REENTRANT isn't defined, then Solaris
- # won't define thread-safe library routines.
-
-
-$as_echo "#define _REENTRANT 1" >>confdefs.h
-
-
-$as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
-
-
- SHLIB_CFLAGS="-KPIC"
- SHLIB_SUFFIX=".so"
- if test "$GCC" = yes; then :
-
- SHLIB_LD='${CC} -shared'
- CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-
-else
-
- SHLIB_LD="/usr/ccs/bin/ld -G -z text"
- CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-
-fi
- ;;
- SunOS-5*)
- # Note: If _REENTRANT isn't defined, then Solaris
- # won't define thread-safe library routines.
-
-
-$as_echo "#define _REENTRANT 1" >>confdefs.h
-
-
-$as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
-
-
- SHLIB_CFLAGS="-KPIC"
-
- # Check to enable 64-bit flags for compiler/linker
- if test "$do64bit" = yes; then :
-
- arch=`isainfo`
- if test "$arch" = "sparcv9 sparc"; then :
-
- if test "$GCC" = yes; then :
-
- if test "`${CC} -dumpversion | awk -F. '{print $1}'`" -lt 3; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&5
-$as_echo "$as_me: WARNING: 64bit mode not supported with GCC < 3.2 on $system" >&2;}
-
-else
-
- do64bit_ok=yes
- CFLAGS="$CFLAGS -m64 -mcpu=v9"
- LDFLAGS="$LDFLAGS -m64 -mcpu=v9"
- SHLIB_CFLAGS="-fPIC"
-
-fi
-
-else
-
- do64bit_ok=yes
- if test "$do64bitVIS" = yes; then :
-
- CFLAGS="$CFLAGS -xarch=v9a"
- LDFLAGS_ARCH="-xarch=v9a"
-
-else
-
- CFLAGS="$CFLAGS -xarch=v9"
- LDFLAGS_ARCH="-xarch=v9"
-
-fi
- # Solaris 64 uses this as well
- #LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH_64"
-
-fi
-
-else
- if test "$arch" = "amd64 i386"; then :
-
- if test "$GCC" = yes; then :
-
- case $system in
- SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*)
- do64bit_ok=yes
- CFLAGS="$CFLAGS -m64"
- LDFLAGS="$LDFLAGS -m64";;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported with GCC on $system" >&5
-$as_echo "$as_me: WARNING: 64bit mode not supported with GCC on $system" >&2;};;
- esac
-
-else
-
- do64bit_ok=yes
- case $system in
- SunOS-5.1[1-9]*|SunOS-5.[2-9][0-9]*)
- CFLAGS="$CFLAGS -m64"
- LDFLAGS="$LDFLAGS -m64";;
- *)
- CFLAGS="$CFLAGS -xarch=amd64"
- LDFLAGS="$LDFLAGS -xarch=amd64";;
- esac
-
-fi
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit mode not supported for $arch" >&5
-$as_echo "$as_me: WARNING: 64bit mode not supported for $arch" >&2;}
-fi
-fi
-
-fi
-
- SHLIB_SUFFIX=".so"
- if test "$GCC" = yes; then :
-
- SHLIB_LD='${CC} -shared'
- CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
- if test "$do64bit_ok" = yes; then :
-
- if test "$arch" = "sparcv9 sparc"; then :
-
- # We need to specify -static-libgcc or we need to
- # add the path to the sparv9 libgcc.
- # JH: static-libgcc is necessary for core Tcl, but may
- # not be necessary for extensions.
- SHLIB_LD="$SHLIB_LD -m64 -mcpu=v9 -static-libgcc"
- # for finding sparcv9 libgcc, get the regular libgcc
- # path, remove so name and append 'sparcv9'
- #v9gcclibdir="`gcc -print-file-name=libgcc_s.so` | ..."
- #CC_SEARCH_FLAGS="${CC_SEARCH_FLAGS},-R,$v9gcclibdir"
-
-else
- if test "$arch" = "amd64 i386"; then :
-
- # JH: static-libgcc is necessary for core Tcl, but may
- # not be necessary for extensions.
- SHLIB_LD="$SHLIB_LD -m64 -static-libgcc"
-
-fi
-fi
-
-fi
-
-else
-
- case $system in
- SunOS-5.[1-9][0-9]*)
- # TEA specific: use LDFLAGS_DEFAULT instead of LDFLAGS
- SHLIB_LD='${CC} -G -z text ${LDFLAGS_DEFAULT}';;
- *)
- SHLIB_LD='/usr/ccs/bin/ld -G -z text';;
- esac
- CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
- LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
-
-fi
- ;;
- UNIX_SV* | UnixWare-5*)
- SHLIB_CFLAGS="-KPIC"
- SHLIB_LD='${CC} -G'
- SHLIB_LD_LIBS=""
- SHLIB_SUFFIX=".so"
- # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers
- # that don't grok the -Bexport option. Test that it does.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld accepts -Bexport flag" >&5
-$as_echo_n "checking for ld accepts -Bexport flag... " >&6; }
-if ${tcl_cv_ld_Bexport+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- hold_ldflags=$LDFLAGS
- LDFLAGS="$LDFLAGS -Wl,-Bexport"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-int i;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- tcl_cv_ld_Bexport=yes
-else
- tcl_cv_ld_Bexport=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
- LDFLAGS=$hold_ldflags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_ld_Bexport" >&5
-$as_echo "$tcl_cv_ld_Bexport" >&6; }
- if test $tcl_cv_ld_Bexport = yes; then :
-
- LDFLAGS="$LDFLAGS -Wl,-Bexport"
-
-fi
- CC_SEARCH_FLAGS=""
- LD_SEARCH_FLAGS=""
- ;;
- esac
-
- if test "$do64bit" = yes -a "$do64bit_ok" = no; then :
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 64bit support being disabled -- don't know magic for this platform" >&5
-$as_echo "$as_me: WARNING: 64bit support being disabled -- don't know magic for this platform" >&2;}
-
-fi
-
-
-
- # Add in the arch flags late to ensure it wasn't removed.
- # Not necessary in TEA, but this is aligned with core
- LDFLAGS="$LDFLAGS $LDFLAGS_ARCH"
-
- # If we're running gcc, then change the C flags for compiling shared
- # libraries to the right flags for gcc, instead of those for the
- # standard manufacturer compiler.
-
- if test "$GCC" = yes; then :
-
- case $system in
- AIX-*) ;;
- BSD/OS*) ;;
- CYGWIN_*|MINGW32_*) ;;
- IRIX*) ;;
- NetBSD-*|FreeBSD-*|OpenBSD-*) ;;
- Darwin-*) ;;
- SCO_SV-3.2*) ;;
- windows) ;;
- *) SHLIB_CFLAGS="-fPIC" ;;
- esac
-fi
-
- if test "$tcl_cv_cc_visibility_hidden" != yes; then :
-
-
-$as_echo "#define MODULE_SCOPE extern" >>confdefs.h
-
-
-fi
-
- if test "$SHARED_LIB_SUFFIX" = ""; then :
-
- # TEA specific: use PACKAGE_VERSION instead of VERSION
- SHARED_LIB_SUFFIX='${PACKAGE_VERSION}${SHLIB_SUFFIX}'
-fi
- if test "$UNSHARED_LIB_SUFFIX" = ""; then :
-
- # TEA specific: use PACKAGE_VERSION instead of VERSION
- UNSHARED_LIB_SUFFIX='${PACKAGE_VERSION}.a'
-fi
-
- if test "${GCC}" = "yes" -a ${SHLIB_SUFFIX} = ".dll"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SEH support in compiler" >&5
-$as_echo_n "checking for SEH support in compiler... " >&6; }
-if ${tcl_cv_seh+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
- tcl_cv_seh=no
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#define WIN32_LEAN_AND_MEAN
-#include
-#undef WIN32_LEAN_AND_MEAN
-
- int main(int argc, char** argv) {
- int a, b = 0;
- __try {
- a = 666 / b;
- }
- __except (EXCEPTION_EXECUTE_HANDLER) {
- return 0;
- }
- return 1;
- }
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
- tcl_cv_seh=yes
-else
- tcl_cv_seh=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_seh" >&5
-$as_echo "$tcl_cv_seh" >&6; }
- if test "$tcl_cv_seh" = "no" ; then
-
-$as_echo "#define HAVE_NO_SEH 1" >>confdefs.h
-
- fi
-
- #
- # Check to see if the excpt.h include file provided contains the
- # definition for EXCEPTION_DISPOSITION; if not, which is the case
- # with Cygwin's version as of 2002-04-10, define it to be int,
- # sufficient for getting the current code to work.
- #
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXCEPTION_DISPOSITION support in include files" >&5
-$as_echo_n "checking for EXCEPTION_DISPOSITION support in include files... " >&6; }
-if ${tcl_cv_eh_disposition+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-# define WIN32_LEAN_AND_MEAN
-# include
-# undef WIN32_LEAN_AND_MEAN
-
-int
-main ()
-{
-
- EXCEPTION_DISPOSITION x;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_eh_disposition=yes
-else
- tcl_cv_eh_disposition=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_eh_disposition" >&5
-$as_echo "$tcl_cv_eh_disposition" >&6; }
- if test "$tcl_cv_eh_disposition" = "no" ; then
-
-$as_echo "#define EXCEPTION_DISPOSITION int" >>confdefs.h
-
- fi
-
- # Check to see if winnt.h defines CHAR, SHORT, and LONG
- # even if VOID has already been #defined. The win32api
- # used by mingw and cygwin is known to do this.
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for winnt.h that ignores VOID define" >&5
-$as_echo_n "checking for winnt.h that ignores VOID define... " >&6; }
-if ${tcl_cv_winnt_ignore_void+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-#define VOID void
-#define WIN32_LEAN_AND_MEAN
-#include
-#undef WIN32_LEAN_AND_MEAN
-
-int
-main ()
-{
-
- CHAR c;
- SHORT s;
- LONG l;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_winnt_ignore_void=yes
-else
- tcl_cv_winnt_ignore_void=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_winnt_ignore_void" >&5
-$as_echo "$tcl_cv_winnt_ignore_void" >&6; }
- if test "$tcl_cv_winnt_ignore_void" = "yes" ; then
-
-$as_echo "#define HAVE_WINNT_IGNORE_VOID 1" >>confdefs.h
-
- fi
- fi
-
- # See if the compiler supports casting to a union type.
- # This is used to stop gcc from printing a compiler
- # warning when initializing a union member.
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cast to union support" >&5
-$as_echo_n "checking for cast to union support... " >&6; }
-if ${tcl_cv_cast_to_union+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- union foo { int i; double d; };
- union foo f = (union foo) (int) 0;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_cast_to_union=yes
-else
- tcl_cv_cast_to_union=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_cast_to_union" >&5
-$as_echo "$tcl_cv_cast_to_union" >&6; }
- if test "$tcl_cv_cast_to_union" = "yes"; then
-
-$as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h
-
- fi
-
-
-
-
-
-
-
-
-
-
-
-
-
- # These must be called after we do the basic CFLAGS checks and
- # verify any possible 64-bit or similar switches are necessary
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for required early compiler flags" >&5
-$as_echo_n "checking for required early compiler flags... " >&6; }
- tcl_flags=""
-
- if ${tcl_cv_flag__isoc99_source+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-int
-main ()
-{
-char *p = (char *)strtoll; char *q = (char *)strtoull;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_flag__isoc99_source=no
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#define _ISOC99_SOURCE 1
-#include
-int
-main ()
-{
-char *p = (char *)strtoll; char *q = (char *)strtoull;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_flag__isoc99_source=yes
-else
- tcl_cv_flag__isoc99_source=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
- if test "x${tcl_cv_flag__isoc99_source}" = "xyes" ; then
-
-$as_echo "#define _ISOC99_SOURCE 1" >>confdefs.h
-
- tcl_flags="$tcl_flags _ISOC99_SOURCE"
- fi
-
-
- if ${tcl_cv_flag__largefile64_source+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-int
-main ()
-{
-struct stat64 buf; int i = stat64("/", &buf);
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_flag__largefile64_source=no
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#define _LARGEFILE64_SOURCE 1
-#include
-int
-main ()
-{
-struct stat64 buf; int i = stat64("/", &buf);
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_flag__largefile64_source=yes
-else
- tcl_cv_flag__largefile64_source=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
- if test "x${tcl_cv_flag__largefile64_source}" = "xyes" ; then
-
-$as_echo "#define _LARGEFILE64_SOURCE 1" >>confdefs.h
-
- tcl_flags="$tcl_flags _LARGEFILE64_SOURCE"
- fi
-
-
- if ${tcl_cv_flag__largefile_source64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-int
-main ()
-{
-char *p = (char *)open64;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_flag__largefile_source64=no
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#define _LARGEFILE_SOURCE64 1
-#include
-int
-main ()
-{
-char *p = (char *)open64;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_flag__largefile_source64=yes
-else
- tcl_cv_flag__largefile_source64=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
- if test "x${tcl_cv_flag__largefile_source64}" = "xyes" ; then
-
-$as_echo "#define _LARGEFILE_SOURCE64 1" >>confdefs.h
-
- tcl_flags="$tcl_flags _LARGEFILE_SOURCE64"
- fi
-
- if test "x${tcl_flags}" = "x" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_flags}" >&5
-$as_echo "${tcl_flags}" >&6; }
- fi
-
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5
-$as_echo_n "checking for 64-bit integer type... " >&6; }
- if ${tcl_cv_type_64bit+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- tcl_cv_type_64bit=none
- # See if the compiler knows natively about __int64
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-__int64 value = (__int64) 0;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_type_64bit=__int64
-else
- tcl_type_64bit="long long"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- # See if we should use long anyway Note that we substitute in the
- # type that is our current guess for a 64-bit type inside this check
- # program, so it should be modified only carefully...
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-switch (0) {
- case 1: case (sizeof(${tcl_type_64bit})==sizeof(long)): ;
- }
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_type_64bit=${tcl_type_64bit}
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
- if test "${tcl_cv_type_64bit}" = none ; then
-
-$as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: using long" >&5
-$as_echo "using long" >&6; }
- elif test "${tcl_cv_type_64bit}" = "__int64" \
- -a "${TEA_PLATFORM}" = "windows" ; then
- # TEA specific: We actually want to use the default tcl.h checks in
- # this case to handle both TCL_WIDE_INT_TYPE and TCL_LL_MODIFIER*
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: using Tcl header defaults" >&5
-$as_echo "using Tcl header defaults" >&6; }
- else
-
-cat >>confdefs.h <<_ACEOF
-#define TCL_WIDE_INT_TYPE ${tcl_cv_type_64bit}
-_ACEOF
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${tcl_cv_type_64bit}" >&5
-$as_echo "${tcl_cv_type_64bit}" >&6; }
-
- # Now check for auxiliary declarations
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5
-$as_echo_n "checking for struct dirent64... " >&6; }
-if ${tcl_cv_struct_dirent64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-#include
-int
-main ()
-{
-struct dirent64 p;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_struct_dirent64=yes
-else
- tcl_cv_struct_dirent64=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_dirent64" >&5
-$as_echo "$tcl_cv_struct_dirent64" >&6; }
- if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then
-
-$as_echo "#define HAVE_STRUCT_DIRENT64 1" >>confdefs.h
-
- fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5
-$as_echo_n "checking for struct stat64... " >&6; }
-if ${tcl_cv_struct_stat64+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-int
-main ()
-{
-struct stat64 p;
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- tcl_cv_struct_stat64=yes
-else
- tcl_cv_struct_stat64=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tcl_cv_struct_stat64" >&5
-$as_echo "$tcl_cv_struct_stat64" >&6; }
- if test "x${tcl_cv_struct_stat64}" = "xyes" ; then
-
-$as_echo "#define HAVE_STRUCT_STAT64 1" >>confdefs.h
-
- fi
-
- for ac_func in open64 lseek64
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5
-$as_echo_n "checking for off64_t... " >&6; }
- if ${tcl_cv_type_off64_t+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include