All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.darwinsys.diff.DiffPrint Maven / Gradle / Ivy

package com.darwinsys.diff;

import java.util.List;

import com.darwinsys.diff.Diff.Item;

/**
 * None of the many people who asked me about this Diff program ever sent me back a
 * decent print routine, which I'm sure some of them must have written, so eventually
 * I felt I had to write my own. The moreso since I actually needed it for diffing
 * recipe versions on https://androidcookbook.com/
 * @author Ian Darwin
 */
public class DiffPrint {
	public List diffList;

	public DiffPrint() {
	}
	
	/** 
	 * Format some Diff.Item objects for printing.
	 * Format as much as possible like regular diff(1)
	 * The Diff.Item class is just:
	 * public static class Item {
     * 	// Start Line number in Data A.
     * 	public int startA;
     * 	// Start Line number in Data B.
     * 	public int startB;
     * 	//Number of changes in Data A.
     * 	public int deletedA;
     * 	//Number of changes in Data B.
     * 	public int insertedB;
     * }
	 * @param diffItems The array of Diff.Item
	 * @param sOld The old file, as an array of String
	 * @param sNew The new file, as an array of String
	 * @param output The list of differences in textual form.
	 */
	public static void diffPrint(final Item[] diffItems, String[] sOld, String[] sNew, List output) {
		for (Item diff : diffItems) {
			DiffType type;
			if (diff.deletedA != 0 && diff.insertedB != 0) { // i.e., both
				type = DiffType.CHANGED;
			} else if (diff.deletedA != 0) {
				type = DiffType.DELETE_ONLY;
			} else {
				type = DiffType.INSERT_ONLY;
			}
			switch (type) {
			case CHANGED:
				output.add((diff.startA + diff.deletedA) + "c" + diff.startA);
				for (int i = diff.startA; i < diff.startA + diff.deletedA; i++) {
					output.add("< " + sOld[i]);
				}
				output.add("---");
				for (int i = diff.startB; i < diff.startB + diff.insertedB; i++) {
					output.add("> " + sNew[i]);
				}
				break;
			case DELETE_ONLY:
				output.add((diff.startA + diff.deletedA) + "d" + diff.startA);
				for (int i = diff.startA; i < diff.startA + diff.deletedA; i++) {
					output.add("< " + sOld[i]);
				}
				break;
			case INSERT_ONLY:
				output.add(diff.startA + "a" + diff.startA);
				for (int i = diff.startB; i < diff.startB + diff.insertedB; i++) {
					output.add("> " + sNew[i]);
				}
				break;
			}
		}
	}
	
	private static String printRange(int start, int end) {
		if (start == end) {
			return Integer.toString(start);
		}
		return start + "," + end;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy