#!/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)
