def test_parse_doc_options(): doc = '''-h, --help Print help message. -o FILE Output file. --verbose Verbose mode.''' assert parse_doc_options(doc) == [Option('-h', '--help'), Option('-o', None, 1), Option(None, '--verbose')]
to_c(o.long or o.short), c_name(o.long or o.short)) def c_if_not_flag(o): t = """ else if (o->option.argument && strcmp(o->option.o%s, %s) == 0) { args.%s = o->option.argument;\n }""" return t % (('long' if o.long else 'short'), to_c(o.long or o.short), c_name(o.long or o.short)) if __name__ == '__main__': help_message=sys.stdin.read() usage_pattern = printable_usage(help_message) options = parse_doc_options(help_message) formal_pattern = parse_pattern(formal_usage(usage_pattern), options=options) formal_pattern.fix() out = __doc__ out = out.replace('<<<flag_options>>>', ';\n '.join('int %s' % c_name(o.long or o.short) for o in options if o.argcount == 0)) out = out.replace('<<<options_with_arguments>>>', ';\n '.join('char *%s' % c_name(o.long or o.short) for o in options if o.argcount == 1)) out = out.replace('<<<help_message>>>', to_c(help_message)) out = out.replace('<<<usage_pattern>>>', to_c(usage_pattern)) out = out.replace('<<<defaults>>>', ', '.join(to_c(o.value) for o in sorted(options, key=lambda o: o.argcount)))
args.%s = o->option.value;\n }""" return t % (('long' if o.long else 'short'), to_c( o.long or o.short), c_name(o.long or o.short)) def c_if_not_flag(o): t = """ else if (o->option.argument && strcmp(o->option.o%s, %s) == 0) { args.%s = o->option.argument;\n }""" return t % (('long' if o.long else 'short'), to_c( o.long or o.short), c_name(o.long or o.short)) if __name__ == '__main__': help_message = sys.stdin.read() usage_pattern = printable_usage(help_message) options = parse_doc_options(help_message) formal_pattern = parse_pattern(formal_usage(usage_pattern), options=options) formal_pattern.fix() out = __doc__ out = out.replace( '<<<flag_options>>>', ';\n '.join('int %s' % c_name(o.long or o.short) for o in options if o.argcount == 0)) out = out.replace( '<<<options_with_arguments>>>', ';\n '.join('char *%s' % c_name(o.long or o.short) for o in options if o.argcount == 1)) out = out.replace('<<<help_message>>>', to_c(help_message)) out = out.replace('<<<usage_pattern>>>', to_c(usage_pattern))