summaryrefslogtreecommitdiff
path: root/gr-utils/src/python/modtool/util_functions.py
diff options
context:
space:
mode:
Diffstat (limited to 'gr-utils/src/python/modtool/util_functions.py')
-rw-r--r--gr-utils/src/python/modtool/util_functions.py135
1 files changed, 135 insertions, 0 deletions
diff --git a/gr-utils/src/python/modtool/util_functions.py b/gr-utils/src/python/modtool/util_functions.py
new file mode 100644
index 000000000..4ca294ac3
--- /dev/null
+++ b/gr-utils/src/python/modtool/util_functions.py
@@ -0,0 +1,135 @@
+#
+# Copyright 2013 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# 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.
+#
+""" Utility functions for gr_modtool """
+
+import re
+import sys
+
+# None of these must depend on other modtool stuff!
+
+def get_command_from_argv(possible_cmds):
+ """ Read the requested command from argv. This can't be done with optparse,
+ since the option parser isn't defined before the command is known, and
+ optparse throws an error."""
+ command = None
+ for arg in sys.argv:
+ if arg[0] == "-":
+ continue
+ else:
+ command = arg
+ if command in possible_cmds:
+ return arg
+ return None
+
+def append_re_line_sequence(filename, linepattern, newline):
+ """ Detects the re 'linepattern' in the file. After its last occurrence,
+ paste 'newline'. If the pattern does not exist, append the new line
+ to the file. Then, write. """
+ oldfile = open(filename, 'r').read()
+ lines = re.findall(linepattern, oldfile, flags=re.MULTILINE)
+ if len(lines) == 0:
+ open(filename, 'a').write(newline)
+ return
+ last_line = lines[-1]
+ newfile = oldfile.replace(last_line, last_line + newline + '\n')
+ open(filename, 'w').write(newfile)
+
+def remove_pattern_from_file(filename, pattern):
+ """ Remove all occurrences of a given pattern from a file. """
+ oldfile = open(filename, 'r').read()
+ pattern = re.compile(pattern, re.MULTILINE)
+ open(filename, 'w').write(pattern.sub('', oldfile))
+
+def str_to_fancyc_comment(text):
+ """ Return a string as a C formatted comment. """
+ l_lines = text.splitlines()
+ outstr = "/* " + l_lines[0] + "\n"
+ for line in l_lines[1:]:
+ outstr += " * " + line + "\n"
+ outstr += " */\n"
+ return outstr
+
+def str_to_python_comment(text):
+ """ Return a string as a Python formatted comment. """
+ return re.compile('^', re.MULTILINE).sub('# ', text)
+
+def strip_default_values(string):
+ """ Strip default values from a C++ argument list. """
+ return re.sub(' *=[^,)]*', '', string)
+
+def strip_arg_types(string):
+ """" Strip the argument types from a list of arguments
+ Example: "int arg1, double arg2" -> "arg1, arg2" """
+ string = strip_default_values(string)
+ return ", ".join([part.strip().split(' ')[-1] for part in string.split(',')])
+
+def get_modname():
+ """ Grep the current module's name from gnuradio.project or CMakeLists.txt """
+ modname_trans = {'howto-write-a-block': 'howto'}
+ try:
+ prfile = open('gnuradio.project', 'r').read()
+ regexp = r'projectname\s*=\s*([a-zA-Z0-9-_]+)$'
+ return re.search(regexp, prfile, flags=re.MULTILINE).group(1).strip()
+ except IOError:
+ pass
+ # OK, there's no gnuradio.project. So, we need to guess.
+ cmfile = open('CMakeLists.txt', 'r').read()
+ regexp = r'(project\s*\(\s*|GR_REGISTER_COMPONENT\(")gr-(?P<modname>[a-zA-Z1-9-_]+)(\s*(CXX)?|" ENABLE)'
+ try:
+ modname = re.search(regexp, cmfile, flags=re.MULTILINE).group('modname').strip()
+ if modname in modname_trans.keys():
+ modname = modname_trans[modname]
+ return modname
+ except AttributeError:
+ return None
+
+def is_number(s):
+ " Return True if the string s contains a number. "
+ try:
+ float(s)
+ return True
+ except ValueError:
+ return False
+
+def xml_indent(elem, level=0):
+ """ Adds indents to XML for pretty printing """
+ i = "\n" + level*" "
+ if len(elem):
+ if not elem.text or not elem.text.strip():
+ elem.text = i + " "
+ if not elem.tail or not elem.tail.strip():
+ elem.tail = i
+ for elem in elem:
+ xml_indent(elem, level+1)
+ if not elem.tail or not elem.tail.strip():
+ elem.tail = i
+ else:
+ if level and (not elem.tail or not elem.tail.strip()):
+ elem.tail = i
+
+def ask_yes_no(question, default):
+ """ Asks a binary question. Returns True for yes, False for no.
+ default is given as a boolean. """
+ question += {True: ' [Y/n] ', False: ' [y/N] '}[default]
+ if raw_input(question).lower() != {True: 'n', False: 'y'}[default]:
+ return default
+ else:
+ return not default