#!/bin/sh
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
cat $1 |
# Mark descriptions and actions in the body.
sed 's/^[0-9. ]*Command and Response$/_COMMAND_SECTION/' |
sed 's/^[0-9. ]*Detailed Actions$/_ACTIONS_SECTION/' |
# Keep only command and response sections.
awk '/^_COMMAND_SECTION$/,/^_ACTIONS_SECTION$/ { print $0; }' |
sed 's/^_COMMAND_SECTION$//' |
sed 's/^_ACTIONS_SECTION$//' |
# Remove headers and footers.
sed 's/^.*Trusted Platform Module Library.*$//' |
sed 's/^.*Part 3: Commands.*$//' |
sed 's/^.*Family .2.0..*$//' |
sed 's/^.*Level 00 Revision.*$//' |
sed 's/^.*Published.*$//' |
sed 's/^.*Copyright.*$//' |
sed 's/^.*Page [0-9].*$//' |
sed 's/^.*October 31, 2013.*$//' |
# Remove table headers.
sed 's/^Type$//' | sed 's/^Name$//' | sed 's/^Description$//' |
# Remove leading spaces.
sed 's/^[ ][ ]*//' |
# Remove empty lines.
sed '/^$/d' |
# Mark begin and end.
awk '
BEGIN { print "_BEGIN"; }
{ print $0; }
END { print "_END"; }
' |
# Mark command / response tables.
sed 's/^Table [0-9]* . \(.*\) Command$/_INPUT_START \1/' |
sed 's/^Table [0-9]* . \(.*\) Response$/_OUTPUT_START \1/' |
# Mark argument types.
sed 's/^\(TPM[_A-Z0-9+]*\)$/_TYPE \1/' |
sed 's/^\(U*INT[0-9]*\)$/_TYPE \1/' |
# Filter out a few special cases that look like types but are not.
sed 's/^_TYPE TPM_ST_NO_SESSIONS$/TPM_ST_NO_SESSIONS/' |
sed 's/^_TYPE TPM_ALG_NULL$/TPM_ALG_NULL/' |
sed 's/^_TYPE TPM_CC_HMAC$/TPM_CC_HMAC/' |
sed 's/^_TYPE TPM_GENERATED_VALUE$/TPM_GENERATED_VALUE/' |
sed 's/^_TYPE \(TPM_RH_[A-Z+]*\)$/\1/' |
# Mark argument names.
awk '
BEGIN { last_line_was_type = 0; }
/^_.*$/ { print $0; }
/^_TYPE .*$/ { last_line_was_type = 1; }
/^[^_].*$/ { if (last_line_was_type) {
last_line_was_type = 0;
print "_NAME " $0;
if ($0 !~ /^[@a-zA-Z0-9]*$/) {
print "_ERROR: Invalid name."; } }
else { print $0; } }
' |
# Consolidate comments to a single line and mark.
awk '
BEGIN { comment = ""; }
/^_.*$/ { if (comment != "") { print "_COMMENT " comment; comment = ""; }
print $0; }
/^[^_].*$/ { if (comment != "") { comment = comment " " $0; }
else { comment = $0 } }
' |
# Strip off @name modifier, keep TYPE+ modifier for for conditional unmarshaling.
sed 's/^_NAME @\(.*\)$/_NAME \1/' |
# Sanity check. The format should now follow this grammar:
# Format:Begin||CommandBlock*||End
# Begin:_BEGIN\n
# End:_END\n
# CommandBlock:InputTag||Argument*||OutputTag||Argument*
# InputTag:_INPUT_START <command>\n
# OutputTag:_OUTPUT_START <command>\n
# Argument:Type||Name[||Comment]
# Type:_TYPE <type>\n
# Name:_NAME <name>\n
# Comment:_COMMENT <comment>\n
awk '
BEGIN { RS = ""; }
$0 !~ /_BEGIN\n(_INPUT_START[^\n]*\n(_TYPE[^\n]*\n_NAME[^\n]*\n(_COMMENT[^\n]*\n)*)*_OUTPUT_START[^\n]*\n(_TYPE[^\n]*\n_NAME[^\n]*\n(_COMMENT[^\n]*\n)*)*)*_END/ {
print "_ERROR: Format check failed."; }
{ print $0; }
'
exit 0