port build system
This commit is contained in:
+104
@@ -0,0 +1,104 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: LLVM
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignEscapedNewlinesLeft: true
|
||||||
|
AlignOperands: true
|
||||||
|
AlignTrailingComments: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: true
|
||||||
|
BinPackArguments: false
|
||||||
|
BinPackParameters: false
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: false
|
||||||
|
AfterEnum: false
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: false
|
||||||
|
AfterUnion: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
IndentBraces: false
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 90
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: false
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^"(gnuradio)/'
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<(gnuradio)/'
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^<(boost)/'
|
||||||
|
Priority: 98
|
||||||
|
- Regex: '^<[a-z]*>$'
|
||||||
|
Priority: 99
|
||||||
|
- Regex: '^".*"$'
|
||||||
|
Priority: 0
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 10
|
||||||
|
|
||||||
|
IncludeIsMainRegex: '(Test)?$'
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 2
|
||||||
|
NamespaceIndentation: None
|
||||||
|
ObjCBlockIndentWidth: 2
|
||||||
|
ObjCSpaceAfterProperty: false
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 19
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakString: 1000
|
||||||
|
PenaltyExcessCharacter: 1000000
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
|
PointerAlignment: Left
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: true
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
Standard: Cpp11
|
||||||
|
TabWidth: 8
|
||||||
|
UseTab: Never
|
||||||
+5
-2
@@ -1,2 +1,5 @@
|
|||||||
build/
|
*~
|
||||||
tags
|
*.pyc
|
||||||
|
*.pyo
|
||||||
|
build*/
|
||||||
|
examples/grc/*.py
|
||||||
|
|||||||
+31
-22
@@ -1,21 +1,10 @@
|
|||||||
# Copyright 2011,2012,2014,2016,2018 Free Software Foundation, Inc.
|
# Copyright 2011-2020 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is part of gr-foo
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
#
|
#
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
#
|
||||||
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Project setup
|
# Project setup
|
||||||
@@ -62,11 +51,11 @@ if((CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
SET(CMAKE_CXX_STANDARD 11)
|
SET(CMAKE_CXX_STANDARD 14)
|
||||||
ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
ELSEIF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
SET(CMAKE_CXX_STANDARD 11)
|
SET(CMAKE_CXX_STANDARD 14)
|
||||||
ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
SET(CMAKE_CXX_STANDARD 11)
|
SET(CMAKE_CXX_STANDARD 14)
|
||||||
ELSE()
|
ELSE()
|
||||||
message(WARNING "C++ standard could not be set because compiler is not GNU, Clang or MSVC.")
|
message(WARNING "C++ standard could not be set because compiler is not GNU, Clang or MSVC.")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@@ -95,6 +84,7 @@ endif()
|
|||||||
########################################################################
|
########################################################################
|
||||||
# Install directories
|
# Install directories
|
||||||
########################################################################
|
########################################################################
|
||||||
|
include(FindPkgConfig)
|
||||||
find_package(Gnuradio "3.9" REQUIRED COMPONENTS blocks analog filter fft)
|
find_package(Gnuradio "3.9" REQUIRED COMPONENTS blocks analog filter fft)
|
||||||
include(GrVersion)
|
include(GrVersion)
|
||||||
|
|
||||||
@@ -131,6 +121,20 @@ if(APPLE)
|
|||||||
endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
|
endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH)
|
||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Find gnuradio build dependencies
|
||||||
|
########################################################################
|
||||||
|
find_package(Doxygen)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup doxygen option
|
||||||
|
########################################################################
|
||||||
|
if(DOXYGEN_FOUND)
|
||||||
|
option(ENABLE_DOXYGEN "Build docs using Doxygen" ON)
|
||||||
|
else(DOXYGEN_FOUND)
|
||||||
|
option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF)
|
||||||
|
endif(DOXYGEN_FOUND)
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Create uninstall target
|
# Create uninstall target
|
||||||
########################################################################
|
########################################################################
|
||||||
@@ -143,15 +147,20 @@ add_custom_target(uninstall
|
|||||||
${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
|
${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Add subdirectories
|
# Add subdirectories
|
||||||
########################################################################
|
########################################################################
|
||||||
add_subdirectory(include/foo)
|
add_subdirectory(include/foo)
|
||||||
add_subdirectory(lib)
|
add_subdirectory(lib)
|
||||||
add_subdirectory(swig)
|
add_subdirectory(docs)
|
||||||
add_subdirectory(python)
|
# NOTE: manually update below to use GRC to generate C++ flowgraphs w/o python
|
||||||
add_subdirectory(grc)
|
if(ENABLE_PYTHON)
|
||||||
|
message(STATUS "PYTHON and GRC components are enabled")
|
||||||
|
add_subdirectory(python)
|
||||||
|
add_subdirectory(grc)
|
||||||
|
else(ENABLE_PYTHON)
|
||||||
|
message(STATUS "PYTHON and GRC components are disabled")
|
||||||
|
endif(ENABLE_PYTHON)
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Install cmake search helper for this library
|
# Install cmake search helper for this library
|
||||||
|
|||||||
+1
-2
@@ -3,8 +3,7 @@ author:
|
|||||||
- Bastian Bloessl <bloessl@ccs-labs.org>
|
- Bastian Bloessl <bloessl@ccs-labs.org>
|
||||||
copyright_owner:
|
copyright_owner:
|
||||||
- Bastian Bloessl
|
- Bastian Bloessl
|
||||||
dependencies:
|
gr_supported_version: v3.7, v3.8, v3.9
|
||||||
- gnuradio (>= 3.7.4)
|
|
||||||
repo: https://github.com/bastibl/gr-foo.git
|
repo: https://github.com/bastibl/gr-foo.git
|
||||||
tags:
|
tags:
|
||||||
- foo
|
- foo
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
INCLUDE(FindPkgConfig)
|
if(NOT PKG_CONFIG_FOUND)
|
||||||
|
INCLUDE(FindPkgConfig)
|
||||||
|
endif()
|
||||||
PKG_CHECK_MODULES(PC_FOO foo)
|
PKG_CHECK_MODULES(PC_FOO foo)
|
||||||
|
|
||||||
FIND_PATH(
|
FIND_PATH(
|
||||||
|
|||||||
@@ -1,21 +1,7 @@
|
|||||||
# Copyright 2018 Free Software Foundation, Inc.
|
# Copyright 2018 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is part of GNU Radio
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
#
|
#
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
include(CMakeFindDependencyMacro)
|
include(CMakeFindDependencyMacro)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Setup dependencies
|
||||||
|
########################################################################
|
||||||
|
find_package(Doxygen)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Begin conditional configuration
|
||||||
|
########################################################################
|
||||||
|
if(ENABLE_DOXYGEN)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Add subdirectories
|
||||||
|
########################################################################
|
||||||
|
add_subdirectory(doxygen)
|
||||||
|
|
||||||
|
endif(ENABLE_DOXYGEN)
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
This is the foo-write-a-block package meant as a guide to building
|
||||||
|
out-of-tree packages. To use the foo blocks, the Python namespaces
|
||||||
|
is in 'foo', which is imported as:
|
||||||
|
|
||||||
|
import foo
|
||||||
|
|
||||||
|
See the Doxygen documentation for details about the blocks available
|
||||||
|
in this package. A quick listing of the details can be found in Python
|
||||||
|
after importing by using:
|
||||||
|
|
||||||
|
help(foo)
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Create the doxygen configuration file
|
||||||
|
########################################################################
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} top_srcdir)
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} top_builddir)
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} abs_top_srcdir)
|
||||||
|
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} abs_top_builddir)
|
||||||
|
|
||||||
|
set(HAVE_DOT ${DOXYGEN_DOT_FOUND})
|
||||||
|
set(enable_html_docs YES)
|
||||||
|
set(enable_latex_docs NO)
|
||||||
|
set(enable_mathjax NO)
|
||||||
|
set(enable_xml_docs YES)
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
||||||
|
@ONLY)
|
||||||
|
|
||||||
|
set(BUILT_DIRS ${CMAKE_CURRENT_BINARY_DIR}/xml ${CMAKE_CURRENT_BINARY_DIR}/html)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Make and install doxygen docs
|
||||||
|
########################################################################
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${BUILT_DIRS}
|
||||||
|
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
COMMENT "Generating documentation with doxygen"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(doxygen_target ALL DEPENDS ${BUILT_DIRS})
|
||||||
|
|
||||||
|
install(DIRECTORY ${BUILT_DIRS} DESTINATION ${GR_PKG_DOC_DIR})
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,71 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Python interface to contents of doxygen xml documentation.
|
||||||
|
|
||||||
|
Example use:
|
||||||
|
See the contents of the example folder for the C++ and
|
||||||
|
doxygen-generated xml used in this example.
|
||||||
|
|
||||||
|
>>> # Parse the doxygen docs.
|
||||||
|
>>> import os
|
||||||
|
>>> this_dir = os.path.dirname(globals()['__file__'])
|
||||||
|
>>> xml_path = this_dir + "/example/xml/"
|
||||||
|
>>> di = DoxyIndex(xml_path)
|
||||||
|
|
||||||
|
Get a list of all top-level objects.
|
||||||
|
|
||||||
|
>>> print([mem.name() for mem in di.members()])
|
||||||
|
[u'Aadvark', u'aadvarky_enough', u'main']
|
||||||
|
|
||||||
|
Get all functions.
|
||||||
|
|
||||||
|
>>> print([mem.name() for mem in di.in_category(DoxyFunction)])
|
||||||
|
[u'aadvarky_enough', u'main']
|
||||||
|
|
||||||
|
Check if an object is present.
|
||||||
|
|
||||||
|
>>> di.has_member(u'Aadvark')
|
||||||
|
True
|
||||||
|
>>> di.has_member(u'Fish')
|
||||||
|
False
|
||||||
|
|
||||||
|
Get an item by name and check its properties.
|
||||||
|
|
||||||
|
>>> aad = di.get_member(u'Aadvark')
|
||||||
|
>>> print(aad.brief_description)
|
||||||
|
Models the mammal Aadvark.
|
||||||
|
>>> print(aad.detailed_description)
|
||||||
|
Sadly the model is incomplete and cannot capture all aspects of an aadvark yet.
|
||||||
|
<BLANKLINE>
|
||||||
|
This line is uninformative and is only to test line breaks in the comments.
|
||||||
|
>>> [mem.name() for mem in aad.members()]
|
||||||
|
[u'aadvarkness', u'print', u'Aadvark', u'get_aadvarkness']
|
||||||
|
>>> aad.get_member(u'print').brief_description
|
||||||
|
u'Outputs the vital aadvark statistics.'
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from .doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther
|
||||||
|
|
||||||
|
def _test():
|
||||||
|
import os
|
||||||
|
this_dir = os.path.dirname(globals()['__file__'])
|
||||||
|
xml_path = this_dir + "/example/xml/"
|
||||||
|
di = DoxyIndex(xml_path)
|
||||||
|
# Get the Aadvark class
|
||||||
|
aad = di.get_member('Aadvark')
|
||||||
|
aad.brief_description
|
||||||
|
import doctest
|
||||||
|
return doctest.testmod()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
_test()
|
||||||
|
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
A base class is created.
|
||||||
|
|
||||||
|
Classes based upon this are used to make more user-friendly interfaces
|
||||||
|
to the doxygen xml docs than the generated classes provide.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import pdb
|
||||||
|
|
||||||
|
from xml.parsers.expat import ExpatError
|
||||||
|
|
||||||
|
from .generated import compound
|
||||||
|
|
||||||
|
|
||||||
|
class Base(object):
|
||||||
|
|
||||||
|
class Duplicate(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoSuchMember(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class ParsingError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def __init__(self, parse_data, top=None):
|
||||||
|
self._parsed = False
|
||||||
|
self._error = False
|
||||||
|
self._parse_data = parse_data
|
||||||
|
self._members = []
|
||||||
|
self._dict_members = {}
|
||||||
|
self._in_category = {}
|
||||||
|
self._data = {}
|
||||||
|
if top is not None:
|
||||||
|
self._xml_path = top._xml_path
|
||||||
|
# Set up holder of references
|
||||||
|
else:
|
||||||
|
top = self
|
||||||
|
self._refs = {}
|
||||||
|
self._xml_path = parse_data
|
||||||
|
self.top = top
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_refid(cls, refid, top=None):
|
||||||
|
""" Instantiate class from a refid rather than parsing object. """
|
||||||
|
# First check to see if its already been instantiated.
|
||||||
|
if top is not None and refid in top._refs:
|
||||||
|
return top._refs[refid]
|
||||||
|
# Otherwise create a new instance and set refid.
|
||||||
|
inst = cls(None, top=top)
|
||||||
|
inst.refid = refid
|
||||||
|
inst.add_ref(inst)
|
||||||
|
return inst
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_parse_data(cls, parse_data, top=None):
|
||||||
|
refid = getattr(parse_data, 'refid', None)
|
||||||
|
if refid is not None and top is not None and refid in top._refs:
|
||||||
|
return top._refs[refid]
|
||||||
|
inst = cls(parse_data, top=top)
|
||||||
|
if refid is not None:
|
||||||
|
inst.refid = refid
|
||||||
|
inst.add_ref(inst)
|
||||||
|
return inst
|
||||||
|
|
||||||
|
def add_ref(self, obj):
|
||||||
|
if hasattr(obj, 'refid'):
|
||||||
|
self.top._refs[obj.refid] = obj
|
||||||
|
|
||||||
|
mem_classes = []
|
||||||
|
|
||||||
|
def get_cls(self, mem):
|
||||||
|
for cls in self.mem_classes:
|
||||||
|
if cls.can_parse(mem):
|
||||||
|
return cls
|
||||||
|
raise Exception(("Did not find a class for object '%s'." \
|
||||||
|
% (mem.get_name())))
|
||||||
|
|
||||||
|
def convert_mem(self, mem):
|
||||||
|
try:
|
||||||
|
cls = self.get_cls(mem)
|
||||||
|
converted = cls.from_parse_data(mem, self.top)
|
||||||
|
if converted is None:
|
||||||
|
raise Exception('No class matched this object.')
|
||||||
|
self.add_ref(converted)
|
||||||
|
return converted
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def includes(cls, inst):
|
||||||
|
return isinstance(inst, cls)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def can_parse(cls, obj):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
self._parsed = True
|
||||||
|
|
||||||
|
def _get_dict_members(self, cat=None):
|
||||||
|
"""
|
||||||
|
For given category a dictionary is returned mapping member names to
|
||||||
|
members of that category. For names that are duplicated the name is
|
||||||
|
mapped to None.
|
||||||
|
"""
|
||||||
|
self.confirm_no_error()
|
||||||
|
if cat not in self._dict_members:
|
||||||
|
new_dict = {}
|
||||||
|
for mem in self.in_category(cat):
|
||||||
|
if mem.name() not in new_dict:
|
||||||
|
new_dict[mem.name()] = mem
|
||||||
|
else:
|
||||||
|
new_dict[mem.name()] = self.Duplicate
|
||||||
|
self._dict_members[cat] = new_dict
|
||||||
|
return self._dict_members[cat]
|
||||||
|
|
||||||
|
def in_category(self, cat):
|
||||||
|
self.confirm_no_error()
|
||||||
|
if cat is None:
|
||||||
|
return self._members
|
||||||
|
if cat not in self._in_category:
|
||||||
|
self._in_category[cat] = [mem for mem in self._members
|
||||||
|
if cat.includes(mem)]
|
||||||
|
return self._in_category[cat]
|
||||||
|
|
||||||
|
def get_member(self, name, cat=None):
|
||||||
|
self.confirm_no_error()
|
||||||
|
# Check if it's in a namespace or class.
|
||||||
|
bits = name.split('::')
|
||||||
|
first = bits[0]
|
||||||
|
rest = '::'.join(bits[1:])
|
||||||
|
member = self._get_dict_members(cat).get(first, self.NoSuchMember)
|
||||||
|
# Raise any errors that are returned.
|
||||||
|
if member in set([self.NoSuchMember, self.Duplicate]):
|
||||||
|
raise member()
|
||||||
|
if rest:
|
||||||
|
return member.get_member(rest, cat=cat)
|
||||||
|
return member
|
||||||
|
|
||||||
|
def has_member(self, name, cat=None):
|
||||||
|
try:
|
||||||
|
mem = self.get_member(name, cat=cat)
|
||||||
|
return True
|
||||||
|
except self.NoSuchMember:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def data(self):
|
||||||
|
self.confirm_no_error()
|
||||||
|
return self._data
|
||||||
|
|
||||||
|
def members(self):
|
||||||
|
self.confirm_no_error()
|
||||||
|
return self._members
|
||||||
|
|
||||||
|
def process_memberdefs(self):
|
||||||
|
mdtss = []
|
||||||
|
for sec in self._retrieved_data.compounddef.sectiondef:
|
||||||
|
mdtss += sec.memberdef
|
||||||
|
# At the moment we lose all information associated with sections.
|
||||||
|
# Sometimes a memberdef is in several sectiondef.
|
||||||
|
# We make sure we don't get duplicates here.
|
||||||
|
uniques = set([])
|
||||||
|
for mem in mdtss:
|
||||||
|
converted = self.convert_mem(mem)
|
||||||
|
pair = (mem.name, mem.__class__)
|
||||||
|
if pair not in uniques:
|
||||||
|
uniques.add(pair)
|
||||||
|
self._members.append(converted)
|
||||||
|
|
||||||
|
def retrieve_data(self):
|
||||||
|
filename = os.path.join(self._xml_path, self.refid + '.xml')
|
||||||
|
try:
|
||||||
|
self._retrieved_data = compound.parse(filename)
|
||||||
|
except ExpatError:
|
||||||
|
print('Error in xml in file %s' % filename)
|
||||||
|
self._error = True
|
||||||
|
self._retrieved_data = None
|
||||||
|
|
||||||
|
def check_parsed(self):
|
||||||
|
if not self._parsed:
|
||||||
|
self._parse()
|
||||||
|
|
||||||
|
def confirm_no_error(self):
|
||||||
|
self.check_parsed()
|
||||||
|
if self._error:
|
||||||
|
raise self.ParsingError()
|
||||||
|
|
||||||
|
def error(self):
|
||||||
|
self.check_parsed()
|
||||||
|
return self._error
|
||||||
|
|
||||||
|
def name(self):
|
||||||
|
# first see if we can do it without processing.
|
||||||
|
if self._parse_data is not None:
|
||||||
|
return self._parse_data.name
|
||||||
|
self.check_parsed()
|
||||||
|
return self._retrieved_data.compounddef.name
|
||||||
@@ -0,0 +1,282 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Classes providing more user-friendly interfaces to the doxygen xml
|
||||||
|
docs than the generated classes provide.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from .generated import index
|
||||||
|
from .base import Base
|
||||||
|
from .text import description
|
||||||
|
|
||||||
|
class DoxyIndex(Base):
|
||||||
|
"""
|
||||||
|
Parses a doxygen xml directory.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyIndex, self)._parse()
|
||||||
|
self._root = index.parse(os.path.join(self._xml_path, 'index.xml'))
|
||||||
|
for mem in self._root.compound:
|
||||||
|
converted = self.convert_mem(mem)
|
||||||
|
# For files and namespaces we want the contents to be
|
||||||
|
# accessible directly from the parent rather than having
|
||||||
|
# to go through the file object.
|
||||||
|
if self.get_cls(mem) == DoxyFile:
|
||||||
|
if mem.name.endswith('.h'):
|
||||||
|
self._members += converted.members()
|
||||||
|
self._members.append(converted)
|
||||||
|
elif self.get_cls(mem) == DoxyNamespace:
|
||||||
|
self._members += converted.members()
|
||||||
|
self._members.append(converted)
|
||||||
|
else:
|
||||||
|
self._members.append(converted)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyCompMem(Base):
|
||||||
|
|
||||||
|
|
||||||
|
kind = None
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(DoxyCompMem, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def can_parse(cls, obj):
|
||||||
|
return obj.kind == cls.kind
|
||||||
|
|
||||||
|
def set_descriptions(self, parse_data):
|
||||||
|
bd = description(getattr(parse_data, 'briefdescription', None))
|
||||||
|
dd = description(getattr(parse_data, 'detaileddescription', None))
|
||||||
|
self._data['brief_description'] = bd
|
||||||
|
self._data['detailed_description'] = dd
|
||||||
|
|
||||||
|
def set_parameters(self, data):
|
||||||
|
vs = [ddc.value for ddc in data.detaileddescription.content_]
|
||||||
|
pls = []
|
||||||
|
for v in vs:
|
||||||
|
if hasattr(v, 'parameterlist'):
|
||||||
|
pls += v.parameterlist
|
||||||
|
pis = []
|
||||||
|
for pl in pls:
|
||||||
|
pis += pl.parameteritem
|
||||||
|
dpis = []
|
||||||
|
for pi in pis:
|
||||||
|
dpi = DoxyParameterItem(pi)
|
||||||
|
dpi._parse()
|
||||||
|
dpis.append(dpi)
|
||||||
|
self._data['params'] = dpis
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyCompound(DoxyCompMem):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DoxyMember(DoxyCompMem):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DoxyFunction(DoxyMember):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'function'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyFunction, self)._parse()
|
||||||
|
self.set_descriptions(self._parse_data)
|
||||||
|
self.set_parameters(self._parse_data)
|
||||||
|
if not self._data['params']:
|
||||||
|
# If the params weren't set by a comment then just grab the names.
|
||||||
|
self._data['params'] = []
|
||||||
|
prms = self._parse_data.param
|
||||||
|
for prm in prms:
|
||||||
|
self._data['params'].append(DoxyParam(prm))
|
||||||
|
|
||||||
|
brief_description = property(lambda self: self.data()['brief_description'])
|
||||||
|
detailed_description = property(lambda self: self.data()['detailed_description'])
|
||||||
|
params = property(lambda self: self.data()['params'])
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyFunction)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyParam(DoxyMember):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyParam, self)._parse()
|
||||||
|
self.set_descriptions(self._parse_data)
|
||||||
|
self._data['declname'] = self._parse_data.declname
|
||||||
|
|
||||||
|
@property
|
||||||
|
def description(self):
|
||||||
|
descriptions = []
|
||||||
|
if self.brief_description:
|
||||||
|
descriptions.append(self.brief_description)
|
||||||
|
if self.detailed_description:
|
||||||
|
descriptions.append(self.detailed_description)
|
||||||
|
return '\n\n'.join(descriptions)
|
||||||
|
|
||||||
|
brief_description = property(lambda self: self.data()['brief_description'])
|
||||||
|
detailed_description = property(lambda self: self.data()['detailed_description'])
|
||||||
|
name = property(lambda self: self.data()['declname'])
|
||||||
|
|
||||||
|
class DoxyParameterItem(DoxyMember):
|
||||||
|
"""A different representation of a parameter in Doxygen."""
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyParameterItem, self)._parse()
|
||||||
|
names = []
|
||||||
|
for nl in self._parse_data.parameternamelist:
|
||||||
|
for pn in nl.parametername:
|
||||||
|
names.append(description(pn))
|
||||||
|
# Just take first name
|
||||||
|
self._data['name'] = names[0]
|
||||||
|
# Get description
|
||||||
|
pd = description(self._parse_data.get_parameterdescription())
|
||||||
|
self._data['description'] = pd
|
||||||
|
|
||||||
|
description = property(lambda self: self.data()['description'])
|
||||||
|
name = property(lambda self: self.data()['name'])
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyClass(DoxyCompound):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'class'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyClass, self)._parse()
|
||||||
|
self.retrieve_data()
|
||||||
|
if self._error:
|
||||||
|
return
|
||||||
|
self.set_descriptions(self._retrieved_data.compounddef)
|
||||||
|
self.set_parameters(self._retrieved_data.compounddef)
|
||||||
|
# Sectiondef.kind tells about whether private or public.
|
||||||
|
# We just ignore this for now.
|
||||||
|
self.process_memberdefs()
|
||||||
|
|
||||||
|
brief_description = property(lambda self: self.data()['brief_description'])
|
||||||
|
detailed_description = property(lambda self: self.data()['detailed_description'])
|
||||||
|
params = property(lambda self: self.data()['params'])
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyClass)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyFile(DoxyCompound):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'file'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyFile, self)._parse()
|
||||||
|
self.retrieve_data()
|
||||||
|
self.set_descriptions(self._retrieved_data.compounddef)
|
||||||
|
if self._error:
|
||||||
|
return
|
||||||
|
self.process_memberdefs()
|
||||||
|
|
||||||
|
brief_description = property(lambda self: self.data()['brief_description'])
|
||||||
|
detailed_description = property(lambda self: self.data()['detailed_description'])
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyFile)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyNamespace(DoxyCompound):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'namespace'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyNamespace, self)._parse()
|
||||||
|
self.retrieve_data()
|
||||||
|
self.set_descriptions(self._retrieved_data.compounddef)
|
||||||
|
if self._error:
|
||||||
|
return
|
||||||
|
self.process_memberdefs()
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyNamespace)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyGroup(DoxyCompound):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'group'
|
||||||
|
|
||||||
|
def _parse(self):
|
||||||
|
if self._parsed:
|
||||||
|
return
|
||||||
|
super(DoxyGroup, self)._parse()
|
||||||
|
self.retrieve_data()
|
||||||
|
if self._error:
|
||||||
|
return
|
||||||
|
cdef = self._retrieved_data.compounddef
|
||||||
|
self._data['title'] = description(cdef.title)
|
||||||
|
# Process inner groups
|
||||||
|
grps = cdef.innergroup
|
||||||
|
for grp in grps:
|
||||||
|
converted = DoxyGroup.from_refid(grp.refid, top=self.top)
|
||||||
|
self._members.append(converted)
|
||||||
|
# Process inner classes
|
||||||
|
klasses = cdef.innerclass
|
||||||
|
for kls in klasses:
|
||||||
|
converted = DoxyClass.from_refid(kls.refid, top=self.top)
|
||||||
|
self._members.append(converted)
|
||||||
|
# Process normal members
|
||||||
|
self.process_memberdefs()
|
||||||
|
|
||||||
|
title = property(lambda self: self.data()['title'])
|
||||||
|
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyGroup)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyFriend(DoxyMember):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kind = 'friend'
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyFriend)
|
||||||
|
|
||||||
|
|
||||||
|
class DoxyOther(Base):
|
||||||
|
|
||||||
|
__module__ = "gnuradio.utils.doxyxml"
|
||||||
|
|
||||||
|
kinds = set(['variable', 'struct', 'union', 'define', 'typedef', 'enum',
|
||||||
|
'dir', 'page', 'signal', 'slot', 'property'])
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def can_parse(cls, obj):
|
||||||
|
return obj.kind in cls.kinds
|
||||||
|
|
||||||
|
Base.mem_classes.append(DoxyOther)
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
"""
|
||||||
|
Contains generated files produced by generateDS.py.
|
||||||
|
|
||||||
|
These do the real work of parsing the doxygen xml files but the
|
||||||
|
resultant classes are not very friendly to navigate so the rest of the
|
||||||
|
doxyxml module processes them further.
|
||||||
|
"""
|
||||||
@@ -0,0 +1,503 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
"""
|
||||||
|
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from xml.dom import minidom
|
||||||
|
from xml.dom import Node
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from . import compoundsuper as supermod
|
||||||
|
from .compoundsuper import MixedContainer
|
||||||
|
|
||||||
|
|
||||||
|
class DoxygenTypeSub(supermod.DoxygenType):
|
||||||
|
def __init__(self, version=None, compounddef=None):
|
||||||
|
supermod.DoxygenType.__init__(self, version, compounddef)
|
||||||
|
|
||||||
|
def find(self, details):
|
||||||
|
|
||||||
|
return self.compounddef.find(details)
|
||||||
|
|
||||||
|
supermod.DoxygenType.subclass = DoxygenTypeSub
|
||||||
|
# end class DoxygenTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class compounddefTypeSub(supermod.compounddefType):
|
||||||
|
def __init__(self, kind=None, prot=None, id=None, compoundname='', title='', basecompoundref=None, derivedcompoundref=None, includes=None, includedby=None, incdepgraph=None, invincdepgraph=None, innerdir=None, innerfile=None, innerclass=None, innernamespace=None, innerpage=None, innergroup=None, templateparamlist=None, sectiondef=None, briefdescription=None, detaileddescription=None, inheritancegraph=None, collaborationgraph=None, programlisting=None, location=None, listofallmembers=None):
|
||||||
|
supermod.compounddefType.__init__(self, kind, prot, id, compoundname, title, basecompoundref, derivedcompoundref, includes, includedby, incdepgraph, invincdepgraph, innerdir, innerfile, innerclass, innernamespace, innerpage, innergroup, templateparamlist, sectiondef, briefdescription, detaileddescription, inheritancegraph, collaborationgraph, programlisting, location, listofallmembers)
|
||||||
|
|
||||||
|
def find(self, details):
|
||||||
|
|
||||||
|
if self.id == details.refid:
|
||||||
|
return self
|
||||||
|
|
||||||
|
for sectiondef in self.sectiondef:
|
||||||
|
result = sectiondef.find(details)
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
supermod.compounddefType.subclass = compounddefTypeSub
|
||||||
|
# end class compounddefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class listofallmembersTypeSub(supermod.listofallmembersType):
|
||||||
|
def __init__(self, member=None):
|
||||||
|
supermod.listofallmembersType.__init__(self, member)
|
||||||
|
supermod.listofallmembersType.subclass = listofallmembersTypeSub
|
||||||
|
# end class listofallmembersTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class memberRefTypeSub(supermod.memberRefType):
|
||||||
|
def __init__(self, virt=None, prot=None, refid=None, ambiguityscope=None, scope='', name=''):
|
||||||
|
supermod.memberRefType.__init__(self, virt, prot, refid, ambiguityscope, scope, name)
|
||||||
|
supermod.memberRefType.subclass = memberRefTypeSub
|
||||||
|
# end class memberRefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class compoundRefTypeSub(supermod.compoundRefType):
|
||||||
|
def __init__(self, virt=None, prot=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.compoundRefType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.compoundRefType.subclass = compoundRefTypeSub
|
||||||
|
# end class compoundRefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class reimplementTypeSub(supermod.reimplementType):
|
||||||
|
def __init__(self, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.reimplementType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.reimplementType.subclass = reimplementTypeSub
|
||||||
|
# end class reimplementTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class incTypeSub(supermod.incType):
|
||||||
|
def __init__(self, local=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.incType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.incType.subclass = incTypeSub
|
||||||
|
# end class incTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class refTypeSub(supermod.refType):
|
||||||
|
def __init__(self, prot=None, refid=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.refType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.refType.subclass = refTypeSub
|
||||||
|
# end class refTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class refTextTypeSub(supermod.refTextType):
|
||||||
|
def __init__(self, refid=None, kindref=None, external=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.refTextType.__init__(self, mixedclass_, content_)
|
||||||
|
|
||||||
|
supermod.refTextType.subclass = refTextTypeSub
|
||||||
|
# end class refTextTypeSub
|
||||||
|
|
||||||
|
class sectiondefTypeSub(supermod.sectiondefType):
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self, kind=None, header='', description=None, memberdef=None):
|
||||||
|
supermod.sectiondefType.__init__(self, kind, header, description, memberdef)
|
||||||
|
|
||||||
|
def find(self, details):
|
||||||
|
|
||||||
|
for memberdef in self.memberdef:
|
||||||
|
if memberdef.id == details.refid:
|
||||||
|
return memberdef
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
supermod.sectiondefType.subclass = sectiondefTypeSub
|
||||||
|
# end class sectiondefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class memberdefTypeSub(supermod.memberdefType):
|
||||||
|
def __init__(self, initonly=None, kind=None, volatile=None, const=None, raise_=None, virt=None, readable=None, prot=None, explicit=None, new=None, final=None, writable=None, add=None, static=None, remove=None, sealed=None, mutable=None, gettable=None, inline=None, settable=None, id=None, templateparamlist=None, type_=None, definition='', argsstring='', name='', read='', write='', bitfield='', reimplements=None, reimplementedby=None, param=None, enumvalue=None, initializer=None, exceptions=None, briefdescription=None, detaileddescription=None, inbodydescription=None, location=None, references=None, referencedby=None):
|
||||||
|
supermod.memberdefType.__init__(self, initonly, kind, volatile, const, raise_, virt, readable, prot, explicit, new, final, writable, add, static, remove, sealed, mutable, gettable, inline, settable, id, templateparamlist, type_, definition, argsstring, name, read, write, bitfield, reimplements, reimplementedby, param, enumvalue, initializer, exceptions, briefdescription, detaileddescription, inbodydescription, location, references, referencedby)
|
||||||
|
supermod.memberdefType.subclass = memberdefTypeSub
|
||||||
|
# end class memberdefTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class descriptionTypeSub(supermod.descriptionType):
|
||||||
|
def __init__(self, title='', para=None, sect1=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.descriptionType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.descriptionType.subclass = descriptionTypeSub
|
||||||
|
# end class descriptionTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class enumvalueTypeSub(supermod.enumvalueType):
|
||||||
|
def __init__(self, prot=None, id=None, name='', initializer=None, briefdescription=None, detaileddescription=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.enumvalueType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.enumvalueType.subclass = enumvalueTypeSub
|
||||||
|
# end class enumvalueTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class templateparamlistTypeSub(supermod.templateparamlistType):
|
||||||
|
def __init__(self, param=None):
|
||||||
|
supermod.templateparamlistType.__init__(self, param)
|
||||||
|
supermod.templateparamlistType.subclass = templateparamlistTypeSub
|
||||||
|
# end class templateparamlistTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class paramTypeSub(supermod.paramType):
|
||||||
|
def __init__(self, type_=None, declname='', defname='', array='', defval=None, briefdescription=None):
|
||||||
|
supermod.paramType.__init__(self, type_, declname, defname, array, defval, briefdescription)
|
||||||
|
supermod.paramType.subclass = paramTypeSub
|
||||||
|
# end class paramTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class linkedTextTypeSub(supermod.linkedTextType):
|
||||||
|
def __init__(self, ref=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.linkedTextType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.linkedTextType.subclass = linkedTextTypeSub
|
||||||
|
# end class linkedTextTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class graphTypeSub(supermod.graphType):
|
||||||
|
def __init__(self, node=None):
|
||||||
|
supermod.graphType.__init__(self, node)
|
||||||
|
supermod.graphType.subclass = graphTypeSub
|
||||||
|
# end class graphTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class nodeTypeSub(supermod.nodeType):
|
||||||
|
def __init__(self, id=None, label='', link=None, childnode=None):
|
||||||
|
supermod.nodeType.__init__(self, id, label, link, childnode)
|
||||||
|
supermod.nodeType.subclass = nodeTypeSub
|
||||||
|
# end class nodeTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class childnodeTypeSub(supermod.childnodeType):
|
||||||
|
def __init__(self, relation=None, refid=None, edgelabel=None):
|
||||||
|
supermod.childnodeType.__init__(self, relation, refid, edgelabel)
|
||||||
|
supermod.childnodeType.subclass = childnodeTypeSub
|
||||||
|
# end class childnodeTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class linkTypeSub(supermod.linkType):
|
||||||
|
def __init__(self, refid=None, external=None, valueOf_=''):
|
||||||
|
supermod.linkType.__init__(self, refid, external)
|
||||||
|
supermod.linkType.subclass = linkTypeSub
|
||||||
|
# end class linkTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class listingTypeSub(supermod.listingType):
|
||||||
|
def __init__(self, codeline=None):
|
||||||
|
supermod.listingType.__init__(self, codeline)
|
||||||
|
supermod.listingType.subclass = listingTypeSub
|
||||||
|
# end class listingTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class codelineTypeSub(supermod.codelineType):
|
||||||
|
def __init__(self, external=None, lineno=None, refkind=None, refid=None, highlight=None):
|
||||||
|
supermod.codelineType.__init__(self, external, lineno, refkind, refid, highlight)
|
||||||
|
supermod.codelineType.subclass = codelineTypeSub
|
||||||
|
# end class codelineTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class highlightTypeSub(supermod.highlightType):
|
||||||
|
def __init__(self, class_=None, sp=None, ref=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.highlightType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.highlightType.subclass = highlightTypeSub
|
||||||
|
# end class highlightTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class referenceTypeSub(supermod.referenceType):
|
||||||
|
def __init__(self, endline=None, startline=None, refid=None, compoundref=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.referenceType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.referenceType.subclass = referenceTypeSub
|
||||||
|
# end class referenceTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class locationTypeSub(supermod.locationType):
|
||||||
|
def __init__(self, bodystart=None, line=None, bodyend=None, bodyfile=None, file=None, valueOf_=''):
|
||||||
|
supermod.locationType.__init__(self, bodystart, line, bodyend, bodyfile, file)
|
||||||
|
supermod.locationType.subclass = locationTypeSub
|
||||||
|
# end class locationTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSect1TypeSub(supermod.docSect1Type):
|
||||||
|
def __init__(self, id=None, title='', para=None, sect2=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docSect1Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docSect1Type.subclass = docSect1TypeSub
|
||||||
|
# end class docSect1TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSect2TypeSub(supermod.docSect2Type):
|
||||||
|
def __init__(self, id=None, title='', para=None, sect3=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docSect2Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docSect2Type.subclass = docSect2TypeSub
|
||||||
|
# end class docSect2TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSect3TypeSub(supermod.docSect3Type):
|
||||||
|
def __init__(self, id=None, title='', para=None, sect4=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docSect3Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docSect3Type.subclass = docSect3TypeSub
|
||||||
|
# end class docSect3TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSect4TypeSub(supermod.docSect4Type):
|
||||||
|
def __init__(self, id=None, title='', para=None, internal=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docSect4Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docSect4Type.subclass = docSect4TypeSub
|
||||||
|
# end class docSect4TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalTypeSub(supermod.docInternalType):
|
||||||
|
def __init__(self, para=None, sect1=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalType.subclass = docInternalTypeSub
|
||||||
|
# end class docInternalTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalS1TypeSub(supermod.docInternalS1Type):
|
||||||
|
def __init__(self, para=None, sect2=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalS1Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalS1Type.subclass = docInternalS1TypeSub
|
||||||
|
# end class docInternalS1TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalS2TypeSub(supermod.docInternalS2Type):
|
||||||
|
def __init__(self, para=None, sect3=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalS2Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalS2Type.subclass = docInternalS2TypeSub
|
||||||
|
# end class docInternalS2TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalS3TypeSub(supermod.docInternalS3Type):
|
||||||
|
def __init__(self, para=None, sect3=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalS3Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalS3Type.subclass = docInternalS3TypeSub
|
||||||
|
# end class docInternalS3TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docInternalS4TypeSub(supermod.docInternalS4Type):
|
||||||
|
def __init__(self, para=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docInternalS4Type.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docInternalS4Type.subclass = docInternalS4TypeSub
|
||||||
|
# end class docInternalS4TypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docURLLinkSub(supermod.docURLLink):
|
||||||
|
def __init__(self, url=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docURLLink.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docURLLink.subclass = docURLLinkSub
|
||||||
|
# end class docURLLinkSub
|
||||||
|
|
||||||
|
|
||||||
|
class docAnchorTypeSub(supermod.docAnchorType):
|
||||||
|
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docAnchorType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docAnchorType.subclass = docAnchorTypeSub
|
||||||
|
# end class docAnchorTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docFormulaTypeSub(supermod.docFormulaType):
|
||||||
|
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docFormulaType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docFormulaType.subclass = docFormulaTypeSub
|
||||||
|
# end class docFormulaTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docIndexEntryTypeSub(supermod.docIndexEntryType):
|
||||||
|
def __init__(self, primaryie='', secondaryie=''):
|
||||||
|
supermod.docIndexEntryType.__init__(self, primaryie, secondaryie)
|
||||||
|
supermod.docIndexEntryType.subclass = docIndexEntryTypeSub
|
||||||
|
# end class docIndexEntryTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docListTypeSub(supermod.docListType):
|
||||||
|
def __init__(self, listitem=None):
|
||||||
|
supermod.docListType.__init__(self, listitem)
|
||||||
|
supermod.docListType.subclass = docListTypeSub
|
||||||
|
# end class docListTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docListItemTypeSub(supermod.docListItemType):
|
||||||
|
def __init__(self, para=None):
|
||||||
|
supermod.docListItemType.__init__(self, para)
|
||||||
|
supermod.docListItemType.subclass = docListItemTypeSub
|
||||||
|
# end class docListItemTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docSimpleSectTypeSub(supermod.docSimpleSectType):
|
||||||
|
def __init__(self, kind=None, title=None, para=None):
|
||||||
|
supermod.docSimpleSectType.__init__(self, kind, title, para)
|
||||||
|
supermod.docSimpleSectType.subclass = docSimpleSectTypeSub
|
||||||
|
# end class docSimpleSectTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docVarListEntryTypeSub(supermod.docVarListEntryType):
|
||||||
|
def __init__(self, term=None):
|
||||||
|
supermod.docVarListEntryType.__init__(self, term)
|
||||||
|
supermod.docVarListEntryType.subclass = docVarListEntryTypeSub
|
||||||
|
# end class docVarListEntryTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docRefTextTypeSub(supermod.docRefTextType):
|
||||||
|
def __init__(self, refid=None, kindref=None, external=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docRefTextType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docRefTextType.subclass = docRefTextTypeSub
|
||||||
|
# end class docRefTextTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docTableTypeSub(supermod.docTableType):
|
||||||
|
def __init__(self, rows=None, cols=None, row=None, caption=None):
|
||||||
|
supermod.docTableType.__init__(self, rows, cols, row, caption)
|
||||||
|
supermod.docTableType.subclass = docTableTypeSub
|
||||||
|
# end class docTableTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docRowTypeSub(supermod.docRowType):
|
||||||
|
def __init__(self, entry=None):
|
||||||
|
supermod.docRowType.__init__(self, entry)
|
||||||
|
supermod.docRowType.subclass = docRowTypeSub
|
||||||
|
# end class docRowTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docEntryTypeSub(supermod.docEntryType):
|
||||||
|
def __init__(self, thead=None, para=None):
|
||||||
|
supermod.docEntryType.__init__(self, thead, para)
|
||||||
|
supermod.docEntryType.subclass = docEntryTypeSub
|
||||||
|
# end class docEntryTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docHeadingTypeSub(supermod.docHeadingType):
|
||||||
|
def __init__(self, level=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docHeadingType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docHeadingType.subclass = docHeadingTypeSub
|
||||||
|
# end class docHeadingTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docImageTypeSub(supermod.docImageType):
|
||||||
|
def __init__(self, width=None, type_=None, name=None, height=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docImageType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docImageType.subclass = docImageTypeSub
|
||||||
|
# end class docImageTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docDotFileTypeSub(supermod.docDotFileType):
|
||||||
|
def __init__(self, name=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docDotFileType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docDotFileType.subclass = docDotFileTypeSub
|
||||||
|
# end class docDotFileTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docTocItemTypeSub(supermod.docTocItemType):
|
||||||
|
def __init__(self, id=None, valueOf_='', mixedclass_=None, content_=None):
|
||||||
|
supermod.docTocItemType.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docTocItemType.subclass = docTocItemTypeSub
|
||||||
|
# end class docTocItemTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docTocListTypeSub(supermod.docTocListType):
|
||||||
|
def __init__(self, tocitem=None):
|
||||||
|
supermod.docTocListType.__init__(self, tocitem)
|
||||||
|
supermod.docTocListType.subclass = docTocListTypeSub
|
||||||
|
# end class docTocListTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docLanguageTypeSub(supermod.docLanguageType):
|
||||||
|
def __init__(self, langid=None, para=None):
|
||||||
|
supermod.docLanguageType.__init__(self, langid, para)
|
||||||
|
supermod.docLanguageType.subclass = docLanguageTypeSub
|
||||||
|
# end class docLanguageTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docParamListTypeSub(supermod.docParamListType):
|
||||||
|
def __init__(self, kind=None, parameteritem=None):
|
||||||
|
supermod.docParamListType.__init__(self, kind, parameteritem)
|
||||||
|
supermod.docParamListType.subclass = docParamListTypeSub
|
||||||
|
# end class docParamListTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docParamListItemSub(supermod.docParamListItem):
|
||||||
|
def __init__(self, parameternamelist=None, parameterdescription=None):
|
||||||
|
supermod.docParamListItem.__init__(self, parameternamelist, parameterdescription)
|
||||||
|
supermod.docParamListItem.subclass = docParamListItemSub
|
||||||
|
# end class docParamListItemSub
|
||||||
|
|
||||||
|
|
||||||
|
class docParamNameListSub(supermod.docParamNameList):
|
||||||
|
def __init__(self, parametername=None):
|
||||||
|
supermod.docParamNameList.__init__(self, parametername)
|
||||||
|
supermod.docParamNameList.subclass = docParamNameListSub
|
||||||
|
# end class docParamNameListSub
|
||||||
|
|
||||||
|
|
||||||
|
class docParamNameSub(supermod.docParamName):
|
||||||
|
def __init__(self, direction=None, ref=None, mixedclass_=None, content_=None):
|
||||||
|
supermod.docParamName.__init__(self, mixedclass_, content_)
|
||||||
|
supermod.docParamName.subclass = docParamNameSub
|
||||||
|
# end class docParamNameSub
|
||||||
|
|
||||||
|
|
||||||
|
class docXRefSectTypeSub(supermod.docXRefSectType):
|
||||||
|
def __init__(self, id=None, xreftitle=None, xrefdescription=None):
|
||||||
|
supermod.docXRefSectType.__init__(self, id, xreftitle, xrefdescription)
|
||||||
|
supermod.docXRefSectType.subclass = docXRefSectTypeSub
|
||||||
|
# end class docXRefSectTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docCopyTypeSub(supermod.docCopyType):
|
||||||
|
def __init__(self, link=None, para=None, sect1=None, internal=None):
|
||||||
|
supermod.docCopyType.__init__(self, link, para, sect1, internal)
|
||||||
|
supermod.docCopyType.subclass = docCopyTypeSub
|
||||||
|
# end class docCopyTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class docCharTypeSub(supermod.docCharType):
|
||||||
|
def __init__(self, char=None, valueOf_=''):
|
||||||
|
supermod.docCharType.__init__(self, char)
|
||||||
|
supermod.docCharType.subclass = docCharTypeSub
|
||||||
|
# end class docCharTypeSub
|
||||||
|
|
||||||
|
class docParaTypeSub(supermod.docParaType):
|
||||||
|
def __init__(self, char=None, valueOf_=''):
|
||||||
|
supermod.docParaType.__init__(self, char)
|
||||||
|
|
||||||
|
self.parameterlist = []
|
||||||
|
self.simplesects = []
|
||||||
|
self.content = []
|
||||||
|
|
||||||
|
def buildChildren(self, child_, nodeName_):
|
||||||
|
supermod.docParaType.buildChildren(self, child_, nodeName_)
|
||||||
|
|
||||||
|
if child_.nodeType == Node.TEXT_NODE:
|
||||||
|
obj_ = self.mixedclass_(MixedContainer.CategoryText,
|
||||||
|
MixedContainer.TypeNone, '', child_.nodeValue)
|
||||||
|
self.content.append(obj_)
|
||||||
|
elif child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == "ref":
|
||||||
|
obj_ = supermod.docRefTextType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.content.append(obj_)
|
||||||
|
elif child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'parameterlist':
|
||||||
|
obj_ = supermod.docParamListType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.parameterlist.append(obj_)
|
||||||
|
elif child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'simplesect':
|
||||||
|
obj_ = supermod.docSimpleSectType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.simplesects.append(obj_)
|
||||||
|
|
||||||
|
|
||||||
|
supermod.docParaType.subclass = docParaTypeSub
|
||||||
|
# end class docParaTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def parse(inFilename):
|
||||||
|
doc = minidom.parse(inFilename)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = supermod.DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
return rootObj
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,77 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
"""
|
||||||
|
Generated Mon Feb 9 19:08:05 2009 by generateDS.py.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from xml.dom import minidom
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from . import compound
|
||||||
|
|
||||||
|
from . import indexsuper as supermod
|
||||||
|
|
||||||
|
class DoxygenTypeSub(supermod.DoxygenType):
|
||||||
|
def __init__(self, version=None, compound=None):
|
||||||
|
supermod.DoxygenType.__init__(self, version, compound)
|
||||||
|
|
||||||
|
def find_compounds_and_members(self, details):
|
||||||
|
"""
|
||||||
|
Returns a list of all compounds and their members which match details
|
||||||
|
"""
|
||||||
|
|
||||||
|
results = []
|
||||||
|
for compound in self.compound:
|
||||||
|
members = compound.find_members(details)
|
||||||
|
if members:
|
||||||
|
results.append([compound, members])
|
||||||
|
else:
|
||||||
|
if details.match(compound):
|
||||||
|
results.append([compound, []])
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
supermod.DoxygenType.subclass = DoxygenTypeSub
|
||||||
|
# end class DoxygenTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class CompoundTypeSub(supermod.CompoundType):
|
||||||
|
def __init__(self, kind=None, refid=None, name='', member=None):
|
||||||
|
supermod.CompoundType.__init__(self, kind, refid, name, member)
|
||||||
|
|
||||||
|
def find_members(self, details):
|
||||||
|
"""
|
||||||
|
Returns a list of all members which match details
|
||||||
|
"""
|
||||||
|
|
||||||
|
results = []
|
||||||
|
|
||||||
|
for member in self.member:
|
||||||
|
if details.match(member):
|
||||||
|
results.append(member)
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
supermod.CompoundType.subclass = CompoundTypeSub
|
||||||
|
# end class CompoundTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
class MemberTypeSub(supermod.MemberType):
|
||||||
|
|
||||||
|
def __init__(self, kind=None, refid=None, name=''):
|
||||||
|
supermod.MemberType.__init__(self, kind, refid, name)
|
||||||
|
|
||||||
|
supermod.MemberType.subclass = MemberTypeSub
|
||||||
|
# end class MemberTypeSub
|
||||||
|
|
||||||
|
|
||||||
|
def parse(inFilename):
|
||||||
|
|
||||||
|
doc = minidom.parse(inFilename)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = supermod.DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
|
||||||
|
return rootObj
|
||||||
|
|
||||||
@@ -0,0 +1,522 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generated Thu Jun 11 18:43:54 2009 by generateDS.py.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from xml.dom import minidom
|
||||||
|
from xml.dom import Node
|
||||||
|
|
||||||
|
#
|
||||||
|
# User methods
|
||||||
|
#
|
||||||
|
# Calls to the methods in these classes are generated by generateDS.py.
|
||||||
|
# You can replace these methods by re-implementing the following class
|
||||||
|
# in a module named generatedssuper.py.
|
||||||
|
|
||||||
|
try:
|
||||||
|
from generatedssuper import GeneratedsSuper
|
||||||
|
except ImportError as exp:
|
||||||
|
|
||||||
|
class GeneratedsSuper(object):
|
||||||
|
def format_string(self, input_data, input_name=''):
|
||||||
|
return input_data
|
||||||
|
def format_integer(self, input_data, input_name=''):
|
||||||
|
return '%d' % input_data
|
||||||
|
def format_float(self, input_data, input_name=''):
|
||||||
|
return '%f' % input_data
|
||||||
|
def format_double(self, input_data, input_name=''):
|
||||||
|
return '%e' % input_data
|
||||||
|
def format_boolean(self, input_data, input_name=''):
|
||||||
|
return '%s' % input_data
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# If you have installed IPython you can uncomment and use the following.
|
||||||
|
# IPython is available from http://ipython.scipy.org/.
|
||||||
|
#
|
||||||
|
|
||||||
|
## from IPython.Shell import IPShellEmbed
|
||||||
|
## args = ''
|
||||||
|
## ipshell = IPShellEmbed(args,
|
||||||
|
## banner = 'Dropping into IPython',
|
||||||
|
## exit_msg = 'Leaving Interpreter, back to program.')
|
||||||
|
|
||||||
|
# Then use the following line where and when you want to drop into the
|
||||||
|
# IPython shell:
|
||||||
|
# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
|
||||||
|
|
||||||
|
#
|
||||||
|
# Globals
|
||||||
|
#
|
||||||
|
|
||||||
|
ExternalEncoding = 'ascii'
|
||||||
|
|
||||||
|
#
|
||||||
|
# Support/utility functions.
|
||||||
|
#
|
||||||
|
|
||||||
|
def showIndent(outfile, level):
|
||||||
|
for idx in range(level):
|
||||||
|
outfile.write(' ')
|
||||||
|
|
||||||
|
def quote_xml(inStr):
|
||||||
|
s1 = (isinstance(inStr, str) and inStr or
|
||||||
|
'%s' % inStr)
|
||||||
|
s1 = s1.replace('&', '&')
|
||||||
|
s1 = s1.replace('<', '<')
|
||||||
|
s1 = s1.replace('>', '>')
|
||||||
|
return s1
|
||||||
|
|
||||||
|
def quote_attrib(inStr):
|
||||||
|
s1 = (isinstance(inStr, str) and inStr or
|
||||||
|
'%s' % inStr)
|
||||||
|
s1 = s1.replace('&', '&')
|
||||||
|
s1 = s1.replace('<', '<')
|
||||||
|
s1 = s1.replace('>', '>')
|
||||||
|
if '"' in s1:
|
||||||
|
if "'" in s1:
|
||||||
|
s1 = '"%s"' % s1.replace('"', """)
|
||||||
|
else:
|
||||||
|
s1 = "'%s'" % s1
|
||||||
|
else:
|
||||||
|
s1 = '"%s"' % s1
|
||||||
|
return s1
|
||||||
|
|
||||||
|
def quote_python(inStr):
|
||||||
|
s1 = inStr
|
||||||
|
if s1.find("'") == -1:
|
||||||
|
if s1.find('\n') == -1:
|
||||||
|
return "'%s'" % s1
|
||||||
|
else:
|
||||||
|
return "'''%s'''" % s1
|
||||||
|
else:
|
||||||
|
if s1.find('"') != -1:
|
||||||
|
s1 = s1.replace('"', '\\"')
|
||||||
|
if s1.find('\n') == -1:
|
||||||
|
return '"%s"' % s1
|
||||||
|
else:
|
||||||
|
return '"""%s"""' % s1
|
||||||
|
|
||||||
|
|
||||||
|
class MixedContainer(object):
|
||||||
|
# Constants for category:
|
||||||
|
CategoryNone = 0
|
||||||
|
CategoryText = 1
|
||||||
|
CategorySimple = 2
|
||||||
|
CategoryComplex = 3
|
||||||
|
# Constants for content_type:
|
||||||
|
TypeNone = 0
|
||||||
|
TypeText = 1
|
||||||
|
TypeString = 2
|
||||||
|
TypeInteger = 3
|
||||||
|
TypeFloat = 4
|
||||||
|
TypeDecimal = 5
|
||||||
|
TypeDouble = 6
|
||||||
|
TypeBoolean = 7
|
||||||
|
def __init__(self, category, content_type, name, value):
|
||||||
|
self.category = category
|
||||||
|
self.content_type = content_type
|
||||||
|
self.name = name
|
||||||
|
self.value = value
|
||||||
|
def getCategory(self):
|
||||||
|
return self.category
|
||||||
|
def getContenttype(self, content_type):
|
||||||
|
return self.content_type
|
||||||
|
def getValue(self):
|
||||||
|
return self.value
|
||||||
|
def getName(self):
|
||||||
|
return self.name
|
||||||
|
def export(self, outfile, level, name, namespace):
|
||||||
|
if self.category == MixedContainer.CategoryText:
|
||||||
|
outfile.write(self.value)
|
||||||
|
elif self.category == MixedContainer.CategorySimple:
|
||||||
|
self.exportSimple(outfile, level, name)
|
||||||
|
else: # category == MixedContainer.CategoryComplex
|
||||||
|
self.value.export(outfile, level, namespace,name)
|
||||||
|
def exportSimple(self, outfile, level, name):
|
||||||
|
if self.content_type == MixedContainer.TypeString:
|
||||||
|
outfile.write('<%s>%s</%s>' % (self.name, self.value, self.name))
|
||||||
|
elif self.content_type == MixedContainer.TypeInteger or \
|
||||||
|
self.content_type == MixedContainer.TypeBoolean:
|
||||||
|
outfile.write('<%s>%d</%s>' % (self.name, self.value, self.name))
|
||||||
|
elif self.content_type == MixedContainer.TypeFloat or \
|
||||||
|
self.content_type == MixedContainer.TypeDecimal:
|
||||||
|
outfile.write('<%s>%f</%s>' % (self.name, self.value, self.name))
|
||||||
|
elif self.content_type == MixedContainer.TypeDouble:
|
||||||
|
outfile.write('<%s>%g</%s>' % (self.name, self.value, self.name))
|
||||||
|
def exportLiteral(self, outfile, level, name):
|
||||||
|
if self.category == MixedContainer.CategoryText:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
|
||||||
|
(self.category, self.content_type, self.name, self.value))
|
||||||
|
elif self.category == MixedContainer.CategorySimple:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('MixedContainer(%d, %d, "%s", "%s"),\n' % \
|
||||||
|
(self.category, self.content_type, self.name, self.value))
|
||||||
|
else: # category == MixedContainer.CategoryComplex
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('MixedContainer(%d, %d, "%s",\n' % \
|
||||||
|
(self.category, self.content_type, self.name,))
|
||||||
|
self.value.exportLiteral(outfile, level + 1)
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write(')\n')
|
||||||
|
|
||||||
|
|
||||||
|
class _MemberSpec(object):
|
||||||
|
def __init__(self, name='', data_type='', container=0):
|
||||||
|
self.name = name
|
||||||
|
self.data_type = data_type
|
||||||
|
self.container = container
|
||||||
|
def set_name(self, name): self.name = name
|
||||||
|
def get_name(self): return self.name
|
||||||
|
def set_data_type(self, data_type): self.data_type = data_type
|
||||||
|
def get_data_type(self): return self.data_type
|
||||||
|
def set_container(self, container): self.container = container
|
||||||
|
def get_container(self): return self.container
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Data representation classes.
|
||||||
|
#
|
||||||
|
|
||||||
|
class DoxygenType(GeneratedsSuper):
|
||||||
|
subclass = None
|
||||||
|
superclass = None
|
||||||
|
def __init__(self, version=None, compound=None):
|
||||||
|
self.version = version
|
||||||
|
if compound is None:
|
||||||
|
self.compound = []
|
||||||
|
else:
|
||||||
|
self.compound = compound
|
||||||
|
def factory(*args_, **kwargs_):
|
||||||
|
if DoxygenType.subclass:
|
||||||
|
return DoxygenType.subclass(*args_, **kwargs_)
|
||||||
|
else:
|
||||||
|
return DoxygenType(*args_, **kwargs_)
|
||||||
|
factory = staticmethod(factory)
|
||||||
|
def get_compound(self): return self.compound
|
||||||
|
def set_compound(self, compound): self.compound = compound
|
||||||
|
def add_compound(self, value): self.compound.append(value)
|
||||||
|
def insert_compound(self, index, value): self.compound[index] = value
|
||||||
|
def get_version(self): return self.version
|
||||||
|
def set_version(self, version): self.version = version
|
||||||
|
def export(self, outfile, level, namespace_='', name_='DoxygenType', namespacedef_=''):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
||||||
|
self.exportAttributes(outfile, level, namespace_, name_='DoxygenType')
|
||||||
|
if self.hasContent_():
|
||||||
|
outfile.write('>\n')
|
||||||
|
self.exportChildren(outfile, level + 1, namespace_, name_)
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('</%s%s>\n' % (namespace_, name_))
|
||||||
|
else:
|
||||||
|
outfile.write(' />\n')
|
||||||
|
def exportAttributes(self, outfile, level, namespace_='', name_='DoxygenType'):
|
||||||
|
outfile.write(' version=%s' % (self.format_string(quote_attrib(self.version).encode(ExternalEncoding), input_name='version'), ))
|
||||||
|
def exportChildren(self, outfile, level, namespace_='', name_='DoxygenType'):
|
||||||
|
for compound_ in self.compound:
|
||||||
|
compound_.export(outfile, level, namespace_, name_='compound')
|
||||||
|
def hasContent_(self):
|
||||||
|
if (
|
||||||
|
self.compound is not None
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
def exportLiteral(self, outfile, level, name_='DoxygenType'):
|
||||||
|
level += 1
|
||||||
|
self.exportLiteralAttributes(outfile, level, name_)
|
||||||
|
if self.hasContent_():
|
||||||
|
self.exportLiteralChildren(outfile, level, name_)
|
||||||
|
def exportLiteralAttributes(self, outfile, level, name_):
|
||||||
|
if self.version is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('version = %s,\n' % (self.version,))
|
||||||
|
def exportLiteralChildren(self, outfile, level, name_):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('compound=[\n')
|
||||||
|
level += 1
|
||||||
|
for compound in self.compound:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('model_.compound(\n')
|
||||||
|
compound.exportLiteral(outfile, level, name_='compound')
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('),\n')
|
||||||
|
level -= 1
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('],\n')
|
||||||
|
def build(self, node_):
|
||||||
|
attrs = node_.attributes
|
||||||
|
self.buildAttributes(attrs)
|
||||||
|
for child_ in node_.childNodes:
|
||||||
|
nodeName_ = child_.nodeName.split(':')[-1]
|
||||||
|
self.buildChildren(child_, nodeName_)
|
||||||
|
def buildAttributes(self, attrs):
|
||||||
|
if attrs.get('version'):
|
||||||
|
self.version = attrs.get('version').value
|
||||||
|
def buildChildren(self, child_, nodeName_):
|
||||||
|
if child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'compound':
|
||||||
|
obj_ = CompoundType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.compound.append(obj_)
|
||||||
|
# end class DoxygenType
|
||||||
|
|
||||||
|
|
||||||
|
class CompoundType(GeneratedsSuper):
|
||||||
|
subclass = None
|
||||||
|
superclass = None
|
||||||
|
def __init__(self, kind=None, refid=None, name=None, member=None):
|
||||||
|
self.kind = kind
|
||||||
|
self.refid = refid
|
||||||
|
self.name = name
|
||||||
|
if member is None:
|
||||||
|
self.member = []
|
||||||
|
else:
|
||||||
|
self.member = member
|
||||||
|
def factory(*args_, **kwargs_):
|
||||||
|
if CompoundType.subclass:
|
||||||
|
return CompoundType.subclass(*args_, **kwargs_)
|
||||||
|
else:
|
||||||
|
return CompoundType(*args_, **kwargs_)
|
||||||
|
factory = staticmethod(factory)
|
||||||
|
def get_name(self): return self.name
|
||||||
|
def set_name(self, name): self.name = name
|
||||||
|
def get_member(self): return self.member
|
||||||
|
def set_member(self, member): self.member = member
|
||||||
|
def add_member(self, value): self.member.append(value)
|
||||||
|
def insert_member(self, index, value): self.member[index] = value
|
||||||
|
def get_kind(self): return self.kind
|
||||||
|
def set_kind(self, kind): self.kind = kind
|
||||||
|
def get_refid(self): return self.refid
|
||||||
|
def set_refid(self, refid): self.refid = refid
|
||||||
|
def export(self, outfile, level, namespace_='', name_='CompoundType', namespacedef_=''):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
||||||
|
self.exportAttributes(outfile, level, namespace_, name_='CompoundType')
|
||||||
|
if self.hasContent_():
|
||||||
|
outfile.write('>\n')
|
||||||
|
self.exportChildren(outfile, level + 1, namespace_, name_)
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('</%s%s>\n' % (namespace_, name_))
|
||||||
|
else:
|
||||||
|
outfile.write(' />\n')
|
||||||
|
def exportAttributes(self, outfile, level, namespace_='', name_='CompoundType'):
|
||||||
|
outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
|
||||||
|
outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
|
||||||
|
def exportChildren(self, outfile, level, namespace_='', name_='CompoundType'):
|
||||||
|
if self.name is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%sname>%s</%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
|
||||||
|
for member_ in self.member:
|
||||||
|
member_.export(outfile, level, namespace_, name_='member')
|
||||||
|
def hasContent_(self):
|
||||||
|
if (
|
||||||
|
self.name is not None or
|
||||||
|
self.member is not None
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
def exportLiteral(self, outfile, level, name_='CompoundType'):
|
||||||
|
level += 1
|
||||||
|
self.exportLiteralAttributes(outfile, level, name_)
|
||||||
|
if self.hasContent_():
|
||||||
|
self.exportLiteralChildren(outfile, level, name_)
|
||||||
|
def exportLiteralAttributes(self, outfile, level, name_):
|
||||||
|
if self.kind is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('kind = "%s",\n' % (self.kind,))
|
||||||
|
if self.refid is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('refid = %s,\n' % (self.refid,))
|
||||||
|
def exportLiteralChildren(self, outfile, level, name_):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('member=[\n')
|
||||||
|
level += 1
|
||||||
|
for member in self.member:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('model_.member(\n')
|
||||||
|
member.exportLiteral(outfile, level, name_='member')
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('),\n')
|
||||||
|
level -= 1
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('],\n')
|
||||||
|
def build(self, node_):
|
||||||
|
attrs = node_.attributes
|
||||||
|
self.buildAttributes(attrs)
|
||||||
|
for child_ in node_.childNodes:
|
||||||
|
nodeName_ = child_.nodeName.split(':')[-1]
|
||||||
|
self.buildChildren(child_, nodeName_)
|
||||||
|
def buildAttributes(self, attrs):
|
||||||
|
if attrs.get('kind'):
|
||||||
|
self.kind = attrs.get('kind').value
|
||||||
|
if attrs.get('refid'):
|
||||||
|
self.refid = attrs.get('refid').value
|
||||||
|
def buildChildren(self, child_, nodeName_):
|
||||||
|
if child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'name':
|
||||||
|
name_ = ''
|
||||||
|
for text__content_ in child_.childNodes:
|
||||||
|
name_ += text__content_.nodeValue
|
||||||
|
self.name = name_
|
||||||
|
elif child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'member':
|
||||||
|
obj_ = MemberType.factory()
|
||||||
|
obj_.build(child_)
|
||||||
|
self.member.append(obj_)
|
||||||
|
# end class CompoundType
|
||||||
|
|
||||||
|
|
||||||
|
class MemberType(GeneratedsSuper):
|
||||||
|
subclass = None
|
||||||
|
superclass = None
|
||||||
|
def __init__(self, kind=None, refid=None, name=None):
|
||||||
|
self.kind = kind
|
||||||
|
self.refid = refid
|
||||||
|
self.name = name
|
||||||
|
def factory(*args_, **kwargs_):
|
||||||
|
if MemberType.subclass:
|
||||||
|
return MemberType.subclass(*args_, **kwargs_)
|
||||||
|
else:
|
||||||
|
return MemberType(*args_, **kwargs_)
|
||||||
|
factory = staticmethod(factory)
|
||||||
|
def get_name(self): return self.name
|
||||||
|
def set_name(self, name): self.name = name
|
||||||
|
def get_kind(self): return self.kind
|
||||||
|
def set_kind(self, kind): self.kind = kind
|
||||||
|
def get_refid(self): return self.refid
|
||||||
|
def set_refid(self, refid): self.refid = refid
|
||||||
|
def export(self, outfile, level, namespace_='', name_='MemberType', namespacedef_=''):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%s%s %s' % (namespace_, name_, namespacedef_, ))
|
||||||
|
self.exportAttributes(outfile, level, namespace_, name_='MemberType')
|
||||||
|
if self.hasContent_():
|
||||||
|
outfile.write('>\n')
|
||||||
|
self.exportChildren(outfile, level + 1, namespace_, name_)
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('</%s%s>\n' % (namespace_, name_))
|
||||||
|
else:
|
||||||
|
outfile.write(' />\n')
|
||||||
|
def exportAttributes(self, outfile, level, namespace_='', name_='MemberType'):
|
||||||
|
outfile.write(' kind=%s' % (quote_attrib(self.kind), ))
|
||||||
|
outfile.write(' refid=%s' % (self.format_string(quote_attrib(self.refid).encode(ExternalEncoding), input_name='refid'), ))
|
||||||
|
def exportChildren(self, outfile, level, namespace_='', name_='MemberType'):
|
||||||
|
if self.name is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('<%sname>%s</%sname>\n' % (namespace_, self.format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
|
||||||
|
def hasContent_(self):
|
||||||
|
if (
|
||||||
|
self.name is not None
|
||||||
|
):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
def exportLiteral(self, outfile, level, name_='MemberType'):
|
||||||
|
level += 1
|
||||||
|
self.exportLiteralAttributes(outfile, level, name_)
|
||||||
|
if self.hasContent_():
|
||||||
|
self.exportLiteralChildren(outfile, level, name_)
|
||||||
|
def exportLiteralAttributes(self, outfile, level, name_):
|
||||||
|
if self.kind is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('kind = "%s",\n' % (self.kind,))
|
||||||
|
if self.refid is not None:
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('refid = %s,\n' % (self.refid,))
|
||||||
|
def exportLiteralChildren(self, outfile, level, name_):
|
||||||
|
showIndent(outfile, level)
|
||||||
|
outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
|
||||||
|
def build(self, node_):
|
||||||
|
attrs = node_.attributes
|
||||||
|
self.buildAttributes(attrs)
|
||||||
|
for child_ in node_.childNodes:
|
||||||
|
nodeName_ = child_.nodeName.split(':')[-1]
|
||||||
|
self.buildChildren(child_, nodeName_)
|
||||||
|
def buildAttributes(self, attrs):
|
||||||
|
if attrs.get('kind'):
|
||||||
|
self.kind = attrs.get('kind').value
|
||||||
|
if attrs.get('refid'):
|
||||||
|
self.refid = attrs.get('refid').value
|
||||||
|
def buildChildren(self, child_, nodeName_):
|
||||||
|
if child_.nodeType == Node.ELEMENT_NODE and \
|
||||||
|
nodeName_ == 'name':
|
||||||
|
name_ = ''
|
||||||
|
for text__content_ in child_.childNodes:
|
||||||
|
name_ += text__content_.nodeValue
|
||||||
|
self.name = name_
|
||||||
|
# end class MemberType
|
||||||
|
|
||||||
|
|
||||||
|
USAGE_TEXT = """
|
||||||
|
Usage: python <Parser>.py [ -s ] <in_xml_file>
|
||||||
|
Options:
|
||||||
|
-s Use the SAX parser, not the minidom parser.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
print(USAGE_TEXT)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def parse(inFileName):
|
||||||
|
doc = minidom.parse(inFileName)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
# Enable Python to collect the space used by the DOM.
|
||||||
|
doc = None
|
||||||
|
sys.stdout.write('<?xml version="1.0" ?>\n')
|
||||||
|
rootObj.export(sys.stdout, 0, name_="doxygenindex",
|
||||||
|
namespacedef_='')
|
||||||
|
return rootObj
|
||||||
|
|
||||||
|
|
||||||
|
def parseString(inString):
|
||||||
|
doc = minidom.parseString(inString)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
# Enable Python to collect the space used by the DOM.
|
||||||
|
doc = None
|
||||||
|
sys.stdout.write('<?xml version="1.0" ?>\n')
|
||||||
|
rootObj.export(sys.stdout, 0, name_="doxygenindex",
|
||||||
|
namespacedef_='')
|
||||||
|
return rootObj
|
||||||
|
|
||||||
|
|
||||||
|
def parseLiteral(inFileName):
|
||||||
|
doc = minidom.parse(inFileName)
|
||||||
|
rootNode = doc.documentElement
|
||||||
|
rootObj = DoxygenType.factory()
|
||||||
|
rootObj.build(rootNode)
|
||||||
|
# Enable Python to collect the space used by the DOM.
|
||||||
|
doc = None
|
||||||
|
sys.stdout.write('from index import *\n\n')
|
||||||
|
sys.stdout.write('rootObj = doxygenindex(\n')
|
||||||
|
rootObj.exportLiteral(sys.stdout, 0, name_="doxygenindex")
|
||||||
|
sys.stdout.write(')\n')
|
||||||
|
return rootObj
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = sys.argv[1:]
|
||||||
|
if len(args) == 1:
|
||||||
|
parse(args[0])
|
||||||
|
else:
|
||||||
|
usage()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
#import pdb
|
||||||
|
#pdb.run('main()')
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2010 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Utilities for extracting text from generated classes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def is_string(txt):
|
||||||
|
if isinstance(txt, str):
|
||||||
|
return True
|
||||||
|
try:
|
||||||
|
if isinstance(txt, str):
|
||||||
|
return True
|
||||||
|
except NameError:
|
||||||
|
pass
|
||||||
|
return False
|
||||||
|
|
||||||
|
def description(obj):
|
||||||
|
if obj is None:
|
||||||
|
return None
|
||||||
|
return description_bit(obj).strip()
|
||||||
|
|
||||||
|
def description_bit(obj):
|
||||||
|
if hasattr(obj, 'content'):
|
||||||
|
contents = [description_bit(item) for item in obj.content]
|
||||||
|
result = ''.join(contents)
|
||||||
|
elif hasattr(obj, 'content_'):
|
||||||
|
contents = [description_bit(item) for item in obj.content_]
|
||||||
|
result = ''.join(contents)
|
||||||
|
elif hasattr(obj, 'value'):
|
||||||
|
result = description_bit(obj.value)
|
||||||
|
elif is_string(obj):
|
||||||
|
return obj
|
||||||
|
else:
|
||||||
|
raise Exception('Expecting a string or something with content, content_ or value attribute')
|
||||||
|
# If this bit is a paragraph then add one some line breaks.
|
||||||
|
if hasattr(obj, 'name') and obj.name == 'para':
|
||||||
|
result += "\n\n"
|
||||||
|
return result
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
/*!
|
||||||
|
* \defgroup block GNU Radio FOO C++ Signal Processing Blocks
|
||||||
|
* \brief All C++ blocks that can be used from the FOO GNU Radio
|
||||||
|
* module are listed here or in the subcategories below.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
/*! \mainpage
|
||||||
|
|
||||||
|
Welcome to the GNU Radio FOO Block
|
||||||
|
|
||||||
|
This is the intro page for the Doxygen manual generated for the FOO
|
||||||
|
block (docs/doxygen/other/main_page.dox). Edit it to add more detailed
|
||||||
|
documentation about the new GNU Radio modules contained in this
|
||||||
|
project.
|
||||||
|
|
||||||
|
*/
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef PYDOC_MACROS_H
|
||||||
|
#define PYDOC_MACROS_H
|
||||||
|
|
||||||
|
#define __EXPAND(x) x
|
||||||
|
#define __COUNT(_1, _2, _3, _4, _5, _6, _7, COUNT, ...) COUNT
|
||||||
|
#define __VA_SIZE(...) __EXPAND(__COUNT(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1))
|
||||||
|
#define __CAT1(a, b) a##b
|
||||||
|
#define __CAT2(a, b) __CAT1(a, b)
|
||||||
|
#define __DOC1(n1) __doc_##n1
|
||||||
|
#define __DOC2(n1, n2) __doc_##n1##_##n2
|
||||||
|
#define __DOC3(n1, n2, n3) __doc_##n1##_##n2##_##n3
|
||||||
|
#define __DOC4(n1, n2, n3, n4) __doc_##n1##_##n2##_##n3##_##n4
|
||||||
|
#define __DOC5(n1, n2, n3, n4, n5) __doc_##n1##_##n2##_##n3##_##n4##_##n5
|
||||||
|
#define __DOC6(n1, n2, n3, n4, n5, n6) __doc_##n1##_##n2##_##n3##_##n4##_##n5##_##n6
|
||||||
|
#define __DOC7(n1, n2, n3, n4, n5, n6, n7) \
|
||||||
|
__doc_##n1##_##n2##_##n3##_##n4##_##n5##_##n6##_##n7
|
||||||
|
#define DOC(...) __EXPAND(__EXPAND(__CAT2(__DOC, __VA_SIZE(__VA_ARGS__)))(__VA_ARGS__))
|
||||||
|
|
||||||
|
#endif // PYDOC_MACROS_H
|
||||||
@@ -0,0 +1,346 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2010-2012 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gnuradio
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
#
|
||||||
|
"""
|
||||||
|
Updates the *pydoc_h files for a module
|
||||||
|
Execute using: python update_pydoc.py xml_path outputfilename
|
||||||
|
|
||||||
|
The file instructs Pybind11 to transfer the doxygen comments into the
|
||||||
|
python docstrings.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os, sys, time, glob, re, json
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from doxyxml import DoxyIndex, DoxyClass, DoxyFriend, DoxyFunction, DoxyFile
|
||||||
|
from doxyxml import DoxyOther, base
|
||||||
|
|
||||||
|
def py_name(name):
|
||||||
|
bits = name.split('_')
|
||||||
|
return '_'.join(bits[1:])
|
||||||
|
|
||||||
|
def make_name(name):
|
||||||
|
bits = name.split('_')
|
||||||
|
return bits[0] + '_make_' + '_'.join(bits[1:])
|
||||||
|
|
||||||
|
|
||||||
|
class Block(object):
|
||||||
|
"""
|
||||||
|
Checks if doxyxml produced objects correspond to a gnuradio block.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def includes(cls, item):
|
||||||
|
if not isinstance(item, DoxyClass):
|
||||||
|
return False
|
||||||
|
# Check for a parsing error.
|
||||||
|
if item.error():
|
||||||
|
return False
|
||||||
|
friendname = make_name(item.name())
|
||||||
|
is_a_block = item.has_member(friendname, DoxyFriend)
|
||||||
|
# But now sometimes the make function isn't a friend so check again.
|
||||||
|
if not is_a_block:
|
||||||
|
is_a_block = di.has_member(friendname, DoxyFunction)
|
||||||
|
return is_a_block
|
||||||
|
|
||||||
|
class Block2(object):
|
||||||
|
"""
|
||||||
|
Checks if doxyxml produced objects correspond to a new style
|
||||||
|
gnuradio block.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def includes(cls, item):
|
||||||
|
if not isinstance(item, DoxyClass):
|
||||||
|
return False
|
||||||
|
# Check for a parsing error.
|
||||||
|
if item.error():
|
||||||
|
return False
|
||||||
|
is_a_block2 = item.has_member('make', DoxyFunction) and item.has_member('sptr', DoxyOther)
|
||||||
|
return is_a_block2
|
||||||
|
|
||||||
|
|
||||||
|
def utoascii(text):
|
||||||
|
"""
|
||||||
|
Convert unicode text into ascii and escape quotes and backslashes.
|
||||||
|
"""
|
||||||
|
if text is None:
|
||||||
|
return ''
|
||||||
|
out = text.encode('ascii', 'replace')
|
||||||
|
# swig will require us to replace blackslash with 4 backslashes
|
||||||
|
# TODO: evaluate what this should be for pybind11
|
||||||
|
out = out.replace(b'\\', b'\\\\\\\\')
|
||||||
|
out = out.replace(b'"', b'\\"').decode('ascii')
|
||||||
|
return str(out)
|
||||||
|
|
||||||
|
|
||||||
|
def combine_descriptions(obj):
|
||||||
|
"""
|
||||||
|
Combines the brief and detailed descriptions of an object together.
|
||||||
|
"""
|
||||||
|
description = []
|
||||||
|
bd = obj.brief_description.strip()
|
||||||
|
dd = obj.detailed_description.strip()
|
||||||
|
if bd:
|
||||||
|
description.append(bd)
|
||||||
|
if dd:
|
||||||
|
description.append(dd)
|
||||||
|
return utoascii('\n\n'.join(description)).strip()
|
||||||
|
|
||||||
|
def format_params(parameteritems):
|
||||||
|
output = ['Args:']
|
||||||
|
template = ' {0} : {1}'
|
||||||
|
for pi in parameteritems:
|
||||||
|
output.append(template.format(pi.name, pi.description))
|
||||||
|
return '\n'.join(output)
|
||||||
|
|
||||||
|
entry_templ = '%feature("docstring") {name} "{docstring}"'
|
||||||
|
def make_entry(obj, name=None, templ="{description}", description=None, params=[]):
|
||||||
|
"""
|
||||||
|
Create a docstring key/value pair, where the key is the object name.
|
||||||
|
|
||||||
|
obj - a doxyxml object from which documentation will be extracted.
|
||||||
|
name - the name of the C object (defaults to obj.name())
|
||||||
|
templ - an optional template for the docstring containing only one
|
||||||
|
variable named 'description'.
|
||||||
|
description - if this optional variable is set then it's value is
|
||||||
|
used as the description instead of extracting it from obj.
|
||||||
|
"""
|
||||||
|
if name is None:
|
||||||
|
name=obj.name()
|
||||||
|
if hasattr(obj,'_parse_data') and hasattr(obj._parse_data,'definition'):
|
||||||
|
name=obj._parse_data.definition.split(' ')[-1]
|
||||||
|
if "operator " in name:
|
||||||
|
return ''
|
||||||
|
if description is None:
|
||||||
|
description = combine_descriptions(obj)
|
||||||
|
if params:
|
||||||
|
description += '\n\n'
|
||||||
|
description += utoascii(format_params(params))
|
||||||
|
docstring = templ.format(description=description)
|
||||||
|
|
||||||
|
return {name: docstring}
|
||||||
|
|
||||||
|
|
||||||
|
def make_class_entry(klass, description=None, ignored_methods=[], params=None):
|
||||||
|
"""
|
||||||
|
Create a class docstring key/value pair.
|
||||||
|
"""
|
||||||
|
if params is None:
|
||||||
|
params = klass.params
|
||||||
|
output = {}
|
||||||
|
output.update(make_entry(klass, description=description, params=params))
|
||||||
|
for func in klass.in_category(DoxyFunction):
|
||||||
|
if func.name() not in ignored_methods:
|
||||||
|
name = klass.name() + '::' + func.name()
|
||||||
|
output.update(make_entry(func, name=name))
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def make_block_entry(di, block):
|
||||||
|
"""
|
||||||
|
Create class and function docstrings of a gnuradio block
|
||||||
|
"""
|
||||||
|
descriptions = []
|
||||||
|
# Get the documentation associated with the class.
|
||||||
|
class_desc = combine_descriptions(block)
|
||||||
|
if class_desc:
|
||||||
|
descriptions.append(class_desc)
|
||||||
|
# Get the documentation associated with the make function
|
||||||
|
make_func = di.get_member(make_name(block.name()), DoxyFunction)
|
||||||
|
make_func_desc = combine_descriptions(make_func)
|
||||||
|
if make_func_desc:
|
||||||
|
descriptions.append(make_func_desc)
|
||||||
|
# Get the documentation associated with the file
|
||||||
|
try:
|
||||||
|
block_file = di.get_member(block.name() + ".h", DoxyFile)
|
||||||
|
file_desc = combine_descriptions(block_file)
|
||||||
|
if file_desc:
|
||||||
|
descriptions.append(file_desc)
|
||||||
|
except base.Base.NoSuchMember:
|
||||||
|
# Don't worry if we can't find a matching file.
|
||||||
|
pass
|
||||||
|
# And join them all together to make a super duper description.
|
||||||
|
super_description = "\n\n".join(descriptions)
|
||||||
|
# Associate the combined description with the class and
|
||||||
|
# the make function.
|
||||||
|
output = {}
|
||||||
|
output.update(make_class_entry(block, description=super_description))
|
||||||
|
output.update(make_entry(make_func, description=super_description,
|
||||||
|
params=block.params))
|
||||||
|
return output
|
||||||
|
|
||||||
|
def make_block2_entry(di, block):
|
||||||
|
"""
|
||||||
|
Create class and function docstrings of a new style gnuradio block
|
||||||
|
"""
|
||||||
|
# For new style blocks all the relevant documentation should be
|
||||||
|
# associated with the 'make' method.
|
||||||
|
class_description = combine_descriptions(block)
|
||||||
|
make_func = block.get_member('make', DoxyFunction)
|
||||||
|
make_description = combine_descriptions(make_func)
|
||||||
|
description = class_description + "\n\nConstructor Specific Documentation:\n\n" + make_description
|
||||||
|
# Associate the combined description with the class and
|
||||||
|
# the make function.
|
||||||
|
output = {}
|
||||||
|
output.update(make_class_entry(
|
||||||
|
block, description=description,
|
||||||
|
ignored_methods=['make'], params=make_func.params))
|
||||||
|
makename = block.name() + '::make'
|
||||||
|
output.update(make_entry(
|
||||||
|
make_func, name=makename, description=description,
|
||||||
|
params=make_func.params))
|
||||||
|
return output
|
||||||
|
|
||||||
|
def get_docstrings_dict(di, custom_output=None):
|
||||||
|
|
||||||
|
output = {}
|
||||||
|
if custom_output:
|
||||||
|
output.update(custom_output)
|
||||||
|
|
||||||
|
# Create docstrings for the blocks.
|
||||||
|
blocks = di.in_category(Block)
|
||||||
|
blocks2 = di.in_category(Block2)
|
||||||
|
|
||||||
|
make_funcs = set([])
|
||||||
|
for block in blocks:
|
||||||
|
try:
|
||||||
|
make_func = di.get_member(make_name(block.name()), DoxyFunction)
|
||||||
|
# Don't want to risk writing to output twice.
|
||||||
|
if make_func.name() not in make_funcs:
|
||||||
|
make_funcs.add(make_func.name())
|
||||||
|
output.update(make_block_entry(di, block))
|
||||||
|
except block.ParsingError:
|
||||||
|
sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
|
||||||
|
raise
|
||||||
|
|
||||||
|
for block in blocks2:
|
||||||
|
try:
|
||||||
|
make_func = block.get_member('make', DoxyFunction)
|
||||||
|
make_func_name = block.name() +'::make'
|
||||||
|
# Don't want to risk writing to output twice.
|
||||||
|
if make_func_name not in make_funcs:
|
||||||
|
make_funcs.add(make_func_name)
|
||||||
|
output.update(make_block2_entry(di, block))
|
||||||
|
except block.ParsingError:
|
||||||
|
sys.stderr.write('Parsing error for block {0}\n'.format(block.name()))
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Create docstrings for functions
|
||||||
|
# Don't include the make functions since they have already been dealt with.
|
||||||
|
funcs = [f for f in di.in_category(DoxyFunction)
|
||||||
|
if f.name() not in make_funcs and not f.name().startswith('std::')]
|
||||||
|
for f in funcs:
|
||||||
|
try:
|
||||||
|
output.update(make_entry(f))
|
||||||
|
except f.ParsingError:
|
||||||
|
sys.stderr.write('Parsing error for function {0}\n'.format(f.name()))
|
||||||
|
|
||||||
|
# Create docstrings for classes
|
||||||
|
block_names = [block.name() for block in blocks]
|
||||||
|
block_names += [block.name() for block in blocks2]
|
||||||
|
klasses = [k for k in di.in_category(DoxyClass)
|
||||||
|
if k.name() not in block_names and not k.name().startswith('std::')]
|
||||||
|
for k in klasses:
|
||||||
|
try:
|
||||||
|
output.update(make_class_entry(k))
|
||||||
|
except k.ParsingError:
|
||||||
|
sys.stderr.write('Parsing error for class {0}\n'.format(k.name()))
|
||||||
|
|
||||||
|
# Docstrings are not created for anything that is not a function or a class.
|
||||||
|
# If this excludes anything important please add it here.
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
def sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, output_dir, filter_str=None):
|
||||||
|
if filter_str:
|
||||||
|
docstrings_dict = {k: v for k, v in docstrings_dict.items() if k.startswith(filter_str)}
|
||||||
|
|
||||||
|
with open(os.path.join(output_dir,'docstring_status'),'w') as status_file:
|
||||||
|
|
||||||
|
for pydoc_file in pydoc_files:
|
||||||
|
if filter_str:
|
||||||
|
filter_str2 = "::".join((filter_str,os.path.split(pydoc_file)[-1].split('_pydoc_template.h')[0]))
|
||||||
|
docstrings_dict2 = {k: v for k, v in docstrings_dict.items() if k.startswith(filter_str2)}
|
||||||
|
else:
|
||||||
|
docstrings_dict2 = docstrings_dict
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
file_in = open(pydoc_file,'r').read()
|
||||||
|
for key, value in docstrings_dict2.items():
|
||||||
|
file_in_tmp = file_in
|
||||||
|
try:
|
||||||
|
doc_key = key.split("::")
|
||||||
|
# if 'gr' in doc_key:
|
||||||
|
# doc_key.remove('gr')
|
||||||
|
doc_key = '_'.join(doc_key)
|
||||||
|
regexp = r'(__doc_{} =\sR\"doc\()[^)]*(\)doc\")'.format(doc_key)
|
||||||
|
regexp = re.compile(regexp, re.MULTILINE)
|
||||||
|
|
||||||
|
(file_in, nsubs) = regexp.subn(r'\1'+value+r'\2', file_in, count=1)
|
||||||
|
if nsubs == 1:
|
||||||
|
status_file.write("PASS: " + pydoc_file + "\n")
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
raise KeyboardInterrupt
|
||||||
|
except: # be permissive, TODO log, but just leave the docstring blank
|
||||||
|
status_file.write("FAIL: " + pydoc_file + "\n")
|
||||||
|
file_in = file_in_tmp
|
||||||
|
|
||||||
|
output_pathname = os.path.join(output_dir, os.path.basename(pydoc_file).replace('_template.h','.h'))
|
||||||
|
# FIXME: Remove this debug print
|
||||||
|
print('output docstrings to {}'.format(output_pathname))
|
||||||
|
with open(output_pathname,'w') as file_out:
|
||||||
|
file_out.write(file_in)
|
||||||
|
|
||||||
|
def copy_docstring_templates(pydoc_files, output_dir):
|
||||||
|
with open(os.path.join(output_dir,'docstring_status'),'w') as status_file:
|
||||||
|
for pydoc_file in pydoc_files:
|
||||||
|
file_in = open(pydoc_file,'r').read()
|
||||||
|
output_pathname = os.path.join(output_dir, os.path.basename(pydoc_file).replace('_template.h','.h'))
|
||||||
|
# FIXME: Remove this debug print
|
||||||
|
print('copy docstrings to {}'.format(output_pathname))
|
||||||
|
with open(output_pathname,'w') as file_out:
|
||||||
|
file_out.write(file_in)
|
||||||
|
status_file.write("DONE")
|
||||||
|
|
||||||
|
def argParse():
|
||||||
|
"""Parses commandline args."""
|
||||||
|
desc='Scrape the doxygen generated xml for docstrings to insert into python bindings'
|
||||||
|
parser = ArgumentParser(description=desc)
|
||||||
|
|
||||||
|
parser.add_argument("function", help="Operation to perform on docstrings", choices=["scrape","sub","copy"])
|
||||||
|
|
||||||
|
parser.add_argument("--xml_path")
|
||||||
|
parser.add_argument("--bindings_dir")
|
||||||
|
parser.add_argument("--output_dir")
|
||||||
|
parser.add_argument("--json_path")
|
||||||
|
parser.add_argument("--filter", default=None)
|
||||||
|
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Parse command line options and set up doxyxml.
|
||||||
|
args = argParse()
|
||||||
|
if args.function.lower() == 'scrape':
|
||||||
|
di = DoxyIndex(args.xml_path)
|
||||||
|
docstrings_dict = get_docstrings_dict(di)
|
||||||
|
with open(args.json_path, 'w') as fp:
|
||||||
|
json.dump(docstrings_dict, fp)
|
||||||
|
elif args.function.lower() == 'sub':
|
||||||
|
with open(args.json_path, 'r') as fp:
|
||||||
|
docstrings_dict = json.load(fp)
|
||||||
|
pydoc_files = glob.glob(os.path.join(args.bindings_dir,'*_pydoc_template.h'))
|
||||||
|
sub_docstring_in_pydoc_h(pydoc_files, docstrings_dict, args.output_dir, args.filter)
|
||||||
|
elif args.function.lower() == 'copy':
|
||||||
|
pydoc_files = glob.glob(os.path.join(args.bindings_dir,'*_pydoc_template.h'))
|
||||||
|
copy_docstring_templates(pydoc_files, args.output_dir)
|
||||||
|
|
||||||
|
|
||||||
+16
-26
@@ -1,33 +1,23 @@
|
|||||||
# Copyright 2011 Free Software Foundation, Inc.
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is part of gr-foo
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
#
|
#
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
#
|
||||||
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
install(FILES
|
install(FILES
|
||||||
foo_burst_tagger.block.yml
|
foo_burst_tagger.block.yml
|
||||||
foo_packet_pad2.block.yml
|
foo_packet_pad2.block.yml
|
||||||
foo_random_periodic_msg_source.block.yml
|
foo_random_periodic_msg_source.block.yml
|
||||||
foo_valve.block.yml
|
foo_valve.block.yml
|
||||||
foo_channel_model.block.yml
|
foo_channel_model.block.yml
|
||||||
foo_packet_pad.block.yml
|
foo_packet_pad.block.yml
|
||||||
foo_rtt_measure.block.yml
|
foo_rtt_measure.block.yml
|
||||||
foo_wireshark_connector.block.yml
|
foo_wireshark_connector.block.yml
|
||||||
foo_packet_dropper.block.yml
|
foo_packet_dropper.block.yml
|
||||||
foo_periodic_msg_source.block.yml
|
foo_periodic_msg_source.block.yml
|
||||||
foo_selector.block.yml
|
foo_selector.block.yml
|
||||||
foo_pad_tagged_stream.block.yml DESTINATION share/gnuradio/grc/blocks
|
foo_pad_tagged_stream.block.yml
|
||||||
|
DESTINATION share/gnuradio/grc/blocks
|
||||||
)
|
)
|
||||||
|
|||||||
+15
-25
@@ -1,35 +1,25 @@
|
|||||||
# Copyright 2011,2012 Free Software Foundation, Inc.
|
# Copyright 2011,2012 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is part of gr-foo
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
#
|
#
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
#
|
||||||
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Install public header files
|
# Install public header files
|
||||||
########################################################################
|
########################################################################
|
||||||
install(FILES
|
install(FILES
|
||||||
api.h
|
api.h
|
||||||
burst_tagger.h
|
burst_tagger.h
|
||||||
channel_model.h
|
channel_model.h
|
||||||
packet_dropper.h
|
packet_dropper.h
|
||||||
packet_pad.h
|
packet_pad.h
|
||||||
packet_pad2.h
|
packet_pad2.h
|
||||||
periodic_msg_source.h
|
periodic_msg_source.h
|
||||||
random_periodic_msg_source.h
|
random_periodic_msg_source.h
|
||||||
rtt_measure.h
|
rtt_measure.h
|
||||||
wireshark_connector.h
|
wireshark_connector.h
|
||||||
pad_tagged_stream.h DESTINATION include/foo
|
pad_tagged_stream.h
|
||||||
|
DESTINATION include/foo
|
||||||
)
|
)
|
||||||
|
|||||||
+5
-16
@@ -1,22 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2011 Free Software Foundation, Inc.
|
* Copyright 2011 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* This file is part of gr-foo
|
* This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
* This file is a part of gr-foo
|
||||||
*
|
*
|
||||||
* GNU Radio is free software; you can redistribute it and/or modify
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
*
|
||||||
* GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
|
||||||
* the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef INCLUDED_FOO_API_H
|
#ifndef INCLUDED_FOO_API_H
|
||||||
@@ -25,9 +14,9 @@
|
|||||||
#include <gnuradio/attributes.h>
|
#include <gnuradio/attributes.h>
|
||||||
|
|
||||||
#ifdef gnuradio_foo_EXPORTS
|
#ifdef gnuradio_foo_EXPORTS
|
||||||
# define FOO_API __GR_ATTR_EXPORT
|
#define FOO_API __GR_ATTR_EXPORT
|
||||||
#else
|
#else
|
||||||
# define FOO_API __GR_ATTR_IMPORT
|
#define FOO_API __GR_ATTR_IMPORT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* INCLUDED_FOO_API_H */
|
#endif /* INCLUDED_FOO_API_H */
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace foo {
|
|||||||
|
|
||||||
class FOO_API burst_tagger : virtual public gr::sync_block {
|
class FOO_API burst_tagger : virtual public gr::sync_block {
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<burst_tagger> sptr;
|
typedef std::shared_ptr<burst_tagger> sptr;
|
||||||
|
|
||||||
static sptr make(pmt::pmt_t tag_name, unsigned int mult);
|
static sptr make(pmt::pmt_t tag_name, unsigned int mult);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace foo {
|
|||||||
class FOO_API channel_model : virtual public hier_block2
|
class FOO_API channel_model : virtual public hier_block2
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<channel_model> sptr;
|
typedef std::shared_ptr<channel_model> sptr;
|
||||||
|
|
||||||
static sptr make(double noise_voltage = 0.0, double frequency_offset = 0.0,
|
static sptr make(double noise_voltage = 0.0, double frequency_offset = 0.0,
|
||||||
double epsilon = 1.0,
|
double epsilon = 1.0,
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace foo {
|
|||||||
class FOO_API packet_dropper : virtual public gr::block
|
class FOO_API packet_dropper : virtual public gr::block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<packet_dropper> sptr;
|
typedef std::shared_ptr<packet_dropper> sptr;
|
||||||
static sptr make(double drop_rate, unsigned long seed);
|
static sptr make(double drop_rate, unsigned long seed);
|
||||||
};
|
};
|
||||||
} // namespace foo
|
} // namespace foo
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class FOO_API packet_pad : virtual public gr::block
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef boost::shared_ptr<packet_pad> sptr;
|
typedef std::shared_ptr<packet_pad> sptr;
|
||||||
static sptr make(bool debug = false, bool delay=false, double delay_sec=0.01, unsigned int pad_front = 0, unsigned int pad_tail = 0);
|
static sptr make(bool debug = false, bool delay=false, double delay_sec=0.01, unsigned int pad_front = 0, unsigned int pad_tail = 0);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class FOO_API packet_pad2 : virtual public gr::tagged_stream_block
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef boost::shared_ptr<packet_pad2> sptr;
|
typedef std::shared_ptr<packet_pad2> sptr;
|
||||||
static sptr make(bool debug = false, bool delay=false, double delay_sec=0.01, unsigned int pad_front = 0, unsigned int pad_tail = 0);
|
static sptr make(bool debug = false, bool delay=false, double delay_sec=0.01, unsigned int pad_front = 0, unsigned int pad_tail = 0);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace gr {
|
|||||||
class FOO_API pad_tagged_stream : virtual public gr::tagged_stream_block
|
class FOO_API pad_tagged_stream : virtual public gr::tagged_stream_block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<pad_tagged_stream> sptr;
|
typedef std::shared_ptr<pad_tagged_stream> sptr;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Return a shared_ptr to a new instance of foo::pad_tagged_stream.
|
* \brief Return a shared_ptr to a new instance of foo::pad_tagged_stream.
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class FOO_API periodic_msg_source : virtual public gr::block
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef boost::shared_ptr<periodic_msg_source> sptr;
|
typedef std::shared_ptr<periodic_msg_source> sptr;
|
||||||
static sptr make(pmt::pmt_t msg, long interval, int num_msg = -1,
|
static sptr make(pmt::pmt_t msg, long interval, int num_msg = -1,
|
||||||
bool quit = true, bool debug = false);
|
bool quit = true, bool debug = false);
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class FOO_API random_periodic_msg_source : virtual public gr::block
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef boost::shared_ptr<random_periodic_msg_source> sptr;
|
typedef std::shared_ptr<random_periodic_msg_source> sptr;
|
||||||
static sptr make(int msg_len, long interval, int num_msg = 1,
|
static sptr make(int msg_len, long interval, int num_msg = 1,
|
||||||
bool quit = true, bool debug = false, int seed = 0);
|
bool quit = true, bool debug = false, int seed = 0);
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ namespace foo {
|
|||||||
class FOO_API rtt_measure : virtual public gr::block
|
class FOO_API rtt_measure : virtual public gr::block
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef boost::shared_ptr<rtt_measure> sptr;
|
typedef std::shared_ptr<rtt_measure> sptr;
|
||||||
static sptr make(unsigned long interval);
|
static sptr make(unsigned long interval);
|
||||||
};
|
};
|
||||||
} // namespace foo
|
} // namespace foo
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class FOO_API wireshark_connector : virtual public gr::block
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef boost::shared_ptr<wireshark_connector> sptr;
|
typedef std::shared_ptr<wireshark_connector> sptr;
|
||||||
static sptr make(LinkType type, bool debug= false);
|
static sptr make(LinkType type, bool debug= false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+4
-15
@@ -1,21 +1,10 @@
|
|||||||
# Copyright 2011,2012 Free Software Foundation, Inc.
|
# Copyright 2011,2012,2016,2018,2019 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is part of gr-foo
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
#
|
#
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
#
|
||||||
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Setup library
|
# Setup library
|
||||||
|
|||||||
+5
-16
@@ -1,21 +1,10 @@
|
|||||||
# Copyright 2011 Free Software Foundation, Inc.
|
# Copyright 2011 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is part of gr-foo
|
# This file was generated by gr_modtool, a tool from the GNU Radio framework
|
||||||
|
# This file is a part of gr-foo
|
||||||
#
|
#
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
#
|
||||||
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Include python install macros
|
# Include python install macros
|
||||||
@@ -25,6 +14,8 @@ if(NOT PYTHONINTERP_FOUND)
|
|||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(bindings)
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# Install python sources
|
# Install python sources
|
||||||
########################################################################
|
########################################################################
|
||||||
@@ -41,5 +32,3 @@ GR_PYTHON_INSTALL(
|
|||||||
include(GrTest)
|
include(GrTest)
|
||||||
|
|
||||||
set(GR_TEST_TARGET_DEPS gnuradio-foo)
|
set(GR_TEST_TARGET_DEPS gnuradio-foo)
|
||||||
set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig)
|
|
||||||
GR_ADD_TEST(qa_pad_tagged_stream ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_pad_tagged_stream.py)
|
|
||||||
|
|||||||
+5
-17
@@ -1,19 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Copyright 2008,2009 Free Software Foundation, Inc.
|
# Copyright 2008,2009 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This application is free software; you can redistribute it and/or modify
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This application 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, write to the Free Software Foundation, Inc.,
|
|
||||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
#
|
#
|
||||||
|
|
||||||
# The presence of this file turns this directory into a Python package
|
# The presence of this file turns this directory into a Python package
|
||||||
@@ -22,13 +10,13 @@
|
|||||||
This is the GNU Radio FOO module. Place your Python package
|
This is the GNU Radio FOO module. Place your Python package
|
||||||
description here (python/__init__.py).
|
description here (python/__init__.py).
|
||||||
'''
|
'''
|
||||||
from __future__ import unicode_literals
|
import os
|
||||||
|
|
||||||
# import swig generated symbols into the foo namespace
|
# import pybind11 generated symbols into the foo namespace
|
||||||
try:
|
try:
|
||||||
# this might fail if the module is python-only
|
# this might fail if the module is python-only
|
||||||
from .foo_swig import *
|
from .foo_python import *
|
||||||
except ImportError:
|
except ModuleNotFoundError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# import any pure python here
|
# import any pure python here
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# Copyright 2020 Free Software Foundation, Inc.
|
||||||
|
#
|
||||||
|
# This file is part of GNU Radio
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check if there is C++ code at all
|
||||||
|
########################################################################
|
||||||
|
if(NOT foo_sources)
|
||||||
|
MESSAGE(STATUS "No C++ sources... skipping python bindings")
|
||||||
|
return()
|
||||||
|
endif(NOT foo_sources)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Check for pygccxml
|
||||||
|
########################################################################
|
||||||
|
GR_PYTHON_CHECK_MODULE_RAW(
|
||||||
|
"pygccxml"
|
||||||
|
"import pygccxml"
|
||||||
|
PYGCCXML_FOUND
|
||||||
|
)
|
||||||
|
|
||||||
|
include(GrPybind)
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Python Bindings
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
list(APPEND foo_python_files
|
||||||
|
python_bindings.cc)
|
||||||
|
|
||||||
|
GR_PYBIND_MAKE_OOT(foo
|
||||||
|
../..
|
||||||
|
gr::foo
|
||||||
|
"${foo_python_files}")
|
||||||
|
|
||||||
|
install(TARGETS foo_python DESTINATION ${GR_PYTHON_DIR}/foo COMPONENT pythonapi)
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import warnings
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
from gnuradio.bindtool import BindingGenerator
|
||||||
|
import pathlib
|
||||||
|
import sys
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Bind a GR Out of Tree Block')
|
||||||
|
parser.add_argument('--module', type=str,
|
||||||
|
help='Name of gr module containing file to bind (e.g. fft digital analog)')
|
||||||
|
|
||||||
|
parser.add_argument('--output_dir', default='/tmp',
|
||||||
|
help='Output directory of generated bindings')
|
||||||
|
parser.add_argument('--prefix', help='Prefix of Installed GNU Radio')
|
||||||
|
parser.add_argument('--src', help='Directory of gnuradio source tree',
|
||||||
|
default=os.path.dirname(os.path.abspath(__file__))+'/../../..')
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--filename', help="File to be parsed")
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--defines', help='Set additional defines for precompiler',default=(), nargs='*')
|
||||||
|
parser.add_argument(
|
||||||
|
'--include', help='Additional Include Dirs, separated', default=(), nargs='*')
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'--status', help='Location of output file for general status (used during cmake)', default=None
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--flag_automatic', default='0'
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--flag_pygccxml', default='0'
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
prefix = args.prefix
|
||||||
|
output_dir = args.output_dir
|
||||||
|
defines = tuple(','.join(args.defines).split(','))
|
||||||
|
includes = ','.join(args.include)
|
||||||
|
name = args.module
|
||||||
|
|
||||||
|
namespace = ['gr', name]
|
||||||
|
prefix_include_root = name
|
||||||
|
|
||||||
|
|
||||||
|
with warnings.catch_warnings():
|
||||||
|
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
||||||
|
|
||||||
|
bg = BindingGenerator(prefix, namespace,
|
||||||
|
prefix_include_root, output_dir, define_symbols=defines, addl_includes=includes,
|
||||||
|
catch_exceptions=False, write_json_output=False, status_output=args.status,
|
||||||
|
flag_automatic=True if args.flag_automatic.lower() in [
|
||||||
|
'1', 'true'] else False,
|
||||||
|
flag_pygccxml=True if args.flag_pygccxml.lower() in ['1', 'true'] else False)
|
||||||
|
bg.gen_file_binding(args.filename)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
This directory stores templates for docstrings that are scraped from the include header files for each block
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
# Utilities for reading values in header files
|
||||||
|
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
class PybindHeaderParser:
|
||||||
|
def __init__(self, pathname):
|
||||||
|
with open(pathname,'r') as f:
|
||||||
|
self.file_txt = f.read()
|
||||||
|
|
||||||
|
def get_flag_automatic(self):
|
||||||
|
# p = re.compile(r'BINDTOOL_GEN_AUTOMATIC\(([^\s])\)')
|
||||||
|
# m = p.search(self.file_txt)
|
||||||
|
m = re.search(r'BINDTOOL_GEN_AUTOMATIC\(([^\s])\)', self.file_txt)
|
||||||
|
if (m and m.group(1) == '1'):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_flag_pygccxml(self):
|
||||||
|
# p = re.compile(r'BINDTOOL_USE_PYGCCXML\(([^\s])\)')
|
||||||
|
# m = p.search(self.file_txt)
|
||||||
|
m = re.search(r'BINDTOOL_USE_PYGCCXML\(([^\s])\)', self.file_txt)
|
||||||
|
if (m and m.group(1) == '1'):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_header_filename(self):
|
||||||
|
# p = re.compile(r'BINDTOOL_HEADER_FILE\(([^\s]*)\)')
|
||||||
|
# m = p.search(self.file_txt)
|
||||||
|
m = re.search(r'BINDTOOL_HEADER_FILE\(([^\s]*)\)', self.file_txt)
|
||||||
|
if (m):
|
||||||
|
return m.group(1)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_header_file_hash(self):
|
||||||
|
# p = re.compile(r'BINDTOOL_HEADER_FILE_HASH\(([^\s]*)\)')
|
||||||
|
# m = p.search(self.file_txt)
|
||||||
|
m = re.search(r'BINDTOOL_HEADER_FILE_HASH\(([^\s]*)\)', self.file_txt)
|
||||||
|
if (m):
|
||||||
|
return m.group(1)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_flags(self):
|
||||||
|
return f'{self.get_flag_automatic()};{self.get_flag_pygccxml()};{self.get_header_filename()};{self.get_header_file_hash()};'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def argParse():
|
||||||
|
"""Parses commandline args."""
|
||||||
|
desc='Reads the parameters from the comment block in the pybind files'
|
||||||
|
parser = ArgumentParser(description=desc)
|
||||||
|
|
||||||
|
parser.add_argument("function", help="Operation to perform on comment block of pybind file", choices=["flag_auto","flag_pygccxml","header_filename","header_file_hash","all"])
|
||||||
|
parser.add_argument("pathname", help="Pathname of pybind c++ file to read, e.g. blockname_python.cc")
|
||||||
|
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Parse command line options and set up doxyxml.
|
||||||
|
args = argParse()
|
||||||
|
|
||||||
|
pbhp = PybindHeaderParser(args.pathname)
|
||||||
|
|
||||||
|
if args.function == "flag_auto":
|
||||||
|
print(pbhp.get_flag_automatic())
|
||||||
|
elif args.function == "flag_pygccxml":
|
||||||
|
print(pbhp.get_flag_pygccxml())
|
||||||
|
elif args.function == "header_filename":
|
||||||
|
print(pbhp.get_header_filename())
|
||||||
|
elif args.function == "header_file_hash":
|
||||||
|
print(pbhp.get_header_file_hash())
|
||||||
|
elif args.function == "all":
|
||||||
|
print(pbhp.get_flags())
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of GNU Radio
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <pybind11/pybind11.h>
|
||||||
|
|
||||||
|
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
|
||||||
|
#include <numpy/arrayobject.h>
|
||||||
|
|
||||||
|
namespace py = pybind11;
|
||||||
|
|
||||||
|
// Headers for binding functions
|
||||||
|
/**************************************/
|
||||||
|
// The following comment block is used for
|
||||||
|
// gr_modtool to insert function prototypes
|
||||||
|
// Please do not delete
|
||||||
|
/**************************************/
|
||||||
|
// BINDING_FUNCTION_PROTOTYPES(
|
||||||
|
// ) END BINDING_FUNCTION_PROTOTYPES
|
||||||
|
|
||||||
|
|
||||||
|
// We need this hack because import_array() returns NULL
|
||||||
|
// for newer Python versions.
|
||||||
|
// This function is also necessary because it ensures access to the C API
|
||||||
|
// and removes a warning.
|
||||||
|
void* init_numpy()
|
||||||
|
{
|
||||||
|
import_array();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PYBIND11_MODULE(foo_python, m)
|
||||||
|
{
|
||||||
|
// Initialize the numpy C API
|
||||||
|
// (otherwise we will see segmentation faults)
|
||||||
|
init_numpy();
|
||||||
|
|
||||||
|
// Allow access to base block methods
|
||||||
|
py::module::import("gnuradio.gr");
|
||||||
|
|
||||||
|
/**************************************/
|
||||||
|
// The following comment block is used for
|
||||||
|
// gr_modtool to insert binding function calls
|
||||||
|
// Please do not delete
|
||||||
|
/**************************************/
|
||||||
|
// BINDING_FUNCTION_CALLS(
|
||||||
|
// ) END BINDING_FUNCTION_CALLS
|
||||||
|
}
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
#
|
|
||||||
# Copyright 2019 "Cyancali".
|
|
||||||
#
|
|
||||||
# This is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This software 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 software; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
|
|
||||||
from gnuradio import gr, gr_unittest
|
|
||||||
from gnuradio import blocks
|
|
||||||
import foo_swig as foo
|
|
||||||
|
|
||||||
class qa_pad_tagged_stream(gr_unittest.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
self.tb = gr.top_block()
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
self.tb = None
|
|
||||||
|
|
||||||
def test_001_t(self):
|
|
||||||
# set up fg
|
|
||||||
self.tb.run()
|
|
||||||
# check data
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
gr_unittest.run(qa_pad_tagged_stream)
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Copyright 2011 Free Software Foundation, Inc.
|
|
||||||
#
|
|
||||||
# This file is part of gr-foo
|
|
||||||
#
|
|
||||||
# GNU Radio is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 3, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to
|
|
||||||
# the Free Software Foundation, Inc., 51 Franklin Street,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Check if there is C++ code at all
|
|
||||||
########################################################################
|
|
||||||
if(NOT foo_sources)
|
|
||||||
MESSAGE(STATUS "No C++ sources... skipping swig/")
|
|
||||||
return()
|
|
||||||
endif(NOT foo_sources)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Include swig generation macros
|
|
||||||
########################################################################
|
|
||||||
find_package(SWIG)
|
|
||||||
find_package(PythonLibs)
|
|
||||||
if(NOT SWIG_FOUND OR NOT PYTHONLIBS_FOUND)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
include(GrSwig)
|
|
||||||
include(GrPython)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Setup swig generation
|
|
||||||
########################################################################
|
|
||||||
set(GR_SWIG_INCLUDE_DIRS $<TARGET_PROPERTY:gnuradio::runtime_swig,INTERFACE_INCLUDE_DIRECTORIES>)
|
|
||||||
set(GR_SWIG_TARGET_DEPS gnuradio::runtime_swig)
|
|
||||||
|
|
||||||
set(GR_SWIG_LIBRARIES gnuradio-foo)
|
|
||||||
|
|
||||||
set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/foo_swig_doc.i)
|
|
||||||
set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include)
|
|
||||||
|
|
||||||
GR_SWIG_MAKE(foo_swig foo_swig.i)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Install the build swig module
|
|
||||||
########################################################################
|
|
||||||
GR_SWIG_INSTALL(TARGETS foo_swig DESTINATION ${GR_PYTHON_DIR}/foo)
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Install swig .i files for development
|
|
||||||
########################################################################
|
|
||||||
install(
|
|
||||||
FILES
|
|
||||||
foo_swig.i
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/foo_swig_doc.i
|
|
||||||
DESTINATION ${GR_INCLUDE_DIR}/foo/swig
|
|
||||||
)
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/* -*- c++ -*- */
|
|
||||||
|
|
||||||
#define FOO_API
|
|
||||||
|
|
||||||
%include "gnuradio.i" // the common stuff
|
|
||||||
|
|
||||||
//load generated python docstrings
|
|
||||||
%include "foo_swig_doc.i"
|
|
||||||
|
|
||||||
%{
|
|
||||||
#include "foo/burst_tagger.h"
|
|
||||||
#include "foo/channel_model.h"
|
|
||||||
#include "foo/packet_dropper.h"
|
|
||||||
#include "foo/packet_pad.h"
|
|
||||||
#include "foo/packet_pad2.h"
|
|
||||||
#include "foo/periodic_msg_source.h"
|
|
||||||
#include "foo/random_periodic_msg_source.h"
|
|
||||||
#include "foo/rtt_measure.h"
|
|
||||||
#include "foo/wireshark_connector.h"
|
|
||||||
#include "foo/pad_tagged_stream.h"
|
|
||||||
%}
|
|
||||||
|
|
||||||
|
|
||||||
%include "foo/burst_tagger.h"
|
|
||||||
%include "foo/channel_model.h"
|
|
||||||
%include "foo/packet_dropper.h"
|
|
||||||
%include "foo/packet_pad.h"
|
|
||||||
%include "foo/packet_pad2.h"
|
|
||||||
%include "foo/periodic_msg_source.h"
|
|
||||||
%include "foo/random_periodic_msg_source.h"
|
|
||||||
%include "foo/rtt_measure.h"
|
|
||||||
%include "foo/wireshark_connector.h"
|
|
||||||
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, burst_tagger);
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, channel_model);
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, packet_dropper);
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, packet_pad);
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, packet_pad2);
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, periodic_msg_source);
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, random_periodic_msg_source);
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, rtt_measure);
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, wireshark_connector);
|
|
||||||
%include "foo/pad_tagged_stream.h"
|
|
||||||
GR_SWIG_BLOCK_MAGIC2(foo, pad_tagged_stream);
|
|
||||||
Reference in New Issue
Block a user