| 645 | */ |
| 646 | |
| 647 | static int var_edit_parse( char const * mods, VAR_EDITS * edits, int havezeroed |
| 648 | ) |
| 649 | { |
| 650 | while ( *mods ) |
| 651 | { |
| 652 | PATHPART * fp; |
| 653 | |
| 654 | switch ( *mods++ ) |
| 655 | { |
| 656 | case 'L': edits->downshift = 1; continue; |
| 657 | case 'U': edits->upshift = 1; continue; |
| 658 | case 'P': edits->parent = edits->filemods = 1; continue; |
| 659 | case 'E': fp = &edits->empty; goto strval; |
| 660 | case 'J': fp = &edits->join; goto strval; |
| 661 | case 'G': fp = &edits->f.f_grist; goto fileval; |
| 662 | case 'R': fp = &edits->f.f_root; goto fileval; |
| 663 | case 'D': fp = &edits->f.f_dir; goto fileval; |
| 664 | case 'B': fp = &edits->f.f_base; goto fileval; |
| 665 | case 'S': fp = &edits->f.f_suffix; goto fileval; |
| 666 | case 'M': fp = &edits->f.f_member; goto fileval; |
| 667 | case 'T': edits->to_slashes = 1; continue; |
| 668 | case 'W': edits->to_windows = 1; continue; |
| 669 | default: |
| 670 | continue; /* Should complain, but so what... */ |
| 671 | } |
| 672 | |
| 673 | fileval: |
| 674 | /* Handle :CHARS, where each char (without a following =) selects a |
| 675 | * particular file path element. On the first such char, we deselect all |
| 676 | * others (by setting ptr = "", len = 0) and for each char we select |
| 677 | * that element (by setting ptr = 0). |
| 678 | */ |
| 679 | edits->filemods = 1; |
| 680 | |
| 681 | if ( *mods != '=' ) |
| 682 | { |
| 683 | if ( !havezeroed++ ) |
| 684 | { |
| 685 | int i; |
| 686 | for ( i = 0; i < 6; ++i ) |
| 687 | { |
| 688 | edits->f.part[ i ].len = 0; |
| 689 | edits->f.part[ i ].ptr = ""; |
| 690 | } |
| 691 | } |
| 692 | |
| 693 | fp->ptr = 0; |
| 694 | continue; |
| 695 | } |
| 696 | |
| 697 | strval: |
| 698 | /* Handle :X=value, or :X */ |
| 699 | if ( *mods != '=' ) |
| 700 | { |
| 701 | fp->ptr = ""; |
| 702 | fp->len = 0; |
| 703 | } |
| 704 | else |