Subversion Repositories HelenOS

Rev

Rev 3259 | Rev 3262 | 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.     comment = False
  49.     for token in tokens[1:]:
  50.         if (comment):
  51.             if (token == "*/"):
  52.                 comment = False
  53.             continue
  54.        
  55.         if (token == "/*"):
  56.             comment = True
  57.         elif (token[0:5] == "char["):
  58.             size = token[5:].split("]")[0]
  59.             struct += ("%d" % int(size)) + "s"
  60.         else:
  61.             struct += {
  62.                 "uint8_t":  lambda: "B",
  63.                 "uint16_t": lambda: "H",
  64.                 "uint32_t": lambda: "L",
  65.                 "uint64_t": lambda: "Q",
  66.                
  67.                 "int8_t":   lambda: "b",
  68.                 "int16_t":  lambda: "h",
  69.                 "int32_t":  lambda: "l",
  70.                 "int64_t":  lambda: "q"
  71.             }[token]()
  72.    
  73.     return struct
  74.  
  75. def little_string(string):
  76.     return struct.pack("<" + ("%d" % len(string)) + "s", string)
  77.  
  78. def little_padding(length):
  79.     return struct.pack("<" + ("%d" % length) + "x")
  80.