/*
* Copyright (c) by Allin Cottrell
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
/* cli_object.c for gretl: handle commands relating to save objects */
#include "varprint.h"
static int cli_parse_object_request (const char *line,
char *objname, char **param,
void **pptr, GretlObjType *type,
PRN *prn)
{
char word[MAXSAVENAME] = {0};
int action, err = 0;
/* get object name (if any) and dot param */
parse_object_command(line, word, param);
/* if no dot param, nothing doing */
if (*param == NULL) {
return OBJ_ACTION_NONE;
}
/* the model table is special, not handled here */
if (!strcmp(word, "modeltab")) {
return OBJ_ACTION_NONE;
}
/* see if there's an object associated with the name */
err = gretl_get_object_and_type(word, pptr, type);
if (err) {
/* no matching object */
if (*param) {
pprintf(prn, _("%s: no such object\n"), word);
}
return OBJ_ACTION_NULL;
}
action = match_object_command(*param, *type);
if (action == OBJ_ACTION_INVALID) {
pprintf(prn, _("command '%s' not recognized"), *param);
pputc(prn, '\n');
} else {
strcpy(objname, word);
}
return action;
}
static int object_command_setup (CMD *pcmd, char *cmdstr,
double ***pZ, DATAINFO *pdinfo)
{
char *myline;
int err = 0;
myline = malloc(MAXLINE);
if (myline == NULL) {
err = E_ALLOC;
} else {
gretl_cmd_init(pcmd);
*myline = 0;
strncat(myline, cmdstr, MAXLINE - 1);
err = parse_command_line(myline, pcmd, pZ, pdinfo);
free(myline);
}
return err;
}
static int
object_model_add_or_omit (MODEL *pmod, int action, char *cmdstr,
double ***pZ, DATAINFO *pdinfo,
MODEL **models, PRN *prn)
{
CMD mycmd;
int err;
err = object_command_setup(&mycmd, cmdstr, pZ, pdinfo);
if (err) {
return err;
}
clear_model(models[1]);
if (action == OBJ_ACTION_ADD) {
err = add_test(mycmd.list, pmod, models[1],
pZ, pdinfo, mycmd.opt, prn);
} else {
err = omit_test(mycmd.list, pmod, models[1],
pZ, pdinfo, mycmd.opt, prn);
}
if (err) {
errmsg(err, prn);
clear_model(models[1]);
} else {
if (!(mycmd.opt & OPT_Q)) {
swap_models(models[0], models[1]);
}
clear_model(models[1]);
}
gretl_cmd_free(&mycmd);
return err;
}
static int object_VAR_omit (GRETL_VAR *orig, char *cmdstr,
double ***pZ, DATAINFO *pdinfo,
PRN *prn)
{
GRETL_VAR *var;
CMD mycmd;
int err;
err = object_command_setup(&mycmd, cmdstr, pZ, pdinfo);
if (err) {
return err;
}
var = gretl_VAR_omit_test(mycmd.list, orig, pZ, pdinfo, prn, &err);
gretl_VAR_free(var);
if (err) {
errmsg(err, prn);
}
gretl_cmd_free(&mycmd);
return err;
}
static int saved_object_action (const char *line,
double ***pZ, DATAINFO *pdinfo,
MODEL **models, PRN *prn)
{
char objname[MAXSAVENAME] = {0};
char *param = NULL;
void *ptr = NULL;
GretlObjType type;
int action, err = 0;
if (*line == '!' || *line == '#') {
/* shell command or comment */
return 0;
}
/* special: display icon view window, not applicable */
if (!strncmp(line, "iconview", 8)) {
return 1;
}
action = cli_parse_object_request(line, objname, ¶m, &ptr, &type, prn);
if (action == OBJ_ACTION_NONE) {
free(param);
return 0;
}
if (action == OBJ_ACTION_NULL || action == OBJ_ACTION_INVALID) {
free(param);
return -1;
}
if (action == OBJ_ACTION_SHOW) {
if (type == GRETL_OBJ_EQN) {
printmodel((MODEL *) ptr, pdinfo, OPT_NONE, prn);
} else if (type == GRETL_OBJ_VAR) {
gretl_VAR_print((GRETL_VAR *) ptr, pdinfo, OPT_NONE, prn);
} else if (type == GRETL_OBJ_SYS) {
err = gretl_equation_system_estimate((gretl_equation_system *) ptr,
pZ, pdinfo, OPT_NONE, prn);
}
} else if (action == OBJ_ACTION_SHOW_STAT) {
err = print_object_var(objname, param, pZ, pdinfo, prn);
} else if (action == OBJ_ACTION_IRF) {
err = gretl_VAR_do_irf((GRETL_VAR *) ptr, line,
(const double **) *pZ, pdinfo);
} else if (action == OBJ_ACTION_FREE) {
gretl_object_unref(ptr, GRETL_OBJ_ANY);
} else if (action == OBJ_ACTION_ADD) {
err = object_model_add_or_omit((MODEL *) ptr, action, param,
pZ, pdinfo, models, prn);
} else if (action == OBJ_ACTION_OMIT) {
if (type == GRETL_OBJ_EQN) {
err = object_model_add_or_omit((MODEL *) ptr, action, param,
pZ, pdinfo, models, prn);
} else if (type == GRETL_OBJ_VAR) {
err = object_VAR_omit((GRETL_VAR *) ptr, param,
pZ, pdinfo, prn);
}
}
if (action == OBJ_ACTION_FREE && !err) {
pprintf(prn, _("Freed %s\n"), objname);
}
free(param);
return 1;
}
syntax highlighted by Code2HTML, v. 0.9.1