| /****************************************************************************** |
| * 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 |
| ******************************************************************************/ |
| |
| /* |
| * Based on the QNX Java implementation of the MI interface |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "MIList.h" |
| #include "MIValue.h" |
| #include "MIResult.h" |
| #include "MIArg.h" |
| |
| MIArg * |
| MIArgNew(void) |
| { |
| MIArg * arg = (MIArg *)malloc(sizeof(MIArg)); |
| arg->name = NULL; |
| arg->value = NULL; |
| return arg; |
| } |
| |
| void |
| MIArgFree(MIArg *arg) |
| { |
| if (arg->name != NULL) |
| free(arg->name); |
| if (arg->value != NULL) |
| free(arg->value); |
| free(arg); |
| } |
| |
| /** |
| * Parsing a MIList of the form: |
| * [{name="xxx",value="yyy"},{name="xxx",value="yyy"},..] |
| * [name="xxx",name="xxx",..] |
| * [{name="xxx"},{name="xxx"}] |
| * |
| * Parsing a MITuple of the form: |
| * {{name="xxx",value="yyy"},{name="xxx",value="yyy"},..} |
| * {name="xxx",name="xxx",..} |
| * {{name="xxx"},{name="xxx"}} |
| */ |
| MIList * |
| MIArgsParse(MIValue *miValue) |
| { |
| MIList * aList = MIListNew(); |
| MIList * values = miValue->values; |
| MIList * results = miValue->results; |
| MIValue * value; |
| MIResult * result; |
| |
| if (values != NULL) { |
| for (MIListSet(values); (value = (MIValue *)MIListGet(values)) != NULL; ) { |
| if (value->type == MIValueTypeTuple) { |
| MIArg *arg = MIArgParse(value); |
| if (arg != NULL) { |
| MIListAdd(aList, (void *)arg); |
| } |
| } |
| } |
| } |
| |
| if (results != NULL) { |
| for (MIListSet(results); (result = (MIResult *)MIListGet(results)) != NULL; ) { |
| value = result->value; |
| if (value->type == MIValueTypeConst) { |
| MIArg *arg = MIArgNew(); |
| arg->name = strdup(value->cstring); |
| MIListAdd(aList, (void *)arg); |
| } |
| } |
| } |
| |
| return aList; |
| } |
| |
| /** |
| * Parsing a MITuple of the form: |
| * {name="xxx",value="yyy"} |
| * {name="xxx"} |
| */ |
| MIArg * |
| MIArgParse(MIValue *tuple) |
| { |
| MIValue * value; |
| MIResult * result; |
| char * str; |
| MIArg * arg = MIArgNew(); |
| |
| for (MIListSet(tuple->results); (result = (MIResult *)MIListGet(tuple->results)) != NULL; ) { |
| value = result->value; |
| if (value != NULL && value->type == MIValueTypeConst) { |
| str = value->cstring; |
| } else { |
| str = ""; |
| } |
| |
| if (strcmp(result->variable, "name") == 0) { |
| arg->name = strdup(str); |
| } else if (strcmp(result->variable, "value") == 0) { |
| arg->value = strdup(str); |
| } |
| } |
| |
| return arg; |
| } |
| |
| MIString * |
| MIArgToString(MIArg *arg) |
| { |
| return MIStringNew("%s=%s", arg->name, arg->value); |
| } |