X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fany-reader.h;h=5614a6007507c3f71539a183197dc01661b46829;hb=63c7521729b947ace9e192dff9330813ecfb5812;hp=063a7e650ecee3f335fa9078c8035982f54f2ace;hpb=7eeac30440dc09a42ee869b69263a8879bbb3ff8;p=pspp diff --git a/src/data/any-reader.h b/src/data/any-reader.h index 063a7e650e..5614a60075 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 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,97 @@ #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. */ + const char *name; + + int (*detect) (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 char *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 */