2013-10-15 18 views
0

我想要一段具有一些定義的c代碼。我想解析文件做一些改變並創建一個新文件。我希望將定義中的偏移值添加到文件中指示的相應基地址。如果有多個基地址和多個偏移量,我希望它能夠工作。我在下面顯示了一個輸入文件和我預期的輸出。我怎樣才能使用正則表達式或任何其他方式來做到這一點。解析一個文件,並使用正則表達式進行修改

Input.c中

/******************************************************************* 
* 
* 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 

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

expected_output.c

/******************************************************************* 
* 
* 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 

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

回答

1

C編譯器能夠做數學的。不需要正則表達式或文件修改。

file.h:

/* 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 
//Shorten name to make it easier for asker to read 
#define BASEADDR XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_BASEADDR 
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_RESET_CNTRS_OFFSET (BASEADDR + 0x0) 
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_1_LOW_OFFSET (BASEADDR + 0xc) 
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_1_HIGH_OFFSET (BASEADDR + 0x10) 
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_3_LOW_OFFSET (BASEADDR + 0x1c) 
#define XPAR_NF10_ROUTER_OUTPUT_PORT_LOOKUP_0_BAR0_MAC_3_HIGH_OFFSET (BASEADDR + 0x20) 
#undef BASEADDR 

而且一個僞腳本(與真正的正則表達式),做你想做的轉變,如果你不喜歡這樣的解決方案:

#This script assumes that OFFSET #defines come after 
# their associated BASEADDR #defines 
input_file = open("path/to/input/file.c", read) 
output_file = open("path/to/output/file.c", write) 
baseaddr = 0 
#In iteration of the loop, "line" will be a string 
# containing a single line of the file 
foreach line in input_file: 
    #Get base address from the _BASEADDR #defines 
    if regex_match("#define .*_BASEADDR (0x[0-9]{8})", line): 
     baseaddr = hex_string_to_number(regex_groups[0]) 
     write_line(output_file, line) 
    #Create new offset #define by adding offset from source 
    # file to base address from source file 
    else if regex_match("#define (.*)_OFFSET (0x[0-9]+)", line): 
     new_val = hex_string_to_number(regex_groups[1]) + baseaddr 
     #Format here is similar to C's sprintf. 
     # Whichever language you choose will likely have 
     # something that behaves differently 
     new_line = format("#define %s_OFFSET %s", 
          regex_groups[0], 
          number_to_hex_string(new_val)) 
     write_line(output_file, new_line) 
    #Pass through all other lines (blanks, HIGHADDRs, comments, etc) 
    else: 
     write_line(output_file, line) 
+0

的Input.c中是由一個工具生成的,我不想手動編輯文件。所以更喜歡一個實際上可以做到的腳本。你有什麼想法如何使用腳本來做到這一點。 – user2532296

+0

您是否擁有對該工具的控制權?如果是這樣,我會修改該工具。我將修改我的答案,以便使用正則表達式添加腳本以完成您的任務,並在完成後再發表評論。 –

+0

謝謝。腳本會非常棒,我期待着它。該工具不允許我修改,該工具固有地打印這樣的結果。而且,input.c只是一個小實例,實際文件運行時間很長。 – user2532296