/*
* 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.
*
*/
/* objectsave.c for gretl: save models estimated via commands */
#include "gretl.h"
#include "session.h"
#include "gpt_control.h"
#include "boxplots.h"
#include "objectsave.h"
#include "cmd_private.h"
#include "var.h"
#include "varprint.h"
#include "objstack.h"
static int gui_parse_object_request (const char *line,
char *objname, char **param,
void **pptr, GretlObjType *type,
PRN *prn)
{
char word[MAXSAVENAME] = {0};
int action;
/* 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 */
*pptr = get_session_object_by_name(word, type);
if (*pptr == NULL) {
/* 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
finalize_model_save (void *ptr, GretlObjType type, const char *name,
PRN *prn)
{
int err;
err = gretl_stack_object_as(ptr, type, name);
if (!err) {
err = maybe_add_model_to_session(ptr, type);
}
if (!err) {
pprintf(prn, _("%s saved\n"), name);
}
return err;
}
/* public interface below */
int maybe_save_model (const CMD *cmd, MODEL *pmod, PRN *prn)
{
char name[MAXSAVENAME];
MODEL *cpy = NULL;
int err = 0;
set_as_last_model(pmod, GRETL_OBJ_EQN);
gretl_cmd_get_savename(name);
if (*name != 0) {
cpy = gretl_model_copy(pmod);
if (cpy == NULL) {
err = E_ALLOC;
} else {
err = finalize_model_save(cpy, GRETL_OBJ_EQN, name, prn);
}
}
return err;
}
int maybe_save_var (const CMD *cmd, GRETL_VAR **pvar, PRN *prn)
{
char name[MAXSAVENAME];
GRETL_VAR *var;
int err = 0;
set_as_last_model(*pvar, GRETL_OBJ_VAR);
gretl_cmd_get_savename(name);
if (*name == 0) {
*pvar = NULL;
} else {
var = *pvar;
*pvar = NULL;
err = finalize_model_save(var, GRETL_OBJ_VAR, name, prn);
}
return err;
}
int maybe_save_system (const CMD *cmd, gretl_equation_system *sys, PRN *prn)
{
char name[MAXSAVENAME];
int err = 0;
gretl_cmd_get_savename(name);
if (*name != 0) {
err = finalize_model_save(sys, GRETL_OBJ_SYS, name, prn);
}
return err;
}
int maybe_save_graph (const CMD *cmd, const char *fname, GretlObjType type,
PRN *prn)
{
char gname[MAXSAVENAME];
int ret, err = 0;
if (type == GRETL_OBJ_PLOT && fname == NULL) {
fname = get_boxdump_name();
}
gretl_cmd_get_savename(gname);
if (*gname == 0) {
return 0;
}
ret = cli_add_graph_to_session(fname, gname, type);
if (ret == ADD_OBJECT_FAIL) {
err = 1;
} else if (ret == ADD_OBJECT_REPLACE) {
pprintf(prn, _("%s replaced\n"), gname);
} else {
pprintf(prn, _("%s saved\n"), gname);
}
return err;
}
int save_text_buffer (PRN *prn, const char *savename)
{
int add, err = 0;
add = real_add_text_to_session(prn, savename);
if (add == ADD_OBJECT_FAIL) {
err = 1;
} else if (add == ADD_OBJECT_REPLACE) {
pprintf(prn, _("%s replaced\n"), savename);
} else {
pprintf(prn, _("%s saved\n"), savename);
}
return err;
}
static int object_command_setup (CMD *pcmd, char *cmdstr)
{
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, &Z, datainfo);
free(myline);
}
return err;
}
static int
session_model_add_or_omit (MODEL *pmod, int action, char *cmdstr, PRN *prn)
{
CMD mycmd;
int err;
err = object_command_setup(&mycmd, cmdstr);
if (err) {
return err;
}
clear_model(models[1]);
if (action == OBJ_ACTION_ADD) {
err = add_test(mycmd.list, pmod, models[1],
&Z, datainfo, mycmd.opt, prn);
} else {
err = omit_test(mycmd.list, pmod, models[1],
&Z, datainfo, 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 session_VAR_do_irf (GRETL_VAR *var, char *cmdstr)
{
int err;
err = gretl_VAR_do_irf(var, cmdstr, (const double **) Z, datainfo);
if (err) {
gui_errmsg(err);
} else {
register_graph();
}
return err;
}
static int session_VAR_omit (GRETL_VAR *orig, char *cmdstr, PRN *prn)
{
GRETL_VAR *var;
CMD mycmd;
int err;
err = object_command_setup(&mycmd, cmdstr);
if (err) {
return err;
}
var = gretl_VAR_omit_test(mycmd.list, orig, &Z, datainfo, prn, &err);
gretl_VAR_free(var);
if (err) {
errmsg(err, prn);
}
gretl_cmd_free(&mycmd);
return err;
}
int saved_object_action (const char *line, 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 */
if (!strncmp(line, "iconview", 8)) {
if (data_status) {
view_session();
return 1;
} else {
return -1;
}
}
action = gui_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;
}
/* FIXME all below here: ambiguity between session icon objects
and stacked, named objects */
if (action == OBJ_ACTION_SHOW) {
if (type == GRETL_OBJ_EQN ||
type == GRETL_OBJ_VAR ||
type == GRETL_OBJ_SYS) {
session_model_callback(ptr, action);
} else if (type == GRETL_OBJ_TEXT) {
display_saved_text(ptr);
} else if (type == GRETL_OBJ_GRAPH) {
display_session_graph_by_data(ptr);
}
} else if (action == OBJ_ACTION_FREE) {
if (type == GRETL_OBJ_EQN ||
type == GRETL_OBJ_VAR ||
type == GRETL_OBJ_SYS) {
session_model_callback(ptr, action);
}
} else if (action == OBJ_ACTION_IRF) {
err = session_VAR_do_irf(ptr, param);
} else if (action == OBJ_ACTION_SHOW_STAT) {
err = print_object_var(objname, param, &Z, datainfo, prn);
} else if (action == OBJ_ACTION_ADD) {
err = session_model_add_or_omit(ptr, action, param, prn);
} else if (action == OBJ_ACTION_OMIT) {
if (type == GRETL_OBJ_EQN) {
err = session_model_add_or_omit(ptr, action, param, prn);
} else if (type == GRETL_OBJ_VAR) {
err = session_VAR_omit(ptr, param, 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