/*=============================================================================#
 # Copyright (c) 2011, 2018 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.rj.server.dbg;


public class Srcref {
	
	
	public static final int BEGIN_LINE= 0;
	public static final int BEGIN_COLUMN= 4;
	public static final int BEGIN_BYTE= 1;
	
	public static final int END_LINE= 2;
	public static final int END_COLUMN= 5;
	public static final int END_BYTE= 3;
	
	public static final int NA= Integer.MIN_VALUE;
	
	
	public static int[] diff(final int[] base, final int[] rel) {
		final int[] diff= new int[6];
		
		if (base[BEGIN_LINE] > 0 && rel[BEGIN_LINE] > 0) {
			diff[BEGIN_LINE]= 1 + rel[BEGIN_LINE] - base[BEGIN_LINE];
			if (diff[BEGIN_LINE] <= 0) {
				return null;
			}
		}
		else {
			diff[BEGIN_LINE]= NA;
		}
		if (diff[BEGIN_LINE] == 1) {
			if (base[BEGIN_COLUMN] > 0 && rel[BEGIN_COLUMN] > 0) {
				diff[BEGIN_COLUMN]= 1 + rel[BEGIN_COLUMN] - base[BEGIN_COLUMN];
				if (diff[BEGIN_COLUMN] <= 0) {
					return null;
				}
			}
			else {
				diff[BEGIN_COLUMN]= NA;
			}
			if (base[BEGIN_BYTE] > 0 && rel[BEGIN_BYTE] > 0) {
				diff[BEGIN_BYTE]= 1 + rel[BEGIN_BYTE] - base[BEGIN_BYTE];
				if (diff[BEGIN_BYTE] <= 0) {
					diff[BEGIN_BYTE]= NA;
				}
			}
			else {
				diff[BEGIN_BYTE]= NA;
			}
		}
		
		if (base[BEGIN_LINE] > 0 && rel[END_LINE] > 0) {
			diff[END_LINE]= 1 + rel[END_LINE] - base[BEGIN_LINE];
			if (diff[END_LINE] <= 0) {
				return null;
			}
		}
		else {
			diff[END_LINE]= NA;
		}
		if (diff[END_LINE] == 1) {
			if (base[BEGIN_COLUMN] > 0 && rel[END_COLUMN] > 0) {
				diff[END_COLUMN]= 1 + rel[END_COLUMN] - base[BEGIN_COLUMN];
				if (diff[END_COLUMN] <= 0) {
					return null;
				}
			}
			else {
				diff[END_COLUMN]= NA;
			}
			if (base[BEGIN_BYTE] > 0 && rel[END_BYTE] > 0) {
				diff[END_BYTE]= 1 + rel[END_BYTE] - base[BEGIN_BYTE];
				if (diff[END_BYTE] <= 0) {
					diff[END_BYTE]= NA;
				}
			}
			else {
				diff[END_BYTE]= NA;
			}
		}
		
		return diff;
	}
	
	public static int addLine(final int base, final int diff) {
		if (base > 0 && diff > 0) {
			return base + diff - 1;
		}
		else {
			return NA;
		}
	}
	
	public static int[] add(final int[] base, final int[] diff) {
		final int[] sum= new int[6];
		
		sum[BEGIN_LINE]= addLine(base[BEGIN_LINE], diff[BEGIN_LINE]);
		if (diff[BEGIN_LINE] == 1) {
			if (base[BEGIN_COLUMN] > 0 && diff[BEGIN_COLUMN] > 0) {
				sum[BEGIN_COLUMN]= base[BEGIN_COLUMN] + diff[BEGIN_COLUMN] - 1;
			}
			else {
				sum[BEGIN_COLUMN]= NA;
			}
			if (base[BEGIN_BYTE] > 0 && diff[BEGIN_BYTE] > 0) {
				sum[BEGIN_BYTE]= base[BEGIN_BYTE] + diff[BEGIN_BYTE] - 1;
			}
			else {
				sum[BEGIN_BYTE]= NA;
			}
		}
		else {
			sum[BEGIN_COLUMN]= base[BEGIN_COLUMN];
			sum[BEGIN_BYTE]= base[BEGIN_BYTE];
		}
		
		sum[END_LINE]= addLine(base[BEGIN_LINE], diff[END_LINE]);
		if (diff[END_LINE] == 1) {
			if (base[BEGIN_COLUMN] > 0 && diff[END_COLUMN] > 0) {
				sum[END_COLUMN]= base[BEGIN_COLUMN] + diff[END_COLUMN] - 1;
			}
			else {
				sum[END_COLUMN]= NA;
			}
			if (base[BEGIN_BYTE] > 0 && diff[END_BYTE] > 0) {
				sum[END_BYTE]= base[BEGIN_BYTE] + diff[END_BYTE] - 1;
			}
			else {
				sum[END_BYTE]= NA;
			}
		}
		else {
			sum[END_COLUMN]= base[END_COLUMN];
			sum[END_BYTE]= base[END_BYTE];
		}
		
		return sum;
	}
	
}
