X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fany-reader.h;h=998e12441b2894ccad6c1abdfd10e7754c66950f;hb=1a26ffe4489b411bda630d9e5b87e2d2e4538fdb;hp=063a7e650ecee3f335fa9078c8035982f54f2ace;hpb=41b0d9a7203d396cf1514459afa4722ab5ae8ded;p=pspp diff --git a/src/data/any-reader.h b/src/data/any-reader.h index 063a7e650e..998e12441b 100644 --- a/src/data/any-reader.h +++ b/src/data/any-reader.h @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2006, 2010, 2012 Free Software Foundation, Inc. + Copyright (C) 2006, 2010, 2012, 2014, 2015 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,20 +18,100 @@ #define ANY_READER_H 1 #include +#include +#include "data/case.h" +#include "libpspp/float-format.h" +#include "libpspp/integer-format.h" -/* Result of type detection. */ -enum detect_result +struct any_read_info; +struct dictionary; +struct file_handle; + +struct any_reader + { + const struct any_reader_class *klass; + }; + +struct any_reader_class { - ANY_YES, /* It is this type. */ - ANY_NO, /* It is not this type. */ - ANY_ERROR /* File couldn't be opened. */ + /* The name of this kind of data file, e.g. "SPSS System File". */ + const char *name; + + /* Detects whether FILE contains this type of file. Returns 1 if so, 0 if + not, and a negative errno value if there is an error reading FILE. */ + int (*detect) (FILE *file); + + struct any_reader *(*open) (struct file_handle *); + bool (*close) (struct any_reader *); + struct casereader *(*decode) (struct any_reader *, const char *encoding, + struct dictionary **, + struct any_read_info *); + size_t (*get_strings) (const struct any_reader *, struct pool *pool, + char ***labels, bool **ids, char ***values); }; +extern const struct any_reader_class sys_file_reader_class; +extern const struct any_reader_class por_file_reader_class; +extern const struct any_reader_class pcp_file_reader_class; + +enum any_type + { + ANY_SYS, /* SPSS System File. */ + ANY_PCP, /* SPSS/PC+ System File. */ + ANY_POR, /* SPSS Portable File. */ + }; + +enum any_compression + { + ANY_COMP_NONE, /* No compression. */ + ANY_COMP_SIMPLE, /* Bytecode compression of integer values. */ + ANY_COMP_ZLIB /* ZLIB "deflate" compression. */ + }; + +/* Data file info that doesn't fit in struct dictionary. + + The strings in this structure are encoded in UTF-8. (They are normally in + the ASCII subset of UTF-8.) */ +struct any_read_info + { + const struct any_reader_class *klass; + char *creation_date; + char *creation_time; + enum integer_format integer_format; + enum float_format float_format; + enum any_compression compression; + casenumber case_cnt; /* -1 if unknown. */ + char *product; /* Product name. */ + char *product_ext; /* Extra product info. */ + + /* Writer's version number in X.Y.Z format. + The version number is not always present; if not, then + all of these are set to 0. */ + int version_major; /* X. */ + int version_minor; /* Y. */ + int version_revision; /* Z. */ + }; + +void any_read_info_destroy (struct any_read_info *); struct file_handle; struct dictionary; -enum detect_result any_reader_may_open (const char *file_name); -struct casereader *any_reader_open (struct file_handle *, const char *encoding, - struct dictionary **); + +int any_reader_detect (const struct file_handle *file_name, + const struct any_reader_class **); + +struct any_reader *any_reader_open (struct file_handle *); +bool any_reader_close (struct any_reader *); +struct casereader *any_reader_decode (struct any_reader *, + const char *encoding, + struct dictionary **, + struct any_read_info *); +size_t any_reader_get_strings (const struct any_reader *, struct pool *pool, + char ***labels, bool **ids, char ***values); + +struct casereader *any_reader_open_and_decode (struct file_handle *, + const char *encoding, + struct dictionary **, + struct any_read_info *); #endif /* any-reader.h */