blob: 0b26df18cb99ccc037cb91c577b37725ef25f5ca [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 IBM Corporation.
* 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:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MIValue.h"
#include "MIResult.h"
#include "MIDisassembly.h"
MIDisassemblyInfo *
MIDisassemblyInfoNew(void)
{
MIDisassemblyInfo * info;
info = (MIDisassemblyInfo *)malloc(sizeof(MIDisassemblyInfo));
info->addr = NULL;
info->func_name = NULL;
info->offset = 0;
info->inst = NULL;
return info;
}
void
MIDisassemblyInfoFree(MIDisassemblyInfo *info)
{
if (info->addr != NULL)
free(info->addr);
if (info->func_name != NULL)
free(info->func_name);
if (info->inst != NULL)
free(info->inst);
free(info);
}
MIDisassemblyInfo *
MIDisassemblyInfoParse(MIValue *tuple)
{
char * var = NULL;
MIValue * value = NULL;
MIResult * result = NULL;
MIList * results = tuple->results;
MIDisassemblyInfo * info = MIDisassemblyInfoNew();
for (MIListSet(results); (result = (MIResult *)MIListGet(results)) != NULL;) {
var = result->variable;
value = result->value;
if (value != NULL && value->type == MIValueTypeConst) {
if (strcmp(var, "address") == 0 && value->cstring != NULL) {
info->addr = strdup(value->cstring);
} else if (strcmp(var, "func-name") == 0 && value->cstring != NULL) {
info->func_name = strdup(value->cstring);
} else if (strcmp(var, "inst") == 0 && value->cstring != NULL) {
info->inst = strdup(value->cstring);
}
}
}
return info;
}
MIDataReadDisassemblyInfo *
MIDataReadDisassemblyInfoNew(void)
{
MIDataReadDisassemblyInfo * info;
info = (MIDataReadDisassemblyInfo *)malloc(sizeof(MIDataReadDisassemblyInfo));
info->asm_insns = NULL;
return info;
}
void
MIDataReadDisassemblyInfoFree(MIDataReadDisassemblyInfo *info)
{
if (info->asm_insns != NULL)
MIListFree(info->asm_insns, MIDisassemblyInfoFree);
free(info);
}
MIDataReadDisassemblyInfo *
MIGetDataReadDisassemblyInfo(MICommand *cmd)
{
char * var;
MIValue * value;
MIResultRecord * rr;
MIResult * result;
MIDataReadDisassemblyInfo * info = MIDataReadDisassemblyInfoNew();
if (!cmd->completed || cmd->output == NULL || cmd->output->rr == NULL) {
return NULL;
}
rr = cmd->output->rr;
for (MIListSet(rr->results); (result = (MIResult *)MIListGet(rr->results)) != NULL; ) {
var = result->variable;
value = result->value;
if (strcmp(var, "asm_insns") == 0) {
if (value->type == MIValueTypeList) {
info->asm_insns = MIGetDisassemblyList(value);
}
}
}
return info;
}
MIList *
MIGetDisassemblyList(MIValue *miValue)
{
MIList * list = MIListNew();
MIList * values = miValue->values;
MIValue * value;
if (values != NULL) {
for (MIListSet(values); (value = (MIValue *)MIListGet(values)) != NULL;) {
if (value->type == MIValueTypeTuple) {
MIListAdd(list, (void *)MIDisassemblyInfoParse(value));
}
}
}
return list;
}