+ if (xtr == NULL)
+ {
+ gzclose (gz);
+ return NULL;
+ }
+
+ if (r == NULL)
+ {
+ r = xzalloc (sizeof *r);
+ r->spreadsheet.sheets = -1;
+ r->spreadsheet.file_name = filename;
+ }
+
+ r->target_sheet = NULL;
+ r->target_sheet_index = -1;
+
+ r->row = r->col = -1;
+ r->state = STATE_PRE_INIT;
+ r->xtr = xtr;
+
+ /* Advance to the start of the workbook.
+ This gives us some confidence that we are actually dealing with a gnumeric
+ spreadsheet.
+ */
+ while ( (r->state != STATE_INIT )
+ && 1 == (ret = xmlTextReaderRead (r->xtr)))
+ {
+ process_node (r);
+ }
+
+ r->spreadsheet.type = SPREADSHEET_GNUMERIC;
+
+ return r;
+}
+
+
+struct spreadsheet *
+gnumeric_probe (const char *filename)
+{
+ struct gnumeric_reader *r = gnumeric_reopen (NULL, filename);
+
+ return &r->spreadsheet;
+}
+
+
+struct casereader *
+gnumeric_make_reader (struct spreadsheet *spreadsheet,
+ const struct spreadsheet_read_info *gri,
+ struct spreadsheet_read_options *opts)
+{
+ struct gnumeric_reader *r = NULL;
+ unsigned long int vstart = 0;
+ int ret;
+ casenumber n_cases = CASENUMBER_MAX;
+ int i;
+ struct var_spec *var_spec = NULL;
+ int n_var_specs = 0;
+
+ r = (struct gnumeric_reader *) (spreadsheet);
+
+ if (r->row != -1)
+ r = gnumeric_reopen (r, NULL);