Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
DISCONTINUED:openSUSE:11.2
wdiff
wdiff-0.5.93-lermen.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File wdiff-0.5.93-lermen.patch of Package wdiff
--- wdiff-0.5.93/src/wdiff.c.orig 2009-08-03 21:20:25.673199000 +0200 +++ wdiff-0.5.93/src/wdiff.c 2009-08-03 23:23:17.744638000 +0200 @@ -16,6 +16,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#ifdef LERMEN_STUFF +#define LVERSION "L3" +#endif + #include "system.h" /* Exit codes values. */ @@ -112,11 +116,15 @@ struct option const longopts[] = {"no-init-term", 0, NULL, 'K'}, {"no-inserted" , 0, NULL, '2'}, {"printer" , 0, NULL, 'p'}, + {"punctuation" , 0, NULL, 'P'}, {"start-delete", 1, NULL, 'w'}, {"start-insert", 1, NULL, 'y'}, {"statistics" , 0, NULL, 's'}, {"terminal" , 0, NULL, 't'}, {"version" , 0, NULL, 'v'}, +#ifdef LERMEN_STUFF + {"context" , 1, NULL, 'c'}, +#endif {NULL , 0, NULL, 0} }; @@ -126,6 +134,7 @@ int inhibit_left; /* inhibit display of int inhibit_right; /* inhibit display of left side words */ int inhibit_common; /* inhibit display of common words */ int ignore_case; /* ignore case in comparisons */ +int ignore_punct; /* ignore punctuation (treat as whitespace) */ int show_statistics; /* if printing summary statistics */ int no_wrapping; /* end/restart strings at end of lines */ int autopager; /* if calling the pager automatically */ @@ -225,6 +234,142 @@ setup_signals (void) } +#ifdef LERMEN_STUFF + +/* we intercept output to 'output_file' in order to catch some lines + * of context _before_ and _after_ the emphasized parts + */ + +#define BUFLINE_SIZE 1024 +struct bufline { + struct bufline *next; + char line[BUFLINE_SIZE]; +}; + +static struct bufline *headbufline = 0; +static struct bufline *tailbufline = 0; +static int bufcols = 0; +static int in_emphasize = 0; +static int context_lines = 0; +static int bufline_overrun = 0; +static int behind_emphasize = 0; + +static void init_savebuffers(int lines) +{ + struct bufline *p; + int i; + + if (headbufline) return; + context_lines = ++lines; + headbufline = p = malloc(sizeof(struct bufline)); + for (i=0; i<lines; i++) { + p->next = malloc(sizeof(struct bufline)); + p = p->next; + } + p->next = tailbufline = headbufline; /* close the circle */ +} + +static inline void inc_headbuf(void) +{ + headbufline = headbufline->next; + if (headbufline == tailbufline) { + bufline_overrun = 1; + tailbufline = tailbufline->next; + } +} + +static void flush_buflines(void) +{ + if (!bufcols && (headbufline == tailbufline)) return; + if (bufcols) { + headbufline->line[bufcols] = 0; + inc_headbuf(); + bufcols = 0; + } + while (headbufline != tailbufline) { + if (bufline_overrun) { + fprintf(output_file, "\n%s\n", SEPARATOR_LINE); + bufline_overrun = 0; + } + fputs(tailbufline->line, output_file); + tailbufline = tailbufline->next; + } +} + +static inline void save_char(int c) +{ + headbufline->line[bufcols++] = c; + if (c == '\n') { + headbufline->line[bufcols] = 0; + inc_headbuf(); + bufcols = 0; + } +} + +static inline int our_putc(int c, FILE *stream) +{ + if (context_lines && stream == output_file) { + if (!in_emphasize) { + if (behind_emphasize) { + if (c == '\n') behind_emphasize--; + } + else { + save_char(c); + return (int)((unsigned char) c); + } + } + } + return putc(c, stream); +} +#undef putc +#define putc our_putc + + +static void real_start_of_delete (void); +static void real_end_of_delete (void); +static void real_start_of_insert (void); +static void real_end_of_insert (void); + +static void our_start_of_delete (void) +{ + if (context_lines) flush_buflines(); + in_emphasize = 1; + real_start_of_delete(); +} +static void our_end_of_delete (void) +{ + real_end_of_delete(); + in_emphasize = 0; + behind_emphasize = context_lines; +} +static void our_start_of_insert (void) +{ + if (context_lines) flush_buflines(); + in_emphasize = 1; + real_start_of_insert(); +} +static void our_end_of_insert (void) +{ + real_end_of_insert(); + in_emphasize = 0; + behind_emphasize = context_lines; +} + +#define start_of_delete our_start_of_delete +#define end_of_delete our_end_of_delete +#define start_of_insert our_start_of_insert +#define end_of_insert our_end_of_insert + +#else /* not LERMEN_STUFF */ + +#define start_of_delete real_start_of_delete +#define end_of_delete real_end_of_delete +#define start_of_insert real_start_of_insert +#define end_of_insert real_end_of_insert + +#endif + + /* Terminal initialization. */ static void @@ -305,7 +450,7 @@ putc_for_tputs (int chr) `---------------------------*/ static void -start_of_delete (void) +real_start_of_delete (void) { /* Avoid any emphasis if it would be useless. */ @@ -327,7 +472,7 @@ start_of_delete (void) `-------------------------*/ static void -end_of_delete (void) +real_end_of_delete (void) { /* Avoid any emphasis if it would be useless. */ @@ -349,7 +494,7 @@ end_of_delete (void) `---------------------------*/ static void -start_of_insert (void) +real_start_of_insert (void) { /* Avoid any emphasis if it would be useless. */ @@ -371,7 +516,7 @@ start_of_insert (void) `-------------------------*/ static void -end_of_insert (void) +real_end_of_insert (void) { /* Avoid any emphasis if it would be useless. */ @@ -388,6 +533,12 @@ end_of_insert (void) copy_mode = COPY_NORMAL; } +/*----------------------------------------------------------------. +| We say "white space", but we actually mean space or punctuation | +`----------------------------------------------------------------*/ + +#define is_space_or_punct(c) (isspace(c) || ignore_punct && ispunct(c)) + /*--------------------------------. | Skip over white space on SIDE. | `--------------------------------*/ @@ -398,7 +549,7 @@ skip_whitespace (SIDE *side) if (interrupted) longjmp (signal_label, 1); - while (isspace (side->character)) + while (is_space_or_punct (side->character)) side->character = getc (side->file); } @@ -412,7 +563,7 @@ skip_word (SIDE *side) if (interrupted) longjmp (signal_label, 1); - while (side->character != EOF && !isspace (side->character)) + while (side->character != EOF && !is_space_or_punct (side->character)) side->character = getc (side->file); side->position++; } @@ -433,7 +584,7 @@ copy_whitespace (SIDE *side, FILE *file) /* While changing lines, ensure we stop any special display prior to, and restore the special display after. When copy_mode is anything else than COPY_NORMAL, file is always output_file. We - care underlining whitespace or overstriking it with itself, + care about underlining whitespace or overstriking it with itself, because "less" understands these things as emphasis requests. */ switch (copy_mode) @@ -969,7 +1120,10 @@ launch_input_program (void) static void complete_input_program (void) { - fclose (input_file); + if (input_file) { + fclose (input_file); + input_file = NULL; + } wait (NULL); } @@ -1077,6 +1231,7 @@ complete_output_program (void) if (output_file && output_file != stdout) { fclose (output_file); + output_file = NULL; wait (NULL); } @@ -1107,29 +1262,29 @@ print_statistics (void) count_common_right = count_total_right - count_isolated_right - count_changed_right; - printf (_("%s: %d words"), left_side->filename, count_total_left); + fprintf (stderr, "%s: %d words", left_side->filename, count_total_left); if (count_total_left > 0) { - printf (_(" %d %d%% common"), count_common_left, + fprintf (stderr, " %d %d%% common", count_common_left, count_common_left * 100 / count_total_left); - printf (_(" %d %d%% deleted"), count_isolated_left, + fprintf (stderr, " %d %d%% deleted", count_isolated_left, count_isolated_left * 100 / count_total_left); - printf (_(" %d %d%% changed"), count_changed_left, + fprintf (stderr, " %d %d%% changed", count_changed_left, count_changed_left * 100 / count_total_left); } - printf ("\n"); + fprintf (stderr, "\n"); - printf (_("%s: %d words"), right_side->filename, count_total_right); + fprintf (stderr, _("%s: %d words"), right_side->filename, count_total_right); if (count_total_right > 0) { - printf (_(" %d %d%% common"), count_common_right, + fprintf (stderr, " %d %d%% common", count_common_right, count_common_right * 100 / count_total_right); - printf (_(" %d %d%% inserted"), count_isolated_right, + fprintf (stderr, " %d %d%% inserted", count_isolated_right, count_isolated_right * 100 / count_total_right); - printf (_(" %d %d%% changed"), count_changed_right, + fprintf (stderr, " %d %d%% changed", count_changed_right, count_changed_right * 100 / count_total_right); } - printf ("\n"); + fprintf (stderr, "\n"); } @@ -1186,6 +1341,10 @@ Mandatory arguments to long options are -1, --no-deleted inhibit output of deleted words\n\ -2, --no-inserted inhibit output of inserted words\n\ -3, --no-common inhibit output of common words\n")); +#ifdef LERMEN_STUFF + printf (_("\ + -c --context like -3, but print given context lines\n")); +#endif printf (_("\ -a, --auto-pager automatically calls a pager\n\ -h, --help print this help\n\ @@ -1194,6 +1353,7 @@ Mandatory arguments to long options are -n, --avoid-wraps do not extend fields through newlines\n\ -p, --printer overstrike as for printers\n")); printf (_("\ + -P, --punctuation treat punctuation like white space\n\ -s, --statistics say how many words deleted, inserted etc.\n\ -t, --terminal use termcap as for terminal displays\n\ -v, --version print program version then exit\n\ @@ -1255,7 +1415,7 @@ main (int argc, char *const argv[]) count_changed_right = 0; while (option_char = getopt_long (argc, (char **) argv, - "123CKahilnpstvw:x:y:z:", longopts, NULL), + "123CKahilnpPstvw:x:y:z:c:", longopts, NULL), option_char != EOF) switch (option_char) { @@ -1301,6 +1461,10 @@ main (int argc, char *const argv[]) overstrike = 1; break; + case 'P': + ignore_punct = 1; + break; + case 's': show_statistics = 1; break; @@ -1320,9 +1484,13 @@ main (int argc, char *const argv[]) #endif case 'v': +#ifdef LERMEN_STUFF + printf ("wdiff (GNU %s) %s %s\n", PACKAGE, VERSION, LVERSION); +#else printf ("wdiff (GNU %s) %s\n", PACKAGE, VERSION); +#endif fputs (_("\ \n\ Copyright (C) 1992, 1997 Free Software Foundation, Inc.\n"), stdout); fputs (_("\ @@ -1351,6 +1520,12 @@ Written by Franc,ois Pinard <pinard@iro. user_insert_end = optarg; break; +#ifdef LERMEN_STUFF + case 'c': + init_savebuffers(atoi(optarg)); + break; +#endif + default: usage (EXIT_FAILURE); } @@ -1361,6 +1536,13 @@ Written by Franc,ois Pinard <pinard@iro. usage (EXIT_FAILURE); } +#ifdef LERMEN_STUFF + if (context_lines) { + inhibit_common = 0; + if (inhibit_right && inhibit_left) inhibit_right = 0; + } +#endif + /* If find_termcap still undecided, make it true only if autopager is set while stdout is directed to a terminal. This decision might be reversed later, if the pager happens to be "less". */ --- wdiff-0.5.93/src/xwdiff.orig 2009-08-03 21:36:17.993713000 +0200 +++ wdiff-0.5.93/src/xwdiff 2009-08-03 21:36:17.997709000 +0200 @@ -0,0 +1,307 @@ +#!/bin/bash +# the next line restarts using wish \ +exec wish "$0" "$@" + +proc positionWindow w { + wm geometry $w +100+100 +} + +proc positionWindowRelative {w masterw dx dy} { + set xx [split [wm geometry $masterw] +] + wm geometry $w "+[expr [lindex $xx 1] + $dx]+[expr [lindex $xx 2] + $dy]" +} + +proc positionSubWindow {w} { + positionWindowRelative $w . 0 +45 +} + +set answer 0 + +proc ___read_and_display_output { w titletext but1 but2 movto filehandle} { + global answer + if {$w != ""} { + catch {destroy $w} + toplevel $w + set w_ $w + } else { + set w_ . + } + wm title $w_ $titletext + wm iconname $w_ $titletext + positionWindow $w_ + set line "" + + + frame $w.buttons + pack $w.buttons -side bottom -expand y -fill x -pady 2m + set answer 0 + button $w.buttons.but1 -text $but1 -width 20 -command "destroy $w; global answer; set answer 0" + if { "$but2" == "" } { + pack $w.buttons.but1 -side left -expand 1 + } else { + button $w.buttons.but2 -text $but2 -width 20 -command "destroy $w; global answer; set answer 1" + pack $w.buttons.but1 $w.buttons.but2 -side left -expand 1 + } + text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 -height 25 -width 80 + scrollbar $w.scroll -command "$w.text yview" + pack $w.scroll -side right -fill y + pack $w.text -expand yes -fill both + $w.text configure -background #fff2dc + $w.text configure -font -*-courier-medium-r-*-*-14-*-*-*-*-*-*-* + + $w.text tag configure overstrike -overstrike on + $w.text tag configure boldoverstrike -overstrike on -font -*-courier-bold-r-*-*-14-*-*-*-*-*-*-* + $w.text tag configure bold -font -*-courier-bold-r-*-*-14-*-*-*-*-*-*-* +# $w.text tag configure color1 -background black -foreground white +# $w.text tag configure color1 -foreground #ff1800 +# $w.text tag configure color1 -foreground #0000c0 + $w.text tag configure boldblue -font -*-courier-bold-r-*-*-14-*-*-*-*-*-*-* -foreground #0000b0 + set instag boldblue + set deltag boldoverstrike + set tag "" + set need_newline 0; + while {[eof $filehandle] == 0} { + set ret [gets $filehandle line] + if {$ret < 0} { + continue + } + if {[string compare "\x1bY1" $line] == 0} { + set need_newline 0; + set tag $instag + continue + } + if {[string compare "\x1bY0" $line] == 0} { + set need_newline 0; + set tag "" + continue + } + if {[string compare "\x1bX1" $line] == 0} { + set need_newline 0; + set tag $deltag + continue + } + if {[string compare "\x1bX0" $line] == 0} { + set need_newline 0; + set tag "" + continue + } + if {$need_newline} {$w.text insert end "\n"} + set need_newline 1; + $w.text insert end $line $tag + } + $w.text yview moveto $movto + vwait answer + return $answer +} + +set lastsearchtx "" +set lastcur "" + +# textSearch -- +# Search for all instances of a given string in a text widget and +# apply a given tag to each instance found. +# +# Arguments: +# w - The window in which to search. Must be a text widget. +# string - The string to search for. The search is done using +# exact matching only; no special characters. +# tag - Tag to apply to each instance of a matching string. + +proc textSearch {w string tag} { + global lastcur + $w tag remove search 0.0 end + set lastcur "" + if {$string == ""} { + return + } + set cur 1.0 + while 1 { + set cur [$w search -nocase -count length $string $cur end] + if {$cur == ""} { + if {$lastcur != ""} {$w yview $lastcur} + break + } + if {$lastcur == ""} {set lastcur $cur} + $w tag add $tag $cur "$cur + $length char" + set cur [$w index "$cur + $length char"] + } +} + + +proc textSearchjmp {w string tag} { + global lastsearchtx lastcur + if { ($lastcur != "") && ([string compare $lastsearchtx $string] == 0) } { +puts ">$lastcur< >$lastsearchtx<" + set lastcur [lindex [$w tag nextrange $tag [expr $lastcur + 1.0] end] 0] +puts ">$lastcur<" + if {$lastcur != ""} {$w yview $lastcur} + } else { + textSearch $w $string $tag + set lastsearchtx $string + } +} + +proc gotopos {w pos} { + global lastcur + $w yview $pos + set lastcur [ $w index $pos ] +} + +proc read_and_display_output { w titletext but1 but2 movto filehandle} { + global answer lastcur + if {$w != ""} { + catch {destroy $w} + toplevel $w + set w_ $w + } else { + set w_ . + } + wm title $w_ $titletext + wm iconname $w_ $titletext + positionWindow $w_ + set line "" + + + frame $w.buttons + pack $w.buttons -side bottom -expand y -fill x -pady 2m + set answer 0 + button $w.buttons.but1 -text $but1 -command "destroy $w; global answer; set answer 0" + if { "$but2" == "" } { + pack $w.buttons.but1 -side left -expand 1 + } else { + button $w.buttons.but2 -text $but2 -width 20 -command "destroy $w; global answer; set answer 1" + pack $w.buttons.but1 $w.buttons.but2 -side left -expand 1 + } + + button $w.buttons.top -text "Go top" -anchor w -command \ + "gotopos $w.text 1.0" + button $w.buttons.bot -text "Go bottom" -anchor w -command \ + "gotopos $w.text end" + pack $w.buttons.top $w.buttons.bot -side left -expand 1 + + label $w.buttons.label -textvariable lastcur -anchor w -width 8 + button $w.buttons.search -text "Search" -anchor w -command \ + "textSearchjmp $w.text \$searchString search" + entry $w.buttons.entry -width 40 -textvariable searchString + pack $w.buttons.label $w.buttons.entry $w.buttons.search -side left -padx 2 + bind $w.buttons.entry <Return> "textSearchjmp $w.text \$searchString search" + + text $w.text -relief sunken -bd 2 -yscrollcommand "$w.scroll set" -setgrid 1 -height 25 -width 80 + scrollbar $w.scroll -command "$w.text yview" + pack $w.scroll -side right -fill y + pack $w.text -expand yes -fill both + $w.text configure -background #fff2dc + $w.text configure -font -*-courier-medium-r-*-*-14-*-*-*-*-*-*-* + + $w.text tag configure overstrike -overstrike on + $w.text tag configure boldoverstrike -overstrike on -font -*-courier-bold-r-*-*-14-*-*-*-*-*-*-* + $w.text tag configure bold -font -*-courier-bold-r-*-*-14-*-*-*-*-*-*-* +# $w.text tag configure color1 -background black -foreground white +# $w.text tag configure color1 -foreground #ff1800 +# $w.text tag configure color1 -foreground #0000c0 + $w.text tag configure boldblue -font -*-courier-bold-r-*-*-14-*-*-*-*-*-*-* -foreground #0000b0 + +$w.text tag configure search -background #c83000 -foreground white \ + -relief raised -borderwidth 2 + + set instag boldblue + set deltag boldoverstrike + set tag "" + set need_newline 0; + while {[eof $filehandle] == 0} { + set ret [gets $filehandle line] + if {$ret < 0} { + continue + } + if {[string compare "\x1bY1" $line] == 0} { + set need_newline 0; + set tag $instag + continue + } + if {[string compare "\x1bY0" $line] == 0} { + set need_newline 0; + set tag "" + continue + } + if {[string compare "\x1bX1" $line] == 0} { + set need_newline 0; + set tag $deltag + continue + } + if {[string compare "\x1bX0" $line] == 0} { + set need_newline 0; + set tag "" + continue + } + if {$need_newline} {$w.text insert end "\n"} + set need_newline 1; + $w.text insert end $line $tag + } + $w.text yview moveto $movto + vwait answer + return $answer +} + +proc usage {} { + puts { +USAGE: + xwdiff oldfile newfile + xwdiff -w numcontextlines oldfile newfile >prepared_diff_file + xwdiff -view TitleText <prepared_diff_file + xwdiff -a numcontextlines oldfile newfile >plain_ascii_diff +} + exit 1 +} + +set secondphase "-view" +set option_W "-w" +set option_D "-a" +set arg1 [lindex $argv 0] + +if { [string compare $arg1 $option_W] == 0 } { + set context [lindex $argv 1] + set n1 [lindex $argv 2] + set n2 [lindex $argv 3] + if {$n2 == ""} {usage} + catch {exec wdiff -w "\n\x1bX1\n" -x "\n\x1bX0\n" \ + -y "\n\x1bY1\n" -z "\n\x1bY0\n" -c $context $n1 $n2 >@ file1 } + exit +} + +if { [string compare $arg1 $option_D] == 0 } { + set context [lindex $argv 1] + set n1 [lindex $argv 2] + set n2 [lindex $argv 3] + if {$n2 == ""} {usage} +# catch {exec wdiff -w "\n\[---\n" -x "\n---\]\n" \ +# -y "\n\{+++\n" -z "\n+++\}\n" -c $context $n1 $n2 >@ file1} + catch {exec wdiff -w "\n\[OLD\n" -x "\n\\OLD\]\n" \ + -y "\n\{NEW\n" -z "\n\\NEW\}\n" -c $context $n1 $n2 >@ file1} + exit +} + +if { [string compare $arg1 $secondphase] } { + set n1 [lindex $argv 0] + set n2 [lindex $argv 1] + if {$n2 == ""} {usage} + catch { exec wdiff -w "\n\x1bX1\n" -x "\n\x1bX0\n" -y "\n\x1bY1\n" \ + -z "\n\x1bY0\n" -c4 $n1 $n2 | $argv0 $secondphase "xwdiff $n2"} + exit +} + +set arg2 [lindex $argv 1] +if {$arg2 == ""} {usage} + +read_and_display_output "" $arg2 Quit "" 0 file0 +exit + + + + + + + + + + +
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor