# Copyright 2010 The Go Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

# This code is used to parse the debug log from gnutls-cli and generate a
# script of the handshake. This script is included in handshake_server_test.go.
# See the comments there for details.

import sys

blocks = []

READ = 1
WRITE = 2

currentBlockType = 0
currentBlock = []
for line in sys.stdin.readlines():
        line = line[:-1]
        if line.startswith("|<7>| WRITE: "):
                if currentBlockType != WRITE:
                        if len(currentBlock) > 0:
                                blocks.append(currentBlock)
                        currentBlock = []
                        currentBlockType = WRITE
        elif line.startswith("|<7>| READ: "):
                if currentBlockType != READ:
                        if len(currentBlock) > 0:
                                blocks.append(currentBlock)
                        currentBlock = []
                        currentBlockType = READ
        elif line.startswith("|<7>| 0"):
                line = line[13:]
                line = line.strip()
                bs = line.split()
                for b in bs:
                        currentBlock.append(int(b, 16))

if len(currentBlock) > 0:
        blocks.append(currentBlock)

for block in blocks:
        sys.stdout.write("\t{\n")

        i = 0
        for b in block:
                if i % 8 == 0:
                        sys.stdout.write("\t\t")
                sys.stdout.write("0x%02x," % b)
                if i % 8 == 7:
                        sys.stdout.write("\n")
                else:
                        sys.stdout.write(" ")
                i += 1
        sys.stdout.write("\n\t},\n\n")
