| #!/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/^\(UINT[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 } } |
| ' | |
| # Fix typos. |
| sed 's/_COMMENT TPM_CC_PolicyNVWritten/_COMMENT TPM_CC_PolicyNvWritten/' | |
| # Strip off modifiers like TYPE+ and @name. |
| sed 's/^\(_TYPE .*\)[+]$/\1/' | |
| 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 |