/*******************************************************************************
* Copyright (c) 2000, 2009 QNX Software Systems 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:
* QNX Software Systems - Initial API and implementation
* Wind River Systems - Modified for new DSF Reference Implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.mi.service.command.commands;
import org.eclipse.cdt.dsf.debug.service.command.ICommand;
import org.eclipse.cdt.dsf.debug.service.command.ICommandResult;
import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext;
import org.eclipse.cdt.dsf.mi.service.MIFormat;
import org.eclipse.cdt.dsf.mi.service.command.output.MIDataListRegisterValuesInfo;
import org.eclipse.cdt.dsf.mi.service.command.output.MIOutput;
/**
*
* -data-list-register-values FMT [ ( REGNO )*]
*
* Display the registers' contents. FMT is the format according to
* which the registers' contents are to be returned, followed by an
* optional list of numbers specifying the registers to display. A
* missing list of numbers indicates that the contents of all the
* registers must be returned.
*
*/
public class MIDataListRegisterValues extends MICommand<MIDataListRegisterValuesInfo> {
int[] regnums;
int fFmt;
public MIDataListRegisterValues(IMIExecutionDMContext ctx, int fmt) {
this(ctx, fmt, null);
}
public MIDataListRegisterValues(IMIExecutionDMContext ctx, int fmt, int [] regnos) {
super(ctx, "-data-list-register-values"); //$NON-NLS-1$
regnums = regnos;
String format = "x"; //$NON-NLS-1$
switch (fmt) {
case MIFormat.NATURAL: format = "N"; break ; //$NON-NLS-1$
case MIFormat.RAW: format = "r"; break ; //$NON-NLS-1$
case MIFormat.DECIMAL: format = "d"; break ; //$NON-NLS-1$
case MIFormat.BINARY: format = "t"; break ; //$NON-NLS-1$
case MIFormat.OCTAL: format = "o"; break ; //$NON-NLS-1$
case MIFormat.HEXADECIMAL: format = "x"; break ; //$NON-NLS-1$
default: format = "x"; break ; //$NON-NLS-1$
}
fFmt = fmt;
setOptions(new String[]{format});
if (regnos != null && regnos.length > 0) {
String[] array = new String[regnos.length];
for (int i = 0; i < regnos.length; i++) {
array[i] = Integer.toString(regnos[i]);
}
setParameters(array);
}
}
public int[] getRegList() {
return regnums;
}
@Override
public MIDataListRegisterValuesInfo getResult(MIOutput output) {
return new MIDataListRegisterValuesInfo(output);
}
/*
* Takes the supplied command and coalesces it with this one.
* The result is a new third command which represent the two
* original command.
*/
@Override
public MIDataListRegisterValues coalesceWith(ICommand<? extends ICommandResult> command ) {
/*
* Can coalesce only with other DsfMIDataListRegisterValues commands.
*/
if (! (command instanceof MIDataListRegisterValues) ) return null;
MIDataListRegisterValues cmd = (MIDataListRegisterValues) command;
/*
* If the format is different then this cannot be added to the list.
*/
if ( fFmt != cmd.fFmt ) return null;
int[] newregnos = new int[ regnums.length + cmd.regnums.length];
/*
* We need to add the new register #'s to the list. If one is already there
* then do not add it twice. So copy the original list of this command.
*/
for ( int idx = 0 ; idx < regnums.length ; idx ++) {
newregnos[ idx ] = regnums[ idx ];
}
int curloc = regnums.length;
for ( int ndx = 0 ; ndx < cmd.regnums.length; ndx ++) {
int curnum = cmd.regnums[ ndx ] ;
int ldx;
/*
* Search the current list to see if this entry is in it.
*/
for ( ldx = 0 ; ldx < regnums.length; ldx ++ ) {
if ( newregnos[ ldx ] == curnum ) {
break ;
}
}
if ( ldx == regnums.length ) {
/*
* Since we did not find a match add it at the end of the list.
*/
newregnos[ curloc ] = curnum;
curloc ++;
}
}
/*
* Create a final proper array set of the new combined list.
*/
int[] finalregnums = new int[ curloc ] ;
for ( int fdx = 0 ; fdx < curloc ; fdx ++ ) {
finalregnums[ fdx ] = newregnos[ fdx ];
}
/*
* Now construct a new one. The format we will use is this command.
*/
return( new MIDataListRegisterValues((IMIExecutionDMContext)getContext(), fFmt, finalregnums));
}
}