1#!/bin/sh 2# 3# Copyright (C) 2014 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17 18cat $1 | 19 # Mark descriptions and actions in the body. 20 sed 's/^[0-9. ]*Command and Response$/_COMMAND_SECTION/' | 21 sed 's/^[0-9. ]*Detailed Actions$/_ACTIONS_SECTION/' | 22 # Keep only command and response sections. 23 awk '/^_COMMAND_SECTION$/,/^_ACTIONS_SECTION$/ { print $0; }' | 24 sed 's/^_COMMAND_SECTION$//' | 25 sed 's/^_ACTIONS_SECTION$//' | 26 # Remove headers and footers. 27 sed 's/^.*Trusted Platform Module Library.*$//' | 28 sed 's/^.*Part 3: Commands.*$//' | 29 sed 's/^.*Family .2.0..*$//' | 30 sed 's/^.*Level 00 Revision.*$//' | 31 sed 's/^.*Published.*$//' | 32 sed 's/^.*Copyright.*$//' | 33 sed 's/^.*Page [0-9].*$//' | 34 sed 's/^.*October 31, 2013.*$//' | 35 # Remove table headers. 36 sed 's/^Type$//' | sed 's/^Name$//' | sed 's/^Description$//' | 37 # Remove leading spaces. 38 sed 's/^[ ][ ]*//' | 39 # Remove empty lines. 40 sed '/^$/d' | 41 # Mark begin and end. 42 awk ' 43 BEGIN { print "_BEGIN"; } 44 { print $0; } 45 END { print "_END"; } 46 ' | 47 # Mark command / response tables. 48 sed 's/^Table [0-9]* . \(.*\) Command$/_INPUT_START \1/' | 49 sed 's/^Table [0-9]* . \(.*\) Response$/_OUTPUT_START \1/' | 50 # Mark argument types. 51 sed 's/^\(TPM[_A-Z0-9+]*\)$/_TYPE \1/' | 52 sed 's/^\(U*INT[0-9]*\)$/_TYPE \1/' | 53 # Filter out a few special cases that look like types but are not. 54 sed 's/^_TYPE TPM_ST_NO_SESSIONS$/TPM_ST_NO_SESSIONS/' | 55 sed 's/^_TYPE TPM_ALG_NULL$/TPM_ALG_NULL/' | 56 sed 's/^_TYPE TPM_CC_HMAC$/TPM_CC_HMAC/' | 57 sed 's/^_TYPE TPM_GENERATED_VALUE$/TPM_GENERATED_VALUE/' | 58 sed 's/^_TYPE \(TPM_RH_[A-Z+]*\)$/\1/' | 59 # Mark argument names. 60 awk ' 61 BEGIN { last_line_was_type = 0; } 62 /^_.*$/ { print $0; } 63 /^_TYPE .*$/ { last_line_was_type = 1; } 64 /^[^_].*$/ { if (last_line_was_type) { 65 last_line_was_type = 0; 66 print "_NAME " $0; 67 if ($0 !~ /^[@a-zA-Z0-9]*$/) { 68 print "_ERROR: Invalid name."; } } 69 else { print $0; } } 70 ' | 71 # Consolidate comments to a single line and mark. 72 awk ' 73 BEGIN { comment = ""; } 74 /^_.*$/ { if (comment != "") { print "_COMMENT " comment; comment = ""; } 75 print $0; } 76 /^[^_].*$/ { if (comment != "") { comment = comment " " $0; } 77 else { comment = $0 } } 78 ' | 79 # Fix typos. 80 sed 's/_COMMENT TPM_CC_PolicyNVWritten/_COMMENT TPM_CC_PolicyNvWritten/' | 81 # Strip off modifiers like TYPE+ and @name. 82 sed 's/^\(_TYPE .*\)[+]$/\1/' | 83 sed 's/^_NAME @\(.*\)$/_NAME \1/' | 84 # Sanity check. The format should now follow this grammar: 85 # Format:Begin||CommandBlock*||End 86 # Begin:_BEGIN\n 87 # End:_END\n 88 # CommandBlock:InputTag||Argument*||OutputTag||Argument* 89 # InputTag:_INPUT_START <command>\n 90 # OutputTag:_OUTPUT_START <command>\n 91 # Argument:Type||Name[||Comment] 92 # Type:_TYPE <type>\n 93 # Name:_NAME <name>\n 94 # Comment:_COMMENT <comment>\n 95 awk ' 96 BEGIN { RS = ""; } 97 $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/ { 98 print "_ERROR: Format check failed."; } 99 { print $0; } 100 ' 101exit 0 102