⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generators.py

📁 tinyos2.0版本驱动
💻 PY
字号:
# Copyright (c) 2005 Intel Corporation# All rights reserved.## This file is distributed under the terms in the attached INTEL-LICENSE     # file. If you do not find these files, copies can be found by writing to# Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA, # 94704.  Attention:  Intel License Inquiry.# Two groups of functions# A) Some functions to generate strings or HTML for various nesdoc entities#    (end in _str or _html respectively)# B) Utility functions and values for the nesdoc XML formatfrom xml.dom.minidom import *from string import *from nesdoc.utils import *# All possible tags for typestype_tags = [  "type-int",  "type-float",  "type-complex-int",  "type-complex-float",  "type-void",  "type-qualified",  "type-pointer",  "type-array",  "type-function",  "type-tag",  "type-interface",  "type-component",  "type-var" ]# Return the long nesdoc string in x. If none is present, return the short# nesdoc string. If no nesdoc string at all, return None.def nd_doc_long(x):  doc = xml_tag(x, "documentation")  if not doc:    return None  str = xml_tag(doc, "long")  if not str:    str = xml_tag(doc, "short")  return xml_text(str)# Return the short nesdoc string in x. None if none present.def nd_doc_short(x):  doc = xml_tag(x, "documentation")  if not doc:    return None  return xml_text(xml_tag(doc, "short"))# find the first docstring in 's' at or after 'index'# a docstring is an @ preceded by whitespace and followed by# at least one letterdef _find_docstring_tag(s, index):  while True:    at = find(s, "@", index)    if at <= 0: return at    if at == len(s) - 1: return -1    if s[at - 1].isspace() and s[at + 1].isalpha(): return at    index = at + 1# process a docstring s. returns a tuple of#  - base documentation#  - list of (tag, description) pairs (in the same order as in s)def nd_docstring(s):  tags = []  at = _find_docstring_tag(s, 0)  if at < 0:    return (s, tags)  base = s[:at]  while at >= 0:    # find end of tag    tagend = at + 1    while tagend < len(s) and not s[tagend].isspace():      tagend += 1    nextat = _find_docstring_tag(s, tagend)    if nextat == -1:      tagvalend = len(s)    else:      tagvalend = nextat    tags.append((s[at + 1:tagend], s[tagend + 1:tagvalend]))    at = nextat  return (base, tags)# return a string for contstant cstr (from a nesdoc XML constant attribute)def nd_constant_str(cstr):  if cstr[0] == 'I' or cstr[0] == 'F':    return cstr[1:]  elif cstr[0] == 'S':    # XXX: should do a lot more.    s = cstr[1:].replace('"', '\\"')    return '"' + s + '"'  elif cstr[0] == 'U':    return "/* unknown */"  elif cstr[0] == 'V':    return "/* not-constant */"  else:    assert False# Type encoders for the various kinds of typesdef _typename_simple(xmltype, name, quals, isstar):  return (quals + xmltype.getAttribute("cname"), name)def _typename_void(xmltype, name, quals, isstar):  return (quals + "void", name)def _typename_qualified(xmltype, name, quals, isstar):  silly = [quals]  def add_qualifier(q):    if xmltype.hasAttribute(q):      silly[0] += q + " "  add_qualifier("volatile")  add_qualifier("const")  add_qualifier("__restrict")  return typename_full(xml_tagset(xmltype, type_tags), name, silly[0], isstar)def _typename_ptr(xmltype, name, quals, isstar):  name = "*" + quals + name  return typename_full(xml_tagset(xmltype, type_tags), name, "", True)def _typename_array(xmltype, name, quals, isstar):  assert quals == ""  if isstar:    name = "(" + name + ")"  size = xml_tag(xmltype, "elements")  if size == "V":    name += "[]"  else:    name += "[%s]" % constant_str(size)  return typename_full(xml_tagset(xmltype, type_tags), name, "", False)def _typename_tag(xmltype, name, quals, isstar):  tagref = xml_idx(xmltype, 0)  # the embedded element is named <tagkind>-ref  head = "%s %s" % (tagref.tagName[:-4], tagref.getAttribute("name"))  return (quals + head, name)def _typename_var(xmltype, name, quals, isstar):  varref = xml_idx(xmltype, 0)  return (quals + varref.getAttribute("name"), name)def _typename_fn(xmltype, name, quals, isstar):  returntype = xml_idx(xmltype, 0)  parameters = xml_idx(xmltype, 1)  if isstar:    name = "(" + name + ")"  args = ""  if parameters != None:    for x in parameters.childNodes:      if x.nodeType == Node.ELEMENT_NODE:        ptype = typename_str(x, "")        if args != "":          args = args + ", "        args += ptype    if xmltype.hasAttribute("varargs"):      args += ", ..."  name += "(" + args + ")"  if quals != "":    name += quals[:-1] # remove trailing space  return typename_full(returntype, name, "", False)_type_printers = {  "type-int" : _typename_simple,  "type-float" : _typename_simple,  "type-complex-int" : _typename_simple,  "type-complex-float" : _typename_simple,  "type-void" : _typename_void,  "type-qualified" : _typename_qualified,  "type-pointer" : _typename_ptr,  "type-array" : _typename_array,  "type-function" : _typename_fn,  "type-tag" : _typename_tag,  "type-interface" : _typename_tag,  "type-component" : _typename_tag,  "type-var" : _typename_var  };# Return a (head, body) pair for type xmltype, declaring name (a string)# with type qualifiers quals (a string). isstar should be true if name# starts with a *.# The user-friendly representation for this type is head + " " + bodydef typename_full(xmltype, name, quals, isstar):  # hack around nesC 1.2.1 schema bug (uses typedef, not typename here)  tdef = xml_tagset(xmltype, ["typedef", "typename"])  if tdef:    return (quals + xml_tag(tdef, "typedef-ref").getAttribute("name"), name)  else:    return _type_printers[xmltype.tagName](xmltype, name, quals, isstar)# Return a user-friendly string for a C declaration of name with type xmltypedef typename_str(xmltype, name):  (head, body) = typename_full(xmltype, name, "", False)  if body == "":    return head  else:    return head + " " + body# Return a user-friendly string for a parameter listdef parameter_str(xmlparameters):  args = ""  if xmlparameters != None:    for parm in xmlparameters.childNodes:      if parm.nodeType == Node.ELEMENT_NODE:        if args != "":          args = args + ", "        if parm.tagName == "variable" or parm.tagName == "constant":          vtype = xml_tagset(parm, type_tags)          args += typename_str(vtype, parm.getAttribute("name"))        elif parm.tagName == "typedef":          args += "typedef " + parm.getAttribute("name")        elif parm.tagName == "varargs":          args += ", ..."  return "(" + args + ")"# Return a user-friendly string for function xmlfn. The namedecorator# function is called with the xmlfn's name as argument to get the final# form of the function's name. Use this to, e.g., make the name an HTML link.def function_signature_str(xmlfn, namedecorator):  sig = ""  if xmlfn.hasAttribute("command"):    sig += "command "  if xmlfn.hasAttribute("event"):    sig += "event "  type = xml_tag(xmlfn, "type-function")  returntype = xml_idx(type, 0)  name = xmlfn.getAttribute("name")  parameters = xml_tag(xmlfn, "parameters")  return sig + typename_str(returntype, namedecorator(name) + parameter_str(parameters))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -