X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fspreadsheet-reader.c;h=a16b430a52367fd9a670516f04b8eb0e4457e9e0;hb=82bb2efcfd8fe17cb2d5caeb8edf26612fe0ca4c;hp=2b4178835a2dae2af78e1c9d4deb34bfeb42bd01;hpb=f34021711b79c96bd0d3c374c154efa770e29cfb;p=pspp diff --git a/src/data/spreadsheet-reader.c b/src/data/spreadsheet-reader.c index 2b4178835a..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 @@ -18,26 +18,77 @@ #include "spreadsheet-reader.h" +#include +#include "gnumeric-reader.h" +#include "ods-reader.h" + #include #include #include +#include +#include +#include + +struct spreadsheet * +spreadsheet_ref (struct spreadsheet *s) +{ + s->ref_cnt++; + return s; +} + +void +spreadsheet_unref (struct spreadsheet *s) +{ + if (--s->ref_cnt == 0) + s->destroy (s); +} + + +struct casereader * +spreadsheet_make_reader (struct spreadsheet *s, + const struct spreadsheet_read_options *opts) +{ + return s->make_reader (s, opts); +} + +const char * +spreadsheet_get_sheet_name (struct spreadsheet *s, int n) +{ + return s->get_sheet_name (s, n); +} + + +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); +} -struct spreadsheet * -spreadsheet_open (const char *filename) +unsigned int +spreadsheet_get_sheet_n_rows (struct spreadsheet *s, int n) { - struct spreadsheet *ss = NULL; + return s->get_sheet_n_rows (s, n); +} - ss = gnumeric_probe (filename); - - return ss; +unsigned int +spreadsheet_get_sheet_n_columns (struct spreadsheet *s, int n) +{ + return s->get_sheet_n_columns (s, n); } -void -spreadsheet_close (struct spreadsheet *spreadsheet) +char * +spreadsheet_get_cell (struct spreadsheet *s, int n, int row, int column) { + return s->get_sheet_cell (s, n, row, column); } + #define RADIX 26 static void @@ -59,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) @@ -70,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); @@ -85,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) { @@ -94,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++; } @@ -107,7 +166,7 @@ int_to_ps26 (int i) i -= lower; i += base; - ret = malloc (exp); + ret = xmalloc (exp + 1); exp = 0; do @@ -123,25 +182,34 @@ int_to_ps26 (int i) return ret; } + char * -create_cell_ref (int col0, int row0, int coli, int rowi) +create_cell_ref (int col0, int row0) { char *cs0 ; - char *csi ; char *s ; - if ( col0 < 0) return NULL; - if ( rowi < 0) return NULL; - if ( coli < 0) return NULL; - if ( row0 < 0) return NULL; + if (col0 < 0) return NULL; + if (row0 < 0) return NULL; + + cs0 = int_to_ps26 (col0); + s = c_xasprintf ("%s%d", cs0, row0 + 1); - cs0 = int_to_ps26 (col0); - csi = int_to_ps26 (coli); - s = c_xasprintf ("%s%d:%s%ld", - cs0, row0 + 1, - csi, rowi + 1); free (cs0); - free (csi); + + return s; +} + +char * +create_cell_range (int col0, int row0, int coli, int rowi) +{ + char *s0 = create_cell_ref (col0, row0); + char *si = create_cell_ref (coli, rowi); + + char *s = c_xasprintf ("%s:%s", s0, si); + + free (s0); + free (si); return s; } @@ -165,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); @@ -177,4 +245,3 @@ convert_cell_ref (const char *ref, return true; } -