blob: 6e0ef1d2116424812559ccb9c83b84dd15277862 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
*******************************************************************************/
/**
* @author Clement chu
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "MIOOBRecord.h"
#include "CLIOutput.h"
#include "signalinfo.h"
static int
getBoolean(char* value)
{
if (value != NULL && strncmp(value, "Yes", 3) == 0) {
return 1;
}
return 0;
}
void
CLIGetSigHandleList(MICommand *cmd, List** signals)
{
List *oobs;
MIOOBRecord *oob;
char *text = NULL;
const char* delims[] = { " ", "\\" };
char *token, *pch;
int i;
signalinfo *sig;
*signals = NewList();
if (!cmd->completed || cmd->output == NULL || cmd->output->oobs == NULL)
return;
oobs = cmd->output->oobs;
for (SetList(oobs); (oob = (MIOOBRecord *)GetListElement(oobs)) != NULL; ) {
text = oob->cstring;
if (*text == '\0' || *text == '\\') {
continue;
}
if (strncmp(text, "Signal", 6) != 0 && strncmp(text, "Use", 3) != 0 && strncmp(text, "info", 4) != 0) {
token = strdup(text);
pch = strstr(token, delims[0]);
if (pch == NULL) {
continue;
}
sig = NewSignalInfo();
for (i=0; pch != NULL; i++,pch=strstr(token, delims[1])) {
if (*pch == '\0') {
break;
}
*pch = '\0';
pch++;
while (*pch == ' ' || *pch =='t') { //remove whitespace or t character
pch++;
}
if (*pch == '\\') { //ignore '\\t' again
pch += 2;
}
//printf("---token(%d): %s\n", i, strdup(token));
switch(i) {
case 0:
sig->name = strdup(token);
break;
case 1:
sig->stop = getBoolean(token);
break;
case 2:
sig->print = getBoolean(token);
break;
case 3:
sig->pass = getBoolean(token);
break;
case 4:
sig->desc = strdup(token);
break;
}
token = strdup(pch);
}
free(token);
free(pch);
AddToList(*signals, (void *)sig);
}
}
}
double
CLIGetGDBVersion(MICommand *cmd)
{
List * oobs;
MIOOBRecord * oob;
char * text;
if (!cmd->completed || cmd->output == NULL || cmd->output->oobs == NULL) {
return -1.0;
}
if (cmd->output->rr != NULL && cmd->output->rr->resultClass == MIResultRecordERROR) {
return -1.0;
}
oobs = cmd->output->oobs;
for (SetList(oobs); (oob = (MIOOBRecord *)GetListElement(oobs)) != NULL; ) {
text = oob->cstring;
if (*text == '\0') {
continue;
}
while (*text == ' ') {
text++;
}
/*
* linux self: GUN gdb 6.5.0
* fedore: GNU gdb Red Hat Linux (6.5-8.fc6rh)
* Mac OS X: GNU gdb 6.1-20040303 (Apple version gdb-384) (Mon Mar 21 00:05:26 GMT 2005)
*/
if (strncmp(text, "GNU gdb", 7) == 0) {
/*
* bypass "GNU gdb"
*/
text += 8;
/*
* find first digit
*/
while (*text != '\0' && !isdigit(*text))
text++;
/*
* Convert whatever is here to a double
*/
if (*text != '\0')
return strtod(text, NULL);
}
}
return -1.0;
}
char *
CLIGetPTypeInfo(MICommand *cmd) {
List *oobs;
MIOOBRecord *oob;
char *text = NULL;
char *p = NULL;
if (!cmd->completed || cmd->output == NULL || cmd->output->oobs == NULL)
return NULL;
oobs = cmd->output->oobs;
for (SetList(oobs); (oob = (MIOOBRecord *)GetListElement(oobs)) != NULL; ) {
text = oob->cstring;
if (*text == '\0') {
continue;
}
while (*text == ' ') {
text++;
}
if (strncmp(text, "type", 4) == 0) {
text += 7; //bypass " = "
p = strchr(text, '{');
if (p != NULL) {
*(--p) = '\0';//remove the whitespace before {
return strdup(text);
}
p = strchr(text, '\\');
if (p != NULL) {
*p = '\0';
return strdup(text);
}
}
}
return NULL;
}
CLIInfoThreadsInfo *
CLIInfoThreadsInfoNew(void)
{
CLIInfoThreadsInfo * info;
info = (CLIInfoThreadsInfo *)malloc(sizeof(CLIInfoThreadsInfo));
info->current_thread_id = 1;
info->thread_ids = NULL;
return info;
}
CLIInfoThreadsInfo *
CLIGetInfoThreadsInfo(MICommand *cmd)
{
List *oobs;
MIOOBRecord *oob;
CLIInfoThreadsInfo * info = CLIInfoThreadsInfoNew();
char * text = NULL;
char * id = NULL;
if (!cmd->completed || cmd->output == NULL || cmd->output->oobs == NULL) {
return info;
}
if (cmd->output->rr != NULL && cmd->output->rr->resultClass == MIResultRecordERROR) {
return info;
}
oobs = cmd->output->oobs;
info->thread_ids = NewList();
for (SetList(oobs); (oob = (MIOOBRecord *)GetListElement(oobs)) != NULL; ) {
text = oob->cstring;
if (*text == '\0') {
continue;
}
while (*text == ' ') {
text++;
}
if (strncmp(text, "*", 1) == 0) {
text += 2;//escape "* ";
if (isdigit(*text)) {
info->current_thread_id = strtol(text, &text, 10);
}
continue;
}
if (isdigit(*text)) {
if (info->thread_ids == NULL)
info->thread_ids = NewList();
id = strchr(text, ' ');
if (id != NULL) {
*id = '\0';
AddToList(info->thread_ids, (void *)strdup(text));
}
}
}
return info;
}