summaryrefslogtreecommitdiff
path: root/gnu/dist/diffutils/src/side.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/dist/diffutils/src/side.c')
-rw-r--r--gnu/dist/diffutils/src/side.c285
1 files changed, 0 insertions, 285 deletions
diff --git a/gnu/dist/diffutils/src/side.c b/gnu/dist/diffutils/src/side.c
deleted file mode 100644
index 1ad8c4ec86e..00000000000
--- a/gnu/dist/diffutils/src/side.c
+++ /dev/null
@@ -1,285 +0,0 @@
-/* $NetBSD: side.c,v 1.1.1.1 2003/01/26 00:43:17 wiz Exp $ */
-
-/* sdiff-format output routines for GNU DIFF.
-
- Copyright (C) 1991, 1992, 1993, 1998, 2001, 2002 Free Software
- Foundation, Inc.
-
- This file is part of GNU DIFF.
-
- GNU DIFF is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY. No author or distributor
- accepts responsibility to anyone for the consequences of using it
- or for whether it serves any particular purpose or works at all,
- unless he says so in writing. Refer to the GNU DIFF General Public
- License for full details.
-
- Everyone is granted permission to copy, modify and redistribute
- GNU DIFF, but only under the conditions described in the
- GNU DIFF General Public License. A copy of this license is
- supposed to have been given to you along with GNU DIFF so you
- can know your rights and responsibilities. It should be in a
- file named COPYING. Among other things, the copyright notice
- and this notice must be preserved on all copies. */
-
-#include "diff.h"
-
-static void print_sdiff_common_lines (lin, lin);
-static void print_sdiff_hunk (struct change *);
-
-/* Next line number to be printed in the two input files. */
-static lin next0, next1;
-
-/* Print the edit-script SCRIPT as a sdiff style output. */
-
-void
-print_sdiff_script (struct change *script)
-{
- begin_output ();
-
- next0 = next1 = - files[0].prefix_lines;
- print_script (script, find_change, print_sdiff_hunk);
-
- print_sdiff_common_lines (files[0].valid_lines, files[1].valid_lines);
-}
-
-/* Tab from column FROM to column TO, where FROM <= TO. Yield TO. */
-
-static unsigned int
-tab_from_to (unsigned int from, unsigned int to)
-{
- FILE *out = outfile;
- unsigned int tab;
-
- if (!expand_tabs)
- for (tab = from + TAB_WIDTH - from % TAB_WIDTH; tab <= to; tab += TAB_WIDTH)
- {
- putc ('\t', out);
- from = tab;
- }
- while (from++ < to)
- putc (' ', out);
- return to;
-}
-
-/*
- * Print the text for half an sdiff line. This means truncate to width
- * observing tabs, and trim a trailing newline. Returns the last column
- * written (not the number of chars).
- */
-static unsigned int
-print_half_line (char const *const *line, unsigned int indent,
- unsigned int out_bound)
-{
- FILE *out = outfile;
- register unsigned int in_position = 0;
- register unsigned int out_position = 0;
- register char const *text_pointer = line[0];
- register char const *text_limit = line[1];
-
- while (text_pointer < text_limit)
- {
- register unsigned char c = *text_pointer++;
-
- switch (c)
- {
- case '\t':
- {
- unsigned int spaces = TAB_WIDTH - in_position % TAB_WIDTH;
- if (in_position == out_position)
- {
- unsigned int tabstop = out_position + spaces;
- if (expand_tabs)
- {
- if (out_bound < tabstop)
- tabstop = out_bound;
- for (; out_position < tabstop; out_position++)
- putc (' ', out);
- }
- else
- if (tabstop < out_bound)
- {
- out_position = tabstop;
- putc (c, out);
- }
- }
- in_position += spaces;
- }
- break;
-
- case '\r':
- {
- putc (c, out);
- tab_from_to (0, indent);
- in_position = out_position = 0;
- }
- break;
-
- case '\b':
- if (in_position != 0 && --in_position < out_bound)
- {
- if (out_position <= in_position)
- /* Add spaces to make up for suppressed tab past out_bound. */
- for (; out_position < in_position; out_position++)
- putc (' ', out);
- else
- {
- out_position = in_position;
- putc (c, out);
- }
- }
- break;
-
- case '\f':
- case '\v':
- control_char:
- if (in_position < out_bound)
- putc (c, out);
- break;
-
- default:
- if (! ISPRINT (c))
- goto control_char;
- /* falls through */
- case ' ':
- if (in_position++ < out_bound)
- {
- out_position = in_position;
- putc (c, out);
- }
- break;
-
- case '\n':
- return out_position;
- }
- }
-
- return out_position;
-}
-
-/*
- * Print side by side lines with a separator in the middle.
- * 0 parameters are taken to indicate white space text.
- * Blank lines that can easily be caught are reduced to a single newline.
- */
-
-static void
-print_1sdiff_line (char const *const *left, char sep,
- char const *const *right)
-{
- FILE *out = outfile;
- unsigned int hw = sdiff_half_width, c2o = sdiff_column2_offset;
- unsigned int col = 0;
- bool put_newline = 0;
-
- if (left)
- {
- put_newline |= left[1][-1] == '\n';
- col = print_half_line (left, 0, hw);
- }
-
- if (sep != ' ')
- {
- col = tab_from_to (col, (hw + c2o - 1) / 2) + 1;
- if (sep == '|' && put_newline != (right[1][-1] == '\n'))
- sep = put_newline ? '/' : '\\';
- putc (sep, out);
- }
-
- if (right)
- {
- put_newline |= right[1][-1] == '\n';
- if (**right != '\n')
- {
- col = tab_from_to (col, c2o);
- print_half_line (right, col, hw);
- }
- }
-
- if (put_newline)
- putc ('\n', out);
-}
-
-/* Print lines common to both files in side-by-side format. */
-static void
-print_sdiff_common_lines (lin limit0, lin limit1)
-{
- lin i0 = next0, i1 = next1;
-
- if (!suppress_common_lines && (i0 != limit0 || i1 != limit1))
- {
- if (sdiff_merge_assist)
- {
- long len0 = limit0 - i0;
- long len1 = limit1 - i1;
- fprintf (outfile, "i%ld,%ld\n", len0, len1);
- }
-
- if (!left_column)
- {
- while (i0 != limit0 && i1 != limit1)
- print_1sdiff_line (&files[0].linbuf[i0++], ' ',
- &files[1].linbuf[i1++]);
- while (i1 != limit1)
- print_1sdiff_line (0, ')', &files[1].linbuf[i1++]);
- }
- while (i0 != limit0)
- print_1sdiff_line (&files[0].linbuf[i0++], '(', 0);
- }
-
- next0 = limit0;
- next1 = limit1;
-}
-
-/* Print a hunk of an sdiff diff.
- This is a contiguous portion of a complete edit script,
- describing changes in consecutive lines. */
-
-static void
-print_sdiff_hunk (struct change *hunk)
-{
- lin first0, last0, first1, last1;
- register lin i, j;
-
- /* Determine range of line numbers involved in each file. */
- enum changes changes =
- analyze_hunk (hunk, &first0, &last0, &first1, &last1);
- if (!changes)
- return;
-
- /* Print out lines up to this change. */
- print_sdiff_common_lines (first0, first1);
-
- if (sdiff_merge_assist)
- {
- long len0 = last0 - first0 + 1;
- long len1 = last1 - first1 + 1;
- fprintf (outfile, "c%ld,%ld\n", len0, len1);
- }
-
- /* Print ``xxx | xxx '' lines */
- if (changes == CHANGED)
- {
- for (i = first0, j = first1; i <= last0 && j <= last1; i++, j++)
- print_1sdiff_line (&files[0].linbuf[i], '|', &files[1].linbuf[j]);
- changes = (i <= last0 ? OLD : 0) + (j <= last1 ? NEW : 0);
- next0 = first0 = i;
- next1 = first1 = j;
- }
-
- /* Print `` > xxx '' lines */
- if (changes & NEW)
- {
- for (j = first1; j <= last1; ++j)
- print_1sdiff_line (0, '>', &files[1].linbuf[j]);
- next1 = j;
- }
-
- /* Print ``xxx < '' lines */
- if (changes & OLD)
- {
- for (i = first0; i <= last0; ++i)
- print_1sdiff_line (&files[0].linbuf[i], '<', 0);
- next0 = i;
- }
-}