+cdef object kname_re = re.compile(r'^([^.].*?)(?<!\\)(?:\.(.*?))?(?<!\\)@([^@]*)$')
+
+cdef object kname_parse(fullname):
+ """Parse a krb4-style principal into a name, instance, and realm."""
+ cdef object re_match = kname_re.match(fullname)
+ if not re_match:
+ return None
+ else:
+ princ = re_match.groups()
+ return tuple([re.sub(r'\\(.)', r'\1', x) if x else x for x in princ])
+
+cdef object kname_unparse(name, inst, realm):
+ """Unparse a name, instance, and realm into a single krb4
+ principal string."""
+ name = re.sub('r([.\\@])', r'\\\1', name)
+ inst = re.sub('r([.\\@])', r'\\\1', inst)
+ realm = re.sub(r'([\\@])', r'\\\1', realm)
+ if inst:
+ return '%s.%s@%s' % (name, inst, realm)
+ else:
+ return '%s@%s' % (name, realm)
+