/******************************************************************************* | |
* 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; | |
} | |