Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Word parsing. More Help. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
aaecdd645de74544d7f56863795fc3cb |
User & Date: | spjutp 1998-08-07 14:01:33.000 |
Context
1998-08-07
| ||
14:16 | Minor fixes. Release 1.1 check-in: 2dd54f03f5 user: spjutp tags: trunk | |
14:01 | Word parsing. More Help. check-in: aaecdd645d user: spjutp tags: trunk | |
1998-08-05
| ||
07:48 | Block parse. Changed options. check-in: 6a2a8923c0 user: spjutp tags: trunk | |
Changes
Changes to src/eskil.tcl.
1 2 3 4 5 6 7 8 | #!/bin/sh # # diff.tcl # # Purpose # Graphical frontend to diff # # Usage | | | > > > > > > > > > > > > > > > | > | > | > < | | > > > > | | > > > > > | > > > > > | | > > | > > > > > > > | > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | #!/bin/sh # # diff.tcl # # Purpose # Graphical frontend to diff # # Usage # diff.tcl [options] [file1] [file2] # # [options] All options but the ones below are # passed to diff. # [file1],[file2] Files to be compared # If no files are given, the program is # started anyway and you can select files # from within. # If only one file is given, the program # looks for an RCS directory next to the # file, and if found, runs rcsdiff. # # Options for diff.tcl: # # -nodiff : Normally if there are enough information on the # command line to run diff, diff.tcl will do so unless # this option is specified. # # -noparse : Diff.tcl can perform analysis of changed blocks to # -line : improve display. See online help for details. # -block : The default is -block, but this can be slow if there # are large change blocks. # # -char : The analysis of changes can be done on either # -word : character or word basis. -char is the default. # # Author Peter Spjuth 980612 # # Revised By Date Remark # # 1.0 DC-PS 980612 New Version. # 1.1 DC-PS 980807 Parsing of change blocks added # Options menu and variables changed # Command line options added # #----------------------------------------------- # the next line restarts using wish \ exec wish "$0" "$@" set debug 0 set diffver "Version 1.1 980807" proc myform {line text} { return [format "%3d: %s\n" $line $text] } proc myforml {line} { return [format "%3d: " $line] } #Compare two lines to find inequalities to highlight. #The return value is, for each line, a list where the first, third etc. #element is equal between the lines. The second, fourth etc. will be #highlighted. #The current implementation returns one or three elements. proc comparelines {line1 line2 res1var res2var} { global Pref upvar $res1var res1 upvar $res2var res2 #Skip white space in both ends set apa1 [string trimleft $line1] set left1 [expr {[string length $line1] - [string length $apa1]}] set mid1 [string trimright $line1] set apa2 [string trimleft $line2] set left2 [expr {[string length $line2] - [string length $apa2]}] set mid2 [string trimright $line2] #Check for matching left chars/words. set len1 [string length $apa1] set len2 [string length $apa2] set len [expr {$len1 < $len2 ? $len1 : $len2}] for {set t 0; set s 0; set flag 0} {$t < $len} {incr t} { if {[set c [string index $apa1 $t]] != [string index $apa2 $t]} { incr flag 2 break } if {$c == " "} {set s $t; set flag 1} } if {$Pref(lineparsewords) == 0} { incr left1 $t incr left2 $t } else { if {$flag < 2} { set s $len } elseif {$flag == 3} { incr s } incr left1 $s incr left2 $s } #Check for matching right chars. set len1 [string length $mid1] set len2 [string length $mid2] set t1 [expr {$len1 - 1}] set t2 [expr {$len2 - 1}] set s1 $t1 set s2 $t2 set flag 0 for {} {$t1 >= $left1 && $t2 >= $left2} {incr t1 -1;incr t2 -1} { if {[set c [string index $mid1 $t1]] != [string index $mid2 $t2]} { incr flag 2 break } if {$c == " "} {set s1 $t1; set s2 $t2; set flag 1} } if {$Pref(lineparsewords) == 1} { if {$flag >= 2} { if {$flag == 3} { incr s1 -1 incr s2 -1 } set t1 $s1 set t2 $s2 } } #Make the result if {$left1 > $t1} { set res1 [list $line1] } else { set right1 [string range $line1 [expr {$t1 + 1}] end] set mid1 [string range $line1 $left1 $t1] set left1 [string range $line1 0 [expr {$left1 - 1}]] |
︙ | ︙ | |||
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 | .mf.m add command -label "Quit" -command exit menubutton .mo -text Options -underline 0 -menu .mo.m menu .mo.m .mo.m add cascade -label Fontsize -underline 0 -menu .mo.mf .mo.m add cascade -label Ignore -underline 0 -menu .mo.mi .mo.m add cascade -label Parse -underline 0 -menu .mo.mp menu .mo.mf .mo.mf add radiobutton -label 6 -variable Pref(fontsize) -value 6 -command chFont .mo.mf add radiobutton -label 7 -variable Pref(fontsize) -value 7 -command chFont .mo.mf add radiobutton -label 8 -variable Pref(fontsize) -value 8 -command chFont .mo.mf add radiobutton -label 9 -variable Pref(fontsize) -value 9 -command chFont .mo.mf add radiobutton -label 10 -variable Pref(fontsize) -value 10 -command chFont menu .mo.mi .mo.mi add radiobutton -label "Nothing" -variable Pref(ignore) -value "" .mo.mi add radiobutton -label "Space changes (-b)" -variable Pref(ignore) -value "-b" .mo.mi add radiobutton -label "All spaces (-w)" -variable Pref(ignore) -value "-w" menu .mo.mp .mo.mp add radiobutton -label "Nothing" -variable Pref(parse) -value "none" .mo.mp add radiobutton -label "Lines" -variable Pref(parse) -value "line" .mo.mp add radiobutton -label "Blocks" -variable Pref(parse) -value "block" menubutton .mh -text Help -underline 0 -menu .mh.m menu .mh.m .mh.m add command -label "Help" -command {after 100 makeHelpWin} .mh.m add command -label "About" -command makeAboutWin button .bfn -text "Next Diff" -relief raised -command findNext | > > > > > | 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 | .mf.m add command -label "Quit" -command exit menubutton .mo -text Options -underline 0 -menu .mo.m menu .mo.m .mo.m add cascade -label Fontsize -underline 0 -menu .mo.mf .mo.m add cascade -label Ignore -underline 0 -menu .mo.mi .mo.m add cascade -label Parse -underline 0 -menu .mo.mp .mo.m add separator .mo.m add command -label "Save default" -command saveOptions menu .mo.mf .mo.mf add radiobutton -label 6 -variable Pref(fontsize) -value 6 -command chFont .mo.mf add radiobutton -label 7 -variable Pref(fontsize) -value 7 -command chFont .mo.mf add radiobutton -label 8 -variable Pref(fontsize) -value 8 -command chFont .mo.mf add radiobutton -label 9 -variable Pref(fontsize) -value 9 -command chFont .mo.mf add radiobutton -label 10 -variable Pref(fontsize) -value 10 -command chFont menu .mo.mi .mo.mi add radiobutton -label "Nothing" -variable Pref(ignore) -value "" .mo.mi add radiobutton -label "Space changes (-b)" -variable Pref(ignore) -value "-b" .mo.mi add radiobutton -label "All spaces (-w)" -variable Pref(ignore) -value "-w" menu .mo.mp .mo.mp add radiobutton -label "Nothing" -variable Pref(parse) -value "none" .mo.mp add radiobutton -label "Lines" -variable Pref(parse) -value "line" .mo.mp add radiobutton -label "Blocks" -variable Pref(parse) -value "block" .mo.mp add separator .mo.mp add radiobutton -label "Characters" -variable Pref(lineparsewords) -value "0" .mo.mp add radiobutton -label "Words" -variable Pref(lineparsewords) -value "1" menubutton .mh -text Help -underline 0 -menu .mh.m menu .mh.m .mh.m add command -label "Help" -command {after 100 makeHelpWin} .mh.m add command -label "About" -command makeAboutWin button .bfn -text "Next Diff" -relief raised -command findNext |
︙ | ︙ | |||
715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 | text .he.t -width 80 -height 15 -wrap word -yscrollcommand ".he.sb set"\ -font "Courier 8" scrollbar .he.sb -orient vert -command ".he.t yview" button .he.b -text "Close" -command "destroy .he" pack .he.b -side bottom pack .he.sb -side right -fill y pack .he.t -side left -expand y -fill both .he.t insert end {\ File Menu Redo Diff : Run diff again on the same files. Open Both : Select two files, run diff. Open Left File : Select a file for left window, run diff Open Right File: Select a file for right window, run diff RCSDiff : (UNIX only) Select one file and run rcsdiff. Quit : Guess Options Menu Fontsize : Select fontsize for the two main text windows Ignore : Diff options for handling whitespace | > > > > > | > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > | | > > > > > > > > > > > > | > > > | > > > > | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > < | 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 | text .he.t -width 80 -height 15 -wrap word -yscrollcommand ".he.sb set"\ -font "Courier 8" scrollbar .he.sb -orient vert -command ".he.t yview" button .he.b -text "Close" -command "destroy .he" pack .he.b -side bottom pack .he.sb -side right -fill y pack .he.t -side left -expand y -fill both .he.t tag configure new -foreground blue -background gray .he.t tag configure change -foreground red -background gray .he.t tag configure ul -underline 1 .he.t insert end {\ } "" {Commands} ul { File Menu Redo Diff : Run diff again on the same files. Open Both : Select two files, run diff. Open Left File : Select a file for left window, run diff Open Right File: Select a file for right window, run diff RCSDiff : (UNIX only) Select one file and run rcsdiff. Quit : Guess Options Menu Fontsize : Select fontsize for the two main text windows Ignore : Diff options for handling whitespace Parse : Additional parsing made by diff.tcl to improve the display. See examples below. Nothing: No parsing made. Lines : When there is a changed block with the same number of lines in both right and left files, diff.tcl compares corresponding lines and tries to only highlight the part that has been changed. Blocks : When the number of lines in a changed block is not the same in both files, diff.tcl tries to find lines that look the same and place them abreast. The Char and Word options selects if the line parsing should highlight full words only, or check single characters. Diff Options Field: Any text written here will be passed to diff. Next Diff Button: Scrolls to the next differing block, or to the bottom if there are no more diffs. Equal sign: Above the vertical scrollbar, a "=" will appear if the files are equal. } "" {Examples of effects of parse options.} ul { Below are two example files, and four different results when using different options with those files. Left file: Right file: NET '/I$1/N$1454' IC2-15 IC5-7 NET '/I$1/N$1454' IC2-15 IC5-2 IC5-7 NET '/I$1/N$1455' IC2-14 IC6-8 NET '/I$1/N$1456' IC2-12 NET '/I$1/N$1456' IC2-13 IC2-12 NET '/I$1/N$1457' IC2-12 IC6-7 NET '/I$1/N$1457' IC2-12 IC6-7 NET '/I$1/N$1458' IC2-11 NET '/I$1/N$1458' IC2-10 } .he.t insert end "Example 1. No parsing.\n" .he.t insert end {1: NET '/I$1/N$1454' IC2-15 IC5-7 1: NET '/I$1/N$1454' IC2-15 IC5-2 IC5-7 } change .he.t insert end {2: NET '/I$1/N$1455' IC2-14 IC6-8 2: NET '/I$1/N$1456' IC2-12 } change .he.t insert end {3: NET '/I$1/N$1456' IC2-13 IC2-12 } change .he.t insert end { 4: NET '/I$1/N$1457' IC2-12 IC6-7 3: NET '/I$1/N$1457' IC2-12 IC6-7 } .he.t insert end {5: NET '/I$1/N$1458' IC2-10 4: NET '/I$1/N$1458' IC2-11 } change .he.t insert end "\n" .he.t insert end "Example 2. Lines and characters\n" .he.t insert end {1: NET '/I$1/N$1454' IC2-15 IC5-7 1: NET '/I$1/N$1454' IC2-15 IC5-2 IC5-7 } change .he.t insert end {2: NET '/I$1/N$1455' IC2-14 IC6-8 2: NET '/I$1/N$1456' IC2-12 } change .he.t insert end {3: NET '/I$1/N$1456' IC2-13 IC2-12 } change .he.t insert end { 4: NET '/I$1/N$1457' IC2-12 IC6-7 3: NET '/I$1/N$1457' IC2-12 IC6-7 } .he.t insert end {5: } change {NET '/I$1/N$1458' IC2-1} "" {0} change { } "" {4: } change {NET '/I$1/N$1458' IC2-1} "" {1} change "\n" .he.t insert end "\n" .he.t insert end "Example 3. Blocks and characters\n" .he.t insert end {1: } change {NET '/I$1/N$1454' IC2-15 IC5-7 } "" {1: } change {NET '/I$1/N$1454' IC2-15 IC5-} "" {2 IC5-} change "7\n" .he.t insert end {2: NET '/I$1/N$1455' IC2-14 IC6-8 } change "\n" "" .he.t insert end {3: } change {NET '/I$1/N$1456' IC2-1} "" {3 IC2-1} change {2 } "" {2: } change {NET '/I$1/N$1456' IC2-12 } .he.t insert end {4: NET '/I$1/N$1457' IC2-12 IC6-7 3: NET '/I$1/N$1457' IC2-12 IC6-7 } .he.t insert end {5: } change {NET '/I$1/N$1458' IC2-1} "" {0} change { } "" {4: } change {NET '/I$1/N$1458' IC2-1} "" {1} change "\n" .he.t insert end "\n" .he.t insert end "Example 4. Blocks and words\n" .he.t insert end {1: } change {NET '/I$1/N$1454' IC2-15 IC5-7 } "" {1: } change {NET '/I$1/N$1454' IC2-15 } "" {IC5-2 } change "IC5-7\n" .he.t insert end {2: NET '/I$1/N$1455' IC2-14 IC6-8 } change "\n" "" .he.t insert end {3: } change {NET '/I$1/N$1456' } "" {IC2-13 } change {IC2-12 } "" {2: } change {NET '/I$1/N$1456' IC2-12 } .he.t insert end {4: NET '/I$1/N$1457' IC2-12 IC6-7 3: NET '/I$1/N$1457' IC2-12 IC6-7 } .he.t insert end {5: } change {NET '/I$1/N$1458' } "" {IC2-10} change { } "" {4: } change {NET '/I$1/N$1458' } "" {IC2-11} change "\n" } proc parseCommandLine {} { global argv argc Pref global rightDir rightFile rightOK leftDir leftFile leftOK RCS set leftOK 0 set rightOK 0 set RCS 0 set noautodiff 0 if {$argc == 0} return set files "" foreach arg $argv { if {$arg == "-w"} { set Pref(ignore) "-w" } elseif {$arg == "-b"} { set Pref(ignore) "-b" } elseif {$arg == "-noparse"} { set Pref(parse) "none" } elseif {$arg == "-line"} { set Pref(parse) "line" } elseif {$arg == "-block"} { set Pref(parse) "block" } elseif {$arg == "-char"} { set Pref(lineparsewords) 0 } elseif {$arg == "-word"} { set Pref(lineparsewords) 1 } elseif {$arg == "-nodiff"} { set noautodiff 1 } elseif {[string range $arg 0 0] == "-"} { set Pref(dopt) "$Pref(dopt) $arg" } else { set apa [glob -nocomplain $arg] if {$apa == ""} { puts "Ignoring argument: $arg" } else { lappend files $apa } } } set len [llength $files] if {$len == 1} { set fullname [file join [pwd] $files] set fulldir [file dirname $fullname] if {[glob -nocomplain [file join $fulldir RCS]] != ""} { set RCS 1 set rightDir $fulldir set rightFile $fullname set rightOK 1 set leftFile "RCS" if {$noautodiff == "1"} { enableRedo } else { doDiff } } else { set leftDir $fulldir set leftFile $fullname set leftOK 1 } } elseif {$len >= 2} { set fullname [file join [pwd] [lindex $files 0]] set fulldir [file dirname $fullname] set leftDir $fulldir set leftFile $fullname set leftOK 1 set fullname [file join [pwd] [lindex $files 1]] set fulldir [file dirname $fullname] set rightDir $fulldir set rightFile $fullname set rightOK 1 if {$noautodiff == "1"} { enableRedo } else { doDiff } } } proc saveOptions {} { global Pref set ch [open "~/.diffrc" "w"] set a [array names Pref] foreach i $a { if {$i != "dopt"} { puts $ch "set Pref($i) \"$Pref($i)\"" } } close $ch } proc getOptions {} { global Pref set Pref(fontsize) 9 set Pref(ignore) "-b" set Pref(dopt) "" set Pref(parse) "block" set Pref(lineparsewords) "0" if {[file exists "~/.diffrc"]} { source "~/.diffrc" } } if {![winfo exists .f]} { getOptions makeDiffWin parseCommandLine } |