在文件中添加偏移值并创建新文件

63 阅读4分钟

给定一个包含宏定义的文件,想要解析该文件,对其中的偏移值进行修改,并创建一个新的文件。需要根据文件中的基地址和偏移值,更新相应的偏移值,并且还需支持同时修改多个基地址和偏移值。

输入文件示例:

/*******************************************************************
*
* Author: XYZ.
* Version: 1.0
*
*******************************************************************/

#define STDIN_BASEADDRESS 0x40600000
#define STDOUT_BASEADDRESS 0x40600000

/******************************************************************/

/* Definitions for driver UARTLITE */
#define XPAR_XUARTLITE_NUM_INSTANCES 1

/* Definitions for peripheral RS232_UART_1 */
#define XPAR_RS232_UART_1_BASEADDR 0x40600000
#define XPAR_RS232_UART_1_HIGHADDR 0x4060FFFF

/* Definitions for peripherals */
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_BASEADDR 0x76800000
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_HIGHADDR 0x7680FFFF
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_RESET_CNTRS_OFFSET 0x0
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_1_LOW_OFFSET 0xc
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_1_HIGH_OFFSET 0x10
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_3_LOW_OFFSET 0x1c
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_3_HIGH_OFFSET 0x20


#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_BASEADDR 0x74800000
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_HIGHADDR 0x7480FFFF
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_LPM_IP_OFFSET 0x0
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_LPM_IP_MASK_OFFSET 0x4
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_LPM_NEXT_HOP_IP_OFFSET 0x8
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_LPM_OQ_OFFSET 0xc


#define XPAR_MICROBLAZE_0_M15_AXIS_PROTOCOL GENERIC
#define XPAR_MICROBLAZE_0_S15_AXIS_PROTOCOL GENERIC

/******************************************************************/

预期输出文件格式:

/*******************************************************************
*
* Author: XYZ.
* Version: 1.0
*
*******************************************************************/

#define STDIN_BASEADDRESS 0x40600000
#define STDOUT_BASEADDRESS 0x40600000

/******************************************************************/

/* Definitions for driver UARTLITE */
#define XPAR_XUARTLITE_NUM_INSTANCES 1

/* Definitions for peripheral RS232_UART_1 */
#define XPAR_RS232_UART_1_BASEADDR 0x40600000
#define XPAR_RS232_UART_1_HIGHADDR 0x4060FFFF

/* Definitions for peripherals */
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_BASEADDR 0x76800000
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_HIGHADDR 0x7680FFFF
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_RESET_CNTRS_OFFSET 0x76800000
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_1_LOW_OFFSET 0x7680000c
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_1_HIGH_OFFSET 0x76800010
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_3_LOW_OFFSET 0x7680001c
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_3_HIGH_OFFSET 0x76800020


#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_BASEADDR 0x74800000
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_HIGHADDR 0x7480FFFF
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_LPM_IP_OFFSET 0x74800000
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_LPM_IP_MASK_OFFSET 0x74800004
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_LPM_NEXT_HOP_IP_OFFSET 0x74800008
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR1_LPM_OQ_OFFSET 0x7480000c


#define XPAR_MICROBLAZE_0_M15_AXIS_PROTOCOL GENERIC
#define XPAR_MICROBLAZE_0_S15_AXIS_PROTOCOL GENERIC

/******************************************************************/

2、解决方案

为了解决这个问题,可以使用以下步骤:

  1. 使用正则表达式解析输入文件,提取包含宏定义的部分。
  2. 提取基地址和偏移值,并计算出新的偏移值。
  3. 将新的偏移值替换到宏定义中。
  4. 将解析后的内容写入新的文件中。

以下代码示例演示了该算法的实现:

import re

def read_file(filename):
    with open(filename, "r") as f:
        return f.read()

def parse_base_address(line):
    match = re.search("#define (.*)_BASEADDRESS (0x[0-9a-fA-F]+)", line)
    if match:
        return match.groups()
    else:
        return None

def parse_offset(line):
    match = re.search("#define (.*)_OFFSET (0x[0-9a-fA-F]+)", line)
    if match:
        return match.groups()
    else:
        return None

def calculate_new_offset(base_address, offset):
    return base_address + offset

def update_offset(line, new_offset):
    return re.sub(r"(.*)_OFFSET (0x[0-9a-fA-F]+)", r"\1_OFFSET " + hex(new_offset), line)

def write_file(filename, content):
    with open(filename, "w") as f:
        f.write(content)

def main():
    input_filename = "input.c"
    output_filename = "expected_output.c"

    input_content = read_file(input_filename)
    base_addresses = []
    offsets = []
    for line in input_content.splitlines():
        base_address = parse_base_address(line)
        if base_address:
            base_addresses.append(int(base_address[1], 16))
        offset = parse_offset(line)
        if offset:
            offsets.append(int(offset[1], 16))

    new_offsets = [calculate_new_offset(base_address, offset) for base_address, offset in zip(base_addresses, offsets)]

    output_content = []
    for line in input_content.splitlines