#!/usr/bin/env python

import sys, re

def countsame(lines,curline,search):
  numlines = 0
  while re.search(search,lines[curline]):
    numlines = numlines + 1
    curline = curline + 1
  return numlines

out = sys.stdout

lines = open(sys.argv[1]).readlines()
numlines = len(lines)

transforms = [
  ("DMA_CH_t CH[0-3]", "DMA_CH_t CHn[%d]"),			# DMA_struct
  ("register8_t CH[0-7]MUX", "register8_t CHnMUX[%d]"),		# EVSYS_struct
  ("register8_t CH[0-7]CTRL", "register8_t CHnCTRL[%d]"),	# EVSYS_struct
  ("register8_t LOTNUM[0-5]", "register8_t LOTNUMn[%d]"),	# NVM_PROD_SIGNATURES_struct
  ("register8_t AC[0-1]CTRL", "register8_t ACnCTRL[%d]"),	# AC_struct
  ("register8_t AC[0-1]MUXCTRL", "register8_t ACnMUXCTRL[%d]"),	# AC_struct
  ("_WORDREGISTER\(CH[0-3]RES\)", "register16_t CHnRES[%d]"),	# ADC_struct
  ("ADC_CH_t CH[0-9]", "ADC_CH_t CHn[%d]"),			# ADC_struct
  ("_WORDREGISTER\(CH[0-1]DATA\)", "register16_t CHnDATA[%d]"),	# DAC_struct
  ("EBI_CS_t CS[0-3]", "EBI_CS_t CSn[%d]"),			# EBI_struct
  ("register8_t VPCTRL[A-D]", "register8_t VPCTRLn[%d]"),	# PORTCFG_struct
  ("register8_t PIN[0-7]CTRL", "register8_t PINnCTRL[%d]"),	# PORT_struct
  ("_WORDREGISTER\(CC[A-D]\)", "register16_t CCn[%d]"),		# TC_struct
  ("_WORDREGISTER\(CC[A-D]BUF\)", "register16_t CCnBUF[%d]"),	# TC_struct
]

n = 0
while n < range(numlines):
  for transform in transforms:
    c = countsame(lines,n,transform[0])
    if c:
      out.write("    union {\n")
      out.write("        struct {\n")
      for m in range(c):
        out.write("        %s" % lines[n+m])
      out.write("        };\n")
      out.write(("        "+transform[1]+";\n") % c)
      out.write("    };\n")
      n = n + c
      continue

  out.write(lines[n])
  n = n + 1
  if n >= numlines: break
