[Getdata-commits] SF.net SVN: getdata:[895] trunk/getdata
Scientific Database Format
Brought to you by:
ketiltrout
|
From: <ket...@us...> - 2014-05-05 20:38:51
|
Revision: 895
http://sourceforge.net/p/getdata/code/895
Author: ketiltrout
Date: 2014-05-05 20:38:45 +0000 (Mon, 05 May 2014)
Log Message:
-----------
* Remove GD_MAX_CARRAY_LENGTH.
* Add gd_encoding_support().
Modified Paths:
--------------
trunk/getdata/ChangeLog
trunk/getdata/NEWS
trunk/getdata/man/Makefile.am
trunk/getdata/man/gd_add.3
trunk/getdata/man/gd_add_bit.3
trunk/getdata/man/gd_alter_spec.3
trunk/getdata/man/gd_cbopen.3
trunk/getdata/src/add.c
trunk/getdata/src/encoding.c
trunk/getdata/src/getdata.h.in
trunk/getdata/src/mod.c
trunk/getdata/src/parse.c
trunk/getdata/test/Makefile.am
Added Paths:
-----------
trunk/getdata/man/gd_encoding_support.3
trunk/getdata/test/encode_support.c
Property Changed:
----------------
trunk/getdata/test/
Modified: trunk/getdata/ChangeLog
===================================================================
--- trunk/getdata/ChangeLog 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/ChangeLog 2014-05-05 20:38:45 UTC (rev 895)
@@ -1,3 +1,19 @@
+2014-05-05 D. V. Wiebe <ge...@ke...> svn:895
+ * src/getdata.h.in: Remove GD_MAX_CARRAY_LENGTH.
+ * src/add.c (_GD_Add) src/mod.c (_GD_Change) src/parse.c (_GD_ParseArray):
+ Remove references to GD_MAX_CARRAY_LENGTH.
+
+ * src/add.c (gd_add_raw gd_add_lincom gd_add_clincom gd_add_linterp
+ gd_add_bit gd_add_sbit _GD_AddYoke gd_add_recip gd_add_crecip89
+ gd_add_polynom gd_add_cpolynom gd_add_phase gd_add_window gd_add_mplex
+ gd_madd_lincom gd_madd_clincom gd_madd_linterp gd_madd_bit gd_madd_sbit
+ _GD_MAddYoke gd_madd_phase gd_madd_polynom gd_madd_cpolynom gd_madd_recip
+ gd_madd_crecip89 gd_madd_window gd_madd_mplex): Call _GD_Add in a slightly
+ less ridiculous way.
+
+ * src/encoding.c (gd_encoding_support): Added.
+ * man/gd_encoding_support.3 test/encode_support.c: Added.
+
2014-04-30 D. V. Wiebe <ge...@ke...> svn:890 svn:891
* bindings/cxx/test/big_test.cpp bindings/f77/test/big_test.f
bindings/f77/test/big_test95.f90 bindings/idl/test/big_test.pro
Modified: trunk/getdata/NEWS
===================================================================
--- trunk/getdata/NEWS 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/NEWS 2014-05-05 20:38:45 UTC (rev 895)
@@ -17,6 +17,13 @@
renamed field to point to the new field instead of leaving them dangle.
(But see GD_REN_DANGLE).
+ * CARRAYs are no longer truncated to GD_MAX_CARRAY_LENGTH elements. Flushing
+ metadata to disk will now fail if writing a CARRAY would overflow a format
+ file line. (It's platform specific, but format file lines are typically
+ permitted to be at least 2**31 bytes long, so such an error usually
+ indicates something pathological happening.) The GD_MAX_CARRAY_LENGTH
+ symbol has been removed from the GetData header file.
+
* BUG FIX: The parsing of the \x and \u escape sequences are now correct.
* BUG FIX: Computation of LINCOMs with complex valued input fields now
@@ -135,6 +142,9 @@
gd_move(). If gd_move() is passed the field code of an alias, the alias is
now moved, instead of moving the field the alias points to.
+ * gd_encoding_support() has been added to permit run-time determination of
+ supported encodings.
+
* BUG FIX: If the dirfile path provided cannot be resolved (due to, for
instance, a symbolic link pointing to a non-existent path), gd_open() and
friends now return GD_E_OPEN, as documented, instead of GD_E_RAW_IO.
Modified: trunk/getdata/man/Makefile.am
===================================================================
--- trunk/getdata/man/Makefile.am 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/man/Makefile.am 2014-05-05 20:38:45 UTC (rev 895)
@@ -28,17 +28,17 @@
gd_alter_protection.3 gd_alter_spec.3 gd_bof.3 gd_bof64.3 \
gd_carray_len.3 gd_carrays.3 gd_cbopen.3 gd_close.3 \
gd_constants.3 gd_delete.3 gd_desync.3 gd_dirfile_standards.3 \
- gd_dirfilename.3 gd_encoding.3 gd_endianness.3 gd_entry.3 \
- gd_entry_list.3 gd_entry_type.3 gd_eof.3 gd_eof64.3 gd_error.3 \
- gd_error_count.3 gd_error_string.3 gd_flags.3 gd_flush.3 \
- gd_fragment_affixes.3 gd_fragment_index.3 gd_fragmentname.3 \
- gd_framenum_subset.3 gd_framenum_subset64.3 gd_frameoffset.3 \
- gd_frameoffset64.3 gd_free_entry_strings.3 \
- gd_get_carray_slice.3 gd_get_string.3 gd_getdata.3 \
- gd_getdata64.3 gd_hidden.3 gd_hide.3 gd_include_affix.3 \
- gd_invalid_dirfile.3 gd_linterp_tablename.3 gd_madd_bit.3 \
- gd_mcarrays.3 gd_mconstants.3 gd_metaflush.3 gd_move.3 \
- gd_mplex_lookback.3 gd_mstrings.3 gd_naliases.3 \
+ gd_dirfilename.3 gd_encoding.3 gd_encoding_support.3 \
+ gd_endianness.3 gd_entry.3 gd_entry_list.3 gd_entry_type.3 \
+ gd_eof.3 gd_eof64.3 gd_error.3 gd_error_count.3 \
+ gd_error_string.3 gd_flags.3 gd_flush.3 gd_fragment_affixes.3 \
+ gd_fragment_index.3 gd_fragmentname.3 gd_framenum_subset.3 \
+ gd_framenum_subset64.3 gd_frameoffset.3 gd_frameoffset64.3 \
+ gd_free_entry_strings.3 gd_get_carray_slice.3 gd_get_string.3 \
+ gd_getdata.3 gd_getdata64.3 gd_hidden.3 gd_hide.3 \
+ gd_include_affix.3 gd_invalid_dirfile.3 gd_linterp_tablename.3 \
+ gd_madd_bit.3 gd_mcarrays.3 gd_mconstants.3 gd_metaflush.3 \
+ gd_move.3 gd_mplex_lookback.3 gd_mstrings.3 gd_naliases.3 \
gd_native_type.3 gd_nentries.3 gd_nfragments.3 gd_nframes.3 \
gd_nframes64.3 gd_parent_fragment.3 gd_parser_callback.3 \
gd_protection.3 gd_put_carray_slice.3 \
Modified: trunk/getdata/man/gd_add.3
===================================================================
--- trunk/getdata/man/gd_add.3 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/man/gd_add.3 2014-05-05 20:38:45 UTC (rev 895)
@@ -13,7 +13,7 @@
.\" Texts. A copy of the license is included in the `COPYING.DOC' file
.\" as part of this distribution.
.\"
-.TH gd_add 3 "10 December 2013" "Version 0.9.0" "GETDATA"
+.TH gd_add 3 "5 May 2014" "Version 0.9.0" "GETDATA"
.SH NAME
gd_add, gd_madd \(em add a field to a dirfile
.SH SYNOPSIS
@@ -153,13 +153,6 @@
.B CARRAY
entry, was invalid.
.TP
-.B GD_E_BOUNDS
-The
-.IR entry -> array_len
-parameter provided with a
-.B CARRAY
-entry was greater than GD_MAX_CARRAY_LENGTH.
-.TP
.B GD_E_DUPLICATE
The field name provided in
.IR entry -> field
@@ -199,15 +192,6 @@
A descriptive error string for the last error encountered can be obtained from
a call to
.BR gd_error_string (3).
-.SH NOTES
-GetData artificially limits the number of elements in a
-.B CARRAY
-to the value of the symbol GD_MAX_CARRAY_LENGTH defined in getdata.h. This is
-done to be certain that the
-.B CARRAY
-won't overrun the line when flushed to disk. On platforms with a \fIn\fR-bit
-.BR size_t ,
-GD_MAX_CARRAY_LENGTH is 2**(\fIn\fR-8)-1.
.SH SEE ALSO
.BR gd_add_bit (3),
Modified: trunk/getdata/man/gd_add_bit.3
===================================================================
--- trunk/getdata/man/gd_add_bit.3 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/man/gd_add_bit.3 2014-05-05 20:38:45 UTC (rev 895)
@@ -13,7 +13,7 @@
.\" Texts. A copy of the license is included in the `COPYING.DOC' file
.\" as part of this distribution.
.\"
-.TH gd_add_bit 3 "30 September 2013" "Version 0.9.0" "GETDATA"
+.TH gd_add_bit 3 "5 May 2014" "Version 0.9.0" "GETDATA"
.SH NAME
gd_add_bit, gd_add_carray gd_add_clincom, gd_add_const, gd_add_cpolynom,
gd_add_crecip, gd_add_divide, gd_add_lincom, gd_add_linterp, gd_add_multiply,
@@ -254,13 +254,6 @@
.BR gd_add_raw "() or " gd_add_const (),
was invalid.
.TP
-.B GD_E_BOUNDS
-The
-.I array_len
-parameter provided to
-.BR gd_add_carray ()
-was greater than GD_MAX_CARRAY_LENGTH.
-.TP
.B GD_E_DUPLICATE
The
.IR field_name
@@ -302,15 +295,6 @@
.BR gd_error_string (3).
.SH NOTES
-GetData artificially limits the number of elements in a
-.B CARRAY
-to the value of the symbol GD_MAX_CARRAY_LENGTH defined in getdata.h. This is
-done to be certain that the
-.B CARRAY
-won't overrun the line when flushed to disk. On platforms with a \fIn\fR-bit
-.BR size_t ,
-GD_MAX_CARRAY_LENGTH is 2**(\fIn\fR-8)-1.
-
The C89 GetData API provides different prototypes for
.BR gd_add_clincom "(), " gd_add_cpolynom (),
and
Modified: trunk/getdata/man/gd_alter_spec.3
===================================================================
--- trunk/getdata/man/gd_alter_spec.3 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/man/gd_alter_spec.3 2014-05-05 20:38:45 UTC (rev 895)
@@ -13,7 +13,7 @@
.\" Texts. A copy of the license is included in the `COPYING.DOC' file
.\" as part of this distribution.
.\"
-.TH gd_alter_spec 3 "17 August 2011" "Version 0.8.0" "GETDATA"
+.TH gd_alter_spec 3 "5 May 2014" "Version 0.9.0" "GETDATA"
.SH NAME
gd_alter_spec, gd_malter_spec \(em modify a field in a dirfile
.SH SYNOPSIS
@@ -152,13 +152,6 @@
A descriptive error string for the last error encountered can be obtained from
a call to
.BR gd_error_string (3).
-.SH NOTES
-If a
-.B CARRAY
-field with more than GD_MAX_CARRAY_LENGTH elements is provided, subsequent
-elements will be silently truncated. On platforms with a \fIn\fR-bit
-.BR size_t ,
-GD_MAX_CARRAY_LENGTH is 2**(\fIn\fR-8)-1.
.SH SEE ALSO
.BR gd_alter_bit (3),
.BR gd_alter_const (3),
Modified: trunk/getdata/man/gd_cbopen.3
===================================================================
--- trunk/getdata/man/gd_cbopen.3 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/man/gd_cbopen.3 2014-05-05 20:38:45 UTC (rev 895)
@@ -13,7 +13,7 @@
.\" Texts. A copy of the license is included in the `COPYING.DOC' file
.\" as part of this distribution.
.\"
-.TH gd_cbopen 3 "3 April 2013" "Version 0.8.4" "GETDATA"
+.TH gd_cbopen 3 "5 May 2014" "Version 0.9.0" "GETDATA"
.SH NAME
gd_cbopen, gd_open \(em open or create a dirfile
.SH SYNOPSIS
@@ -716,15 +716,6 @@
.B GD_LITTLE_ENDIAN
should be specified by the caller.
-GetData artificially limits the size of a
-.B CARRAY
-field to GD_MAX_CARRAY_LENGTH elements, to be certain it is always able to
-write the CARRAY back to disk without overrunning its maximum line length.
-On platforms with a \fIn\fR-bit
-.BR size_t ,
-GD_MAX_CARRAY_LENGTH is 2**(\fIn\fR-8)-1. Excess elements are silently
-truncated on dirfile open.
-
GetData's parser assumes it is running on an ASCII-compatible platform. Format
specification parsing will fail gloriously on an EBCDIC platform.
.SH SEE ALSO
Added: trunk/getdata/man/gd_encoding_support.3
===================================================================
--- trunk/getdata/man/gd_encoding_support.3 (rev 0)
+++ trunk/getdata/man/gd_encoding_support.3 2014-05-05 20:38:45 UTC (rev 895)
@@ -0,0 +1,69 @@
+.\" gd_encoding_support.3. The gd_encoding_support man page.
+.\"
+.\" Copyright (C) 2014 D. V. Wiebe
+.\"
+.\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+.\"
+.\" This file is part of the GetData project.
+.\"
+.\" Permission is granted to copy, distribute and/or modify this document
+.\" under the terms of the GNU Free Documentation License, Version 1.2 or
+.\" any later version published by the Free Software Foundation; with no
+.\" Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+.\" Texts. A copy of the license is included in the `COPYING.DOC' file
+.\" as part of this distribution.
+.\"
+.TH gd_encoding_support 3 "5 May 2014" "Version 0.9.0" "GETDATA"
+.SH NAME
+gd_encoding_support \(em determine GetData library support for data encodings
+.SH SYNOPSIS
+.B #include <getdata.h>
+.HP
+.nh
+.ad l
+.BI "int gd_encoding_support(unsigned long " encoding );
+.hy
+.ad n
+.SH DESCRIPTION
+The
+.BR gd_encoding_support ()
+function reports whether the Dirfile encoding specified by
+.I encoding
+is supported by the GetData library. The
+.I encoding
+argument should be one of the following symbols, indicating the encoding type:
+.IP
+.nh
+.ad l
+.BR GD_UNENCODED ", " GD_BZIP2_ENCODED ", " GD_GZIP_ENCODED ,
+.BR GD_LZMA_ENCODED ", " GD_SIE_ENCODED ", " GD_SLIM_ENCODED ,
+.BR GD_TEXT_ENCODED ", " GD_ZZIP_ENCODED ", " GD_ZZSLIM_ENCODED .
+.ad n
+.hy
+.PP
+See
+.BR gd_cbopen (3)
+and dirfile-encoding(5) for the meanings of these symbols and details on the
+known encoding schemes.
+
+.SH RETURN VALUE
+The function
+.BR gd_encoding_support ()
+returns
+.B GD_RDWR
+if the GetData library can read from and write to the specified encoding,
+.B GD_RDONLY
+if the GetData library can only read from the specified encoding, or -1 if
+neither reading nor writing is supported, or if
+.I encoding
+was not one of the symbols listed above.
+.SH NOTES
+GetData's encoding support framework is more finely grained than the three-way
+system reported by this function. It is possible for the library to have
+partial support for reading or writing a particular encoding. This function
+will only report positive support if all functions of a given class (read-only
+or read-write) are supported.
+.SH SEE ALSO
+dirfile-encoding(5),
+.BR gd_cbopen (3),
+.BR gd_encoding (3)
Modified: trunk/getdata/src/add.c
===================================================================
--- trunk/getdata/src/add.c 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/src/add.c 2014-05-05 20:38:45 UTC (rev 895)
@@ -500,9 +500,7 @@
== 0)
{
_GD_SetError(D, GD_E_BAD_TYPE, E->EN(scalar,const_type), NULL, 0, NULL);
- } else if (E->EN(scalar,array_len) > GD_MAX_CARRAY_LENGTH)
- _GD_SetError(D, GD_E_BOUNDS, 0, NULL, 0, NULL);
- else {
+ } else {
size_t size = GD_SIZE(_GD_ConstType(D, E->EN(scalar,const_type))) *
E->EN(scalar,array_len);
if (!D->error)
@@ -817,7 +815,6 @@
unsigned int spf, int fragment_index)
{
gd_entry_t R;
- int error;
dtrace("%p, \"%s\", 0x%X, %i, %i", D, field_code, data_type, spf,
fragment_index);
@@ -834,10 +831,14 @@
R.EN(raw,spf) = spf;
R.EN(raw,data_type) = data_type;
R.fragment_index = fragment_index;
- error = (_GD_Add(D, &R, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &R, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a LINCOM entry */
@@ -845,7 +846,7 @@
const char** in_fields, const double* m, const double* b,
int fragment_index) gd_nothrow
{
- int i, error;
+ int i;
gd_entry_t L;
dtrace("%p, \"%s\", %i, %p, %p, %p, %i", D, field_code, n_fields, in_fields,
@@ -874,10 +875,14 @@
L.EN(lincom,m)[i] = m[i];
L.EN(lincom,b)[i] = b[i];
}
- error = (_GD_Add(D, &L, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &L, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a LINCOM entry with complex scalars */
@@ -885,7 +890,7 @@
const char** in_fields, const GD_DCOMPLEXP(cm), const GD_DCOMPLEXP(cb),
int fragment_index) gd_nothrow
{
- int i, error;
+ int i;
gd_entry_t L;
dtrace("%p, \"%s\", %i, %p, %p, %p, %i", D, field_code, n_fields, in_fields,
@@ -915,10 +920,14 @@
gd_ca2cs_(L.EN(lincom,cm)[i], cm, i);
gd_ca2cs_(L.EN(lincom,cb)[i], cb, i);
}
- error = (_GD_Add(D, &L, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &L, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a LINTERP entry */
@@ -926,7 +935,6 @@
const char* table, int fragment_index) gd_nothrow
{
gd_entry_t L;
- int error;
dtrace("%p, \"%s\", \"%s\", \"%s\", %i", D, field_code, in_field, table,
fragment_index);
@@ -943,10 +951,14 @@
L.in_fields[0] = (char *)in_field;
L.EN(linterp,table) = (char *)table;
L.fragment_index = fragment_index;
- error = (_GD_Add(D, &L, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &L, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a BIT entry */
@@ -954,7 +966,6 @@
int bitnum, int numbits, int fragment_index) gd_nothrow
{
gd_entry_t B;
- int error;
dtrace("%p, \"%s\", \"%s\", %i, %i, %i", D, field_code, in_field, bitnum,
numbits, fragment_index);
@@ -972,10 +983,14 @@
B.EN(bit,bitnum) = bitnum;
B.EN(bit,numbits) = numbits;
B.fragment_index = fragment_index;
- error = (_GD_Add(D, &B, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &B, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a SBIT entry */
@@ -983,7 +998,6 @@
int bitnum, int numbits, int fragment_index) gd_nothrow
{
gd_entry_t B;
- int error;
dtrace("%p, \"%s\", \"%s\", %i, %i, %i", D, field_code, in_field, bitnum,
numbits, fragment_index);
@@ -1001,17 +1015,20 @@
B.EN(bit,bitnum) = bitnum;
B.EN(bit,numbits) = numbits;
B.fragment_index = fragment_index;
- error = (_GD_Add(D, &B, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &B, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
static int _GD_AddYoke(DIRFILE* D, gd_entype_t t, const char* field_code,
const char* in_field1, const char* in_field2, int fragment_index) gd_nothrow
{
gd_entry_t M;
- int error;
dtrace("%p, 0x%X, \"%s\", \"%s\", \"%s\", %i", D, t, field_code, in_field1,
in_field2, fragment_index);
@@ -1028,10 +1045,14 @@
M.in_fields[0] = (char *)in_field1;
M.in_fields[1] = (char *)in_field2;
M.fragment_index = fragment_index;
- error = (_GD_Add(D, &M, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &M, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
int gd_add_multiply(DIRFILE* D, const char* field_code, const char* in_field1,
@@ -1067,7 +1088,6 @@
double dividend, int fragment_index) gd_nothrow
{
gd_entry_t E;
- int error;
dtrace("%p, \"%s\", \"%s\", %g, %i", D, field_code, in_field, dividend,
fragment_index);
@@ -1084,10 +1104,14 @@
E.EN(recip,dividend) = dividend;
E.in_fields[0] = (char *)in_field;
E.fragment_index = fragment_index;
- error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &E, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
#ifndef GD_NO_C99_API
@@ -1111,7 +1135,6 @@
const double cdividend[2], int fragment_index) gd_nothrow
{
gd_entry_t E;
- int error;
dtrace("%p, \"%s\", \"%s\", {%g, %g}, %i", D, field_code, in_field,
cdividend[0], cdividend[1], fragment_index);
@@ -1129,17 +1152,21 @@
E.flags = GD_EN_COMPSCAL;
E.in_fields[0] = (char *)in_field;
E.fragment_index = fragment_index;
- error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &E, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a POLYNOM entry */
int gd_add_polynom(DIRFILE* D, const char* field_code, int poly_ord,
const char* in_field, const double* a, int fragment_index) gd_nothrow
{
- int i, error;
+ int i;
gd_entry_t E;
dtrace("%p, \"%s\", %i, \"%s\", %p, %i", D, field_code, poly_ord, in_field,
@@ -1167,16 +1194,19 @@
for (i = 0; i <= poly_ord; ++i)
E.EN(polynom,a)[i] = a[i];
- error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0;
+ if (_GD_Add(D, &E, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
- dreturn("%i", error);
- return error;
+ dreturn("%i", 0);
+ return 0;
}
int gd_add_cpolynom(DIRFILE* D, const char* field_code, int poly_ord,
const char* in_field, const GD_DCOMPLEXP(ca), int fragment_index) gd_nothrow
{
- int i, error;
+ int i;
gd_entry_t E;
dtrace("%p, \"%s\", %i, \"%s\", %p, %i", D, field_code, poly_ord, in_field,
@@ -1205,10 +1235,13 @@
for (i = 0; i <= poly_ord; ++i)
gd_ca2cs_(E.EN(polynom,ca)[i], ca, i);
- error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0;
+ if (_GD_Add(D, &E, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
- dreturn("%i", error);
- return error;
+ dreturn("%i", 0);
+ return 0;
}
/* add a PHASE entry */
@@ -1216,7 +1249,6 @@
gd_shift_t shift, int fragment_index) gd_nothrow
{
gd_entry_t P;
- int error;
dtrace("%p, \"%s\", \"%s\", %lli, %i", D, field_code, in_field,
(long long)shift, fragment_index);
@@ -1233,10 +1265,14 @@
P.in_fields[0] = (char *)in_field;
P.EN(phase,shift) = shift;
P.fragment_index = fragment_index;
- error = (_GD_Add(D, &P, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &P, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a WINDOW entry */
@@ -1245,7 +1281,6 @@
int fragment_index) gd_nothrow
{
gd_entry_t E;
- int error;
dtrace("%p, \"%s\", \"%s\", \"%s\", %i, {%g,%llx,%lli}, %i", D, field_code,
in_field, check_field, windop, threshold.r,
@@ -1265,10 +1300,14 @@
E.in_fields[0] = (char *)in_field;
E.in_fields[1] = (char *)check_field;
E.fragment_index = fragment_index;
- error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &E, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a MPLEX entry */
@@ -1277,7 +1316,6 @@
gd_nothrow
{
gd_entry_t E;
- int error;
dtrace("%p, \"%s\", \"%s\", \"%s\", %i, %i, %i", D, field_code, in_field,
count_field, count_val, period, fragment_index);
@@ -1296,10 +1334,14 @@
E.in_fields[0] = (char *)in_field;
E.in_fields[1] = (char *)count_field;
E.fragment_index = fragment_index;
- error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &E, NULL) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a STRING entry */
@@ -1490,7 +1532,7 @@
int n_fields, const char** in_fields, const double* m, const double* b)
gd_nothrow
{
- int i, error;
+ int i;
gd_entry_t L;
dtrace("%p, \"%s\", \"%s\", %i, %p, %p, %p", D, field_code, parent,
@@ -1521,10 +1563,14 @@
L.scalar[i] = NULL;
L.scalar[i + GD_MAX_LINCOM] = NULL;
}
- error = (_GD_Add(D, &L, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &L, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a META LINCOM entry, with complex scalaras */
@@ -1532,7 +1578,7 @@
int n_fields, const char** in_fields, const GD_DCOMPLEXP(cm),
const GD_DCOMPLEXP(cb)) gd_nothrow
{
- int i, error;
+ int i;
gd_entry_t L;
dtrace("%p, \"%s\", \"%s\", %i, %p, %p, %p", D, field_code, parent,
@@ -1564,10 +1610,14 @@
L.scalar[i] = NULL;
L.scalar[i + GD_MAX_LINCOM] = NULL;
}
- error = (_GD_Add(D, &L, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &L, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a META LINTERP entry */
@@ -1575,7 +1625,6 @@
const char* field_code, const char* in_field, const char* table) gd_nothrow
{
gd_entry_t L;
- int error;
dtrace("%p, \"%s\", \"%s\", \"%s\", \"%s\"", D, field_code, parent, in_field,
table);
@@ -1592,10 +1641,14 @@
L.in_fields[0] = (char *)in_field;
L.EN(linterp,table) = (char *)table;
L.fragment_index = 0;
- error = (_GD_Add(D, &L, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &L, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a META BIT entry */
@@ -1603,7 +1656,6 @@
const char* in_field, int bitnum, int numbits) gd_nothrow
{
gd_entry_t B;
- int error;
dtrace("%p, \"%s\", \"%s\", \"%s\", %i, %in", D, field_code, parent, in_field,
bitnum, numbits);
@@ -1622,10 +1674,14 @@
B.EN(bit,numbits) = numbits;
B.fragment_index = 0;
B.scalar[0] = B.scalar[1] = NULL;
- error = (_GD_Add(D, &B, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &B, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a META SBIT entry */
@@ -1633,7 +1689,6 @@
const char* in_field, int bitnum, int numbits) gd_nothrow
{
gd_entry_t B;
- int error;
dtrace("%p, \"%s\", \"%s\", \"%s\", %i, %in", D, field_code, parent, in_field,
bitnum, numbits);
@@ -1652,10 +1707,14 @@
B.EN(bit,numbits) = numbits;
B.fragment_index = 0;
B.scalar[0] = B.scalar[1] = NULL;
- error = (_GD_Add(D, &B, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &B, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
static int _GD_MAddYoke(DIRFILE* D, gd_entype_t t, const char* parent,
@@ -1663,7 +1722,6 @@
gd_nothrow
{
gd_entry_t M;
- int error;
dtrace("%p, 0x%X, \"%s\", \"%s\", \"%s\", \"%s\"", D, t, field_code, parent,
in_field1, in_field2);
@@ -1680,10 +1738,14 @@
M.in_fields[0] = (char *)in_field1;
M.in_fields[1] = (char *)in_field2;
M.fragment_index = 0;
- error = (_GD_Add(D, &M, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &M, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
int gd_madd_multiply(DIRFILE* D, const char *parent, const char* field_code,
@@ -1697,7 +1759,6 @@
int gd_madd_phase(DIRFILE* D, const char* parent, const char* field_code,
const char* in_field, gd_shift_t shift) gd_nothrow
{
- int error;
gd_entry_t P;
dtrace("%p, \"%s\", \"%s\", \"%s\", %lli", D, field_code, parent, in_field,
@@ -1716,17 +1777,21 @@
P.EN(phase,shift) = shift;
P.fragment_index = 0;
P.scalar[0] = NULL;
- error = (_GD_Add(D, &P, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &P, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a META POLYNOM entry */
int gd_madd_polynom(DIRFILE* D, const char* parent, const char* field_code,
int poly_ord, const char* in_field, const double* a) gd_nothrow
{
- int i, error;
+ int i;
gd_entry_t E;
dtrace("%p, \"%s\", \"%s\", %i, \"%s\", %p", D, field_code, parent, poly_ord,
@@ -1756,17 +1821,20 @@
E.scalar[i] = NULL;
}
- error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0;
+ if (_GD_Add(D, &E, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
- dreturn("%i", error);
- return error;
+ dreturn("%i", 0);
+ return 0;
}
/* add a META POLYNOM entry */
int gd_madd_cpolynom(DIRFILE* D, const char* parent, const char* field_code,
int poly_ord, const char* in_field, const GD_DCOMPLEXP(ca)) gd_nothrow
{
- int i, error;
+ int i;
gd_entry_t E;
dtrace("%p, \"%s\", \"%s\", %i, \"%s\", %p", D, field_code, parent, poly_ord,
@@ -1797,10 +1865,13 @@
E.scalar[i] = NULL;
}
- error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0;
+ if (_GD_Add(D, &E, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
- dreturn("%i", error);
- return error;
+ dreturn("%i", 0);
+ return 0;
}
int gd_madd_divide(DIRFILE* D, const char *parent, const char* field_code,
@@ -1828,7 +1899,6 @@
int gd_madd_recip(DIRFILE* D, const char *parent, const char* field_code,
const char* in_field, double dividend) gd_nothrow
{
- int error;
gd_entry_t E;
dtrace("%p, \"%s\", \"%s\", \"%s\", %g", D, parent, field_code, in_field,
@@ -1845,10 +1915,14 @@
E.field_type = GD_RECIP_ENTRY;
E.EN(recip,dividend) = dividend;
E.in_fields[0] = (char *)in_field;
- error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &E, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
#ifndef GD_NO_C99_API
@@ -1872,7 +1946,6 @@
const char* in_field, const double cdividend[2]) gd_nothrow
{
gd_entry_t E;
- int error;
dtrace("%p, \"%s\", \"%s\", \"%s\", {%g, %g}", D, parent, field_code,
in_field, cdividend[0], cdividend[1]);
@@ -1889,10 +1962,14 @@
gd_ra2cs_(E.EN(recip,cdividend), cdividend);
E.flags = GD_EN_COMPSCAL;
E.in_fields[0] = (char *)in_field;
- error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &E, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a META WINDOW entry */
@@ -1900,7 +1977,6 @@
const char *in_field, const char *check_field, gd_windop_t windop,
gd_triplet_t threshold) gd_nothrow
{
- int error;
gd_entry_t E;
dtrace("%p, \"%s\", \"%s\", \"%s\", \"%s\", %i, {%g,%llx,%lli}", D, parent,
@@ -1920,10 +1996,14 @@
E.EN(window,windop) = windop;
E.in_fields[0] = (char *)in_field;
E.in_fields[1] = (char *)check_field;
- error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &E, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a META MPLEX entry */
@@ -1931,7 +2011,6 @@
const char *in_field, const char *count_field, int count_val, int period)
gd_nothrow
{
- int error;
gd_entry_t E;
dtrace("%p, \"%s\", \"%s\", \"%s\", \"%s\", %i, %i", D, parent, field_code,
@@ -1950,10 +2029,14 @@
E.EN(mplex,period) = period;
E.in_fields[0] = (char *)in_field;
E.in_fields[1] = (char *)count_field;
- error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0;
- dreturn("%i", error);
- return error;
+ if (_GD_Add(D, &E, parent) == NULL) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ dreturn("%i", 0);
+ return 0;
}
/* add a META STRING entry */
Modified: trunk/getdata/src/encoding.c
===================================================================
--- trunk/getdata/src/encoding.c 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/src/encoding.c 2014-05-05 20:38:45 UTC (rev 895)
@@ -195,7 +195,8 @@
((encoding == GD_UNENCODED || encoding == GD_SLIM_ENCODED || \
encoding == GD_GZIP_ENCODED || encoding == GD_BZIP2_ENCODED || \
encoding == GD_TEXT_ENCODED || encoding == GD_LZMA_ENCODED || \
- encoding == GD_SIE_ENCODED))
+ encoding == GD_SIE_ENCODED || encoding == GD_ZZIP_ENCODED || \
+ encoding == GD_ZZSLIM_ENCODED))
#ifdef USE_MODULES
static void *_GD_ResolveSymbol(lt_dlhandle lib, struct encoding_t *restrict enc,
@@ -920,6 +921,47 @@
return reported_encoding;
}
+/* report whether a particular encoding is supported */
+int gd_encoding_support(unsigned long encoding) gd_nothrow
+{
+ int i;
+
+ const unsigned int read_funcs = GD_EF_NAME | GD_EF_OPEN | GD_EF_CLOSE |
+ GD_EF_SEEK | GD_EF_READ | GD_EF_SIZE;
+ const unsigned int write_funcs = read_funcs | GD_EF_WRITE | GD_EF_SYNC |
+ GD_EF_MOVE | GD_EF_UNLINK;
+
+ dtrace("0x%lX", encoding);
+
+ /* make sure we have a valid encoding */
+ if (!_GD_EncodingUnderstood(encoding)) {
+ dreturn("%i", -1);
+ return -1;
+ }
+
+ /* Loop through valid subencodings checking for write support */
+ for (i = 0; gd_ef_[i].scheme != GD_ENC_UNSUPPORTED; i++)
+ if (gd_ef_[i].scheme == encoding) {
+ if (!_GD_MissingFramework(i, write_funcs)) {
+ dreturn("%i", GD_RDWR);
+ return GD_RDWR;
+ }
+ }
+
+ /* No write support; try read support */
+ for (i = 0; gd_ef_[i].scheme != GD_ENC_UNSUPPORTED; i++)
+ if (gd_ef_[i].scheme == encoding) {
+ if (!_GD_MissingFramework(i, read_funcs)) {
+ dreturn("%i", GD_RDONLY);
+ return GD_RDONLY;
+ }
+ }
+
+ /* nope */
+ dreturn("%i", -1);
+ return -1;
+}
+
/* This is basically the non-existant POSIX funcion mkstempat. There are two
* approaches we could take here:
* 1) fchdir to dirfd, use mkstemp to grab a file descriptor; fchdir back to
Modified: trunk/getdata/src/getdata.h.in
===================================================================
--- trunk/getdata/src/getdata.h.in 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/src/getdata.h.in 2014-05-05 20:38:45 UTC (rev 895)
@@ -116,13 +116,6 @@
*/
#define GD_MAX_LINE_LENGTH 4096
-/* maximum number of elements allowed in a CARRAY. Really the maximum should be
- * whatever fits on a format file line, but that's hard to calculate. This is
- * 2**(n-8)-1 on a n-bit system.
- */
-#define GD_MAX_CARRAY_LENGTH (((size_t)-1) >> 8)
-
-
/* error codes */
#define GD_E_OK 0 /* this MUST be zero */
#define GD_E_OPEN 1
@@ -717,6 +710,8 @@
extern unsigned long int gd_encoding(DIRFILE *dirfile,
int fragment) gd_nothrow gd_nonnull ((1));
+extern int gd_encoding_support(unsigned long encoding) gd_nothrow;
+
extern unsigned long int gd_endianness(DIRFILE *dirfile,
int fragment) gd_nothrow gd_nonnull((1));
Modified: trunk/getdata/src/mod.c
===================================================================
--- trunk/getdata/src/mod.c 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/src/mod.c 2014-05-05 20:38:45 UTC (rev 895)
@@ -926,9 +926,6 @@
_GD_SetError(D, GD_E_BAD_TYPE, Q.EN(scalar,const_type), NULL, 0,
NULL);
break;
- } else if (Q.EN(scalar,array_len) > GD_MAX_CARRAY_LENGTH) {
- _GD_SetError(D, GD_E_BOUNDS, 0, NULL, 0, NULL);
- break;
}
type = _GD_ConstType(D, Q.EN(scalar,const_type));
@@ -965,11 +962,6 @@
if (Q.EN(scalar,array_len) != E->EN(scalar,array_len)) {
modified = 1;
- if (Q.EN(scalar,array_len) > GD_MAX_CARRAY_LENGTH) {
- _GD_SetError(D, GD_E_BOUNDS, 0, NULL, 0, NULL);
- break;
- }
-
Qe.u.scalar.d = _GD_Realloc(D, E->e->u.scalar.d,
sizeof(const char *) * Q.EN(scalar,array_len));
if (Qe.u.scalar.d == NULL)
Modified: trunk/getdata/src/parse.c
===================================================================
--- trunk/getdata/src/parse.c 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/src/parse.c 2014-05-05 20:38:45 UTC (rev 895)
@@ -1263,6 +1263,9 @@
}
for (c = first; c < n_cols; ++c) {
+ if (n == GD_SIZE_T_MAX)
+ break;
+
if (string) {
((const char**)data)[n++] = _GD_Strdup(D, in_cols[c]);
@@ -1286,9 +1289,6 @@
return NULL;
}
}
-
- if (n == GD_MAX_CARRAY_LENGTH)
- break;
}
if (n_cols < MAX_IN_COLS)
Index: trunk/getdata/test
===================================================================
--- trunk/getdata/test 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/test 2014-05-05 20:38:45 UTC (rev 895)
Property changes on: trunk/getdata/test
___________________________________________________________________
Modified: svn:ignore
## -346,6 +346,7 ##
encode_get
encode_recode
encode_recode_open
+encode_support
endian_alter
endian_alter_all
endian_alter_sie
Modified: trunk/getdata/test/Makefile.am
===================================================================
--- trunk/getdata/test/Makefile.am 2014-05-03 00:06:48 UTC (rev 894)
+++ trunk/getdata/test/Makefile.am 2014-05-05 20:38:45 UTC (rev 895)
@@ -142,7 +142,7 @@
ELIST_TESTS=elist_alias elist_hidden elist_noalias elist_scalar
ENCODE_TESTS=encode_alter encode_alter_all encode_alter_open encode_get \
- encode_recode encode_recode_open
+ encode_recode encode_recode_open encode_support
ENDIAN_TESTS=endian_alter endian_alter_all endian_alter_sie endian_get \
endian_move
Added: trunk/getdata/test/encode_support.c
===================================================================
--- trunk/getdata/test/encode_support.c (rev 0)
+++ trunk/getdata/test/encode_support.c 2014-05-05 20:38:45 UTC (rev 895)
@@ -0,0 +1,89 @@
+/* Copyright (C) 2014 D. V. Wiebe
+ *
+ ***************************************************************************
+ *
+ * This file is part of the GetData project.
+ *
+ * GetData is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation; either version 2.1 of the License, or (at your
+ * option) any later version.
+ *
+ * GetData is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+ * License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with GetData; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include "test.h"
+
+/* figure out expected support */
+#ifdef USE_SLIM
+#define GD_SLIM_MODE GD_RDONLY
+#else
+#define GD_SLIM_MODE -1
+#endif
+
+#ifdef USE_GZIP
+#define GD_GZIP_MODE GD_RDWR
+#else
+#define GD_GZIP_MODE -1
+#endif
+
+#ifdef USE_BZIP2
+#define GD_BZIP2_MODE GD_RDONLY
+#else
+#define GD_BZIP2_MODE -1
+#endif
+
+#ifdef USE_LZMA
+#define GD_LZMA_MODE GD_RDONLY
+#else
+#define GD_LZMA_MODE -1
+#endif
+
+#ifdef USE_ZZIP
+#define GD_ZZIP_MODE GD_RDONLY
+#else
+#define GD_ZZIP_MODE -1
+#endif
+
+#ifdef USE_ZZSLIM
+#define GD_ZZSLIM_MODE GD_RDONLY
+#else
+#define GD_ZZSLIM_MODE -1
+#endif
+
+#define N 13
+int main(void)
+{
+ int i, r = 0;
+ struct {
+ unsigned long e;
+ int v;
+ } d[N] = {
+ { GD_AUTO_ENCODED, -1 }, /* 0 */
+ { GD_UNENCODED, GD_RDWR }, /* 1 */
+ { GD_TEXT_ENCODED, GD_RDWR }, /* 2 */
+ { GD_SLIM_ENCODED, GD_SLIM_MODE }, /* 3 */
+ { GD_GZIP_ENCODED, GD_GZIP_MODE }, /* 4 */
+ { GD_BZIP2_ENCODED, GD_BZIP2_MODE }, /* 5 */
+ { GD_LZMA_ENCODED, GD_LZMA_MODE }, /* 6 */
+ { GD_SIE_ENCODED, GD_RDWR }, /* 7 */
+ { GD_ZZIP_ENCODED, GD_ZZIP_MODE }, /* 8 */
+ { GD_ZZSLIM_ENCODED, GD_ZZSLIM_MODE }, /* 9 */
+ { GD_ENC_UNSUPPORTED, -1 }, /* 10 */
+ { GD_ENCODING, -1 }, /* 11 */
+ { 765, -1 } /* 12 */
+ };
+
+ for (i = 0; i < N; ++i) {
+ int q = gd_encoding_support(d[i].e);
+ CHECKIi(i, q, d[i].v);
+ }
+
+ return r;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|