binheader_writef_check.py
上传用户:shw771010
上传日期:2022-01-05
资源大小:991k
文件大小:4k
源码类别:

Audio

开发平台:

Unix_Linux

  1. #!/usr/bin/python2.5
  2. # Copyright (C) 2006 Erik de Castro Lopo <erikd@mega-nerd.com>
  3. #
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions are
  8. # met:
  9. #
  10. #     * Redistributions of source code must retain the above copyright
  11. #       notice, this list of conditions and the following disclaimer.
  12. #     * Redistributions in binary form must reproduce the above copyright
  13. #       notice, this list of conditions and the following disclaimer in
  14. #       the documentation and/or other materials provided with the
  15. #       distribution.
  16. #     * Neither the author nor the names of any contributors may be used
  17. #       to endorse or promote products derived from this software without
  18. #       specific prior written permission.
  19. #
  20. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  22. # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23. # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24. # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25. # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  27. # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  28. # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  29. # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  30. # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. # This parses C code using regexes (yes, thats horrible) and makes sure
  32. # that calling conventions to the function psf_binheader_writef are
  33. # correct.
  34. import re, string, sys
  35. _whitespace_re = re.compile ("s+", re.MULTILINE)
  36. def find_binheader_writefs (data):
  37. lst = re.findall ('psf_binheader_writefs*(s*[a-zA-Z_]+s*,s*"[^;]+;', data, re.MULTILINE)
  38. return [_whitespace_re.sub (" ", x) for x in lst]
  39. def find_format_string (s):
  40. fmt = re.search ('"([^"]+)"', s)
  41. if not fmt:
  42. print "Bad format in :nnt%snn" % s
  43. sys.exit (1)
  44. fmt = fmt.groups ()
  45. if len (fmt) != 1:
  46. print "Bad format in :nnt%snn" % s
  47. sys.exit (1)
  48. return _whitespace_re.sub ("", fmt [0])
  49. def get_param_list (data):
  50. dlist = re.search ("((.+))s*;", data)
  51. dlist = dlist.groups ()[0]
  52. dlist = string.split (dlist, ",")
  53. dlist = [string.strip (x) for x in dlist]
  54. return dlist [2:]
  55. def handle_file (fname):
  56. errors = 0
  57. data = open (fname, "r").read ()
  58. writefs = find_binheader_writefs (data)
  59. for item in writefs:
  60. fmt = find_format_string (item)
  61. params = get_param_list (item)
  62. param_index = 0
  63. # print item
  64. for ch in fmt:
  65. if ch in 'Eet ':
  66. continue
  67. # print "    param [%d] %c : %s" % (param_index, ch, params [param_index])
  68. if ch != 'b':
  69. param_index += 1
  70. continue
  71. # print item
  72. # print "    param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1])
  73. if string.find (params [param_index + 1], "sizeof") < 0 
  74. and string.find (params [param_index + 1], "make_size_t") < 0 
  75. and string.find (params [param_index + 1], "strlen") < 0:
  76. if errors == 0: print
  77. print "n%s :" % fname
  78. print "    param [%d] %c : %s <-> %s" % (param_index, ch, params [param_index], params [param_index + 1])
  79. print "    %s" % item
  80. errors += 1
  81. param_index += 2
  82. return errors
  83. #===============================================================================
  84. if len (sys.argv) > 1:
  85. print "n    binheader_writef_check                   :",
  86. sys.stdout.flush ()
  87. errors = 0
  88. for fname in sys.argv [1:]:
  89. errors += handle_file (fname)
  90. if errors > 0:
  91. print "nErrors : %dn" % errors
  92. sys.exit (1)
  93. print "okn"