Subversion Repositories HelenOS

Rev

Rev 3260 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #
  2. # Copyright (c) 2008 Martin Decky
  3. # All rights reserved.
  4. #
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. #
  9. # - Redistributions of source code must retain the above copyright
  10. #   notice, this list of conditions and the following disclaimer.
  11. # - Redistributions in binary form must reproduce the above copyright
  12. #   notice, this list of conditions and the following disclaimer in the
  13. #   documentation and/or other materials provided with the distribution.
  14. # - The name of the author may not be used to endorse or promote products
  15. #   derived from this software without specific prior written permission.
  16. #
  17. # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18. # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19. # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21. # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22. # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24. # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. #
  28. """
  29. Convert descriptive structure definitions to struct formats
  30. """
  31.  
  32. import struct
  33.  
  34. def convert(definition):
  35.     "Convert structure defition to struct format"
  36.    
  37.     tokens = definition.split(None)
  38.    
  39.     # Initial byte order tag
  40.     struct = {
  41.         "little:":  lambda: "<",
  42.         "big:":     lambda: ">",
  43.         "network:": lambda: "!"
  44.     }[tokens[0]]()
  45.        
  46.     # Member tags
  47.    
  48.     for token in tokens[1:]:
  49.         if (token[0:5] == "char["):
  50.             size = token[5:].split("]")[0]
  51.             struct += ("%d" % int(size)) + "s"
  52.         else:
  53.             struct += {
  54.                 "uint8_t":  lambda: "B",
  55.                 "uint16_t": lambda: "H",
  56.                 "uint32_t": lambda: "L",
  57.                 "uint64_t": lambda: "Q",
  58.                
  59.                 "int8_t":   lambda: "b",
  60.                 "int16_t":  lambda: "h",
  61.                 "int32_t":  lambda: "l",
  62.                 "int64_t":  lambda: "q"
  63.             }[token]()
  64.    
  65.     return struct
  66.  
  67. def little_string(string):
  68.     return struct.pack("<" + ("%d" % len(string)) + "s", string)
  69.