[Getdata-commits] SF.net SVN: getdata:[940] trunk/getdata
Scientific Database Format
Brought to you by:
ketiltrout
|
From: <ket...@us...> - 2015-01-12 10:10:05
|
Revision: 940
http://sourceforge.net/p/getdata/code/940
Author: ketiltrout
Date: 2015-01-12 10:09:51 +0000 (Mon, 12 Jan 2015)
Log Message:
-----------
Namespaces. Includes some refactoring of field code handling in the parser.
Modified Paths:
--------------
trunk/getdata/ChangeLog
trunk/getdata/NEWS
trunk/getdata/configure.ac
trunk/getdata/man/gd_array_len.3
trunk/getdata/man/gd_bof.3
trunk/getdata/man/gd_entry.3
trunk/getdata/man/gd_entry_type.3
trunk/getdata/man/gd_eof.3
trunk/getdata/man/gd_flush.3
trunk/getdata/man/gd_framenum_subset.3
trunk/getdata/man/gd_get_carray_slice.3
trunk/getdata/man/gd_getdata.3
trunk/getdata/man/gd_linterp_tablename.3
trunk/getdata/man/gd_native_type.3
trunk/getdata/man/gd_put_carray_slice.3
trunk/getdata/man/gd_put_string.3
trunk/getdata/man/gd_putdata.3
trunk/getdata/man/gd_raw_filename.3
trunk/getdata/man/gd_seek.3
trunk/getdata/man/gd_spf.3
trunk/getdata/man/gd_tell.3
trunk/getdata/man/gd_validate.3
trunk/getdata/src/add.c
trunk/getdata/src/common.c
trunk/getdata/src/constant.c
trunk/getdata/src/entry.c
trunk/getdata/src/errors.c
trunk/getdata/src/flimits.c
trunk/getdata/src/flush.c
trunk/getdata/src/fpos.c
trunk/getdata/src/fragment.c
trunk/getdata/src/getdata.c
trunk/getdata/src/getdata.h.in
trunk/getdata/src/include.c
trunk/getdata/src/internal.h
trunk/getdata/src/mod.c
trunk/getdata/src/move.c
trunk/getdata/src/name.c
trunk/getdata/src/open.c
trunk/getdata/src/parse.c
trunk/getdata/src/putdata.c
trunk/getdata/src/spf.c
trunk/getdata/test/Makefile.am
trunk/getdata/test/del_alias.c
trunk/getdata/test/get_polynom_cmpin.c
trunk/getdata/test/put_repr.c
trunk/getdata/test/repr_bad.c
trunk/getdata/test/version_9_strict.c
Added Paths:
-----------
trunk/getdata/test/add_dot10.c
trunk/getdata/test/add_dot5.c
trunk/getdata/test/add_dot6.c
trunk/getdata/test/add_ns.c
trunk/getdata/test/add_ns_frag.c
trunk/getdata/test/add_ns_frag2.c
trunk/getdata/test/include_ns.c
trunk/getdata/test/name_dot10.c
trunk/getdata/test/name_dot5.c
trunk/getdata/test/name_dot5r.c
trunk/getdata/test/name_dot9.c
trunk/getdata/test/name_ns.c
trunk/getdata/test/name_ns2.c
trunk/getdata/test/name_ns2r.c
trunk/getdata/test/name_nsdot.c
trunk/getdata/test/parse_include_ns.c
trunk/getdata/test/parse_include_ns2.c
trunk/getdata/test/parse_include_nsabs.c
trunk/getdata/test/parse_include_nsinh.c
trunk/getdata/test/parse_include_nspop.c
trunk/getdata/test/parse_include_nsrabs.c
trunk/getdata/test/parse_include_nsrainh.c
trunk/getdata/test/parse_include_nsrinh.c
trunk/getdata/test/parse_include_nsroot.c
trunk/getdata/test/parse_ns.c
trunk/getdata/test/parse_ns_abs.c
trunk/getdata/test/parse_ns_dot.c
trunk/getdata/test/parse_ns_dotdot.c
trunk/getdata/test/parse_ns_dotdotns.c
trunk/getdata/test/parse_ns_dotns.c
trunk/getdata/test/parse_ns_ndotdots.c
trunk/getdata/test/parse_ns_ndots.c
trunk/getdata/test/parse_ns_nsdot.c
trunk/getdata/test/parse_ns_nsdotdot.c
trunk/getdata/test/parse_ns_par.c
trunk/getdata/test/parse_ns_sub.c
trunk/getdata/test/parse_nsf.c
trunk/getdata/test/parse_nsf_abs.c
trunk/getdata/test/parse_nsf_alias.c
trunk/getdata/test/parse_nsf_dot.c
trunk/getdata/test/parse_nsf_hide.c
trunk/getdata/test/parse_nsf_index.c
trunk/getdata/test/parse_nsf_meta.c
trunk/getdata/test/parse_nsf_meta2.c
trunk/getdata/test/parse_nsf_par.c
trunk/getdata/test/parse_nsf_ref.c
trunk/getdata/test/parse_nsf_refabs.c
trunk/getdata/test/parse_nsf_refrel.c
trunk/getdata/test/parse_nsf_root.c
trunk/getdata/test/parse_nsf_rpar.c
trunk/getdata/test/parse_nsf_sub.c
Removed Paths:
-------------
trunk/getdata/test/add_dot.c
trunk/getdata/test/name_dot.c
Property Changed:
----------------
trunk/getdata/test/
Modified: trunk/getdata/ChangeLog
===================================================================
--- trunk/getdata/ChangeLog 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/ChangeLog 2015-01-12 10:09:51 UTC (rev 940)
@@ -1,9 +1,64 @@
-2014-10-16 D. V. Wiebe <g et...@ke...> svn:929
+2014-12-31 D. V. Wiebe <ge...@ke...> svn:???
+ * src/getdata.c (_GD_DoField) src/putdata.c (_GD_DoFieldOut): Fix recursion
+ counting on error.
+
+ * src/getdata.h.in src/errors.c: Merge GD_E_BAD_REPR into GD_E_BAD_CODE.
+
+ * src/common.c (_GD_FindEntry): Added.
+ * src/entry.c (gd_raw_filename gd_entry, gd_entry_type gd_linterp_tablename)
+ src/flush.c (_GD_SyncOrClose) src/spf.c (_GD_GetSPF) src/constant.c
+ (gd_put_carray_slice gd_put_carray) src/putdata.c (gd_putdata64)
+ src/flimits.c (gd_eof64 gd_bof64) src/fpos.c (gd_tell64 gd_seek64):
+ Use _GD_FindEntry instead of _GD_FindFieldAndRepr.
+ * src/constant.c (_GD_PutCarraySlice) src/putdata.c (_GD_DoFieldOut):
+ Remove repr parameter.
+ * src/putdata.c (_GD_DoLinterpOut _GD_DoLincomOut _GD_DoBitOut
+ _GD_DoPhaseOut _GD_DoRecipOut _GD_DoPolynomOut _GD_DoMplexOut
+ _GD_DoConstOut): Return error if input field has a repr.
+
+ * src/parse.c: Use struct parser_state to pass around parser data rather
+ than passing bits and pieces individually.
+ * src/internal.h: Define struct parser_state.
+ * src/parse.c (_GD_SimpleParserInit): Added.
+ * src/open.c (_GD_Open): Initialise the parser proto-state; set or clear
+ GD_PEDANTIC in the dirfile flags after parsing completes.
+
+ * src/mod.c (gd_alter_spec gd_malter_spec) src/parse.c (gd_strtok) src/add.c
+ (_GD_FixName gd_madd_spec gd_add_spec): Call _GD_SimpleParserInit().
+
+ * src/parse.c (_GD_ParseFieldSpec): Speed up strcmps.
+
+ * src/common.c (_GD_GrabDir): Let callers (i.e. _GD_Include) skip
+ canonicalisation, if they've already done it.
+
+ * src/internal.h: Add ns and nsl to gd_fragment_t.
+ * src/name.c (_GD_MungeCode): Remove subfield munging (the P parameter).
+ Replace err_ok with flags parameter. Don't malloc the buffer it the caller
+ doesn't want it.
+ * src/name.c (_GD_ValidateField): Replaced affix parameter with flags.
+ * src/parse.c (_GD_SubfieldCode _GD_CodeFromFrag _GD_InputCode _GD_SetField):
+ Added.
+
+ * src/name.c (_GD_MungeCode _GD_CheckCodeAffixes _GD_ValidateField)
+ src/include.c (_GD_SetFieldAffixes _GD_Include): Handle
+ namespaces.
+ * src/parse.c (_GD_ParseNamespace): Added.
+ * src/parse.c (_GD_ParseDirective): Handle "/NAMESPACE"
+
+ * src/name,c (_GD_MakeNewCode): Handle errors better.
+
+ * src/getdata.h.in: Declare GD_EN_DOTTED.
+ * src/name.c (_GD_PerformRename) src/add.c (_GD_Add): Set or clear GD_EN_DOTTED.
+
+ * src/fragment.c (_GD_SubFragmentList _GD_CheckChangeNamespace
+ gd_fragment_namespace): Added.
+
+2014-10-16 D. V. Wiebe <ge...@ke...> svn:929
* src/open.c (_GD_CreateDirfile): Force GD_RDWR when creating a dirfile.
* test/creat_rdonly.c: Updated.
* test/creat_rdonly_exists.c: Added.
-2014-10-16 D. V. Wiebe <g et...@ke...> svn:928
+2014-10-16 D. V. Wiebe <ge...@ke...> svn:928
* bindings/make_parameters.c: Replace numeric type literals with CPP macros
for legibility.
@@ -22,7 +77,7 @@
* bindings/python/pygetdata.c: Define deprecated Exceptions as aliases for
current ones.
-2014-07-30 D. V. Wiebe <g et...@ke...> svn:921
+2014-07-30 D. V. Wiebe <ge...@ke...> svn:921
* src/del.c (gd_delete_alias): Deleted.
* src/del.c (gd_delete): Don't dereference the field code.
@@ -41,11 +96,11 @@
test 225.
-2014-07-25 D. V. Wiebe <g et...@ke...> svn:915
+2014-07-25 D. V. Wiebe <ge...@ke...> svn:915
* Makefile.am: Auotmake version bumped to 1.13.
* configure.ac: Autoconf version bumped to 2.65.
-2014-07-25 D. V. Wiebe <g et...@ke...> svn:914
+2014-07-25 D. V. Wiebe <ge...@ke...> svn:914
* src/parse.c (_GD_TokToNum): Added.
* src/parse.c (_GD_SetScalar): Call _GD_TokToNum to parse numbers.
@@ -69,14 +124,14 @@
* test/add_amb_code7.c test/alter_entry_scalar_amb.c test/flush_amb_code.c
test/parse_scalar1.c test/parse_scalar2.c test/parse_scalar_repr.c: Added.
-2014-07-17 D. V. Wiebe <g et...@ke...> svn:912
+2014-07-17 D. V. Wiebe <ge...@ke...> svn:912
* bindings/f77/fgetdata.c (_GDF_SetDirfile): Don't abort on error, just
return -1 (optionally discarding the dirfile first).
* bindings/f77/fgetdata.c (_GDF_Callback GDCOPN): Handle running out of
DUNs.
-2014-07-17 D. V. Wiebe <g et...@ke...> svn:911
+2014-07-17 D. V. Wiebe <ge...@ke...> svn:911
* src/getdata.c (_GD_DoSindir): Renamed from gd_getstrdata64 and
internalised. Do return_type checks, and handle num_samp = 0.
* src/getdata.c (gd_getstrdata): Deleted.
@@ -374,7 +429,8 @@
* bindings/f77/fgetdata.c (GDASCA): Handle error in gd_entry call.
- * bindings/php/getdata.c (gdphp_data_to_array): Add missing break.
+ * bindings/php/getdata.c (gdphp_data_to_array) src/types.c (_GD_ConvertType):
+ Add missing break.
* bindings/php/getdata.c (gd_error_string): Handle error in gd_error_string
call.
@@ -384,7 +440,7 @@
* bindings/python/pydirfile.c (gdpy_dirfile_getentry gdpy_dirfile_getstring
gdpy_dirfile_putcarray gdpy_dirfile_putdata) src/include.c (_GD_Include)
src/name.c (_GD_PrepareRename) src/putdata.c (_GD_DoMplexOut) src/sie.c
- (_GD_SampIndWrite) src/types.c (_GD_ConvertType): Deallocate buffers on error.
+ (_GD_SampIndWrite): Deallocate buffers on error.
* bindings/python/pyentry.c (gdpy_entry_seta): Set a[i] if the pyobj is
complex.
@@ -437,7 +493,7 @@
2013-12-12 D. V. Wiebe <ge...@ke...> svn:874
* src/endian.c (_GD_CheckByteSex): Added.
* src/endian.c (_GD_FileSwapBytes): Added (replacing macro in internal.h).
- * src/endian.c (_GD_FixEndianness): Call _GD_CheckByteSex() to check wether
+ * src/endian.c (_GD_FixEndianness): Call _GD_CheckByteSex() to check whether
correction is needed.
* src/getdata.c (_GD_DoRaw) src/move.c (_GD_MogrifyFile) src/putdata.c
@@ -474,8 +530,8 @@
* test/cvlist_meta0.c: Check error.
- * bindings/cxx/ getdata/entry.h (Entry::CompScal): Allow non-zero for
- RECIP, too.
+ * bindings/cxx/getdata/entry.h (Entry::CompScal): Allow non-zero for
+ RECIP, too.
2013-12-06 D. V. Wiebe <ge...@ke...> svn:867
* test/add_dot.c test/alter_clincom.c test/alter_const_r2c.c test/sie_sync.c
Modified: trunk/getdata/NEWS
===================================================================
--- trunk/getdata/NEWS 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/NEWS 2015-01-12 10:09:51 UTC (rev 940)
@@ -35,6 +35,13 @@
GD_RDONLY and GD_CREAT in open calls would result in an access mode
(GD_E_ACCMODE) error if the dirfile didn't already exist.
+ * Many functions which used to silently ignore representation suffixes in
+ field codes passed to them no longer do that. Most of these will report
+ an error (GD_E_BAD_CODE) if passed a representation suffix. The affected
+ functions are: gd_bof, gd_entry, gd_entry_type, gd_eof, gd_flush,
+ gd_linterp_tablename, gd_put_carray, gd_put_carray_slice, gd_putdata,
+ gd_raw_close, gd_raw_filename, gd_seek, gd_spf, gd_sync, gd_tell.
+
* BUG FIX: In addition to the addition of write support mentioned above, a
number of problems with reading LZMA files has been fixed, which should
result in fewer segmentaion faults.
Modified: trunk/getdata/configure.ac
===================================================================
--- trunk/getdata/configure.ac 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/configure.ac 2015-01-12 10:09:51 UTC (rev 940)
@@ -80,14 +80,14 @@
AC_CANONICAL_HOST
dnl Legacy API
-AC_ARG_ENABLE(legacy-api, AS_HELP_STRING([--disable-legacy-api],
- [don't include the legacy API wrapper in the library]), dnl'
+AC_ARG_ENABLE(legacy-api, AS_HELP_STRING([--enaable-legacy-api],
+ [include the legacy API wrapper in the library]), dnl'
[
case "${enableval}" in
no) include_legacy_api="no" ;;
*) include_legacy_api="yes" ;;
esac
- ], [ include_legacy_api="yes" ])
+ ], [ include_legacy_api="no" ])
AC_MSG_CHECKING([whether to include the legacy API])
AC_MSG_RESULT([$include_legacy_api])
Modified: trunk/getdata/man/gd_array_len.3
===================================================================
--- trunk/getdata/man/gd_array_len.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_array_len.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -69,11 +69,6 @@
The field specified by
.I field_code
was not of one of the field types listed above.
-.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
.PP
The dirfile error may be retrieved by calling
.BR gd_error (3).
Modified: trunk/getdata/man/gd_bof.3
===================================================================
--- trunk/getdata/man/gd_bof.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_bof.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -78,11 +78,6 @@
.B GD_E_BAD_DIRFILE
The supplied dirfile was invalid.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.IR field_code ,
-or in one of its inputs was not recognised.
-.TP
.B GD_E_DIMENSION
A scalar field was found where a vector field was expected in the definition
of
Modified: trunk/getdata/man/gd_entry.3
===================================================================
--- trunk/getdata/man/gd_entry.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_entry.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -93,11 +93,6 @@
.TP
.B GD_E_BAD_DIRFILE
The supplied dirfile was invalid.
-.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
.PP
The dirfile error may be retrieved by calling
.BR gd_error (3).
Modified: trunk/getdata/man/gd_entry_type.3
===================================================================
--- trunk/getdata/man/gd_entry_type.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_entry_type.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -80,11 +80,6 @@
The field specified by
.I field_code
was not found in the database.
-.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
.PP
The dirfile error may be retrieved by calling
.BR gd_error (3).
Modified: trunk/getdata/man/gd_eof.3
===================================================================
--- trunk/getdata/man/gd_eof.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_eof.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -89,11 +89,6 @@
.I INDEX
as one of its inputs.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.IR field_code ,
-or in one of its inputs was not recognised.
-.TP
.B GD_E_DIMENSION
A scalar field was found where a vector field was expected in the definition
of
Modified: trunk/getdata/man/gd_flush.3
===================================================================
--- trunk/getdata/man/gd_flush.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_flush.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -85,11 +85,6 @@
.B GD_E_BAD_DIRFILE
The supplied dirfile was invalid.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
-.TP
.B GD_E_IO
An I/O error occurred while trying to write modified data or metadata to disk.
.TP
Modified: trunk/getdata/man/gd_framenum_subset.3
===================================================================
--- trunk/getdata/man/gd_framenum_subset.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_framenum_subset.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -110,11 +110,6 @@
.B GD_E_BAD_DIRFILE
The supplied dirfile was invalid.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.IR field_code ,
-or in one of its input fields, was not recognised.
-.TP
.B GD_E_BAD_SCALAR
A scalar field used in the definition of the field was not found, or was not of
scalar type.
Modified: trunk/getdata/man/gd_get_carray_slice.3
===================================================================
--- trunk/getdata/man/gd_get_carray_slice.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_get_carray_slice.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -183,11 +183,6 @@
.BR gd_get_string (3)
instead.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.IR field_code ,
-or in one of the field codes it uses for input, was invalid.
-.TP
.B GD_E_BAD_TYPE
An invalid
.I return_type
Modified: trunk/getdata/man/gd_getdata.3
===================================================================
--- trunk/getdata/man/gd_getdata.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_getdata.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -269,11 +269,6 @@
.I dirfile
was supplied.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.IR field_code ,
-or in one of the field codes it uses for input, was invalid.
-.TP
.B GD_E_BAD_SCALAR
A scalar field used in the definition of the field was not found, or was not of
scalar type.
Modified: trunk/getdata/man/gd_linterp_tablename.3
===================================================================
--- trunk/getdata/man/gd_linterp_tablename.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_linterp_tablename.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -76,11 +76,6 @@
was not a
.B LINTERP
field.
-.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
.PP
The dirfile error may be retrieved by calling
.BR gd_error (3).
Modified: trunk/getdata/man/gd_native_type.3
===================================================================
--- trunk/getdata/man/gd_native_type.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_native_type.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -125,11 +125,6 @@
.B GD_E_BAD_DIRFILE
The supplied dirfile was invalid.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.IR field_code ,
-or in one of its input fields, was not recognised.
-.TP
.B GD_E_DIMENSION
A scalar field was found where a vector field was expected.
.TP
Modified: trunk/getdata/man/gd_put_carray_slice.3
===================================================================
--- trunk/getdata/man/gd_put_carray_slice.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_put_carray_slice.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -178,10 +178,6 @@
.BR gd_put_string (3)
instead.
.TP
-.B GD_E_BAD_REPR
-A representation suffix in the field definition was invalid, or an attempt was
-made to write to a representation, instead of the underlying field.
-.TP
.B GD_E_BAD_TYPE
An invalid
.I data_type
Modified: trunk/getdata/man/gd_put_string.3
===================================================================
--- trunk/getdata/man/gd_put_string.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_put_string.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -80,11 +80,6 @@
.BR gd_put_constant (3)
instead.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
-.TP
.B GD_E_BAD_TYPE
An invalid
.I data_type
Modified: trunk/getdata/man/gd_putdata.3
===================================================================
--- trunk/getdata/man/gd_putdata.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_putdata.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -182,12 +182,6 @@
how to partition the input data. Alternately, the caller may have attempted to
write to the implicit INDEX field, which is not possible.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised, or an attempt was made to write to a field representation,
-instead of the underlying field.
-.TP
.B GD_E_BAD_TYPE
An invalid
.I data_type
Modified: trunk/getdata/man/gd_raw_filename.3
===================================================================
--- trunk/getdata/man/gd_raw_filename.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_raw_filename.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -67,11 +67,6 @@
.B RAW
field.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
-.TP
.B GD_E_UNKNOWN_ENCODING
The encoding scheme of the specified field could not be determined or was not
understood by GetData.
Modified: trunk/getdata/man/gd_seek.3
===================================================================
--- trunk/getdata/man/gd_seek.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_seek.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -159,11 +159,6 @@
.I INDEX
field, which has no end-of-field marker.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.IR field_code ,
-or in one of the field codes it uses for input, was invalid.
-.TP
.B GD_E_DIMENSION
The specified field or one of its inputs wasn't of vector type.
.TP
Modified: trunk/getdata/man/gd_spf.3
===================================================================
--- trunk/getdata/man/gd_spf.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_spf.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -59,11 +59,6 @@
.B GD_E_BAD_DIRFILE
The supplied dirfile was invalid.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
-.TP
.B GD_E_DIMENSION
A scalar field was found where a vector field was expected.
.TP
Modified: trunk/getdata/man/gd_tell.3
===================================================================
--- trunk/getdata/man/gd_tell.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_tell.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -60,11 +60,6 @@
.B GD_E_BAD_DIRFILE
The supplied dirfile was invalid.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.IR field_code ,
-or in one of the field codes it uses for input, was invalid.
-.TP
.B GD_E_DIMENSION
The specified field or one of its inputs wasn't of vector type.
.TP
Modified: trunk/getdata/man/gd_validate.3
===================================================================
--- trunk/getdata/man/gd_validate.3 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/man/gd_validate.3 2015-01-12 10:09:51 UTC (rev 940)
@@ -56,11 +56,6 @@
.B GD_E_BAD_DIRFILE
The supplied dirfile was invalid.
.TP
-.B GD_E_BAD_REPR
-The representation suffix specified in
-.I field_code
-was not recognised.
-.TP
.B GD_E_BAD_SCALAR
A non-literal scalar used in the definition of the field or one of its inputs
was not found, or was not a
Modified: trunk/getdata/src/add.c
===================================================================
--- trunk/getdata/src/add.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/add.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -43,11 +43,12 @@
{
gd_entry_t *P;
char *ptr;
+ struct parser_state p;
dtrace("%p, %p, \"%s\", %i, %p", D, buffer, name, frag, offset);
/* Check prefix and suffix */
- if (_GD_CheckCodeAffixes(D, NULL, name, frag, 1)) {
+ if (_GD_CheckCodeAffixes(D, name, frag, 1)) {
dreturn("%p", NULL);
return NULL;
}
@@ -60,7 +61,8 @@
return NULL;
}
- P = _GD_CheckParent(D, &ptr, -1, 0);
+ _GD_SimpleParserInit(D, NULL, &p);
+ P = _GD_CheckParent(D, &p, &ptr, -1);
if (D->error) {
free(*buffer);
@@ -109,11 +111,8 @@
E->scalar[i] = NULL;
} else {
/* check for correct affixes */
- if (_GD_CheckCodeAffixes(D, NULL, entry->scalar[i], entry->fragment_index,
- 1))
- {
+ if (_GD_CheckCodeAffixes(D, entry->scalar[i], entry->fragment_index, 1))
break;
- }
/* when using early Standards, reject ambiguous field codes */
if (entry->scalar_ind[i] == -1 && !(D->flags & GD_NOSTANDARD) &&
@@ -267,7 +266,9 @@
added field this way */
/* Check */
- if (_GD_ValidateField(E->field + offset, D->standards, 1, 0, &is_dot)) {
+ if (_GD_ValidateField(E->field + offset, D->standards, 1, GD_VF_CODE,
+ &is_dot))
+ {
_GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_INVALID, NULL, 0, entry->field);
_GD_FreeE(D, E, 1);
dreturn("%p", NULL);
@@ -300,10 +301,10 @@
E->e->u.raw.file[0].idata = E->e->u.raw.file[1].idata = -1;
E->e->u.raw.file[0].subenc = GD_ENC_UNKNOWN;
- E->e->u.raw.filebase = _GD_MungeCode(D, NULL,
+ E->e->u.raw.filebase = _GD_MungeCode(D, NULL, 0,
D->fragment[entry->fragment_index].prefix,
D->fragment[entry->fragment_index].suffix, NULL, NULL, E->field,
- &offset, 0);
+ NULL, NULL, GD_MC_RQ_PARTS);
if (D->error)
break;
@@ -331,8 +332,7 @@
E->EN(lincom,n_fields), NULL);
for (i = 0; i < E->EN(lincom,n_fields); ++i)
- _GD_CheckCodeAffixes(D, NULL, entry->in_fields[i],
- entry->fragment_index, 1);
+ _GD_CheckCodeAffixes(D, entry->in_fields[i], entry->fragment_index, 1);
if (D->error)
break;
@@ -369,8 +369,8 @@
case GD_LINTERP_ENTRY:
E->e->u.linterp.table_len = -1;
- if (_GD_CheckCodeAffixes(D, NULL, entry->in_fields[0],
- entry->fragment_index, 1))
+ if (_GD_CheckCodeAffixes(D, entry->in_fields[0], entry->fragment_index,
+ 1))
{
break;
}
@@ -382,9 +382,9 @@
case GD_DIVIDE_ENTRY:
case GD_INDIR_ENTRY:
case GD_SINDIR_ENTRY:
- if (_GD_CheckCodeAffixes(D, NULL, entry->in_fields[0],
- entry->fragment_index, 1) || _GD_CheckCodeAffixes(D, NULL,
- entry->in_fields[1], entry->fragment_index, 1))
+ if (_GD_CheckCodeAffixes(D, entry->in_fields[0], entry->fragment_index,
+ 1) || _GD_CheckCodeAffixes(D, entry->in_fields[1],
+ entry->fragment_index, 1))
{
break;
}
@@ -393,8 +393,8 @@
E->in_fields[1] = _GD_Strdup(D, entry->in_fields[1]);
break;
case GD_RECIP_ENTRY:
- if (_GD_CheckCodeAffixes(D, NULL, entry->in_fields[0],
- entry->fragment_index, 1))
+ if (_GD_CheckCodeAffixes(D, entry->in_fields[0], entry->fragment_index,
+ 1))
{
break;
}
@@ -418,8 +418,8 @@
E->EN(bit,numbits) = entry->EN(bit,numbits);
E->EN(bit,bitnum) = entry->EN(bit,bitnum);
- if (_GD_CheckCodeAffixes(D, NULL, entry->in_fields[0],
- entry->fragment_index, 1))
+ if (_GD_CheckCodeAffixes(D, entry->in_fields[0], entry->fragment_index,
+ 1))
{
break;
}
@@ -441,8 +441,8 @@
case GD_PHASE_ENTRY:
E->EN(phase,shift) = entry->EN(phase,shift);
- if (_GD_CheckCodeAffixes(D, NULL, entry->in_fields[0],
- entry->fragment_index, 1))
+ if (_GD_CheckCodeAffixes(D, entry->in_fields[0], entry->fragment_index,
+ 1))
{
break;
}
@@ -455,9 +455,9 @@
E->EN(window,windop) = entry->EN(window,windop);
E->EN(window,threshold) = entry->EN(window,threshold);
- if (_GD_CheckCodeAffixes(D, NULL, entry->in_fields[0],
- entry->fragment_index, 1) || _GD_CheckCodeAffixes(D, NULL,
- entry->in_fields[1], entry->fragment_index, 1))
+ if (_GD_CheckCodeAffixes(D, entry->in_fields[0], entry->fragment_index,
+ 1) || _GD_CheckCodeAffixes(D, entry->in_fields[1],
+ entry->fragment_index, 1))
{
break;
}
@@ -474,9 +474,9 @@
E->EN(mplex,count_val) = entry->EN(mplex,count_val);
E->EN(mplex,period) = entry->EN(mplex,period);
- if (_GD_CheckCodeAffixes(D, NULL, entry->in_fields[0],
- entry->fragment_index, 1) || _GD_CheckCodeAffixes(D, NULL,
- entry->in_fields[1], entry->fragment_index, 1))
+ if (_GD_CheckCodeAffixes(D, entry->in_fields[0], entry->fragment_index,
+ 1) || _GD_CheckCodeAffixes(D, entry->in_fields[1],
+ entry->fragment_index, 1))
{
break;
}
@@ -545,10 +545,8 @@
_GD_SetError(D, GD_E_BAD_ENTRY, GD_E_ENTRY_POLYORD, NULL,
E->EN(polynom,poly_ord), NULL);
} else {
- _GD_CheckCodeAffixes(D, NULL, entry->in_fields[0],
- entry->fragment_index, 1);
- _GD_CheckCodeAffixes(D, NULL, entry->in_fields[1],
- entry->fragment_index, 1);
+ _GD_CheckCodeAffixes(D, entry->in_fields[0], entry->fragment_index, 1);
+ _GD_CheckCodeAffixes(D, entry->in_fields[1], entry->fragment_index, 1);
}
if (D->error)
@@ -607,6 +605,7 @@
dreturn("%p", NULL);
return NULL;
}
+ E->flags |= GD_EN_DOTTED;
D->dot_list = (gd_entry_t **)new_list;
}
@@ -680,6 +679,7 @@
int n_cols;
int me;
gd_entry_t* E = NULL;
+ struct parser_state p;
dtrace("%p, \"%s\", \"%s\"", D, line, parent);
@@ -718,13 +718,14 @@
}
/* start parsing */
- n_cols = _GD_Tokenise(D, line, &outstring, &tok_pos, MAX_IN_COLS, in_cols,
- "dirfile_madd_spec()", 0, D->standards, D->flags & GD_NOSTANDARD);
+ _GD_SimpleParserInit(D, "gd_madd_spec()", &p);
+ n_cols = _GD_Tokenise(D, &p, line, &outstring, &tok_pos, MAX_IN_COLS,
+ in_cols);
/* Directive parsing is skipped -- The Field Spec parser will add the field */
if (!D->error)
- _GD_ParseFieldSpec(D, n_cols, in_cols, E, "dirfile_madd_spec()", 0, me,
- D->standards, 1, GD_PEDANTIC, 1, &outstring, tok_pos);
+ _GD_ParseFieldSpec(D, &p, n_cols, in_cols, E, me, 1, 1, &outstring,
+ tok_pos);
free(outstring);
@@ -749,6 +750,7 @@
const char *tok_pos = NULL;
char *in_cols[MAX_IN_COLS];
int n_cols;
+ struct parser_state p;
dtrace("%p, \"%s\", %i", D, line, fragment_index);
@@ -782,14 +784,23 @@
_GD_ClearError(D);
+ if (~D->flags & GD_HAVE_VERSION)
+ _GD_FindVersion(D);
+
+ if (D->av) {
+ p.standards = D->standards;
+ p.pedantic = 1;
+ }
+
/* start parsing */
- n_cols = _GD_Tokenise(D, line, &outstring, &tok_pos, MAX_IN_COLS, in_cols,
- "dirfile_add_spec()", 0, D->standards, D->flags & GD_NOSTANDARD);
+ _GD_SimpleParserInit(D, "gd_add_spec()", &p);
+ n_cols = _GD_Tokenise(D, &p, line, &outstring, &tok_pos, MAX_IN_COLS,
+ in_cols);
/* Directive parsing is skipped -- The Field Spec parser will add the field */
if (!D->error)
- _GD_ParseFieldSpec(D, n_cols, in_cols, NULL, "dirfile_add_spec()", 0,
- fragment_index, D->standards, 1, GD_PEDANTIC, 1, &outstring, tok_pos);
+ _GD_ParseFieldSpec(D, &p, n_cols, in_cols, NULL, fragment_index, 1, 1,
+ &outstring, tok_pos);
free(outstring);
@@ -1425,7 +1436,7 @@
/* Actually store the constant, now */
if (entry)
- _GD_DoFieldOut(D, entry, 0, 0, 1, data_type, value);
+ _GD_DoFieldOut(D, entry, 0, 1, data_type, value);
dreturn("%i", D->error ? -1 : 0);
return D->error ? -1 : 0;
@@ -1458,7 +1469,7 @@
/* Actually store the carray, now */
if (entry)
- _GD_DoFieldOut(D, entry, 0, 0, array_len, data_type, values);
+ _GD_DoFieldOut(D, entry, 0, array_len, data_type, values);
dreturn("%i", D->error ? -1 : 0);
return D->error ? -1 : 0;
@@ -2120,7 +2131,7 @@
/* Actually store the constant, now */
if (entry)
- _GD_DoFieldOut(D, entry, 0, 0, 1, data_type, value);
+ _GD_DoFieldOut(D, entry, 0, 1, data_type, value);
dreturn("%i", D->error ? -1 : 0);
return D->error ? -1 : 0;
@@ -2153,7 +2164,7 @@
/* Actually store the carray, now */
if (entry)
- _GD_DoFieldOut(D, entry, 0, 0, array_len, data_type, values);
+ _GD_DoFieldOut(D, entry, 0, array_len, data_type, values);
dreturn("%i", D->error ? -1 : 0);
return D->error ? -1 : 0;
@@ -2282,12 +2293,14 @@
}
/* check alias name */
- if (_GD_ValidateField(munged_code + offset, D->standards, 1, 0, NULL))
+ if (_GD_ValidateField(munged_code + offset, D->standards, 1, GD_VF_CODE,
+ NULL))
+ {
_GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_INVALID, NULL, 0, field_code);
- else if (_GD_FindField(D, munged_code, D->entry, D->n_entries, 1, &u))
+ } else if (_GD_FindField(D, munged_code, D->entry, D->n_entries, 1, &u))
_GD_SetError(D, GD_E_DUPLICATE, 0, NULL, 0, munged_code);
else
- _GD_CheckCodeAffixes(D, NULL, target, fragment_index, 1); /* check target */
+ _GD_CheckCodeAffixes(D, target, fragment_index, 1); /* check target */
if (D->error)
goto add_alias_error;
Modified: trunk/getdata/src/common.c
===================================================================
--- trunk/getdata/src/common.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/common.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -218,7 +218,7 @@
dtrace("%p, %p, %p", D, E, e);
e->u.linterp.table_dirfd = _GD_GrabDir(D,
- D->fragment[E->fragment_index].dirfd, E->EN(linterp,table));
+ D->fragment[E->fragment_index].dirfd, E->EN(linterp,table), 0);
temp_buffer = _GD_Strdup(D, E->EN(linterp,table));
if (temp_buffer == NULL) {
@@ -840,8 +840,8 @@
break;
default:
if (err)
- _GD_SetError(D, GD_E_BAD_REPR, GD_E_REPR_UNKNOWN, NULL, 0,
- field_code_in + field_code_len - 1);
+ _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_REPR, NULL, 0,
+ field_code_in);
dreturn("%i", 0);
return 0;
}
@@ -896,6 +896,28 @@
return 0;
}
+/* Find an entry without a representation */
+gd_entry_t *_GD_FindEntry(DIRFILE *restrict D, const char *restrict field_code,
+ unsigned int *restrict index, int set, int err)
+{
+ gd_entry_t *E = NULL;
+
+ dtrace("%p, \"%s\", %p, %i, %i", D, field_code, index, set, err);
+
+ if (D->n_dot > 0)
+ E = _GD_FindField(D, field_code, D->dot_list, D->n_dot, 1, NULL);
+
+ if (E == NULL || index != NULL)
+ E = _GD_FindField(D, field_code, D->entry, D->n_entries, 1, index);
+
+ if (E == NULL && set)
+ if (err)
+ _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code);
+
+ dreturn("%p", E);
+ return E;
+}
+
/* Find the entry and the representation */
gd_entry_t *_GD_FindFieldAndRepr(DIRFILE *restrict D,
const char *restrict field_code_in, char **restrict field_code,
@@ -1306,15 +1328,18 @@
return filepath;
}
-int _GD_GrabDir(DIRFILE *D, int dirfd, const char *name)
+int _GD_GrabDir(DIRFILE *D, int dirfd, const char *name, int canonical)
{
unsigned int i;
char *path, *dir = NULL;
void *ptr;
- dtrace("%p, %i, \"%s\"", D, dirfd, name);
+ dtrace("%p, %i, \"%s\", %i", D, dirfd, name, canonical);
- path = _GD_MakeFullPath(D, dirfd, name, 1);
+ if (canonical)
+ path = _GD_Strdup(D, name);
+ else
+ path = _GD_MakeFullPath(D, dirfd, name, 1);
if (path == NULL) {
dreturn("%i", -1);
Modified: trunk/getdata/src/constant.c
===================================================================
--- trunk/getdata/src/constant.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/constant.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -170,14 +170,13 @@
return gd_array_len(D, field_code);
}
-static int _GD_PutCarraySlice(DIRFILE* D, gd_entry_t *E, int repr,
- unsigned long first, size_t n, gd_type_t data_type, const void *data_in)
- gd_nothrow
+static int _GD_PutCarraySlice(DIRFILE* D, gd_entry_t *E, unsigned long first,
+ size_t n, gd_type_t data_type, const void *data_in) gd_nothrow
{
int i;
- dtrace("%p, %p, %i, %lu, %" PRNsize_t ", 0x%X, %p", D, E, repr, first, n,
- data_type, data_in);
+ dtrace("%p, %p, %lu, %" PRNsize_t ", 0x%X, %p", D, E, first, n, data_type,
+ data_in);
if ((D->flags & GD_ACCMODE) != GD_RDWR) {
_GD_SetError(D, GD_E_ACCMODE, 0, NULL, 0, NULL);
@@ -190,7 +189,7 @@
{
_GD_SetError(D, GD_E_BOUNDS, 0, NULL, 0, NULL);
} else
- _GD_DoFieldOut(D, E, repr, first, n, data_type, data_in);
+ _GD_DoFieldOut(D, E, first, n, data_type, data_in);
if (D->error) {
dreturn("%i", -1);
@@ -210,15 +209,13 @@
return 0;
}
-int gd_put_carray_slice(DIRFILE* D, const char *field_code_in,
- unsigned long first, size_t n, gd_type_t data_type, const void *data_in)
-gd_nothrow
+int gd_put_carray_slice(DIRFILE* D, const char *field_code, unsigned long first,
+ size_t n, gd_type_t data_type, const void *data_in) gd_nothrow
{
gd_entry_t *entry;
- int repr, r = -1;
- char* field_code;
+ int r = -1;
- dtrace("%p, \"%s\", %lu, %" PRNsize_t ", 0x%X, %p", D, field_code_in, first,
+ dtrace("%p, \"%s\", %lu, %" PRNsize_t ", 0x%X, %p", D, field_code, first,
n, data_type, data_in);
if (D->flags & GD_INVALID) {
@@ -229,10 +226,10 @@
_GD_ClearError(D);
- entry = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1,
- 1);
+ entry = _GD_FindField(D, field_code, D->entry, D->n_entries, 1, NULL);
- if (D->error) {
+ if (entry == NULL) {
+ _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code);
dreturn("%i", -1);
return -1;
}
@@ -242,23 +239,19 @@
{
_GD_SetError(D, GD_E_BAD_FIELD_TYPE, GD_E_FIELD_BAD, NULL, 0, field_code);
} else
- r = _GD_PutCarraySlice(D, entry, repr, first, n, data_type, data_in);
+ r = _GD_PutCarraySlice(D, entry, first, n, data_type, data_in);
- if (field_code != field_code_in)
- free(field_code);
-
dreturn("%i", r);
return r;
}
-int gd_put_carray(DIRFILE* D, const char *field_code_in, gd_type_t data_type,
+int gd_put_carray(DIRFILE* D, const char *field_code, gd_type_t data_type,
const void *data_in) gd_nothrow
{
gd_entry_t *entry;
- int repr, r = -1;
- char* field_code;
+ int r = -1;
- dtrace("%p, \"%s\", 0x%x, %p", D, field_code_in, data_type, data_in);
+ dtrace("%p, \"%s\", 0x%x, %p", D, field_code, data_type, data_in);
if (D->flags & GD_INVALID) {
_GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL);
@@ -268,10 +261,10 @@
_GD_ClearError(D);
- entry = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1,
- 1);
+ entry = _GD_FindField(D, field_code, D->entry, D->n_entries, 1, NULL);
- if (D->error) {
+ if (entry == NULL) {
+ _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code);
dreturn("%i", -1);
return -1;
}
@@ -281,21 +274,18 @@
{
_GD_SetError(D, GD_E_BAD_FIELD_TYPE, GD_E_FIELD_BAD, NULL, 0, field_code);
} else
- r = _GD_PutCarraySlice(D, entry, repr, 0,
+ r = _GD_PutCarraySlice(D, entry, 0,
(entry->field_type == GD_CONST_ENTRY) ? 1 : entry->EN(scalar,array_len),
data_type, data_in);
- if (field_code != field_code_in)
- free(field_code);
-
dreturn("%i", r);
return r;
}
-int gd_put_constant(DIRFILE* D, const char *field_code_in, gd_type_t data_type,
+int gd_put_constant(DIRFILE* D, const char *field_code, gd_type_t data_type,
const void *data_in) gd_nothrow
{
- return gd_put_carray_slice(D, field_code_in, 0, 1, data_type, data_in);
+ return gd_put_carray_slice(D, field_code, 0, 1, data_type, data_in);
}
/* vim: ts=2 sw=2 et tw=80
Modified: trunk/getdata/src/entry.c
===================================================================
--- trunk/getdata/src/entry.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/entry.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -342,13 +342,12 @@
return !e;
}
-char* gd_raw_filename(DIRFILE* D, const char* field_code_in) gd_nothrow
+char* gd_raw_filename(DIRFILE* D, const char* field_code) gd_nothrow
{
- int repr;
- char *field_code, *filename;
+ char *filename;
gd_entry_t *E;
- dtrace("%p, \"%s\"", D, field_code_in);
+ dtrace("%p, \"%s\"", D, field_code);
_GD_ClearError(D);
@@ -359,7 +358,7 @@
}
/* Check field */
- E = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1, 1);
+ E = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (D->error) {
dreturn("%p", NULL);
@@ -372,9 +371,6 @@
return NULL;
}
- if (field_code != field_code_in)
- free(field_code);
-
if (E->e->u.raw.file[0].name == NULL) {
/* ensure encoding sybtype is known */
if (!_GD_Supports(D, E, GD_EF_NAME)) {
@@ -402,14 +398,12 @@
return filename;
}
-int gd_entry(DIRFILE* D, const char* field_code_in, gd_entry_t* entry)
- gd_nothrow
+int gd_entry(DIRFILE* D, const char* field_code, gd_entry_t* entry) gd_nothrow
{
- int i, repr;
+ int i;
gd_entry_t *E;
- char* field_code;
- dtrace("%p, \"%s\", %p", D, field_code_in, entry);
+ dtrace("%p, \"%s\", %p", D, field_code, entry);
if (D->flags & GD_INVALID) {
_GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL);
@@ -419,17 +413,14 @@
_GD_ClearError(D);
- /* get rid of the represenation, if any */
- E = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1, 1);
+ E = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (D->error) {
+ _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code);
dreturn("%i", -1);
return -1;
}
- if (field_code != field_code_in)
- free(field_code);
-
/* Calculate the entry, if necessary */
if (!(E->flags & GD_EN_CALC))
_GD_CalculateEntry(D, E, 0);
@@ -630,13 +621,11 @@
return n;
}
-gd_entype_t gd_entry_type(DIRFILE* D, const char* field_code_in) gd_nothrow
+gd_entype_t gd_entry_type(DIRFILE* D, const char* field_code) gd_nothrow
{
gd_entry_t* E;
- char* field_code;
- int repr;
- dtrace("%p, \"%s\"", D, field_code_in);
+ dtrace("%p, \"%s\"", D, field_code);
if (D->flags & GD_INVALID) {
_GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL);
@@ -646,17 +635,13 @@
_GD_ClearError(D);
- /* get rid of the represenation, if any */
- E = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1, 1);
+ E = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (D->error) {
dreturn("%i", GD_NO_ENTRY);
return GD_NO_ENTRY;
}
- if (field_code != field_code_in)
- free(field_code);
-
dreturn("%i", E->field_type);
return E->field_type;
}
@@ -813,7 +798,6 @@
_GD_ClearError(D);
- /* get rid of the representation, if any */
E = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1, 1);
if (D->error) {
@@ -876,13 +860,12 @@
return 0;
}
-char *gd_linterp_tablename(DIRFILE *D, const char *field_code_in) gd_nothrow
+char *gd_linterp_tablename(DIRFILE *D, const char *field_code) gd_nothrow
{
- int repr;
gd_entry_t *E;
- char *field_code, *table;
+ char *table;
- dtrace("%p, \"%s\"", D, field_code_in);
+ dtrace("%p, \"%s\"", D, field_code);
if (D->flags & GD_INVALID) {
_GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL);
@@ -892,19 +875,15 @@
_GD_ClearError(D);
- E = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1, 1);
+ E = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (D->error) {
dreturn("%p", NULL);
return NULL;
}
- if (field_code != field_code_in)
- free(field_code);
-
if (E->field_type != GD_LINTERP_ENTRY) {
- _GD_SetError(D, GD_E_BAD_FIELD_TYPE, GD_E_FIELD_BAD, NULL, 0,
- field_code_in);
+ _GD_SetError(D, GD_E_BAD_FIELD_TYPE, GD_E_FIELD_BAD, NULL, 0, field_code);
dreturn("%p", NULL);
return NULL;
}
Modified: trunk/getdata/src/errors.c
===================================================================
--- trunk/getdata/src/errors.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/errors.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -49,8 +49,7 @@
"Field name is reserved on line {3} of {2}", 0 },
{ GD_E_FORMAT, GD_E_FORMAT_ENDIAN,
"Unrecognised endianness on line {3} of {2}", 0 },
- { GD_E_FORMAT, GD_E_FORMAT_BAD_NAME,
- "Bad field name on line {3} of {2}: {4}", 0 },
+ { GD_E_FORMAT, GD_E_FORMAT_BAD_NAME, "Bad name on line {3} of {2}: {4}", 0 },
{ GD_E_FORMAT, GD_E_FORMAT_UNTERM,
"Unterminated token on line {3} of {2}", 0 },
{ GD_E_FORMAT, GD_E_FORMAT_METARAW,
@@ -79,8 +78,10 @@
{ GD_E_CREAT, GD_E_CREAT_FORMAT, "Unable to create format file {2}: ", 1 },
/* GD_E_BAD_CODE: 4 = field code */
{ GD_E_BAD_CODE, GD_E_CODE_MISSING, "Field not found: {4}", 0 },
- { GD_E_BAD_CODE, GD_E_CODE_INVALID, "Bad field name: {4}", 0 },
+ { GD_E_BAD_CODE, GD_E_CODE_INVALID, "Bad field code: {4}", 0 },
{ GD_E_BAD_CODE, GD_E_CODE_AMBIGUOUS, "Ambiguous field code: {4}", 0 },
+ { GD_E_BAD_CODE, GD_E_CODE_INVALID_NS, "Bad namespace: {4}", 0 },
+ { GD_E_BAD_CODE, GD_E_CODE_REPR, "Invalid representation suffix in: {4}", 0 },
/* GD_E_BAD_TYPE: 1 = data type */
{ GD_E_BAD_TYPE, 0, "Bad data type: {1}", 0 },
/* GD_E_IO: 2 = filename; 3 = line; 4 = included file */
@@ -196,10 +197,6 @@
{ GD_E_DOMAIN, GD_E_DOMAIN_EMPTY, "Improper domain: empty set", 0 },
{ GD_E_DOMAIN, GD_E_DOMAIN_ANTITONIC, "Improper domain: not monotonic", 0 },
{ GD_E_DOMAIN, GD_E_DOMAIN_MULTIPOS, "I/O position mismatch in inputs", 0 },
- /* GD_E_UNCLEAN_DB: 4 = repr */
- { GD_E_BAD_REPR, GD_E_REPR_UNKNOWN, "Unknown field representation: .{4}", 0 },
- { GD_E_BAD_REPR, GD_E_REPR_PUT, "Unable to write to field reprentation: .{4}",
- 0 },
/* GD_E_BOUNDS: (nothing) */
{ GD_E_BOUNDS, 0, "Array length out of bounds", 0 },
/* GD_E_LINE_TOO_LONG */
Modified: trunk/getdata/src/flimits.c
===================================================================
--- trunk/getdata/src/flimits.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/flimits.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -355,14 +355,13 @@
return ns;
}
-off64_t gd_eof64(DIRFILE* D, const char *field_code_in)
+off64_t gd_eof64(DIRFILE* D, const char *field_code)
{
off64_t ns;
gd_entry_t *entry;
- int repr, is_index;
- char* field_code;
+ int is_index;
- dtrace("%p, \"%s\"", D, field_code_in);
+ dtrace("%p, \"%s\"", D, field_code);
_GD_ClearError(D);
@@ -372,8 +371,7 @@
return -1;
}
- entry = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1,
- 1);
+ entry = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (D->error) {
dreturn("%i", -1);
@@ -385,9 +383,6 @@
if (is_index)
_GD_SetError(D, GD_E_BAD_FIELD_TYPE, GD_E_FIELD_BAD, NULL, 0, field_code);
- if (field_code != field_code_in)
- free(field_code);
-
dreturn("%lli", (unsigned long long)ns);
return ns;
}
@@ -549,16 +544,14 @@
return bof;
}
-off64_t gd_bof64(DIRFILE* D, const char *field_code_in) gd_nothrow
+off64_t gd_bof64(DIRFILE* D, const char *field_code) gd_nothrow
{
off64_t bof;
gd_entry_t *entry;
- int repr;
- char *field_code;
unsigned int spf;
long long ds;
- dtrace("%p, \"%s\"", D, field_code_in);
+ dtrace("%p, \"%s\"", D, field_code);
_GD_ClearError(D);
@@ -568,8 +561,7 @@
return -1;
}
- entry = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1,
- 1);
+ entry = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (D->error) {
dreturn("%i", -1);
@@ -581,9 +573,6 @@
if (bof != -1)
bof = bof * spf + ds;
- if (field_code != field_code_in)
- free(field_code);
-
dreturn("%lli", (unsigned long long)bof);
return bof;
}
Modified: trunk/getdata/src/flush.c
===================================================================
--- trunk/getdata/src/flush.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/flush.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -295,7 +295,6 @@
static ssize_t _GD_WriteFieldCode(DIRFILE *D, FILE *stream, int me,
const char *code, int index, int permissive, int standards, unsigned flags)
{
- int dummy;
ssize_t len;
char *ptr;
@@ -305,8 +304,8 @@
dtrace("%p, %p, %i, \"%s\", %i, %i, %i, 0x%X", D, stream, me, code, index,
permissive, standards, flags);
- ptr = _GD_MungeCode(D, NULL, D->fragment[me].prefix, D->fragment[me].suffix,
- NULL, NULL, code, &dummy, 0);
+ ptr = _GD_MungeCode(D, NULL, 0, D->fragment[me].prefix,
+ D->fragment[me].suffix, NULL, NULL, code, NULL, NULL, GD_MC_RQ_PARTS);
len = _GD_StringEscapeise(stream, ptr, 0, permissive, standards);
@@ -817,7 +816,7 @@
char temp_file[] = "format_XXXXXX";
char* ptr;
struct tm now;
- int fd, dummy;
+ int fd;
int pretty = 0;
ssize_t max_len = 0;
unsigned int u;
@@ -1017,10 +1016,10 @@
if (permissive || D->standards >= 3)
for (j = 0; j < D->n_fragment; ++j)
if (D->fragment[j].parent == i) {
- char *prefix = _GD_MungeCode(D, NULL, D->fragment[i].prefix, NULL, NULL,
- NULL, D->fragment[j].prefix, &dummy, 0);
- char *suffix = _GD_MungeCode(D, NULL, NULL, D->fragment[i].suffix, NULL,
- NULL, D->fragment[j].suffix, &dummy, 0);
+ char *prefix = _GD_MungeCode(D, NULL, 0, D->fragment[i].prefix, NULL,
+ NULL, NULL, D->fragment[j].prefix, NULL, NULL, GD_MC_RQ_PARTS);
+ char *suffix = _GD_MungeCode(D, NULL, 0, NULL, D->fragment[i].suffix,
+ NULL, NULL, D->fragment[j].suffix, NULL, NULL, GD_MC_RQ_PARTS);
if (fprintf(stream, "%sINCLUDE ", (D->standards >= 5) ? "/" : "") < 0 ||
_GD_StringEscapeise(stream, D->fragment[j].ename, 0, permissive,
@@ -1185,8 +1184,6 @@
static int _GD_SyncOrClose(DIRFILE* D, const char* field_code, int syn, int clo)
{
unsigned int i;
- int repr;
- char *simple_field_code;
gd_entry_t *E;
dtrace("%p, \"%s\", %i, %i", D, field_code, syn, clo);
@@ -1202,15 +1199,10 @@
if (D->entry[i]->field_type == GD_RAW_ENTRY)
_GD_Flush(D, D->entry[i], syn, clo);
} else {
- /* discard representation */
- E = _GD_FindFieldAndRepr(D, field_code, &simple_field_code, &repr, NULL, 1,
- 1);
+ E = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (!D->error)
_GD_Flush(D, E, syn, clo);
-
- if (field_code != simple_field_code)
- free(simple_field_code);
}
dreturn("%i", (D->error == GD_E_OK) ? 0 : -1);
@@ -1411,7 +1403,10 @@
D->av &= GD_VERS_GE_6;
break;
case '.':
- D->av &= GD_VERS_LE_5;
+ if (D->entry[i]->flags & GD_EN_DOTTED)
+ D->av &= GD_VERS_LE_5;
+ else
+ D->av &= GD_VERS_GE_10;
break;
case '&':
case ';':
Modified: trunk/getdata/src/fpos.c
===================================================================
--- trunk/getdata/src/fpos.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/fpos.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -123,14 +123,12 @@
/* Get the current I/O position of the given field
*/
-off64_t gd_tell64(DIRFILE *D, const char *field_code_in) gd_nothrow
+off64_t gd_tell64(DIRFILE *D, const char *field_code) gd_nothrow
{
off64_t pos = -1;
gd_entry_t* entry;
- char* field_code;
- int repr;
- dtrace("%p, \"%s\"", D, field_code_in);
+ dtrace("%p, \"%s\"", D, field_code);
if (D->flags & GD_INVALID) {/* don't crash */
_GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL);
@@ -140,8 +138,7 @@
_GD_ClearError(D);
- entry = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1,
- 1);
+ entry = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (D->error) {
dreturn("%u", 0);
@@ -153,9 +150,6 @@
else
pos = _GD_GetFilePos(D, entry, -1);
- if (field_code != field_code_in)
- free(field_code);
-
dreturn("%lli", (long long)pos);
return pos;
}
@@ -335,17 +329,16 @@
/* Set the I/O position of the given field
*/
-off64_t gd_seek64(DIRFILE *D, const char *field_code_in, off64_t frame_num,
+off64_t gd_seek64(DIRFILE *D, const char *field_code, off64_t frame_num,
off64_t sample_num, int whence)
{
unsigned int spf = 0;
off64_t pos = 0;
gd_entry_t* entry;
- char* field_code;
- int repr, is_index = 0;
+ int is_index = 0;
unsigned int mode = (whence & GD_SEEK_WRITE) ? GD_FILE_WRITE : GD_FILE_READ;
- dtrace("%p, \"%s\", %lli, %lli, 0x%X", D, field_code_in, (long long)frame_num,
+ dtrace("%p, \"%s\", %lli, %lli, 0x%X", D, field_code, (long long)frame_num,
(long long)sample_num, whence);
if (D->flags & GD_INVALID) {/* don't crash */
@@ -356,8 +349,7 @@
_GD_ClearError(D);
- entry = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1,
- 1);
+ entry = _GD_FindEntry(D, field_code, NULL, 1, 1);
if (D->error) {
dreturn("%i", -1);
@@ -366,8 +358,6 @@
if (entry->field_type & GD_SCALAR_ENTRY_BIT) {
_GD_SetError(D, GD_E_DIMENSION, GD_E_DIM_CALLER, NULL, 0, field_code);
- if (field_code != field_code_in)
- free(field_code);
dreturn("%i", -1);
return -1;
}
@@ -376,8 +366,6 @@
spf = _GD_GetSPF(D, entry);
if (D->error) {
- if (field_code != field_code_in)
- free(field_code);
dreturn("%i", -1);
return -1;
}
@@ -400,9 +388,6 @@
if (!D->error)
_GD_Seek(D, entry, sample_num + pos, mode);
- if (field_code != field_code_in)
- free(field_code);
-
if (D->error)
pos = -1;
else
Modified: trunk/getdata/src/fragment.c
===================================================================
--- trunk/getdata/src/fragment.c 2015-01-12 07:35:20 UTC (rev 939)
+++ trunk/getdata/src/fragment.c 2015-01-12 10:09:51 UTC (rev 940)
@@ -83,7 +83,7 @@
static char **_GD_CheckAffixes(DIRFILE *D, int i, const char *prefix,
const char *suffix, char **codes, unsigned *n)
{
- int j, dummy;
+ int j;
unsigned u, nn = *n;
char **new_codes = codes, **ptr;
@@ -109,10 +109,12 @@
/* Propagate changes downward */
for (j = 0; j < D->n_fragment; ++j)
if (D->fragment[j].parent == i) {
- char *subprefix = _GD_MungeCode(D, NULL, D->fragment[i].prefix, NULL,
- prefix, NULL, D->fragment[j].prefix, &dummy, 1);
- char *subsuffix = _GD_MungeCode(D, NULL, NULL, D->fragment[i].suffix,
- NULL, suffix, D->fragment[j].suffix, &dummy, 1);
+ char *subprefix = _GD_MungeCode(D, NULL, 0, D->fragment[i].prefix,
+ NULL, prefix, NULL, D->fragment[j].prefix, NULL, NULL,
+ GD_MC_RQ_PARTS | GD_MC_ERROR_OK);
+ char *subsuffix = _GD_MungeCode(D, NULL, 0, NULL,
+ D->fragment[i].suffix, NULL, suffix, D->fragment[j].suffix, NULL,
+ NULL, GD_MC_RQ_PARTS | GD_MC_ERROR_OK);
if (D->error) {
free(subprefix);
dreturn("%p (%i)", new_codes, *n);
@@ -135,20 +137,19 @@
if (D->entry[u]->fragment_index == i && D->entry[u]->e->n_meta != -1) {
ptr = _GD_Realloc(D, new_codes, sizeof(*ptr) * ++nn);
if (ptr) {
+ char *nso;
new_codes = ptr;
/* remunge the code */
- new_codes[nn - 1] = _GD_MungeCode(D, NULL, D->fragment[i].prefix,
- D->fragment[i].suffix, prefix, suffix, D->entry[u]->field, &dummy,
- 0);
+ new_codes[nn - 1] = _GD_MungeCode(D, NULL, 0, D->fragment[i].prefix,
+ D->fragment[i].suffix, prefix, suffix, D->entry[u]->field, &nso,
+ NULL, GD_MC_RQ_PARTS);
/* look for a duplicate and validate */
if (new_codes[nn - 1] && _GD_FindField(D, new_codes[nn - 1], D->entry,
D->n_entries, 1, NULL))
{
_GD_SetError(D, GD_E_DUPLICATE, 0, NULL, 0, new_codes[nn - 1]);
- } else if (_GD_ValidateField(new_codes[nn - 1], D->standards, 1, 0,
- NULL))
- {
+ } else if (_GD_ValidateField(nso, D->standards, 1, GD_VF_NAME, NULL)) {
_GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_INVALID, NULL, 0,
new_codes[nn - 1]);
}
@@ -409,3 +410,266 @@
dreturn("%i", changed);
return changed;
}
+
+/* create a list of indices to subfragments, including this one */
+static int _GD_SubFragmentList(DIRFILE *restrict D, int i, int **restrict ilist)
+{
+ int *list;
+ int j, n = 1;
+
+ dtrace("%p, %i, %p", D, i, ilist);
+
+ /* i is always in the list */
+ list = _GD_Malloc(D, sizeof(*list));
+ if (list == NULL) {
+ dreturn("%i", 0);
+ return 0;
+ }
+ list[0] = i;
+
+ /* search for children */
+ for (j = 0; j < D->n_fragment; ++j)
+ if (D->fragment[j].parent == i) {
+ int nsub, *sublist, *ptr;
+
+ nsub = _GD_SubFragmentList(D, j, &sublist);
+ if (nsub == 0) {
+ free(list);
+ dreturn("%i", 0);
+ return 0;
+ }
+
+ /* append to current list */
+ ptr = _GD_Realloc(D, list, (nsub + n) * sizeof(*list));
+ if (ptr == NULL) {
+ free(list);
+ dreturn("%i", 0);
+ return 0;
+ }
+ list = ptr;
+ memcpy(list + n, sublist, nsub * sizeof(*list));
+ free(sublist);
+
+ n += nsub;
+ }
+
+ /* done */
+ *ilist = list;
+ dreturn("%i", n);
+ return n;
+}
+
+/* Check a fragment namespace change. Returns non-zero if the checks fail. */
+static int _GD_CheckChangeNamespace(DIRFILE *D, const char *newns,
+ size_t newnsl, size_t oldnsl, int i, char ***codes)
+{
+ int j, ni;
+ unsigned u;
+ int *ilist;
+ char **c = *codes;
+ const ssize_t dnsl = newnsl - oldnsl;
+
+ dtrace("%p, \"%s\", %" PRNsize_t ", %" PRNsize_t ", %i, %p", D, newns, newnsl,
+ oldnsl, i, codes);
+
+ if (newns == NULL)
+ newns = "";
+
+ /* find all affected fragments */
+ ni = _GD_SubFragmentList(D, i, &ilist);
+ if (ni == 0) { /* malloc error */
+ free(*codes);
+ dreturn("%i", 1);
+ return 1;
+ }
+
+ /* find all affected entries and generate new field codes */
+ for (u = 0; u < D->n_entries; ++u) {
+ /* check fragment list */
+ int found = 0;
+ size_t l;
+
+ for (j = 0; j < ni; ++j)
+ if (D->entry[u]->fragment_index == ilist[j]) {
+ found = 1;
+ break;
+ }
+
+ if (!found) {
+ c[u] = NULL;
+ continue;
+ }
+
+ /* compose the new name */
+ l = strlen(D->entry[u]->field);
+ c[u] = _GD_Malloc(D, l + dnsl + 1);
+ if (c[u] == NULL)
+ goto CHECKS_FAILED;
+
+ /* so much easier than dealing with affixes... */
+ strncpy(c[u], newns, newnsl);
+ strcpy(c[u] + newnsl, D->entry[i]->field + oldnsl);
+
+ /* Check whether it already exists */
+ if (_GD_FindField(D, c[u], D->entry, D->n_entries, 1, NULL)) {
+ _GD_SetError(D, GD_E_DUPLICATE, 0, NULL, 0, c[u]);
+ goto CHECKS_FAILED;
+ }
+ }
+
+ free(ilist);
+ dreturn("%i", 0);
+ return 0;
+
+CHECKS_FAILED:
+ do {
+ free(c[u]);
+ } while (u--);
+ free(c);
+ free(ilist);
+ dreturn("%i", 1);
+ return 1;
+}
+
+const char *gd_fragment_namespace(DIRFILE *D, int index, const char *ns)
+{
+ dtrace("%p, %i, \"%s\"", D, index, ns);
+
+ _GD_ClearError(D);
+
+ if (D->flags & GD_INVALID) {
+ _GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL);
+ dreturn("%i", 0);
+ return 0;
+ }
+
+ if (index < 0 || index >= D->n_fragment) {
+ _GD_SetError(D, GD_E_BAD_INDEX, 0, NULL, 0, NULL);
+ dreturn("%p", NULL);
+ return NULL;
+ }
+
+ if (ns) {
+ unsigned u;
+ char **codes, *newns;
+ size_t newnsl;
+
+ const char *oldns = D->fragment[index].ns;
+ size_t oldnsl = D->fragment[index].nsl;
+
+ const char *pns = index > 0 ? D->fragment[D->fragment[index].parent].ns
+ : NULL;
+ size_t pnsl = index > 0 ? D->fragment[D->fragment[index].parent].nsl : 0;
+
+ if (index == 0) {
+ _GD_SetError(D, GD_E_BAD_INDEX, 0, NULL, 0, NULL);
+ dreturn("%p", NULL);
+ return NULL;
+ }
+
+ if ((D->flags & GD_ACCMODE) == GD_RDONLY) {
+ _GD_SetError(D, GD_E_ACCMODE, 0, NULL, 0, NULL);
+ dreturn("%p", NULL);
+ return NULL;
+ }
+
+ if (D->fragment[D->fragment[index].parent].protection & GD_PROTECT_FORMAT) {
+ _GD_SetError(D, GD_E_PROTECTED, GD_E_PROTECTED_FORMAT, NULL, 0,
+ D->fragment[D->fragment[index].parent].cname);
+ dreturn("%p", NULL);
+ return NULL;
+ }
+
+ if (_GD_ValidateField(ns, D->standards, 1, GD_VF_NS, NULL)) {
+ /* invalid namespace */
+ _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_INVALID, NULL, 0, ns);
+ dreturn("%p", NULL);
+ return NULL;
+ }
+
+ /* remove spurious leading dot */
+ if (ns[0] == '.')
+ ns++;
+
+ newnsl = strlen(ns);
+
+ if (ns[0] == '\0') {
+ /* Duplicate parent space */
+ newnsl = pnsl;
+ if (pns == NULL) {
+ newns = NULL;
+ newnsl = 0;
+ } else {
+ newns = _GD_Strdup(D, pns);
+ if (newns == NULL) {
+ dreturn("%p", NULL);
+ return NULL;
+ }
+ }
+ } else if (pns) {
+ /* append */
+ newnsl += pnsl + 1;
+ newns = _GD_Malloc(D, newnsl + 1);
+
+ if (newns == NULL) {
+ dreturn("%p", NULL);
+ return NULL;
+ }
+ strcpy(new...
[truncated message content] |