Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/giscanner
diff options
context:
space:
mode:
Diffstat (limited to 'giscanner')
-rw-r--r--giscanner/glibtransformer.py5
-rw-r--r--giscanner/transformer.py41
-rw-r--r--giscanner/utils.py11
3 files changed, 42 insertions, 15 deletions
diff --git a/giscanner/glibtransformer.py b/giscanner/glibtransformer.py
index 61d4cef..0f5b0c9 100644
--- a/giscanner/glibtransformer.py
+++ b/giscanner/glibtransformer.py
@@ -640,7 +640,10 @@ class GLibTransformer(object):
def _introspect_enum(self, node):
members = []
for member in node.findall('member'):
- members.append(GLibEnumMember(member.attrib['nick'],
+ # Keep the name closer to what we'd take from C by default;
+ # see http://bugzilla.gnome.org/show_bug.cgi?id=575613
+ name = member.attrib['nick'].replace('-', '_')
+ members.append(GLibEnumMember(name,
member.attrib['value'],
member.attrib['name'],
member.attrib['nick']))
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index 9aebbd8..2746b6e 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -37,7 +37,7 @@ from .sourcescanner import (
CSYMBOL_TYPE_ENUM, CSYMBOL_TYPE_UNION, CSYMBOL_TYPE_OBJECT,
CSYMBOL_TYPE_MEMBER, CSYMBOL_TYPE_ELLIPSIS, CSYMBOL_TYPE_CONST,
TYPE_QUALIFIER_CONST)
-from .utils import strip_common_prefix, to_underscores
+from .utils import to_underscores
_xdg_data_dirs = [x for x in os.environ.get('XDG_DATA_DIRS', '').split(':') \
+ [DATADIR, '/usr/share'] if x]
@@ -208,11 +208,46 @@ class Transformer(object):
raise NotImplementedError(
'Transformer: unhandled symbol: %r' % (symbol, ))
+ def _enum_common_prefix(self, symbol):
+ def common_prefix(a, b):
+ alen = len(a)
+ blen = len(b)
+ l = min(alen, blen)
+ for i in xrange(l):
+ if a[i] != b[i]:
+ return a[:i]
+ if alen > blen:
+ return b
+ return a
+ # Nothing less than 2 has a common prefix
+ if len(list(symbol.base_type.child_list)) < 2:
+ return None
+ prefix = None
+ for child in symbol.base_type.child_list:
+ if prefix is None:
+ prefix = child.ident
+ else:
+ prefix = common_prefix(prefix, child.ident)
+ if prefix == '':
+ return None
+ return prefix
+
def _create_enum(self, symbol):
+ prefix = self._enum_common_prefix(symbol)
+ if prefix:
+ prefixlen = len(prefix)
+ else:
+ prefixlen = 0
members = []
for child in symbol.base_type.child_list:
- name = strip_common_prefix(symbol.ident, child.ident).lower()
- members.append(Member(name,
+ if prefixlen > 0:
+ name = child.ident[prefixlen:]
+ else:
+ # Ok, the enum members don't have a consistent prefix
+ # among them, so let's just remove the global namespace
+ # prefix.
+ name = self.remove_prefix(child.ident)
+ members.append(Member(name.lower(),
child.const_int,
child.ident))
diff --git a/giscanner/utils.py b/giscanner/utils.py
index 021ffea..d2752e7 100644
--- a/giscanner/utils.py
+++ b/giscanner/utils.py
@@ -57,14 +57,3 @@ def extract_libtool(libname):
# and pre-2.2. Johan 2008-10-21
libname = libname.replace('.libs/.libs', '.libs')
return libname
-
-
-def strip_common_prefix(first, second):
- max_index = second.rfind('_')
- second_len = len(second)
- second = second.replace('_', '')
- max_index -= second_len - len(second) - 1
- for i, c in enumerate(first.upper()):
- if i >= len(second) or c != second[i] or i == max_index:
- return second[i:]
- return second[i + 1:]