#!/usr/bin/env python
# Copyright (C) 2012   Christian Heimes (christian@python.org)
# Licensed to PSF under a Contributor Agreement.
#
# cleanup Keccak sources

import os
import re

CPP1 = re.compile("^//(.*)")
CPP2 = re.compile("\ //(.*)")

STATICS = ("void ", "int ", "HashReturn ", "const UINT64 ", "UINT16 ")

HERE = os.path.dirname(os.path.abspath(__file__))
KECCAK = os.path.join(HERE, "keccak")

def getfiles():
    for name in os.listdir(KECCAK):
        name = os.path.join(KECCAK, name)
        if os.path.isfile(name):
            yield name

def cleanup(f):
    buf = []
    for line in f:
        # mark all functions and global data as static
        if line.startswith(STATICS):
            buf.append("static " + line)
            continue
        # remove UINT64 typedef, we have our own
        if line.startswith("typedef unsigned long long int"):
            buf.append("/* %s */\n" % line.strip())
            continue
        ## remove #include "brg_endian.h"
        #if "brg_endian.h" in line:
        #    buf.append("/* %s */\n" % line.strip())
        #    continue
        # transform C++ comments into ANSI C comments
        line = CPP1.sub(r"/* \1 */", line)
        line = CPP2.sub(r" /* \1 */", line)
        buf.append(line)
    return "".join(buf)

for name in getfiles():
    with open(name) as f:
        res = cleanup(f)
    with open(name, "w") as f:
        f.write(res)
