# Copyright 2017 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
'''
This scripts takes as input a list of header files and generates metadata
files to make syzkaller device descriptions.
'''
import argparse
import logging
import sys
import traceback
from headerlib.header_preprocessor import HeaderFilePreprocessorException
from headerlib.container import GlobalHierarchy
def main():
"""
python parser.py --filename=A.h,B.h
"""
parser = argparse.ArgumentParser(description='Parse header files to output fuzzer'
'struct metadata.')
parser.add_argument('--filenames',
help='comma-separated header filenames',
dest='filenames',
required=True)
parser.add_argument('--debug',
help='print debug-information at every level of parsing',
action='store_true')
parser.add_argument('--include',
help='include the specified file as the first line of the processed header files',
required=False,
const='',
nargs='?')
args = parser.parse_args()
loglvl = logging.INFO
if args.debug:
loglvl = logging.DEBUG
include_lines = ''
if args.include:
include_lines = open(args.include, 'r').read()
try:
gh = GlobalHierarchy(filenames=args.filenames.split(','),
loglvl=loglvl, include_lines=include_lines)
except HeaderFilePreprocessorException as e:
excdata = traceback.format_exc().splitlines()
logging.error(excdata[-1])
sys.exit(-1)
print gh.get_metadata_structs()
if __name__ == '__main__':
main()