X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fspreadsheet-reader.c;h=a16b430a52367fd9a670516f04b8eb0e4457e9e0;hb=3ebfe454cbb12c70277cc101ab5e2a04235620aa;hp=b83dc346028604064158f62d3fe1bf7ab79cf47b;hpb=55c55aa33d0f90d1b3b58f8b33b3fc54062c553e;p=pspp diff --git a/src/data/spreadsheet-reader.c b/src/data/spreadsheet-reader.c index b83dc34602..a16b430a52 100644 --- a/src/data/spreadsheet-reader.c +++ b/src/data/spreadsheet-reader.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. + Copyright (C) 2007, 2009, 2010, 2011, 2013, 2020 Free Software Foundation, Inc. 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 @@ -29,87 +29,63 @@ #include #include -#ifdef ODF_READ_SUPPORT -static const bool ODF_READING_SUPPORTED = true; -#else -static const bool ODF_READING_SUPPORTED = false; -#endif - -#ifdef GNM_READ_SUPPORT -static const bool GNM_READING_SUPPORTED = true; -#else -static const bool GNM_READING_SUPPORTED = false; -#endif - -void +struct spreadsheet * spreadsheet_ref (struct spreadsheet *s) { s->ref_cnt++; + return s; } -void +void spreadsheet_unref (struct spreadsheet *s) { - switch (s->type) - { - case SPREADSHEET_ODS: - assert (ODF_READING_SUPPORTED); - ods_unref (s); - break; - - case SPREADSHEET_GNUMERIC: - assert (GNM_READING_SUPPORTED); - gnumeric_unref (s); - break; - default: - NOT_REACHED (); - break; - } + if (--s->ref_cnt == 0) + s->destroy (s); } -struct casereader * +struct casereader * spreadsheet_make_reader (struct spreadsheet *s, const struct spreadsheet_read_options *opts) { - if (ODF_READING_SUPPORTED) - if ( s->type == SPREADSHEET_ODS) - return ods_make_reader (s, opts); - - if (GNM_READING_SUPPORTED) - if ( s->type == SPREADSHEET_GNUMERIC) - return gnumeric_make_reader (s, opts); - - return NULL; + return s->make_reader (s, opts); } -const char * +const char * spreadsheet_get_sheet_name (struct spreadsheet *s, int n) { - if (ODF_READING_SUPPORTED) - if ( s->type == SPREADSHEET_ODS) - return ods_get_sheet_name (s, n); + return s->get_sheet_name (s, n); +} - if (GNM_READING_SUPPORTED) - if ( s->type == SPREADSHEET_GNUMERIC) - return gnumeric_get_sheet_name (s, n); - return NULL; +char * +spreadsheet_get_sheet_range (struct spreadsheet *s, int n) +{ + return s->get_sheet_range (s, n); } +int +spreadsheet_get_sheet_n_sheets (struct spreadsheet *s) +{ + return s->get_sheet_n_sheets (s); +} -char * -spreadsheet_get_sheet_range (struct spreadsheet *s, int n) +unsigned int +spreadsheet_get_sheet_n_rows (struct spreadsheet *s, int n) { - if (ODF_READING_SUPPORTED) - if ( s->type == SPREADSHEET_ODS) - return ods_get_sheet_range (s, n); + return s->get_sheet_n_rows (s, n); +} - if (GNM_READING_SUPPORTED) - if ( s->type == SPREADSHEET_GNUMERIC) - return gnumeric_get_sheet_range (s, n); +unsigned int +spreadsheet_get_sheet_n_columns (struct spreadsheet *s, int n) +{ + return s->get_sheet_n_columns (s, n); +} - return NULL; +char * +spreadsheet_get_cell (struct spreadsheet *s, int n, int row, int column) +{ + return s->get_sheet_cell (s, n, row, column); } @@ -134,6 +110,7 @@ reverse (char *s, int len) greater than 1 are implicitly incremented by 1, so AA = 0 + 1*26, AB = 1 + 1*26, ABC = 2 + 2*26 + 1*26^2 .... + On error, this function returns -1 */ int ps26_to_int (const char *str) @@ -145,7 +122,10 @@ ps26_to_int (const char *str) for (i = len - 1 ; i >= 0; --i) { - int mantissa = (str[i] - 'A'); + char c = str[i]; + if (c < 'A' || c > 'Z') + return -1; + int mantissa = (c - 'A'); assert (mantissa >= 0); assert (mantissa < RADIX); @@ -160,6 +140,9 @@ ps26_to_int (const char *str) return result; } +/* Convert an integer, which must be non-negative, + to pseudo base 26. + The caller must free the return value when no longer required. */ char * int_to_ps26 (int i) { @@ -169,12 +152,13 @@ int_to_ps26 (int i) long long int base = RADIX; int exp = 1; - assert (i >= 0); + if (i < 0) + return NULL; while (i > lower + base - 1) { lower += base; - base *= RADIX; + base *= RADIX; assert (base > 0); exp++; } @@ -205,10 +189,10 @@ create_cell_ref (int col0, int row0) char *cs0 ; char *s ; - if ( col0 < 0) return NULL; - if ( row0 < 0) return NULL; + if (col0 < 0) return NULL; + if (row0 < 0) return NULL; - cs0 = int_to_ps26 (col0); + cs0 = int_to_ps26 (col0); s = c_xasprintf ("%s%d", cs0, row0 + 1); free (cs0); @@ -249,7 +233,7 @@ convert_cell_ref (const char *ref, int n = sscanf (ref, "%4[a-zA-Z]%d:%4[a-zA-Z]%d", startcol, &startrow, stopcol, &stoprow); - if ( n != 4) + if (n != 4) return false; str_uppercase (startcol); @@ -261,4 +245,3 @@ convert_cell_ref (const char *ref, return true; } -