github.com/tawesoft/golib/v2@v2.10.0/legacy/operator/template-numbers.py (about)

     1  
     2  # usage: python3 template-numbers.py
     3  
     4  template=""
     5  template_file="template_numbers_test.go"
     6  
     7  numbers = [
     8      # class,     type       signed
     9      ("integers", "int",     True),
    10      ("integers", "int8",    True),
    11      ("integers", "int16",   True),
    12      ("integers", "int32",   True),
    13      ("integers", "int64",   True),
    14      ("integers", "uint",    False),
    15      ("integers", "uint8",   False),
    16      ("integers", "uint16",  False),
    17      ("integers", "uint32",  False),
    18      ("integers", "uint64",  False),
    19      ("floats",   "float32", None),
    20      ("floats",   "float64", None),
    21  ]
    22  
    23  with open(template_file, 'r') as fp:
    24      template = fp.read()
    25  
    26  for _class, _type, signed in numbers:
    27  
    28      def replace(s):
    29          for r in (("_T", _type.title()), ("_t", _type)):
    30              s = s.replace(*r)
    31          return s
    32  
    33      with open("%s.go" % _type, 'w') as fp:
    34          for line in template.splitlines(keepends=True):
    35              if line.startswith("package"):
    36                  fp.write(line)
    37                  fp.write("\n// Code generated by (tawesoft.co.uk/go/operator) template-numbers.py: DO NOT EDIT.\n")
    38              elif "//" not in line:
    39                  fp.write(replace(line))
    40              else:
    41                  pos = line.rfind("//")
    42                  left, right = line[0:pos].rstrip(), line[pos + 2:].strip()
    43  
    44                  rest = None
    45                  if ";" in right:
    46                      right, rest = right.split(";", maxsplit=1)
    47                      rest = set([x.strip() for x in rest.split(";")])
    48  
    49                  if right.startswith("IGNORE"):
    50                      continue
    51                  elif right.startswith("CLASS"):
    52                      classes = right[right.find(" "):].split(",")
    53                      classes = set([x.strip() for x in classes])
    54                      if _class in classes:
    55                          if (rest is None) or \
    56                              (("signed" in rest) and (_class == "integers") and signed) or \
    57                              (("unsigned" in rest) and (_class == "integers") and (not signed)) or \
    58                              (_class != "integers"):
    59  
    60                              fp.write(replace(left)+"\n")
    61                  else:
    62                      # restore the comment
    63                      fp.write("// %s\n" % replace(right))
    64  
    65