Rev 9085 | Rev 9220 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9085 | Rev 9088 | ||
---|---|---|---|
Line 632... | Line 632... | ||
632 | ir.sym_name_set = sym_name_set; |
632 | ir.sym_name_set = sym_name_set; |
633 | ir.number_of_symbols = number_of_symbols; |
633 | ir.number_of_symbols = number_of_symbols; |
634 | return ir; |
634 | return ir; |
635 | } |
635 | } |
Line 636... | Line -... | ||
636 | - | ||
637 | int first_arg(int argc, char **argv, const char *arg) { |
- | |
638 | return argc >= 2 && !strcmp(argv[1], arg); |
- | |
639 | } |
- | |
640 | 636 | ||
641 | int arg_got_flag(int argc, char **argv, ...) { |
637 | int arg_got_flag(int argc, char **argv, ...) { |
642 | char *arg_names[8]; |
638 | char *arg_names[8]; |
Line 643... | Line 639... | ||
643 | int arg_name_c = 0; |
639 | int arg_name_c = 0; |
Line 652... | Line 648... | ||
652 | arg_names[arg_name_c++] = arg_name; |
648 | arg_names[arg_name_c++] = arg_name; |
653 | } |
649 | } |
654 | va_end(ap); |
650 | va_end(ap); |
Line 655... | Line 651... | ||
655 | 651 | ||
- | 652 | for (int i = 1; i < argc; i++) { |
|
- | 653 | // If an argumetns was handled already then it's NULL here |
|
- | 654 | if (argv[i] == NULL) { |
|
- | 655 | continue; |
|
656 | for (int i = 1; i < argc; i++) { |
656 | } |
657 | for (int arg_name_i = 0; arg_name_i < arg_name_c; arg_name_i++) { |
657 | for (int arg_name_i = 0; arg_name_i < arg_name_c; arg_name_i++) { |
658 | char *arg_name = arg_names[arg_name_i]; |
658 | char *arg_name = arg_names[arg_name_i]; |
659 | if (!strcmp(argv[i], arg_name)) { |
659 | if (!strcmp(argv[i], arg_name)) { |
660 | argv[i] = NULL; // Do not handle this argument as a input name |
660 | argv[i] = NULL; // Do not handle this argument as a input name |
661 | return 1; |
661 | return i; |
662 | } |
662 | } |
663 | } |
663 | } |
664 | } |
664 | } |
665 | return 0; |
665 | return 0; |
Line -... | Line 666... | ||
- | 666 | } |
|
- | 667 | ||
- | 668 | char *arg_got_param(int argc, char **argv, char *arg) { |
|
- | 669 | int i = arg_got_flag(argc, argv, arg, 0); |
|
- | 670 | if (i == 0) { |
|
- | 671 | return NULL; |
|
- | 672 | } |
|
- | 673 | ||
- | 674 | if (i + 1 >= argc) { |
|
- | 675 | printf("Warning: %s parameter expects a value (like %s |
|
- | 676 | return NULL; |
|
- | 677 | } |
|
- | 678 | char *result = argv[i + 1]; |
|
- | 679 | argv[i + 1] = NULL; |
|
- | 680 | return result; |
|
- | 681 | } |
|
- | 682 | ||
- | 683 | int usage(char *name, char *remark) { |
|
- | 684 | if (remark) { |
|
- | 685 | printf("Error: %s\n\n", remark); |
|
- | 686 | } |
|
- | 687 | printf("Usage: %s [option]... [object file name]...\n", name); |
|
- | 688 | printf(" Link multiple COFF files into one\n"); |
|
- | 689 | printf("\n"); |
|
- | 690 | printf("Options:\n"); |
|
- | 691 | printf(" -o |
|
- | 692 | printf(" -v, --verbose Emit information logs\n"); |
|
- | 693 | printf(" -h, --help Output this help and exit\n"); |
|
- | 694 | return 0; |
|
666 | } |
695 | } |
- | 696 | ||
667 | 697 | int main(int argc, char **argv) { |
|
- | 698 | if (arg_got_flag(argc, argv, "-h", "-help", "--help", 0)) { |
|
Line 668... | Line -... | ||
668 | int main(int argc, char **argv) { |
- | |
669 | const char *outname = "a.out.obj"; |
- | |
670 | - | ||
671 | if (argc >= 3 && !strcmp(argv[1], "-o")) { |
- | |
672 | outname = argv[2]; |
699 | return usage(argv[0], NULL); |
673 | argv += 2; |
- | |
674 | argc -= 2; |
- | |
675 | } else if (first_arg(argc, argv, "-h") |
700 | } |
676 | || first_arg(argc, argv, "-help") |
701 | |
677 | || first_arg(argc, argv, "--help") |
- | |
678 | || argc == 1) { |
- | |
679 | printf("Usage cases:\n"); |
- | |
680 | printf(" %s [-o outname] object files list\n", argv[0]); |
- | |
681 | printf(" Link COFF files into one, optionally set name of output\n"); |
- | |
682 | printf(" %s [-h|-help|--help]\n", argv[0]); |
702 | const char *outname = arg_got_param(argc, argv, "-o"); |
Line 683... | Line 703... | ||
683 | printf(" Output this help\n"); |
703 | if (outname == NULL) { |
Line -... | Line 704... | ||
- | 704 | outname = "a.out.obj"; |
|
- | 705 | } |
|
- | 706 | ||
- | 707 | emit_logs = arg_got_flag(argc, argv, "-v", "-verbose", "--verbose", 0); |
|
- | 708 | ||
- | 709 | // After handling arguments there only leaven unhandled ones |
|
- | 710 | // They should be names if inputs. But if there's no input - exit |
|
- | 711 | int input_file_count = 0; |
|
- | 712 | for (int i = 1; i < argc; i++) { |
|
- | 713 | if (argv[i] != NULL) { |
|
- | 714 | input_file_count++; |
|
- | 715 | } |
|
684 | return 0; |
716 | } |
685 | } |
717 | if (input_file_count == 0) { |
686 | 718 | return usage(argv[0], "No input file names supplied"); |
|
687 | emit_logs = arg_got_flag(argc, argv, "-v", "-verbose", "--verbose", 0); |
719 | } |