GraceApp *gapp_new(void) { GraceApp *gapp; gapp = xmalloc(sizeof(GraceApp)); if (!gapp) { return NULL; } memset(gapp, 0, sizeof(GraceApp)); if (grace_init() != RETURN_SUCCESS) { gapp_free(gapp); return NULL; } gapp->grace = grace_new(bi_home()); if (!gapp->grace) { gapp_free(gapp); return NULL; } graal_set_eval_proc(grace_get_graal(gapp->grace), eval_proc); grace_set_udata(gapp->grace, gapp); gapp->rt = runtime_new(gapp); if (!gapp->rt) { gapp_free(gapp); return NULL; } gapp->gui = gui_new(gapp); if (!gapp->gui) { gapp_free(gapp); return NULL; } gapp->pc = container_new(grace_get_qfactory(gapp->grace), AMEM_MODEL_SIMPLE); if (!gapp->pc) { gapp_free(gapp); return NULL; } return gapp; }
static int leval_aac_cb(void *data) { int i, nscols, type; double start, stop; int npts; char *formula[MAX_SET_COLS]; Quark *pset, *gr; GVar *t; Leval_ui *ui = (Leval_ui *) data; Grace *grace; gr = ui->gr; type = GetOptionChoice(ui->set_type); nscols = settype_cols(type); if (xv_evalexpr(ui->start, &start) != RETURN_SUCCESS) { errmsg("Start item undefined"); return RETURN_FAILURE; } if (xv_evalexpr(ui->stop, &stop) != RETURN_SUCCESS) { errmsg("Stop item undefined"); return RETURN_FAILURE; } if (xv_evalexpri(ui->npts, &npts) != RETURN_SUCCESS) { errmsg("Number of points undefined"); return RETURN_FAILURE; } TableCommitEdit(ui->mw, FALSE); for (i = 0; i < nscols; i++) { formula[i] = TableGetCell(ui->mw, i, 0); } pset = gapp_set_new(gr); set_set_type(pset, type); grace = grace_from_quark(pset); t = graal_get_var(grace_get_graal(grace), "$t", TRUE); if (t == NULL) { errmsg("Internal error"); return RETURN_FAILURE; } #if 0 if (t->length != 0) { xfree(t->data); t->length = 0; } t->data = allocate_mesh(start, stop, npts); if (t->data == NULL) { return RETURN_FAILURE; } t->length = npts; if (set_set_length(pset, npts) != RETURN_SUCCESS) { quark_free(pset); XCFREE(t->data); t->length = 0; return RETURN_FAILURE; } #endif for (i = 0; i < nscols; i++) { char buf[32], *expr; int res; /* preparing the expression */ sprintf(buf, "%s = ", dataset_col_name(grace, i)); expr = copy_string(NULL, buf); expr = concat_strings(expr, formula[i]); /* evaluate the expression */ res = graal_parse_line(grace_get_graal(grace), expr, NULL); xfree(expr); if (res != RETURN_SUCCESS) { quark_free(pset); return RETURN_FAILURE; } } #if 0 XCFREE(t->data); t->length = 0; #endif update_set_lists(gr); return RETURN_SUCCESS; }
static int leaveCB(TableEvent *event) { SSDataUI *ui = (SSDataUI *) event->anydata; int nrows = ssd_get_nrows(ui->q); int ncols = ssd_get_ncols(ui->q); int format; double value; int changed = FALSE; GraceApp *gapp = gapp_from_quark(ui->q); if (event->row < 0 || event->col < 0 || event->col > ncols) { return TRUE; } if (event->row >= nrows && !string_is_empty(event->value)) { if (ssd_set_nrows(ui->q, event->row + 1) == RETURN_SUCCESS) { changed = TRUE; } } if (event->col == ncols && !string_is_empty(event->value)) { if (parse_date_or_number(get_parent_project(ui->q), event->value, FALSE, get_date_hint(gapp), &value) == RETURN_SUCCESS) { format = FFORMAT_NUMBER; } else { format = FFORMAT_STRING; } if (ssd_add_col(ui->q, format)) { ncols++; changed = TRUE; } } if (event->col < ncols) { char *old_value = get_cell_content(ui, event->row, event->col, &format); if (!strings_are_equal(old_value, event->value)) { switch (format) { case FFORMAT_STRING: if (ssd_set_string(ui->q, event->row, event->col, event->value) == RETURN_SUCCESS) { quark_dirtystate_set(ui->q, TRUE); changed = TRUE; } break; default: if (graal_eval_expr(grace_get_graal(gapp->grace), event->value, &value, gproject_get_top(gapp->gp)) == RETURN_SUCCESS) { unsigned int prec; char buf[32]; double val; prec = project_get_prec(get_parent_project(ui->q)); sprintf(buf, "%.*g", prec, value); if (parse_date_or_number(get_parent_project(ui->q), buf, FALSE, get_date_hint(gapp), &val) == RETURN_SUCCESS) { if (ssd_set_value(ui->q, event->row, event->col, val) == RETURN_SUCCESS) { quark_dirtystate_set(ui->q, TRUE); changed = TRUE; } } } else { errmsg("Can't parse input value"); return FALSE; } break; } } } if (changed) { snapshot_and_update(gapp->gp, FALSE); } return TRUE; }
/* * process complete lines that have already been read */ static int process_complete_lines(GraceApp *gapp, Input_buffer *ib) { int line_corrupted; char *begin_of_line, *end_of_line; char buf[256]; if (ib->used <= 0) { return RETURN_SUCCESS; } end_of_line = NULL; do { /* loop over the embedded lines */ begin_of_line = (end_of_line == NULL) ? ib->buf : (end_of_line + 1); end_of_line = begin_of_line; line_corrupted = 0; while (end_of_line != NULL && *end_of_line != '\n') { /* trying to find a complete line */ if (end_of_line == ib->buf + ib->used) { end_of_line = NULL; } else { if (*end_of_line == '\0') { line_corrupted = 1; } ++end_of_line; } } if (end_of_line != NULL) { /* we have a whole line */ ++(ib->lineno); *end_of_line = '\0'; close_input = NULL; if (line_corrupted || graal_parse_line(grace_get_graal(gapp->grace), begin_of_line, gproject_get_top(gapp->gp)) != RETURN_SUCCESS) { sprintf(buf, "Error at line %d", ib->lineno); errmsg(buf); ++(ib->errors); if (ib->errors > MAXERR) { #ifndef NONE_GUI /* this prevents from being called recursively by the inner X loop of yesno */ xunregister_rti(ib); #endif if (yesno("Lots of errors, abort?", NULL, NULL, NULL)) { close_input = copy_string(close_input, ""); } #ifndef NONE_GUI xregister_rti(ib); #endif ib->errors = 0; } } if (close_input != NULL) { /* something should be closed */ if (close_input[0] == '\0') { unregister_real_time_input(ib->name); } else { unregister_real_time_input(close_input); } xfree(close_input); close_input = NULL; if (ib->fd < 0) { /* we have closed ourselves */ return RETURN_SUCCESS; } } } } while (end_of_line != NULL); if (end_of_line != NULL) { /* the line has just been processed */ begin_of_line = end_of_line + 1; } if (begin_of_line > ib->buf) { /* move the remaining data to the beginning */ ib->used -= begin_of_line - ib->buf; memmove(ib->buf, begin_of_line, ib->used); ib->buf[ib->used] = '\0'; } return RETURN_SUCCESS; }