| 
									
										
										
										
											2020-05-12 12:32:37 +02:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2016-08-12 09:27:02 -04:00
										 |  |  | # | 
					
						
							|  |  |  | # Module information generator | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Copyright Red Hat, Inc. 2015 - 2016 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Authors: | 
					
						
							|  |  |  | #  Marc Mari <markmb@redhat.com> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This work is licensed under the terms of the GNU GPL, version 2. | 
					
						
							|  |  |  | # See the COPYING file in the top-level directory. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_string_struct(line): | 
					
						
							|  |  |  |     data = line.split() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # data[0] -> struct element name | 
					
						
							|  |  |  |     # data[1] -> = | 
					
						
							|  |  |  |     # data[2] -> value | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return data[2].replace('"', '')[:-1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def add_module(fheader, library, format_name, protocol_name): | 
					
						
							|  |  |  |     lines = [] | 
					
						
							|  |  |  |     lines.append('.library_name = "' + library + '",') | 
					
						
							|  |  |  |     if format_name != "": | 
					
						
							|  |  |  |         lines.append('.format_name = "' + format_name + '",') | 
					
						
							|  |  |  |     if protocol_name != "": | 
					
						
							|  |  |  |         lines.append('.protocol_name = "' + protocol_name + '",') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     text = '\n        '.join(lines) | 
					
						
							|  |  |  |     fheader.write('\n    {\n        ' + text + '\n    },') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def process_file(fheader, filename): | 
					
						
							|  |  |  |     # This parser assumes the coding style rules are being followed | 
					
						
							|  |  |  |     with open(filename, "r") as cfile: | 
					
						
							|  |  |  |         found_start = False | 
					
						
							|  |  |  |         library, _ = os.path.splitext(os.path.basename(filename)) | 
					
						
							|  |  |  |         for line in cfile: | 
					
						
							|  |  |  |             if found_start: | 
					
						
							|  |  |  |                 line = line.replace('\n', '') | 
					
						
							|  |  |  |                 if line.find(".format_name") != -1: | 
					
						
							|  |  |  |                     format_name = get_string_struct(line) | 
					
						
							|  |  |  |                 elif line.find(".protocol_name") != -1: | 
					
						
							|  |  |  |                     protocol_name = get_string_struct(line) | 
					
						
							|  |  |  |                 elif line == "};": | 
					
						
							|  |  |  |                     add_module(fheader, library, format_name, protocol_name) | 
					
						
							|  |  |  |                     found_start = False | 
					
						
							|  |  |  |             elif line.find("static BlockDriver") != -1: | 
					
						
							|  |  |  |                 found_start = True | 
					
						
							|  |  |  |                 format_name = "" | 
					
						
							|  |  |  |                 protocol_name = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def print_top(fheader): | 
					
						
							|  |  |  |     fheader.write('''/* AUTOMATICALLY GENERATED, DO NOT MODIFY */
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * QEMU Block Module Infrastructure | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Authors: | 
					
						
							|  |  |  |  *  Marc Mari       <markmb@redhat.com> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fheader.write('''#ifndef QEMU_MODULE_BLOCK_H
 | 
					
						
							|  |  |  | #define QEMU_MODULE_BLOCK_H | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct { | 
					
						
							|  |  |  |     const char *format_name; | 
					
						
							|  |  |  |     const char *protocol_name; | 
					
						
							|  |  |  |     const char *library_name; | 
					
						
							|  |  |  | } block_driver_modules[] = {''')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def print_bottom(fheader): | 
					
						
							|  |  |  |     fheader.write('''
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | ''')
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-12 12:32:37 +02:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     # First argument: output file | 
					
						
							|  |  |  |     # All other arguments: modules source files (.c) | 
					
						
							|  |  |  |     output_file = sys.argv[1] | 
					
						
							|  |  |  |     with open(output_file, 'w') as fheader: | 
					
						
							|  |  |  |         print_top(fheader) | 
					
						
							| 
									
										
										
										
											2016-08-12 09:27:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-12 12:32:37 +02:00
										 |  |  |         for filename in sys.argv[2:]: | 
					
						
							|  |  |  |             if os.path.isfile(filename): | 
					
						
							|  |  |  |                 process_file(fheader, filename) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 print("File " + filename + " does not exist.", file=sys.stderr) | 
					
						
							|  |  |  |                 sys.exit(1) | 
					
						
							| 
									
										
										
										
											2016-08-12 09:27:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-12 12:32:37 +02:00
										 |  |  |         print_bottom(fheader) | 
					
						
							| 
									
										
										
										
											2016-08-12 09:27:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-12 12:32:37 +02:00
										 |  |  |     sys.exit(0) |