/ lib / wind / gen-errorlist.py
gen-errorlist.py
  1  #!/usr/local/bin/python
  2  # -*- coding: iso-8859-1 -*-
  3  
  4  # $Id$
  5  
  6  # Copyright (c) 2004 Kungliga Tekniska Högskolan
  7  # (Royal Institute of Technology, Stockholm, Sweden). 
  8  # All rights reserved. 
  9  # 
 10  # Redistribution and use in source and binary forms, with or without 
 11  # modification, are permitted provided that the following conditions 
 12  # are met: 
 13  # 
 14  # 1. Redistributions of source code must retain the above copyright 
 15  #    notice, this list of conditions and the following disclaimer. 
 16  # 
 17  # 2. Redistributions in binary form must reproduce the above copyright 
 18  #    notice, this list of conditions and the following disclaimer in the 
 19  #    documentation and/or other materials provided with the distribution. 
 20  # 
 21  # 3. Neither the name of the Institute nor the names of its contributors 
 22  #    may be used to endorse or promote products derived from this software 
 23  #    without specific prior written permission. 
 24  # 
 25  # THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 
 26  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 27  # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 28  # ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 
 29  # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
 30  # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
 31  # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 32  # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 33  # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
 34  # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
 35  # SUCH DAMAGE. 
 36  
 37  import re
 38  import string
 39  import sys
 40  
 41  import generate
 42  import rfc3454
 43  import rfc4518
 44  import stringprep
 45  
 46  if len(sys.argv) != 3:
 47      print "usage: %s rfc3454.txt out-dir" % sys.argv[0]
 48      sys.exit(1)
 49  
 50  tables = rfc3454.read(sys.argv[1])
 51  t2 = rfc4518.read()
 52  
 53  for x in t2.iterkeys():
 54      tables[x] = t2[x]
 55  
 56  error_list = stringprep.get_errorlist()
 57  
 58  errorlist_h = generate.Header('%s/errorlist_table.h' % sys.argv[2])
 59  
 60  errorlist_c = generate.Implementation('%s/errorlist_table.c' % sys.argv[2])
 61  
 62  errorlist_h.file.write(
 63  '''
 64  #include "windlocl.h"
 65  
 66  struct error_entry {
 67    uint32_t start;
 68    unsigned len;
 69    wind_profile_flags flags;
 70  };
 71  
 72  extern const struct error_entry _wind_errorlist_table[];
 73  
 74  extern const size_t _wind_errorlist_table_size;
 75  
 76  ''')
 77  
 78  errorlist_c.file.write(
 79  '''
 80  #include <stdlib.h>
 81  #include "errorlist_table.h"
 82  
 83  const struct error_entry _wind_errorlist_table[] = {
 84  ''')
 85  
 86  trans=[]
 87  
 88  for t in error_list.iterkeys():
 89      for l in tables[t]:
 90          m = re.search('^ *([0-9A-F]+)-([0-9A-F]+); *(.*) *$', l)
 91          if m:
 92              start = int(m.group(1), 0x10)
 93              end   = int(m.group(2), 0x10)
 94              desc  = m.group(3)
 95              trans.append([start, end - start + 1, desc, [t]])
 96          else:
 97              m = re.search('^ *([0-9A-F]+); *(.*) *$', l)
 98              if m:
 99                  trans.append([int(m.group(1), 0x10), 1, m.group(2), [t]])
100  
101  trans = stringprep.sort_merge_trans(trans)
102  
103  for x in trans:
104      (start, length, description, tables) = x
105      symbols = stringprep.symbols(error_list, tables)
106      if len(symbols) == 0:
107          print "no symbol for %s" % description
108          sys.exit(1)
109      errorlist_c.file.write("  {0x%x, 0x%x, %s}, /* %s: %s */\n"
110                  % (start, length, symbols, ",".join(tables), description))
111  
112  errorlist_c.file.write(
113  '''};
114  
115  ''')
116  
117  errorlist_c.file.write(
118      "const size_t _wind_errorlist_table_size = %u;\n" % len(trans))
119  
120  errorlist_h.close()
121  errorlist_c.close()