static int xlsx_set_varname (xlsx_info *xinfo, int i, const char *s, int row, int col, PRN *prn) { int err = 0; if (i == -1) { #if XDEBUG fprintf(stderr, "xlsx_set_varname: i=-1, s='%s', skipping\n", s); #endif return 0; } if (i < 1 || i >= xinfo->dset->v) { fprintf(stderr, "error in xlsx_set_varname: i = %d\n", i); err = E_DATA; } else { *xinfo->dset->varname[i] = '\0'; strncat(xinfo->dset->varname[i], s, VNAMELEN - 1); err = check_imported_varname(xinfo->dset->varname[i], row, col, prn); } return err; }
static int wsheet_parse_cells (xmlNodePtr node, wsheet *sheet, int obscol, PRN *prn) { xmlNodePtr p = node->xmlChildrenNode; char *tmp; double x; int vtype = 0; int gotlabels = 0; int cols, rows; int i, t, r, c; int err = 0; cols = sheet->maxcol + 1 - sheet->col_offset; rows = sheet->maxrow + 1 - sheet->row_offset; if (rows < 1) { pputs(prn, _("Starting row is out of bounds.\n")); return 1; } if (cols < 1) { pputs(prn, _("Starting column is out of bounds.\n")); return 1; } if (wsheet_allocate(sheet, cols, rows)) { return 1; } sheet->colheads = 0; while (p != NULL && !err) { if (!xmlStrcmp(p->name, (XUC) "Cell")) { x = NADBL; c = r = 0; i = t = -1; /* what column are we in? */ tmp = (char *) xmlGetProp(p, (XUC) "Col"); if (tmp) { c = atoi(tmp); i = c - sheet->col_offset; free(tmp); } /* what row are we on? */ tmp = (char *) xmlGetProp(p, (XUC) "Row"); if (tmp) { r = atoi(tmp); t = r - sheet->row_offset; free(tmp); } if (i < 0 || t < 0) { /* we're not in the user-specified reading area */ p = p->next; continue; } /* get cell type and content */ err = node_get_vtype_and_content(p, &vtype, &tmp); if (err) { /* a formula perhaps? */ pprintf(prn, _("Couldn't get value for col %d, row %d.\n" "Maybe there's a formula in the sheet?"), c+1, r+1); break; } if (tmp != NULL) { if (VTYPE_IS_NUMERIC(vtype) || vtype == VALUE_STRING) { if (i == 0) { /* first column: write content to labels */ gretl_utf8_strncat_trim(sheet->label[t], tmp, OBSLEN - 1); } } if (i == 0 && t == 1 && VTYPE_IS_NUMERIC(vtype)) { char *fmt = (char *) xmlGetProp(p, (XUC) "ValueFormat"); if (fmt) { check_for_date_format(sheet, fmt); free(fmt); } } if (VTYPE_IS_NUMERIC(vtype)) { x = atof(tmp); sheet->Z[i][t] = x; } else if (i > 0 && stray_numeric(vtype, tmp, &x)) { sheet->Z[i][t] = x; } else if (vtype == VALUE_STRING) { if (t == 0) { /* first row: look for varnames */ strncat(sheet->varname[i], tmp, VNAMELEN - 1); sheet->colheads += 1; if (i == 0 && obscol) { ; /* keep going */ } else { err = check_imported_varname(sheet->varname[i], i, r, c, prn); } } else if (i == 0 && obscol) { /* first column, not first row */ if (!gotlabels) { gotlabels = 1; } sheet->text_cols = 1; } else { pprintf(prn, _("Expected numeric data, found string:\n" "'%s' at row %d, column %d\n"), tmp, r+1, c+1); err = 1; } } free(tmp); } } p = p->next; } if (gotlabels && sheet->colheads == 1) { /* rough notion here: if there's only one heading, it's probably not really a variable name, but rather a first observation label */ sheet->colheads = 0; } return err; }