':
continue
if comment_re.search(line[3]):
continue
out_res.append(line)
return out_res
if self.cmd_str == '<--':
return res
if self.cmd_str == 'INC':
inc_re = re.compile('^\s*(#\s*include|(from\s+[^\s]+\s+)?import)\s+.*%s.*' % req)
for line in res:
if not inc_re.search(line[3]):
continue
out_res.append(line)
return out_res
return res
def parse_result(self, res, sig):
res = self._filter_res(res, sig)
return res
ct_cache = {}
def flush():
#print 'flushing ctags cache...'
global ct_cache
ct_cache = {}
seascope-0.9+8a669e0e/src/backend/plugins/PluginBase.py 0000664 0000000 0000000 00000026331 13632457771 0022615 0 ustar 00root root 0000000 0000000 # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os, re
import copy
from PyQt5.QtCore import QObject, pyqtSignal, QProcess
def NOT_IMPLEMENTED(n, f):
msg = '%s: %s: Not implemeted' % (n, f)
from PyQt5.QtWidgets import QMessageBox
QMessageBox.warning(None, "Seascope", msg, QMessageBox.Ok)
from . import CtagsCache
cmd_table_master = [
[ 'REF', ['&References', 'Ctrl+0'], ['References to' ] ],
[ 'DEF', ['&Definitions', 'Ctrl+1'], ['Definition of' ] ],
[ '<--', ['&Called Functions', 'Ctrl+2'], ['Functions called by' ] ],
[ '-->', ['C&alling Functions', 'Ctrl+3'], ['Functions calling' ] ],
[ 'TXT', ['Find &Text', 'Ctrl+4'], ['Find text' ] ],
[ 'GREP', ['Find &Egrep', 'Ctrl+5'], ['Find egrep pattern' ] ],
[ 'FIL', ['Find &File', 'Ctrl+7'], ['Find files' ] ],
[ 'INC', ['&Include/Import', 'Ctrl+8'], ['Find include/import' ] ],
[ '---', [None, ], None ],
[ 'QDEF', ['&Quick Definition', 'Ctrl+]'], None ],
[ 'CTREE', ['Call Tr&ee', 'Ctrl+\\'], ['Call tree' ] ],
[ '---', [None, ], None ],
[ 'CLGRAPH', ['Class &Graph', 'Ctrl+:'], ['Class graph' ] ],
[ 'CLGRAPHD', ['Class Graph Dir', 'Ctrl+;'], ['Class graph dir' ] ],
[ 'FFGRAPH', ['File Func Graph', 'Ctrl+^'], ['File Func graph dir' ] ],
[ '---', [None, ], None ],
[ 'UPD', ['Re&build Database', None ], None ],
]
class PluginFeatureBase:
def __init__(self):
self.clgraph_query_args = [
['CLGRAPH', 'D', 'Derived classes' ],
['CLGRAPH', 'B', 'Base classes' ],
]
self.clgraph_query_args = [
['CLGRAPH', 'D', 'Derived classes' ],
['CLGRAPH', 'B', 'Base classes' ],
]
self.ffgraph_query_args = [
['FFGRAPH', 'F', 'File functions graph'],
['FFGRAPH_E', 'F+E', 'File functions + external graph'],
['FFGRAPH_D', 'D', 'Directory functions graph'],
['FFGRAPH_DE', 'D+E', 'Directory functions + external graph']
]
def setup(self):
feat_cmds = [ d[0] for d in self.feat_desc ]
ct = copy.deepcopy(cmd_table_master)
self.cmd_table = [ t for t in ct if t[0] in feat_cmds or t[0] == '---' ]
self.menu_cmd_list = [ [c[0]] + c[1] for c in self.cmd_table ]
self.cmd_str2id = {}
self.cmd_str2qstr = {}
self.cmd_qstr2str = {}
for c in self.feat_desc:
self.cmd_str2id[c[0]] = c[1]
for c in self.cmd_table:
if c[2] != None:
self.cmd_str2qstr[c[0]] = c[2][0]
self.cmd_qstr2str[c[2][0]] = c[0]
# python 2.7
#self.cmd_str2id = { c[0]:c[1] for c in self.feat_desc }
#self.cmd_str2qstr = { c[0]:c[2][0] for c in self.cmd_table if c[1] }
#self.cmd_qstr2str = { c[2][0]:c[0] for c in self.cmd_table if c[1] }
self.cmd_qstrlist = [ c[2][0] for c in self.cmd_table if c[2] ]
class ProjectBase(QObject):
prj = None
qry = None
def __init__(self):
QObject.__init__(self)
self.feat = None
def prj_close(self):
if (self.conf != None):
self.conf.proj_close()
self.conf = None
def prj_dir(self):
return self.conf.c_dir
def prj_name(self):
return self.conf.get_proj_name()
def prj_src_files(self):
return self.conf.get_proj_src_files()
def prj_is_open(self):
return self.conf != None
def prj_is_ready(self):
return self.conf.is_ready()
def prj_conf(self):
return self.conf.get_proj_conf()
def prj_update_conf(self, proj_args):
self.conf.proj_update(proj_args)
def prj_show_settings(self, proj_args):
NOT_IMPLEMENTED(__name__, __func__)
def prj_settings(self, proj_args):
NOT_IMPLEMENTED(__name__, __func__)
def prj_feature_setup(self):
self.feat.setup()
def prj_query(self, rquery):
return self.qry.query(rquery)
def prj_rebuild(self):
return self.qry.rebuild()
def prj_query_fl(self):
return self.qry.query_fl()
def prj_type(self):
return self.conf.prj_type
def prj_feature(self):
return self.feat
def prj_settings_get(self):
proj_args = self.prj_conf()
return proj_args
def prj_settings_update(self, proj_args):
NOT_IMPLEMENTED(__name__, __func__)
return
class ConfigBase(QObject):
def __init__(self, ptype):
self.prj_type = ptype
self.c_dir = ''
self.c_opt = ''
self.c_flist = []
def get_proj_name(self):
return os.path.split(self.c_dir)[1]
def get_proj_src_files(self):
fl = self.c_flist
return fl
def get_proj_conf(self):
return (self.c_dir, self.c_opt, self.c_flist)
def read_config(self):
pass
def write_config(self):
pass
def proj_start(self):
pass
def proj_open(self, proj_path):
self.c_dir = proj_path
self.read_config()
self.proj_start()
def proj_update(self, proj_args):
self.proj_new(proj_args)
def proj_new(self, proj_args):
self.proj_args = proj_args
(self.c_dir, self.c_opt, self.c_flist) = proj_args
self.write_config()
self.proj_start()
def proj_close(self):
pass
def is_ready(self):
return True
@staticmethod
def prepare_menu(menubar):
pass
class QueryBase(QObject):
@staticmethod
def prepare_menu(menubar):
pass
def query(self, rquery):
cmd_str = rquery['cmd']
req = rquery['req']
opt = rquery['opt']
if opt == None:
opt = []
pargs = []
if cmd_str == 'GREP':
pargs = ['grep', '-E', '-R', '-n', '-I']
pargs += [ '--', req ]
pargs += [self.conf.c_dir]
else:
assert(false)
return None
qsig = PluginProcess(self.conf.c_dir, [cmd_str, req]).run_query_process(pargs, req, rquery)
return qsig
def rebuild():
NOT_IMPLEMENTED(__name__, __func__)
def conf_is_open(self):
return self.conf != None
def conf_is_ready(self):
return self.conf.is_ready()
class QueryUiBase(QObject):
def __init__(self):
QObject.__init__(self)
from PyQt5.QtWidgets import QMessageBox
class QuerySignal(QObject):
sig_result = pyqtSignal(str, list)
sig_result_dbg = pyqtSignal(str, str, str)
sig_rebuild = pyqtSignal()
sig_query_fl = pyqtSignal(list)
def __init__(self):
QObject.__init__(self)
def _relevancy_sort(self, hfile, res):
pt = []
pd = {}
p = hfile
(pre, ext) = os.path.splitext(hfile)
c = None
while p != c:
e = [p, [], []]
pt += [e]
pd[p] = e
c = p
p = os.path.dirname(p)
for line in res:
f = line[1]
d = os.path.dirname(f)
p = f
while p not in pd:
p = os.path.dirname(p)
e = pd[p]
if p in [f, d]:
e[1].append(line)
else:
e[2].append(line)
for e in pt:
e[1] = sorted(e[1], key=lambda li: li[1])
e[2] = sorted(e[2], key=lambda li: li[1])
pre = pre + '.*'
e0 = []
e1 = []
for e in pt[1][1]:
if re.match(pre, e[1]):
e0 += [e]
else:
e1 += [e]
pt[0][1] += e0
pt[1][1] = e1
res1 = []
res2 = []
for e in pt:
res1 += e[1]
res2 += e[2]
res = res1 + res2
return res
def relevancy_sort(self, res):
if os.getenv('RELEVANCY_SORT', 1) == 0:
return res
hint_file = None
try:
hint_file = self.rquery['hint_file']
except:
pass
if not hint_file:
return res
if not os.path.isabs(hint_file):
print('BUG: relevancy_sort: not abs path:', hint_file)
return res
if len(res) > 10000:
return res
return self._relevancy_sort(hint_file, res)
def emit_result(self, res):
res = self.relevancy_sort(res)
self.sig_result.emit(self.sym, res)
class PluginProcessBase(QObject):
proc_list = []
def __init__(self, wdir):
QObject.__init__(self)
PluginProcess.proc_list.append(self)
self.is_rebuild = False
self.is_query_fl = False
self.sig = QuerySignal()
self.proc = QProcess()
self.proc.finished.connect(self._finished_cb)
self.proc.error.connect(self._error_cb)
self.proc.setWorkingDirectory(wdir)
self.wdir = wdir
def _cleanup(self):
PluginProcess.proc_list.remove(self)
if self.err_str != '':
s = '' + self.p_cmd + '' + '
'.join(self.err_str.splitlines())
QMessageBox.warning(None, "Seascope", s, QMessageBox.Ok)
if self.res != '':
s = '' + self.p_cmd + '
Summary
' + self.res
QMessageBox.information(None, "Seascope", s, QMessageBox.Ok)
def _error_cb(self, err):
err_dict = {
QProcess.FailedToStart: 'FailedToStart',
QProcess.Crashed: 'Crashed',
QProcess.Timedout: 'The last waitFor...() function timed out',
QProcess.WriteError: 'An error occurred when attempting to write to the process',
QProcess.ReadError: 'An error occurred when attempting to read from the process',
QProcess.UnknownError: 'An unknown error occurred',
}
self.err_str = '' + self.p_cmd + '
' + err_dict[err]
self._cleanup()
def _finished_cb(self, ret):
res = self.proc.readAllStandardOutput().data().decode()
self.err_str = self.proc.readAllStandardError().data().decode()
#print 'output', res
#print 'cmd:', self.p_cmd
if self.is_rebuild:
self.res = res
self.sig.sig_rebuild.emit()
elif self.is_query_fl:
self.res = ''
res = self.parse_query_fl(res)
self.sig.sig_query_fl.emit(res)
else:
self.res = ''
self.sig.sig_result_dbg.emit(self.p_cmd, res, self.err_str)
try:
res = self.parse_result(res, self.sig)
except Exception as e:
print(e)
res = [['', '', '', 'error while parsing output of: ' + self.p_cmd]]
if res != None:
self.sig.emit_result(res)
self._cleanup()
def run_query_process(self, pargs, sym, rquery=None):
self.sig.sym = sym
self.sig.rquery = rquery
self.p_cmd = ' '.join(pargs)
if os.getenv('SEASCOPE_DEBUG'):
print(self.p_cmd)
self.proc.start(pargs[0], pargs[1:])
if self.proc.waitForStarted() == False:
return None
self.proc.closeWriteChannel()
return [self.sig.sig_result, self.sig.sig_result_dbg]
def run_rebuild_process(self, pargs):
self.is_rebuild = True
self.p_cmd = ' '.join(pargs)
self.proc.start(pargs[0], pargs[1:])
if self.proc.waitForStarted() == False:
return None
#print 'cmd:', pargs
self.sig.sig_rebuild.connect(CtagsCache.flush)
return self.sig.sig_rebuild
def run_query_fl(self, pargs):
self.is_query_fl = True
self.p_cmd = ' '.join(pargs)
self.proc.start(pargs[0], pargs[1:])
if self.proc.waitForStarted() == False:
return None
return self.sig.sig_query_fl
def parse_query_fl(self, text):
fl = []
for f in re.split('\r?\n', text.strip()):
if f == '':
continue
fl.append(os.path.join(self.wdir, f))
return fl
class PluginProcess(PluginProcessBase):
def __init__(self, wdir, rq):
PluginProcessBase.__init__(self, wdir)
if rq == None:
rq = ['', '']
self.cmd_str = rq[0]
self.req = rq[1]
def parse_result(self, text, sig):
text = re.split('\r?\n', text)
res = []
if self.cmd_str == 'GREP':
for line in text:
if line == '':
continue
line = [''] + line.split(':', 2)
res.append(line)
else:
assert(false)
res.append(['', '', '', 'PluginProcess.parse_result: FAILED'])
return res
qsig = CtagsCache.CtagsThread(sig).apply_fix(self.cmd_str, res, [''])
return qsig
if __name__ == '__main__':
import sys
def slot_result(sym, res):
print('slot_result: ', [str(sym), res])
sys.exit(0)
def slot_result_dbg(cmd, res, err_str):
err_str = err_str.decode()
print('slot_result_dbg:', [str(cmd), str(res).strip().split('\n'), str(err_str)])
def slot_rebuild():
print('slot_rebuild')
from PyQt5.QtCore import QCoreApplication
app = QCoreApplication(sys.argv)
qsig = PluginProcess('.').run_query_process(['ls'], 'ls')
#qsig = PluginProcess('/home/anil/prj/ss/lin').run_query_process(['cscope', '-q', '-k', '-L', '-d', '-0', 'vdso'], 'ls')
if qsig == None:
sys.exit(-1)
qsig[0].connect(slot_result)
qsig[1].connect(slot_result_dbg)
app.exec_()
seascope-0.9+8a669e0e/src/backend/plugins/__init__.py 0000664 0000000 0000000 00000000112 13632457771 0022310 0 ustar 00root root 0000000 0000000 # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
seascope-0.9+8a669e0e/src/backend/plugins/cscope/ 0000775 0000000 0000000 00000000000 13632457771 0021461 5 ustar 00root root 0000000 0000000 seascope-0.9+8a669e0e/src/backend/plugins/cscope/CscopeProject.py 0000664 0000000 0000000 00000011202 13632457771 0024572 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os, string, re
from ..PluginBase import PluginFeatureBase, ProjectBase, ConfigBase, QueryBase
from ..PluginBase import PluginProcess
class CscopeFeature(PluginFeatureBase):
def __init__(self):
PluginFeatureBase.__init__(self)
self.feat_desc = [
['REF', '0'],
['DEF', '1'],
['<--', '2'],
['-->', '3'],
['TXT', '4'],
['GREP','5'],
['FIL', '7'],
['INC', '8'],
['QDEF', '11'],
['CTREE','12'],
['CLGRAPH', '13'],
['CLGRAPHD', '14'],
['FFGRAPH', '14'],
['UPD', '25'],
]
self.ctree_query_args = [
['-->', '--> F', 'Calling tree' ],
['<--', 'F -->', 'Called tree' ],
['REF', '==> F', 'Advanced calling tree' ],
]
def query_dlg_cb(self, req, cmd_str, in_opt):
if req != '' and in_opt['substring']:
req = '.*' + req + '.*'
opt = None
if in_opt['ignorecase']:
opt = '-C'
res = (cmd_str, req, opt)
return res
class ConfigCscope(ConfigBase):
def __init__(self):
ConfigBase.__init__(self, 'cscope')
self.c_opt = []
def read_cs_files_common(self, filename):
fl = []
config_file = os.path.join(self.c_dir, filename)
if (os.path.exists(config_file)):
cf = open(config_file, 'r')
for f in cf:
f = f[:-1]
fl.append(f)
cf.close()
return fl
def read_cs_files(self):
self.c_flist = self.read_cs_files_common('cscope.files')
def write_cs_files_common(self, filename, fl):
if (len(fl) <= 0):
return
config_file = os.path.join(self.c_dir, filename)
cf = open(config_file, 'w')
for f in fl:
cf.write(f + '\n')
cf.close()
def write_cs_files(self):
self.write_cs_files_common("cscope.files", self.c_flist)
def get_config_file(self):
config_file = 'seascope.opt'
return os.path.join(self.c_dir, config_file)
def read_seascope_opt(self):
config_file = self.get_config_file()
if (not os.path.exists(config_file)):
return
cf = open(config_file, 'r')
for line in cf:
line = line.split('=', 1)
key = line[0].strip()
if (key == 'c_opt'):
self.c_opt = line[1].split()
cf.close()
def write_seascope_opt(self):
config_file = self.get_config_file()
cf = open(config_file, 'w')
cf.write('c_opt' + '=' + ' '.join(self.c_opt) + '\n')
cf.close()
def read_config(self):
self.read_seascope_opt()
self.read_cs_files()
def write_config(self):
self.write_seascope_opt()
self.write_cs_files()
def is_ready(self):
return len(self.c_flist) > 0
class ProjectCscope(ProjectBase):
def __init__(self):
ProjectBase.__init__(self)
@staticmethod
def _prj_new_or_open(conf):
prj = ProjectCscope()
prj.feat = CscopeFeature()
prj.conf = conf
prj.qry = QueryCscope(prj.conf, prj.feat)
return (prj)
@staticmethod
def prj_new(proj_args):
conf = ConfigCscope()
conf.proj_new(proj_args)
prj = ProjectCscope._prj_new_or_open(conf)
return (prj)
@staticmethod
def prj_open(proj_path):
conf = ConfigCscope()
conf.proj_open(proj_path)
prj = ProjectCscope._prj_new_or_open(conf)
return (prj)
def prj_settings_update(self, proj_args):
assert proj_args
self.prj_update_conf(proj_args)
return True
class CsProcess(PluginProcess):
def __init__(self, wdir, rq):
PluginProcess.__init__(self, wdir, rq)
self.name = 'cscope process'
def parse_result(self, text, sig):
text = re.split('\r?\n', text)
if self.cmd_str == 'FIL':
res = [ ['', line[0], '', ''] for line in text if line != '' ]
return res
res = []
for line in text:
if line == '':
continue
line = line.split(' ', 3)
line = [line[1], line[0], line[2], line[3]]
res.append(line)
return res
class QueryCscope(QueryBase):
def __init__(self, conf, feat):
QueryBase.__init__(self)
self.conf = conf
self.feat = feat
def query(self, rquery):
if (not self.conf or not self.conf.is_ready()):
print("pm_query not is_ready")
return None
cmd_str = rquery['cmd']
req = rquery['req']
opt = rquery['opt']
cmd_id = self.feat.cmd_str2id[cmd_str]
if opt == None or opt == '':
opt = []
else:
opt = opt.split()
pargs = [ 'cscope' ] + self.conf.c_opt + opt + [ '-L', '-d', '-' + str(cmd_id), req ]
qsig = CsProcess(self.conf.c_dir, [cmd_str, req]).run_query_process(pargs, req, rquery)
return qsig
def rebuild(self):
if (not self.conf.is_ready()):
print("pm_query not is_ready")
return None
pargs = [ 'cscope' ] + self.conf.c_opt + [ '-L' ]
qsig = CsProcess(self.conf.c_dir, None).run_rebuild_process(pargs)
return qsig
def query_fl(self):
fl = self.conf.get_proj_src_files()
return fl
def cs_is_open(self):
return self.conf != None
def cs_is_ready(self):
return self.conf.is_ready()
seascope-0.9+8a669e0e/src/backend/plugins/cscope/__init__.py 0000664 0000000 0000000 00000000654 13632457771 0023577 0 ustar 00root root 0000000 0000000 # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os
def name():
return 'cscope'
def is_your_prj(path):
f = os.path.join(path, 'cscope.files')
return os.path.exists(f)
def project_class():
from .CscopeProject import ProjectCscope
return ProjectCscope
def description():
d = 'Cscope supports C, lex, yacc files.\n'
d += 'Support for C++ and Java is limited.'
return d
priority = 500
seascope-0.9+8a669e0e/src/backend/plugins/gtags/ 0000775 0000000 0000000 00000000000 13632457771 0021312 5 ustar 00root root 0000000 0000000 seascope-0.9+8a669e0e/src/backend/plugins/gtags/GtagsProject.py 0000664 0000000 0000000 00000006714 13632457771 0024270 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os, string, re
from ..PluginBase import PluginFeatureBase, ProjectBase, ConfigBase, QueryBase
from ..PluginBase import PluginProcess
from ..CtagsCache import CtagsThread
class GtagsFeature(PluginFeatureBase):
def __init__(self):
PluginFeatureBase.__init__(self)
self.feat_desc = [
['REF', '-r'],
['DEF', ''],
#['<--', '2'],
['-->', '-r'],
#[ ['TXT', '4'],
['GREP','-g'],
['FIL', '-P'],
['INC', '-g'],
['QDEF', ''],
['CTREE','12'],
['CLGRAPH', '13'],
['CLGRAPHD', '14'],
['FFGRAPH', '14'],
['UPD', '25'],
]
self.ctree_query_args = [
['-->', '--> F', 'Calling tree' ],
#['<--', 'F -->', 'Called tree' ],
['REF', '==> F', 'Advanced calling tree' ],
]
def query_dlg_cb(self, req, cmd_str, in_opt):
if req != '' and in_opt['substring']:
req = '.*' + req + '.*'
opt = None
if in_opt['ignorecase']:
opt = '-i'
res = (cmd_str, req, opt)
return res
class ConfigGtags(ConfigBase):
def __init__(self):
ConfigBase.__init__(self, 'gtags')
class ProjectGtags(ProjectBase):
def __init__(self):
ProjectBase.__init__(self)
@staticmethod
def _prj_new_or_open(conf):
prj = ProjectGtags()
prj.feat = GtagsFeature()
prj.conf = conf
prj.qry = QueryGtags(prj.conf, prj.feat)
return (prj)
@staticmethod
def prj_new(proj_args):
d = proj_args[0]
prj = ProjectGtags.prj_open(d)
return None
@staticmethod
def prj_open(proj_path):
conf = ConfigGtags()
conf.proj_open(proj_path)
prj = ProjectGtags._prj_new_or_open(conf)
return (prj)
class GtProcess(PluginProcess):
def __init__(self, wdir, rq):
PluginProcess.__init__(self, wdir, rq)
self.name = 'gtags process'
def parse_result(self, text, sig):
text = re.split('\r?\n', text)
if self.cmd_str == 'FIL':
res = [ ['', line.split(' ')[0], '', '' ] for line in text if line != '' ]
return res
res = []
for line in text:
if line == '':
continue
line = line.split(' ', 3)
line = ['', line[0], line[2], line[3]]
res.append(line)
CtagsThread(sig).apply_fix(self.cmd_str, res, [''])
return None
class QueryGtags(QueryBase):
def __init__(self, conf, feat):
QueryBase.__init__(self)
self.conf = conf
self.feat = feat
def query(self, rquery):
if (not self.conf):
#or not self.conf.is_ready()):
print("pm_query not is_ready")
return None
cmd_str = rquery['cmd']
req = rquery['req']
opt = rquery['opt']
if opt == None or opt == '':
opt = []
else:
opt = opt.split()
cmd_opt = self.feat.cmd_str2id[cmd_str]
pargs = [ 'global', '-a', '--result=cscope', '-x' ] + opt
if cmd_opt != '':
pargs += [ cmd_opt ]
pargs += [ '--', req ]
qsig = GtProcess(self.conf.c_dir, [cmd_str, req]).run_query_process(pargs, req, rquery)
return qsig
def rebuild(self):
if (not self.conf.is_ready()):
print("pm_query not is_ready")
return None
if (os.path.exists(os.path.join(self.conf.c_dir, 'GTAGS'))):
pargs = [ 'global', '-u' ]
else:
pargs = [ 'gtags', '-i' ]
qsig = GtProcess(self.conf.c_dir, None).run_rebuild_process(pargs)
return qsig
def query_fl(self):
if not os.path.exists(os.path.join(self.conf.c_dir, 'GTAGS')):
return []
pargs = [ 'global', '-P', '-a' ]
qsig = GtProcess(self.conf.c_dir, None).run_query_fl(pargs)
return qsig
def gt_is_open(self):
return self.conf != None
def gt_is_ready(self):
return self.conf.is_ready()
seascope-0.9+8a669e0e/src/backend/plugins/gtags/__init__.py 0000664 0000000 0000000 00000000722 13632457771 0023424 0 ustar 00root root 0000000 0000000 # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os
def name():
return 'gtags'
def is_your_prj(path):
f = os.path.join(path, 'GTAGS')
return os.path.exists(f)
def project_class():
from .GtagsProject import ProjectGtags
return ProjectGtags
def description():
d = 'GNU global/gtags supports C, C++, Yacc, Java, PHP and Assembly source files.\n'
d += '\nSeascope uses ctags to enhance the results.'
return d
#priority = 200
seascope-0.9+8a669e0e/src/backend/plugins/idutils/ 0000775 0000000 0000000 00000000000 13632457771 0021662 5 ustar 00root root 0000000 0000000 seascope-0.9+8a669e0e/src/backend/plugins/idutils/IdutilsProject.py 0000664 0000000 0000000 00000010175 13632457771 0025204 0 ustar 00root root 0000000 0000000 #!/usr/bin/env python3
# Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import sys, os, string, re
from ..PluginBase import PluginFeatureBase, ProjectBase, ConfigBase, QueryBase
from ..PluginBase import PluginProcess
from ..CtagsCache import CtagsThread
class IdutilsFeature(PluginFeatureBase):
def __init__(self):
PluginFeatureBase.__init__(self)
self.feat_desc = [
['REF', ''],
['DEF', ''],
#['<--', '2'],
['-->', '3'],
#['TXT', '4'],
['GREP', ''],
['FIL', ''],
['INC', '8'],
['QDEF', ''],
['CTREE', '12'],
['CLGRAPH', '13'],
['CLGRAPHD','14'],
['FFGRAPH', '14'],
['UPD', '25'],
]
self.ctree_query_args = [
['-->', '--> F', 'Calling tree' ],
#['<--', 'F -->', 'Called tree' ],
['REF', '==> F', 'Advanced calling tree' ],
]
def query_dlg_cb(self, req, cmd_str, in_opt):
opt = []
if cmd_str != 'TXT' and req != '' and in_opt['substring']:
opt.append('substring')
if cmd_str == 'FIL':
req = '*' + req + '*'
else:
req = '.*' + req + '.*'
if in_opt['ignorecase']:
opt.append('ignorecase')
res = (cmd_str, req, opt)
return res
class ConfigIdutils(ConfigBase):
def __init__(self):
ConfigBase.__init__(self, 'idutils')
class ProjectIdutils(ProjectBase):
def __init__(self):
ProjectBase.__init__(self)
@staticmethod
def _prj_new_or_open(conf):
prj = ProjectIdutils()
prj.feat = IdutilsFeature()
prj.conf = conf
prj.qry = QueryIdutils(prj.conf, prj.feat)
return (prj)
@staticmethod
def prj_new(proj_args):
d = proj_args[0]
prj = ProjectIdutils.prj_open(d)
return prj
@staticmethod
def prj_open(proj_path):
conf = ConfigIdutils()
conf.proj_open(proj_path)
prj = ProjectIdutils._prj_new_or_open(conf)
return (prj)
class IdProcess(PluginProcess):
def __init__(self, wdir, rq):
PluginProcess.__init__(self, wdir, rq)
self.name = 'idutils process'
def parse_result(self, text, sig):
if self.cmd_str in ['GREP']:
return PluginProcess.parse_result(self, text, sig)
#from datetime import datetime
#t1 = datetime.now()
text = re.split('\r?\n', text)
#t2 = datetime.now()
#print 'parse-split', t2 - t1
if self.cmd_str == 'FIL':
res = [ ['', os.path.join(self.wdir, line), '', '' ] for line in text if line != '' ]
return res
res = []
for line in text:
if line == '':
continue
line = line.split(':', 2)
line = ['', os.path.join(self.wdir, line[0]), line[1], line[2]]
res.append(line)
#t3 = datetime.now()
#print 'parse-loop', t3 - t2
CtagsThread(sig).apply_fix(self.cmd_str, res, [''])
return None
class QueryIdutils(QueryBase):
def __init__(self, conf, feat):
QueryBase.__init__(self)
self.conf = conf
self.feat = feat
def query(self, rquery):
if (not self.conf):
#or not self.conf.is_ready()):
print("pm_query not is_ready")
return None
cmd_str = rquery['cmd']
if cmd_str in ['GREP']:
return QueryBase.query(self, rquery)
req = rquery['req']
opt = rquery['opt']
if opt == None:
opt = []
pargs = ['lid', '-R', 'grep']
if cmd_str == 'FIL':
pargs = ['fnid', '-S', 'newline']
#elif cmd_str == 'TXT':
#pargs += ['-l']
elif 'substring' in opt:
#req = '.*' + req + '.*'
#pargs += ' -s'
pass
elif cmd_str in ['-->', '<--']:
pargs += ['-l']
if cmd_str != 'FIL':
if 'ignorecase' in opt:
pargs += ['-i']
pargs += [ '--', req ]
qsig = IdProcess(self.conf.c_dir, [cmd_str, req]).run_query_process(pargs, req, rquery)
return qsig
def rebuild(self):
if (not self.conf.is_ready()):
print("pm_query not is_ready")
return None
pargs = os.getenv('SEASCOPE_IDUTILS_MKID_CMD', '').strip().split()
if not len(pargs):
pargs = [ 'mkid', '-s' ]
qsig = IdProcess(self.conf.c_dir, None).run_rebuild_process(pargs)
return qsig
def query_fl(self):
if not os.path.exists(os.path.join(self.conf.c_dir, 'ID')):
return []
pargs = [ 'fnid', '-S', 'newline', '-f', 'ID' ]
qsig = IdProcess(self.conf.c_dir, None).run_query_fl(pargs)
return qsig
def id_is_open(self):
return self.conf != None
def id_is_ready(self):
return self.conf.is_ready()
seascope-0.9+8a669e0e/src/backend/plugins/idutils/__init__.py 0000664 0000000 0000000 00000001740 13632457771 0023775 0 ustar 00root root 0000000 0000000 # Copyright (c) 2010 Anil Kumar
# All rights reserved.
#
# License: BSD
import os
def name():
return 'idutils'
def is_your_prj(path):
f = os.path.join(path, 'ID')
return os.path.exists(f)
def project_class():
from .IdutilsProject import ProjectIdutils
return ProjectIdutils
def description():
d = 'Preferred backend of seascope.\n'
d += 'Some advanced features of seascope are available only with this backend\n'
d += '\n'
d += 'It\'s really "idutils + ctags" backend.\n'
d += ' - idutils provides the indexing facility\n'
d += ' - ctags provides the language intelligence\n'
d += 'This backend combines both of these intelligently to provide superior source code browsing facility\n'
d += '\n'
d += 'A wide variety of languages are supported (ctags --list-languages)\n'
d += 'For example C, C++, Java, Python etc\n'
d += '\n'
d += 'If your source files are not being indexed by idutils then configure it using /usr/share/id-lang.map\n'
return d
priority = 800
seascope-0.9+8a669e0e/src/icons/ 0000775 0000000 0000000 00000000000 13632457771 0016250 5 ustar 00root root 0000000 0000000 seascope-0.9+8a669e0e/src/icons/codeview.png 0000664 0000000 0000000 00000001072 13632457771 0020563 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR óÿa sBIT|dˆ pHYs
×
×B(›x tEXtSoftware www.inkscape.org›î< ·IDAT8“1‹Q…¿—Dœd`3Å
Ûµ™Âba›ÒmbþA •aþˆl©…ÙB™VÂ
[ˆ†Àfw…;ÍI0섉³Éµy“!)ôÀ…Çyçžwî…§D„Ä>°§Ï7}È6`¹kà7°§”:‘'‰mÛö«étzÜÝa°,—Ë'“Éä21°f³ÙsàØ5“Òšc`™5ȉÈ
°F'Žãܦ;}ß/T«Õ#I£ä.=ïˆÇù¼Þ÷ûý³b±øTs‘Ö$Q:©Xp¿Ùlöz½×«Õ
‘ Nç`Û±*•Js<¿Ð;Y*¥>¦t€KÃ0–Àz«AVËAð#Žã¼¦¾§wbFÜn·Ïù¶ð<¯?gFãa÷D䛈s`²50¨×ë×¾ï?kµZÀg¥Ô[ i‰0—1ˆºÝî>ð0-Ëxž÷Ss§º6 ô_x`šæËÅbQ FF_K¥Òm†ï€_Ùs×u¯LÓõ+Ÿ2ujšfèºî0ß– 5àN6¦F²¸°Êü7þj²“‰î÷B IEND®B`‚ seascope-0.9+8a669e0e/src/icons/copy.png 0000664 0000000 0000000 00000001025 13632457771 0017726 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR óÿa sBIT|dˆ pHYs
×
×B(›x tEXtSoftware www.inkscape.org›î< ’IDAT8…“½nQ…¿YmÀkK)‹ˆŽÂIe+-Ï@KAEA“b‘[reÉt.x^€‚7 ¢‹hì"î¢H¸H¤ÜÅŠ³‡‚»ÑõÕ#fFçΙsÿL‘¥À#`°\k`‹¤Øò<Ÿ—ÀÏ¿Ìó|.é@)0 —$É'I•Ÿ›™YRUÕK`•6É–TZ,ûýþmݹ\.÷ƒÁkIv¿½Zv·Û}|—tœ§’Ž%%’ÌÇã ;’d©gÚ_¯×/€?lãcé·¡ ®±{éxÙW@4Y#€ò_ÿ ØÁB‚Í_r‹âŽ‚$jÚ„ùp8|ô€C çëpæ¯äÐÌÞHš·Û퓲,÷€ð0²È²ìÖ9÷X5*(Šâ<Ë²àøøY–e7EQœóç9+Tð`4}žÍf€§ÑÕ¶À7`[ô:Î+ç\
<Zq—™m«ªz¬žxê‹ëÉdr1N;ç¾ÄÍVën<ÿ¨eïûÏ”Ïü¡ýWvü¹.Òdo½;3 IEND®B`‚ seascope-0.9+8a669e0e/src/icons/cut.png 0000664 0000000 0000000 00000001344 13632457771 0017553 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR óÿa sBIT|dˆ pHYs
×
×B(›x tEXtSoftware www.inkscape.org›î< aIDAT8u“ÁK“qÇ?¿÷uàtó7ó –¬¹ Ád0ËË
A˜I„°þ žúJ"‘n£C
Ü¡ƒÐ›ƒÂ×ì¢Õa b l4„X°¹“ž.ïd.{à¹<ßçûåû}àQ"‚S.à2p
ìg€SÊÁ›¼
`Ô-´Ösápxèäßò‡ÃáIõ8›ŠHæif”R[ÉdrHDšë°æd29¤”Ú2M3#"áV/) ëv»—D¤WD”Ó½n·{ È×"¬ñê#æçç×r¥R¹FG€ #ŽT*•~¥Tiaaá#P¸(‚‘ÁX,öX5cÝ¶íµµµë†a¬«cccODd ŽsN iÉf³w].ײRêýôôtÜëõ¾ >´¶¶¾ÉårwnCSåˑH$;33Ó·½½íÓZ·‹Å~à×ìììF(Ê¿Ï1 "®B¡0jYÖ½¶¶¶§@:
=¯V«·DÄlÜ¿H éÈçó7•RiÓ4_f2™"â»h×hˆ > 3‹Ýƒ?vvv¾äóùŸ@—ƒéÿEð%‰QÃ0V€M`yqqñáøøø#à°iÆJ"‘wSïÀ›J¥¦&&&6Òéô+`¯X,憇‡¿Ÿãñøc¿ßÿ.•JMÞIÕ=SŸÇ㹉DNwww»NNN
‡‡‡oº»»ã"ÒæñxöËå².•Ji 矩dYVþøø¸Ãçó•lÛ>ÐZilÛ>èéé©´··_²,+”.r €«À #üøî`W€À`ØÃy÷¿ }úê® IEND®B`‚ seascope-0.9+8a669e0e/src/icons/find-replace.png 0000664 0000000 0000000 00000001362 13632457771 0021311 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR óÿa sBIT|dˆ pHYs
×
×B(›x tEXtSoftware www.inkscape.org›î< oIDAT8u’ßKÓQÆ?g;ÎoßEµl
kk).»$Ì A¢‹.²+‚ òJºíÆØ`Pý¼0FWÔ†å…`VR¶ÈR(‰`nÐzº™±Lx9œ÷|à¼Ïk$Q¡-ÀfÀ€<ð“$ IVR´©©éœµö¹1fÎóÑZû4™Lž’T+ÉWîý§VM4^欵/ëëëïÅãñ´µö50‡SeȺ€---½ÀÛ†††³³³g%tjzzú|$Io»ººŽK
®Øe®®~433sZRMEC|||¼Ï“u]÷ФÈZ€pJ¥Ò¦x<žkll||¯Ñ§ŽŽŽWápøs±XÜÖÎÐr]wiaa¡¬¬¹7ÅbñG>Ÿÿ
…–ÊÉü#P¨Í-//Ǻ»»!À”k»çyÉB¡°-‘H|(Çú_ŒÁt:}ÒçóÝñûý<Ï;½¸¸¸/—Ë5¶µµõcwGFFº$mÚ(ƺT*uÁï÷ßžc²Æ˜qàp¸F/·I
WLy}À©©©ƒCCC¡ÉÉÉ®ë–Z[[¿õ÷÷/ŽŽ:ƒƒƒG€P{{ûÈÄÄÄcà+ð°ª°Øü¾ïæç盉ı••¨ëì켕ÍfŸ _‘äHŠIÚ-isù¬ô1I{2™LŸëº)à2p?™Lž”Tƒ¤X ¸®IÚ·IJd2™3Žã\«ªªnJÚkš››¿¬þa#¼÷<ÏŒêé驸 ,Ipø
<—¬zð°b@+ðxýí³9t9» IEND®B`‚ seascope-0.9+8a669e0e/src/icons/go-jump.png 0000664 0000000 0000000 00000001123 13632457771 0020331 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR óÿa sBIT|dˆ pHYs
×
×B(›x tEXtSoftware www.inkscape.org›î< ÐIDAT8¥“AˆRQ†¿÷žútz•TS‹aÀv…Caꈋ6‚¸±p¶nÛÊ•àÖM» wB[Iƒn¢‡ŒÑìd“äÕIãx™ÓB›Õ‹~¸ðîåç|‡s5áäqùî2paágÀ8N7g8Ž4Mûlšæ›|>ÿ@DÖ5—[š¦½^x0ý~ÿþx<~¦»D;Žó¢Ùl¾J§Óo_J©ín·k¹E@D|"r±Ñh¤=`ïààà–Û!Li"‘8€Ïç“ XJ“eáfç”R7€3!êlÀ`Ú¢ö ײÙì®eYÏu@/‹W—^¯wŽ ”ÚŒD" €V«õ.œÔëõë¹\îñp8Üú¶m›•Je·ZÞ&º®ŸZ–…X‹F£ñv»ý ‹Îf3½Óé<‘cà# ápø%óA~¾&“É~0{ B¡ÐoÛ¶?-½aƒÁ`ßqc± `YÖ4ÿ,
‡Àå&Þ®Õjw 2™Ìû9•Ú)•JçËåò¥”g4}0MsbFÑÙ·ÕEÙ‘›"¢,ν^¯÷$•J=‘mÑWîÜü…KÀ]àÂÿ/ý°ËbXà, IEND®B`‚ seascope-0.9+8a669e0e/src/icons/paste.png 0000664 0000000 0000000 00000001007 13632457771 0020070 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR óÿa sBIT|dˆ pHYs
×
×B(›x tEXtSoftware www.inkscape.org›î< „IDAT8•’AKã@ …¿‰-Øé¥´°¯‚©°¨Ù=ïÍûþÿB)äxñxô ì}ñh@؃‚â¡!–e]ÐÆ6jž'5ôÁ#óæ%oÞÌIHªHjGQ´†á:ð¯È0×£(Z“´$©ê¾7øÔjµvßÀ_àBÒNFàÂÍÆž¤v`$¬xžw¨g!ž±Ìþ¸§1ÆTÓ4ý\TœáIºÍi€kJ )<ÇÔËy`úNšÍæ°”o€3Ó²U‹F_€z1 áeÿ ôûýŸ¾ïÏBƒ×ét¶ÿ€™0ÆL%Í5ð}ÿ8Ïé
à[þbƒâîJôô#eHÞ
˜ï˜k]cZ«ÕƼ¾²·f^pÓív¯µw®b$½^¯
¬ft:óf¿ò° l Õz½ÞŽã¸|s«O€_ÖÚ‡ñx| \e
S`øÁÐZÇÀQŽÇÖÚ8‚!p“oP<—-à3P-9ƒ{à8ž DôÂZC~Úì IEND®B`‚ seascope-0.9+8a669e0e/src/icons/redo.png 0000664 0000000 0000000 00000001056 13632457771 0017711 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR óÿa sBIT|dˆ pHYs
×
×B(›x tEXtSoftware www.inkscape.org›î< «IDAT8Å“?kZq†Ÿ{½þÁ.RÚ¯‰E›[S(qÉà*‚
v° àVE©›_@DŠ‹`Àݵ’ÁîR‘@’El¥`[)m¥&ü’rO—kÉ%Xè‡÷<Ëy&"¬SúZÛÿ`ÜÀë¼WäÎV ð;¦Ÿ€íÌ]ÀÆb±ðçóù‡ý~ÿñ|>)¥¢çör¹|‚ˆÜ«V«{‘HäU x#"÷EGþJ¥òÌ0Œ0FÀ)p
…Ú"BDÂáp¸ï-Ëz!""b8V«õÒår½WŠÇã¯EäŽÌ›Íæ®ë#àÃx<~jšæó^¯÷H)µ].—7kµZ¸+E£ÑO€2€ót:=Èf³[NÇ~Íf³d*•Ú×4íBD¼ÀWàð74Édòó
0i·ÛÇÁ`P5-Û¶ šˆ¸ Ã0ìb±85Mów¡PxËå¾—Ú•$º½Á`°S¯×}ÃáÐ;N}–e% U*•Îc±Ø) Ýnw7“ɼ&Ú5Q6mà.pË9ë7àÄé5À>ê:ÀêÿÿÂÚ€?”;·ŒÒ 9 IEND®B`‚ seascope-0.9+8a669e0e/src/icons/save.png 0000664 0000000 0000000 00000001060 13632457771 0017711 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR óÿa sBIT|dˆ pHYs
×
×B(›x tEXtSoftware www.inkscape.org›î< IDAT8“1‹Q…¿;ÉJ&…ň,b³I5ÃQlü©l[‚àÿ`·XÇÒBHc•RdAa‹‘Ûˆà²n¥6Ë2ÝÝ‹™ÑÇ$8<ç¾óî½ï>“Ô®WcN€ŸÀùª*mA°?Öð8‚]I›’¨Ó$u<Ï{#颼3³Ær¹| |qbÐLRh>Ÿ¿
Ãð¬:™¦éFE$YYÞ–cœßÔö€=IÛ’