| #!/usr/bin/env python3 |
| # Copyright 2021 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Helper for converting Windows HRESULT defines to enums.xml entries. |
| |
| It only works with HRESULTs defined using `_HRESULT_TYPEDEF_`, e.g. |
| #define MF_E_SAMPLE_NOT_WRITABLE _HRESULT_TYPEDEF_(0xC00D36E0L) |
| will be converted to |
| <int value="-1072875808" label="MF_E_SAMPLE_NOT_WRITABLE"/> |
| |
| Some Windows files may use different or no macros to define HRESULTs, e.g. |
| #define DRM_E_FILEOPEN ((DRM_RESULT)0x8003006EL) |
| #define MF_INDEX_SIZE_ERR 0x80700001 |
| This script will not work in those cases, but is easy to be modified to work. |
| |
| Usage: |
| tools/hresult_to_enum.py -i mferror.h -o mferror.xml |
| """ |
| |
| import argparse |
| import re |
| import sys |
| |
| _HRESULT_RE = re.compile( |
| r'^#define\s+([0-9A-Z_]+)\s+.*_HRESULT_TYPEDEF_\((0x[0-9A-F]{8}).*') |
| |
| |
| def _HexToSignedInt(hex_str): |
| """Converts a hex string to a signed integer string. |
| |
| Args: |
| hex_str: A string representing a hex number. |
| |
| Returns: |
| A string representing the converted signed integer. |
| """ |
| int_val = int(hex_str, 16) |
| if int_val & (1 << 31): |
| int_val -= 1 << 32 |
| return str(int_val) |
| |
| |
| def _HresultToEnum(match): |
| """Converts an HRESULT define to an enums.xml entry. |
| """ |
| hresult = match.group(1) |
| hex_str = match.group(2) |
| int_str = _HexToSignedInt(hex_str) |
| return f'<int value="{int_str}" label="{hresult}"/>' |
| |
| |
| def _ConvertAllHresultDefines(source): |
| """Converts all HRESULT defines to enums.xml entries. |
| """ |
| in_lines = source.splitlines() |
| out_lines = [] |
| |
| for in_line in in_lines: |
| out_line, num_of_subs = _HRESULT_RE.subn(_HresultToEnum, in_line) |
| assert num_of_subs <= 1 |
| if num_of_subs == 1: |
| out_lines.append(out_line) |
| |
| return '\n'.join(out_lines) |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description='Convert HEX HRESULT to signed integer.') |
| parser.add_argument('-i', |
| '--input', |
| help='The input file containing HRESULT defines', |
| required=True) |
| parser.add_argument('-o', |
| '--output', |
| help='The output file containing enums.xml entries', |
| required=True) |
| args = parser.parse_args() |
| |
| with open(args.input, 'r') as f: |
| new_source = _ConvertAllHresultDefines(f.read()) |
| with open(args.output, 'w', newline='\n') as f: |
| f.write(new_source) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |