/*******************************************************************************
 * Copyright (c) 2010 Nokia and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Nokia - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.debug.edc.formatter;

import org.eclipse.cdt.core.IAddress;
import org.eclipse.cdt.debug.edc.internal.EDCDebugger;
import org.eclipse.cdt.debug.edc.internal.symbols.IArrayBoundType;
import org.eclipse.cdt.debug.edc.internal.symbols.IArrayType;
import org.eclipse.cdt.debug.edc.services.IEDCExpression;
import org.eclipse.cdt.debug.edc.symbols.IMemoryVariableLocation;
import org.eclipse.cdt.debug.edc.symbols.IType;
import org.eclipse.cdt.debug.edc.symbols.IVariableLocation;
import org.eclipse.cdt.debug.edc.symbols.TypeUtils;
import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;

/**
 * Base class for string formatters.
 */
public abstract class AbstractStringFormatter implements IVariableFormatProvider {

	/**
	 * Converter handles char* and wchar_t* strings terminated by a null character.
	 */
	public class DefaultNullTerminatedStringConverter extends AbstractVariableConverter {
		public DefaultNullTerminatedStringConverter(IType type, boolean forDetails) {
			super(type, forDetails);
		}


		@Override
		protected String getDetailsValue(IExpressionDMContext variable) throws CoreException {
			return getValueString(variable);
		}

		@Override
		protected String getSummaryValue(IExpressionDMContext variable) throws CoreException {
			return getValueString(variable);
		}

		private String getValueString(IExpressionDMContext variable) throws CoreException {
			IEDCExpression expressionDMC = (IEDCExpression) variable;
			expressionDMC.evaluateExpression();
			IType baseType = TypeUtils.getBaseType(expressionDMC.getEvaluatedType());
			int size = baseType.getByteSize();
			
			if (baseType instanceof IArrayType) {
				IArrayBoundType[] bounds = ((IArrayType)baseType).getBounds();
				int elements = 1;
				for (IArrayBoundType bound : bounds)
					elements *= bound.getBoundCount();
				size /= elements;
			}
			
			if (expressionDMC.getEvaluationError() != null)
				return expressionDMC.getEvaluationError().getMessage();
			
			// pointer living at null is not valid (e.g. inside a struct pointing to null)
			IVariableLocation exprLoc = expressionDMC.getEvaluatedLocation();
			if (exprLoc instanceof IMemoryVariableLocation && ((IMemoryVariableLocation) exprLoc).getAddress().isZero())
				return "0";

			int maximumLength = getMaximumLength();
			// limit to express char[] size if given
			if (expressionDMC.getEvaluatedType() instanceof IArrayType) {
				long boundLength = ((IArrayType)expressionDMC.getEvaluatedType()).getBound(0).getBoundCount();
				if (boundLength > 0) {
					maximumLength = (int) Math.min(boundLength, maximumLength);
				}
			}
			
			Number value = expressionDMC.getEvaluatedValue();
			if (value == null) {
				if (expressionDMC.getEvaluatedValueString() != null) {
					// already a string
					// TODO: proper formatting
					return '"' + expressionDMC.getEvaluatedValueString() + '"';
				}
				return null;
			}

			IAddress address = FormatUtils.getPointerValue(value);
			if (address == null) {
				return value.toString();		// dunno
			}
			
			// null pointer
			if (address.isZero())
				return "0";
			
			String formattedString = 
				FormatUtils.getFormattedNullTermString(variable, address, size, maximumLength);
			return quoteString(formattedString);
		}

		private String quoteString(String str) {
			StringBuilder sb = new StringBuilder("\"");
			sb.append(str);
			sb.append('\"');
			return sb.toString();
		}
	}

	/**
	 * Override to change the maximum string length to format.
	 * @return size in characters
	 */
	protected int getMaximumLength() {
		IEclipsePreferences scope = EDCDebugger.getPrefs("org.eclipse.debug.ui");
		return scope.getInt("org.eclipse.debug.ui.max_detail_length", 256);
	}
	
	public ITypeContentProvider getTypeContentProvider(IType type) {
		return null;
	}
}
