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

📄 archive.py

📁 tinyos2.0版本驱动
💻 PY
字号:
# -*- python -*-# 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.# Archive nesdoc information from a given compilation in a nesdoc repository.## A nesdoc repository is a directory containing separate XML files for each# known interface and component (in the "interfaces" and "components"# subdirectories respectively). These files have basically the same format# as a single interfacedef and component element from the nesC XML dump# format, with the following changes:#  - all "interfacedef", "interfacedef-ref", "component" and "component-ref"#    elements have an extra "nicename" attribute which stores the full#    `package name' for the corresponding element (see below for details)#  - components have two extra sub-elements:#    o "specification": a list of the "interface" and "function"#       elements that form the components specification#    o "referenced": the "interface" and "function" elements referenced#      from the wiring graph#      the "component" elements referenced from these "interface" and#      "function" elements#      (but the "referenced" list excludes self-references, i.e., the#      component itself and the "interface" and "function" elements#      already found in "specification")# A `package name' is a component or interface name prefixed with its path# relative to a set of "top directories", and with path separators replaced# by dots. The root of a TinyOS installation is usually the single top# directory, but more can be specified with the -topdir option.from xml.dom import *from xml.dom.minidom import *from sys import *from getopt import getoptfrom string import *from nesdoc.utils import *from nesdoc.graph import generate_graphfrom nesdoc.html import *import osdef check(x):  if not x:    print "%s is not a nesC documentation file" % argv[1]    exit(2)  return xdef get1(x, tag):  return check(xml_tagfind(x, tag))def usage():  print "Usage: %s [-t dir] [--topdir dir] [--preserve] [--app] [--quiet] repository" % argv[0]  print "  where -t/--topdir specify prefixes to remove from file names"  print "  to create nice, package-like names for interface and components"  print "  (based on their full filename)."  print "  If --preserve is specified, existing XML files are preserved."  print "  If --app is specified, a page for this application is created in the"  print "  current directory."  print "  If --quiet is specified, the program is less verbose."  print "  The XML input is read from stdin."# Return package name for elem, or None if no valid name is found# (i.e., if the element's file name does not match any known topdir)def packagename(elem):  loc = elem.getAttribute("loc")  colon = index(loc, ":")  filename = canonicalise(loc[colon + 1:])  for dir in topdirs:    dirlen = len(dir)    if filename[0:dirlen] == dir:      filename = filename[dirlen:]      break  if filename[0] == "/":    return None  else:    return replace(replace(filename, ".nc", ""), "/", ".")# simplify file names (for generating package names, so no need to# preserve path validity):#  empty strings become ./#  windows paths are made unix-like:#    c: becomes /c/#    all \ become /def canonicalise(name):  if name == "":    name = "."  if (name[1:2] == ":"): # windows disk names    name = "/%s/%s" %(name[0], name[2:])  name = replace(name, "\\", "/")  return name  # canonicalise a directory. like canonicalise, but ensures# there is trailing /def canonicalisedir(dirname):  dirname = canonicalise(dirname)  if dirname[-1] != "/":    return dirname + "/"  else:    return dirname# option processing. See usage string for details.(opts, args) = getopt(argv[1:], "t:", [ "topdir=", "preserve", "app", "quiet" ])topopts = filter(lambda (x): x[0] != "--preserve" and x[0] != "--app" and x[0] != "--quiet", opts)preserve = filter(lambda(x): x[0] == "--preserve", opts) != []app = filter(lambda(x): x[0] == "--app", opts) != []quiet = filter(lambda(x): x[0] == "--quiet", opts) != []topdirs = map(lambda (x): canonicalisedir(x[1]), topopts)if len(args) != 1:  usage()repository = args[0]try:  dom = parse(stdin)except xml.parsers.expat.ExpatError:  nfail("nesdoc failed: no valid input")creator = xml.dom.minidom.getDOMImplementation()check(dom.documentElement.tagName == "nesc")interfacedefs = get1(dom, "interfacedefs")components = get1(dom, "components")interfaces = get1(dom, "interfaces")functions = get1(dom, "functions")# index everythingrefidx = {}qnameidx = {}for x in interfaces.getElementsByTagName("interface"):  refidx[x.getAttribute("ref")] = xfor x in functions.getElementsByTagName("function"):  refidx[x.getAttribute("ref")] = xfor x in components.getElementsByTagName("component"):  qnameidx[x.getAttribute("qname")] = xfor x in interfacedefs.getElementsByTagName("interfacedef"):  qnameidx[x.getAttribute("qname")] = x# collect specification elements by componentspeclist = {}# interfacesfor x in interfaces.getElementsByTagName("interface"):  incomponent = get1(x, "component-ref").getAttribute("qname")  if speclist.has_key(incomponent):    speclist[incomponent].append(x)  else:    speclist[incomponent] = [x]# and bare commands, eventsfor x in functions.getElementsByTagName("function"):  # hack: tasks don't show up with a command/event attribute  if x.hasAttribute("event") or x.hasAttribute("command"):    incomponent = get1(x, "component-ref").getAttribute("qname")    if speclist.has_key(incomponent):      speclist[incomponent].append(x)    else:      speclist[incomponent] = [x]# add nicename (i.e., with package prefix) attributes to all interfacedef,# interfacedef-ref, component and component-ref elementsnicenames = {}def define_nicename(x):  name = x.getAttribute("qname")  nicename = packagename(x)  if nicename == None:    nicename = name  nicenames[name] = nicenamedef set_nicename(x):  x.setAttribute("nicename", nicenames[x.getAttribute("qname")])for x in interfacedefs.getElementsByTagName("interfacedef"):  define_nicename(x)  set_nicename(x)for x in components.getElementsByTagName("component"):  define_nicename(x)  set_nicename(x)for x in dom.getElementsByTagName("interfacedef-ref"):  set_nicename(x)for x in dom.getElementsByTagName("component-ref"):  set_nicename(x)# Do the app stuff if requestedif app:  # The firt component is the main application component.  toplevel = xml_idx(components, 0)  name = toplevel.getAttribute("qname")  nicename = toplevel.getAttribute("nicename")  wiring = xml_tag(xml_tag(dom, "nesc"), "wiring")  generate_graph(".", repository, dom, wiring, name, nicename)  ht = Html("%s.html" % nicename)  ht.title("Application: " + nicename)  ht.body()  ht.push("h2");  ht.p("Application: " + nicename)  ht.popln();  ht.pushln("map", 'name="comp"')  cmap = file("%s.cmap" % nicename)  for line in cmap.readlines():    ht.pln(line)  cmap.close()  ht.popln()  ht.tag("img", 'src="%s.png"' % nicename, 'usemap="#comp"', 'id=imgwiring')  ht.close()# save xml information per-interface and per-component in the specified# repositorynmkdir(repository)chdir(repository)nmkdir("interfaces")nmkdir("components")# save interface definitionsfor x in interfacedefs.getElementsByTagName("interfacedef"):  name = x.getAttribute("qname")  nicename = x.getAttribute("nicename")  filename = "interfaces/%s.xml" % nicename  if preserve and os.path.exists(filename):    continue  if not quiet:    print "interface %s (%s)" % (name, nicename)  doc = creator.createDocument(None, None, None)  copy = x.cloneNode(True)  doc.appendChild(copy)  ifile = file(filename, "w")  doc.writexml(ifile)  doc.unlink()  ifile.close()# save component definitions, excluding instantiationsfor x in components.getElementsByTagName("component"):  if len(x.getElementsByTagName("instance")) == 0:    # not an instance    name = x.getAttribute("qname")    nicename = x.getAttribute("nicename")    filename = "components/%s.xml" % nicename    if preserve and os.path.exists(filename):      continue    if not quiet:      print "component %s (%s)" % (name, nicename)    doc = creator.createDocument(None, None, None)    # copy component and create its specification    copy = x.cloneNode(True)    spec = dom.createElement("specification")    copy.appendChild(spec)    try:      for intf in speclist[name]:        spec.appendChild(intf.cloneNode(True))    except KeyError:      0    # collect information used in wiring graph    allelems = {}    allcomps = {}    def addelem(wireref):      actualref = xml_tagset(wireref, ["interface-ref", "function-ref"])      elemref = actualref.getAttribute("ref")      elem = refidx[elemref]      compname = xml_tag(elem, "component-ref").getAttribute("qname")      # exclude self-references, those are in the specification already      if compname != name:        allelems[elemref] = True        allcomps[compname] = True    for wireref in x.getElementsByTagName("from"): addelem(wireref)    for wireref in x.getElementsByTagName("to"): addelem(wireref)    # create the referenced element which will store the wiring information    refd = dom.createElement("referenced")    copy.appendChild(refd)    for ref in allelems.keys():      refd.appendChild(refidx[ref].cloneNode(True))    for qname in allcomps.keys():      refd.appendChild(qnameidx[qname].cloneNode(True))        doc.appendChild(copy)    ifile = file(filename, "w")    doc.writexml(ifile)    doc.unlink()    ifile.close()

⌨️ 快捷键说明

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