static int labels_are_index (char **S, int n) { int t; /* note: the first label will be blank or "obs" or similar */ for (t=1; t<=n; t++) { if (!integer_string(S[t])) { return 0; } else if (atoi(S[t]) != t) { return 0; } } return 1; }
static gretl_matrix *maybe_make_auto_theta (char *name, int i, int ptype, int m1, int m2) { gretl_matrix *theta = NULL; int k = 0; if (!strcmp(name, "null")) { /* OK if we know how many parameters are needed? */ if (ptype == MIDAS_BETA0) { k = 2; } else if (ptype == MIDAS_BETAN) { k = 3; } else if (ptype == MIDAS_U) { k = m2 - m1 + 1; } } else if (integer_string(name)) { int chk = atoi(name); if (chk >= 1 && chk < 100) { k = chk; } } if (k > 0) { theta = gretl_zero_matrix_new(k, 1); if (theta != NULL) { if (ptype == MIDAS_BETA0) { theta->val[0] = 1; theta->val[1] = 5; } else if (ptype == MIDAS_BETAN) { theta->val[0] = 1; theta->val[1] = 1; theta->val[2] = 0; } sprintf(name, "theta___%d", i+1); private_matrix_add(theta, name); } } #if MIDAS_DEBUG gretl_matrix_print(theta, "auto-generated theta"); #endif return theta; }
static void xlsx_maybe_handle_formula (xlsx_info *xinfo, const char *src, int i, int t) { if (i == -1 && t > 0 && (xinfo->flags & BOOK_OBS_LABELS)) { char c, cref[8] = {0}; int k; if (sscanf(src, "%7[^+-]%c%d", cref, &c, &k) == 3) { int err, st = 0, col = 0; if (c == '-') { k = -k; } else if (c != '+') { /* we'll only only handle +/- */ return; } err = xlsx_cell_get_coordinates(cref, &st, &col); if (err || col != xinfo->xoffset + 1) { return; } st = st - xinfo->yoffset - 1; if (!(xinfo->flags & BOOK_AUTO_VARNAMES)) { st--; } if (st >= 0 && st < t) { const char *s = xinfo->dset->S[st]; if (integer_string(s)) { gchar *tmp = g_strdup_printf("%d", atoi(s) + k); xlsx_real_set_obs_string(xinfo, t, tmp); g_free(tmp); } } } } }
int llc_test_driver (const char *parm, const int *list, DATASET *dset, gretlopt opt, PRN *prn) { gretl_matrix *m = NULL; int *plist = NULL; int p0 = -1; int err = 0; if (*parm == '{') { m = generate_matrix(parm, dset, &err); if (!err) { plist = gretl_list_from_vector(m, &err); } gretl_matrix_free(m); } else if (gretl_is_matrix(parm)) { m = get_matrix_by_name(parm); plist = gretl_list_from_vector(m, &err); } else if (integer_string(parm)) { p0 = atoi(parm); } else if (gretl_is_scalar(parm)) { p0 = gretl_scalar_get_value(parm, NULL); } else { err = E_DATA; } if (!err) { if (plist != NULL) { err = levin_lin_test(list[1], plist, dset, opt, prn); free(plist); } else { int tmplist[2] = {1, p0}; err = levin_lin_test(list[1], tmplist, dset, opt, prn); } } return err; }
static void xlsx_dates_check (DATASET *dset) { int t, maybe_dates = 1; int date_min = 0, date_max = 0; int d, delta_min = 0, delta_max = 0; #if DATE_DEBUG fprintf(stderr, "xlsx_dates_check: starting\n"); #endif /* We're dealing here with the case where our prior heuristics suggest we got an "observations" column, yet the values we found there were numeric (and we converted them to strings). Here we see if it might be reasonable to interpret the labels as representing MS dates (days since Dec 31, 1899). For this purpose we'll require that all the obs labels are integer strings, and that the gap between successive values should be constant, or variable to a degree that's consistent with a sane time-series frequency. We should bear in mind, however, that the numeric values that we started with could be plain years rather than MS dates. */ for (t=0; t<dset->n && maybe_dates; t++) { if (!integer_string(dset->S[t])) { #if DATE_DEBUG fprintf(stderr, "S[%d] = '%s', giving up\n", t, dset->S[t]); #endif maybe_dates = 0; } else if (t == 0) { if (!strcmp(dset->S[0], "1")) { maybe_dates = 0; } else { date_min = date_max = atoi(dset->S[t]); } } else { d = atoi(dset->S[t]); if (d < date_min) { date_min = d; } if (d > date_max) { date_max = d; } d = atoi(dset->S[t]) - atoi(dset->S[t-1]); if (t == 1) { delta_min = delta_max = d; } else if (d < delta_min) { #if DATE_DEBUG fprintf(stderr, " at t=%d, delta_min = %d - %d = %d\n", t, atoi(dset->S[t]), atoi(dset->S[t-1]), d); #endif delta_min = d; } else if (d > delta_max) { delta_max = d; } } } #if DATE_DEBUG fprintf(stderr, "after obs loop, maybe_dates=%d\n" " (date_min=%d, date_max=%d, delta_min=%d, delta_max=%d)\n", maybe_dates, date_min, date_max, delta_min, delta_max); #endif if (maybe_dates && delta_max < 0) { /* allow for the possibility that time runs backwards */ int tmp = delta_min; delta_min = -delta_max; delta_max = -tmp; fprintf(stderr, "xlsx_dates_check: diffmin=%d, diffmax=%d\n", delta_min, delta_max); } if (maybe_dates) { /* are these things in fact more plausibly years? */ if (delta_min == 1 && delta_max == 1 && date_min > 1749 && date_max < 2050) { #if DATE_DEBUG fprintf(stderr, "assuming these are years, not MS dates\n"); #endif maybe_dates = 0; } } if (maybe_dates) { if (delta_min >= 364 && delta_max <= 365) { ; /* annual? */ } else if (delta_min >= 90 && delta_max <= 92) { ; /* quarterly? */ } else if (delta_min >= 28 && delta_max <= 31) { ; /* monthly? */ } else if (delta_min == 7 && delta_max == 7) { ; /* weekly? */ } else if (delta_min == 1 && delta_max <= 5) { ; /* daily? */ } else { /* unsupported frequency or nonsensical */ #if DATE_DEBUG fprintf(stderr, "delta_max = %d, delta_min = %d, unsupported\n", delta_max, delta_min); #endif maybe_dates = 0; } } #if DATE_DEBUG fprintf(stderr, "xlsx_dates_check: maybe_dates = %d\n", maybe_dates); #endif if (maybe_dates) { char datestr[OBSLEN]; for (t=0; t<dset->n; t++) { /* FIXME detect use of 1904-based dates? */ MS_excel_date_string(datestr, atoi(dset->S[t]), 0, 0); strcpy(dset->S[t], datestr); } } }
static int xlsx_gather_sheet_names (xlsx_info *xinfo, const char *insheet, int *list, PRN *prn) { gchar *wb_name = g_strdup_printf("xl%cworkbook.xml", SLASH); int i, err; err = xlsx_workbook_get_sheetnames(xinfo, wb_name); g_free(wb_name); if (!err && xinfo->n_sheets == 0) { pputs(prn, _("Found no sheets\n")); err = E_DATA; } if (!err) { const char *sname; int have_insheet_name = 0; int target_sheet_number = 0; int insheet_idx = 0; if (insheet != NULL && *insheet != '\0') { /* try looking for a worksheet specified by name */ have_insheet_name = 1; insheet_idx = -1; /* invalidate index */ } else if (list != NULL && list[0] >= 1 && list[1] > 0) { /* or sheet specified by (1-based) sequence number */ target_sheet_number = list[1]; insheet_idx = -1; /* invalidate index */ } fprintf(stderr, "Found these worksheets:\n"); for (i=0; i<xinfo->n_sheets; i++) { sname = xinfo->sheetnames[i]; fprintf(stderr, "%d: '%s' (%s)\n", i+1, sname, xinfo->filenames[i]); if (have_insheet_name) { if (insheet_idx < 0 && !strcmp(insheet, sname)) { /* found the name we were looking for */ insheet_idx = i; } } else if (target_sheet_number == i + 1) { /* found the number we were looking for */ insheet_idx = i; } } if (insheet_idx < 0) { /* a sheet was pre-specified but was not found */ if (have_insheet_name && integer_string(insheet)) { /* try interpreting as plain integer index? */ insheet_idx = atoi(insheet) - 1; if (insheet_idx < 0 || insheet_idx >= xinfo->n_sheets) { /* no, it doesn't work */ insheet_idx = -1; } } if (insheet_idx < 0) { if (have_insheet_name) { gretl_errmsg_sprintf(_("'%s': no such worksheet"), insheet); } else { gretl_errmsg_set(_("Invalid argument for worksheet import")); } err = E_DATA; } } if (!err) { if (have_insheet_name || target_sheet_number > 0) { /* avoid the expense of checking all sheets */ err = xlsx_verify_specific_sheet(xinfo, insheet_idx, prn); } else { err = xlsx_verify_sheets(xinfo, prn); if (xinfo->n_sheets == 0) { pputs(prn, "\nFound no valid sheets\n"); err = E_DATA; } else { pprintf(prn, _("\nFound %d valid sheet(s)\n"), xinfo->n_sheets); } } } } return err; }