getdata-commits Mailing List for GetData (Page 13)
Scientific Database Format
Brought to you by:
ketiltrout
This list is closed, nobody may subscribe to it.
2010 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(5) |
Oct
(20) |
Nov
(21) |
Dec
(16) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011 |
Jan
(1) |
Feb
(1) |
Mar
(56) |
Apr
(20) |
May
(4) |
Jun
(2) |
Jul
(3) |
Aug
(11) |
Sep
(2) |
Oct
(4) |
Nov
(18) |
Dec
(16) |
2012 |
Jan
(8) |
Feb
(12) |
Mar
(30) |
Apr
(13) |
May
(10) |
Jun
(17) |
Jul
(18) |
Aug
(19) |
Sep
|
Oct
(1) |
Nov
(1) |
Dec
(9) |
2013 |
Jan
(1) |
Feb
(4) |
Mar
(27) |
Apr
(6) |
May
(3) |
Jun
(1) |
Jul
(10) |
Aug
|
Sep
(3) |
Oct
(15) |
Nov
(4) |
Dec
(9) |
2014 |
Jan
|
Feb
(3) |
Mar
(4) |
Apr
(10) |
May
(15) |
Jun
|
Jul
(14) |
Aug
|
Sep
(2) |
Oct
(6) |
Nov
|
Dec
(9) |
2015 |
Jan
(2) |
Feb
(3) |
Mar
(1) |
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <ket...@us...> - 2011-12-11 23:35:16
|
Revision: 635 http://getdata.svn.sourceforge.net/getdata/?rev=635&view=rev Author: ketiltrout Date: 2011-12-11 23:35:07 +0000 (Sun, 11 Dec 2011) Log Message: ----------- * Fix gd_move(), gd_rename() gd_alter_[m]spec() gd_add_*() for affixes. * [bug]: Flag fragment as modified after gd_rename(). Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/src/add.c trunk/getdata/src/common.c trunk/getdata/src/compat.c trunk/getdata/src/del.c trunk/getdata/src/encoding.c trunk/getdata/src/endian.c trunk/getdata/src/errors.c trunk/getdata/src/field_list.c trunk/getdata/src/flush.c trunk/getdata/src/globals.c trunk/getdata/src/internal.h trunk/getdata/src/meta_list.c trunk/getdata/src/mod.c trunk/getdata/src/move.c trunk/getdata/src/name.c trunk/getdata/src/native.c trunk/getdata/src/nmeta.c trunk/getdata/src/open.c trunk/getdata/src/parse.c trunk/getdata/src/spf.c trunk/getdata/src/string.c trunk/getdata/test/Makefile.am trunk/getdata/test/add_window_op.c trunk/getdata/test/version_9_strict.c trunk/getdata/test/version_9_write.c Added Paths: ----------- trunk/getdata/test/add_affix.c trunk/getdata/test/add_string_affix.c trunk/getdata/test/alter_entry_affix.c trunk/getdata/test/alter_mspec_affix.c trunk/getdata/test/alter_spec_affix.c trunk/getdata/test/madd_affix.c trunk/getdata/test/madd_index.c trunk/getdata/test/move_affix.c trunk/getdata/test/move_affix_dup.c trunk/getdata/test/name_affix.c trunk/getdata/test/name_affix_bad.c trunk/getdata/test/name_dup.c trunk/getdata/test/parse_meta_affix.c trunk/getdata/test/parse_meta_implicit_affix.c Property Changed: ---------------- trunk/getdata/test/ Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/ChangeLog 2011-12-11 23:35:07 UTC (rev 635) @@ -1,4 +1,41 @@ -2011-12-09 D. V. Wiebe <ge...@ke...> svn:635 +2011-12-11 D. V. Wiebe <ge...@ke...> svn:635 + * test/add_string_affix.c test/name_affix_bad.c test/move_affix.c + test/alter_entry_affix.c test/alter_entry_affix.c test/madd_affix.c + test/parse_meta_affix.c test/madd_index.c test/name_affix.c + test/alter_mspec_affix.c test/name_dup.c test/parse_meta_implicit_affix.c + test/add_affix.c test/alter_spec_affix.c: Added. + + * test/version_9_strict.c test/version_9_write.c: Expanded. + + * src/open.c (gd_cbopen): Set errors for _GD_CanonicalPath. + + * src/errors.c: Distingish missing codes from invalid codes for + GD_E_BAD_CODE. + + * src/name.c (gd_rename): Validate the new name first and then DeMunge it + if it's not a meta field. + + * src/move.c (gd_move): Compose the new field name by remunging it for the + new fragment. Also compose the new names of all its metafield early, if + necessary. + + * src/parse.c (_GD_ParseFieldSpec _GD_ParseDirective): Munge field codes + before lookup. Also munge the reference field. + + * src/mod.c (gd_alter_spec gd_malter_spec): The parser will end up + reapplying affixes to the field name, so undo that. + + * src/add.c (_GD_Add gd_add_string gd_add_const gd_add_const gd_madd_string + gd_madd_const gd_madd_carray): _GD_Add() returns the added entry on success. + This saves a field lookup in the others. + + * src/add.c (_GD_Add): Munge field name earlier. + + * src/name.c (gd_rename): Flag fragment as modified. + + * src/flush.c (_GD_FieldSpec): Properly write /HIDDEN directives. + +2011-12-09 D. V. Wiebe <ge...@ke...> svn:634 * test/parse_include_preprefix.c test/version_9_strict.c test/version_9.c test/parse_include_suffix.c test/parse_include_loop.c test/version_9_write.c test/parse_include_sufsuffix.c test/parse_include_prefix.c Modified: trunk/getdata/src/add.c =================================================================== --- trunk/getdata/src/add.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/add.c 2011-12-11 23:35:07 UTC (rev 635) @@ -20,8 +20,9 @@ */ #include "internal.h" -/* add an entry */ -static int _GD_Add(DIRFILE* D, const gd_entry_t* entry, const char* parent) +/* add an entry - returns the added entry on success. */ +static gd_entry_t *_GD_Add(DIRFILE* D, const gd_entry_t* entry, + const char* parent) { char *temp_buffer; int i, is_dot, offset; @@ -41,53 +42,58 @@ /* check access mode */ if ((D->flags & GD_ACCMODE) == GD_RDONLY) { _GD_SetError(D, GD_E_ACCMODE, 0, NULL, 0, NULL); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } /* check for include index out of range */ - if (P == NULL && (entry->fragment_index < 0 || + if (parent == NULL && (entry->fragment_index < 0 || entry->fragment_index >= D->n_fragment)) { _GD_SetError(D, GD_E_BAD_INDEX, 0, NULL, entry->fragment_index, NULL); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } /* check protection */ if (D->fragment[entry->fragment_index].protection & GD_PROTECT_FORMAT) { _GD_SetError(D, GD_E_PROTECTED, GD_E_PROTECTED_FORMAT, NULL, 0, D->fragment[entry->fragment_index].cname); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } /* check parent */ if (parent != NULL) { /* make sure it's not a meta field already */ if (strchr(parent, '/') != NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); - dreturn("%i", -1); - return -1; + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, parent); + dreturn("%p", NULL); + return NULL; } P = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); if (P == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); - dreturn("%i", -1); - return -1; + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, parent); + dreturn("%p", NULL); + return NULL; } - temp_buffer = (char *)_GD_Malloc(D, strlen(parent) + strlen(entry->field) - + 2); - if (temp_buffer) - strcat(strcat(strcpy(temp_buffer, parent), "/"), entry->field); + offset = strlen(parent) + 1; + temp_buffer = (char *)_GD_Malloc(D, offset + strlen(entry->field) + 1); + if (temp_buffer) { + strcpy(temp_buffer, parent); + temp_buffer[offset - 1] = '/'; + strcpy(temp_buffer + offset, entry->field); + } } else - temp_buffer = _GD_Strdup(D, entry->field); + /* Apply prefix and suffix */ + temp_buffer = _GD_MungeCode(D, NULL, entry->fragment_index, entry->field, + &offset); if (temp_buffer == NULL) { - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } /* check for duplicate field */ @@ -96,10 +102,9 @@ if (E != NULL) { /* matched */ _GD_SetError(D, GD_E_DUPLICATE, 0, NULL, 0, temp_buffer); free(temp_buffer); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } - free(temp_buffer); /* check for bad field type */ if (entry->field_type != GD_RAW_ENTRY && @@ -119,15 +124,15 @@ { _GD_SetError(D, GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_TYPE, NULL, entry->field_type, NULL); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } /* New entry */ E = (gd_entry_t *)_GD_Malloc(D, sizeof(gd_entry_t)); if (E == NULL) { - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } memset(E, 0, sizeof(gd_entry_t)); if (P) @@ -139,27 +144,21 @@ sizeof(struct _gd_private_entry)); if (E->e == NULL) { free(E); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } memset(E->e, 0, sizeof(struct _gd_private_entry)); E->e->calculated = 0; E->field_type = entry->field_type; - /* Apply prefix and suffix */ - E->field = _GD_MungeCode(D, P, entry->fragment_index, entry->field, &offset); - if (E->field == NULL) { - _GD_FreeE(D, E, 1); - dreturn("%i", -1); - return -1; - } + E->field = temp_buffer; /* Check */ if (_GD_ValidateField(E->field + offset, D->standards, 1, 0, &is_dot)) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, entry->field); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_INVALID, NULL, 0, entry->field); _GD_FreeE(D, E, 1); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } /* Set meta indices */ @@ -185,8 +184,7 @@ if (D->fragment[entry->fragment_index].protection & GD_PROTECT_DATA) { _GD_SetError(D, GD_E_PROTECTED, GD_E_PROTECTED_DATA, NULL, 0, D->fragment[entry->fragment_index].cname); - dreturn("%i", -1); - return -1; + break; } E->EN(raw,data_type) = entry->EN(raw,data_type); @@ -400,16 +398,16 @@ if (D->error != GD_E_OK) { free(new_ref); _GD_FreeE(D, E, 1); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } new_list = realloc(D->entry, (D->n_entries + 1) * sizeof(gd_entry_t*)); if (new_list == NULL) { free(new_ref); _GD_FreeE(D, E, 1); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } D->entry = (gd_entry_t **)new_list; @@ -418,8 +416,8 @@ if (new_list == NULL) { free(new_ref); _GD_FreeE(D, E, 1); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } D->dot_list = (gd_entry_t **)new_list; } @@ -430,8 +428,8 @@ if (ptr == NULL) { free(new_ref); _GD_FreeE(D, E, 1); - dreturn("%i", -1); - return -1; + dreturn("%p", NULL); + return NULL; } /* From here on, nothing may fail */ @@ -482,8 +480,8 @@ D->list_validity = 0; D->type_list_validity = 0; - dreturn("%i", 0); - return 0; + dreturn("%p", E); + return E; } /* add a META field by parsing a field spec */ @@ -513,9 +511,11 @@ _GD_ClearError(D); + /* Find parent -- we don't do code mungeing here because we don't know + * which fragment this is yet. */ E = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); if (E == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, parent); dreturn("%i", -1); return -1; } @@ -626,7 +626,7 @@ return -1; } - ret = _GD_Add(D, entry, NULL); + ret = (_GD_Add(D, entry, NULL) == NULL) ? -1 : 0; dreturn("%i", ret); return ret; @@ -654,7 +654,7 @@ R.EN(raw,spf) = spf; R.EN(raw,data_type) = data_type; R.fragment_index = fragment_index; - error = _GD_Add(D, &R, NULL); + error = (_GD_Add(D, &R, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -696,7 +696,7 @@ L.EN(lincom,m)[i] = m[i]; L.EN(lincom,b)[i] = b[i]; } - error = _GD_Add(D, &L, NULL); + error = (_GD_Add(D, &L, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -738,7 +738,7 @@ _gd_ca2c(L.EN(lincom,cm)[i], cm, i); _gd_ca2c(L.EN(lincom,cb)[i], cb, i); } - error = _GD_Add(D, &L, NULL); + error = (_GD_Add(D, &L, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -766,7 +766,7 @@ L.in_fields[0] = (char *)in_field; L.EN(linterp,table) = (char *)table; L.fragment_index = fragment_index; - error = _GD_Add(D, &L, NULL); + error = (_GD_Add(D, &L, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -795,7 +795,7 @@ B.EN(bit,bitnum) = bitnum; B.EN(bit,numbits) = numbits; B.fragment_index = fragment_index; - error = _GD_Add(D, &B, NULL); + error = (_GD_Add(D, &B, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -824,7 +824,7 @@ B.EN(bit,bitnum) = bitnum; B.EN(bit,numbits) = numbits; B.fragment_index = fragment_index; - error = _GD_Add(D, &B, NULL); + error = (_GD_Add(D, &B, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -852,7 +852,7 @@ 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); + error = (_GD_Add(D, &M, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -880,7 +880,7 @@ E.in_fields[0] = (char *)in_field1; E.in_fields[1] = (char *)in_field2; E.fragment_index = fragment_index; - error = _GD_Add(D, &E, NULL); + error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -909,7 +909,7 @@ E.comp_scal = 0; E.in_fields[0] = (char *)in_field; E.fragment_index = fragment_index; - error = _GD_Add(D, &E, NULL); + error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -919,6 +919,8 @@ int gd_add_crecip(DIRFILE* D, const char* field_code, const char* in_field, double complex cdividend, int fragment_index) gd_nothrow { + int error; + dtrace("%p, \"%s\", \"%s\", %g;%g, %i", D, field_code, in_field, creal(cdividend), cimag(cdividend), fragment_index); @@ -936,7 +938,7 @@ E.comp_scal = 1; E.in_fields[0] = (char *)in_field; E.fragment_index = fragment_index; - int error = _GD_Add(D, &E, NULL); + error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -965,7 +967,7 @@ E.comp_scal = 1; E.in_fields[0] = (char *)in_field; E.fragment_index = fragment_index; - error = _GD_Add(D, &E, NULL); + error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1005,7 +1007,7 @@ for (i = 0; i <= poly_ord; ++i) E.EN(polynom,a)[i] = a[i]; - error = _GD_Add(D, &E, NULL); + error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1044,7 +1046,7 @@ for (i = 0; i <= poly_ord; ++i) _gd_ca2c(E.EN(polynom,ca)[i], ca, i); - error = _GD_Add(D, &E, NULL); + error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1072,7 +1074,7 @@ P.in_fields[0] = (char *)in_field; P.EN(phase,shift) = shift; P.fragment_index = fragment_index; - error = _GD_Add(D, &P, NULL); + error = (_GD_Add(D, &P, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1104,7 +1106,7 @@ 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); + error = (_GD_Add(D, &E, NULL) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1116,7 +1118,6 @@ { gd_entry_t *entry; gd_entry_t S; - int error; dtrace("%p, \"%s\", \"%s\", %i", D, field_code, value, fragment_index); @@ -1130,23 +1131,14 @@ S.field = (char *)field_code; S.field_type = GD_STRING_ENTRY; S.fragment_index = fragment_index; - error = _GD_Add(D, &S, NULL); + entry = _GD_Add(D, &S, NULL); /* Actually store the string, now */ - if (!error) { - entry = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); + if (entry) + _GD_DoFieldOut(D, entry, 0, 0, 0, GD_NULL, value); - if (entry == NULL) - _GD_InternalError(D); /* We should be able to find it: we just added it */ - else - _GD_DoFieldOut(D, entry, 0, 0, 0, GD_NULL, value); - - if (D->error) - error = -1; - } - - dreturn("%i", error); - return error; + dreturn("%i", D->error ? -1 : 0); + return D->error ? -1 : 0; } /* add a CONST entry */ @@ -1155,7 +1147,6 @@ { gd_entry_t *entry; gd_entry_t C; - int error; dtrace("%p, \"%s\", 0x%X, 0x%X, %p, %i", D, field_code, const_type, data_type, value, fragment_index); @@ -1171,23 +1162,14 @@ C.field_type = GD_CONST_ENTRY; C.EN(scalar,const_type) = const_type; C.fragment_index = fragment_index; - error = _GD_Add(D, &C, NULL); + entry = _GD_Add(D, &C, NULL); /* Actually store the constant, now */ - if (!error) { - entry = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); + if (entry) + _GD_DoFieldOut(D, entry, 0, 0, 1, data_type, value); - if (entry == NULL) - _GD_InternalError(D); /* We should be able to find it: we just added it */ - else - _GD_DoFieldOut(D, entry, 0, 0, 1, data_type, value); - - if (D->error) - error = -1; - } - - dreturn("%i", error); - return error; + dreturn("%i", D->error ? -1 : 0); + return D->error ? -1 : 0; } /* add a CARRAY entry */ @@ -1197,7 +1179,6 @@ { gd_entry_t *entry; gd_entry_t C; - int error; dtrace("%p, \"%s\", 0x%X, %zi, 0x%X, %p, %i", D, field_code, const_type, array_len, data_type, values, fragment_index); @@ -1214,23 +1195,14 @@ C.EN(scalar,const_type) = const_type; C.EN(scalar,array_len) = array_len; C.fragment_index = fragment_index; - error = _GD_Add(D, &C, NULL); + entry = _GD_Add(D, &C, NULL); /* Actually store the carray, now */ - if (!error) { - entry = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); + if (entry) + _GD_DoFieldOut(D, entry, 0, 0, array_len, data_type, values); - if (entry == NULL) - _GD_InternalError(D); /* We should be able to find it: we just added it */ - else - _GD_DoFieldOut(D, entry, 0, 0, array_len, data_type, values); - - if (D->error) - error = -1; - } - - dreturn("%i", error); - return error; + dreturn("%i", D->error ? -1 : 0); + return D->error ? -1 : 0; } int gd_madd(DIRFILE* D, const gd_entry_t* entry, const char* parent) gd_nothrow @@ -1245,7 +1217,7 @@ return -1; } - ret = _GD_Add(D, entry, parent); + ret = (_GD_Add(D, entry, parent) == NULL) ? -1 : 0; dreturn("%i", ret); return ret; @@ -1288,7 +1260,7 @@ L.scalar[i] = NULL; L.scalar[i + GD_MAX_LINCOM] = NULL; } - error = _GD_Add(D, &L, parent); + error = (_GD_Add(D, &L, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1331,7 +1303,7 @@ L.scalar[i] = NULL; L.scalar[i + GD_MAX_LINCOM] = NULL; } - error = _GD_Add(D, &L, parent); + error = (_GD_Add(D, &L, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1358,7 +1330,7 @@ L.in_fields[0] = (char *)in_field; L.EN(linterp,table) = (char *)table; L.fragment_index = 0; - error = _GD_Add(D, &L, parent); + error = (_GD_Add(D, &L, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1387,7 +1359,7 @@ B.EN(bit,numbits) = numbits; B.fragment_index = 0; B.scalar[0] = B.scalar[1] = NULL; - error = _GD_Add(D, &B, parent); + error = (_GD_Add(D, &B, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1416,7 +1388,7 @@ B.EN(bit,numbits) = numbits; B.fragment_index = 0; B.scalar[0] = B.scalar[1] = NULL; - error = _GD_Add(D, &B, parent); + error = (_GD_Add(D, &B, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1443,7 +1415,7 @@ M.in_fields[0] = (char *)in_field1; M.in_fields[1] = (char *)in_field2; M.fragment_index = 0; - error = _GD_Add(D, &M, parent); + error = (_GD_Add(D, &M, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1471,7 +1443,7 @@ P.EN(phase,shift) = shift; P.fragment_index = 0; P.scalar[0] = NULL; - error = _GD_Add(D, &P, parent); + error = (_GD_Add(D, &P, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1512,7 +1484,7 @@ E.scalar[i] = NULL; } - error = _GD_Add(D, &E, parent); + error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1553,7 +1525,7 @@ E.scalar[i] = NULL; } - error = _GD_Add(D, &E, parent); + error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1580,7 +1552,7 @@ E.field_type = GD_DIVIDE_ENTRY; E.in_fields[0] = (char *)in_field1; E.in_fields[1] = (char *)in_field2; - error = _GD_Add(D, &E, parent); + error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1608,7 +1580,7 @@ E.EN(recip,dividend) = dividend; E.comp_scal = 0; E.in_fields[0] = (char *)in_field; - error = _GD_Add(D, &E, parent); + error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1618,6 +1590,8 @@ int gd_madd_crecip(DIRFILE* D, const char *parent, const char* field_code, const char* in_field, double complex cdividend) { + int error; + dtrace("%p, \"%s\", \"%s\", \"%s\", %g;%g", D, parent, field_code, in_field, creal(cdividend), cimag(cdividend)); @@ -1634,7 +1608,7 @@ E.EN(recip,cdividend) = cdividend; E.comp_scal = 1; E.in_fields[0] = (char *)in_field; - int error = _GD_Add(D, &E, parent); + error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1662,7 +1636,7 @@ _gd_a2c(E.EN(recip,cdividend), cdividend); E.comp_scal = 1; E.in_fields[0] = (char *)in_field; - error = _GD_Add(D, &E, parent); + error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1693,7 +1667,7 @@ 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); + error = (_GD_Add(D, &E, parent) == NULL) ? -1 : 0; dreturn("%i", error); return error; @@ -1703,8 +1677,6 @@ int gd_madd_string(DIRFILE* D, const char* parent, const char* field_code, const char* value) gd_nothrow { - char *buffer; - int error; gd_entry_t *entry; gd_entry_t S; @@ -1719,39 +1691,20 @@ S.field = (char *)field_code; S.field_type = GD_STRING_ENTRY; S.fragment_index = 0; - error = _GD_Add(D, &S, parent); + entry = _GD_Add(D, &S, parent); /* Actually store the string, now */ - if (!error) { - buffer = (char *)_GD_Malloc(D, strlen(parent) + strlen(field_code) + 2); - if (buffer == NULL) { - dreturn("%i", -1); - return -1; - } + if (entry) + _GD_DoFieldOut(D, entry, 0, 0, 0, GD_NULL, value); - sprintf(buffer, "%s/%s", parent, field_code); - entry = _GD_FindField(D, buffer, D->entry, D->n_entries, NULL); - free(buffer); - - if (entry == NULL) - _GD_InternalError(D); /* We should be able to find it: we just added it */ - else - _GD_DoFieldOut(D, entry, 0, 0, 0, GD_NULL, value); - - if (D->error) - error = -1; - } - - dreturn("%i", error); - return error; + dreturn("%i", D->error ? -1 : 0); + return D->error ? -1 : 0; } /* add a META CONST entry */ int gd_madd_const(DIRFILE* D, const char* parent, const char* field_code, gd_type_t const_type, gd_type_t data_type, const void* value) gd_nothrow { - char *buffer; - int error; gd_entry_t *entry; gd_entry_t C; @@ -1768,31 +1721,14 @@ C.field_type = GD_CONST_ENTRY; C.EN(scalar,const_type) = const_type; C.fragment_index = 0; - error = _GD_Add(D, &C, parent); + entry = _GD_Add(D, &C, parent); /* Actually store the constant, now */ - if (!error) { - buffer = (char *)_GD_Malloc(D, strlen(parent) + strlen(field_code) + 2); - if (buffer == NULL) { - dreturn("%i", -1); - return -1; - } + if (entry) + _GD_DoFieldOut(D, entry, 0, 0, 1, data_type, value); - sprintf(buffer, "%s/%s", parent, field_code); - entry = _GD_FindField(D, buffer, D->entry, D->n_entries, NULL); - free(buffer); - - if (entry == NULL) - _GD_InternalError(D); /* We should be able to find it: we just added it */ - else - _GD_DoFieldOut(D, entry, 0, 0, 1, data_type, value); - - if (D->error) - error = -1; - } - - dreturn("%i", error); - return error; + dreturn("%i", D->error ? -1 : 0); + return D->error ? -1 : 0; } /* add a META CARRAY entry */ @@ -1800,8 +1736,6 @@ gd_type_t const_type, size_t array_len, gd_type_t data_type, const void* values) gd_nothrow { - char *buffer; - int error; gd_entry_t *entry; gd_entry_t C; @@ -1819,29 +1753,12 @@ C.EN(scalar,const_type) = const_type; C.EN(scalar,array_len) = array_len; C.fragment_index = 0; - error = _GD_Add(D, &C, parent); + entry = _GD_Add(D, &C, parent); /* Actually store the carray, now */ - if (!error) { - buffer = (char *)_GD_Malloc(D, strlen(parent) + strlen(field_code) + 2); - if (buffer == NULL) { - dreturn("%i", -1); - return -1; - } + if (entry) + _GD_DoFieldOut(D, entry, 0, 0, array_len, data_type, values); - sprintf(buffer, "%s/%s", parent, field_code); - entry = _GD_FindField(D, buffer, D->entry, D->n_entries, NULL); - free(buffer); - - if (entry == NULL) - _GD_InternalError(D); /* We should be able to find it: we just added it */ - else - _GD_DoFieldOut(D, entry, 0, 0, array_len, data_type, values); - - if (D->error) - error = -1; - } - - dreturn("%i", error); - return error; + dreturn("%i", D->error ? -1 : 0); + return D->error ? -1 : 0; } Modified: trunk/getdata/src/common.c =================================================================== --- trunk/getdata/src/common.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/common.c 2011-12-11 23:35:07 UTC (rev 635) @@ -876,7 +876,7 @@ E = _GD_FindField(D, *field_code, D->entry, D->n_entries, index); if (E == NULL && set) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, field_code_in); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code_in); if (field_code_in != *field_code) free(*field_code); } @@ -1252,22 +1252,20 @@ } /* new one */ - ptr = realloc(D->dir, sizeof(struct gd_dir_t) * (D->ndir + 1)); + ptr = _GD_Realloc(D, D->dir, sizeof(struct gd_dir_t) * (D->ndir + 1)); if (ptr == NULL) { free(path); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } D->dir = ptr; D->dir[D->ndir].rc = 1; - D->dir[D->ndir].path = strdup(dir); + D->dir[D->ndir].path = _GD_Strdup(D, dir); if (D->dir[D->ndir].path == NULL) { free(path); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -1280,10 +1278,9 @@ D->dir[D->ndir].fd = open(dir, O_RDONLY); } else { free(path); - path = strdup(name); + path = _GD_Strdup(D, name); if (path == NULL) { free(D->dir[D->ndir].path); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } Modified: trunk/getdata/src/compat.c =================================================================== --- trunk/getdata/src/compat.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/compat.c 2011-12-11 23:35:07 UTC (rev 635) @@ -39,6 +39,9 @@ } #endif +/* ...at() functions for platforms lacking them. These are originally Solaris + * extensions which have subsequently been included in POSIX.1-2008. + */ #ifndef HAVE_OPENAT int gd_OpenAt(const DIRFILE *D, int dirfd, const char *name, int flags, mode_t mode) Modified: trunk/getdata/src/del.c =================================================================== --- trunk/getdata/src/del.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/del.c 2011-12-11 23:35:07 UTC (rev 635) @@ -289,11 +289,10 @@ free(field_code); /* gather a list of fields */ - del_list = (gd_entry_t **)malloc(sizeof(gd_entry_t*) * ((E->e->n_meta == -1) ? - 1 : 1 + E->e->n_meta)); + del_list = (gd_entry_t **)_GD_Malloc(D, + sizeof(gd_entry_t*) * ((E->e->n_meta == -1) ? 1 : 1 + E->e->n_meta)); if (del_list == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -363,10 +362,9 @@ /* Fix up reference fields */ if (E->field_type == GD_RAW_ENTRY) { - new_ref = (char **)malloc(sizeof(char*) * D->n_fragment); + new_ref = (char **)_GD_Malloc(D, sizeof(char*) * D->n_fragment); if (new_ref == NULL) { free(del_list); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -392,13 +390,12 @@ } if (in_scope) { - new_ref[i] = strdup(D->entry[j]->field); + new_ref[i] = _GD_Strdup(D, D->entry[j]->field); if (new_ref == NULL) { for (f = 0; f < i; ++f) free(new_ref[f]); free(new_ref); free(del_list); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } Modified: trunk/getdata/src/encoding.c =================================================================== --- trunk/getdata/src/encoding.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/encoding.c 2011-12-11 23:35:07 UTC (rev 635) @@ -630,10 +630,9 @@ if (file->name == NULL) { file->D = D; - file->name = (char *)malloc(strlen(base) + (temp ? 8 : + file->name = (char *)_GD_Malloc(D, strlen(base) + (temp ? 8 : strlen(_gd_ef[file->subenc].ext) + 1)); if (file->name == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -662,11 +661,10 @@ } if (move && encoding != D->fragment[fragment].encoding) { - gd_entry_t **raw_entry = (gd_entry_t **)malloc(sizeof(gd_entry_t*) * + gd_entry_t **raw_entry = (gd_entry_t **)_GD_Malloc(D, sizeof(gd_entry_t*) * D->n_entries); if (raw_entry == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturnvoid(); return; } Modified: trunk/getdata/src/endian.c =================================================================== --- trunk/getdata/src/endian.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/endian.c 2011-12-11 23:35:07 UTC (rev 635) @@ -44,11 +44,10 @@ } if (move && byte_sex != D->fragment[fragment].byte_sex) { - gd_entry_t **raw_entry = (gd_entry_t **)malloc(sizeof(gd_entry_t*) * + gd_entry_t **raw_entry = (gd_entry_t **)_GD_Malloc(D, sizeof(gd_entry_t*) * D->n_entries); if (raw_entry == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturnvoid(); return; } Modified: trunk/getdata/src/errors.c =================================================================== --- trunk/getdata/src/errors.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/errors.c 2011-12-11 23:35:07 UTC (rev 635) @@ -33,6 +33,7 @@ { GD_E_OPEN, GD_E_OPEN_NO_ACCESS, "Cannot open dirfile {2}: permission denied", 0 }, { GD_E_OPEN, GD_E_OPEN_NOT_EXIST, "Dirfile does not exist: {2}", 0 }, + { GD_E_OPEN, GD_E_OPEN_PATH, "Bad path: {2}", 0 }, /* GD_E_FORMAT: 1 = suberror, 2 = formatfile, 3 = line number, 4 = token */ { GD_E_FORMAT, GD_E_FORMAT_BAD_TYPE, "Bad data type on line {3} of {2}: {4}", 0 }, @@ -83,7 +84,8 @@ { GD_E_CREAT, GD_E_CREAT_EXCL, "Unable to create dirfile {2}: already exists", 0 }, /* GD_E_BAD_CODE: 4 = field code */ - { GD_E_BAD_CODE, 0, "Field not found: {4}", 0 }, + { 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_TYPE: 1 = data type */ { GD_E_BAD_TYPE, 0, "Unsupported data type: {1}", 0 }, /* GD_E_RAW_IO: 2 = filename, 3 = errno */ Modified: trunk/getdata/src/field_list.c =================================================================== --- trunk/getdata/src/field_list.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/field_list.c 2011-12-11 23:35:07 UTC (rev 635) @@ -44,7 +44,6 @@ return NULL; } - free(D->const_value_list); fl = (char *)_GD_Alloc(D, return_type, n); if (fl == NULL) { @@ -60,6 +59,7 @@ break; } + free(D->const_value_list); D->const_value_list = fl; dreturn("%p", D->error ? NULL : D->const_value_list); @@ -86,19 +86,15 @@ return zero_carrays; } - if (D->carray_value_list) - for (i = 0; D->carray_value_list[i].n != 0; ++i) - free(D->carray_value_list[i].d); - free(D->carray_value_list); - fl = (gd_carray_t *)malloc(sizeof(gd_carray_t) * (n + 1)); - memset(fl, 0, sizeof(gd_carray_t) * (n + 1)); + fl = (gd_carray_t *)_GD_Malloc(D, sizeof(gd_carray_t) * (n + 1)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } + memset(fl, 0, sizeof(gd_carray_t) * (n + 1)); + for (i = n = 0; i < D->n_entries; ++i) { if (D->entry[i]->field_type == GD_CARRAY_ENTRY && D->entry[i]->e->n_meta != -1 && !D->entry[i]->hidden) @@ -113,6 +109,10 @@ } fl[n].n = 0; + if (D->carray_value_list) + for (i = 0; D->carray_value_list[i].n != 0; ++i) + free(D->carray_value_list[i].d); + free(D->carray_value_list); D->carray_value_list = fl; dreturn("%p", D->error ? NULL : fl); @@ -145,11 +145,9 @@ return D->string_value_list; } - fl = (char **)realloc((char **)D->string_value_list, sizeof(const char*) * - (n + 1)); + fl = (char **)_GD_Malloc(D, sizeof(const char*) * (n + 1)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } @@ -161,6 +159,7 @@ } fl[n] = NULL; + free(D->string_value_list); D->string_value_list = (const char **)fl; D->list_validity |= LIST_VALID_STRING_VALUE; @@ -202,11 +201,9 @@ return D->type_list[index]; } - fl = (char **)realloc((char **)D->type_list[index], - sizeof(const char*) * (n + 1)); + fl = (char **)_GD_Malloc(D, sizeof(const char*) * (n + 1)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } @@ -220,6 +217,7 @@ } fl[n] = NULL; + free(D->type_list[index]); D->type_list[index] = (const char **)fl; D->type_list_validity |= 1 << index; @@ -255,10 +253,9 @@ return D->vector_list; } - fl = (char **)realloc((char **)D->vector_list, sizeof(const char*) * (n + 1)); + fl = (char **)_GD_Malloc(D, sizeof(const char*) * (n + 1)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } @@ -270,6 +267,7 @@ } fl[n] = NULL; + free(D->vector_list); D->vector_list = (const char **)fl; D->list_validity |= LIST_VALID_VECTOR; @@ -303,11 +301,10 @@ return D->field_list; } - fl = (char **)realloc((char **)D->field_list, sizeof(const char*) * + fl = (char **)_GD_Malloc(D, sizeof(const char*) * (D->n_entries + 1 - D->n_meta - D->n_hidden)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } @@ -317,6 +314,7 @@ fl[n++] = D->entry[i]->field; fl[n] = NULL; + free(D->field_list); D->field_list = (const char **)fl; D->list_validity |= LIST_VALID_FIELD; Modified: trunk/getdata/src/flush.c =================================================================== --- trunk/getdata/src/flush.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/flush.c 2011-12-11 23:35:07 UTC (rev 635) @@ -23,8 +23,7 @@ #define GD_MAX_PRETTY_FIELD_WIDTH 80 /* remove the prefix and suffix from a field code */ -static char *_GD_DeMungeCode(const char *prefix, const char *suffix, - const char *code) +char *_GD_DeMungeCode(const char *prefix, const char *suffix, const char *code) { size_t i, len, slen; char *ptr; @@ -560,8 +559,12 @@ break; } - if (!D->error && E->hidden && (permissive || D->standards >= 9)) - fprintf(stream, "/HIDDEN %s\n", E->field); + if (!D->error && E->hidden && (permissive || D->standards >= 9)) { + fputs("/HIDDEN ", stream); + _GD_PadField(stream, D->fragment[me].prefix, D->fragment[me].suffix, + E->field, 0, permissive, D->standards); + fputc('\n', stream); + } dreturnvoid(); } Modified: trunk/getdata/src/globals.c =================================================================== --- trunk/getdata/src/globals.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/globals.c 2011-12-11 23:35:07 UTC (rev 635) @@ -76,7 +76,7 @@ E = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); if (E == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, field_code); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code); dreturn("%p", NULL); return NULL; } @@ -95,10 +95,9 @@ return NULL; } - ptr = strdup(E->field); + ptr = _GD_Strdup(D, E->field); if (ptr == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/internal.h 2011-12-11 23:35:07 UTC (rev 635) @@ -558,9 +558,12 @@ #define MAX_IN_COLS (3 * GD_MAX_LINCOM + 5) /* for META lincom */ /* Suberror codes */ +/* GD_E_FORMAT suberrors are in getdata.h */ + #define GD_E_OPEN_NOT_EXIST 1 #define GD_E_OPEN_NOT_DIRFILE 2 #define GD_E_OPEN_NO_ACCESS 3 +#define GD_E_OPEN_PATH 4 #define GD_E_TRUNC_STAT 1 #define GD_E_TRUNC_UNLINK 2 @@ -571,7 +574,8 @@ #define GD_E_CREAT_DIR 3 #define GD_E_CREAT_OPEN 4 -/* GD_E_FORMAT suberrors are in getdata.h */ +#define GD_E_CODE_MISSING 1 +#define GD_E_CODE_INVALID 2 #define GD_E_LINFILE_LENGTH 1 #define GD_E_LINFILE_OPEN 2 @@ -907,6 +911,7 @@ void _GD_ConvertType(DIRFILE* D, const void *data_in, gd_type_t in_type, void *data_out, gd_type_t out_type, size_t n) gd_nothrow; gd_type_t _GD_ConstType(DIRFILE *D, gd_type_t type); +char *_GD_DeMungeCode(const char *prefix, const char *suffix, const char *code); const char *_GD_DirName(const DIRFILE *D, int dirfd); #define _GD_EntryIndex(t) \ Modified: trunk/getdata/src/meta_list.c =================================================================== --- trunk/getdata/src/meta_list.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/meta_list.c 2011-12-11 23:35:07 UTC (rev 635) @@ -45,7 +45,8 @@ P = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); if (P == NULL || P->e->n_meta == -1) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); + _GD_SetError(D, GD_E_BAD_CODE, P ? GD_E_CODE_INVALID : GD_E_CODE_MISSING, + NULL, 0, parent); dreturn("%p", NULL); return NULL; } @@ -57,7 +58,6 @@ return NULL; } - free(e->const_value_list); fl = (char *)_GD_Alloc(D, return_type, n); if (fl == NULL) { @@ -77,6 +77,7 @@ } } + free(e->const_value_list); e->const_value_list = fl; dreturn("%p", e->const_value_list); @@ -104,7 +105,8 @@ P = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); if (P == NULL || P->e->n_meta == -1) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); + _GD_SetError(D, GD_E_BAD_CODE, P ? GD_E_CODE_INVALID : GD_E_CODE_MISSING, + NULL, 0, parent); dreturn("%p", NULL); return NULL; } @@ -116,13 +118,8 @@ return zero_carrays; } - if (e->carray_value_list) - for (i = 0; e->carray_value_list[i].n != 0; ++i) - free(e->carray_value_list[i].d); - free(e->carray_value_list); + fl = (gd_carray_t *)_GD_Malloc(D, sizeof(gd_carray_t) * (n + 1)); - fl = (gd_carray_t *)malloc(sizeof(gd_carray_t) * (n + 1)); - if (fl == NULL) { dreturn("%p", NULL); return NULL; @@ -144,6 +141,11 @@ } fl[n].n = 0; + if (e->carray_value_list) + for (i = 0; e->carray_value_list[i].n != 0; ++i) + free(e->carray_value_list[i].d); + free(e->carray_value_list); + e->carray_value_list = fl; dreturn("%p", D->error ? NULL : fl); @@ -170,7 +172,8 @@ P = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); if (P == NULL || P->e->n_meta == -1) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); + _GD_SetError(D, GD_E_BAD_CODE, P ? GD_E_CODE_INVALID : GD_E_CODE_MISSING, + NULL, 0, parent); dreturn("%p", NULL); return NULL; } @@ -182,11 +185,10 @@ return zero_list; } - fl = (char **)realloc((char **)e->string_value_list, sizeof(const char*) * - (n + 1)); + fl = (char **)_GD_Realloc(D, (char **)e->string_value_list, + sizeof(const char*) * (n + 1)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } @@ -229,7 +231,8 @@ P = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); if (P == NULL || P->e->n_meta == -1) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); + _GD_SetError(D, GD_E_BAD_CODE, P ? GD_E_CODE_INVALID : GD_E_CODE_MISSING, + NULL, 0, parent); dreturn("%p", NULL); return NULL; } @@ -255,10 +258,10 @@ return NULL; } - fl = (char **)realloc(e->type_list[index], sizeof(const char*) * (n + 1)); + fl = (char **)_GD_Realloc(D, e->type_list[index], + sizeof(const char*) * (n + 1)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } @@ -294,8 +297,9 @@ P = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); - if (P == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); + if (P == NULL || P->e->n_meta == -1) { + _GD_SetError(D, GD_E_BAD_CODE, P ? GD_E_CODE_INVALID : GD_E_CODE_MISSING, + NULL, 0, parent); dreturn("%p", NULL); return NULL; } @@ -312,10 +316,10 @@ return zero_list; } - fl = (char **)realloc((char **)e->vector_list, sizeof(const char*) * (n + 1)); + fl = (char **)_GD_Realloc(D, (char **)e->vector_list, + sizeof(const char*) * (n + 1)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } @@ -354,8 +358,9 @@ P = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); - if (P == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); + if (P == NULL || P->e->n_meta == -1) { + _GD_SetError(D, GD_E_BAD_CODE, P ? GD_E_CODE_INVALID : GD_E_CODE_MISSING, + NULL, 0, parent); dreturn("%p", NULL); return NULL; } @@ -369,11 +374,10 @@ return zero_list; } - fl = (char **)realloc((char **)e->field_list, sizeof(const char*) * + fl = (char **)_GD_Realloc(D, (char **)e->field_list, sizeof(const char*) * (e->n_meta + 1 - e->n_hidden)); if (fl == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } Modified: trunk/getdata/src/mod.c =================================================================== --- trunk/getdata/src/mod.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/mod.c 2011-12-11 23:35:07 UTC (rev 635) @@ -43,7 +43,6 @@ { int r = 0; int set_lout = 0; - int error = 0; dtrace("%p, %i, 0x%X, %p, %p, %p, %p, %p, %i, %i", D, alter_literal, type, lout, lin, sout, iout, sin, iin, calculated); @@ -62,7 +61,7 @@ * get_constant. */ r = GD_AS_FREE_SCALAR | GD_AS_MODIFIED; if (!calculated) - error = gd_get_constant(D, *sout, GD_INT64, lout); + gd_get_constant(D, *sout, GD_INT64, lout); *sout = NULL; } } else if (alter_literal) { @@ -81,13 +80,11 @@ * been asked to move the raw file, _GD_Change is going to need to * recalculate the entry; no need to change lout: it's ignored. */ r = GD_AS_FREE_SCALAR | GD_AS_NEED_RECALC | GD_AS_MODIFIED; - *sout = strdup(sin); - if (*sout == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + *sout = _GD_Strdup(D, sin); *iout = iin; } - if (!error && set_lout) { + if (!D->error && set_lout) { r |= GD_AS_MODIFIED; if (type == GD_INT64) *(int64_t *)lout = *(int64_t *)lin; @@ -103,7 +100,7 @@ _GD_InternalError(D); } - if (error) + if (D->error) r |= GD_AS_ERROR; dreturn("%i", r); @@ -206,7 +203,7 @@ else if ((E = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL)) == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, field_code); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code); } else if (D->fragment[E->fragment_index].protection & GD_PROTECT_FORMAT) _GD_SetError(D, GD_E_PROTECTED, GD_E_PROTECTED_FORMAT, NULL, 0, D->fragment[E->fragment_index].cname); @@ -307,9 +304,14 @@ break; } - buffer1 = malloc(BUFFER_SIZE); - buffer2 = malloc(BUFFER_SIZE); + buffer1 = _GD_Malloc(D, BUFFER_SIZE); + buffer2 = _GD_Malloc(D, BUFFER_SIZE); + if (D->error) { + free(buffer1); + break; + } + /* Now copy the old file to the new file */ for (;;) { nread = (*enc->read)(E->e->u.raw.file, buffer1, E->EN(raw,data_type), @@ -400,10 +402,9 @@ if (E->EN(lincom,n_fields) <= i || (N->in_fields[i] != NULL && strcmp(E->in_fields[i], N->in_fields[i]))) { - if ((Q.in_fields[i] = strdup(N->in_fields[i])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[i] = _GD_Strdup(D, N->in_fields[i])) == NULL) break; - } + modified = 1; field_free |= 1 << i; } @@ -469,10 +470,9 @@ break; case GD_LINTERP_ENTRY: if (N->in_fields[0] != NULL && strcmp(E->in_fields[0], N->in_fields[0])) { - if ((Q.in_fields[0] = strdup(N->in_fields[0])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[0] = _GD_Strdup(D, N->in_fields[0])) == NULL) break; - } + modified = 1; field_free = 1; } @@ -480,13 +480,11 @@ if (N->EN(linterp,table) != NULL && strcmp(E->EN(linterp,table), N->EN(linterp,table))) { - Q.EN(linterp,table) = strdup(N->EN(linterp,table)); + Q.EN(linterp,table) = _GD_Strdup(D, N->EN(linterp,table)); Qe.u.linterp.table_file = NULL; - if (Q.EN(linterp,table) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if (Q.EN(linterp,table) == NULL) break; - } if (flags) { if (E->e->u.linterp.table_file == NULL) @@ -544,10 +542,9 @@ modified = 1; if (N->in_fields[0] != NULL && strcmp(E->in_fields[0], N->in_fields[0])) { - if ((Q.in_fields[0] = strdup(N->in_fields[0])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[0] = _GD_Strdup(D, N->in_fields[0])) == NULL) break; - } + modified = 1; field_free = 1; } @@ -556,19 +553,17 @@ case GD_MULTIPLY_ENTRY: case GD_DIVIDE_ENTRY: if (N->in_fields[0] != NULL && strcmp(E->in_fields[0], N->in_fields[0])) { - if ((Q.in_fields[0] = strdup(N->in_fields[0])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[0] = _GD_Strdup(D, N->in_fields[0])) == NULL) break; - } + modified = 1; field_free = 1; } if (N->in_fields[1] != NULL && strcmp(E->in_fields[1], N->in_fields[1])) { - if ((Q.in_fields[1] = strdup(N->in_fields[1])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[1] = _GD_Strdup(D, N->in_fields[1])) == NULL) break; - } + modified = 1; field_free |= 2; } @@ -576,10 +571,9 @@ break; case GD_RECIP_ENTRY: if (N->in_fields[0] != NULL && strcmp(E->in_fields[0], N->in_fields[0])) { - if ((Q.in_fields[0] = strdup(N->in_fields[0])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[0] = _GD_Strdup(D, N->in_fields[0])) == NULL) break; - } + modified = 1; field_free = 1; } @@ -630,10 +624,9 @@ modified = 1; if (N->in_fields[0] != NULL && strcmp(E->in_fields[0], N->in_fields[0])) { - if ((Q.in_fields[0] = strdup(N->in_fields[0])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[0] = _GD_Strdup(D, N->in_fields[0])) == NULL) break; - } + modified = 1; field_free = 1; } @@ -641,10 +634,9 @@ break; case GD_POLYNOM_ENTRY: if (N->in_fields[0] != NULL && strcmp(E->in_fields[0], N->in_fields[0])) { - if ((Q.in_fields[0] = strdup(N->in_fields[0])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[0] = _GD_Strdup(D, N->in_fields[0])) == NULL) break; - } + modified = 1; field_free = 1; } @@ -730,19 +722,17 @@ modified = 1; if (N->in_fields[0] != NULL && strcmp(E->in_fields[0], N->in_fields[0])) { - if ((Q.in_fields[0] = strdup(N->in_fields[0])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[0] = _GD_Strdup(D, N->in_fields[0])) == NULL) break; - } + modified = 1; field_free |= 1; } if (N->in_fields[1] != NULL && strcmp(E->in_fields[1], N->in_fields[1])) { - if ((Q.in_fields[1] = strdup(N->in_fields[1])) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((Q.in_fields[1] = _GD_Strdup(D, N->in_fields[1])) == NULL) break; - } + modified = 1; field_free |= 2; } @@ -768,9 +758,8 @@ Qe.u.scalar.d = E->e->u.scalar.d; else { /* type convert */ - Qe.u.scalar.d = malloc(GD_SIZE(type)); + Qe.u.scalar.d = _GD_Malloc(D, GD_SIZE(type)); if (Qe.u.scalar.d == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -823,9 +812,8 @@ } type = _GD_ConstType(D, Q.EN(scalar,const_type)); - Qe.u.scalar.d = malloc(GD_SIZE(type) * Q.EN(scalar,array_len)); + Qe.u.scalar.d = _GD_Malloc(D, GD_SIZE(type) * Q.EN(scalar,array_len)); if (Qe.u.scalar.d == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -974,7 +962,7 @@ gd_entry_t *E = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); if (E == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, field_code); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code); dreturn("%i", -1); return -1; } @@ -1042,7 +1030,7 @@ gd_entry_t *E = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); if (E == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, field_code); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code); dreturn("%i", -1); return -1; } @@ -1409,7 +1397,7 @@ gd_entry_t *E = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); if (E == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, field_code); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code); dreturn("%i", -1); return -1; } @@ -1465,7 +1453,7 @@ gd_entry_t *E = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); if (E == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, field_code); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code); dreturn("%i", -1); return -1; } @@ -1525,7 +1513,7 @@ int gd_alter_spec(DIRFILE* D, const char* line, int move) { const char *tok_pos = NULL; - char *outstring = NULL; + char *outstring = NULL, *new_code; char *in_cols[MAX_IN_COLS]; int n_cols, ret; int standards = GD_DIRFILE_STANDARDS_VERSION; @@ -1573,11 +1561,17 @@ return -1; } + /* the parser will modifiy in_cols[0] if it contains a metafield code */ + if ((new_code = _GD_Strdup(D, in_cols[0])) == NULL) { + dreturn("%i", -1); + return -1; + } + N = _GD_FindField(D, in_cols[0], D->entry, D->n_entries, NULL); if (N == NULL) { free(outstring); - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, in_cols[0]); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, in_cols[0]); dreturn("%i", -1); return -1; } @@ -1593,6 +1587,10 @@ return -1; } + /* The parse will have re-applied the prefix and suffix, undo that */ + free(N->field); + N->field = new_code; + if (N->field_type == GD_LINCOM_ENTRY) move = 7; @@ -1633,7 +1631,7 @@ N = _GD_FindField(D, parent, D->entry, D->n_entries, NULL); if (N == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, parent); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, parent); dreturn("%i", -1); return -1; } @@ -1648,11 +1646,17 @@ n_cols = _GD_Tokenise(D, line, &outstring, &tok_pos, in_cols, "dirfile_malter_spec()", 0, standards, D->flags & GD_PERMISSIVE); - if (!D->error) + if (!D->error) { /* Let the parser compose the entry */ N = _GD_ParseFieldSpec(D, n_cols, in_cols, N, "dirfile_malter_spec()", 0, N->fragment_index, standards, 0, GD_PEDANTIC, 0, &outstring, tok_pos); + /* The parse will have re-applied the prefix and suffix, undo that */ + free(N->field); + if ((N->field = _GD_Malloc(D, strlen(parent) + strlen(in_cols[0]) + 2))) + sprintf(N->field, "%s/%s", parent, in_cols[0]); + } + free(outstring); if (D->error) { Modified: trunk/getdata/src/move.c =================================================================== --- trunk/getdata/src/move.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/move.c 2011-12-11 23:35:07 UTC (rev 635) @@ -40,9 +40,8 @@ new_fragment = E->fragment_index; if (new_filebase == NULL) { - new_filebase = strdup(E->e->u.raw.filebase); + new_filebase = _GD_Strdup(D, E->e->u.raw.filebase); if (new_filebase == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -182,8 +181,7 @@ return -1; } - if ((buffer = malloc(BUFFER_SIZE)) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((buffer = _GD_Malloc(D, BUFFER_SIZE)) == NULL) { free(new_filebase); dreturn("%i", -1); return -1; @@ -313,9 +311,10 @@ int gd_move(DIRFILE* D, const char* field_code, int new_fragment, int move_data) { - gd_entry_t *E; - char *new_filebase; - int i; + gd_entry_t *E, *Q; + char *new_filebase, *new_code; + char **new_meta = NULL; + int i, dummy; dtrace("%p, \"%s\", %i, %i", D, field_code, new_fragment, move_data); @@ -343,7 +342,7 @@ E = _GD_FindField(D, field_code, D->entry, D->n_entries, NULL); if (E == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, field_code); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, field_code); dreturn("%i", -1); return -1; } @@ -369,6 +368,67 @@ return -1; } + /* Compose the field's new name */ + new_filebase = _GD_DeMungeCode(D->fragment[E->fragment_index].prefix, + D->fragment[E->fragment_index].suffix, E->field); + + if (!new_filebase) { + _GD_InternalError(D); /* the prefix/suffix wasn't found */ + dreturn("%i", -1); + return -1; + } + + new_code = _GD_MungeCode(D, NULL, new_fragment, new_filebase, &dummy); + + if (strcmp(new_code, E->field)) { + /* duplicate check */ + Q = _GD_FindField(D, new_code, D->entry, D->n_entries, NULL); + + if (Q) { + _GD_SetError(D, GD_E_DUPLICATE, 0, NULL, 0, new_code); + free(new_filebase); + dreturn("%i", -1); + return -1; + } + + /* compose all the new meta field names. We must do this now in + * a temporary location in case it fails and/or subsequent stuff fails */ + if (E->e->n_meta > 0) { + int nlen = strlen(new_code); + int olen = strlen(E->field); + new_meta = _GD_Malloc(D, sizeof(char *) * E->e->n_meta); + if (!new_meta) { + free(new_filebase); + free(new_code); + dreturn("%i", -1); + return -1; + } + + memset(new_meta, 0, sizeof(char *) * E->e->n_meta); + for (i = 0; i < E->e->n_meta; ++i) { + new_meta[i] = _GD_Malloc(D, + strlen(E->e->p.meta_entry[i]->field) + nlen - olen + 1); + if (new_meta[i] == NULL) + break; + sprintf(new_meta[i], "%s/%s", new_code, + E->e->p.meta_entry[i]->field + olen + 1); + } + + if (D->error) { + for (i = 0; i < E->e->n_meta; ++i) + free(new_meta[i]); + free(new_meta); + free(new_filebase); + free(new_code); + dreturn("%i", -1); + return -1; + } + } + } else { + free(new_code); + new_code = NULL; + } + if (move_data && E->field_type == GD_RAW_ENTRY && (D->fragment[E->fragment_index].encoding != D->fragment[new_fragment].encoding || @@ -379,22 +439,22 @@ strcmpnull(D->fragment[E->fragment_index].sname, D->fragment[new_fragment].sname))) { - new_filebase = strdup(E->field); - if (new_filebase == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - dreturn("%i", -1); - return -1; - } - if (_GD_MogrifyFile(D, E, D->fragment[new_fragment].encoding, D->fragment[new_fragment].byte_sex, D->fragment[new_fragment].frame_offset, 1, new_fragment, new_filebase)) { + if (new_meta) { + for (i = 0; i < E->e->n_meta; ++i) + free(new_meta[i]); + free(new_meta); + } + free(new_code); dreturn("%i", -1); return -1; } - } + } else + free(new_filebase); /* nothing from now on may fail */ D->fragment[E->fragment_index].modified = 1; @@ -403,9 +463,24 @@ E->fragment_index = new_fragment; /* update meta fields */ - for (i = 0; i < E->e->n_meta; ++i) + for (i = 0; i < E->e->n_meta; ++i) { E->e->p.meta_entry[i]->fragment_index = new_fragment; + if (new_meta) { + free(E->e->p.meta_entry[i]->field); + E->e->p.meta_entry[i]->field = new_meta[i]; + } + } + if (new_code) { + free(new_meta); + free(E->field); + E->field = new_code; + + /* resort */ + qsort(D->entry, D->n_entries, sizeof(gd_entry_t*), _GD_EntryCmp); + qsort(D->dot_list, D->n_dot, sizeof(gd_entry_t*), _GD_EntryCmp); + } + dreturn("%i", 0); return 0; } Modified: trunk/getdata/src/name.c =================================================================== --- trunk/getdata/src/name.c 2011-12-10 02:09:23 UTC (rev 634) +++ trunk/getdata/src/name.c 2011-12-11 23:35:07 UTC (rev 635) @@ -138,7 +138,7 @@ { gd_entry_t *E, *Q; char* name; - int offset, new_dot, old_dot = 0; + int new_dot, old_dot = 0; unsigned int dot_ind; dtrace("%p, \"%s\", \"%s\", %i", D, old_code, new_name, move_data); @@ -165,7 +165,7 @@ E = _GD_FindField(D, old_code, D->entry, D->n_entries, NULL); if (E == NULL) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, old_code); + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_MISSING, NULL, 0, old_code); dreturn("%i", -1); return -1; } @@ -184,22 +184,34 @@ return -1; } - name = _GD_MungeCode(D, E->e->p.parent, E->fragment_index, new_name, &offset); - if (name == NULL) { + if (_GD_ValidateField(new_name, D->standards, 1, 0, &new_dot)) { + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_INVALID, NULL, 0, new_name); dreturn("%i", -1); return -1; } - if (_GD_ValidateField(name + offset, D->standards, 1, 0, &new_dot)) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, new_name); - dreturn("%i", -1); - return -1; + if (E->e->n_meta == -1) { + name = _GD_Malloc(D, strlen(E->e->p.parent->field) + strlen(new_name) + 2); + if (name == NULL) { + dreturn("%i", -1); + return -1; + } + sprintf("%s/%s", E->e->p.parent->field, new_name); + } else { + name = _GD_DeMungeCode(D->fragment[E->fragment_index].prefix, + D->fragment[E->fragment_index].suffix, new_name); + if (name == NULL) { + _GD_SetError(D, GD_E_BAD_CODE, GD_E_CODE_INVALID, NULL, 0, new_name); + dreturn("%i", -1); + return -1; + } } /* Duplicate check */ Q = _GD_FindField(D, name, D->entry, ... [truncated message content] |
From: <ket...@us...> - 2011-12-10 02:09:33
|
Revision: 634 http://getdata.svn.sourceforge.net/getdata/?rev=634&view=rev Author: ketiltrout Date: 2011-12-10 02:09:23 +0000 (Sat, 10 Dec 2011) Log Message: ----------- * /INCLUDE name mungeing. This involved dumping the old, easily broken filename based include file detector for a simple recursion counter. * fixed a couple of bugs in the tokeniser dealing with escapes. * fixed a couple of bugs in the fragment writer involving insufficient escaping of tokens * correctly determine DSV after being confused by the new DSV version scoping. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/TODO trunk/getdata/src/add.c trunk/getdata/src/common.c trunk/getdata/src/compat.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/getdata.c trunk/getdata/src/include.c trunk/getdata/src/internal.h trunk/getdata/src/name.c trunk/getdata/src/native.c trunk/getdata/src/open.c trunk/getdata/src/parse.c trunk/getdata/src/putdata.c trunk/getdata/src/slim.c trunk/getdata/src/spf.c trunk/getdata/test/Makefile.am trunk/getdata/test/add_code.c trunk/getdata/test/add_format.c trunk/getdata/test/add_invalid.c trunk/getdata/test/add_scalar.c trunk/getdata/test/add_scalar_carray.c trunk/getdata/test/add_sort.c trunk/getdata/test/add_type.c trunk/getdata/test/bzip_get_get.c trunk/getdata/test/flush_spec.c trunk/getdata/test/madd.c trunk/getdata/test/put_carray.c trunk/getdata/test/test.h trunk/getdata/test/version_6_write.c trunk/getdata/test/version_8_strict.c Added Paths: ----------- trunk/getdata/test/get_phase_affix.c trunk/getdata/test/parse_include_loop.c trunk/getdata/test/parse_include_prefix.c trunk/getdata/test/parse_include_prefix_dup.c trunk/getdata/test/parse_include_preprefix.c trunk/getdata/test/parse_include_suffix.c trunk/getdata/test/parse_include_sufsuffix.c trunk/getdata/test/version_9.c trunk/getdata/test/version_9_strict.c trunk/getdata/test/version_9_write.c Property Changed: ---------------- trunk/getdata/test/ Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/ChangeLog 2011-12-10 02:09:23 UTC (rev 634) @@ -1,3 +1,71 @@ +2011-12-09 D. V. Wiebe <ge...@ke...> svn:635 + * test/parse_include_preprefix.c test/version_9_strict.c test/version_9.c + test/parse_include_suffix.c test/parse_include_loop.c test/version_9_write.c + test/parse_include_sufsuffix.c test/parse_include_prefix.c + test/parse_include_prefix_dup.c test/get_phase_affix.c: Added. + + * test/add_sort.c test/add_scalar_carray.c test/add_code.c test/add_type.c + test/add_invalid.c test/put_carray.c test/add_scalar.c test/madd.c + test/add_format.c: Remove dirfile before starting. + + * test/version_8_strict.c: Fix initialisation. + + * test/version_6_write.c: Test whitespace in field names. + + * test/test.h: Armour plate macros. + + * src/internal.h: Add prefix and suffix to gd_fragment_t. + * src/name.c (_GD_MungeCode) src/flush.c (_GD_DeMungeCode) src/include.c + (_GD_SetFieldAffixes): Added. + * src/flush.c (_GD_StringEscapeise): Handle null tokens. Escape spaces + rather than assuming the caller will quote the token (which it wasn't + doing). + * src/entry.c (_GD_GetScalar) src/name.c (gd_rename) src/add.c (_GD_Add) + src/commonc. (_GD_BadInput): Munge field code before use. + * src/flush.c (_GD_PadField): Demunge field code before writing. + * src/flush.c (_GD_WriteConst): Properly demunge and escapeise scalar names. + * src/name.c (_GD_ValidateField): This function no longer takes care of + malloc'ing. Modified to return integer true on error. + * src/name.c (_GD_FlushFragment): Add prefix and suffix to INCLUDE when + present. + * src/parse.c (_GD_ParseRaw _GD_ParseLincom _GD_ParseLinterp + _GD_ParseMultiply _GD_ParseRecip _GD_ParseLincom _GD_ParseWindow + _GD_ParseDivide _GD_ParseBit _GD_ParsePhase _GD_ParsePolynom _GD_ParseConst + _GD_ParseCarray _GD_ParseString): Munge field code on parsing. + * include.c (_GD_Include): Handle affixes. + + * src/common.c (_GD_EntryCmp): Moved from src/internal.h and deinlined, + destatickified. Given that the only use of this function is to pass it to + qsort, making it static inline only ensured that it got replaced once per + translation unit that referred to it. + + * include.c (_GD_Include): Replaced the old filename comparison stage with a + simple recursion counter. + + * src/parse.c (_GD_Tokenise): Handle token-initial escaped character. + Handle "\[ux#]##\...". + + * src/flush.c (_GD_FindVersion): Prefix or suffix implies DSV >= 9. + + * src/parse.c (_GD_SetScalar): Handle bad malloc. + + * src/name.c (_GD_FieldSpec): Properly escapeise input field codes. + + * src/errors.c: Distinguish GD_E_RECURSE_CODE from GD_E_RECURSE_INCLUDE. + + * src/internal.h (_GD_Malloc _GD_Realloc _GD_Strdup): Added. + * src/commonc. (_GD_MakeFullPath): Set error if requested. + * src/common.c (_GD_MakeFullPathOnly): Added. This is a wrapper around + _GD_MakeFullPath which ensures the DIRFILE is not modified. Used by the + compatibility functions and the slim encoding framework (ie. things that have + at best a tenuous connection to the DIRFILE object). + + * src/internal.h: Define GD_MULTISTANDARD. + * src/include.c (_GD_Include): Set GD_MULTISTANDARD if moving into/out of + DSV >= 9. + * src/open.c (gd_cbopen): If the metadata contain multiple standards, figure + out a single one for the whole dirfile. + 2011-12-08 D. V. Wiebe <ge...@ke...> svn:633 * test/svlist_hidden.c test/svlist_meta_hidden.c test/hide.c test/flist_hidden.c test/nfields_hidden.c test/parse_version_89.c Modified: trunk/getdata/TODO =================================================================== --- trunk/getdata/TODO 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/TODO 2011-12-10 02:09:23 UTC (rev 634) @@ -3,5 +3,4 @@ * linterp table path munging [MH] * Make webpage suck less -* INCLUDE name munging [RW/MT] * aliasing [MT] Modified: trunk/getdata/src/add.c =================================================================== --- trunk/getdata/src/add.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/add.c 2011-12-10 02:09:23 UTC (rev 634) @@ -24,7 +24,7 @@ static int _GD_Add(DIRFILE* D, const gd_entry_t* entry, const char* parent) { char *temp_buffer; - int i, is_dot; + int i, is_dot, offset; int copy_scalar[GD_MAX_POLYORD + 1]; void* new_list; void* new_ref = NULL; @@ -78,14 +78,14 @@ return -1; } - temp_buffer = (char *)malloc(strlen(parent) + strlen(entry->field) + 2); + temp_buffer = (char *)_GD_Malloc(D, strlen(parent) + strlen(entry->field) + + 2); if (temp_buffer) strcat(strcat(strcpy(temp_buffer, parent), "/"), entry->field); } else - temp_buffer = strdup(entry->field); + temp_buffer = _GD_Strdup(D, entry->field); if (temp_buffer == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -124,9 +124,8 @@ } /* New entry */ - E = (gd_entry_t *)malloc(sizeof(gd_entry_t)); + E = (gd_entry_t *)_GD_Malloc(D, sizeof(gd_entry_t)); if (E == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -136,28 +135,28 @@ else E->fragment_index = entry->fragment_index; - E->e = (struct _gd_private_entry *)malloc(sizeof(struct _gd_private_entry)); + E->e = (struct _gd_private_entry *)_GD_Malloc(D, + sizeof(struct _gd_private_entry)); if (E->e == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); free(E); dreturn("%i", -1); return -1; } memset(E->e, 0, sizeof(struct _gd_private_entry)); E->e->calculated = 0; - - /* Validate field code */ E->field_type = entry->field_type; - E->field = _GD_ValidateField(P, entry->field, D->standards, 1, &is_dot); - if (E->field == entry->field) { - _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, entry->field); - E->field = NULL; + /* Apply prefix and suffix */ + E->field = _GD_MungeCode(D, P, entry->fragment_index, entry->field, &offset); + if (E->field == NULL) { _GD_FreeE(D, E, 1); dreturn("%i", -1); return -1; - } else if (E->field == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + } + + /* Check */ + if (_GD_ValidateField(E->field + offset, D->standards, 1, 0, &is_dot)) { + _GD_SetError(D, GD_E_BAD_CODE, 0, NULL, 0, entry->field); _GD_FreeE(D, E, 1); dreturn("%i", -1); return -1; @@ -194,10 +193,8 @@ 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; - if ((E->e->u.raw.filebase = strdup(E->field)) == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + if ((E->e->u.raw.filebase = _GD_Strdup(D, E->field)) == NULL) break; - } if ((E->EN(raw,spf) = entry->EN(raw,spf)) == 0) _GD_SetError(D, GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_SPF, NULL, @@ -211,9 +208,7 @@ ; } else if (D->fragment[E->fragment_index].ref_name == NULL) { /* This is the first raw field in this fragment */ - new_ref = strdup(E->field); - if (new_ref == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + new_ref = _GD_Strdup(D, E->field); } copy_scalar[0] = 1; break; @@ -250,8 +245,7 @@ } for (i = 0; i < E->EN(lincom,n_fields); ++i) { - if ((E->in_fields[i] = strdup(entry->in_fields[i])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + E->in_fields[i] = _GD_Strdup(D, entry->in_fields[i]); copy_scalar[i] = copy_scalar[i + GD_MAX_LINCOM] = 1; } } @@ -259,24 +253,16 @@ case GD_LINTERP_ENTRY: E->e->u.linterp.table_len = -1; - if ((E->in_fields[0] = strdup(entry->in_fields[0])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - else if ((E->EN(linterp,table) = strdup(entry->EN(linterp,table))) - == NULL) - { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - } + E->in_fields[0] = _GD_Strdup(D, entry->in_fields[0]); + E->EN(linterp,table) = _GD_Strdup(D, entry->EN(linterp,table)); break; case GD_MULTIPLY_ENTRY: case GD_DIVIDE_ENTRY: - if ((E->in_fields[0] = strdup(entry->in_fields[0])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - else if ((E->in_fields[1] = strdup(entry->in_fields[1])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + E->in_fields[0] = _GD_Strdup(D, entry->in_fields[0]); + E->in_fields[1] = _GD_Strdup(D, entry->in_fields[1]); break; case GD_RECIP_ENTRY: - if ((E->in_fields[0] = strdup(entry->in_fields[0])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + E->in_fields[0] = _GD_Strdup(D, entry->in_fields[0]); copy_scalar[0] = 1; if (entry->comp_scal) { @@ -294,9 +280,8 @@ E->EN(bit,numbits) = entry->EN(bit,numbits); E->EN(bit,bitnum) = entry->EN(bit,bitnum); - if ((E->in_fields[0] = strdup(entry->in_fields[0])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - else if (E->EN(bit,numbits) < 1) + E->in_fields[0] = _GD_Strdup(D, entry->in_fields[0]); + if (E->EN(bit,numbits) < 1) _GD_SetError(D, GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_NUMBITS, NULL, entry->EN(bit,numbits), NULL); else if (E->EN(bit,bitnum) < 0) @@ -310,19 +295,16 @@ case GD_PHASE_ENTRY: E->EN(phase,shift) = entry->EN(phase,shift); - if ((E->in_fields[0] = strdup(entry->in_fields[0])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + E->in_fields[0] = _GD_Strdup(D, entry->in_fields[0]); copy_scalar[0] = 1; break; case GD_WINDOW_ENTRY: E->EN(window,windop) = entry->EN(window,windop); E->EN(window,threshold) = entry->EN(window,threshold); - if ((E->in_fields[0] = strdup(entry->in_fields[0])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - else if ((E->in_fields[1] = strdup(entry->in_fields[1])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - else if (_GD_BadWindop(E->EN(window,windop))) + E->in_fields[0] = _GD_Strdup(D, entry->in_fields[0]); + E->in_fields[1] = _GD_Strdup(D, entry->in_fields[1]); + if (_GD_BadWindop(E->EN(window,windop))) _GD_SetError(D, GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_WINDOP, NULL, entry->EN(window,windop), NULL); copy_scalar[0] = 1; @@ -337,10 +319,9 @@ _GD_SetError(D, GD_E_BAD_TYPE, E->EN(scalar,const_type), NULL, 0, NULL); } else { size_t size = GD_SIZE(_GD_ConstType(D, E->EN(scalar,const_type))); - E->e->u.scalar.d = malloc(size); - if (!D->error && E->e->u.scalar.d == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - else + if (!D->error) + E->e->u.scalar.d = _GD_Malloc(D, size); + if (E->e->u.scalar.d) memset(E->e->u.scalar.d, 0, size); } break; @@ -357,17 +338,14 @@ else { size_t size = GD_SIZE(_GD_ConstType(D, E->EN(scalar,const_type))) * E->EN(scalar,array_len); - E->e->u.scalar.d = malloc(size); - if (!D->error && E->e->u.scalar.d == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - else + if (!D->error) + E->e->u.scalar.d = _GD_Malloc(D, size); + if (E->e->u.scalar.d) memset(E->e->u.scalar.d, 0, size); } break; case GD_STRING_ENTRY: - E->e->u.string = strdup(""); - if (E->e->u.string == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + E->e->u.string = _GD_Strdup(D, ""); break; case GD_POLYNOM_ENTRY: E->EN(polynom,poly_ord) = entry->EN(polynom,poly_ord); @@ -397,8 +375,7 @@ E->comp_scal = 0; } - if ((E->in_fields[0] = strdup(entry->in_fields[0])) == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + E->in_fields[0] = _GD_Strdup(D, entry->in_fields[0]); } for (i = 0; i < E->EN(polynom,poly_ord); ++i) @@ -415,10 +392,8 @@ if (!copy_scalar[i] || entry->scalar[i] == NULL) E->scalar[i] = NULL; else { - E->scalar[i] = strdup(entry->scalar[i]); + E->scalar[i] = _GD_Strdup(D, entry->scalar[i]); E->scalar_ind[i] = entry->scalar_ind[i]; - if (E->scalar[i] == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); } } @@ -494,7 +469,7 @@ /* add the entry to the dot list, if needed */ if (is_dot) { D->dot_list[D->n_dot++] = E; - qsort(D->dot_list, D->n_dot, sizeof(gd_entry_t*), entry_cmp); + qsort(D->dot_list, D->n_dot, sizeof(gd_entry_t*), _GD_EntryCmp); } /* add the entry and resort the entry list */ @@ -1748,9 +1723,8 @@ /* Actually store the string, now */ if (!error) { - buffer = (char *)malloc(strlen(parent) + strlen(field_code) + 2); + buffer = (char *)_GD_Malloc(D, strlen(parent) + strlen(field_code) + 2); if (buffer == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -1798,9 +1772,8 @@ /* Actually store the constant, now */ if (!error) { - buffer = (char *)malloc(strlen(parent) + strlen(field_code) + 2); + buffer = (char *)_GD_Malloc(D, strlen(parent) + strlen(field_code) + 2); if (buffer == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } @@ -1850,9 +1823,8 @@ /* Actually store the carray, now */ if (!error) { - buffer = (char *)malloc(strlen(parent) + strlen(field_code) + 2); + buffer = (char *)_GD_Malloc(D, strlen(parent) + strlen(field_code) + 2); if (buffer == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } Modified: trunk/getdata/src/common.c =================================================================== --- trunk/getdata/src/common.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/common.c 2011-12-10 02:09:23 UTC (rev 634) @@ -31,6 +31,11 @@ char gd_debug_col[GD_COL_SIZE + 1] = ""; #endif +int _GD_EntryCmp(const void *a, const void *b) +{ + return strcmp((*(gd_entry_t**)a)->field, (*(gd_entry_t**)b)->field); +} + /* _GD_GetLine: read non-comment line from format file. The line is newly * malloc'd. Returns a pointer if successful, NULL if unsuccessful. * The length read is provided in *n. Increments *linenum as appropriate; @@ -164,11 +169,8 @@ return NULL; } - ptr = malloc(n * GD_SIZE(type)); + ptr = _GD_Malloc(D, n * GD_SIZE(type)); - if (ptr == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - dreturn("%p", ptr); return ptr; } @@ -183,18 +185,16 @@ e->u.linterp.table_dirfd = _GD_GrabDir(D, D->fragment[E->fragment_index].dirfd, E->EN(linterp,table)); - temp_buffer = strdup(E->EN(linterp,table)); + temp_buffer = _GD_Strdup(D, E->EN(linterp,table)); if (temp_buffer == NULL) { _GD_ReleaseDir(D, e->u.linterp.table_dirfd); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", 1); return 1; } - e->u.linterp.table_file = strdup(basename(temp_buffer)); + e->u.linterp.table_file = _GD_Strdup(D, basename(temp_buffer)); if (e->u.linterp.table_file == NULL) { _GD_ReleaseDir(D, e->u.linterp.table_dirfd); free(temp_buffer); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", 1); return 1; } @@ -269,11 +269,10 @@ return; } - E->e->u.linterp.lut = (struct _gd_lut *)malloc(buf_len * + E->e->u.linterp.lut = (struct _gd_lut *)_GD_Malloc(D, buf_len * sizeof(struct _gd_lut)); if (E->e->u.linterp.lut == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); fclose(fp); dreturnvoid(); return; @@ -301,12 +300,11 @@ i++; if (i >= buf_len) { buf_len += 100; - ptr = (struct _gd_lut *)realloc(E->e->u.linterp.lut, buf_len * + ptr = (struct _gd_lut *)_GD_Realloc(D, E->e->u.linterp.lut, buf_len * sizeof(struct _gd_lut)); if (ptr == NULL) { free(E->e->u.linterp.lut); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); fclose(fp); dreturnvoid(); return; @@ -327,12 +325,11 @@ } /* Free unused memory */ - ptr = (struct _gd_lut *)realloc(E->e->u.linterp.lut, i + ptr = (struct _gd_lut *)_GD_Realloc(D, E->e->u.linterp.lut, i * sizeof(struct _gd_lut)); if (ptr == NULL) { free(E->e->u.linterp.lut); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); fclose(fp); dreturnvoid(); return; @@ -804,10 +801,8 @@ } /* make a copy of the field code without the representation */ - *field_code = strdup(field_code_in); - if (*field_code == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - else + *field_code = _GD_Strdup(D, field_code_in); + if (*field_code) (*field_code)[field_code_len - 2] = '\0'; } @@ -818,21 +813,28 @@ /* Ensure that an input field has been identified (with error checking) */ int _GD_BadInput(DIRFILE* D, gd_entry_t* E, int i) { - char* code; + char *code, *munged_code; + int offset; dtrace("%p, %p, %i", D, E, i); if (E->e->entry[i] == NULL) { - E->e->entry[i] = _GD_FindFieldAndRepr(D, E->in_fields[i], &code, - &E->e->repr[i], NULL, 1); + munged_code = _GD_MungeCode(D, NULL, E->fragment_index, E->in_fields[i], + &offset); + if (munged_code) + E->e->entry[i] = _GD_FindFieldAndRepr(D, munged_code, &code, + &E->e->repr[i], NULL, 1); if (D->error) { + free(munged_code); dreturn("%i", 1); return 1; } - if (code != E->in_fields[i]) + if (code != munged_code) free(code); + + free(munged_code); } /* scalar entries not allowed */ @@ -1173,11 +1175,11 @@ return res; } -char *_GD_MakeFullPath(const DIRFILE *D, int dirfd, const char *name) +char *_GD_MakeFullPath(DIRFILE *D, int dirfd, const char *name, int seterr) { const char *dir; char *filepath; - dtrace("%p, %i, \"%s\"", D, dirfd, name); + dtrace("%p, %i, \"%s\", %i", D, dirfd, name, seterr); if (dirfd >= 0) { dir = _GD_DirName(D, dirfd); @@ -1190,10 +1192,39 @@ filepath = _GD_CanonicalPath(dir, name); + if (seterr && filepath == NULL) { + if (errno == ENOMEM) + _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + else { + /* a last ditch attempt */ + if (dir) { + filepath = (char*)_GD_Malloc(D, strlen(dir) + strlen(name) + 2); + if (filepath) + sprintf(filepath, "%s/%s", dir, name); + } else + filepath = _GD_Strdup(D, name); + } + } + dreturn("\"%s\"", filepath); return filepath; } +char *_GD_MakeFullPathOnly(const DIRFILE *D, int dirfd, const char *name) +{ + char *filepath; + + dtrace("%p, %i, \"%s\"", D, dirfd, name); + + /* although we cast away the constness, seterr=0 ensures nothing gets + * modified + */ + filepath = _GD_MakeFullPath((DIRFILE*)D, dirfd, name, 0); + + dreturn("\"%s\"", filepath); + return filepath; +} + int _GD_GrabDir(DIRFILE *D, int dirfd, const char *name) { unsigned int i; @@ -1203,10 +1234,9 @@ dtrace("%p, %i, \"%s\"", D, dirfd, name); - path = _GD_MakeFullPath(D, dirfd, name); + path = _GD_MakeFullPath(D, dirfd, name, 1); if (path == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } Modified: trunk/getdata/src/compat.c =================================================================== --- trunk/getdata/src/compat.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/compat.c 2011-12-10 02:09:23 UTC (rev 634) @@ -48,7 +48,7 @@ dtrace("%p, %i, \"%s\", %x, 0%o", D, dirfd, name, flags, mode); - path = _GD_MakeFullPath(D, dirfd, name); + path = _GD_MakeFullPathOnly(D, dirfd, name); ret = open(path, flags | O_BINARY, mode); free(path); @@ -66,7 +66,7 @@ dtrace("%p, %i, \"%s\", %i, \"%s\"", D, olddirfd, oldname, newdirfd, newname); - newpath = _GD_MakeFullPath(D, newdirfd, newname); + newpath = _GD_MakeFullPathOnly(D, newdirfd, newname); #ifdef __MSVCRT__ if (unlink(newpath)) { if (errno != ENOENT) { @@ -77,7 +77,7 @@ } #endif - oldpath = _GD_MakeFullPath(D, olddirfd, oldname); + oldpath = _GD_MakeFullPathOnly(D, olddirfd, oldname); ret = rename(oldpath, newpath); free(newpath); free(oldpath); @@ -96,7 +96,7 @@ dtrace("%p, %i, \"%s\", %p, %x", D, dirfd, name, buf, flags); - path = _GD_MakeFullPath(D, dirfd, name); + path = _GD_MakeFullPathOnly(D, dirfd, name); #ifdef HAVE_LSTAT if (flags & AT_SYMLINK_NOFOLLOW) ret = lstat(path, buf); @@ -119,7 +119,7 @@ dtrace("%p, %i, \"%s\", %p, <unused>", D, dirfd, name, buf); - path = _GD_MakeFullPath(D, dirfd, name); + path = _GD_MakeFullPathOnly(D, dirfd, name); ret = gd_stat64(path, buf); free(path); @@ -137,7 +137,7 @@ dtrace("%p, %i, \"%s\", <unused>", D, dirfd, name); - path = _GD_MakeFullPath(D, dirfd, name); + path = _GD_MakeFullPathOnly(D, dirfd, name); ret = unlink(path); free(path); Modified: trunk/getdata/src/entry.c =================================================================== --- trunk/getdata/src/entry.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/entry.c 2011-12-10 02:09:23 UTC (rev 634) @@ -134,18 +134,21 @@ void* data) { void *ptr = NULL; - gd_entry_t* C; - int repr; - char* field_code; + gd_entry_t* C = NULL; + int repr, offset; + char* field_code, *munged_code; const char* scalar = E->scalar[i]; int index = E->scalar_ind[i]; dtrace("%p, %p, %i, %i, %p", D, E, i, type, data); if (scalar != NULL) { - C = _GD_FindFieldAndRepr(D, scalar, &field_code, &repr, NULL, 0); + munged_code = _GD_MungeCode(D, NULL, E->fragment_index, scalar, &offset); + if (munged_code) + C = _GD_FindFieldAndRepr(D, munged_code, &field_code, &repr, NULL, 0); if (D->error) { + free(munged_code); dreturnvoid(); return; } @@ -163,12 +166,9 @@ E->scalar_ind[i] = -1; } - if ((D->flags & GD_ACCMODE) == GD_RDWR) { - ptr = realloc(C->e->u.scalar.client, (C->e->u.scalar.n_client + 1) * - sizeof(gd_entry_t*)); - if (ptr == NULL) - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - } + if ((D->flags & GD_ACCMODE) == GD_RDWR) + ptr = _GD_Realloc(D, C->e->u.scalar.client, + (C->e->u.scalar.n_client + 1) * sizeof(gd_entry_t*)); _GD_DoField(D, C, repr, index, 1, type, data); @@ -178,8 +178,10 @@ } } - if (field_code != scalar) + if (field_code != munged_code) free(field_code); + + free(munged_code); } dreturnvoid(); @@ -327,12 +329,7 @@ } filename = _GD_MakeFullPath(D, D->fragment[E->fragment_index].dirfd, - E->e->u.raw.file->name); - if (filename == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); - dreturn("%p", NULL); - return NULL; - } + E->e->u.raw.file->name, 1); dreturn("%p", filename); return filename; Modified: trunk/getdata/src/errors.c =================================================================== --- trunk/getdata/src/errors.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/errors.c 2011-12-10 02:09:23 UTC (rev 634) @@ -86,7 +86,7 @@ { GD_E_BAD_CODE, 0, "Field not found: {4}", 0 }, /* GD_E_BAD_TYPE: 1 = data type */ { GD_E_BAD_TYPE, 0, "Unsupported data type: {1}", 0 }, - /* GD_E_RAW_IO: 1 = suberror, 2 = filename, 3 = errno */ + /* GD_E_RAW_IO: 2 = filename, 3 = errno */ { GD_E_RAW_IO, 0, "Error accessing {2}: ", 1 }, /* GD_E_OPEN_FRAGMENT: 1 = errno, 2 = format file, 3 = line, 4 = includefile*/ { GD_E_OPEN_FRAGMENT, 0, @@ -102,8 +102,11 @@ /* GD_E_OPEN_LINFILE: 1 = suberror, 2 = errno, 4 = lutfile */ { GD_E_OPEN_LINFILE, GD_E_LINFILE_LENGTH, "LINTERP table {4} too short", 0 }, { GD_E_OPEN_LINFILE, 0, "Error opening LINTERP table {4}: ", 2 }, - /* GD_E_RECURSE_LEVEL: 4 = fieldcode */ - { GD_E_RECURSE_LEVEL, 0, "Recursion too deep resolving field {4}", 0 }, + /* GD_E_RECURSE_LEVEL: 2 = file; 3 = line; 4 = name */ + { GD_E_RECURSE_LEVEL, GD_E_RECURSE_CODE, + "Recursion too deep resolving field {4}", 0 }, + { GD_E_RECURSE_LEVEL, GD_E_RECURSE_INCLUDE, + "Recursion too deep including {4} on line {3} of {2}", 0 }, /* GD_E_BAD_DIRFILE: (nothing) */ { GD_E_BAD_DIRFILE, 0, "Invalid dirfile", 0 }, /* GD_E_BAD_FIELD_TYPE: 4 = fieldcode */ Modified: trunk/getdata/src/flimits.c =================================================================== --- trunk/getdata/src/flimits.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/flimits.c 2011-12-10 02:09:23 UTC (rev 634) @@ -36,11 +36,10 @@ } if (move && offset != D->fragment[fragment].frame_offset) { - gd_entry_t **raw_entry = (gd_entry_t **)malloc(sizeof(gd_entry_t*) * + gd_entry_t **raw_entry = (gd_entry_t **)_GD_Malloc(D, sizeof(gd_entry_t*) * D->n_entries); if (raw_entry == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturnvoid(); return; } @@ -180,7 +179,7 @@ dtrace("%p, %p, \"%s\", %p", D, E, parent, is_index); if (++D->recurse_level >= GD_MAX_RECURSE_LEVEL) { - _GD_SetError(D, GD_E_RECURSE_LEVEL, 0, NULL, 0, E->field); + _GD_SetError(D, GD_E_RECURSE_LEVEL, GD_E_RECURSE_CODE, NULL, 0, E->field); D->recurse_level--; dreturn("%i ?", -1); return -1; @@ -395,7 +394,7 @@ dtrace("%p, %p, \"%s\", %p, %p", D, E, parent, spf, ds); if (++D->recurse_level >= GD_MAX_RECURSE_LEVEL) { - _GD_SetError(D, GD_E_RECURSE_LEVEL, 0, NULL, 0, E->field); + _GD_SetError(D, GD_E_RECURSE_LEVEL, GD_E_RECURSE_CODE, NULL, 0, E->field); D->recurse_level--; dreturn("%i", -1); return -1; Modified: trunk/getdata/src/flush.c =================================================================== --- trunk/getdata/src/flush.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/flush.c 2011-12-10 02:09:23 UTC (rev 634) @@ -22,6 +22,51 @@ #define GD_MAX_PRETTY_FIELD_WIDTH 80 +/* remove the prefix and suffix from a field code */ +static char *_GD_DeMungeCode(const char *prefix, const char *suffix, + const char *code) +{ + size_t i, len, slen; + char *ptr; + + dtrace("\"%s\", \"%s\", \"%s\"", prefix, suffix, code); + + if (code == NULL) { + dreturn("%p", NULL); + return NULL; + } + + /* Verify the prefix is present */ + if (prefix) { + for (i = 0; prefix[i]; ++i) { + if (prefix[i] != code[i]) { + /* prefix missing */ + dreturn("%p", NULL); + return NULL; + } + } + ptr = strdup(code + i); + } else + ptr = strdup(code); + + /* Verify the suffix is present */ + if (suffix) { + len = strlen(ptr); + slen = strlen(suffix); + for (i = 0; i < slen; ++i) { + if (suffix[i] != ptr[len - slen + i]) { + /* suffix missing */ + dreturn("%p", NULL); + return NULL; + } + } + ptr[len - slen] = '\0'; + } + + dreturn("\"%s\"", ptr); + return ptr; +} + void _GD_Flush(DIRFILE* D, gd_entry_t *E, int clo) { int i; @@ -29,7 +74,7 @@ dtrace("%p, %p, %i", D, E, clo); if (++D->recurse_level >= GD_MAX_RECURSE_LEVEL) { - _GD_SetError(D, GD_E_RECURSE_LEVEL, 0, NULL, 0, E->field); + _GD_SetError(D, GD_E_RECURSE_LEVEL, GD_E_RECURSE_CODE, NULL, 0, E->field); D->recurse_level--; dreturnvoid(); return; @@ -222,6 +267,12 @@ dtrace("%p, \"%s\", %i, %i", stream, in, permissive, standards); + if (in == NULL || in[0] == '\0') { + fputs("\"\"", stream); + dreturn("%zu", 2); + return 2; + } + if (!permissive && standards < 6) { fputs(in, stream); dreturn("%zu", strlen(in)); @@ -233,7 +284,7 @@ fputs("\\\"", stream); len += 2; fputc('\\', stream); - } else if (*in == '\\' || *in == '#' || *in == '"') { + } else if (*in == '\\' || *in == '#' || *in == '"' || *in == ' ') { fputc('\\', stream); fputc(*in, stream); len += 2; @@ -256,31 +307,44 @@ return len; } -static void _GD_PadField(FILE* stream, const char* in, size_t len, - int permissive, int standards) +static void _GD_PadField(FILE* stream, const char *prefix, const char *suffix, + const char* in, size_t len, int permissive, int standards) { size_t i; + char *ptr; - dtrace("%p, \"%s\", %zu, %i, %i", stream, in, len, permissive, standards); + dtrace("%p, \"%s\", \"%s\", \"%s\", %zu, %i, %i", stream, prefix, suffix, in, + len, permissive, standards); - for (i = _GD_StringEscapeise(stream, in, permissive, standards); i < len; ++i) + ptr = _GD_DeMungeCode(prefix, suffix, in); + + for (i = _GD_StringEscapeise(stream, ptr, permissive, standards); i < len; + ++i) + { fputc(' ', stream); + } + free(ptr); dreturnvoid(); } /* Write a litteral parameter or CONST name or CARRAY element */ -static void _GD_WriteConst(DIRFILE *D, FILE* stream, int type, - const void* value, const char* scalar, int index, const char* postamble) +static void _GD_WriteConst(DIRFILE *D, FILE* stream, int me, int permissive, + int type, const void* value, const char* scalar, int index, + const char* postamble) { - dtrace("%p, %p, 0x%X, %p, \"%s\", %i, \"%s\"", D, stream, type, value, scalar, - index, postamble); + dtrace("%p, %p, %i, %i, 0x%X, %p, \"%s\", %i, \"%s\"", D, stream, me, + permissive, type, value, scalar, index, postamble); if (scalar != NULL) { + char *ptr = _GD_DeMungeCode(D->fragment[me].prefix, D->fragment[me].suffix, + scalar); + _GD_StringEscapeise(stream, ptr, permissive, D->standards); if (index == -1) - fprintf(stream, "%s%s", scalar, postamble); + fprintf(stream, "%s", postamble); else - fprintf(stream, "%s<%i>%s", scalar, index, postamble); + fprintf(stream, "<%i>%s", index, postamble); + free(ptr); } else if (type == GD_UINT16) fprintf(stream, "%" PRIu16 "%s", *(uint16_t *)value, postamble); else if (type == GD_UINT64) @@ -302,14 +366,14 @@ /* Write a field specification line */ static void _GD_FieldSpec(DIRFILE* D, FILE* stream, const gd_entry_t* E, - int meta, size_t max_len, int pretty, int permissive) + int me, int meta, size_t max_len, int pretty, int permissive) { int i; size_t z; char *ptr; - dtrace("%p, %p, %p, %i, %zi, %i, %i", D, stream, E, meta, max_len, pretty, - permissive); + dtrace("%p, %p, %p, %i, %i, %zi, %i, %i", D, stream, E, me, meta, max_len, + pretty, permissive); /* INDEX is implicit, and it is an error to define it in the format file */ if (E->field_type == GD_INDEX_ENTRY) { @@ -329,102 +393,128 @@ } /* field name */ - _GD_PadField(stream, ptr, max_len, permissive, D->standards); + _GD_PadField(stream, D->fragment[me].prefix, D->fragment[me].suffix, ptr, + max_len, permissive, D->standards); switch(E->field_type) { case GD_RAW_ENTRY: fprintf(stream, " RAW%s %s ", pretty ? " " : "", (permissive || D->standards >= 5) ? _GD_TypeName(D, E->EN(raw,data_type)) : _GD_OldTypeName(D, E->EN(raw,data_type))); - _GD_WriteConst(D, stream, GD_UINT16, &E->EN(raw,spf), E->scalar[0], - E->scalar_ind[0], "\n"); + _GD_WriteConst(D, stream, me, permissive, GD_UINT16, &E->EN(raw,spf), + E->scalar[0], E->scalar_ind[0], "\n"); break; case GD_LINCOM_ENTRY: fprintf(stream, " LINCOM%s %i", pretty ? " " : "", E->EN(lincom,n_fields)); for (i = 0; i < E->EN(lincom,n_fields); ++i) { - fprintf(stream, " %s ", E->in_fields[i]); + fputc(' ', stream); + _GD_StringEscapeise(stream, E->in_fields[i], permissive, D->standards); + fputc(' ', stream); if (E->comp_scal) { - _GD_WriteConst(D, stream, GD_COMPLEX128, &E->EN(lincom,cm)[i], - E->scalar[i], E->scalar_ind[i], " "); - _GD_WriteConst(D, stream, GD_COMPLEX128, &E->EN(lincom,cb)[i], - E->scalar[i + GD_MAX_LINCOM], E->scalar_ind[i + GD_MAX_LINCOM], - ""); + _GD_WriteConst(D, stream, me, permissive, GD_COMPLEX128, + &E->EN(lincom,cm)[i], E->scalar[i], E->scalar_ind[i], " "); + _GD_WriteConst(D, stream, me, permissive, GD_COMPLEX128, + &E->EN(lincom,cb)[i], E->scalar[i + GD_MAX_LINCOM], + E->scalar_ind[i + GD_MAX_LINCOM], ""); } else { - _GD_WriteConst(D, stream, GD_FLOAT64, &E->EN(lincom,m)[i], - E->scalar[i], E->scalar_ind[i], " "); - _GD_WriteConst(D, stream, GD_FLOAT64, &E->EN(lincom,b)[i], - E->scalar[i + GD_MAX_LINCOM], E->scalar_ind[i + GD_MAX_LINCOM], - ""); + _GD_WriteConst(D, stream, me, permissive, GD_FLOAT64, + &E->EN(lincom,m)[i], E->scalar[i], E->scalar_ind[i], " "); + _GD_WriteConst(D, stream, me, permissive, GD_FLOAT64, + &E->EN(lincom,b)[i], E->scalar[i + GD_MAX_LINCOM], + E->scalar_ind[i + GD_MAX_LINCOM], ""); } } - fputs("\n", stream); + fputc('\n', stream); break; case GD_LINTERP_ENTRY: - fprintf(stream, " LINTERP%s %s %s\n", pretty ? " " : "", E->in_fields[0], - E->EN(linterp,table)); + fprintf(stream, " LINTERP%s ", pretty ? " " : ""); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); + _GD_StringEscapeise(stream, E->EN(linterp,table), permissive, + D->standards); + fputc('\n', stream); break; case GD_BIT_ENTRY: - fprintf(stream, " BIT%s %s ", pretty ? " " : "", E->in_fields[0]); - _GD_WriteConst(D, stream, GD_INT16, &E->EN(bit,bitnum), E->scalar[0], - E->scalar_ind[0], " "); - _GD_WriteConst(D, stream, GD_INT16, &E->EN(bit,numbits), E->scalar[1], - E->scalar_ind[1], "\n"); + fprintf(stream, " BIT%s ", pretty ? " " : ""); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); + _GD_WriteConst(D, stream, me, permissive, GD_INT16, &E->EN(bit,bitnum), + E->scalar[0], E->scalar_ind[0], " "); + _GD_WriteConst(D, stream, me, permissive, GD_INT16, &E->EN(bit,numbits), + E->scalar[1], E->scalar_ind[1], "\n"); break; case GD_DIVIDE_ENTRY: - fprintf(stream, " DIVIDE%s %s %s", pretty ? " " : "", E->in_fields[1], - E->in_fields[0]); + fprintf(stream, " DIVIDE%s ", pretty ? " " : ""); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); + _GD_StringEscapeise(stream, E->in_fields[1], permissive, D->standards); + fputc('\n', stream); break; case GD_RECIP_ENTRY: - fprintf(stream, " RECIP%s %s ", pretty ? " " : "", E->in_fields[0]); - _GD_WriteConst(D, stream, GD_COMPLEX128, &E->EN(recip,cdividend), - E->scalar[0], E->scalar_ind[0], ""); + fprintf(stream, " RECIP%s ", pretty ? " " : ""); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); + _GD_WriteConst(D, stream, me, permissive, GD_COMPLEX128, + &E->EN(recip,cdividend), E->scalar[0], E->scalar_ind[0], "\n"); break; case GD_MULTIPLY_ENTRY: - fprintf(stream, " MULTIPLY %s %s\n", E->in_fields[0], E->in_fields[1]); + fputs(" MULTIPLY ", stream); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); + _GD_StringEscapeise(stream, E->in_fields[1], permissive, D->standards); + fputc('\n', stream); break; case GD_PHASE_ENTRY: - fprintf(stream, " PHASE%s %s ", pretty ? " " : "", E->in_fields[0]); - _GD_WriteConst(D, stream, GD_INT64, &E->EN(phase,shift), E->scalar[0], - E->scalar_ind[0], "\n"); + fprintf(stream, " PHASE%s ", pretty ? " " : ""); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); + _GD_WriteConst(D, stream, me, permissive, GD_INT64, &E->EN(phase,shift), + E->scalar[0], E->scalar_ind[0], "\n"); break; case GD_POLYNOM_ENTRY: - fprintf(stream, " POLYNOM%s %s ", pretty ? " " : "", E->in_fields[0]); + fprintf(stream, " POLYNOM%s ", pretty ? " " : ""); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); for (i = 0; i <= E->EN(polynom,poly_ord); ++i) if (E->comp_scal) - _GD_WriteConst(D, stream, GD_COMPLEX128, &E->EN(polynom,ca)[i], - E->scalar[i], E->scalar_ind[i], (i == E->EN(polynom,poly_ord)) ? - "\n" : " "); + _GD_WriteConst(D, stream, me, permissive, GD_COMPLEX128, + &E->EN(polynom,ca)[i], E->scalar[i], E->scalar_ind[i], + (i == E->EN(polynom,poly_ord)) ? "\n" : " "); else - _GD_WriteConst(D, stream, GD_FLOAT64, &E->EN(polynom,a)[i], - E->scalar[i], E->scalar_ind[i], (i == E->EN(polynom,poly_ord)) ? - "\n" : " "); + _GD_WriteConst(D, stream, me, permissive, GD_FLOAT64, + &E->EN(polynom,a)[i], E->scalar[i], E->scalar_ind[i], + (i == E->EN(polynom,poly_ord)) ? "\n" : " "); break; case GD_SBIT_ENTRY: - fprintf(stream, " SBIT%s %s ", pretty ? " " : "", E->in_fields[0]); - _GD_WriteConst(D, stream, GD_INT16, &E->EN(bit,bitnum), E->scalar[0], - E->scalar_ind[0], " "); - _GD_WriteConst(D, stream, GD_INT16, &E->EN(bit,numbits), E->scalar[1], - E->scalar_ind[1], "\n"); + fprintf(stream, " SBIT%s ", pretty ? " " : ""); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); + _GD_WriteConst(D, stream, me, permissive, GD_INT16, &E->EN(bit,bitnum), + E->scalar[0], E->scalar_ind[0], " "); + _GD_WriteConst(D, stream, me, permissive, GD_INT16, &E->EN(bit,numbits), + E->scalar[1], E->scalar_ind[1], "\n"); break; case GD_WINDOW_ENTRY: - fprintf(stream, " WINDOW%s %s %s %s ", pretty ? " " : "", - E->in_fields[0], E->in_fields[1], - _GD_WindopName(D, E->EN(window,windop))); + fprintf(stream, " WINDOW%s ", pretty ? " " : ""); + _GD_StringEscapeise(stream, E->in_fields[0], permissive, D->standards); + fputc(' ', stream); + _GD_StringEscapeise(stream, E->in_fields[1], permissive, D->standards); + fprintf(stream, " %s ", _GD_WindopName(D, E->EN(window,windop))); switch (E->EN(window,windop)) { case GD_WINDOP_EQ: case GD_WINDOP_NE: - _GD_WriteConst(D, stream, GD_INT64, &E->EN(window,threshold.i), - E->scalar[0], E->scalar_ind[0], ""); + _GD_WriteConst(D, stream, me, permissive, GD_INT64, + &E->EN(window,threshold.i), E->scalar[0], E->scalar_ind[0], "\n"); break; case GD_WINDOP_SET: case GD_WINDOP_CLR: - _GD_WriteConst(D, stream, GD_UINT64, &E->EN(window,threshold.u), - E->scalar[0], E->scalar_ind[0], ""); + _GD_WriteConst(D, stream, me, permissive, GD_UINT64, + &E->EN(window,threshold.u), E->scalar[0], E->scalar_ind[0], "\n"); break; default: - _GD_WriteConst(D, stream, GD_FLOAT64, &E->EN(window,threshold.r), - E->scalar[0], E->scalar_ind[0], ""); + _GD_WriteConst(D, stream, me, permissive, GD_FLOAT64, + &E->EN(window,threshold.r), E->scalar[0], E->scalar_ind[0], "\n"); break; } break; @@ -457,12 +547,12 @@ else for (z = 0; z < E->EN(scalar,array_len); ++z) fprintf(stream, " %" PRIu64, ((uint64_t*)E->e->u.scalar.d)[z]); - fputs("\n", stream); + fputc('\n', stream); break; case GD_STRING_ENTRY: - fprintf(stream, " STRING%s \"", pretty ? " " : ""); + fprintf(stream, " STRING%s ", pretty ? " " : ""); _GD_StringEscapeise(stream, E->e->u.string, permissive, D->standards); - fputs("\"\n", stream); + fputc('\n', stream); break; case GD_INDEX_ENTRY: case GD_NO_ENTRY: @@ -618,17 +708,36 @@ /* The includes */ if (permissive || D->standards >= 3) for (j = 0; j < D->n_fragment; ++j) - if (D->fragment[j].parent == i) - fprintf(stream, "%sINCLUDE %s\n", (D->standards >= 5) ? "/" : "", - D->fragment[j].ename); + if (D->fragment[j].parent == i) { + char *prefix = _GD_DeMungeCode(D->fragment[i].prefix, NULL, + D->fragment[j].prefix); + char *suffix = _GD_DeMungeCode(NULL, D->fragment[i].suffix, + D->fragment[j].suffix); + fprintf(stream, "%sINCLUDE ", (D->standards >= 5) ? "/" : ""); + _GD_StringEscapeise(stream, D->fragment[j].ename, permissive, + D->standards); + if (prefix || suffix) { + fputc(' ', stream); + _GD_StringEscapeise(stream, prefix, permissive, D->standards); + free(prefix); + } + + if (suffix) { + fputc(' ', stream); + _GD_StringEscapeise(stream, suffix, permissive, D->standards); + free(suffix); + } + fputc('\n', stream); + } + /* The fields */ for (u = 0; u < D->n_entries; ++u) if (D->entry[u]->fragment_index == i && D->entry[u]->e->n_meta != -1) { - _GD_FieldSpec(D, stream, D->entry[u], 0, max_len, pretty, permissive); + _GD_FieldSpec(D, stream, D->entry[u], i, 0, max_len, pretty, permissive); if (permissive || D->standards >= 6) for (j = 0; j < D->entry[u]->e->n_meta; ++j) - _GD_FieldSpec(D, stream, D->entry[u]->e->p.meta_entry[j], 1, 0, + _GD_FieldSpec(D, stream, D->entry[u]->e->p.meta_entry[j], i, 1, 0, pretty, permissive); } @@ -652,9 +761,8 @@ /* If no error was encountered, move the temporary file over the * old format file, otherwise abort */ - ptr = strdup(D->fragment[i].cname); + ptr = _GD_Strdup(D, D->fragment[i].cname); if (ptr == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturnvoid(); return; } @@ -834,10 +942,12 @@ D->av &= GD_VERS_GE_3; for (i = 0; D->av && i < (unsigned int)D->n_fragment; ++i) { - /* on an arm-endian platform, the arm flag is set by /ENDIAN directives - * missing an "arm" token, but it's absense might mean either an "arm" - * token was present, or else there was no /ENDIAN directive at all */ - if (D->fragment[i].byte_sex & GD_ARM_FLAG) + if (D->fragment[i].prefix || D->fragment[i].suffix) + D->av &= GD_VERS_GE_9; + else if (D->fragment[i].byte_sex & GD_ARM_FLAG) + /* on an arm-endian platform, the arm flag is set by /ENDIAN directives + * missing an "arm" token, but it's absense might mean either an "arm" + * token was present, or else there was no /ENDIAN directive at all */ #ifdef ARM_ENDIAN_DOUBLES D->av &= GD_VERS_GE_5; #else @@ -863,65 +973,66 @@ for (i = 0; D->av && i < D->n_entries; ++i) { if (D->entry[i]->hidden) D->av &= GD_VERS_GE_9; - - switch (D->entry[i]->field_type) { - case GD_RAW_ENTRY: - switch (D->entry[i]->EN(raw,data_type)) { - case GD_COMPLEX128: - case GD_COMPLEX64: + else + switch (D->entry[i]->field_type) { + case GD_RAW_ENTRY: + switch (D->entry[i]->EN(raw,data_type)) { + case GD_COMPLEX128: + case GD_COMPLEX64: + D->av &= GD_VERS_GE_7; + break; + case GD_INT8: + case GD_INT64: + case GD_UINT64: + D->av &= GD_VERS_GE_5; + break; + default: + break; + } + break; + case GD_DIVIDE_ENTRY: + case GD_RECIP_ENTRY: + case GD_CARRAY_ENTRY: + D->av &= GD_VERS_GE_8; + break; + case GD_MULTIPLY_ENTRY: + D->av &= GD_VERS_GE_2; + break; + case GD_PHASE_ENTRY: + D->av &= GD_VERS_GE_4; + break; + case GD_POLYNOM_ENTRY: + case GD_SBIT_ENTRY: + D->av &= GD_VERS_GE_7; + break; + case GD_CONST_ENTRY: + if (D->entry[i]->EN(scalar,const_type) & GD_COMPLEX128) D->av &= GD_VERS_GE_7; - break; - case GD_INT8: - case GD_INT64: - case GD_UINT64: + else + D->av &= GD_VERS_GE_6; + break; + case GD_STRING_ENTRY: + D->av &= GD_VERS_GE_6; + break; + case GD_BIT_ENTRY: + if (D->entry[i]->EN(bit,numbits) > 1) + D->av &= GD_VERS_GE_1; + else if (D->entry[i]->EN(bit,bitnum) + D->entry[i]->EN(bit,numbits) + - 1 > 32) + { D->av &= GD_VERS_GE_5; - break; - default: - break; - } - break; - case GD_DIVIDE_ENTRY: - case GD_RECIP_ENTRY: - case GD_CARRAY_ENTRY: - D->av &= GD_VERS_GE_8; - break; - case GD_MULTIPLY_ENTRY: - D->av &= GD_VERS_GE_2; - break; - case GD_PHASE_ENTRY: - D->av &= GD_VERS_GE_4; - break; - case GD_POLYNOM_ENTRY: - case GD_SBIT_ENTRY: - D->av &= GD_VERS_GE_7; - break; - case GD_CONST_ENTRY: - if (D->entry[i]->EN(scalar,const_type) & GD_COMPLEX128) - D->av &= GD_VERS_GE_7; - else - D->av &= GD_VERS_GE_6; - break; - case GD_STRING_ENTRY: - D->av &= GD_VERS_GE_6; - break; - case GD_BIT_ENTRY: - if (D->entry[i]->EN(bit,numbits) > 1) - D->av &= GD_VERS_GE_1; - else if (D->entry[i]->EN(bit,bitnum) + D->entry[i]->EN(bit,numbits) - 1 - > 32) - { - D->av &= GD_VERS_GE_5; - } - break; - case GD_WINDOW_ENTRY: - D->av &= GD_VERS_GE_9; - break; - case GD_LINTERP_ENTRY: - case GD_LINCOM_ENTRY: - case GD_INDEX_ENTRY: - case GD_NO_ENTRY: - break; - } + } + break; + case GD_WINDOW_ENTRY: + D->av &= GD_VERS_GE_9; + break; + case GD_LINTERP_ENTRY: + case GD_LINCOM_ENTRY: + case GD_INDEX_ENTRY: + case GD_NO_ENTRY: + break; + } + if (D->av & GD_VERS_GE_1 && strcmp(D->entry[i]->field, "FRAMEOFFSET") == 0) D->av &= (GD_VERS_LE_0 | GD_VERS_GE_8); else if (D->av & GD_VERS_GE_3 && strcmp(D->entry[i]->field, "INCLUDE") == 0) @@ -961,7 +1072,7 @@ } D->flags |= GD_HAVE_VERSION; - dreturn("%04llx", D->av); + dreturn("0x%04llx", D->av); return D->av; } Modified: trunk/getdata/src/fpos.c =================================================================== --- trunk/getdata/src/fpos.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/fpos.c 2011-12-10 02:09:23 UTC (rev 634) @@ -28,7 +28,7 @@ dtrace("%p, %p, %lli", D, E, (long long)index_pos); if (++D->recurse_level >= GD_MAX_RECURSE_LEVEL) { - _GD_SetError(D, GD_E_RECURSE_LEVEL, 0, NULL, 0, E->field); + _GD_SetError(D, GD_E_RECURSE_LEVEL, GD_E_RECURSE_CODE, NULL, 0, E->field); dreturn("%u", 0); D->recurse_level--; return 0; @@ -231,7 +231,7 @@ dtrace("%p, %p, %lli, 0x%X", D, E, (long long)offset, mode); if (++D->recurse_level >= GD_MAX_RECURSE_LEVEL) { - _GD_SetError(D, GD_E_RECURSE_LEVEL, 0, NULL, 0, E->field); + _GD_SetError(D, GD_E_RECURSE_LEVEL, GD_E_RECURSE_CODE, NULL, 0, E->field); D->recurse_level--; dreturn("%i", 1); return 1; Modified: trunk/getdata/src/getdata.c =================================================================== --- trunk/getdata/src/getdata.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/getdata.c 2011-12-10 02:09:23 UTC (rev 634) @@ -266,9 +266,8 @@ else s0 -= E->EN(raw,spf) * D->fragment[E->fragment_index].frame_offset; - databuffer = (char *)malloc(ns * E->e->u.raw.size); + databuffer = (char *)_GD_Malloc(D, ns * E->e->u.raw.size); if (databuffer == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", 0); return 0; } @@ -1282,11 +1281,10 @@ } if (is_signed) - tmpbuf = (int64_t *)malloc(num_samp * sizeof(int64_t)); + tmpbuf = (int64_t *)_GD_Malloc(D, num_samp * sizeof(int64_t)); else - tmpbuf = (uint64_t *)malloc(num_samp * sizeof(uint64_t)); + tmpbuf = (uint64_t *)_GD_Malloc(D, num_samp * sizeof(uint64_t)); if (tmpbuf == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", 0); return 0; } @@ -1588,7 +1586,7 @@ first_samp, num_samp, return_type, data_out); if (++D->recurse_level >= GD_MAX_RECURSE_LEVEL) { - _GD_SetError(D, GD_E_RECURSE_LEVEL, 0, NULL, 0, E->field); + _GD_SetError(D, GD_E_RECURSE_LEVEL, GD_E_RECURSE_CODE, NULL, 0, E->field); D->recurse_level--; dreturn("%i", 0); return 0; Modified: trunk/getdata/src/include.c =================================================================== --- trunk/getdata/src/include.c 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/include.c 2011-12-10 02:09:23 UTC (rev 634) @@ -20,34 +20,116 @@ */ #include "internal.h" -/* Include a format file fragment -- returns the include index, or +/* Create new affixes given the current affixes and the new parts indicated + * on a /INCLUDE line */ +static int _GD_SetFieldAffixes(DIRFILE *D, int me, const char *prefix_in, + const char *suffix_in, int standards, int pedantic, const char *format_file, + int line, char **prefix, char **suffix) +{ + dtrace("%p, %i, \"%s\", \"%s\", %i, %i, \"%s\", %i, %p, %p", D, me, prefix_in, + suffix_in, standards, pedantic, format_file, line, prefix, suffix); + + /* suffix first, for some reason */ + if (suffix_in && suffix_in[0] != '\0') { + if (_GD_ValidateField(suffix_in, standards, pedantic, 1, NULL)) + { + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_BAD_NAME, format_file, line, + suffix_in); + dreturn("%i", 1); + return 1; + } + + if (D->fragment[me].suffix == NULL) + *suffix = _GD_Strdup(D, suffix_in); + else { + *suffix = _GD_Malloc(D, strlen(D->fragment[me].suffix) + + strlen(suffix_in) + 1); + if (*suffix) + strcat(strcpy(*suffix, suffix_in), D->fragment[me].suffix); + } + } else if (D->fragment[me].suffix) + *suffix = _GD_Strdup(D, D->fragment[me].suffix); + + if (D->error) { + dreturn("%i", 1); + return 1; + } + + /* now the prefix */ + if (prefix_in && prefix_in[0] != '\0') { + if (_GD_ValidateField(prefix_in, standards, pedantic, 1, NULL)) + { + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_BAD_NAME, format_file, line, + prefix_in); + dreturn("%i", 1); + return 1; + } + + if (D->fragment[me].prefix == NULL) + *prefix = _GD_Strdup(D, prefix_in); + else { + *prefix = _GD_Malloc(D, strlen(D->fragment[me].prefix) + + strlen(prefix_in) + 1); + if (*prefix) + strcat(strcpy(*prefix, D->fragment[me].prefix), prefix_in); + } + } else if (D->fragment[me].prefix) + *prefix = _GD_Strdup(D, D->fragment[me].prefix); + + dreturn("%i", D->error); + return D->error; +} + +/* Include a format file fragment -- returns the mew fragment index, or * -1 on error */ int _GD_Include(DIRFILE* D, const char* ename, const char* format_file, - int linenum, char** ref_name, int me, int* standards, unsigned long *flags) + int linenum, char** ref_name, int me, const char *prefix_in, + const char *suffix_in, int* standards, unsigned long *flags) { int i; int old_standards = *standards; int old_pedantic = *flags & GD_PEDANTIC; - int found = 0; int dirfd = -1; char *temp_buf1, *temp_buf2; - char *base; + char *base, *prefix = NULL, *suffix = NULL; void *ptr = NULL; FILE* new_fp = NULL; - dtrace("%p, \"%s\", \"%s\", %p, %i, %i, %p, %p", D, ename, format_file, - ref_name, linenum, me, standards, flags); + dtrace("%p, \"%s\", \"%s\", %p, %i, %i, \"%s\", \"%s\", %p, %p", D, ename, + format_file, ref_name, linenum, me, prefix_in, suffix_in, standards, + flags); - temp_buf2 = strdup(ename); + if (++D->recurse_level >= GD_MAX_RECURSE_LEVEL) { + _GD_SetError(D, GD_E_RECURSE_LEVEL, GD_E_RECURSE_INCLUDE, format_file, + linenum, ename); + D->recurse_level--; + dreturn("%i", 0); + return 0; + } + + if (_GD_SetFieldAffixes(D, me, prefix_in, suffix_in, old_standards, + old_pedantic, format_file, linenum, &prefix, &suffix)) + { + free(suffix); + D->recurse_level--; + dreturn("%i", -1); + return -1; + } + + temp_buf2 = _GD_Strdup(D, ename); if (temp_buf2 == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + free(prefix); + free(suffix); + D->recurse_level--; dreturn("%i", -1); return -1; } - base = strdup(basename(temp_buf2)); + base = _GD_Strdup(D, basename(temp_buf2)); if (base == NULL) { free(temp_buf2); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + free(prefix); + free(suffix); + D->recurse_level--; dreturn("%i", -1); return -1; } @@ -57,36 +139,25 @@ if (dirfd == -1 && D->error == GD_E_OK) _GD_SetError(D, GD_E_OPEN_FRAGMENT, errno, format_file, linenum, ename); if (D->error) { + free(temp_buf2); + free(prefix); + free(suffix); + D->recurse_level--; dreturn("%i", -1); return -1; } - temp_buf1 = _GD_MakeFullPath(D, dirfd, base); + temp_buf1 = _GD_MakeFullPath(D, dirfd, base, 1); free(temp_buf2); if (temp_buf1 == NULL) { _GD_ReleaseDir(D, dirfd); - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + free(prefix); + free(suffix); + D->recurse_level--; dreturn("%i", -1); return -1; } - /* Run through the include list to see if we've already included this - * file */ - for (i = 0; i < D->n_fragment; ++i) - if (strcmp(temp_buf1, D->fragment[i].cname) == 0) { - found = 1; - break; - } - - /* If we found the file, we won't reopen it. Continue parsing. */ - if (found) { - _GD_ReleaseDir(D, dirfd); - free(base); - free(temp_buf1); - dreturn("%i", i); - return i; - } - /* Try to open the file */ i = gd_OpenAt(D, dirfd, base, (((D->flags & GD_ACCMODE) == GD_RDWR) ? O_RDWR : O_RDONLY) | ((*flags & GD_CREAT) ? O_CREAT : 0) | @@ -96,8 +167,11 @@ if (i < 0) { _GD_SetError(D, GD_E_OPEN_FRAGMENT, errno, format_file, linenum, temp_buf1); + free(prefix); + free(suffix); free(base); free(temp_buf1); + D->recurse_level--; dreturn("%i", -1); return -1; } @@ -107,19 +181,25 @@ /* If opening the file failed, set the error code and abort parsing. */ if (new_fp == NULL) { _GD_SetError(D, GD_E_OPEN_FRAGMENT, errno, format_file, linenum, temp_buf1); + free(prefix); + free(suffix); free(base); free(temp_buf1); + D->recurse_level--; dreturn("%i", -1); return -1; } /* If we got here, we managed to open the included file; parse it */ - ptr = realloc(D->fragment, (++D->n_fragment) * sizeof(struct gd_fragment_t)); + ptr = _GD_Realloc(D, D->fragment, + (++D->n_fragment) * sizeof(struct gd_fragment_t)); if (ptr == NULL) { D->n_fragment--; - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + free(prefix); + free(suffix); free(base); free(temp_buf1); + D->recurse_level--; dreturn("%i", -1); return -1; } @@ -127,7 +207,7 @@ D->fragment[D->n_fragment - 1].bname = base; D->fragment[D->n_fragment - 1].cname = temp_buf1; - D->fragment[D->n_fragment - 1].ename = strdup(ename); + D->fragment[D->n_fragment - 1].ename = _GD_Strdup(D, ename); D->fragment[D->n_fragment - 1].modified = 0; D->fragment[D->n_fragment - 1].parent = me; D->fragment[D->n_fragment - 1].dirfd = dirfd; @@ -142,13 +222,15 @@ D->fragment[D->n_fragment - 1].ref_name = NULL; D->fragment[D->n_fragment - 1].frame_offset = D->fragment[me].frame_offset; D->fragment[D->n_fragment - 1].protection = GD_PROTECT_NONE; + D->fragment[D->n_fragment - 1].prefix = prefix; + D->fragment[D->n_fragment - 1].suffix = suffix; D->fragment[D->n_fragment - 1].vers = (*flags & GD_PEDANTIC) ? 1ULL << *standards : 0; if (D->fragment[D->n_fragment - 1].ename == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); D->n_fragment--; free(base); + D->recurse_level--; dreturn("%i", -1); return -1; } @@ -162,11 +244,15 @@ /* prevent /VERSION leak in DSV >= 9 */ if ((old_standards >= 9 && old_pedantic) || *standards >= 9) { - *standards = old_standards; + if (*standards != old_standards) { + *standards = old_standards; + D->flags |= GD_MULTISTANDARD; + } if (!old_pedantic) *flags &= ~GD_PEDANTIC; } + D->recurse_level--; dreturn("%i", D->n_fragment - 1); return D->n_fragment - 1; } @@ -222,7 +308,7 @@ flags |= D->flags & GD_ENCODING; new_fragment = _GD_Include(D, file, "dirfile_include()", 0, &ref_name, - fragment_index, &standards, &flags); + fragment_index, NULL, NULL, &standards, &flags); if (!D->error) { D->fragment[fragment_index].modified = 1; @@ -274,9 +360,8 @@ dtrace("%p, %p, %i, %i", D, f, fragment, nf); - new_f = (int *)realloc(*f, sizeof(int) * ++nf); + new_f = (int *)_GD_Realloc(D, *f, sizeof(int) * ++nf); if (new_f == NULL) { - _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%i", -1); return -1; } Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-12-08 02:30:40 UTC (rev 633) +++ trunk/getdata/src/internal.h 2011-12-10 02:09:23 UTC (rev 634) @@... [truncated message content] |
From: <ket...@us...> - 2011-12-08 02:30:50
|
Revision: 633 http://getdata.svn.sourceforge.net/getdata/?rev=633&view=rev Author: ketiltrout Date: 2011-12-08 02:30:40 +0000 (Thu, 08 Dec 2011) Log Message: ----------- * Add /HIDDEN directive. * Fix version leakage. For backwards compatibility, this only occurs with DSV >= 9. * [bug]: "/META parent/child granchild ..." is now reported as a syntax error. (It would previously half-work, causing a segfault on close.) * Store counts of each # of each entry type. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/TODO trunk/getdata/src/add.c trunk/getdata/src/del.c trunk/getdata/src/entry.c trunk/getdata/src/errors.c trunk/getdata/src/field_list.c trunk/getdata/src/flush.c trunk/getdata/src/getdata.h.in trunk/getdata/src/include.c trunk/getdata/src/internal.h trunk/getdata/src/meta_list.c trunk/getdata/src/mod.c trunk/getdata/src/nfields.c trunk/getdata/src/nmeta.c trunk/getdata/src/open.c trunk/getdata/src/parse.c trunk/getdata/test/Makefile.am Added Paths: ----------- trunk/getdata/test/alter_entry_hidden.c trunk/getdata/test/cvlist_array_hidden.c trunk/getdata/test/cvlist_array_meta_hidden.c trunk/getdata/test/cvlist_hidden.c trunk/getdata/test/cvlist_meta_hidden.c trunk/getdata/test/flist_hidden.c trunk/getdata/test/flist_meta_hidden.c trunk/getdata/test/flist_type_hidden.c trunk/getdata/test/flist_type_meta_hidden.c trunk/getdata/test/hide.c trunk/getdata/test/hide_unhide.c trunk/getdata/test/nfields_hidden.c trunk/getdata/test/nfields_type_hidden.c trunk/getdata/test/nfields_vector.c trunk/getdata/test/nfields_vector_hidden.c trunk/getdata/test/nfields_vector_invalid.c trunk/getdata/test/nmeta_hidden.c trunk/getdata/test/nmeta_type_hidden.c trunk/getdata/test/nmeta_vectors_hidden.c trunk/getdata/test/parse_hidden.c trunk/getdata/test/parse_hidden_field.c trunk/getdata/test/parse_hidden_meta.c trunk/getdata/test/parse_meta_meta.c trunk/getdata/test/parse_version_89.c trunk/getdata/test/parse_version_98.c trunk/getdata/test/parse_version_p8.c trunk/getdata/test/parse_version_p9.c trunk/getdata/test/svlist_hidden.c trunk/getdata/test/svlist_meta_hidden.c trunk/getdata/test/vlist_hidden.c trunk/getdata/test/vlist_meta_hidden.c Removed Paths: ------------- trunk/getdata/test/nvectors.c trunk/getdata/test/nvectors_invalid.c Property Changed: ---------------- trunk/getdata/test/ Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/ChangeLog 2011-12-08 02:30:40 UTC (rev 633) @@ -1,3 +1,52 @@ +2011-12-08 D. V. Wiebe <ge...@ke...> svn:633 + * test/svlist_hidden.c test/svlist_meta_hidden.c test/hide.c + test/flist_hidden.c test/nfields_hidden.c test/parse_version_89.c + test/nmeta_type_hidden.c test/parse_version_98.c test/nmeta_vectors_hidden.c + test/nmeta_hidden.c test/alter_entry_hidden.c test/parse_version_p8.c + test/parse_version_p9.c test/hide_unhide.c test/cvlist_meta_hidden.c + test/nfields_type_hidden.c test/vlist_hidden.c test/flist_meta_hidden.c + test/vlist_meta_hidden.c test/flist_type_meta_hidden.c + test/parse_hidden_meta.c test/cvlist_array_hidden.c test/parse_meta_meta.c + test/nfields_vector_hidden.c test/parse_hidden.c test/parse_hidden_field.c + test/cvlist_hidden.c test/cvlist_array_meta_hidden.c + test/flist_type_hidden.c: Added. + + * test/nfields_vector.c test/nfields_vector_invalid.c: Renamed from nvectors* + + * src/parse.c (_GD_ParseDirective): Parse /HIDDEN directives. + * src/entry.c (gd_hide gd_unhide): Added. + * src/nmeta.c (gd_nmfields gd_nmvectors gd_nmfields_by_type) src/nfields.c + (gd_nfields gd_nvectors gd_nfields_by_type) src/field_list.c (gd_constants + gd_carrays gd_strings gd_field_list_by_type gd_vector_list gd_field_list) + src/meta_list (gd_mconstants gd_mcarrays gd_mstrings gd_mfield_list_by_type + gd_mvector_list gd_mfield_list): Compensate for hidden fields. + * src/flush.c (_GD_FieldSpec): Write /HIDDEN directives. + * src/flush.c (_GD_FindVersion): Consider hidden entries. + * src/mod.c (_GD_Change): Prohibit changing hiddenness via gd_alter_entry(). + + * src/parse.c (_GD_ParseDirective): Forbid a metafield code from appearing + as a parent in /META directives. + + * src/internal.h: Record the number of each type of field, rather than just + for the scalar field types. + * src/internal.h (_GD_EntryIndex): Added. + * src/open.c (gd_cbopen): Initialise D->n[INDEX_ENTRY]. + * src/nmeta.c (gd_nmvectors gd_nmfields_by_type) src/nfields.c (gd_nvectors + gd_nfields_by_type) src/field_list.c (gd_constants gd_carrays gd_strings + gd_field_list_by_type gd_vector_list) src/meta_list.c (gd_mconstants + gd_mcarrays gd_mstrings gd_mfield_list_by_type gd_mvector_list): Use type + counts. + * src/del.c (gd_delete) src/parse.c (_GD_ParseFieldSpec) src/include.c + (gd_uninclude) src/add.c (_GD_Add): Update type counts. + * src/field_list.c (_gd_entype_index): Deleted. + + * src/include.c (_GD_Include): Remember incoming Standards Version and + parser mode, and restore them on exit if the new DSV >=9 or the old mode is + pedantic and the old DSV >= 9. This is an attempt to stave the "version + leak" problem experienced in earlier DSVs. + + * src/internal.h: Renamed GD_E_FORMAT_NO_PARENT to GD_E_FORMAT_NO_FIELD. + 2011-12-06 D. V. Wiebe <ge...@ke...> svn:632 * test/get_window_ne.c test/get_window.c test/parse_window_scalar.c test/alter_window.c test/parse_window.c test/madd_window.c Modified: trunk/getdata/TODO =================================================================== --- trunk/getdata/TODO 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/TODO 2011-12-08 02:30:40 UTC (rev 633) @@ -3,6 +3,5 @@ * linterp table path munging [MH] * Make webpage suck less -* Fix VERSION leakage / Fragment encapsulation [MT/CBN] * INCLUDE name munging [RW/MT] * aliasing [MT] Modified: trunk/getdata/src/add.c =================================================================== --- trunk/getdata/src/add.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/add.c 2011-12-08 02:30:40 UTC (rev 633) @@ -163,10 +163,14 @@ return -1; } - /* Set meta indicies */ + /* Set meta indices */ if (parent != NULL) E->e->n_meta = -1; + /* Hidden */ + if (entry->hidden) + E->hidden = 1; + /* Validate entry and add auxiliary data */ switch(entry->field_type) { @@ -464,22 +468,13 @@ } - if (E->field_type == GD_STRING_ENTRY) { - if (P) - P->e->n_meta_string++; - else - D->n_string++; - } else if (E->field_type == GD_CONST_ENTRY) { - if (P) - P->e->n_meta_const++; - else - D->n_const++; - } else if (E->field_type == GD_CARRAY_ENTRY) { - if (P) - P->e->n_meta_carray++; - else - D->n_carray++; - } else if (E->field_type == GD_RAW_ENTRY) { + /* increment entry type count */ + if (P) + P->e->n[_GD_EntryIndex(E->field_type)]++; + else + D->n[_GD_EntryIndex(E->field_type)]++; + + if (E->field_type == GD_RAW_ENTRY) { if (new_ref != NULL) { /* This is the first raw field in this fragment; propagate it upwards */ for (i = E->fragment_index; i != -1; i = D->fragment[i].parent) { Modified: trunk/getdata/src/del.c =================================================================== --- trunk/getdata/src/del.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/del.c 2011-12-08 02:30:40 UTC (rev 633) @@ -451,12 +451,8 @@ D->n_entries -= last - first + 1; } - if (E->field_type == GD_CONST_ENTRY) - D->n_const--; - else if (E->field_type == GD_CARRAY_ENTRY) - D->n_carray--; - else if (E->field_type == GD_STRING_ENTRY) - D->n_string--; + /* Decrement entry type count */ + D->n[_GD_EntryIndex(E->field_type)]--; } else { /* If this is a metafield, update its parent's lists */ struct _gd_private_entry *Pe = E->e->p.parent->e; @@ -468,13 +464,9 @@ break; } + /* Decrement entry type counts */ Pe->n_meta--; - if (E->field_type == GD_CONST_ENTRY) - Pe->n_meta_const--; - else if (E->field_type == GD_CARRAY_ENTRY) - Pe->n_meta_carray--; - else if (E->field_type == GD_STRING_ENTRY) - Pe->n_meta_string--; + Pe->n[_GD_EntryIndex(E->field_type)]--; } /* Remove the entry from the list -- we need not worry about the way we've Modified: trunk/getdata/src/entry.c =================================================================== --- trunk/getdata/src/entry.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/entry.c 2011-12-08 02:30:40 UTC (rev 633) @@ -506,6 +506,120 @@ return E->fragment_index; } +int gd_hide(DIRFILE *D, const char *field_code_in) gd_nothrow +{ + gd_entry_t *E; + int repr; + char *field_code; + + dtrace("%p, \"%s\"", D, field_code_in); + + if (D->flags & GD_INVALID) { + _GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL); + dreturn("%i", -1); + return -1; + } else if ((D->flags & GD_ACCMODE) != GD_RDWR) { + _GD_SetError(D, GD_E_ACCMODE, 0, NULL, 0, NULL); + dreturn("%i", -1); + return -1; + } + + _GD_ClearError(D); + + /* get rid of the representation, if any */ + E = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1); + + if (D->error) { + dreturn("%i", -1); + return -1; + } + + if (D->fragment[E->fragment_index].protection & GD_PROTECT_FORMAT) { + _GD_SetError(D, GD_E_PROTECTED, GD_E_PROTECTED_FORMAT, NULL, 0, + D->fragment[E->fragment_index].cname); + dreturn("%i", -1); + return -1; + } + + if (field_code != field_code_in) + free(field_code); + + if (!E->hidden) { + E->hidden = 1; + D->fragment[E->fragment_index].modified = 1; + + /* update counts */ + if (E->e->n_meta == -1) { + gd_entry_t *P = (gd_entry_t*)E->e->p.parent; + P->e->n_hidden++; + P->e->n[_GD_EntryIndex(E->field_type)]--; + } else { + D->n_hidden++; + D->n[_GD_EntryIndex(E->field_type)]--; + } + } + + dreturn("%i", 0); + return 0; +} + +int gd_unhide(DIRFILE *D, const char *field_code_in) gd_nothrow +{ + gd_entry_t *E; + int repr; + char *field_code; + + dtrace("%p, \"%s\"", D, field_code_in); + + if (D->flags & GD_INVALID) { + _GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL); + dreturn("%i", -1); + return -1; + } else if ((D->flags & GD_ACCMODE) != GD_RDWR) { + _GD_SetError(D, GD_E_ACCMODE, 0, NULL, 0, NULL); + dreturn("%i", -1); + return -1; + } + + _GD_ClearError(D); + + /* get rid of the representation, if any */ + E = _GD_FindFieldAndRepr(D, field_code_in, &field_code, &repr, NULL, 1); + + if (D->error) { + dreturn("%i", -1); + return -1; + } + + if (field_code != field_code_in) + free(field_code); + + if (D->fragment[E->fragment_index].protection & GD_PROTECT_FORMAT) { + _GD_SetError(D, GD_E_PROTECTED, GD_E_PROTECTED_FORMAT, NULL, 0, + D->fragment[E->fragment_index].cname); + dreturn("%i", -1); + return -1; + } + + if (E->hidden) { + E->hidden = 0; + D->fragment[E->fragment_index].modified = 1; + + /* update counts */ + if (E->e->n_meta == -1) { + gd_entry_t *P = (gd_entry_t*)E->e->p.parent; + P->e->n_hidden--; + P->e->n[_GD_EntryIndex(E->field_type)]++; + } else { + D->n_hidden--; + D->n[_GD_EntryIndex(E->field_type)]++; + } + } + + dreturn("%i", 0); + return 0; +} + int gd_validate(DIRFILE *D, const char *field_code_in) gd_nothrow { int i, repr; Modified: trunk/getdata/src/errors.c =================================================================== --- trunk/getdata/src/errors.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/errors.c 2011-12-08 02:30:40 UTC (rev 633) @@ -60,8 +60,8 @@ "Unterminated token on line {3} of {2}", 0 }, { GD_E_FORMAT, GD_E_FORMAT_METARAW, "Invalid metafield type on line {3} of {2}", 0 }, - { GD_E_FORMAT, GD_E_FORMAT_NO_PARENT, - "Meta field defined before parent ({4}) on line {3} of {2}", 0 }, + { GD_E_FORMAT, GD_E_FORMAT_NO_FIELD, + "Field code not found on line {3} of {2}: {4}", 0 }, { GD_E_FORMAT, GD_E_FORMAT_DUPLICATE, "Field code on line {3} of {2} already defined: {4}", 0 }, { GD_E_FORMAT, GD_E_FORMAT_LOCATION, @@ -72,6 +72,8 @@ "Unexpected characters in scalar literal ({4}) on line {3} of {2}", 0 }, { GD_E_FORMAT, GD_E_FORMAT_WINDOP, "Unrecognised operator ({4}) on line {3} of {2}", 0 }, + { GD_E_FORMAT, GD_E_FORMAT_META_META, + "Cannot attach meta field to meta field {4} on line {3} of {2}", 0 }, /* GD_E_TRUNC: 1 = suberror, 2 = filename. 3 = errno */ { GD_E_TRUNC, 0, "Error truncating {2}: ", 1 }, /* GD_E_CREAT: 1 = suberror, 2 = filename, 3 = errno */ Modified: trunk/getdata/src/field_list.c =================================================================== --- trunk/getdata/src/field_list.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/field_list.c 2011-12-08 02:30:40 UTC (rev 633) @@ -1,4 +1,4 @@ -/* Copyright (C) 2008-2010 D. V. Wiebe +/* Copyright (C) 2008-2011 D. V. Wiebe * *************************************************************************** * @@ -24,15 +24,6 @@ static const char* zero_list[1] = { NULL }; static const gd_carray_t zero_carrays[1] = { {0, NULL} }; -/* correspondence between type_list index and gd_enttype_t */ -const gd_entype_t _gd_entype_index[GD_N_ENTYPES] = -{ - GD_RAW_ENTRY, GD_LINCOM_ENTRY, GD_LINTERP_ENTRY, GD_BIT_ENTRY, - GD_MULTIPLY_ENTRY, GD_PHASE_ENTRY, GD_INDEX_ENTRY, GD_POLYNOM_ENTRY, - GD_SBIT_ENTRY, GD_DIVIDE_ENTRY, GD_RECIP_ENTRY, GD_WINDOW_ENTRY, - GD_CONST_ENTRY, GD_STRING_ENTRY, GD_CARRAY_ENTRY -}; - const void *gd_constants(DIRFILE* D, gd_type_t return_type) gd_nothrow { unsigned int i, n; @@ -48,13 +39,13 @@ _GD_ClearError(D); - if (D->n_const == 0) { + if ((n = D->n[_GD_EntryIndex(GD_CONST_ENTRY)]) == 0) { dreturn("%p", NULL); return NULL; } free(D->const_value_list); - fl = (char *)_GD_Alloc(D, return_type, D->n_const); + fl = (char *)_GD_Alloc(D, return_type, n); if (fl == NULL) { dreturn("%p", NULL); @@ -63,7 +54,7 @@ for (i = n = 0; i < D->n_entries; ++i) { if (D->entry[i]->field_type == GD_CONST_ENTRY && - D->entry[i]->e->n_meta != -1) + D->entry[i]->e->n_meta != -1 && !D->entry[i]->hidden) if (_GD_DoField(D, D->entry[i], 0, 0, 1, return_type, fl + n++ * GD_SIZE(return_type)) != 1) break; @@ -90,7 +81,7 @@ _GD_ClearError(D); - if (D->n_carray == 0) { + if ((n = D->n[_GD_EntryIndex(GD_CARRAY_ENTRY)]) == 0) { dreturn("%p", zero_carrays); return zero_carrays; } @@ -99,8 +90,8 @@ for (i = 0; D->carray_value_list[i].n != 0; ++i) free(D->carray_value_list[i].d); free(D->carray_value_list); - fl = (gd_carray_t *)malloc(sizeof(gd_carray_t) * (D->n_carray + 1)); - memset(fl, 0, sizeof(gd_carray_t) * (D->n_carray + 1)); + fl = (gd_carray_t *)malloc(sizeof(gd_carray_t) * (n + 1)); + memset(fl, 0, sizeof(gd_carray_t) * (n + 1)); if (fl == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); @@ -110,7 +101,8 @@ for (i = n = 0; i < D->n_entries; ++i) { if (D->entry[i]->field_type == GD_CARRAY_ENTRY && - D->entry[i]->e->n_meta != -1) { + D->entry[i]->e->n_meta != -1 && !D->entry[i]->hidden) + { fl[n].n = D->entry[i]->EN(scalar,array_len); fl[n].d = _GD_Alloc(D, return_type, fl[n].n); if (D->error || _GD_DoField(D, D->entry[i], 0, 0, fl[n].n, return_type, @@ -142,7 +134,7 @@ _GD_ClearError(D); - if (D->n_string == 0) { + if ((n = D->n[_GD_EntryIndex(GD_STRING_ENTRY)]) == 0) { dreturn("%p", zero_list); return zero_list; } @@ -154,7 +146,7 @@ } fl = (char **)realloc((char **)D->string_value_list, sizeof(const char*) * - (D->n_string + 1)); + (n + 1)); if (fl == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); @@ -164,7 +156,7 @@ for (i = n = 0; i < D->n_entries; ++i) { if (D->entry[i]->field_type == GD_STRING_ENTRY && - D->entry[i]->e->n_meta != -1) + D->entry[i]->e->n_meta != -1 && !D->entry[i]->hidden) fl[n++] = D->entry[i]->e->u.string; } fl[n] = NULL; @@ -180,7 +172,7 @@ { unsigned int i, n; char** fl; - int index = -1; + const int index = _GD_EntryIndex(type); dtrace("%p, %x", D, type); @@ -204,20 +196,6 @@ return zero_list; } - /* find the index -- get_nfields_by_type should have already tripped up - * if the type is invalid */ - for (i = 0; i < GD_N_ENTYPES; ++i) - if (_gd_entype_index[i] == type) { - index = i; - break; - } - - if (index == -1) { - _GD_InternalError(D); - dreturn("%p", NULL); - return NULL; - } - if (D->type_list_validity & (1 << index)) { /* list already made */ dreturn("%p", D->type_list[index]); @@ -234,8 +212,11 @@ } for (i = n = 0; i < D->n_entries; ++i) { - if (D->entry[i]->field_type == type && D->entry[i]->e->n_meta != -1) + if (D->entry[i]->field_type == type && D->entry[i]->e->n_meta != -1 && + !D->entry[i]->hidden) + { fl[n++] = D->entry[i]->field; + } } fl[n] = NULL; @@ -261,7 +242,7 @@ _GD_ClearError(D); - n = D->n_entries - D->n_meta - D->n_string - D->n_const - D->n_carray; + n = gd_nvectors(D); if (n == 0) { dreturn("%p", zero_list); @@ -284,7 +265,7 @@ for (i = n = 0; i < D->n_entries; ++i) { if (!(D->entry[i]->field_type & GD_SCALAR_ENTRY) && - D->entry[i]->e->n_meta != -1) + D->entry[i]->e->n_meta != -1 && !D->entry[i]->hidden) fl[n++] = D->entry[i]->field; } fl[n] = NULL; @@ -311,7 +292,7 @@ _GD_ClearError(D); - if (D->n_entries == 0) { + if (D->n_entries - D->n_hidden - D->n_meta == 0) { dreturn("%p", zero_list); return zero_list; } @@ -323,7 +304,7 @@ } fl = (char **)realloc((char **)D->field_list, sizeof(const char*) * - (D->n_entries + 1 - D->n_meta)); + (D->n_entries + 1 - D->n_meta - D->n_hidden)); if (fl == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); @@ -332,7 +313,7 @@ } for (i = n = 0; i < D->n_entries; ++i) - if (D->entry[i]->e->n_meta != -1) + if (D->entry[i]->e->n_meta != -1 && !D->entry[i]->hidden) fl[n++] = D->entry[i]->field; fl[n] = NULL; Modified: trunk/getdata/src/flush.c =================================================================== --- trunk/getdata/src/flush.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/flush.c 2011-12-08 02:30:40 UTC (rev 633) @@ -470,6 +470,9 @@ break; } + if (!D->error && E->hidden && (permissive || D->standards >= 9)) + fprintf(stream, "/HIDDEN %s\n", E->field); + dreturnvoid(); } @@ -858,6 +861,9 @@ } for (i = 0; D->av && i < D->n_entries; ++i) { + if (D->entry[i]->hidden) + D->av &= GD_VERS_GE_9; + switch (D->entry[i]->field_type) { case GD_RAW_ENTRY: switch (D->entry[i]->EN(raw,data_type)) { Modified: trunk/getdata/src/getdata.h.in =================================================================== --- trunk/getdata/src/getdata.h.in 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/getdata.h.in 2011-12-08 02:30:40 UTC (rev 633) @@ -180,13 +180,17 @@ #define GD_E_FORMAT_BAD_NAME 12 #define GD_E_FORMAT_UNTERM 13 #define GD_E_FORMAT_METARAW 14 -#define GD_E_FORMAT_NO_PARENT 15 +#define GD_E_FORMAT_NO_FIELD 15 #define GD_E_FORMAT_DUPLICATE 16 #define GD_E_FORMAT_LOCATION 17 #define GD_E_FORMAT_PROTECT 18 #define GD_E_FORMAT_LITERAL 19 #define GD_E_FORMAT_WINDOP 20 +#define GD_E_FORMAT_META_META 21 +/* deprecated names */ +#define GD_E_FORMAT_NO_PARENT GD_E_FORMAT_NO_FIELD + /* parser callback return values */ #define GD_SYNTAX_ABORT 0 #define GD_SYNTAX_RESCAN 1 @@ -324,6 +328,7 @@ int scalar_ind[GD_MAX_POLYORD + 1]; int fragment_index; int comp_scal; + int hidden; union { struct { /* RAW */ gd_spf_t spf; @@ -641,6 +646,9 @@ extern const char *gd_fragmentname(DIRFILE *dirfile, int index) gd_nothrow gd_nonnull ((1)); +extern int gd_hide(DIRFILE *dirfile, const char *field_code) gd_nothrow +gd_nonnull ((1,2)); + extern DIRFILE *gd_invalid_dirfile(void) gd_nothrow; extern int gd_madd(DIRFILE *dirfile, const gd_entry_t *entry, @@ -796,6 +804,9 @@ extern const char **gd_strings(DIRFILE *dirfile) gd_nothrow gd_nonnull ((1)); +extern int gd_unhide(DIRFILE *dirfile, const char *field_code) gd_nothrow +gd_nonnull ((1,2)); + extern int gd_validate(DIRFILE *dirfile, const char *field_code) gd_nothrow gd_nonnull((1,2)); Modified: trunk/getdata/src/include.c =================================================================== --- trunk/getdata/src/include.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/include.c 2011-12-08 02:30:40 UTC (rev 633) @@ -26,6 +26,8 @@ int linenum, char** ref_name, int me, int* standards, unsigned long *flags) { int i; + int old_standards = *standards; + int old_pedantic = *flags & GD_PEDANTIC; int found = 0; int dirfd = -1; char *temp_buf1, *temp_buf2; @@ -158,6 +160,13 @@ fclose(new_fp); + /* prevent /VERSION leak in DSV >= 9 */ + if ((old_standards >= 9 && old_pedantic) || *standards >= 9) { + *standards = old_standards; + if (!old_pedantic) + *flags &= ~GD_PEDANTIC; + } + dreturn("%i", D->n_fragment - 1); return D->n_fragment - 1; } @@ -381,12 +390,7 @@ if (_GD_ContainsFragment(f, nf, D->entry[i]->fragment_index)) { if (D->entry[i]->e->n_meta >= 0) { D->n_entries--; - if (D->entry[i]->field_type == GD_CONST_ENTRY) - D->n_const--; - else if (D->entry[i]->field_type == GD_CARRAY_ENTRY) - D->n_carray--; - else if (D->entry[i]->field_type == GD_STRING_ENTRY) - D->n_string--; + D->n[_GD_EntryIndex(D->entry[i]->field_type)]--; } else D->n_meta--; Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/internal.h 2011-12-08 02:30:40 UTC (rev 633) @@ -662,9 +662,8 @@ int calculated; int n_meta; - int n_meta_string; - int n_meta_carray; - int n_meta_const; + unsigned int n_hidden; + unsigned int n[GD_N_ENTYPES]; union { gd_entry_t** meta_entry; const gd_entry_t* parent; @@ -833,9 +832,8 @@ /* field counts */ unsigned int n_entries; - unsigned int n_string; - unsigned int n_carray; - unsigned int n_const; + unsigned int n_hidden; + unsigned int n[GD_N_ENTYPES]; unsigned int n_meta; unsigned int n_dot; @@ -875,8 +873,6 @@ void* sehandler_extra; }; -extern const gd_entype_t _gd_entype_index[GD_N_ENTYPES]; - void *_GD_Alloc(DIRFILE*, gd_type_t, size_t) __attribute_malloc__; void _GD_ArmEndianise(uint64_t* databuffer, int is_complex, size_t ns); int _GD_BadInput(DIRFILE* D, gd_entry_t* E, int i); @@ -903,6 +899,19 @@ void *data_out, gd_type_t out_type, size_t n) gd_nothrow; gd_type_t _GD_ConstType(DIRFILE *D, gd_type_t type); const char *_GD_DirName(const DIRFILE *D, int dirfd); + +#define _GD_EntryIndex(t) \ + ( \ + ((t) == GD_RAW_ENTRY) ? 0 : ((t) == GD_LINCOM_ENTRY) ? 1 : \ + ((t) == GD_LINTERP_ENTRY) ? 2 : ((t) == GD_BIT_ENTRY) ? 3 : \ + ((t) == GD_MULTIPLY_ENTRY) ? 4 : ((t) == GD_PHASE_ENTRY) ? 5 : \ + ((t) == GD_INDEX_ENTRY) ? 6 : ((t) == GD_POLYNOM_ENTRY) ? 7 : \ + ((t) == GD_SBIT_ENTRY) ? 8 : ((t) == GD_DIVIDE_ENTRY) ? 9 : \ + ((t) == GD_RECIP_ENTRY) ? 10 : ((t) == GD_WINDOW_ENTRY) ? 11 : \ + ((t) == GD_CONST_ENTRY) ? 12 : ((t) == GD_STRING_ENTRY) ? 13 : \ + ((t) == GD_CARRAY_ENTRY) ? 14 : -1 \ + ) + size_t _GD_DoField(DIRFILE*, gd_entry_t*, int, off64_t, size_t, gd_type_t, void*); size_t _GD_DoFieldOut(DIRFILE*, gd_entry_t*, int, off64_t, size_t, gd_type_t, Modified: trunk/getdata/src/meta_list.c =================================================================== --- trunk/getdata/src/meta_list.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/meta_list.c 2011-12-08 02:30:40 UTC (rev 633) @@ -1,4 +1,4 @@ -/* Copyright (C) 2008-2010 D. V. Wiebe +/* Copyright (C) 2008-2011 D. V. Wiebe * *************************************************************************** * @@ -52,13 +52,13 @@ e = P->e; - if (e->n_meta_const == 0) { + if ((n = e->n[_GD_EntryIndex(GD_CONST_ENTRY)]) == 0) { dreturn("%p", NULL); return NULL; } free(e->const_value_list); - fl = (char *)_GD_Alloc(D, return_type, e->n_meta_const); + fl = (char *)_GD_Alloc(D, return_type, n); if (fl == NULL) { dreturn("%p", NULL); @@ -68,10 +68,13 @@ /* DoField will implicitly choose GD_REPR_AUTO for complex data being returned * as purely real */ for (i = n = 0; i < e->n_meta; ++i) { - if (e->p.meta_entry[i]->field_type == GD_CONST_ENTRY) + if (e->p.meta_entry[i]->field_type == GD_CONST_ENTRY && + !e->p.meta_entry[i]->hidden) + { if (_GD_DoField(D, e->p.meta_entry[i], 0, 0, 1, return_type, fl + n++ * GD_SIZE(return_type)) != 1) break; + } } e->const_value_list = fl; @@ -108,7 +111,7 @@ e = P->e; - if (e->n_meta_carray == 0) { + if ((n = e->n[_GD_EntryIndex(GD_CARRAY_ENTRY)]) == 0) { dreturn("%p", zero_carrays); return zero_carrays; } @@ -118,7 +121,7 @@ free(e->carray_value_list[i].d); free(e->carray_value_list); - fl = (gd_carray_t *)malloc(sizeof(gd_carray_t) * (e->n_meta_carray + 1)); + fl = (gd_carray_t *)malloc(sizeof(gd_carray_t) * (n + 1)); if (fl == NULL) { dreturn("%p", NULL); @@ -128,7 +131,9 @@ /* DoField will implicitly choose GD_REPR_AUTO for complex data being returned * as purely real */ for (i = n = 0; i < e->n_meta; ++i) { - if (e->p.meta_entry[i]->field_type == GD_CARRAY_ENTRY) { + if (e->p.meta_entry[i]->field_type == GD_CARRAY_ENTRY && + !e->p.meta_entry[i]->hidden) + { fl[n].n = e->p.meta_entry[i]->EN(scalar,array_len); fl[n].d = _GD_Alloc(D, return_type, fl[n].n); if (D->error || _GD_DoField(D, e->p.meta_entry[i], 0, 0, fl[n].n, @@ -172,13 +177,13 @@ e = P->e; - if (e->n_meta_string == 0) { + if ((n = e->n[_GD_EntryIndex(GD_STRING_ENTRY)]) == 0) { dreturn("%p", zero_list); return zero_list; } fl = (char **)realloc((char **)e->string_value_list, sizeof(const char*) * - (e->n_meta_string + 1)); + (n + 1)); if (fl == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); @@ -186,10 +191,12 @@ return NULL; } - for (i = n = 0; i < e->n_meta; ++i) { - if (e->p.meta_entry[i]->field_type == GD_STRING_ENTRY) + for (i = n = 0; i < e->n_meta; ++i) + if (e->p.meta_entry[i]->field_type == GD_STRING_ENTRY && + !e->p.meta_entry[i]->hidden) + { fl[n++] = e->p.meta_entry[i]->e->u.string; - } + } fl[n] = NULL; e->string_value_list = (const char **)fl; @@ -201,7 +208,8 @@ const char **gd_mfield_list_by_type(DIRFILE* D, const char* parent, gd_entype_t type) gd_nothrow { - int i, index = -1; + int i; + const int index = _GD_EntryIndex(type); unsigned int n; char **fl; gd_entry_t *P; @@ -241,14 +249,6 @@ return zero_list; } - /* find the index -- get_nfields_by_type should have already tripped up - * if the type is invalid */ - for (i = 0; i < GD_N_ENTYPES; ++i) - if (_gd_entype_index[i] == type) { - index = i; - break; - } - if (index == -1) { _GD_InternalError(D); dreturn("%p", NULL); @@ -263,10 +263,9 @@ return NULL; } - for (i = n = 0; i < e->n_meta; ++i) { - if (e->p.meta_entry[i]->field_type == type) + for (i = n = 0; i < e->n_meta; ++i) + if (e->p.meta_entry[i]->field_type == type && !e->p.meta_entry[i]->hidden) fl[n++] = e->p.meta_entry[i]->field + offs; - } fl[n] = NULL; e->type_list[index] = fl; @@ -304,7 +303,9 @@ e = P->e; offs = strlen(P->field) + 1; - n = e->n_meta - e->n_meta_string - e->n_meta_const - e->n_meta_carray; + n = e->n_meta - e->n_hidden - e->n[_GD_EntryIndex(GD_STRING_ENTRY)] + - e->n[_GD_EntryIndex(GD_CONST_ENTRY)] + - e->n[_GD_EntryIndex(GD_CARRAY_ENTRY)]; if (n == 0) { dreturn("%p", zero_list); @@ -319,10 +320,12 @@ return NULL; } - for (i = n = 0; i < e->n_meta; ++i) { - if (!(e->p.meta_entry[i]->field_type & GD_SCALAR_ENTRY)) + for (i = n = 0; i < e->n_meta; ++i) + if (!(e->p.meta_entry[i]->field_type & GD_SCALAR_ENTRY) && + !e->p.meta_entry[i]->hidden) + { fl[n++] = e->p.meta_entry[i]->field + offs; - } + } fl[n] = NULL; e->vector_list = (const char **)fl; @@ -361,13 +364,13 @@ offs = strlen(P->field) + 1; - if (e->n_meta == 0) { + if (e->n_meta - e->n_hidden == 0) { dreturn("%p", zero_list); return zero_list; } fl = (char **)realloc((char **)e->field_list, sizeof(const char*) * - (e->n_meta + 1)); + (e->n_meta + 1 - e->n_hidden)); if (fl == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); @@ -376,7 +379,8 @@ } for (i = n = 0; i < e->n_meta; ++i) - fl[n++] = e->p.meta_entry[i]->field + offs; + if (!e->p.meta_entry[i]->hidden) + fl[n++] = e->p.meta_entry[i]->field + offs; fl[n] = NULL; e->field_list = (const char **)fl; Modified: trunk/getdata/src/mod.c =================================================================== --- trunk/getdata/src/mod.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/mod.c 2011-12-08 02:30:40 UTC (rev 633) @@ -221,6 +221,9 @@ memcpy(&Qe, E->e, sizeof(struct _gd_private_entry)); memcpy(&Q, E, sizeof(gd_entry_t)); + /* hiddenness isn't changeable with this interface */ + Q.hidden = E->hidden; + switch(E->field_type) { case GD_RAW_ENTRY: j = _GD_AlterScalar(D, N->EN(raw,spf) && N->EN(raw,spf) != E->EN(raw,spf), Modified: trunk/getdata/src/nfields.c =================================================================== --- trunk/getdata/src/nfields.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/nfields.c 2011-12-08 02:30:40 UTC (rev 633) @@ -1,4 +1,4 @@ -/* Copyright (C) 2008-2010 D. V. Wiebe +/* Copyright (C) 2008-2011 D. V. Wiebe * *************************************************************************** * @@ -32,8 +32,8 @@ _GD_ClearError(D); - dreturn("%u", D->n_entries - D->n_meta); - return D->n_entries - D->n_meta; + dreturn("%u", D->n_entries - D->n_hidden - D->n_meta); + return D->n_entries - D->n_hidden - D->n_meta; } unsigned int gd_nvectors(DIRFILE* D) gd_nothrow @@ -48,14 +48,19 @@ _GD_ClearError(D); - dreturn("%u", D->n_entries - D->n_meta - D->n_string - D->n_const - - D->n_carray); - return D->n_entries - D->n_meta - D->n_string - D->n_const - D->n_carray; + dreturn("%u", D->n_entries - D->n_hidden - D->n_meta + - D->n[_GD_EntryIndex(GD_STRING_ENTRY)] + - D->n[_GD_EntryIndex(GD_CONST_ENTRY)] + - D->n[_GD_EntryIndex(GD_CARRAY_ENTRY)]); + return D->n_entries - D->n_hidden - D->n_meta + - D->n[_GD_EntryIndex(GD_STRING_ENTRY)] + - D->n[_GD_EntryIndex(GD_CONST_ENTRY)] + - D->n[_GD_EntryIndex(GD_CARRAY_ENTRY)]; } unsigned int gd_nfields_by_type(DIRFILE* D, gd_entype_t type) gd_nothrow { - unsigned int i, r = 0; + const int index = _GD_EntryIndex(type); dtrace("%p, %i", D, type); @@ -67,29 +72,12 @@ _GD_ClearError(D); - switch(type) { - case GD_STRING_ENTRY: - r = D->n_string; - break; - case GD_CONST_ENTRY: - r = D->n_const; - break; - case GD_CARRAY_ENTRY: - r = D->n_carray; - break; - case GD_INDEX_ENTRY: - r = 1; - break; - case GD_NO_ENTRY: + if (index == -1) { _GD_SetError(D, GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_TYPE, NULL, type, NULL); - break; - default: - for (i = 0; i < D->n_entries; ++i) - if (D->entry[i]->field_type == type && D->entry[i]->e->n_meta != -1) - r++; - break; + dreturn("%u", 0); + return 0; } - dreturn("%u", r); - return r; + dreturn("%u", D->n[index]); + return D->n[index]; } Modified: trunk/getdata/src/nmeta.c =================================================================== --- trunk/getdata/src/nmeta.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/nmeta.c 2011-12-08 02:30:40 UTC (rev 633) @@ -1,4 +1,4 @@ -/* Copyright (C) 2008, 2010 D. V. Wiebe +/* Copyright (C) 2008, 2010, 2011 D. V. Wiebe * *************************************************************************** * @@ -44,8 +44,8 @@ _GD_ClearError(D); - dreturn("%u", P->e->n_meta); - return P->e->n_meta; + dreturn("%u", P->e->n_meta - P->e->n_hidden); + return P->e->n_meta - P->e->n_hidden; } unsigned int gd_nmvectors(DIRFILE* D, const char* parent) gd_nothrow @@ -72,17 +72,20 @@ _GD_ClearError(D); - dreturn("%u", P->e->n_meta - P->e->n_meta_string - P->e->n_meta_const - - P->e->n_meta_carray); - return P->e->n_meta - P->e->n_meta_string - P->e->n_meta_const - - P->e->n_meta_carray; + dreturn("%u", P->e->n_meta - P->e->n_hidden + - P->e->n[_GD_EntryIndex(GD_STRING_ENTRY)] + - P->e->n[_GD_EntryIndex(GD_CONST_ENTRY)] + - P->e->n[_GD_EntryIndex(GD_CARRAY_ENTRY)]); + return P->e->n_meta - P->e->n_hidden + - P->e->n[_GD_EntryIndex(GD_STRING_ENTRY)] + - P->e->n[_GD_EntryIndex(GD_CONST_ENTRY)] + - P->e->n[_GD_EntryIndex(GD_CARRAY_ENTRY)]; } unsigned int gd_nmfields_by_type(DIRFILE* D, const char* parent, gd_entype_t type) gd_nothrow { - unsigned int r = 0; - int i; + const int index = _GD_EntryIndex(type); gd_entry_t *P; dtrace("%p, %i", D, type); @@ -103,20 +106,12 @@ return 0; } - _GD_ClearError(D); - if (type == GD_STRING_ENTRY) - r = P->e->n_meta_string; - else if (type == GD_CONST_ENTRY) - r = P->e->n_meta_const; - else if (type == GD_CARRAY_ENTRY) - r = P->e->n_meta_carray; - else if (type == GD_NO_ENTRY) + if (index == -1) { _GD_SetError(D, GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_TYPE, NULL, type, NULL); - else - for (i = 0; i < P->e->n_meta; ++i) - if (P->e->p.meta_entry[i]->field_type == type) - r++; + dreturn("%u", 0); + return 0; + } - dreturn("%u", r); - return r; + dreturn("%u", P->e->n[index]); + return P->e->n[index]; } Modified: trunk/getdata/src/open.c =================================================================== --- trunk/getdata/src/open.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/open.c 2011-12-08 02:30:40 UTC (rev 633) @@ -354,6 +354,7 @@ /* Add the INDEX entry */ D->n_entries = 1; + D->n[_GD_EntryIndex(GD_INDEX_ENTRY)] = 1; D->entry = (gd_entry_t **)malloc(sizeof(gd_entry_t*)); if (D->entry) Modified: trunk/getdata/src/parse.c =================================================================== --- trunk/getdata/src/parse.c 2011-12-06 23:36:19 UTC (rev 632) +++ trunk/getdata/src/parse.c 2011-12-08 02:30:40 UTC (rev 633) @@ -1412,7 +1412,7 @@ *cptr = '\0'; P = _GD_FindField(D, in_cols[0], D->entry, D->n_entries, NULL); if (P == NULL) - _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_NO_PARENT, + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_NO_FIELD, D->fragment[me].cname, linenum, in_cols[0]); else if (P->fragment_index != me) _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_LOCATION, @@ -1500,24 +1500,16 @@ else if (strcmp(in_cols[1], "WINDOW") == 0 && (!pedantic || standards >= 9)) E = _GD_ParseWindow(D, in_cols, n_cols, P, format_file, linenum, standards, pedantic, &is_dot); - else if (strcmp(in_cols[1], "CONST") == 0 && (!pedantic || standards >= 6)) { + else if (strcmp(in_cols[1], "CONST") == 0 && (!pedantic || standards >= 6)) E = _GD_ParseConst(D, in_cols, n_cols, P, format_file, linenum, standards, pedantic, &is_dot); - if (D->error == GD_E_OK && P == NULL) - D->n_const++; - } else if (strcmp(in_cols[1], "CARRAY") == 0 && (!pedantic || standards >= 8)) - { + else if (strcmp(in_cols[1], "CARRAY") == 0 && (!pedantic || standards >= 8)) E = _GD_ParseCarray(D, in_cols, n_cols, P, format_file, linenum, standards, pedantic, &is_dot, outstring, tok_pos); - if (D->error == GD_E_OK && P == NULL) - D->n_carray++; - } else if (strcmp(in_cols[1], "STRING") == 0 && (!pedantic || standards >= 6)) - { + else if (strcmp(in_cols[1], "STRING") == 0 && (!pedantic || standards >= 6)) E = _GD_ParseString(D, in_cols, n_cols, P, format_file, linenum, standards, pedantic, &is_dot); - if (D->error == GD_E_OK && P == NULL) - D->n_string++; - } else if (standards <= GD_DIRFILE_STANDARDS_VERSION || pedantic) + else if (standards <= GD_DIRFILE_STANDARDS_VERSION || pedantic) _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_BAD_LINE, format_file, linenum, NULL); @@ -1566,13 +1558,9 @@ P->e->p.meta_entry[P->e->n_meta++] = E; D->n_meta++; - if (E->field_type == GD_CONST_ENTRY) - P->e->n_meta_const++; - else if (E->field_type == GD_CARRAY_ENTRY) - P->e->n_meta_carray++; - else if (E->field_type == GD_STRING_ENTRY) - P->e->n_meta_string++; - } + P->e->n[_GD_EntryIndex(E->field_type)]++; + } else + D->n[_GD_EntryIndex(E->field_type)]++; /* update the dot list if necessary */ if (is_dot) { @@ -1587,7 +1575,7 @@ /* return the entry object if we either: * - didn't insert the object into the list of fields (ie. we were called - * by [m]alter_spec + * by [m]alter_spec) * - found a RAW field (which might be the reference field) */ dreturn("%p", (!insert || (E && E->field_type == GD_RAW_ENTRY)) ? E : NULL); @@ -1874,25 +1862,51 @@ } else if (strcmp(ptr, "FRAMEOFFSET") == 0 && (!pedantic || *standards >= 1)) D->fragment[me].frame_offset = gd_strtoll(in_cols[1], NULL, (!pedantic || *standards >= 9) ? 0 : 10); - else if (strcmp(ptr, "INCLUDE") == 0 && (!pedantic || *standards >= 3)) { + else if (strcmp(ptr, "HIDDEN") == 0 && (!pedantic || *standards >= 9)) { + gd_entry_t *E = _GD_FindField(D, in_cols[1], D->entry, D->n_entries, NULL); + if (E == NULL) + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_NO_FIELD, D->fragment[me].cname, + linenum, in_cols[1]); + else if (E->fragment_index != me) + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_LOCATION, D->fragment[me].cname, + linenum, in_cols[1]); + else { + E->hidden = 1; + + /* update counts */ + if (E->e->n_meta != -1) { + D->n[_GD_EntryIndex(E->field_type)]--; + D->n_hidden++; + } else { + gd_entry_t *P = (gd_entry_t*)E->e->p.parent; + P->e->n_hidden++; + P->e->n[_GD_EntryIndex(E->field_type)]--; + } + } + } else if (strcmp(ptr, "INCLUDE") == 0 && (!pedantic || *standards >= 3)) { unsigned long subflags = D->fragment[me].encoding | D->fragment[me].byte_sex | (*flags & (GD_PEDANTIC | GD_PERMISSIVE | GD_FORCE_ENDIAN | GD_FORCE_ENCODING | GD_IGNORE_DUPS | GD_IGNORE_REFS)); + int frag = _GD_Include(D, in_cols[1], D->fragment[me].cname, linenum, ref_name, me, standards, &subflags); + if ((pedantic = subflags & GD_PEDANTIC)) *flags |= GD_PEDANTIC; if (frag != -1) D->fragment[me].vers |= D->fragment[frag].vers; } else if (strcmp(ptr, "META") == 0 && (!pedantic || *standards >= 6)) { - const gd_entry_t* P = _GD_FindField(D, in_cols[1], D->entry, D->n_entries, + const gd_entry_t* P = _GD_FindField(D, in_cols[1], D->entry, D->n_entries, NULL); if (P == NULL) - _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_NO_PARENT, D->fragment[me].cname, + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_NO_FIELD, D->fragment[me].cname, linenum, in_cols[1]); else if (P->fragment_index != me) _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_LOCATION, D->fragment[me].cname, linenum, in_cols[1]); + else if (P->e->n_meta == -1) + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_META_META, D->fragment[me].cname, + linenum, in_cols[1]); else if (n_cols < 4) _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_N_TOK, D->fragment[me].cname, linenum, NULL); Property changes on: trunk/getdata/test ___________________________________________________________________ Modified: svn:ignore - Makefile Makefile.in *.o *.odirfile *.swp *.exe .deps .libs convert_uint8_int8 convert_uint8_uint16 convert_uint8_int16 convert_uint8_uint32 convert_uint8_int32 convert_uint8_float32 convert_uint8_uint64 convert_uint8_int64 convert_uint8_float64 convert_int8_uint8 convert_int8_uint16 convert_int8_int16 convert_int8_uint32 convert_int8_int32 convert_int8_float32 convert_int8_uint64 convert_int8_int64 convert_int8_float64 convert_uint16_uint8 convert_uint16_int8 convert_uint16_int16 convert_uint16_uint32 convert_uint16_int32 convert_uint16_float32 convert_uint16_uint64 convert_uint16_int64 convert_uint16_float64 convert_int16_uint8 convert_int16_int8 convert_int16_uint16 convert_int16_uint32 convert_int16_int32 convert_int16_float32 convert_int16_uint64 convert_int16_int64 convert_int16_float64 convert_uint32_uint8 convert_uint32_int8 convert_uint32_uint16 convert_uint32_int16 convert_uint32_int32 convert_uint32_float32 convert_uint32_uint64 convert_uint32_int64 convert_uint32_float64 convert_int32_uint8 convert_int32_int8 convert_int32_uint16 convert_int32_int16 convert_int32_uint32 convert_int32_float32 convert_int32_uint64 convert_int32_int64 convert_int32_float64 convert_uint64_uint8 convert_uint64_int8 convert_uint64_uint16 convert_uint64_int16 convert_uint64_uint32 convert_uint64_int32 convert_uint64_float32 convert_uint64_int64 convert_uint64_float64 convert_int64_uint8 convert_int64_int8 convert_int64_uint16 convert_int64_int16 convert_int64_uint32 convert_int64_int32 convert_int64_float32 convert_int64_uint64 convert_int64_float64 convert_float32_uint8 convert_float32_int8 convert_float32_uint16 convert_float32_int16 convert_float32_uint32 convert_float32_int32 convert_float32_uint64 convert_float32_int64 convert_float32_float64 convert_float64_uint8 convert_float64_int8 convert_float64_uint16 convert_float64_int16 convert_float64_uint32 convert_float64_int32 convert_float64_float32 convert_float64_uint64 convert_float64_int64 creat creat_excl creat_rdonly flist flist_invalid get64 get_bad_code get_bit get_char get_endian8 get_endian16 get_endian32 get_endian64 get_endian_float32_big get_endian_float32_arm get_endian_float32_little get_endian_float64_big get_endian_float64_arm get_endian_float64_little get_ff get_float32 get_float64 get_foffs get_fs get_int8 get_int16 get_int32 get_int64 get_invalid get_lincom1 get_lincom2 get_lincom3 get_lincom_noin get_linterp get_linterp_noin get_linterp_notab get_multiply get_multiply_noin get_nonexistent get_null get_off64 get_phase get_recurse get_sf get_ss get_type get_uint16 get_uint32 get_uint64 legacy_get legacy_nframes legacy_nonexistent legacy_put legacy_spf nfields nfields_invalid nframes nframes64 nframes_empty nframes_invalid nframes_off64 nframes_spf open open_eaccess open_nonexistent open_notdirfile parse_badline parse_bit parse_bit4 parse_bit_bitnum parse_bit_bitsize parse_bit_ncols parse_bit_numbits parse_endian_bad parse_endian_big parse_endian_force parse_endian_little parse_foffs parse_include parse_include_nonexistent parse_index parse_lincom parse_lincom_ncols1 parse_lincom_ncols2 parse_lincom_nfields parse_lincom_nofields parse_linterp parse_linterp_ncols parse_multiply parse_multiply_ncols parse_ncols parse_phase parse_phase_ncols parse_raw parse_raw_char parse_raw_ncols parse_raw_spf parse_raw_type parse_version parse_version_include put64 put_bad_code put_bit put_bof put_char put_endian8 put_endian16 put_endian32 put_endian64 put_endian_float32_arm put_endian_float32_big put_endian_float32_little put_endian_float64_arm put_endian_float64_big put_endian_float64_little put_ff put_float32 put_float64 put_foffs put_fs put_int8 put_int16 put_int32 put_int64 put_invalid put_lincom1 put_lincom2 put_lincom_noin put_linterp put_linterp_notab put_multiply put_null put_off64 put_phase put_phase_noin put_rdonly put_recurse put_rofs put_sf put_ss put_type put_uint16 put_uint32 put_uint64 spf spf_lincom spf_multiply spf_recurse trunc trunc_rdonly trunc_rofs flush_invalid parse_version_slash flush_all flush close_null close parse_endian_slash error_error parse_name parse_include_slash close_bad parse_foffs_slash flush_bad_code dfes_bit dfes_lincom dfes_linterp dfes_multiply dfes_null dfes_phase dfes_raw dfes_zero entry_bad_code entry_bit entry_invalid entry_lincom entry_linterp entry_multiply entry_phase entry_raw legacy_get_put legacy_get_rofs add_phase add_lincom_nfields add_raw add_multiply add_bit_bitsize flush_meta add_type add_raw_type add_bit_bitnum add_bit add_format add_raw_spf put_linterp_noin error_short error add add_linterp nfragments add_duplicate add_code add_bit_numbits add_lincom add_rdonly ascii_get ascii_put ascii_nframes slim_get slim_nframes slim_put add_many add_sort nfields_type nfields_type_invalid nmeta nmeta_invalid nmeta_parent nmeta_type nmeta_type_invalid nmeta_type_parent nmeta_vectors nmeta_vectors_invalid nmeta_vectors_parent nvectors nvectors_invalid parse_const parse_const_ncols parse_duplicate parse_meta parse_meta_parent parse_meta_raw parse_quote parse_sort parse_string parse_string_ncols parse_whitespace madd_linterp_invalid madd_lincom_invalid vlist_invalid vlist_meta add_raw_invalid cvlist_invalid svlist_invalid cvlist svlist madd_phase_invalid add_invalid madd_phase add_phase_invalid add_spec_directive add_string add_linterp_invalid madd_multiply flist_type_invalid clist cvlist_meta_invalid flist_meta_invalid flist_type svlist_meta_invalid cvlist_meta vlist_meta_invalid svlist_meta parse_string_null madd_linterp madd_lincom vlist add_bit_invalid add_lincom_invalid madd_bit_invalid madd_bit add_multiply_invalid add_const madd_multiply_invalid madd add_spec_invalid flist_type_meta_invalid add_spec flist_type_meta flist_meta parse_meta_index entry_raw_scalar_code parse_bit_scalar entry_raw_scalar_type entry_lincom_scalar entry_phase_scalar entry_raw_scalar parse_lincom_scalar entry_bit_scalar parse_raw_scalar parse_phase_scalar include include_nonexistent include_creat include_invalid include_accmode include_index madd_spec_directive madd_spec_invalid madd_spec parse_quote_mismatch parse_eol parse_foffs_include put_string parse_protect_data put_const put_string_protect ref put_const_protect parse_protect_all ref_none parse_ref add_protect parse_protect_format parse_protect_bad ref_two put_protect include_rdonly parse_ref_nonexistent parse_protect_none parse_name_pedantic parse_name_dot parse_name_ext parse_duplicate_ignore gzip_get gzip_nframes gzip_put gzip_get_get bzip_get bzip_nframes bzip_put bzip_get_get global_name open_cb_abort open_cb_cont open_cb_ignore open_cb_rescan open_cb_invalid del_const_force del_const del_derived_force del_const_deref del_meta_force del_data del_meta del del_derived close_discard global_ref_set global_ref_empty include_ignore global_ref include_ref include_auto move move_index move_protect move_data_enc_ar bzip_move_from gzip_move_from move_data_foffs move_data_enc_ra move_data_endian move_data_nop alter_multiply alter_bit_bitnum alter_entry_recode alter_linterp_move alter_raw_spf alter_entry alter_bit_numbits alter_lincom_slope alter_raw_type alter_lincom_input alter_const alter_phase alter_lincom_offset alter_linterp foffs_get foffs_move foffs_alter endian_alter endian_move endian_get encode_alter encode_get encode_move protect_alter move_subdir unclude_del name_move unclude file name file_type unclude_move file_code parent protect_get global_ref_get alter_mspec alter_spec include_cb include_pc include_syntax fragment_index fragment_name fragment_name_oor entry_type alter_polynom_coeff get_polynom_noin get_polynom put_polynom_noin madd_polynom parse_polynom_scalar alter_polynom_ord parse_polynom spf_polynom entry_polynom_scalar put_polynom1 put_polynom2 parse_polynom_ncols1 parse_polynom_ncols2 alter_polynom_input add_polynom entry_polynom parse_lincom_non_ncols parse_lincom_non get_lincom_non xz_get xz_nframes lzma_get lzma_nframes add_sbit parse_sbit put_sbit get_sbit madd_sbit flush_spec index_domain madd_clincom index madd_const index_range add_clincom add_cpolynom get_clincom convert_float32_complex64 convert_int32_complex128 get_endian_complex128_big get_endian_complex128_arm get_endian_complex128_little convert_complex64_float64 parse_meta_index2 convert_uint16_complex128 put_endian_complex64_arm put_endian_complex64_big put_endian_complex64_little convert_uint16_complex64 convert_float64_complex128 repr_int8 convert_complex64_int64 convert_uint64_complex64 convert_complex64_complex128 get_const convert_uint8_complex128 parse_meta_implicit2 convert_float32_complex128 get_complex64 add_spec_meta convert_float64_complex64 convert_int16_complex128 alter_cpolynom madd_cpolynom convert_int32_complex64 alter_lincom_23 convert_complex64_uint64 repr_uint8 put_complex128 get_endian_complex64_big get_endian_complex64_arm get_endian_complex64_little alter_spec_meta repr_real_a repr_real_i repr_real_m repr_real_r repr_int16 convert_uint8_complex64 repr_int32 madd_string convert_complex128_float64 repr_uint16 repr_int64 put_endian_complex128_arm put_endian_complex128_big put_endian_complex128_little get_complex128 repr_uint32 convert_complex128_uint64 get_const_repr convert_complex128_int64 repr_float32 repr_uint64 convert_int16_complex64 repr_float64 put_complex64 convert_uint64_complex128 convert_int64_complex64 repr_a repr_i repr_m repr_r get_const_complex convert_int8_complex128 convert_uint32_complex128 parse_meta_implicit get_cpolynom put_repr convert_complex128_complex64 convert_int8_complex64 convert_uint32_complex64 convert_int64_complex128 move_meta add_scalar alter_entry_scalar2a alter_entry_scalar2n alter_entry_scalar3 alter_entry_scalar4 get_zero entry_scalar_repr header_complex version_5_strict parse_version_permissive version_7_strict version_0 version_1 version_2 version_3 version_4 version_5 version_6 version_7 version_6_strict eof eof_index eof_lincom eof_phase bof bof_lincom bof_phase put_linterp_nomono get_linterp_sort put_linterp_reverse alter_lincom_32 parse_recip parse_divide alter_recip dfes_recip add_crecip89 add_divide put_divide madd_recip add_crecip get_recip_const spf_divide add_divide_invalid version_8 alter_crecip89 put_recip spf_recip madd_crecip89 alter_divide get_recip alter_crecip madd_divide dfes_divide madd_crecip add_recip get_divide version_8_strict version_5_write version_0_write version_7_write version_2_write version_4_write version_6_write version_1_write version_8_write version_3_write put_carray_slice cvlist_array_meta del_carray get_carray_slice cvlist_array del_carray_deref nmeta_vectors_del get_carray parse_carray madd_carray add_carray put_carray get_carray_len parse_carray_long alter_carray_len alter_carray_type ascii_get_get parse_include_relabs parse_include_absrel parse_include_relrel parse_include_absolute add_raw_include alter_crecip_zero alter_recip_zero error_num sie_put_little sie_get_big sie_move_to sie_nframes_big sie_get_little sie_nframes_little sie_move_from sie_put_big seek_end get_here entry_divide tell get_heres entry_recip seek_cur put_here seek64 seek_set tell64 put_heres get_here_foffs seek_foffs get_rofs endian_alter_sie gzip_get_put gzip_put_get gzip_move_to ascii_add gzip_add add_scalar_carray parse_window_scalar add_window_op entry_window alter_window get_window_clr get_window parse_window_ncols get_window_set entry_window_scalar get_window_ge get_window_gt madd_window parse_window_op get_window_le get_window_lt get_window_ne parse_window add_window put_window + Makefile Makefile.in *.o *.odirfile *.swp *.exe .deps .libs add add_bit add_bit_bitnum add_bit_bitsize add_bit_invalid add_bit_numbits add_carray add_clincom add_code add_const add_cpolynom add_crecip add_crecip89 add_divide add_divide_invalid add_duplicate add_format add_invalid add_lincom add_lincom_invalid add_lincom_nfields add_linterp add_linterp_invalid add_multiply add_multiply_invalid add_phase add_phase_invalid add_polynom add_protect add_raw add_raw_include add_raw_invalid add_raw_spf add_raw_type add_rdonly add_recip add_sbit add_scalar add_scalar_carray add_sort add_spec add_spec_directive add_spec_invalid add_spec_meta add_string add_type add_window add_window_op alter_bit_bitnum alter_bit_numbits alter_carray_len alter_carray_type alter_const alter_cpolynom alter_crecip alter_crecip89 alter_crecip_zero alter_divide alter_entry alter_entry_hidden alter_entry_recode alter_entry_scalar2a alter_entry_scalar2n alter_entry_scalar3 alter_entry_scalar4 alter_lincom_23 alter_lincom_32 alter_lincom_input alter_lincom_offset alter_lincom_slope alter_linterp alter_linterp_move alter_mspec alter_multiply alter_phase alter_polynom_coeff alter_polynom_input alter_polynom_ord alter_raw_spf alter_raw_type alter_recip alter_recip_zero alter_spec alter_spec_meta alter_window ascii_add ascii_get ascii_get_get ascii_nframes ascii_put bof bof_lincom bof_phase bzip_get bzip_get_get bzip_move_from bzip_nframes bzip_put close close_bad close_discard close_null convert_complex128_complex64 convert_complex128_float64 convert_complex128_int64 convert_complex128_uint64 convert_complex64_complex128 convert_complex64_float64 convert_complex64_int64 convert_complex64_uint64 convert_float32_complex128 convert_float32_complex64 convert_float32_float64 convert_float32_int16 convert_float32_int32 convert_float32_int64 convert_float32_int8 convert_float32_uint16 convert_float32_uint32 convert_float32_uint64 convert_float32_uint8 convert_float64_complex128 convert_float64_complex64 convert_float64_float32 convert_float64_int16 convert_float64_int32 convert_float64_int64 convert_float64_int8 convert_float64_uint16 convert_float64_uint32 convert_float64_uint64 convert_float64_uint8 convert_int16_complex128 convert_int16_complex64 convert_int16_float32 convert_int16_float64 convert_int16_int32 convert_int16_int64 convert_int16_int8 convert_int16_uint16 convert_int16_uint32 convert_int16_uint64 convert_int16_uint8 convert_int32_complex128 convert_int32_complex64 convert_int32_float32 convert_int32_float64 convert_int32_int16 convert_int32_int64 convert_int32_int8 convert_int32_uint16 convert_int32_uint32 convert_int32_uint64 convert_int32_uint8 convert_int64_complex128 convert_int64_complex64 convert_int64_float32 convert_int64_float64 convert_int64_int16 convert_int64_int32 convert_int64_int8 convert_int64_uint16 convert_int64_uint32 convert_int64_uint64 convert_int64_uint8 convert_int8_complex128 convert_int8_complex64 convert_int8_float32 convert_int8_float64 convert_int8_int16 convert_int8_int32 convert_int8_int64 convert_int8_uint16 convert_int8_uint32 convert_int8_uint64 convert_int8_uint8 convert_uint16_complex128 convert_uint16_complex64 convert_uint16_float32 convert_uint16_float64 convert_uint16_int16 convert_uint16_int32 convert_uint16_int64 convert_uint16_int8 convert_uint16_uint32 convert_uint16_uint64 convert_uint16_uint8 convert_uint32_complex128 convert_uint32_complex64 convert_uint32_float32 convert_uint32_float64 convert_uint32_int16 convert_uint32_int32 convert_uint32_int64 convert_uint32_int8 convert_uint32_uint16 convert_uint32_uint64 convert_uint32_uint8 convert_uint64_complex128 convert_uint64_complex64 convert_uint64_float32 convert_uint64_float64 convert_uint64_int16 convert_uint64_int32 convert_uint64_int64 convert_uint64_int8 convert_uint64_uint16 convert_uint64_uint32 convert_uint64_uint8 convert_uint8_complex128 convert_uint8_complex64 convert_uint8_float32 convert_uint8_float64 convert_uint8_int16 convert_uint8_int32 convert_uint8_int64 convert_uint8_int8 convert_uint8_uint16 convert_uint8_uint32 convert_uint8_uint64 creat creat_excl creat_rdonly cvlist cvlist_array cvlist_array_hidden cvlist_array_meta cvlist_array_meta_hidden cvlist_hidden cvlist_invalid cvlist_meta cvlist_meta_hidden cvlist_meta_invalid del del_carray del_carray_deref del_const del_const_deref del_const_force del_data del_derived del_derived_force del_meta del_meta_force dfes_bit dfes_divide dfes_lincom dfes_linterp dfes_multiply dfes_null dfes_phase dfes_raw dfes_recip dfes_zero encode_alter encode_get encode_move endian_alter endian_alter_sie endian_get endian_move entry_bad_code entry_bit entry_bit_scalar entry_divide entry_invalid entry_lincom entry_lincom_scalar entry_linterp entry_multiply entry_phase entry_phase_scalar entry_polynom entry_polynom_scalar entry_raw entry_raw_scalar entry_raw_scalar_code entry_raw_scalar_type entry_recip entry_scalar_repr entry_type entry_window entry_window_scalar eof eof_index eof_lincom eof_phase error error_error error_num error_short file file_code file_type flist flist_hidden flist_invalid flist_meta flist_meta_hidden flist_meta_invalid flist_type flist_type_hidden flist_type_invalid flist_type_meta flist_type_meta_hidden flist_type_meta_invalid flush flush_all flush_bad_code flush_invalid flush_meta flush_spec foffs_alter foffs_get foffs_move fragment_index fragment_name fragment_name_oor get64 get_bad_code get_bit get_carray get_carray_len get_carray_slice get_char get_clincom get_complex128 get_complex64 get_const get_const_complex get_const_repr get_cpolynom get_divide get_endian16 get_endian32 get_endian64 get_endian8 get_endian_complex128_arm get_endian_complex128_big get_endian_complex128_little get_endian_complex64_arm get_endian_complex64_big get_endian_complex64_little get_endian_float32_arm get_endian_float32_big get_endian_float32_little get_endian_float64_arm get_endian_float64_big get_endian_float64_little get_ff get_float32 get_float64 get_foffs get_fs get_here get_here_foffs get_heres get_int16 get_int32 get_int64 get_int8 get_invalid get_lincom1 get_lincom2 get_lincom3 get_lincom_noin get_lincom_non get_linterp get_linterp_noin get_linterp_notab get_linterp_sort get_multiply get_multiply_noin get_nonexistent get_null get_off64 get_phase get_polynom get_polynom_noin get_recip get_recip_const get_recurse get_rofs get_sbit get_sf get_ss get_type get_uint16 get_uint32 get_uint64 get_window get_window_clr get_window_ge get_window_gt get_window_le get_window_lt get_window_ne get_window_set get_zero global_name global_ref global_ref_empty global_ref_set gzip_add gzip_get gzip_get_get gzip_get_put gzip_move_from gzip_move_to gzip_nframes gzip_put gzip_put_get header_complex hide hide_unhide include include_accmode include_auto include_cb include_creat include_ignore include_index include_invalid include_nonexistent include_pc include_ref include_syntax index index_domain index_range legacy_get legacy_get_put legacy_get_rofs legacy_nframes legacy_nonexistent legacy_put legacy_spf lzma_get lzma_nframes madd madd_bit madd_bit_invalid madd_carray madd_clincom madd_const madd_cpolynom madd_crecip madd_crecip89 madd_divide madd_lincom madd_lincom_invalid madd_linterp madd_linterp_invalid madd_multiply madd_multiply_invalid madd_phase madd_phase_invalid madd_polynom madd_recip madd_sbit madd_spec madd_spec_directive madd_spec_invalid madd_string madd_window move move_data_enc_ar move_data_enc_ra move_data_endian move_data_foffs move_data_nop move_index move_meta move_protect move_subdir name name_move nfields nfields_hidden nfields_invalid nfields_type nfields_type_hidden nfields_type_invalid nfields_vector nfields_vector_hidden nfields_vector_invalid nfragments nframes nframes64 nframes_empty nframes_invalid nframes_off64 nframes_spf nmeta nmeta_hidden nmeta_invalid nmeta_parent nmeta_type nmeta_type_hidden nmeta_type_invalid nmeta_type_parent nmeta_vectors nmeta_vectors_del nmeta_vectors_hidden nmeta_vectors_invalid nmeta_vectors_parent open open_cb_abort open_cb_cont open_cb_ignore open_cb_invalid open_cb_rescan open_eaccess open_nonexistent open_notdirfile parent parse_badline parse_bit parse_bit4 parse_bit_bitnum parse_bit_bitsize parse_bit_ncols parse_bit_numbits parse_bit_scalar parse_carray parse_carray_long parse_const parse_const_ncols parse_divide parse_duplicate parse_duplicat... [truncated message content] |
From: <ket...@us...> - 2011-12-06 23:36:29
|
Revision: 632 http://getdata.svn.sourceforge.net/getdata/?rev=632&view=rev Author: ketiltrout Date: 2011-12-06 23:36:19 +0000 (Tue, 06 Dec 2011) Log Message: ----------- Dirfile Standards Version 9. * [DSV 9] WINDOW derived field. * [DSV 9] Allow octal (0...) and hex (0[Xx]...) literals in format file. * [bug] return error genenerated by _GD_SetScalar from _GD_ParseRecip _GD_ParsePhase. * [bug] correctly write RECIP fields to format. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/cmake/CMakeLists.txt trunk/getdata/configure.ac trunk/getdata/man/gd_getdata.3 trunk/getdata/src/add.c trunk/getdata/src/del.c trunk/getdata/src/entry.c trunk/getdata/src/errors.c trunk/getdata/src/field_list.c trunk/getdata/src/flimits.c trunk/getdata/src/flush.c trunk/getdata/src/fpos.c trunk/getdata/src/getdata.c trunk/getdata/src/getdata.h.in trunk/getdata/src/internal.h trunk/getdata/src/legacy.c trunk/getdata/src/mod.c trunk/getdata/src/native.c trunk/getdata/src/parse.c trunk/getdata/src/putdata.c trunk/getdata/src/spf.c trunk/getdata/test/Makefile.am trunk/getdata/test/get_phase.c trunk/getdata/test/madd_phase.c trunk/getdata/test/version_6.c trunk/getdata/test/version_7.c trunk/getdata/test/version_8.c Added Paths: ----------- trunk/getdata/test/add_window.c trunk/getdata/test/add_window_op.c trunk/getdata/test/alter_window.c trunk/getdata/test/entry_window.c trunk/getdata/test/entry_window_scalar.c trunk/getdata/test/get_window.c trunk/getdata/test/get_window_clr.c trunk/getdata/test/get_window_ge.c trunk/getdata/test/get_window_gt.c trunk/getdata/test/get_window_le.c trunk/getdata/test/get_window_lt.c trunk/getdata/test/get_window_ne.c trunk/getdata/test/get_window_set.c trunk/getdata/test/madd_window.c trunk/getdata/test/parse_window.c trunk/getdata/test/parse_window_ncols.c trunk/getdata/test/parse_window_op.c trunk/getdata/test/parse_window_scalar.c trunk/getdata/test/put_window.c Property Changed: ---------------- trunk/getdata/test/ Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/ChangeLog 2011-12-06 23:36:19 UTC (rev 632) @@ -1,3 +1,45 @@ +2011-12-06 D. V. Wiebe <ge...@ke...> svn:632 + * test/get_window_ne.c test/get_window.c test/parse_window_scalar.c + test/alter_window.c test/parse_window.c test/madd_window.c + test/parse_window_ncols.c test/add_window.c test/put_window.c + test/get_window_set.c test/get_window_gt.c test/get_window_ge.c + test/parse_window_op.c test/entry_window.c test/entry_window_scalar.c + test/add_window_op.c test/get_window_lt.c test/get_window_clr.c + test/get_window_le.c: Added. + + * test/madd_phase.c: Fix check. + + * test/version_6.c test/version_7.c test/version_8.c: Update for Version 9. + + * cmake/CMakeLists.txt configure.ac: Define gd_int64_t. + + * src/getdata.h.in: Add GD_WINDOW_ENTRY, gd_windop_t, gd_triplet_t. + * src/entry.c (_GD_FreeE _GD_CalculateEntry gd_entry) legacy.c (GetFormat) + src/getdata.c (_GD_DoField) src/errors.c src/flush.c (_GD_Flush + _GD_FieldSpec) src/native.c (_GD_NativeType) src/spf.c (_GD_GetSPF) + src/putdata.c (_GD_DoFieldOut) src/del.c (_GD_ClearDerived _GD_DeReference) + src/flimits.c (_GD_GetEOF _GD_GetBOF) src/fpos.c (_GD_GetFilePos _GD_Seek) + src/parse.c (_GD_ParseFieldSpec) src/field_list.c src/mod.c (_GD_Change) + src/add.c (_GD_Add): Update for WINDOW. + * src/legacy.c (CopyWindowEntry) src/getdata.c (_GD_WindowData _GD_DoWindow) + src/flush.c (_GD_WindopName) src/parse.c (_GD_WindOp _GD_ParseWindow) + src/mod.c (gd_alter_window) src/internal.h (_GD_BadWindop) src/add.c + (gd_add_window gd_madd_window): Added. + * src/flush.c (_GD_WriteConst): Write GD_UINT64. + + * src/flush.c (_GD_WriteConst): Fix writing of RECIP fields. + + * src/parse.c (_GD_ParseRecip _GD_ParsePhase): Fail if SetScalar fails. + + * src/parse.c (_GD_SetScalar): Don't bother trying to decode an imaginary + part before failing if we're not interested in complex numbers. + + * src/parse.c (_GD_SetScalar): Call strto[u]ll with base=0 for Version >= 9 to + allow automatic parsing of 0x[hex] and 0[octal] numbers in format files. + + * src/getdata.h.in: Increment GD_DIRFILE_STANDARDS_VERSION. + * src/flush.c (_GD_FindVersion): Update for Version 9. + 2011-12-05 D. V. Wiebe <ge...@ke...> svn:630 * python/test/callback.pl python/test/big_test.py cxx/test/big_test.cpp f77/test/big_test.f f77/test/big_test95.f90: Fix path checks. Modified: trunk/getdata/cmake/CMakeLists.txt =================================================================== --- trunk/getdata/cmake/CMakeLists.txt 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/cmake/CMakeLists.txt 2011-12-06 23:36:19 UTC (rev 632) @@ -40,6 +40,7 @@ set(DEFINE_gd_int16_t "#define gd_int16_t short int") set(DEFINE_gd_uint16_t "#define gd_uint16_t unsigned short int") set(DEFINE_gd_int64_t "#define gd_int64_t __int64") +set(DEFINE_gd_uint64_t "#define gd_int64_t __uint64") Modified: trunk/getdata/configure.ac =================================================================== --- trunk/getdata/configure.ac 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/configure.ac 2011-12-06 23:36:19 UTC (rev 632) @@ -660,12 +660,24 @@ gd_int64_t="long long int" fi -DEFINE_gd_int16_t="#define gd_int16_t $gd_int16_t"; -DEFINE_gd_uint16_t="#define gd_uint16_t $gd_uint16_t"; -DEFINE_gd_int64_t="#define gd_int64_t $gd_int64_t"; +if test $ac_cv_sizeof_unsigned_int -eq 8; then + gd_uint64_t="int" +elif test $ac_cv_sizeof_unsigned_short_int -eq 8; then + gd_uint64_t="short int" +elif test $ac_cv_sizeof_unsigned_long_int -eq 8; then + gd_uint64_t="long int" +elif test $ac_cv_sizeof_unsigned_long_long_int -eq 8; then + gd_uint64_t="long long int" +fi + +DEFINE_gd_int16_t="# define gd_int16_t $gd_int16_t"; +DEFINE_gd_uint16_t="# define gd_uint16_t $gd_uint16_t"; +DEFINE_gd_int64_t="# define gd_int64_t $gd_int64_t"; +DEFINE_gd_uint64_t="# define gd_uint64_t $gd_uint64_t"; AC_SUBST([DEFINE_gd_int16_t]) AC_SUBST([DEFINE_gd_uint16_t]) AC_SUBST([DEFINE_gd_int64_t]) +AC_SUBST([DEFINE_gd_uint64_t]) dnl library functions echo Modified: trunk/getdata/man/gd_getdata.3 =================================================================== --- trunk/getdata/man/gd_getdata.3 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/man/gd_getdata.3 2011-12-06 23:36:19 UTC (rev 632) @@ -255,6 +255,16 @@ A descriptive error string for the last error encountered can be obtained from a call to .BR gd_error_string (3). +.SH NOTES +To save memory, +.BR gd_getdata () +uses the memory pointed to by +.I data_out +as scratch space while computing derived fields. As a result, if an error is +encountered during the computation, the contents of this memory buffer are +unspecified, and may have been modified by this call, even though +.BR gd_getdata () +will report zero data returned on error. .SH LIMITATIONS The .B PHASE Modified: trunk/getdata/src/add.c =================================================================== --- trunk/getdata/src/add.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/add.c 2011-12-06 23:36:19 UTC (rev 632) @@ -113,6 +113,7 @@ entry->field_type != GD_SBIT_ENTRY && entry->field_type != GD_DIVIDE_ENTRY && entry->field_type != GD_RECIP_ENTRY && + entry->field_type != GD_WINDOW_ENTRY && entry->field_type != GD_CARRAY_ENTRY && entry->field_type != GD_STRING_ENTRY) { @@ -309,6 +310,19 @@ _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); copy_scalar[0] = 1; break; + case GD_WINDOW_ENTRY: + E->EN(window,windop) = entry->EN(window,windop); + E->EN(window,threshold) = entry->EN(window,threshold); + + if ((E->in_fields[0] = strdup(entry->in_fields[0])) == NULL) + _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + else if ((E->in_fields[1] = strdup(entry->in_fields[1])) == NULL) + _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + else if (_GD_BadWindop(E->EN(window,windop))) + _GD_SetError(D, GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_WINDOP, NULL, + entry->EN(window,windop), NULL); + copy_scalar[0] = 1; + break; case GD_CONST_ENTRY: E->EN(scalar,const_type) = entry->EN(scalar,const_type); E->EN(scalar,array_len) = -1; @@ -1094,6 +1108,38 @@ return error; } +/* add a WINDOW entry */ +int gd_add_window(DIRFILE *D, const char *field_code, const char *in_field, + const char *check_field, gd_windop_t windop, gd_triplet_t threshold, + 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, + (unsigned long long)threshold.u, (long long)threshold.i, fragment_index); + + if (D->flags & GD_INVALID) {/* don't crash */ + _GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL); + dreturn("%i", -1); + return -1; + } + + memset(&E, 0, sizeof(gd_entry_t)); + E.field = (char *)field_code; + E.field_type = GD_WINDOW_ENTRY; + E.EN(window,threshold) = threshold; + E.EN(window,windop) = windop; + 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); + + dreturn("%i", error); + return error; +} + /* add a STRING entry */ int gd_add_string(DIRFILE* D, const char* field_code, const char* value, int fragment_index) gd_nothrow @@ -1652,6 +1698,37 @@ return error; } +/* add a META WINDOW entry */ +int gd_madd_window(DIRFILE *D, const char *parent, const char *field_code, + 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, + field_code, in_field, check_field, windop, threshold.r, + (unsigned long long)threshold.u, (long long)threshold.i); + + if (D->flags & GD_INVALID) {/* don't crash */ + _GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL); + dreturn("%i", -1); + return -1; + } + + memset(&E, 0, sizeof(gd_entry_t)); + E.field = (char *)field_code; + E.field_type = GD_WINDOW_ENTRY; + E.EN(window,threshold) = threshold; + 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); + + dreturn("%i", error); + return error; +} + /* add a META STRING entry */ int gd_madd_string(DIRFILE* D, const char* parent, const char* field_code, const char* value) gd_nothrow Modified: trunk/getdata/src/del.c =================================================================== --- trunk/getdata/src/del.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/del.c 2011-12-06 23:36:19 UTC (rev 632) @@ -40,6 +40,7 @@ break; case GD_MULTIPLY_ENTRY: case GD_DIVIDE_ENTRY: + case GD_WINDOW_ENTRY: if (strcmp(E->in_fields[1], C->field) == 0) { if (check) _GD_SetError(D, GD_E_DELETE, GD_E_DEL_DERIVED, E->field, 0, @@ -170,6 +171,24 @@ case GD_PHASE_ENTRY: _GD_DeReferenceOne(D, E, C, check, 0, GD_INT64, &E->EN(phase,shift)); break; + case GD_WINDOW_ENTRY: + switch (E->EN(window,windop)) { + case GD_WINDOP_EQ: + case GD_WINDOP_NE: + _GD_DeReferenceOne(D, E, C, check, 0, GD_INT64, + &E->EN(window,threshold.i)); + break; + case GD_WINDOP_SET: + case GD_WINDOP_CLR: + _GD_DeReferenceOne(D, E, C, check, 0, GD_UINT64, + &E->EN(window,threshold.u)); + break; + default: + _GD_DeReferenceOne(D, E, C, check, 0, GD_FLOAT64, + &E->EN(window,threshold.r)); + break; + } + break; case GD_NO_ENTRY: case GD_LINTERP_ENTRY: case GD_MULTIPLY_ENTRY: Modified: trunk/getdata/src/entry.c =================================================================== --- trunk/getdata/src/entry.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/entry.c 2011-12-06 23:36:19 UTC (rev 632) @@ -51,10 +51,6 @@ free(entry->e->u.linterp.lut); } break; - case GD_RECIP_ENTRY: - free(entry->in_fields[0]); - free(entry->scalar[0]); - break; case GD_DIVIDE_ENTRY: case GD_MULTIPLY_ENTRY: free(entry->in_fields[1]); @@ -65,6 +61,7 @@ free(entry->scalar[1]); /* fallthrough */ case GD_PHASE_ENTRY: + case GD_RECIP_ENTRY: free(entry->scalar[0]); free(entry->in_fields[0]); break; @@ -92,6 +89,11 @@ free(entry->e->u.raw.file[1].name); } break; + case GD_WINDOW_ENTRY: + free(entry->scalar[0]); + free(entry->in_fields[0]); + free(entry->in_fields[1]); + break; case GD_INDEX_ENTRY: case GD_NO_ENTRY: break; @@ -240,6 +242,21 @@ case GD_PHASE_ENTRY: _GD_GetScalar(D, E, 0, GD_INT64, &E->EN(phase,shift)); break; + case GD_WINDOW_ENTRY: + switch (E->EN(window,windop)) { + case GD_WINDOP_EQ: + case GD_WINDOP_NE: + _GD_GetScalar(D, E, 0, GD_INT64, &E->EN(window,threshold.i)); + break; + case GD_WINDOP_SET: + case GD_WINDOP_CLR: + _GD_GetScalar(D, E, 0, GD_UINT64, &E->EN(window,threshold.u)); + break; + default: + _GD_GetScalar(D, E, 0, GD_FLOAT64, &E->EN(window,threshold.r)); + break; + } + break; case GD_NO_ENTRY: case GD_LINTERP_ENTRY: case GD_MULTIPLY_ENTRY: @@ -409,6 +426,12 @@ if (E->scalar[0]) entry->scalar[0] = strdup(E->scalar[0]); break; + case GD_WINDOW_ENTRY: + entry->in_fields[0] = strdup(E->in_fields[0]); + entry->in_fields[1] = strdup(E->in_fields[1]); + if (E->scalar[0]) + entry->scalar[0] = strdup(E->scalar[0]); + break; case GD_INDEX_ENTRY: case GD_CONST_ENTRY: case GD_CARRAY_ENTRY: @@ -522,6 +545,7 @@ break; case GD_DIVIDE_ENTRY: case GD_MULTIPLY_ENTRY: + case GD_WINDOW_ENTRY: _GD_BadInput(D, E, 1); /* fallthrough */ case GD_LINTERP_ENTRY: Modified: trunk/getdata/src/errors.c =================================================================== --- trunk/getdata/src/errors.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/errors.c 2011-12-06 23:36:19 UTC (rev 632) @@ -70,6 +70,8 @@ "Bad protection level on line {3} of {2}: {4}", 0 }, { GD_E_FORMAT, GD_E_FORMAT_LITERAL, "Unexpected characters in scalar literal ({4}) on line {3} of {2}", 0 }, + { GD_E_FORMAT, GD_E_FORMAT_WINDOP, + "Unrecognised operator ({4}) on line {3} of {2}", 0 }, /* GD_E_TRUNC: 1 = suberror, 2 = filename. 3 = errno */ { GD_E_TRUNC, 0, "Error truncating {2}: ", 1 }, /* GD_E_CREAT: 1 = suberror, 2 = filename, 3 = errno */ @@ -130,6 +132,8 @@ { GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_METARAW, "Invalid metafield type: {3}", 0 }, { GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_POLYORD, "POLYNOM order out of range: {3}", 0 }, + { GD_E_BAD_ENTRY, GD_E_BAD_ENTRY_WINDOP, "Unrecognised WINDOW operator: {3}", + 0 }, /* GD_E_DUPLICATE: 4 = name */ { GD_E_DUPLICATE, 0, "Field code already present: {4}", 0 }, /* GD_E_DIMENSION: 2 = parent field (if any), 4 = field code */ Modified: trunk/getdata/src/field_list.c =================================================================== --- trunk/getdata/src/field_list.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/field_list.c 2011-12-06 23:36:19 UTC (rev 632) @@ -29,8 +29,8 @@ { GD_RAW_ENTRY, GD_LINCOM_ENTRY, GD_LINTERP_ENTRY, GD_BIT_ENTRY, GD_MULTIPLY_ENTRY, GD_PHASE_ENTRY, GD_INDEX_ENTRY, GD_POLYNOM_ENTRY, - GD_SBIT_ENTRY, GD_DIVIDE_ENTRY, GD_RECIP_ENTRY, GD_CONST_ENTRY, - GD_STRING_ENTRY, GD_CARRAY_ENTRY + GD_SBIT_ENTRY, GD_DIVIDE_ENTRY, GD_RECIP_ENTRY, GD_WINDOW_ENTRY, + GD_CONST_ENTRY, GD_STRING_ENTRY, GD_CARRAY_ENTRY }; const void *gd_constants(DIRFILE* D, gd_type_t return_type) gd_nothrow Modified: trunk/getdata/src/flimits.c =================================================================== --- trunk/getdata/src/flimits.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/flimits.c 2011-12-06 23:36:19 UTC (rev 632) @@ -211,12 +211,8 @@ case GD_LINTERP_ENTRY: case GD_SBIT_ENTRY: case GD_POLYNOM_ENTRY: - if (_GD_BadInput(D, E, 0)) - break; - - ns = _GD_GetEOF(D, E->e->entry[0], E->field, is_index); - break; case GD_RECIP_ENTRY: + case GD_WINDOW_ENTRY: if (_GD_BadInput(D, E, 0)) break; @@ -415,6 +411,8 @@ case GD_SBIT_ENTRY: case GD_LINTERP_ENTRY: case GD_POLYNOM_ENTRY: + case GD_RECIP_ENTRY: + case GD_WINDOW_ENTRY: if (_GD_BadInput(D, E, 0)) break; @@ -445,12 +443,6 @@ } break; - case GD_RECIP_ENTRY: - if (_GD_BadInput(D, E, 0)) - break; - - bof = _GD_GetBOF(D, E->e->entry[0], E->field, spf, ds); - break; case GD_MULTIPLY_ENTRY: case GD_DIVIDE_ENTRY: if (_GD_BadInput(D, E, 0) || _GD_BadInput(D, E, 1)) Modified: trunk/getdata/src/flush.c =================================================================== --- trunk/getdata/src/flush.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/flush.c 2011-12-06 23:36:19 UTC (rev 632) @@ -60,6 +60,7 @@ /* fallthrough */ case GD_MULTIPLY_ENTRY: case GD_DIVIDE_ENTRY: + case GD_WINDOW_ENTRY: _GD_Flush(D, E->e->entry[1], clo); /* fallthrough */ case GD_LINTERP_ENTRY: @@ -172,6 +173,47 @@ return ptr; } +static const char *_GD_WindopName(DIRFILE *D, gd_windop_t op) +{ + const char *ptr; + + dtrace("%p, %i", D, op); + + switch(op) { + case GD_WINDOP_EQ: + ptr = "EQ"; + break; + case GD_WINDOP_GE: + ptr = "GE"; + break; + case GD_WINDOP_GT: + ptr = "GT"; + break; + case GD_WINDOP_LE: + ptr = "LE"; + break; + case GD_WINDOP_LT: + ptr = "LT"; + break; + case GD_WINDOP_NE: + ptr = "NE"; + break; + case GD_WINDOP_SET: + ptr = "SET"; + break; + case GD_WINDOP_CLR: + ptr = "CLR"; + break; + default: + _GD_InternalError(D); + ptr = ""; + break; + } + + dreturn("\"%s\"", ptr); + return ptr; +} + static size_t _GD_StringEscapeise(FILE* stream, const char* in, int permissive, int standards) { @@ -231,7 +273,7 @@ static void _GD_WriteConst(DIRFILE *D, FILE* stream, int type, const void* value, const char* scalar, int index, const char* postamble) { - dtrace("%p, %p, %i, %p, \"%s\", %i, \"%s\"", D, stream, type, value, scalar, + dtrace("%p, %p, 0x%X, %p, \"%s\", %i, \"%s\"", D, stream, type, value, scalar, index, postamble); if (scalar != NULL) { @@ -241,6 +283,8 @@ fprintf(stream, "%s<%i>%s", scalar, index, postamble); } else if (type == GD_UINT16) fprintf(stream, "%" PRIu16 "%s", *(uint16_t *)value, postamble); + else if (type == GD_UINT64) + fprintf(stream, "%" PRIu64 "%s", *(uint64_t *)value, postamble); else if (type == GD_INT64) fprintf(stream, "%" PRIi64 "%s", *(uint64_t *)value, postamble); else if (type == GD_INT16) @@ -332,10 +376,9 @@ E->in_fields[0]); break; case GD_RECIP_ENTRY: - fprintf(stream, " RECIP%s ", pretty ? " " : ""); + fprintf(stream, " RECIP%s %s ", pretty ? " " : "", E->in_fields[0]); _GD_WriteConst(D, stream, GD_COMPLEX128, &E->EN(recip,cdividend), E->scalar[0], E->scalar_ind[0], ""); - fprintf(stream, " %s", E->in_fields[0]); break; case GD_MULTIPLY_ENTRY: fprintf(stream, " MULTIPLY %s %s\n", E->in_fields[0], E->in_fields[1]); @@ -364,6 +407,27 @@ _GD_WriteConst(D, stream, GD_INT16, &E->EN(bit,numbits), E->scalar[1], E->scalar_ind[1], "\n"); break; + case GD_WINDOW_ENTRY: + fprintf(stream, " WINDOW%s %s %s %s ", pretty ? " " : "", + E->in_fields[0], E->in_fields[1], + _GD_WindopName(D, E->EN(window,windop))); + switch (E->EN(window,windop)) { + case GD_WINDOP_EQ: + case GD_WINDOP_NE: + _GD_WriteConst(D, stream, GD_INT64, &E->EN(window,threshold.i), + E->scalar[0], E->scalar_ind[0], ""); + break; + case GD_WINDOP_SET: + case GD_WINDOP_CLR: + _GD_WriteConst(D, stream, GD_UINT64, &E->EN(window,threshold.u), + E->scalar[0], E->scalar_ind[0], ""); + break; + default: + _GD_WriteConst(D, stream, GD_FLOAT64, &E->EN(window,threshold.r), + E->scalar[0], E->scalar_ind[0], ""); + break; + } + break; case GD_CONST_ENTRY: fprintf(stream, " CONST%s %s ", pretty ? " " : "", _GD_TypeName(D, E->EN(scalar,const_type))); @@ -742,6 +806,7 @@ #define GD_VERS_GE_6 0xFFFFFFFFFFFFFFC0LU #define GD_VERS_GE_7 0xFFFFFFFFFFFFFF80LU #define GD_VERS_GE_8 0xFFFFFFFFFFFFFF00LU +#define GD_VERS_GE_9 0xFFFFFFFFFFFFFE00LU #define GD_VERS_LE_0 0x0000000000000001LU #define GD_VERS_LE_1 0x0000000000000003LU @@ -752,6 +817,7 @@ #define GD_VERS_LE_6 0x000000000000007fLU #define GD_VERS_LE_7 0x00000000000000ffLU #define GD_VERS_LE_8 0x00000000000001ffLU +#define GD_VERS_LE_9 0x00000000000003ffLU uint64_t _GD_FindVersion(DIRFILE *D) { @@ -841,6 +907,9 @@ D->av &= GD_VERS_GE_5; } break; + case GD_WINDOW_ENTRY: + D->av &= GD_VERS_GE_9; + break; case GD_LINTERP_ENTRY: case GD_LINCOM_ENTRY: case GD_INDEX_ENTRY: Modified: trunk/getdata/src/fpos.c =================================================================== --- trunk/getdata/src/fpos.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/fpos.c 2011-12-06 23:36:19 UTC (rev 632) @@ -73,6 +73,7 @@ break; case GD_MULTIPLY_ENTRY: case GD_DIVIDE_ENTRY: + case GD_WINDOW_ENTRY: if (_GD_BadInput(D, E, 0) || _GD_BadInput(D, E, 1)) break; pos = _GD_GetFilePos(D, E->e->entry[0], 0); @@ -268,6 +269,7 @@ break; case GD_MULTIPLY_ENTRY: case GD_DIVIDE_ENTRY: + case GD_WINDOW_ENTRY: if (_GD_BadInput(D, E, 1)) break; if (_GD_Seek(D, E->e->entry[1], offset, mode)) Modified: trunk/getdata/src/getdata.c =================================================================== --- trunk/getdata/src/getdata.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/getdata.c 2011-12-06 23:36:19 UTC (rev 632) @@ -821,6 +821,78 @@ dreturnvoid(); } +#define WINDOP(ot,ct,bo,op,tt,z) \ + for (i = 0; i < n; i++) \ + if (!((bo(((ct*)B)[i * spfB / spfA])) op threshold.tt)) \ + ((ot*)A)[i] = (ot)(z) + +#define WINDOPC(ot,ct,bo,op,tt,z) \ + for (i = 0; i < n; i++) \ + if (!((bo(((ct*)B)[i * spfB / spfA])) op threshold.tt)) \ + ((ot*)A)[i * 2] = ((ot*)A)[i * 2 + 1] = (ot)(z) + +#define WINDOW(t,z) \ + switch (op) { \ + case GD_WINDOP_EQ: WINDOP(t, int64_t, ,==,i,z); break; \ + case GD_WINDOP_GE: WINDOP(t, double, ,>=,r,z); break; \ + case GD_WINDOP_GT: WINDOP(t, double, ,> ,r,z); break; \ + case GD_WINDOP_LE: WINDOP(t, double, ,<=,r,z); break; \ + case GD_WINDOP_LT: WINDOP(t, double, ,< ,r,z); break; \ + case GD_WINDOP_NE: WINDOP(t, int64_t, ,!=,i,z); break; \ + case GD_WINDOP_SET: WINDOP(t,uint64_t, ,& ,u,z); break; \ + case GD_WINDOP_CLR: WINDOP(t,uint64_t,~,& ,u,z); break; \ + default: \ + _GD_InternalError(D); \ + } + +#define WINDOWC(t,z) \ + switch (op) { \ + case GD_WINDOP_EQ: WINDOPC(t, int64_t, ,==,i,z); break; \ + case GD_WINDOP_GE: WINDOPC(t, double, ,>=,r,z); break; \ + case GD_WINDOP_GT: WINDOPC(t, double, ,> ,r,z); break; \ + case GD_WINDOP_LE: WINDOPC(t, double, ,<=,r,z); break; \ + case GD_WINDOP_LT: WINDOPC(t, double, ,< ,r,z); break; \ + case GD_WINDOP_NE: WINDOPC(t, int64_t, ,!=,i,z); break; \ + case GD_WINDOP_SET: WINDOPC(t,uint64_t, ,& ,u,z); break; \ + case GD_WINDOP_CLR: WINDOPC(t,uint64_t,~,& ,u,z); break; \ + default: \ + _GD_InternalError(D); \ + } + +/* WindowData: Zero data in A where the condition is false. B is unchanged. +*/ +static void _GD_WindowData(DIRFILE* D, void *A, gd_spf_t spfA, void *B, + gd_spf_t spfB, gd_windop_t op, gd_triplet_t threshold, gd_type_t type, + size_t n) +{ + size_t i; + const double NaN = NAN; + + dtrace("%p, %p, %u, %p, %u, 0x%X, %i, {%g,%llx,%lli}, %zu", D, A, spfA, B, + spfB, type, op, threshold.r, (unsigned long long)threshold.u, + (long long)threshold.i, n); + + switch (type) { + case GD_NULL: break; + case GD_UINT8: WINDOW( uint8_t, 0) break; + case GD_INT8: WINDOW( int8_t, 0) break; + case GD_UINT16: WINDOW(uint16_t, 0) break; + case GD_INT16: WINDOW( int16_t, 0) break; + case GD_UINT32: WINDOW(uint32_t, 0) break; + case GD_INT32: WINDOW( int32_t, 0) break; + case GD_UINT64: WINDOW(uint64_t, 0) break; + case GD_INT64: WINDOW( int64_t, 0) break; + case GD_FLOAT32: WINDOW( float,NaN) break; + case GD_FLOAT64: WINDOW( double,NaN) break; + case GD_COMPLEX64: WINDOWC( float,NaN) break; + case GD_COMPLEX128: WINDOWC( double,NaN) break; + default: _GD_SetError(D, GD_E_BAD_TYPE, type, NULL, 0, NULL); + break; + } + + dreturnvoid(); +} + /* _GD_DoLincom: Read from a lincom. Returns number of samples read. */ static size_t _GD_DoLincom(DIRFILE *D, gd_entry_t *E, off64_t first_samp, @@ -1360,6 +1432,110 @@ return n_read; } +/* _GD_DoWindow: Read from a window. Returns number of samples read. +*/ +static size_t _GD_DoWindow(DIRFILE *D, gd_entry_t* E, off64_t first_samp, + size_t num_samp, gd_type_t return_type, void *data_out) +{ + void *tmpbuf = NULL; + gd_spf_t spf1, spf2; + size_t n_read, n_read2, num_samp2; + off64_t first_samp2; + gd_type_t type2; + + dtrace("%p, %p, %lli, %zu, 0x%X, %p", D, E, first_samp, num_samp, return_type, + data_out); + + /* Check input fields */ + if (_GD_BadInput(D, E, 0)) { + dreturn("%i", 0); + return 0; + } + + if (_GD_BadInput(D, E, 1)) { + dreturn("%i", 0); + return 0; + } + + /* find the samples per frame of the input field */ + spf1 = _GD_GetSPF(D, E->e->entry[0]); + if (D->error != GD_E_OK) { + dreturn("%i", 0); + return 0; + } + + /* read the input field and record the number of samples returned */ + n_read = _GD_DoField(D, E->e->entry[0], E->e->repr[0], first_samp, num_samp, + return_type, data_out); + + if (D->error != GD_E_OK) { + dreturn("%i", 0); + return 0; + } + + /* Nothing to window */ + if (n_read == 0) { + dreturn("%i", 0); + return 0; + } + + /* find the samples per frame of the check field */ + spf2 = _GD_GetSPF(D, E->e->entry[1]); + if (D->error != GD_E_OK) { + dreturn("%i", 0); + return 0; + } + + /* calculate the first sample and number of samples to read of the + * check field */ + num_samp2 = (int)ceil((double)n_read * spf2 / spf1); + first_samp2 = first_samp * spf2 / spf1; + + switch(E->EN(window,windop)) { + case GD_WINDOP_EQ: + case GD_WINDOP_NE: + type2 = GD_INT64; + break; + case GD_WINDOP_SET: + case GD_WINDOP_CLR: + type2 = GD_UINT64; + break; + default: + type2 = GD_FLOAT64; + break; + } + + /* Allocate a temporary buffer for the check field */ + tmpbuf = (double *)_GD_Alloc(D, type2, num_samp2); + + if (D->error != GD_E_OK) { + free(tmpbuf); + dreturn("%i", 0); + return 0; + } + + /* read the check field */ + n_read2 = _GD_DoField(D, E->e->entry[1], E->e->repr[1], first_samp2, + num_samp2, type2, tmpbuf); + + if (D->error != GD_E_OK) { + free(tmpbuf); + dreturn("%i", 0); + return 0; + } + + if (n_read2 > 0 && n_read2 * spf1 < n_read * spf2) + n_read = n_read2 * spf1 / spf2; + + _GD_WindowData(D, data_out, spf1, tmpbuf, spf2, E->EN(window,windop), + E->EN(window,threshold), return_type, n_read); + + free(tmpbuf); + + dreturn("%zu", n_read); + return n_read; +} + /* _GD_DoConst: Read from a const. Returns number of samples read (ie. 1). */ static size_t _GD_DoConst(DIRFILE *D, const gd_entry_t *E, off64_t first, @@ -1500,6 +1676,9 @@ case GD_SBIT_ENTRY: n_read = _GD_DoBit(D, E, 1, first_samp, num_samp, return_type, data_out); break; + case GD_WINDOW_ENTRY: + n_read = _GD_DoWindow(D, E, first_samp, num_samp, return_type, data_out); + break; case GD_CONST_ENTRY: case GD_CARRAY_ENTRY: n_read = _GD_DoConst(D, E, first_samp, num_samp, return_type, data_out); Modified: trunk/getdata/src/getdata.h.in =================================================================== --- trunk/getdata/src/getdata.h.in 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/getdata.h.in 2011-12-06 23:36:19 UTC (rev 632) @@ -50,7 +50,7 @@ #endif /* The most recent standards version supported by this library */ -#define GD_DIRFILE_STANDARDS_VERSION 8 +#define GD_DIRFILE_STANDARDS_VERSION 9 #include <math.h> #include <sys/types.h> @@ -144,6 +144,7 @@ #define GD_E_DELETE 26 #define GD_E_ARGUMENT 27 #define GD_E_CALLBACK 28 +/* unused 29 */ #define GD_E_UNCLEAN_DB 30 #define GD_E_DOMAIN 31 #define GD_E_BAD_REPR 32 @@ -184,6 +185,7 @@ #define GD_E_FORMAT_LOCATION 17 #define GD_E_FORMAT_PROTECT 18 #define GD_E_FORMAT_LITERAL 19 +#define GD_E_FORMAT_WINDOP 20 /* parser callback return values */ #define GD_SYNTAX_ABORT 0 @@ -220,30 +222,36 @@ GD_SBIT_ENTRY = 0x09, GD_DIVIDE_ENTRY = 0x0A, GD_RECIP_ENTRY = 0x0B, + GD_WINDOW_ENTRY = 0x0C, GD_CONST_ENTRY = GD_SCALAR_ENTRY | 0x00, GD_STRING_ENTRY = GD_SCALAR_ENTRY | 0x01, GD_CARRAY_ENTRY = GD_SCALAR_ENTRY | 0x02 } gd_entype_t; /* GD_NO_ENTRY is not part of this count */ -#define GD_N_ENTYPES 14 +#define GD_N_ENTYPES 15 -@DEFINE_gd_int16_t@ -@DEFINE_gd_uint16_t@ -@DEFINE_gd_int64_t@ - #define GD_HERE (-1) +/* C data types */ #if ! defined GD_C89_API -# include <inttypes.h> -# define GD_DCOMPLEXM(v) double _Complex v -# define GD_DCOMPLEXP(v) double _Complex *v +# include <inttypes.h> +# define gd_int16_t int16_t +# define gd_uint16_t uint16_t +# define gd_int64_t int64_t +# define gd_uint64_t uint64_t +# define GD_DCOMPLEXM(v) double _Complex v +# define GD_DCOMPLEXP(v) double _Complex *v typedef int16_t gd_bit_t; typedef uint16_t gd_spf_t; typedef int64_t gd_shift_t; #else -# define GD_DCOMPLEXM(v) double v[2] -# define GD_DCOMPLEXP(v) double *v +@DEFINE_gd_int16_t@ +@DEFINE_gd_uint16_t@ +@DEFINE_gd_int64_t@ +@DEFINE_gd_uint64_t@ +# define GD_DCOMPLEXM(v) double v[2] +# define GD_DCOMPLEXP(v) double *v typedef gd_int16_t gd_bit_t; typedef gd_uint16_t gd_spf_t; typedef gd_int64_t gd_shift_t; @@ -280,8 +288,27 @@ #define GD_FLOAT GD_FLOAT32 #define GD_DOUBLE GD_FLOAT64 + +typedef enum { + GD_WINDOP_UNK, + GD_WINDOP_EQ, + GD_WINDOP_GE, + GD_WINDOP_GT, + GD_WINDOP_LE, + GD_WINDOP_LT, + GD_WINDOP_NE, + GD_WINDOP_SET, + GD_WINDOP_CLR +} gd_windop_t; + struct _gd_private_entry; +typedef union { + gd_int64_t i; + gd_uint64_t u; + double r; +} gd_triplet_t; + /* ANSI C does not permit anonymous structs/unions */ #ifdef GD_C89_API # define GD_ANON(x) x @@ -328,6 +355,10 @@ struct { /* PHASE */ gd_shift_t shift; } GD_ANON(phase); + struct { /* WINDOW */ + gd_windop_t windop; + gd_triplet_t threshold; + } GD_ANON(window); struct { /* CONST */ gd_type_t const_type; size_t array_len; @@ -486,6 +517,11 @@ extern int gd_add_string(DIRFILE *dirfile, const char *field_code, const char *value, int fragment_index) gd_nothrow gd_nonnull((1,2,3)); +extern int gd_add_window(DIRFILE *dirfile, const char *field_code, + const char *in_field, const char *check_field, gd_windop_t windop, + gd_triplet_t threshold, int fragment_index) gd_nothrow +gd_nonnull ((1,2,3,4)); + extern int gd_alter_bit(DIRFILE *dirfile, const char *field_code, const char *in_field, gd_bit_t bitnum, gd_bit_t numbits) gd_nothrow gd_nonnull((1,2)); @@ -540,6 +576,10 @@ const char *in_field, gd_bit_t bitnum, gd_bit_t numbits) gd_nothrow gd_nonnull((1,2)); +extern int gd_alter_window(DIRFILE *dirfile, const char *field_code, + const char *in_field, const char *check_field, gd_windop_t windop, + gd_triplet_t threshold) gd_nothrow gd_nonnull((1,2)); + extern size_t gd_carray_len(DIRFILE *dirfile, const char *field_code) gd_nothrow gd_nonnull((1,2)); @@ -678,6 +718,11 @@ const char *field_code, const char *value) gd_nothrow gd_nonnull ((1,2,3,4)); +extern int gd_madd_window(DIRFILE *dirfile, const char *parent, + const char *field_code, const char *in_field, const char *check_field, + gd_windop_t windop, gd_triplet_t threshold) gd_nothrow +gd_nonnull ((1,2,3,4,5)); + extern int gd_dirfile_standards(DIRFILE *dirfile, int vers) gd_nothrow gd_nonnull ((1)); Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/internal.h 2011-12-06 23:36:19 UTC (rev 632) @@ -587,6 +587,7 @@ #define GD_E_BAD_ENTRY_BITNUM 6 #define GD_E_BAD_ENTRY_BITSIZE 7 #define GD_E_BAD_ENTRY_POLYORD 8 +#define GD_E_BAD_ENTRY_WINDOP 9 #define GD_E_SCALAR_CODE 1 #define GD_E_SCALAR_TYPE 2 @@ -879,6 +880,14 @@ void *_GD_Alloc(DIRFILE*, gd_type_t, size_t) __attribute_malloc__; void _GD_ArmEndianise(uint64_t* databuffer, int is_complex, size_t ns); int _GD_BadInput(DIRFILE* D, gd_entry_t* E, int i); + +#define _GD_BadWindop(op) \ + ( \ + (op != GD_WINDOP_EQ) && (op != GD_WINDOP_GE) && (op != GD_WINDOP_GT) && \ + (op != GD_WINDOP_LE) && (op != GD_WINDOP_LT) && (op != GD_WINDOP_NE) && \ + (op != GD_WINDOP_SET) && (op != GD_WINDOP_CLR) \ + ) + int _GD_CalculateEntry(DIRFILE* D, gd_entry_t* E); char *_GD_CanonicalPath(const char*, const char*); void _GD_CInvertData(DIRFILE* D, void* data, gd_type_t return_type, Modified: trunk/getdata/src/legacy.c =================================================================== --- trunk/getdata/src/legacy.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/legacy.c 2011-12-06 23:36:19 UTC (rev 632) @@ -351,6 +351,22 @@ dreturnvoid(); } +static void CopyWindowEntry(struct PhaseEntryType* P, gd_entry_t* E) +{ + dtrace("%p, %p", P, E); + + if (E == NULL) { + dreturnvoid(); + return; + } + + P->field = E->field; + P->raw_field = E->in_fields[0]; + P->shift = 0; + + dreturnvoid(); +} + /* Okay, reconstruct the old FormatType. This is painful. */ struct FormatType *GetFormat(const char *filedir, int *error_code) gd_nothrow { @@ -405,6 +421,7 @@ Format.n_multiply++; break; case GD_PHASE_ENTRY: + case GD_WINDOW_ENTRY: Format.n_phase++; break; case GD_NO_ENTRY: @@ -475,6 +492,9 @@ case GD_PHASE_ENTRY: CopyPhaseEntry(&Format.phaseEntries[nphase++], D->entry[i]); break; + case GD_WINDOW_ENTRY: + CopyWindowEntry(&Format.phaseEntries[nphase++], D->entry[i]); + break; case GD_STRING_ENTRY: case GD_CONST_ENTRY: case GD_CARRAY_ENTRY: Modified: trunk/getdata/src/mod.c =================================================================== --- trunk/getdata/src/mod.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/mod.c 2011-12-06 23:36:19 UTC (rev 632) @@ -686,6 +686,65 @@ modified = 1; break; + case GD_WINDOW_ENTRY: + if (N->EN(window,windop) == GD_WINDOP_UNK) + Q.EN(window,windop) = E->EN(window,windop); + else { + Q.EN(window,windop) = N->EN(window,windop); + modified = 1; + } + + switch (Q.EN(window,windop)) { + case GD_WINDOP_EQ: + case GD_WINDOP_NE: + j = _GD_AlterScalar(D, E->EN(window,threshold.i) != + N->EN(window,threshold.i), GD_INT64, &Q.EN(window,threshold.i), + &N->EN(window,threshold.i), Q.scalar, Q.scalar_ind, N->scalar[0], + N->scalar_ind[0], E->e->calculated); + break; + case GD_WINDOP_SET: + case GD_WINDOP_CLR: + j = _GD_AlterScalar(D, E->EN(window,threshold.u) != + N->EN(window,threshold.u), GD_UINT64, &Q.EN(window,threshold.u), + &N->EN(window,threshold.u), Q.scalar, Q.scalar_ind, N->scalar[0], + N->scalar_ind[0], E->e->calculated); + break; + default: + j = _GD_AlterScalar(D, E->EN(window,threshold.r) != + N->EN(window,threshold.r), GD_FLOAT64, &Q.EN(window,threshold.r), + &N->EN(window,threshold.r), Q.scalar, Q.scalar_ind, N->scalar[0], + N->scalar_ind[0], E->e->calculated); + break; + } + + if (j & GD_AS_ERROR) + break; + if (j & GD_AS_FREE_SCALAR) + scalar_free |= 2; + if (j & GD_AS_NEED_RECALC) + Qe.calculated = 0; + if (j & GD_AS_MODIFIED) + modified = 1; + + if (N->in_fields[0] != NULL && strcmp(E->in_fields[0], N->in_fields[0])) { + if ((Q.in_fields[0] = strdup(N->in_fields[0])) == NULL) { + _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + break; + } + modified = 1; + field_free |= 1; + } + + if (N->in_fields[1] != NULL && strcmp(E->in_fields[1], N->in_fields[1])) { + if ((Q.in_fields[1] = strdup(N->in_fields[1])) == NULL) { + _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + break; + } + modified = 1; + field_free |= 2; + } + + break; case GD_CONST_ENTRY: Q.EN(scalar,const_type) = (N->EN(scalar,const_type) == GD_NULL) ? E->EN(scalar,const_type) : N->EN(scalar,const_type); @@ -1429,6 +1488,37 @@ return ret; } +int gd_alter_window(DIRFILE* D, const char *field_code, const char *in_field, + const char *check_field, gd_windop_t windop, gd_triplet_t threshold) +gd_nothrow +{ + int ret; + gd_entry_t N; + + dtrace("%p, \"%s\", \"%s\", \"%s\", %i, {%g,%llx,%lli}", D, field_code, + in_field, check_field, windop, threshold.r, + (unsigned long long)threshold.u, (long long)threshold.i); + + if (D->flags & GD_INVALID) { + _GD_SetError(D, GD_E_BAD_DIRFILE, 0, NULL, 0, NULL); + dreturn("%i", -1); + return -1; + } + + N.field_type = GD_WINDOW_ENTRY; + N.in_fields[0] = (char *)in_field; + N.in_fields[1] = (char *)check_field; + N.EN(window,windop) = windop; + N.EN(window,threshold) = threshold; + N.scalar[0] = NULL; + N.e = NULL; + + ret = _GD_Change(D, field_code, &N, 0); + + dreturn("%i", ret); + return ret; +} + int gd_alter_spec(DIRFILE* D, const char* line, int move) { const char *tok_pos = NULL; Modified: trunk/getdata/src/native.c =================================================================== --- trunk/getdata/src/native.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/native.c 2011-12-06 23:36:19 UTC (rev 632) @@ -89,6 +89,7 @@ type = GD_UINT64; break; case GD_PHASE_ENTRY: + case GD_WINDOW_ENTRY: if (_GD_BadInput(D, E, 0)) break; Modified: trunk/getdata/src/parse.c =================================================================== --- trunk/getdata/src/parse.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/parse.c 2011-12-06 23:36:19 UTC (rev 632) @@ -70,16 +70,57 @@ return t; } +static gd_windop_t _GD_WindOp(const char *op) +{ + gd_windop_t o = GD_WINDOP_UNK; + dtrace("\"%s\"", op); + + switch (op[0]) { + case 'E': + if (op[1] == 'Q') + o = GD_WINDOP_EQ; + break; + case 'L': + if (op[1] == 'T') + o = GD_WINDOP_LT; + else if (op[1] == 'E') + o = GD_WINDOP_LE; + break; + case 'G': + if (op[1] == 'T') + o = GD_WINDOP_GT; + else if (op[1] == 'E') + o = GD_WINDOP_GE; + break; + case 'N': + if (op[1] == 'E') + o = GD_WINDOP_NE; + break; + case 'S': + if (op[1] == 'E' && op[2] == 'T') + o = GD_WINDOP_SET; + break; + case 'C': + if (op[1] == 'L' && op[2] == 'R') + o = GD_WINDOP_CLR; + break; + } + + dreturn("%i", o); + return o; +} + /* Returns a newly malloc'd string containing the scalar field name, or NULL on * numeric literal or error */ static char* _GD_SetScalar(DIRFILE* D, const char* token, void* data, int type, - const char* format_file, int line, int *index, int *comp_scal) + const char* format_file, int line, int *index, int *comp_scal, + int standards, int pedantic) { char *ptr = NULL; char *lt; - dtrace("%p, \"%s\", %p, %i, \"%s\", %i, %p, %p", D, token, data, type, - format_file, line, index, comp_scal); + dtrace("%p, \"%s\", %p, 0x%X, \"%s\", %i, %p, %p, %i, %i", D, token, data, + type, format_file, line, index, comp_scal, standards, pedantic); if (type & (GD_COMPLEX | GD_IEEE754)) { /* try to convert to double */ @@ -100,19 +141,19 @@ /* If there was a semicolon, try to extract the imaginary part */ if (*semicolon == ';') { - i = strtod(semicolon + 1, &ptr); - - /* there were trailing characters in the imaginary part of complex -- this - * can't be a valid field name, since ; is prohibited */ - if (*ptr != '\0') { + /* if a complex value is not permitted, complain */ + if (!(type & GD_COMPLEX)) { _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_LITERAL, format_file, line, token); dreturn("%p", NULL); return NULL; } - /* if a complex value is not permitted, complain */ - if (!(type & GD_COMPLEX)) { + i = strtod(semicolon + 1, &ptr); + + /* there were trailing characters in the imaginary part of complex -- this + * can't be a valid field name, since ; is prohibited */ + if (*ptr != '\0') { _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_LITERAL, format_file, line, token); dreturn("%p", NULL); @@ -136,7 +177,8 @@ _GD_InternalError(D); } else if (type & GD_SIGNED) { /* try to convert to long long int */ - long long int lli = gd_strtoll(token, &ptr, 10); + long long int lli = gd_strtoll(token, &ptr, + (!pedantic || standards >= 9) ? 0 : 10); /* there were trailing characters in the long long int */ if (*ptr != '\0') { @@ -156,7 +198,8 @@ _GD_InternalError(D); } else { /* try to convert to unsigned long long int */ - unsigned long long int ulli = gd_strtoull(token, &ptr, 10); + unsigned long long int ulli = gd_strtoull(token, &ptr, + (!pedantic || standards >= 9) ? 0 : 10); /* there were trailing characters in the unsigned long long int */ if (*ptr != '\0') { @@ -264,7 +307,8 @@ _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_BAD_TYPE, format_file, line, in_cols[2]); else if ((E->scalar[0] = _GD_SetScalar(D, in_cols[3], &E->EN(raw,spf), - GD_UINT16, format_file, line, E->scalar_ind, NULL)) == NULL) + GD_UINT16, format_file, line, E->scalar_ind, NULL, standards, + pedantic)) == NULL) { E->e->calculated = 1; if (E->EN(raw,spf) <= 0) @@ -366,11 +410,13 @@ _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); E->scalar[i] = _GD_SetScalar(D, in_cols[i * 3 + 4], &E->EN(lincom,cm)[i], - GD_COMPLEX128, format_file, line, E->scalar_ind + i, &E->comp_scal); + GD_COMPLEX128, format_file, line, E->scalar_ind + i, &E->comp_scal, + standards, pedantic); E->EN(lincom,m)[i] = creal(E->EN(lincom,cm)[i]); E->scalar[i + GD_MAX_LINCOM] = _GD_SetScalar(D, in_cols[i * 3 + 5], &E->EN(lincom,cb)[i], GD_COMPLEX128, format_file, line, - E->scalar_ind + i + GD_MAX_LINCOM, &E->comp_scal); + E->scalar_ind + i + GD_MAX_LINCOM, &E->comp_scal, standards, + pedantic); E->EN(lincom,b)[i] = creal(E->EN(lincom,cb)[i]); if (E->scalar[i] != NULL || E->scalar[i + GD_MAX_LINCOM] != NULL) @@ -575,14 +621,117 @@ } E->scalar[0] = _GD_SetScalar(D, in_cols[3], &E->EN(recip,cdividend), - GD_COMPLEX128, format_file, line, E->scalar_ind, &E->comp_scal); + GD_COMPLEX128, format_file, line, E->scalar_ind, &E->comp_scal, standards, + pedantic); E->EN(recip,dividend) = creal(E->EN(recip,cdividend)); E->comp_scal = (cimag(E->EN(recip,cdividend)) == 0) ? 0 : 1; + if (D->error != GD_E_OK) { + _GD_FreeE(D, E, 1); + E = NULL; + } + dreturn("%p", E); return E; } +/* _GD_ParseWindow: parse WINDOW entry in format file. +*/ +static gd_entry_t* _GD_ParseWindow(DIRFILE* D, char* in_cols[MAX_IN_COLS], + int n_cols, const gd_entry_t* parent, const char* format_file, int line, + int standards, int pedantic, int* is_dot) +{ + gd_entry_t *E; + + dtrace("%p, %p, %i, %p, \"%s\", %i, %i, %i, %p", D, in_cols, n_cols, parent, + format_file, line, standards, pedantic, is_dot); + + if (n_cols < 6) { + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_N_TOK, format_file, line, NULL); + dreturn("%p", NULL); + return NULL; + } + + E = (gd_entry_t *)malloc(sizeof(gd_entry_t)); + if (E == NULL) { + _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + dreturn("%p", NULL); + return NULL; + } + memset(E, 0, sizeof(gd_entry_t)); + + E->e = (struct _gd_private_entry *)malloc(sizeof(struct _gd_private_entry)); + if (E->e == NULL) { + _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + free(E); + dreturn("%p", NULL); + return NULL; + } + memset(E->e, 0, sizeof(struct _gd_private_entry)); + + E->field_type = GD_WINDOW_ENTRY; + E->in_fields[0] = NULL; + E->e->entry[0] = NULL; + E->e->calculated = 0; + + E->field = _GD_ValidateField(parent, in_cols[0], standards, pedantic, is_dot); + if (E->field == in_cols[0]) { + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_BAD_NAME, format_file, line, + in_cols[0]); + E->field = NULL; + _GD_FreeE(D, E, 1); + dreturn("%p", NULL); + return NULL; + } + + E->in_fields[0] = strdup(in_cols[2]); + E->in_fields[1] = strdup(in_cols[3]); + + if (E->field == NULL || E->in_fields[0] == NULL || E->in_fields[1] == NULL) { + _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); + _GD_FreeE(D, E, 1); + dreturn("%p", NULL); + return NULL; + } + + E->EN(window,windop) = _GD_WindOp(in_cols[4]); + if (E->EN(window,windop) == GD_WINDOP_UNK) { + _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_WINDOP, format_file, line, + in_cols[4]); + _GD_FreeE(D, E, 1); + dreturn("%p", NULL); + return NULL; + } + + switch (E->EN(window,windop)) { + case GD_WINDOP_EQ: + case GD_WINDOP_NE: + E->scalar[0] = _GD_SetScalar(D, in_cols[5], &E->EN(window,threshold.i), + GD_INT64, format_file, line, E->scalar_ind, NULL, standards, + pedantic); + break; + case GD_WINDOP_SET: + case GD_WINDOP_CLR: + E->scalar[0] = _GD_SetScalar(D, in_cols[5], &E->EN(window,threshold.u), + GD_UINT64, format_file, line, E->scalar_ind, NULL, standards, + pedantic); + break; + default: + E->scalar[0] = _GD_SetScalar(D, in_cols[5], &E->EN(window,threshold.r), + GD_FLOAT64, format_file, line, E->scalar_ind, NULL, standards, + pedantic); + break; + } + + if (D->error != GD_E_OK) { + _GD_FreeE(D, E, 1); + E = NULL; + } + + dreturn("%p", E); + return E; +} + /* _GD_ParseDivide: parse DIVIDE entry in format file. */ static gd_entry_t* _GD_ParseDivide(DIRFILE* D, @@ -702,11 +851,11 @@ E->scalar[0] = _GD_SetScalar(D, in_cols[3], &E->EN(bit,bitnum), GD_INT16, - format_file, line, E->scalar_ind, NULL); + format_file, line, E->scalar_ind, NULL, standards, pedantic); if (n_cols > 4) E->scalar[1] = _GD_SetScalar(D, in_cols[4], &E->EN(bit,numbits), GD_INT16, - format_file, line, E->scalar_ind + 1, NULL); + format_file, line, E->scalar_ind + 1, NULL, standards, pedantic); else E->EN(bit,numbits) = 1; @@ -786,11 +935,17 @@ } if ((E->scalar[0] = _GD_SetScalar(D, in_cols[3], &E->EN(phase,shift), - GD_INT64, format_file, line, E->scalar_ind, NULL)) == NULL) + GD_INT64, format_file, line, E->scalar_ind, NULL, standards, + pedantic)) == NULL) { E->e->calculated = 1; } + if (D->error != GD_E_OK) { + _GD_FreeE(D, E, 1); + E = NULL; + } + dreturn("%p", E); return E; } @@ -858,7 +1013,8 @@ else for (i = 0; i <= E->EN(polynom,poly_ord); i++) { E->scalar[i] = _GD_SetScalar(D, in_cols[i + 3], &E->EN(polynom,ca)[i], - GD_COMPLEX128, format_file, line, E->scalar_ind + i, &E->comp_scal); + GD_COMPLEX128, format_file, line, E->scalar_ind + i, &E->comp_scal, + standards, pedantic); E->EN(polynom,a)[i] = creal(E->EN(polynom,ca)[i]); if (E->scalar[i] != NULL) @@ -990,7 +1146,7 @@ } ptr = _GD_SetScalar(D, in_cols[3], E->e->u.scalar.d, type, format_file, line, - &dummy, &dummy); + &dummy, &dummy, standards, pedantic); if (ptr) { free(ptr); _GD_SetError(D, GD_E_FORMAT, GD_E_FORMAT_LITERAL, format_file, line, @@ -1102,7 +1258,7 @@ for (c = first; c < n_cols; ++c) { ptr = _GD_SetScalar(D, in_cols[c], (char *)data + s * n++, t, format_file, - line, &dummy, &dummy); + line, &dummy, &dummy, standards, pedantic); if (n == GD_MAX_CARRAY_LENGTH) break; @@ -1341,6 +1497,9 @@ else if (strcmp(in_cols[1], "RECIP") == 0 && (!pedantic || standards >= 8)) E = _GD_ParseRecip(D, in_cols, n_cols, P, format_file, linenum, standards, pedantic, &is_dot); + else if (strcmp(in_cols[1], "WINDOW") == 0 && (!pedantic || standards >= 9)) + E = _GD_ParseWindow(D, in_cols, n_cols, P, format_file, linenum, standards, + pedantic, &is_dot); else if (strcmp(in_cols[1], "CONST") == 0 && (!pedantic || standards >= 6)) { E = _GD_ParseConst(D, in_cols, n_cols, P, format_file, linenum, standards, pedantic, &is_dot); @@ -1713,7 +1872,8 @@ #endif } } else if (strcmp(ptr, "FRAMEOFFSET") == 0 && (!pedantic || *standards >= 1)) - D->fragment[me].frame_offset = gd_strtoll(in_cols[1], NULL, 10); + D->fragment[me].frame_offset = gd_strtoll(in_cols[1], NULL, + (!pedantic || *standards >= 9) ? 0 : 10); else if (strcmp(ptr, "INCLUDE") == 0 && (!pedantic || *standards >= 3)) { unsigned long subflags = D->fragment[me].encoding | D->fragment[me].byte_sex | (*flags & (GD_PEDANTIC | GD_PERMISSIVE | GD_FORCE_ENDIAN | Modified: trunk/getdata/src/putdata.c =================================================================== --- trunk/getdata/src/putdata.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/putdata.c 2011-12-06 23:36:19 UTC (rev 632) @@ -612,6 +612,7 @@ break; case GD_MULTIPLY_ENTRY: case GD_DIVIDE_ENTRY: + case GD_WINDOW_ENTRY: case GD_INDEX_ENTRY: _GD_SetError(D, GD_E_BAD_FIELD_TYPE, GD_E_FIELD_PUT, NULL, 0, E->field); break; Modified: trunk/getdata/src/spf.c =================================================================== --- trunk/getdata/src/spf.c 2011-12-06 01:30:29 UTC (rev 631) +++ trunk/getdata/src/spf.c 2011-12-06 23:36:19 UTC (rev 632) @@ -51,6 +51,7 @@ case GD_LINTERP_ENTRY: case GD_POLYNOM_ENTRY: case GD_SBIT_ENTRY: + case GD_WINDOW_ENTRY: if (_GD_BadInput(D, E, 0)) break; Property changes on: trunk/getdata/test ___________________________________________________________________ Modified: svn:ignore - Makefile Makefile.in *.o *.odirfile *.swp *.exe .deps .libs convert_uint8_int8 convert_uint8_uint16 convert_uint8_int16 convert_uint8_uint32 convert_uint8_int32 convert_uint8_float32 convert_uint8_uint64 convert_uint8_int64 convert_uint8_float64 convert_int8_uint8 convert_int8_uint16 convert_int8_int16 convert_int8_uint32 convert_int8_int32 convert_int8_float32 convert_int8_uint64 convert_int8_int64 convert_int8_float64 convert_uint16_uint8 convert_uint16_int8 convert_uint16_int16 convert_uint16_uint32 convert_uint16_int32 convert_uint16_float32 convert_uint16_uint64 convert_uint16_int64 convert_uint16_float64 convert_int16_uint8 convert_int16_int8 convert_int16_uint16 convert_int16_uint32 convert_int16_int32 convert_int16_float32 convert_int16_uint64 convert_int16_int64 convert_int16_float64 convert_uint32_uint8 convert_uint32_int8 convert_uint32_uint16 convert_uint32_int16 convert_uint32_int32 convert_uint32_float32 convert_uint32_uint64 convert_uint32_int64 convert_uint32_float64 convert_int32_uint8 convert_int32_int8 convert_int32_uint16 convert_int32_int16 convert_int32_uint32 convert_int32_float32 convert_int32_uint64 convert_int32_int64 convert_int32_float64 convert_uint64_uint8 convert_uint64_int8 convert_uint64_uint16 convert_uint64_int16 convert_uint64_uint32 convert_uint64_int32 convert_uint64_float32 convert_uint64_int64 convert_uint64_float64 convert_int64_uint8 convert_int64_int8 convert_int64_uint16 convert_int64_int16 convert_int64_uint32 convert_int64_int32 convert_int64_float32 convert_int64_uint64 convert_int64_float64 convert_float32_uint8 convert_float32_int8 convert_float32_uint16 convert_float32_int16 convert_float32_uint32 convert_float32_int32 convert_float32_uint64 convert_float32_int64 convert_float32_float64 convert_float64_uint8 convert_float64_int8 convert_float64_uint16 convert_float64_int16 convert_float64_uint32 convert_float64_int32 convert_float64_float32 convert_float64_uint64 convert_float64_int64 creat creat_excl creat_rdonly flist flist_invalid get64 get_bad_code get_bit get_char get_endian8 get_endian16 get_endian32 get_endian64 get_endian_float32_big get_endian_float32_arm get_endian_float32_little get_endian_float64_big get_endian_float64_arm get_endian_float64_little get_ff get_float32 get_float64 get_foffs get_fs get_int8 get_int16 get_int32 get_int64 get_invalid get_lincom1 get_lincom2 get_lincom3 get_lincom_noin get_linterp get_linterp_noin get_linterp_notab get_multiply get_multiply_noin get_nonexistent get_null get_off64 get_phase get_recurse get_sf get_ss get_type get_uint16 get_uint32 get_uint64 legacy_get legacy_nframes legacy_nonexistent legacy_put legacy_spf nfields nfields_invalid nframes nframes64 nframes_empty nframes_invalid nframes_off64 nframes_spf open open_eaccess open_nonexistent open_notdirfile parse_badline parse_bit parse_bit4 parse_bit_bitnum parse_bit_bitsize parse_bit_ncols parse_bit_numbits parse_endian_bad parse_endian_big parse_endian_force parse_endian_little parse_foffs parse_include parse_include_nonexistent parse_index parse_lincom parse_lincom_ncols1 parse_lincom_ncols2 parse_lincom_nfields parse_lincom_nofields parse_linterp parse_linterp_ncols parse_multiply parse_multiply_ncols parse_ncols parse_phase parse_phase_ncols parse_raw parse_raw_char parse_raw_ncols parse_raw_spf parse_raw_type parse_version parse_version_include put64 put_bad_code put_bit put_bof put_char put_endian8 put_endian16 put_endian32 put_endian64 put_endian_float32_arm put_endian_float32_big put_endian_float32_little put_endian_float64_arm put_endian_float64_big put_endian_float64_little put_ff put_float32 put_float64 put_foffs put_fs put_int8 put_int16 put_int32 put_int64 put_invalid put_lincom1 put_lincom2 put_lincom_noin put_linterp put_linterp_notab put_multiply put_null put_off64 put_phase put_phase_noin put_rdonly put_recurse put_rofs put_sf put_ss put_type put_uint16 put_uint32 put_uint64 spf spf_lincom spf_multiply spf_recurse trunc trunc_rdonly trunc_rofs flush_invalid parse_version_slash flush_all flush close_null close parse_endian_slash error_error parse_name parse_include_slash close_bad parse_foffs_slash flush_bad_code dfes_bit dfes_lincom dfes_linterp dfes_multiply dfes_null dfes_phase dfes_raw dfes_zero entry_bad_code entry_bit entry_invalid entry_lincom entry_linterp entry_multiply entry_phase entry_raw legacy_get_put legacy_get_rofs add_phase add_lincom_nfields add_raw add_multiply add_bit_bitsize flush_meta add_type add_raw_type add_bit_bitnum add_bit add_format add_raw_spf put_linterp_noin error_short error add add_linterp nfragments add_duplicate add_code add_bit_numbits add_lincom add_rdonly ascii_get ascii_put ascii_nframes slim_get slim_nframes slim_put add_many add_sort nfields_type nfields_type_invalid nmeta nmeta_invalid nmeta_parent nmeta_type nmeta_type_invalid nmeta_type_parent nmeta_vectors nmeta_vectors_invalid nmeta_vectors_parent nvectors nvectors_invalid parse_const parse_const_ncols parse_duplicate parse_meta parse_meta_parent parse_meta_raw parse_quote parse_sort parse_string parse_string_ncols parse_whitespace madd_linterp_invalid madd_lincom_invalid vlist_invalid vlist_meta add_raw_invalid cvlist_invalid svlist_invalid cvlist svlist madd_phase_invalid add_invalid madd_phase add_phase_invalid add_spec_directive add_string add_linterp_invalid madd_multiply flist_type_invalid clist cvlist_meta_invalid flist_meta_invalid flist_type svlist_meta_invalid cvlist_meta vlist_meta_invalid svlist_meta parse_string_null madd_linterp madd_lincom vlist add_bit_invalid add_lincom_invalid madd_bit_invalid madd_bit add_multiply_invalid add_const madd_multiply_invalid madd add_spec_invalid flist_type_meta_invalid add_spec flist_type_meta flist_meta parse_meta_index entry_raw_scalar_code parse_bit_scalar entry_raw_scalar_type entry_lincom_scalar entry_phase_scalar entry_raw_scalar parse_lincom_scalar entry_bit_scalar parse_raw_scalar parse_phase_scalar include include_nonexistent include_creat include_invalid include_accmode include_index madd_spec_directive madd_spec_invalid madd_spec parse_quote_mismatch parse_eol parse_foffs_include put_string parse_protect_data put_const put_string_protect ref put_const_protect parse_protect_all ref_none parse_ref add_protect parse_protect_format parse_protect_bad ref_two put_protect include_rdonly parse_ref_nonexistent parse_protect_none parse_name_pedantic parse_name_dot parse_name_ext parse_duplicate_ignore gzip_get gzip_nframes gzip_put gzip_get_get bzip_get bzip_nframes bzip_put bzip_get_get global_name open_cb_abort open_cb_cont open_cb_ignore open_cb_rescan open_cb_invalid del_const_force del_const del_derived_force del_const_deref del_meta_force del_data del_meta del del_derived close_discard global_ref_set global_ref_empty include_ignore global_ref include_ref include_auto move move_index move_protect move_data_enc_ar bzip_move_from gzip_move_from move_data_foffs move_data_enc_ra move_data_endian move_data_nop alter_multiply alter_bit_bitnum alter_entry_recode alter_linterp_move alter_raw_spf alter_entry alter_bit_numbits alter_lincom_slope alter_raw_type alter_lincom_input alter_const alter_phase alter_lincom_offset alter_linterp foffs_get foffs_move foffs_alter endian_alter endian_move endian_get encode_alter encode_get encode_move protect_alter move_subdir unclude_del name_move unclude file name file_type unclude_move file_code parent protect_get global_ref_get alter_mspec alter_spec include_cb include_pc include_syntax fragment_index fragment_name fragment_name_oor entry_type alter_polynom_coeff get_polynom_noin get_polynom put_polynom_noin madd_polynom parse_polynom_scalar alter_polynom_ord parse_polynom spf_polynom entry_polynom_scalar put_polynom1 put_polynom2 parse_polynom_ncols1 parse_polynom_ncols2 alter_polynom_input add_polynom entry_polynom parse_lincom_non_ncols parse_lincom_non get_lincom_non xz_get xz_nframes lzma_get lzma_nframes add_sbit parse_sbit put_sbit get_sbit madd_sbit flush_spec index_domain madd_clincom index madd_const index_range add_clincom add_cpolynom get_clincom convert_float32_complex64 convert_int32_complex128 get_endian_complex128_big get_endian_complex128_arm get_endian_complex128_little convert_complex64_float64 parse_meta_index2 convert_uint16_complex128 put_endian_complex64_arm put_endian_complex64_big put_endian_complex64_little convert_uint16_complex64 convert_float64_complex128 repr_int8 convert_com... [truncated message content] |
From: <ket...@us...> - 2011-12-06 01:30:35
|
Revision: 631 http://getdata.svn.sourceforge.net/getdata/?rev=631&view=rev Author: ketiltrout Date: 2011-12-06 01:30:29 +0000 (Tue, 06 Dec 2011) Log Message: ----------- Fix path checks in IDL and perl tests. Fix perl build. Modified Paths: -------------- trunk/getdata/bindings/idl/test/big_test.pro trunk/getdata/bindings/idl/test/getdata_idl_test_routines.pro trunk/getdata/bindings/perl/Build.PL.in trunk/getdata/bindings/perl/GetData.xs trunk/getdata/bindings/perl/Makefile.am trunk/getdata/bindings/perl/t/big_test.t trunk/getdata/bindings/perl/t/callback.t Modified: trunk/getdata/bindings/idl/test/big_test.pro =================================================================== --- trunk/getdata/bindings/idl/test/big_test.pro 2011-12-05 21:57:14 UTC (rev 630) +++ trunk/getdata/bindings/idl/test/big_test.pro 2011-12-06 01:30:29 UTC (rev 631) @@ -404,7 +404,7 @@ ; 39: gd_fragmentname n = gd_fragmentname(d, 0) nume += check_ok(39, d) -nume += check_simple(39, n, "test_dirfile/format") +nume += check_eostring(39, n, "test_dirfile/format") ; 40: gd_nfragments n = gd_nfragments(d) @@ -817,7 +817,7 @@ ; 84: gd_raw_filename n = gd_raw_filename(d, 'data') nume += check_ok(84, d) -nume += check_simple(84, n, "test_dirfile/data") +nume += check_eostring(84, n, "test_dirfile/data") ; 85: gd_reference gd_reference, d, "new1" Modified: trunk/getdata/bindings/idl/test/getdata_idl_test_routines.pro =================================================================== --- trunk/getdata/bindings/idl/test/getdata_idl_test_routines.pro 2011-12-05 21:57:14 UTC (rev 630) +++ trunk/getdata/bindings/idl/test/getdata_idl_test_routines.pro 2011-12-06 01:30:29 UTC (rev 631) @@ -10,7 +10,7 @@ function check_float, t, v, g if (abs(v - g) gt 1e-6) then begin - print,"n[", t, "]=", v + print,"n[", t, "]=", v, ", expected ", g return,1 endif @@ -19,7 +19,7 @@ function check_simple2, t, m, v, g if (total(v ne g)) then begin - print,"n[", t, ",", m, "]=", v + print,"n[", t, ",", m, "]=", v, ", expected ", g return,1 endif @@ -28,7 +28,7 @@ function check_simple, t, v, g if (total(v ne g)) then begin - print,"n[", t, "]=", v + print,"n[", t, "]=", v, ", expected ", g return,1 endif @@ -38,7 +38,7 @@ function check_error, t, d, ce e = gd_error(d) if (e ne ce) then begin - print,"e[", t, "]=", e + print,"e[", t, "]=", e, ", expected ", ce return,1 endif @@ -52,7 +52,7 @@ function check_error2, t, m, d, ce e = gd_error(d) if (e ne ce) then begin - print,"e[", t, ",", m, "]=", e + print,"e[", t, ",", m, "]=", e, ", expected ", ce return,1 endif @@ -62,3 +62,9 @@ function check_ok2, t, m, d return, check_error2(t,m,d,!GD.E_OK) end + +function check_eostring, t, v, g + f = strpos(v, g, /reverse_search) + if (f EQ -1) THEN f = 0 + return, check_simple(t, strmid(v, f), g) +end Modified: trunk/getdata/bindings/perl/Build.PL.in =================================================================== --- trunk/getdata/bindings/perl/Build.PL.in 2011-12-05 21:57:14 UTC (rev 630) +++ trunk/getdata/bindings/perl/Build.PL.in 2011-12-06 01:30:29 UTC (rev 631) @@ -2,24 +2,19 @@ use Module::Build; my $build = Module::Build->new( - c_source => '@srcdir@', dist_abstract => "Perl bindings to the GetData library", dist_author => 'The GetData Project <@PACKAGE_BUGREPORT@>', dist_version_from => "GetData.pm", - extra_compiler_flags => '@DEFS@', + extra_compiler_flags => ['@DEFS@', '-I@top_builddir@/src'], extra_linker_flags => ['-L@top_builddir@/src/.libs/', '-lgetdata'], include_dirs => '@top_srcdir@/src', license => 'lgpl', module_name => "GetData", - pm_files => { - 'GetData.pm' => 'lib/GetData.pm', - }, + release_status => "testing", requires => { perl => '5.6.0', 'Math::Complex' => '1.34' }, - xs_files => { - '@srcdir@/GetData.xs' => 'lib/GetData.xs' - } + xs_files => { 'lib/GetData.xs' => 'lib/GetData.xs' } ); $build->create_build_script; Modified: trunk/getdata/bindings/perl/GetData.xs =================================================================== --- trunk/getdata/bindings/perl/GetData.xs 2011-12-05 21:57:14 UTC (rev 630) +++ trunk/getdata/bindings/perl/GetData.xs 2011-12-06 01:30:29 UTC (rev 631) @@ -5,8 +5,12 @@ #undef _POSIX_SOURCE #undef _SVID_SOURCE #undef VERSION -#include "../../src/internal.h" +#include "internal.h" +#ifdef GETDATA_DEBUG +#include "debug.c" +#endif + /* Perl 5.8.9 and earlier don't provide hv_fetchs */ #ifdef hv_fetchs # define gdp_hv_fetchs hv_fetchs Modified: trunk/getdata/bindings/perl/Makefile.am =================================================================== --- trunk/getdata/bindings/perl/Makefile.am 2011-12-05 21:57:14 UTC (rev 630) +++ trunk/getdata/bindings/perl/Makefile.am 2011-12-06 01:30:29 UTC (rev 631) @@ -24,9 +24,9 @@ GetData.pm.in MANIFEST if GETDATA_DEBUG -DEBUG_C = debug.c +DEBUG_C = lib/debug.c TEST_VERBOSE=verbose=1 -debug.c: $(top_srcdir)/src/debug.c +$(DEBUG_C): $(top_srcdir)/src/debug.c lib echo "#undef VERSION" > $@ cat $< >> $@ endif @@ -34,6 +34,9 @@ lib: mkdir lib +lib/GetData.xs: $(srcdir)/GetData.xs lib + cat $< > $@ + lib/typemap: $(srcdir)/typemap lib cat $< > $@ @@ -47,10 +50,10 @@ cd .. && ${MAKE} make_parameters GetData.pm: $(srcdir)/GetData.pm.in make_parameters.sed $(srcdir)/funclist.pl \ - $(srcdir)/GetData.xs lib/simple_funcs.xs + lib/GetData.xs lib/simple_funcs.xs rm -f $@ $(SED) -f make_parameters.sed $< | \ - $(PERL) $(srcdir)/funclist.pl $(srcdir)/GetData.xs lib/simple_funcs.xs > $@ + $(PERL) $(srcdir)/funclist.pl lib/GetData.xs lib/simple_funcs.xs > $@ chmod a-w $@ all-local: blib/arch/auto/GetData/GetData.so @@ -59,7 +62,8 @@ $(PERL) $< build .PRECIOUS: Build -Build: Build.PL GetData.pm GetData.xs lib/simple_funcs.xs lib/typemap $(DEBUG_C) +Build: Build.PL GetData.pm lib/GetData.xs lib/simple_funcs.xs lib/typemap \ + $(DEBUG_C) perl $< clean-local: @@ -67,7 +71,7 @@ if test -e Build; then \ $(PERL) Build clean; \ fi - rm -f $(BUILT_SOURCES) make_parameters.sed debug.c MYMETA.yml MYMETA.json GetData.pm + rm -f $(BUILT_SOURCES) make_parameters.sed MYMETA.yml MYMETA.json GetData.pm rm -rf Build _build if TEST_PERL Modified: trunk/getdata/bindings/perl/t/big_test.t =================================================================== --- trunk/getdata/bindings/perl/t/big_test.t 2011-12-05 21:57:14 UTC (rev 630) +++ trunk/getdata/bindings/perl/t/big_test.t 2011-12-06 01:30:29 UTC (rev 631) @@ -79,7 +79,7 @@ "a[$_[0]]: " . (1 + $#{$_[1]}) . " elements, expected " . ($#_ - 1)); for $i (0 .. $#_ - 2) { is (${$_[1]}[$i], $_[$i + 2], - "n($i)[$_[0]] = \"${$_[1]}[$i]\", expected \"" . $_[$i + 2] . "\""); + "s($i)[$_[0]] = \"${$_[1]}[$i]\", expected \"" . $_[$i + 2] . "\""); } print "#"; } @@ -90,7 +90,7 @@ is ($#{$_[2]}, $#_ - 3, "a[$_[0],$_[1]]: " . (1 + $#{$_[2]}) . " elements, expected " . ($#_ - 2)); for $i (0 .. $#_ - 3) { - is (${$_[2]}[$i], $_[$i + 3], "n($i)[$_[0],$_[1]] = " . + is (${$_[2]}[$i], $_[$i + 3], "s($i)[$_[0],$_[1]] = " . ((defined ${$_[2]}[$i]) ? "\"" . ${$_[2]}[$i] . "\"" : "undef") . ", expected " . ((defined $_[$i + 3]) ? "\"" . $_[$i + 3] . "\"" : "undef")); @@ -121,6 +121,24 @@ print "#"; } +sub CheckEOString { + print "\n"; + ok ($_[1] =~ m#$_[2]$#, "s[$_[0]] = \"$_[1]\", expected \"$_[2]\""); + print "#"; +} + +sub CheckEOSArray { + my $i; + print "\n"; + is ($#{$_[1]}, $#_ - 2, + "a[$_[0]]: " . (1 + $#{$_[1]}) . " elements, expected " . ($#_ - 1)); + for $i (0 .. $#_ - 2) { + ok (${$_[1]}[$i] =~ m#$_[$i + 2]$#, + "s($i)[$_[0]] = \"${$_[1]}[$i]\", expected \"$_[$i + 2]\""); + } + print "#"; +} + sub CheckOK { &CheckError($_[0], 0) } sub CheckOK2 { &CheckError2(@_, 0) } @@ -568,7 +586,7 @@ # 39: fragment_name $s = $_->fragmentname(0); CheckOK(39); -CheckString(39, $s, "dirfile/format"); +CheckEOString(39, $s, "dirfile/format"); # 40: nfragments $s = $_->fragments; @@ -578,7 +596,7 @@ # 182: fragment list @a = $_->fragments; CheckOK(182); -CheckSArray(182, \@a, "dirfile/format"); +CheckEOSArray(182, \@a, "dirfile/format"); # 41: include $s = $_->include("form2", 0, 0); @@ -1043,7 +1061,7 @@ # 84: raw_filename $s = $_->raw_filename("data"); CheckOK(84); -CheckString(84, $s, "dirfile/data"); +CheckEOString(84, $s, "dirfile/data"); # 85: reference $s = $_->reference("new1"); Modified: trunk/getdata/bindings/perl/t/callback.t =================================================================== --- trunk/getdata/bindings/perl/t/callback.t 2011-12-05 21:57:14 UTC (rev 630) +++ trunk/getdata/bindings/perl/t/callback.t 2011-12-06 01:30:29 UTC (rev 631) @@ -9,7 +9,7 @@ is ($extra, "extra stuff", "\$extra parameter good"); is ($$pdata{'suberror'}, $GetData::E_FORMAT_BAD_LINE, "suberror good"); is ($$pdata{'linenum'}, 2, "linenum good"); - is ($$pdata{'filename'}, "dirfile/format", "filename good"); + ok ($$pdata{'filename'} =~ m"dirfile/format$", "filename good"); $GetData::SYNTAX_IGNORE } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-12-05 21:57:23
|
Revision: 630 http://getdata.svn.sourceforge.net/getdata/?rev=630&view=rev Author: ketiltrout Date: 2011-12-05 21:57:14 +0000 (Mon, 05 Dec 2011) Log Message: ----------- Fix OSX lstat64. Fix bindings path checks. Fix off-by-one in _GD_CanonicalPath. Converted Fortran tests to use check functions. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/bindings/cxx/test/big_test.cpp trunk/getdata/bindings/f77/fgetdata.c trunk/getdata/bindings/f77/test/big_test.f trunk/getdata/bindings/f77/test/big_test95.f90 trunk/getdata/bindings/python/test/big_test.py trunk/getdata/bindings/python/test/callback.py trunk/getdata/configure.ac trunk/getdata/src/common.c trunk/getdata/src/flush.c trunk/getdata/src/internal.h Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-12-04 00:32:11 UTC (rev 629) +++ trunk/getdata/ChangeLog 2011-12-05 21:57:14 UTC (rev 630) @@ -1,3 +1,17 @@ +2011-12-05 D. V. Wiebe <ge...@ke...> svn:630 + * python/test/callback.pl python/test/big_test.py cxx/test/big_test.cpp + f77/test/big_test.f f77/test/big_test95.f90: Fix path checks. + + * f77/test/big_test.f f77/test/big_test95.f90: Use check functions. + + * src/flush.c (_GD_Flush): Don't call sync on a file opened read-only. + + * configure.ac: Look for Availability.h + * src/internal.h: Fix lstat64 on OS X 10.6+ + + * src/common.c (_GD_CanonicalPath): Don't run past the end of the work + buffer. + 2011-12-03 D. V. Wiebe <ge...@ke...> svn:629 * test/test.h (CHECKEOS): Added. * test/file.c test/fragment_name.c: Only check the end of the returned Modified: trunk/getdata/bindings/cxx/test/big_test.cpp =================================================================== --- trunk/getdata/bindings/cxx/test/big_test.cpp 2011-12-04 00:32:11 UTC (rev 629) +++ trunk/getdata/bindings/cxx/test/big_test.cpp 2011-12-05 21:57:14 UTC (rev 630) @@ -89,6 +89,10 @@ for (i = 0; i < m; ++i) if (strcmp((v), (g))) { \ ne++; cerr << "s(" << i << ")[" << t << "] = \"" << (v) << "\"" << endl; } +#define CHECK_EOSTRING(t,v,g) \ + if (strcmp((v) + strlen(v) - sizeof(g) + 1, (g))) { ne++; cerr << "s[" << t << "] = \"" << (v) << "\"" \ + << endl; } + #define CHECK_COMPLEX2(t,m,v,g) \ if (abs((v) - (g)) > 1e-10) { \ ne++; cerr << "c[" << t << ", " << m << "] = " << (v).real() << ";" \ @@ -587,7 +591,7 @@ // 39: Fragment check frag = d->Fragment(0); CHECK_OK(39); - CHECK_STRING(39,frag->Name(),__TEST__ "dirfile/format"); + CHECK_EOSTRING(39,frag->Name(), "dirfile/format"); delete frag; // 40: Dirfile::NFragments check @@ -972,7 +976,7 @@ // 84: RawEntry::FileName check str = rep->FileName(); CHECK_OK(84); - CHECK_STRING(84,str,__TEST__ "dirfile/new1"); + CHECK_EOSTRING(84,str, "dirfile/new1"); delete rep; // 85: Dirfile::Reference check @@ -984,7 +988,7 @@ // 135: Dirfile::ReferenceFilename check str = d->ReferenceFilename(); CHECK_OK(135); - CHECK_STRING(135,str,__TEST__ "dirfile/new1"); + CHECK_EOSTRING(135,str, "dirfile/new1"); // 87: Fragment::SetEncoding check frag->SetEncoding(SlimEncoding,0); Modified: trunk/getdata/bindings/f77/fgetdata.c =================================================================== --- trunk/getdata/bindings/f77/fgetdata.c 2011-12-04 00:32:11 UTC (rev 629) +++ trunk/getdata/bindings/f77/fgetdata.c 2011-12-05 21:57:14 UTC (rev 630) @@ -374,11 +374,17 @@ const int* first_sample, const int* num_frames, const int* num_samples, const int* data_type, const void* data_in) { + dtrace("%p, %i, %p, %i, %i, %i, %i, %i, 0x%x, %p", n_wrote, *dirfile, + field_code, *field_code_l, *first_frame, *first_sample, *num_frames, + *num_samples, *data_type, data_in); + char* out = (char *)malloc(*field_code_l + 1); *n_wrote = gd_putdata(_GDF_GetDirfile(*dirfile), _GDF_CString(out, field_code, *field_code_l), *first_frame, *first_sample, *num_frames, *num_samples, (gd_type_t)*data_type, data_in); free(out); + + dreturn("%i", *n_wrote); } /* return the error number */ @@ -1276,8 +1282,10 @@ void F77_FUNC(gdfrgn, GDFRGN) (char* filename, int* filename_l, const int* dirfile, const int* index) { + dtrace("%p, %i, %i, %i", filename, *filename_l, *dirfile, *index); _GDF_FString(filename, filename_l, gd_fragmentname(_GDF_GetDirfile(*dirfile), *index)); + dreturnvoid(); } /* gd_nfragments wrapper */ Modified: trunk/getdata/bindings/f77/test/big_test.f =================================================================== --- trunk/getdata/bindings/f77/test/big_test.f 2011-12-04 00:32:11 UTC (rev 629) +++ trunk/getdata/bindings/f77/test/big_test.f 2011-12-05 21:57:14 UTC (rev 630) @@ -1,4 +1,4 @@ -C Copyright (C) 2009-2010 D. V. Wiebe +C Copyright (C) 2009-2011 D. V. Wiebe C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C @@ -25,6 +25,148 @@ C F77 bindings. Procedures not tested include: GDCOPN GDMFLS GDFLSH C GDDSCD GDCLBK GDCLOS (although this last one is used) +C Check functions + SUBROUTINE CHKERR(NE, T, D, V) + INCLUDE "getdata.f" + INTEGER NE, T, D, V, E + CALL GDEROR(E, D) + + IF (E .NE. V) THEN + NE = NE + 1 + WRITE(*, 9001) T, E, V + ENDIF + 9001 FORMAT('e[', i3, '] = ', i4, ', expected ', i4) + END SUBROUTINE + + SUBROUTINE CHKINT(NE, T, N, V) + INTEGER NE, T, N, V + + IF (N .NE. V) THEN + NE = NE + 1 + WRITE(*, 9002) T, N, V + ENDIF + 9002 FORMAT('n[', i3, '] = ', i4, ', expected ', i4) + END SUBROUTINE + + SUBROUTINE CHKER2(NE, T, I, D, V) + INCLUDE "getdata.f" + INTEGER NE, T, I, D, V, E + CALL GDEROR(E, D) + + IF (E .NE. V) THEN + NE = NE + 1 + WRITE(*, 9006) I, T, E, V + ENDIF + 9006 FORMAT('e(', i3, ')[', i3, '] = ', i4, ', expected ', i4) + END SUBROUTINE + + SUBROUTINE CHKIN2(NE, T, I, N, V) + INTEGER NE, T, I, N, V + + IF (N .NE. V) THEN + NE = NE + 1 + WRITE(*, 9007) I, T, N, V + ENDIF + 9007 FORMAT('n(', i3, ')[', i3, '] = ', i4, ', expected ', i4) + END SUBROUTINE + + SUBROUTINE CHKST2(NE, T, I, N, V) + INTEGER NE, T, I + CHARACTER*(*) N, V + + IF (N .NE. V) THEN + NE = NE + 1 + WRITE(*, 9008) I, T, N, V + ENDIF + 9008 FORMAT('s(', i3, ')[', i3, '] = "', a, '", expected "', a, '"') + END SUBROUTINE + + SUBROUTINE CHKSTR(NE, T, N, V) + INTEGER NE, T + CHARACTER*(*) N, V + + IF (N .NE. V) THEN + NE = NE + 1 + WRITE(*, 9009) T, N, V + ENDIF + 9009 FORMAT('s[', i3, '] = "', a, '", expected "', a, '"') + END SUBROUTINE + + SUBROUTINE CHKDB2(NE, T, I, N, V) + INTEGER NE, T, I + REAL*8 N, V + + IF (ABS(N - V) .GT. 1E-5) THEN + NE = NE + 1 + WRITE(*, 9010) I, T, N, V + ENDIF + 9010 FORMAT('d(', i3, ')[', i3, '] = ', d16.10, ', expected ', d16.10) + END SUBROUTINE + + SUBROUTINE CHKCP2(NE, T, I, N, V) + INTEGER NE, T, I + COMPLEX*16 N, V + + IF (ABS(N - V) .GT. 1E-5) THEN + NE = NE + 1 + WRITE(*, 9011) I, T, REAL(REAL(N)), REAL(AIMAG(N)), + +REAL(REAL(V)), REAL(AIMAG(V)) + ENDIF + 9011 FORMAT('x(', i3, ')[', i3, '] = ', d16.10, ';', d16.10, + +', expected ', d16.10, ';', d16.10) + END SUBROUTINE + + SUBROUTINE CHKDBL(NE, T, N, V) + INTEGER NE, T + REAL*8 N, V + + IF (ABS(N - V) .GT. 1E-5) THEN + NE = NE + 1 + WRITE(*, 9012) T, N, V + ENDIF + 9012 FORMAT('d[', i3, '] = ', d16.10, ', expected ', d16.10) + END SUBROUTINE + + SUBROUTINE CHKCPX(NE, T, N, V) + INTEGER NE, T + COMPLEX*16 N, V + + IF (ABS(N - V) .GT. 1E-5) THEN + NE = NE + 1 + WRITE(*, 9013) T, REAL(REAL(N)), REAL(AIMAG(N)), + +REAL(REAL(V)), REAL(AIMAG(V)) + ENDIF + 9013 FORMAT('x[', i3, '] = ', d16.10, ';', d16.10, + +', expected ', d16.10, ';', d16.10) + END SUBROUTINE + + SUBROUTINE CHKEOS(NE, T, N, V) + INTEGER NE, T, F + CHARACTER*(*) N, V + + F = INDEX(N, V) + IF (F .EQ. 0) THEN + F = 1 + ENDIF + + CALL CHKSTR(NE, T, N(F:), V) + END SUBROUTINE + + SUBROUTINE CHKEOK(NE, T, D) + INTEGER NE, T, D + INCLUDE "getdata.f" + CALL CHKERR(NE, T, D, GD_EOK) + END SUBROUTINE + + SUBROUTINE CHKOK2(NE, T, I, D) + INTEGER NE, T, I, D + INCLUDE "getdata.f" + CALL CHKER2(NE, T, I, D, GD_EOK) + END SUBROUTINE + + + + PROGRAM BIGTST INCLUDE "getdata.f" @@ -42,17 +184,19 @@ PARAMETER (nfields = 14) INTEGER slen PARAMETER (slen = 26) + INTEGER plen + PARAMETER (plen = 4096) CHARACTER*26 strings(3) CHARACTER*7 fields(nfields + 7) CHARACTER*7 fn CHARACTER*26 str + CHARACTER*4096 path INTEGER*1 c(8) INTEGER*1 datdat(80) INTEGER*1 k INTEGER i INTEGER d - INTEGER e INTEGER m INTEGER n INTEGER l @@ -117,153 +261,64 @@ WRITE(1, REC=1) datdat CLOSE(1, STATUS='KEEP') + ne = 0 C 0: GDEROR check CALL GDOPEN(d, "x", 1, GD_RO) - CALL GDEROR(e, d) + CALL CHKERR(ne, 0, d, GD_EOP) - ne = 0 - IF (e .NE. GD_EOP) THEN - ne = ne + 1 - WRITE(*, 9001) 0, e - ENDIF - C 1: GDOPEN check CALL GDOPEN(d, fildir, 12, GD_RW) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 1, e - ENDIF - C 2: GDGETD check CALL GDGETD(n, d, 'data', 4, 5, 0, 1, 0, GD_I8, c) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 2, d) + CALL CHKINT(ne, 2, n, 8) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 2, e - ENDIF - - IF (n .NE. 8) THEN - ne = ne + 1 - WRITE(*, 9002) 2, n - ENDIF - DO 20 i = 1, 8 - IF (c(i) .NE. 40 + i) THEN - ne = ne + 1 - WRITE(*, 9004) i, 2, c(i) - ENDIF + CALL CHKIN2(ne, 2, i, INT(c(i)), 40 + i) 20 CONTINUE C 3: GDGTCO check CALL GDGTCO(d, 'const', 5, GD_F32, fl) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 3, d) + CALL CHKDBL(ne, 3, 1d0 * fl, 5.5d0) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 3, e - ENDIF - - IF (abs(fl - 5.5) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9005) 3, fl - ENDIF - C 4: GDFDNX check CALL GDFDNX(i, d) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 4, d) + CALL CHKINT(ne, 4, i, flen) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 4, e - ENDIF - - IF (i .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9002) 4, i - ENDIF - C 5: GDMFNX check CALL GDMFNX(i, d, 'data', 4) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 5, d) + CALL CHKINT(ne, 5, i, 6) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 5, e - ENDIF - - IF (i .NE. 6) THEN - ne = ne + 1 - WRITE(*, 9002) 5, i - ENDIF - C 6: GDNFLD check CALL GDNFLD(n, d) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 6, d) + CALL CHKINT(ne, 6, n, nfields) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 6, e - ENDIF - - IF (n .NE. nfields) THEN - ne = ne + 1 - WRITE(*, 9002) 6, n - ENDIF - C 7: This is a check of (one of many instances of) _GDF_FString l = 2 CALL GDFLDN(fn, l, d, 1) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 7, d) + CALL CHKINT(ne, 7, l, 5) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 7, e - ENDIF - - IF (l .NE. 5) THEN - ne = ne + 1 - WRITE(*, 9002) 7, l - ENDIF - C 8: GDFLDN check DO 80 i = 1, n l = flen CALL GDFLDN(fn, l, d, i) - CALL GDEROR(e, d) - - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 8, i, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 8, i, l - ENDIF - - IF (fn .NE. fields(i)) THEN - ne = ne + 1 - WRITE(*, 9008) i, 8, fn - ENDIF + CALL CHKOK2(ne, 8, i, d) + CALL CHKIN2(ne, 8, i, l, flen) + CALL CHKST2(ne, 8, i, fn, fields(i)) 80 CONTINUE C 9: GDNMFD check CALL GDNMFD(n, d, 'data', 4) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 9, d) + CALL CHKINT(ne, 9, n, 3) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 9, e - ENDIF - - IF (n .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9002) 9, n - ENDIF - C 10: GDMFDN check fields(1) = 'mstr' fields(2) = 'mconst' @@ -271,52 +326,21 @@ DO 100 i = 1, n l = flen CALL GDMFDN(fn, l, d, 'data', 4, i) - CALL GDEROR(e, d) - - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 10, i, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 10, i, l - ENDIF - - IF (fn .NE. fields(i)) THEN - ne = ne + 1 - WRITE(*, 9008) i, 10, fn - ENDIF + CALL CHKOK2(ne, 10, i, d) + CALL CHKIN2(ne, 10, i, l, flen) + CALL CHKST2(ne, 10, i, fn, fields(i)) 100 CONTINUE C 11: GDNFRM check CALL GDNFRM(n, d) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 11, d) + CALL CHKINT(ne, 11, n, 10) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 11, e - ENDIF - - IF (n .NE. 10) THEN - ne = ne + 1 - WRITE(*, 9002) 11, n - ENDIF - C 12: GDGSPF check CALL GDGSPF(n, d, 'data', 4) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 12, d) + CALL CHKINT(ne, 12, n, 8) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 12, e - ENDIF - - IF (n .NE. 8) THEN - ne = ne + 1 - WRITE(*, 9002) 12, n - ENDIF - C 13: GDPUTD check c(1) = 13 c(2) = 14 @@ -327,116 +351,49 @@ c(7) = 19 c(8) = 20 CALL GDPUTD(n, d, 'data', 4, 5, 1, 0, 4, GD_I8, c) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 13, d) + CALL CHKINT(ne, 13, n, 4) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 13, e - ENDIF - - IF (n .NE. 4) THEN - ne = ne + 1 - WRITE(*, 9002) 13, n - ENDIF - CALL GDGETD(n, d, 'data', 4, 5, 0, 1, 0, GD_I8, c) DO 130 i = 1, 8 - IF (((i .EQ. 1 .OR. i .GT. 5) .AND. c(i) .NE. 40 + i) .OR. - +(i .GT. 1 .AND. i .LT. 6) .AND. c(i) .NE. 11 + i) THEN - ne = ne + 1 - WRITE(*, 9004) i, 13, c(i) + IF (i .EQ. 1 .OR. i .GT. 5) THEN + n = 40 + i + ELSE + n = 11 + i ENDIF + CALL CHKIN2(ne, 13, i, INT(c(i)), n) 130 CONTINUE C 14: GDESTR check CALL GDGETD(n, d, 'x', 1, 5, 0, 1, 0, GD_I8, c) CALL GDESTR(d, str, slen) + CALL CHKSTR(ne, 14, str, 'Field not found: x') - IF (str .NE. 'Field not found: x ') THEN - ne = ne + 1 - WRITE(*, 9009) 14, str - ENDIF - C 15: GDENTY check CALL GDENTY(n, d, 'data', 4) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 15, d) + CALL CHKINT(ne, 15, n, GD_RWE) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 15, e - ENDIF - - IF (n .NE. GD_RWE) THEN - ne = ne + 1 - WRITE(*, 9002) 15, n - ENDIF - C 16: GDGERW check CALL GDGERW(l, i, n, d, 'data', 4) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 16, d) + CALL CHKIN2(ne, 16, 1, n, 0) + CALL CHKIN2(ne, 16, 2, l, 8) + CALL CHKIN2(ne, 16, 3, i, GD_I8) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 16, e - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 16, 1, n - ENDIF - - IF (l .NE. 8) THEN - ne = ne + 1 - WRITE(*, 9007) 16, 2, l - ENDIF - - IF (i .NE. GD_I8) THEN - ne = ne + 1 - WRITE(*, 9007) 16, 3, i - ENDIF - C 17: GDGELC check l = flen CALL GDGELC(i, fields(1), l, p(1), p(2), fields(2), l, p(3), +p(4), fields(3), l, p(5), p(6), n, d, 'lincom', 6) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 17, d) + CALL CHKIN2(ne, 17, 1, l, flen) + CALL CHKIN2(ne, 17, 2, i, 3) + CALL CHKIN2(ne, 17, 3, n, 0) + CALL CHKST2(ne, 17, 4, fields(1), 'data') + CALL CHKST2(ne, 17, 5, fields(2), 'INDEX') + CALL CHKST2(ne, 17, 6, fields(3), 'linterp') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 17, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 17, 1, l - ENDIF - - IF (i .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9007) 17, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 17, 3, n - ENDIF - - IF (fields(1) .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 17, 4, fields(1) - ENDIF - - IF (fields(2) .NE. 'INDEX') THEN - ne = ne + 1 - WRITE(*, 9008) 17, 5, fields(2) - ENDIF - - IF (fields(3) .NE. 'linterp') THEN - ne = ne + 1 - WRITE(*, 9008) 17, 6, fields(3) - ENDIF - q(1) = 1.1 q(2) = 2.2 q(3) = 2.2 @@ -444,53 +401,21 @@ q(5) = 5.5 q(6) = 5.5 DO 170 i=1,6 - IF (abs(p(i) - q(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9010) i, 17, p(i) - ENDIF + CALL CHKDB2(ne, 17, i, p(i), q(i)) 170 CONTINUE C 18: GDGECL check l = flen CALL GDGECL(i, fields(1), l, cp(1), cp(2), fields(2), l, cp(3), +cp(4), fields(3), l, cp(5), cp(6), n, d, 'lincom', 6) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 18, d) + CALL CHKIN2(ne, 18, 1, l, flen) + CALL CHKIN2(ne, 18, 2, i, 3) + CALL CHKIN2(ne, 18, 3, n, 0) + CALL CHKST2(ne, 18, 4, fields(1), 'data') + CALL CHKST2(ne, 18, 5, fields(2), 'INDEX') + CALL CHKST2(ne, 18, 6, fields(3), 'linterp') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 18, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 18, 1, l - ENDIF - - IF (i .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9007) 18, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 18, 3, n - ENDIF - - IF (fields(1) .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 18, 4, fields(1) - ENDIF - - IF (fields(2) .NE. 'INDEX') THEN - ne = ne + 1 - WRITE(*, 9008) 18, 5, fields(2) - ENDIF - - IF (fields(3) .NE. 'linterp') THEN - ne = ne + 1 - WRITE(*, 9008) 18, 6, fields(3) - ENDIF - cq(1) = cmplx(1.1, 0.0) cq(2) = cmplx(2.2, 0.0) cq(3) = cmplx(2.2, 0.0) @@ -498,43 +423,19 @@ cq(5) = cmplx(5.5, 0.0) cq(6) = cmplx(5.5, 0.0) DO 180 i=1,6 - IF (abs(cp(i) - cq(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9011) i, 18, REAL(REAL(cp(i))), REAL(AIMAG(cp(i))) - ENDIF + CALL CHKCP2(ne, 18, i, cp(i), cq(i)) 180 CONTINUE C 19: GDGEPN check l = flen CALL GDGEPN(i, fn, l, p(1), p(2), p(3), p(4), p(5), p(6), +n, d, 'polynom', 7) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 19, d) + CALL CHKIN2(ne, 19, 1, l, flen) + CALL CHKIN2(ne, 19, 2, i, 5) + CALL CHKIN2(ne, 19, 3, n, 0) + CALL CHKST2(ne, 19, 4, fn, 'data') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 19, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 19, 1, l - ENDIF - - IF (i .NE. 5) THEN - ne = ne + 1 - WRITE(*, 9007) 19, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 19, 3, n - ENDIF - - IF (fn .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 19, 4, fn - ENDIF - q(1) = 1.1 q(2) = 2.2 q(3) = 2.2 @@ -542,43 +443,19 @@ q(5) = 5.5 q(6) = 5.5 DO 190 i=1,6 - IF (abs(p(i) - q(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9010) i, 19, p(i) - ENDIF + CALL CHKDB2(ne, 19, i, p(i), q(i)) 190 CONTINUE C 20: GDGECP check l = flen CALL GDGECP(i, fn, l, cp(1), cp(2), cp(3), cp(4), cp(5), cp(6), +n, d, 'polynom', 7) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 20, d) + CALL CHKIN2(ne, 20, 1, l, flen) + CALL CHKIN2(ne, 20, 2, i, 5) + CALL CHKIN2(ne, 20, 3, n, 0) + CALL CHKST2(ne, 20, 4, fn, 'data') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 20, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 20, 1, l - ENDIF - - IF (i .NE. 5) THEN - ne = ne + 1 - WRITE(*, 9007) 20, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 20, 3, n - ENDIF - - IF (fn .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 20, 4, fn - ENDIF - cq(1) = cmplx(1.1, 0.0) cq(2) = cmplx(2.2, 0.0) cq(3) = cmplx(2.2, 0.0) @@ -586,282 +463,92 @@ cq(5) = cmplx(5.5, 0.0) cq(6) = cmplx(5.5, 0.0) DO 200 i=1,6 - IF (abs(cp(i) - cq(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9011) i, 30, REAL(REAL(cp(i))), REAL(AIMAG(cp(i))) - ENDIF + CALL CHKCP2(ne, 20, i, cp(i), cq(i)) 200 CONTINUE C 21: GDGELT check l = flen CALL GDGELT(fn, l, str, slen, n, d, 'linterp', 7) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 21, d) + CALL CHKIN2(ne, 21, 1, l, flen) + CALL CHKIN2(ne, 22, 2, n, 0) + CALL CHKST2(ne, 22, 3, fn, 'data') + CALL CHKST2(ne, 22, 4, str, '/look/up/file') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 21, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 21, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 21, 2, n - ENDIF - - IF (fn .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 21, 3, fn - ENDIF - - IF (str .NE. '/look/up/file') THEN - ne = ne + 1 - WRITE(*, 9008) 21, 4, str - ENDIF - C 22: GDGEBT check l = flen CALL GDGEBT(fn, l, m, i, n, d, 'bit', 3) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 22, d) + CALL CHKIN2(ne, 22, 1, l, flen) + CALL CHKIN2(ne, 22, 2, n, 0) + CALL CHKIN2(ne, 22, 3, i, 4) + CALL CHKIN2(ne, 22, 4, m, 3) + CALL CHKST2(ne, 22, 5, fn, 'data') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 22, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 22, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 22, 2, n - ENDIF - - IF (i .NE. 4) THEN - ne = ne + 1 - WRITE(*, 9007) 22, 3, i - ENDIF - - IF (m .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9007) 22, 4, m - ENDIF - - IF (fn .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 22, 5, fn - ENDIF - C 23: GDGESB check l = flen CALL GDGESB(fn, l, m, i, n, d, 'sbit', 4) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 23, d) + CALL CHKIN2(ne, 23, 1, l, flen) + CALL CHKIN2(ne, 23, 2, n, 0) + CALL CHKIN2(ne, 23, 3, i, 6) + CALL CHKIN2(ne, 23, 4, m, 5) + CALL CHKST2(ne, 23, 5, fn, 'data') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 23, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 23, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 23, 2, n - ENDIF - - IF (i .NE. 6) THEN - ne = ne + 1 - WRITE(*, 9007) 23, 3, i - ENDIF - - IF (m .NE. 5) THEN - ne = ne + 1 - WRITE(*, 9007) 23, 4, m - ENDIF - - IF (fn .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 23, 5, fn - ENDIF - C 24: GDGEMT check l = flen CALL GDGEMT(fields(1), l, fields(2), l, n, d, 'mult', 4) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 24, d) + CALL CHKIN2(ne, 24, 1, l, flen) + CALL CHKIN2(ne, 24, 2, n, 0) + CALL CHKST2(ne, 24, 3, fields(1), 'data') + CALL CHKST2(ne, 24, 4, fields(2), 'sbit') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 24, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 24, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 24, 2, n - ENDIF - - IF (fields(1) .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 24, 3, fields(1) - ENDIF - - IF (fields(2) .NE. 'sbit') THEN - ne = ne + 1 - WRITE(*, 9008) 24, 4, fields(2) - ENDIF - C 25: GDGEPH check l = flen CALL GDGEPH(fn, l, i, n, d, 'phase', 5) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 25, d) + CALL CHKIN2(ne, 25, 1, l, flen) + CALL CHKIN2(ne, 25, 2, n, 0) + CALL CHKIN2(ne, 25, 3, i, 11) + CALL CHKST2(ne, 25, 4, fn, 'data') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 25, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 25, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 25, 2, n - ENDIF - - IF (i .NE. 11) THEN - ne = ne + 1 - WRITE(*, 9007) 25, 3, i - ENDIF - - IF (fn .NE. 'data') THEN - ne = ne + 1 - WRITE(*, 9008) 25, 4, fn - ENDIF - C 26: GDGECO check CALL GDGECO(i, n, d, 'const', 5) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 26, d) + CALL CHKIN2(ne, 26, 1, n, 0) + CALL CHKIN2(ne, 26, 2, i, GD_F64) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 26, e - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 26, 1, n - ENDIF - - IF (i .NE. GD_F64) THEN - ne = ne + 1 - WRITE(*, 9007) 26, 2, i - ENDIF - C 27: GDFRGI check CALL GDFRGI(n, d, 'const', 5) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 27, d) + CALL CHKINT(ne, 27, n, 0) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 27, e - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9002) 27, n - ENDIF - C 28: GDADRW check CALL GDADRW(d, 'new1', 4, GD_F64, 3, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 28, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 28, 1, e - ENDIF - CALL GDGERW(l, i, n, d, 'new1', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 28, 2, d) + CALL CHKIN2(ne, 28, 3, n, 0) + CALL CHKIN2(ne, 28, 4, l, 3) + CALL CHKIN2(ne, 28, 5, i, GD_F64) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 28, 2, e - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 28, 3, n - ENDIF - - IF (l .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9007) 28, 4, l - ENDIF - - IF (i .NE. GD_F64) THEN - ne = ne + 1 - WRITE(*, 9007) 28, 5, i - ENDIF - C 29: GDADLC check CALL GDADLC(d, 'new2', 4, 2, 'in1', 3, 9.9d0, 8.8d0, 'in2', 3, +7.7d0, 6.6d0, '', 0, 0d0, 0d0, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 29, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 29, 1, e - ENDIF - l = flen CALL GDGELC(i, fields(1), l, p(1), p(2), fields(2), l, p(3), +p(4), fields(3), l, p(5), p(6), n, d, 'new2', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 29, 2, d) + CALL CHKIN2(ne, 29, 3, l, flen) + CALL CHKIN2(ne, 29, 4, i, 2) + CALL CHKIN2(ne, 29, 5, n, 0) + CALL CHKST2(ne, 29, 6, fields(1), 'in1') + CALL CHKST2(ne, 29, 7, fields(2), 'in2') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 29, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 29, 3, l - ENDIF - - IF (i .NE. 2) THEN - ne = ne + 1 - WRITE(*, 9007) 29, 4, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 29, 5, n - ENDIF - - IF (fields(1) .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 29, 6, fields(1) - ENDIF - - IF (fields(2) .NE. 'in2') THEN - ne = ne + 1 - WRITE(*, 9008) 29, 7, fields(2) - ENDIF - q(1) = 9.9 q(2) = 8.8 q(3) = 7.7 @@ -869,10 +556,7 @@ q(5) = 5.5 q(6) = 5.5 DO 290 i=1,4 - IF (abs(p(i) - q(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9010) i, 29, p(i) - ENDIF + CALL CHKDB2(ne, 29, i, p(i), q(i)) 290 CONTINUE C 30: GDADCL check @@ -882,99 +566,40 @@ cq(4) = cmplx(1.6, 1.7) CALL GDADCL(d, 'new3', 4, 2, 'in1', 3, cq(1), cq(2), 'in2', 3, +cq(3), cq(4), '', 0, cq(5), cq(6), 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 30, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 30, 1, e - ENDIF - l = flen CALL GDGECL(i, fields(1), l, cp(1), cp(2), fields(2), l, cp(3), +cp(4), fields(3), l, cp(5), cp(6), n, d, 'new3', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 30, 2, d) + CALL CHKIN2(ne, 30, 1, l, flen) + CALL CHKIN2(ne, 30, 2, i, 2) + CALL CHKIN2(ne, 30, 3, n, 0) + CALL CHKST2(ne, 30, 4, fields(1), 'in1') + CALL CHKST2(ne, 30, 5, fields(2), 'in2') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 30, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 30, 1, l - ENDIF - - IF (i .NE. 2) THEN - ne = ne + 1 - WRITE(*, 9007) 30, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 30, 3, n - ENDIF - - IF (fields(1) .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 30, 4, fields(1) - ENDIF - - IF (fields(2) .NE. 'in2') THEN - ne = ne + 1 - WRITE(*, 9008) 30, 5, fields(2) - ENDIF - cq(1) = cmplx(1.1, 1.2) cq(2) = cmplx(1.3, 1.4) cq(3) = cmplx(1.4, 1.5) cq(4) = cmplx(1.6, 1.7) DO 300 i=1,4 - IF (abs(cp(i) - cq(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9011) i, 30, REAL(REAL(cp(i))), REAL(AIMAG(cp(i))) - ENDIF + CALL CHKCP2(ne, 30, i, cp(i), cq(i)) 300 CONTINUE C 31: GDADPN check CALL GDADPN(d, 'new4', 4, 3, 'in1', 3, 3d3, 4d4, 5d5, 6d6, 0d0, +0d0, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 31, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 31, 1, e - ENDIF - l = flen CALL GDGEPN(i, fn, l, p(1), p(2), p(3), p(4), p(5), p(6), +n, d, 'new4', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 31, 2, d) + CALL CHKIN2(ne, 31, 1, l, flen) + CALL CHKIN2(ne, 31, 2, i, 3) + CALL CHKIN2(ne, 31, 3, n, 0) + CALL CHKST2(ne, 31, 4, fn, 'in1') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 31, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 31, 1, l - ENDIF - - IF (i .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9007) 31, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 31, 3, n - ENDIF - - IF (fn .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 31, 4, fn - ENDIF - q(1) = 3d3 q(2) = 4d4 q(3) = 5d5 @@ -983,10 +608,7 @@ q(6) = 5.5d0 DO 310 i=1,4 - IF (abs(p(i) - q(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9010) i, 31, p(i) - ENDIF + CALL CHKDB2(ne, 31, i, p(i), q(i)) 310 CONTINUE C 32: GDADCP check @@ -996,358 +618,126 @@ cq(4) = cmplx(6.3, 4.4) CALL GDADCP(d, 'new5', 4, 3, 'in1', 3, cq(1), cq(2), cq(3), cq(4), +cq(5), cq(6), 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 32, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 32, 1, e - ENDIF - l = flen CALL GDGECP(i, fn, l, cp(1), cp(2), cp(3), cp(4), cp(5), cp(6), +n, d, 'new5', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 32, 2, d) + CALL CHKIN2(ne, 32, 1, l, flen) + CALL CHKIN2(ne, 32, 2, i, 3) + CALL CHKIN2(ne, 32, 3, n, 0) + CALL CHKST2(ne, 32, 4, fn, 'in1') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 32, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 32, 1, l - ENDIF - - IF (i .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9007) 32, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 32, 3, n - ENDIF - - IF (fn .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 32, 4, fn - ENDIF - cq(1) = cmplx(3.1, 7.0) cq(2) = cmplx(4.2, 8.0) cq(3) = cmplx(5.2, 9.0) cq(4) = cmplx(6.3, 4.4) DO 320 i=1,4 - IF (abs(cp(i) - cq(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9011) i, 32, REAL(REAL(cp(i))), REAL(AIMAG(cp(i))) - ENDIF + CALL CHKCP2(ne, 32, i, cp(i), cq(i)) 320 CONTINUE C 33: GDADLT check CALL GDADLT(d, "new6", 4, "in", 2, "./some/table", 12, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 33, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 33, 1, e - ENDIF - l = flen CALL GDGELT(fn, l, str, slen, n, d, 'new6', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 33, 2, d) + CALL CHKIN2(ne, 33, 1, l, flen) + CALL CHKIN2(ne, 33, 2, n, 0) + CALL CHKST2(ne, 33, 3, fn, 'in') + CALL CHKST2(ne, 33, 4, str, './some/table') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 33, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 33, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 33, 2, n - ENDIF - - IF (fn .NE. 'in') THEN - ne = ne + 1 - WRITE(*, 9008) 33, 3, fn - ENDIF - - IF (str .NE. './some/table') THEN - ne = ne + 1 - WRITE(*, 9008) 33, 4, str - ENDIF - C 34: GDADBT check CALL GDADBT(d, "new7", 4, "in", 2, 13, 12, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 34, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 34, 1, e - ENDIF - l = flen CALL GDGEBT(fn, l, m, i, n, d, 'new7', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 34, 2, d) + CALL CHKIN2(ne, 34, 1, l, flen) + CALL CHKIN2(ne, 34, 2, n, 0) + CALL CHKIN2(ne, 34, 3, i, 12) + CALL CHKIN2(ne, 34, 4, m, 13) + CALL CHKST2(ne, 34, 5, fn, 'in') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 34, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 34, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 34, 2, n - ENDIF - - IF (i .NE. 12) THEN - ne = ne + 1 - WRITE(*, 9007) 34, 3, i - ENDIF - - IF (m .NE. 13) THEN - ne = ne + 1 - WRITE(*, 9007) 34, 4, m - ENDIF - - IF (fn .NE. 'in') THEN - ne = ne + 1 - WRITE(*, 9008) 34, 5, fn - ENDIF - C 35: GDADSB check CALL GDADSB(d, "new8", 4, "in", 2, 13, 12, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 35, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 35, 1, e - ENDIF - l = flen CALL GDGESB(fn, l, m, i, n, d, 'new8', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 35, 2, d) + CALL CHKIN2(ne, 35, 1, l, flen) + CALL CHKIN2(ne, 35, 2, n, 0) + CALL CHKIN2(ne, 35, 3, i, 12) + CALL CHKIN2(ne, 35, 4, m, 13) + CALL CHKST2(ne, 35, 5, fn, 'in') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 35, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 35, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 35, 2, n - ENDIF - - IF (i .NE. 12) THEN - ne = ne + 1 - WRITE(*, 9007) 35, 3, i - ENDIF - - IF (m .NE. 13) THEN - ne = ne + 1 - WRITE(*, 9007) 35, 4, m - ENDIF - - IF (fn .NE. 'in') THEN - ne = ne + 1 - WRITE(*, 9008) 35, 5, fn - ENDIF - C 36: GDADMT check CALL GDADMT(d, 'new9', 4, 'in1', 3, 'in2', 3, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 36, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 36, 1, e - ENDIF - l = flen CALL GDGEMT(fields(1), l, fields(2), l, n, d, 'new9', 4) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 36, 2, d) + CALL CHKIN2(ne, 36, 1, l, flen) + CALL CHKIN2(ne, 36, 2, n, 0) + CALL CHKST2(ne, 36, 3, fields(1), 'in1') + CALL CHKST2(ne, 36, 4, fields(2), 'in2') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 36, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 36, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 36, 2, n - ENDIF - - IF (fields(1) .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 36, 3, fields(1) - ENDIF - - IF (fields(2) .NE. 'in2') THEN - ne = ne + 1 - WRITE(*, 9008) 36, 4, fields(2) - ENDIF - C 37: GDADPH check CALL GDADPH(d, 'new10', 5, 'in1', 3, 22, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 37, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 37, 1, e - ENDIF - l = flen CALL GDGEPH(fn, l, i, n, d, 'new10', 5) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 37, 2, d) + CALL CHKIN2(ne, 37, 1, l, flen) + CALL CHKIN2(ne, 37, 2, n, 0) + CALL CHKIN2(ne, 37, 3, i, 22) + CALL CHKST2(ne, 37, 4, fn, 'in1') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 37, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 37, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 37, 2, n - ENDIF - - IF (i .NE. 22) THEN - ne = ne + 1 - WRITE(*, 9007) 37, 3, i - ENDIF - - IF (fn .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 37, 4, fn - ENDIF - C 38: GDADCO check CALL GDADCO(d, 'new11', 5, GD_F64, GD_F32, -8.1, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 38, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 38, 1, e - ENDIF - CALL GDGECO(i, n, d, 'new11', 5) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 38, 2, d) + CALL CHKIN2(ne, 38, 1, n, 0) + CALL CHKIN2(ne, 38, 2, i, GD_F64) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 38, 2, e - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 38, 1, n - ENDIF - - IF (i .NE. GD_F64) THEN - ne = ne + 1 - WRITE(*, 9007) 38, 2, i - ENDIF - CALL GDGTCO(d, 'new11', 5, GD_F32, fl) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 38, 3, d) + CALL CHKDBL(ne, 38, 1d0 * fl, -8.1d0) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 38, 3, e - ENDIF - - IF (abs(fl + 8.1) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9005) 38, fl - ENDIF - C 39: GDFRGN check - CALL GDFRGN(str, slen, d, 0) - CALL GDEROR(e, d) + l = plen; + CALL GDFRGN(path, l, d, 0) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 39, e - ENDIF + CALL CHKEOK(ne, 39, d) + CALL CHKINT(ne, 39, l, plen) + CALL CHKEOS(ne, 39, path, 'test_dirfile/format') - IF (str .NE. 'test_dirfile/format') THEN - ne = ne + 1 - WRITE(*, 9009), 39, str - ENDIF - C 40: GDNFRG check CALL GDNFRG(n, d) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 40, d) + CALL CHKINT(ne, 40, n, 1) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 40, e - ENDIF - - IF (n .NE. 1) THEN - ne = ne + 1 - WRITE(*, 9002), 40, n - ENDIF - C 41: GDINCL check CALL GDINCL(d, 'form2', 5, 0, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 41, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 41, 3, e - ENDIF - CALL GDGTCO(d, 'const2', 6, GD_I8, c(1)) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 41, 2, d) + CALL CHKINT(ne, 41, INT(c(1)), -19) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 41, 3, e - ENDIF - - IF (c(1) .NE. -19) THEN - ne = ne + 1 - WRITE(*, 9004) 1, 41, c(1) - ENDIF - C 42: GDNFDT check CALL GDNFDT(n, d, GD_LCE) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 42, d) + CALL CHKINT(ne, 42, n, 3) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 42, e - ENDIF - - IF (n .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9002), 42, n - ENDIF - C 43: GDFDNT check fields(1) = 'lincom' fields(2) = 'new2' @@ -1355,38 +745,16 @@ DO 430 i = 1, n l = flen CALL GDFDNT(fn, l, d, GD_LCE, i) - CALL GDEROR(e, d) - - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 43, i, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 43, i, l - ENDIF - - IF (fn .NE. fields(i)) THEN - ne = ne + 1 - WRITE(*, 9008) i, 43, fn - ENDIF + CALL CHKOK2(ne, 43, i, d) + CALL CHKIN2(ne, 43, i, l, flen) + CALL CHKST2(ne, 43, i, fn, fields(i)) 430 CONTINUE C 44: GDNVEC check CALL GDNVEC(n, d) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 44, d) + CALL CHKINT(ne, 44, n, 21) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 44, e - ENDIF - - IF (n .NE. 21) THEN - ne = ne + 1 - WRITE(*, 9002), 44, n - ENDIF - C 45: GDVECN check fields(1) = 'INDEX ' fields(2) = 'bit ' @@ -1412,69 +780,26 @@ DO 450 i = 1, n l = flen CALL GDVECN(fn, l, d, i) - CALL GDEROR(e, d) - - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 45, i, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 45, i, l - ENDIF - - IF (fn .NE. fields(i)) THEN - ne = ne + 1 - WRITE(*, 9008) i, 45, fn - ENDIF + CALL CHKOK2(ne, 45, i, d) + CALL CHKIN2(ne, 45, i, l, flen) + CALL CHKST2(ne, 45, i, fn, fields(i)) 450 CONTINUE C 46: GDMDLC check CALL GDMDLC(d, 'data', 4, 'mnew1', 5, 2, 'in1', 3, 9.9d0, 8.8d0, +'in2', 3, 7.7d0, 6.6d0, '', 0, 0d0, 0d0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 46, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 46, 1, e - ENDIF - l = flen CALL GDGELC(i, fields(1), l, p(1), p(2), fields(2), l, p(3), +p(4), fields(3), l, p(5), p(6), n, d, 'data/mnew1', 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 46, 2, d) + CALL CHKIN2(ne, 46, 3, l, flen) + CALL CHKIN2(ne, 46, 4, i, 2) + CALL CHKIN2(ne, 46, 5, n, 0) + CALL CHKST2(ne, 46, 6, fields(1), 'in1') + CALL CHKST2(ne, 46, 7, fields(2), 'in2') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 46, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 46, 3, l - ENDIF - - IF (i .NE. 2) THEN - ne = ne + 1 - WRITE(*, 9007) 46, 4, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 46, 5, n - ENDIF - - IF (fields(1) .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 46, 6, fields(1) - ENDIF - - IF (fields(2) .NE. 'in2') THEN - ne = ne + 1 - WRITE(*, 9008) 46, 7, fields(2) - ENDIF - q(1) = 9.9 q(2) = 8.8 q(3) = 7.7 @@ -1482,10 +807,7 @@ q(5) = 5.5 q(6) = 5.5 DO 460 i=1,4 - IF (abs(p(i) - q(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9010) i, 46, p(i) - ENDIF + CALL CHKDB2(ne, 46, i, p(i), q(i)) 460 CONTINUE C 47: GDMDCL check @@ -1495,99 +817,40 @@ cq(4) = cmplx(1.6, 1.7) CALL GDMDCL(d, 'data', 4, 'mnew2', 5, 2, 'in1', 3, cq(1), cq(2), +'in2', 3, cq(3), cq(4), '', 0, cq(5), cq(6)) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 47, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 47, 1, e - ENDIF - l = flen CALL GDGECL(i, fields(1), l, cp(1), cp(2), fields(2), l, cp(3), +cp(4), fields(3), l, cp(5), cp(6), n, d, 'data/mnew2', 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 47, 2, d) + CALL CHKIN2(ne, 47, 1, l, flen) + CALL CHKIN2(ne, 47, 2, i, 2) + CALL CHKIN2(ne, 47, 3, n, 0) + CALL CHKST2(ne, 47, 4, fields(1), 'in1') + CALL CHKST2(ne, 47, 5, fields(2), 'in2') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 47, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 47, 1, l - ENDIF - - IF (i .NE. 2) THEN - ne = ne + 1 - WRITE(*, 9007) 47, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 47, 3, n - ENDIF - - IF (fields(1) .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 47, 4, fields(1) - ENDIF - - IF (fields(2) .NE. 'in2') THEN - ne = ne + 1 - WRITE(*, 9008) 47, 5, fields(2) - ENDIF - cq(1) = cmplx(1.1, 1.2) cq(2) = cmplx(1.3, 1.4) cq(3) = cmplx(1.4, 1.5) cq(4) = cmplx(1.6, 1.7) DO 470 i=1,4 - IF (abs(cp(i) - cq(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9011) i, 47, REAL(REAL(cp(i))), REAL(AIMAG(cp(i))) - ENDIF + CALL CHKCP2(ne, 47, i, cp(i), cq(i)) 470 CONTINUE C 48: GDMDPN check CALL GDMDPN(d, 'data', 4, 'mnew3', 5, 3, 'in1', 3, 3d3, 4d4, 5d5, +6d6, 0d0, 0d0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 48, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 48, 1, e - ENDIF - l = flen CALL GDGEPN(i, fn, l, p(1), p(2), p(3), p(4), p(5), p(6), +n, d, 'data/mnew3', 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 48, 2, d) + CALL CHKIN2(ne, 48, 1, l, flen) + CALL CHKIN2(ne, 48, 2, i, 3) + CALL CHKIN2(ne, 48, 3, n, 0) + CALL CHKST2(ne, 48, 4, fn, 'in1') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 48, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 48, 1, l - ENDIF - - IF (i .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9007) 48, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 48, 3, n - ENDIF - - IF (fn .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 48, 4, fn - ENDIF - q(1) = 3d3 q(2) = 4d4 q(3) = 5d5 @@ -1595,10 +858,7 @@ q(5) = 5.5d0 q(6) = 5.5d0 DO 480 i=1,4 - IF (abs(p(i) - q(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9010) i, 48, p(i) - ENDIF + CALL CHKDB2(ne, 48, i, p(i), q(i)) 480 CONTINUE C 49: GDMDCP check @@ -1608,507 +868,177 @@ cq(4) = cmplx(3.3, 4.4) CALL GDMDCP(d, 'data', 4, 'mnew5', 5, 3, 'in1', 3, cq(1), cq(2), +cq(3), cq(4), cq(5), cq(6)) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 49, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 49, 1, e - ENDIF - l = flen CALL GDGECP(i, fn, l, cp(1), cp(2), cp(3), cp(4), cp(5), cp(6), +n, d, 'data/mnew5', 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 49, 2, d) + CALL CHKIN2(ne, 49, 1, l, flen) + CALL CHKIN2(ne, 49, 2, i, 3) + CALL CHKIN2(ne, 49, 3, n, 0) + CALL CHKST2(ne, 49, 4, fn, 'in1') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 49, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 49, 1, l - ENDIF - - IF (i .NE. 3) THEN - ne = ne + 1 - WRITE(*, 9007) 49, 2, i - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 49, 3, n - ENDIF - - IF (fn .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 49, 4, fn - ENDIF - cq(1) = cmplx(1.1, 0.0) cq(2) = cmplx(2.2, 0.0) cq(3) = cmplx(2.2, 0.0) cq(4) = cmplx(3.3, 4.4) DO 490 i=1,4 - IF (abs(cp(i) - cq(i)) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9011) i, 49, REAL(REAL(cp(i))), REAL(AIMAG(cp(i))) - ENDIF + CALL CHKCP2(ne, 49, i, cp(i), cq(i)) 490 CONTINUE C 50: GDMDLT check CALL GDMDLT(d, "data", 4, "mnew6", 5, "in", 2, "./more/table", 12) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 50, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 50, 1, e - ENDIF - l = flen CALL GDGELT(fn, l, str, slen, n, d, 'data/mnew6', 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 50, 2, d) + CALL CHKIN2(ne, 50, 1, l, flen) + CALL CHKIN2(ne, 50, 2, n, 0) + CALL CHKST2(ne, 50, 3, fn, 'in') + CALL CHKST2(ne, 50, 4, str, './more/table') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 50, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 50, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 50, 2, n - ENDIF - - IF (fn .NE. 'in') THEN - ne = ne + 1 - WRITE(*, 9008) 50, 3, fn - ENDIF - - IF (str .NE. './more/table') THEN - ne = ne + 1 - WRITE(*, 9008) 50, 4, str - ENDIF - C 51: GDMDBT check CALL GDMDBT(d, "data", 4, "mnew7", 5, "in", 2, 13, 12) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 51, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 51, 1, e - ENDIF - l = flen CALL GDGEBT(fn, l, m, i, n, d, 'data/mnew7', 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 51, 2, d) + CALL CHKIN2(ne, 51, 1, l, flen) + CALL CHKIN2(ne, 51, 2, n, 0) + CALL CHKIN2(ne, 51, 3, i, 12) + CALL CHKIN2(ne, 51, 4, m, 13) + CALL CHKST2(ne, 51, 5, fn, 'in') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 51, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 51, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 51, 2, n - ENDIF - - IF (i .NE. 12) THEN - ne = ne + 1 - WRITE(*, 9007) 51, 3, i - ENDIF - - IF (m .NE. 13) THEN - ne = ne + 1 - WRITE(*, 9007) 51, 4, m - ENDIF - - IF (fn .NE. 'in') THEN - ne = ne + 1 - WRITE(*, 9008) 51, 5, fn - ENDIF - C 52: GDMDSB check CALL GDMDSB(d, "data", 4, "mnew8", 5, "in", 2, 13, 12) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 52, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 52, 1, e - ENDIF - l = flen CALL GDGESB(fn, l, m, i, n, d, 'data/mnew8', 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 52, 2, d) + CALL CHKIN2(ne, 52, 1, l, flen) + CALL CHKIN2(ne, 52, 2, n, 0) + CALL CHKIN2(ne, 52, 3, i, 12) + CALL CHKIN2(ne, 52, 4, m, 13) + CALL CHKST2(ne, 52, 5, fn, 'in') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 52, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 52, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 52, 2, n - ENDIF - - IF (i .NE. 12) THEN - ne = ne + 1 - WRITE(*, 9007) 52, 3, i - ENDIF - - IF (m .NE. 13) THEN - ne = ne + 1 - WRITE(*, 9007) 52, 4, m - ENDIF - - IF (fn .NE. 'in') THEN - ne = ne + 1 - WRITE(*, 9008) 52, 5, fn - ENDIF - C 53: GDMDMT check CALL GDMDMT(d, 'data', 4, 'mnew9', 5, 'in1', 3, 'in2', 3) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 53, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 53, 1, e - ENDIF - l = flen CALL GDGEMT(fields(1), l, fields(2), l, n, d, 'data/mnew9', 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 53, 2, d) + CALL CHKIN2(ne, 53, 1, l, flen) + CALL CHKIN2(ne, 53, 2, n, 0) + CALL CHKST2(ne, 53, 3, fields(1), 'in1') + CALL CHKST2(ne, 53, 4, fields(2), 'in2') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 53, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 53, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 53, 2, n - ENDIF - - IF (fields(1) .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 53, 3, fields(1) - ENDIF - - IF (fields(2) .NE. 'in2') THEN - ne = ne + 1 - WRITE(*, 9008) 53, 4, fields(2) - ENDIF - C 54: GDMDPH check CALL GDMDPH(d, 'data', 4, 'mnew10', 6, 'in1', 3, 22) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 54, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 54, 1, e - ENDIF - l = flen CALL GDGEPH(fn, l, i, n, d, 'data/mnew10', 11) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 54, 2, d) + CALL CHKIN2(ne, 54, 1, l, flen) + CALL CHKIN2(ne, 54, 2, n, 0) + CALL CHKIN2(ne, 54, 3, i, 22) + CALL CHKST2(ne, 54, 4, fn, 'in1') - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 54, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 54, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 54, 2, n - ENDIF - - IF (i .NE. 22) THEN - ne = ne + 1 - WRITE(*, 9007) 54, 3, i - ENDIF - - IF (fn .NE. 'in1') THEN - ne = ne + 1 - WRITE(*, 9008) 54, 4, fn - ENDIF - C 55: GDMDCO check CALL GDMDCO(d, 'data', 4, 'mnew11', 6, GD_F64, GD_F32, -8.1) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 55, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 55, 1, e - ENDIF - CALL GDGECO(i, n, d, 'data/mnew11', 11) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 55, 2, d) + CALL CHKIN2(ne, 55, 1, l, flen) + CALL CHKIN2(ne, 55, 2, n, 0) + CALL CHKIN2(ne, 55, 3, i, GD_F64) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 55, 2, e - ENDIF - - IF (l .NE. flen) THEN - ne = ne + 1 - WRITE(*, 9007) 55, 1, l - ENDIF - - IF (n .NE. 0) THEN - ne = ne + 1 - WRITE(*, 9007) 55, 2, n - ENDIF - - IF (i .NE. GD_F64) THEN - ne = ne + 1 - WRITE(*, 9007) 55, 3, i - ENDIF - CALL GDGTCO(d, 'data/mnew11', 11, GD_F32, fl) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 55, 3, d) + CALL CHKDBL(ne, 55, 1d0 * fl, -8.1d0) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 55, 3, e - ENDIF - - IF (abs(fl + 8.1) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9005) 55, fl - ENDIF - C 56: GDGTST check CALL GDGTST(n, d, 'string', 6, slen, str) - CALL GDEROR(e, d) + CALL CHKEOK(ne, 56, d) + CALL CHKINT(ne, 56, n, 17) + CALL CHKSTR(ne, 56, str, "Zaphod Beeblebrox") - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9001) 56, e - ENDIF - - IF (n .NE. 17) THEN - ne = ne + 1 - WRITE(*, 9002) 56, n - ENDIF - - IF (str .NE. "Zaphod Beeblebrox") THEN - ne = ne + 1 - WRITE(*, 9009) 56, str - ENDIF - C 57: GDADST check CALL GDADST(d, 'new12', 5, "---string---", 12, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 57, 1, e) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 57, 1, e - ENDIF - CALL GDGTST(n, d, 'new12', 5, slen, str) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 57, 2, e) + CALL CHKSTR(ne, 57, str, "---string---") - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 57, 2, e - ENDIF - - IF (str .NE. "---string---") THEN - ne = ne + 1 - WRITE(*, 9009) 57, str - ENDIF - C 58: GDMDST check CALL GDMDST(d, "data", 4, 'mnew12', 6, "kai su, technon;", 16) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 58, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 58, 1, e - ENDIF - CALL GDGTST(n, d, 'data/mnew12', 11, slen, str) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 58, 2, d) + CALL CHKSTR(ne, 58, str, "kai su, technon;") - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 58, 2, e - ENDIF - - IF (str .NE. "kai su, technon;") THEN - ne = ne + 1 - WRITE(*, 9009) 58, str - ENDIF - C 59: GDADSP check CALL GDADSP(d, 'lorem STRING "Lorem ipsum"', 26, 0) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 59, 1, e) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 59, 1, e - ENDIF - CALL GDGTST(n, d, 'lorem', 5, slen, str) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 59, 2, d) + CALL CHKSTR(ne, 59, str, "Lorem ipsum") - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 59, 2, e - ENDIF - - IF (str .NE. "Lorem ipsum") THEN - ne = ne + 1 - WRITE(*, 9009) 59, str - ENDIF - C 60: GDMDSP check CALL GDMDSP(d, 'ipsum STRING "dolor sit amet."', 30, 'lorem', 5) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 60, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 60, 1, e - ENDIF - CALL GDGTST(n, d, 'lorem/ipsum', 11, slen, str) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 60, 2, d) + CALL CHKSTR(ne, 60, str, "dolor sit amet.") - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 60, 2, e - ENDIF - - IF (str .NE. "dolor sit amet.") THEN - ne = ne + 1 - WRITE(*, 9009) 60, str - ENDIF - C 61: GDPTCO check CALL GDPTCO(d, 'const', 5, GD_I32, 10) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 61, 1, d) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 61, 1, e - ENDIF - CALL GDGTCO(d, 'const', 5, GD_F32, fl) - CALL GDEROR(e, d) + CALL CHKOK2(ne, 61, 2, d) + CALL CHKDBL(ne, 61, 1d0 * fl, 10.0d0) - IF (e .NE. GD_EOK) THEN - ne = ne + 1 - WRITE(*, 9006) 61, 2, e - ENDIF - - IF (abs(fl - 10) .gt. 0.001) THEN - ne = ne + 1 - WRITE(*, 9005) 61, fl - ENDIF - C 62: GDPTST check CALL GDPTST(n, d, 'string', 6, 11, "Arthur Dent") - CALL GDEROR(e, d) + ... [truncated message content] |
From: <ket...@us...> - 2011-12-04 00:32:21
|
Revision: 629 http://getdata.svn.sourceforge.net/getdata/?rev=629&view=rev Author: ketiltrout Date: 2011-12-04 00:32:11 +0000 (Sun, 04 Dec 2011) Log Message: ----------- Canonicalise paths to avoid getting tripped up by symlinks. Also a bunch of library include fixes. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/configure.ac trunk/getdata/src/add.c trunk/getdata/src/ascii.c trunk/getdata/src/bzip.c trunk/getdata/src/close.c trunk/getdata/src/common.c trunk/getdata/src/compat.c trunk/getdata/src/constant.c trunk/getdata/src/debug.c trunk/getdata/src/del.c trunk/getdata/src/encoding.c trunk/getdata/src/endian.c trunk/getdata/src/entry.c trunk/getdata/src/errors.c trunk/getdata/src/field_list.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/globals.c trunk/getdata/src/gzip.c trunk/getdata/src/include.c trunk/getdata/src/index.c trunk/getdata/src/internal.h trunk/getdata/src/legacy.c trunk/getdata/src/lzma.c trunk/getdata/src/meta_list.c trunk/getdata/src/mod.c trunk/getdata/src/move.c trunk/getdata/src/name.c trunk/getdata/src/native.c trunk/getdata/src/nframes.c trunk/getdata/src/open.c trunk/getdata/src/parse.c trunk/getdata/src/protect.c trunk/getdata/src/putdata.c trunk/getdata/src/raw.c trunk/getdata/src/sie.c trunk/getdata/src/slim.c trunk/getdata/src/spf.c trunk/getdata/src/types.c trunk/getdata/test/file.c trunk/getdata/test/fragment_name.c trunk/getdata/test/test.h Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/ChangeLog 2011-12-04 00:32:11 UTC (rev 629) @@ -1,3 +1,20 @@ +2011-12-03 D. V. Wiebe <ge...@ke...> svn:629 + * test/test.h (CHECKEOS): Added. + * test/file.c test/fragment_name.c: Only check the end of the returned + string since we don't know what the full path is. + + * src/internal.h: Define PATH_MAX, if necessary. + * src/common.c (_GD_CanonicalPath): Added. + * src/open.c (gd_cbopen): Canonicalise filedir. + * src/common.c (_GD_MakeFullPath): Canonicalise path. Handle dirfd < 0. + * src/common.c (_GD_GrabDir): Let _GD_MakeFullPath hande canonicalising + absolute paths. + + * configure.ac: Check for lstat(3). + * src/compat.c (gd_StatAt): Don't use lstat if the platform doesn't have it. + + * src/internal.h: Move library includes into header. + 2011-12-01 D. V. Wiebe <ge...@ke...> svn:628 * src/flush.c (_GD_FlushFragment): Write "/PROTECT data" when appropriate. Bug report from Alexandra Rahlin. Modified: trunk/getdata/configure.ac =================================================================== --- trunk/getdata/configure.ac 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/configure.ac 2011-12-04 00:32:11 UTC (rev 629) @@ -673,9 +673,10 @@ AC_CHECK_FUNCS([_chsize _chsize_s _commit fchmod _fdopen fdopendir fseeko \ fseeko64 _fstat fstat64 _fstat64 fstatat fstatat64 fsync \ ftello ftello64 ftruncate ftruncate64 getcwd _getcwd getdelim \ - gmtime_r lseek64 _lseeki64 lstat _mkdir nan _open openat _read \ - renameat _rmdir snprintf _snprintf stat64 _stat64 _strtoi64 \ - strtoll _strtoui64 strtoull _unlink unlinkat _write]) + gmtime_r lseek64 _lseeki64 lstat lstat64 _mkdir nan _open \ + openat _read readlink renameat _rmdir snprintf _snprintf \ + stat64 _stat64 _strtoi64 strtoll _strtoui64 strtoull _unlink \ + unlinkat _write]) if test "x$disable_c99" = "xno"; then AC_CHECK_FUNCS([cabs]) fi Modified: trunk/getdata/src/add.c =================================================================== --- trunk/getdata/src/add.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/add.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,16 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#endif - -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - /* add an entry */ static int _GD_Add(DIRFILE* D, const gd_entry_t* entry, const char* parent) { Modified: trunk/getdata/src/ascii.c =================================================================== --- trunk/getdata/src/ascii.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/ascii.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,17 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <inttypes.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <fcntl.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#endif - /* The ASCII encoding uses file->edata for the stream pointer */ int _GD_AsciiOpen(int fd, struct _gd_raw_file* file, int swap __gd_unused, Modified: trunk/getdata/src/bzip.c =================================================================== --- trunk/getdata/src/bzip.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/bzip.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,14 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <errno.h> -#include <time.h> -#include <stdio.h> -#include <string.h> -#endif - #ifdef HAVE_BZLIB_H #include <bzlib.h> #endif Modified: trunk/getdata/src/close.c =================================================================== --- trunk/getdata/src/close.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/close.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,10 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#endif - /* _GD_FreeD: free the DIRFILE and its subordinates */ static void _GD_FreeD(DIRFILE* D) Modified: trunk/getdata/src/common.c =================================================================== --- trunk/getdata/src/common.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/common.c 2011-12-04 00:32:11 UTC (rev 629) @@ -21,19 +21,11 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <inttypes.h> -#include <errno.h> -#include <fcntl.h> -#include <math.h> -#include <stdlib.h> -#include <string.h> +/* This is defined on BSD */ +#ifndef MAXSYMLINKS +#define MAXSYMLINKS 20 #endif -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - #ifdef GETDATA_DEBUG int gd_col_count = 0; char gd_debug_col[GD_COL_SIZE + 1] = ""; @@ -918,26 +910,285 @@ return D->name; } +/* This is effectively the POSIX.1 realpath(3) function, but with some + * optimisation due to the fact that we know that the front part of the + * path (car) has already been canonicalised */ +char *_GD_CanonicalPath(const char *car, const char *cdr) +{ + int last_element = 0, loop_count = 0; + size_t res_len, res_size, len; + char *res = NULL, *ptr, *work, *cur, *end; + dtrace("\"%s\", \"%s\"", car, cdr); + + if (car && !_GD_AbsPath(cdr)) { + if (car[0] != '/') { + /* car is not abosulte -- don't bother trying to do anything fancy */ + res = malloc(strlen(car) + strlen(cdr) + 2); + if (res == NULL) { + dreturn("%p", NULL); + return NULL; + } + sprintf(res, "%s/%s", car, cdr); + return res; + } + /* car is nonnull and cdr is not absolute: copy car into res and + * cdr into work */ + res = strdup(car); + if (res == NULL) { + dreturn("%p", NULL); + return NULL; + } + res_size = (res_len = strlen(car)) + 1; + + cur = work = strdup(cdr); + if (work == NULL) { + free(res); + dreturn("%p", NULL); + return NULL; + } + } else if (cdr[0] == '/') { + /* cdr is absolute: make res "/" and copy cdr relative to / into work; + * ignore car */ + res_len = 1; + res = (char*)malloc(res_size = PATH_MAX); + if (res == NULL) { + dreturn("%p", NULL); + return NULL; + } + res[0] = '/'; + res[1] = '\0'; + + if (cdr[0] == '/' && cdr[1] == '\0') { + dreturn("\"%s\"", res); + return res; + } + + cur = work = strdup(cdr + 1); + if (work == NULL) { + free(res); + dreturn("%p", NULL); + return NULL; + } + } else { + /* car is not present and cdr is relative: try to get the CWD; and make + * work CWD/cdr, relative to / if getcwd returned an absolute path. If + * getcwd fails, just use cdr, and abandon hope of an absolute path. + */ + res = (char*)malloc(res_size = PATH_MAX); + work = (char*)malloc(PATH_MAX); + if (res == NULL || work == NULL) { + free(res); + free(res); + dreturn("%p", NULL); + return NULL; + } + + if (gd_getcwd(work, PATH_MAX) == NULL) { + /* if getcwd fails, we're stuck with a relative path, oh well. */ + free(work); + cur = work = strdup(cdr); + if (work == NULL) { + free(res); + dreturn("%p", NULL); + return NULL; + } + res[0] = '\0'; + res_len = 0; + } else { + if ((len = strlen(work) + 2 + strlen(cdr)) < PATH_MAX) { + ptr = (char*)realloc(work, len); + if (ptr == NULL) { + free(res); + free(work); + dreturn("%p", NULL); + return NULL; + } + work = ptr; + } + ptr = work + strlen(work); + *(ptr++) = '/'; + strcpy(ptr, cdr); + + if (work[0] == '/') { + res[0] = '/'; + res[1] = '\0'; + res_len = 1; + cur = work + 1; + } else { + res[0] = '\0'; + res_len = 0; + cur = work; + } + } + } + + /* now step through work, building up res as appropriate */ + for (end = cur ; !last_element; cur = end) { + /* look for the next '/' or NUL */ + for (; *end != '\0' && *end != '/'; ++end) + ; + + /* end of string */ + if (*end == '\0' && cur == end) + break; + else if (*end == '\0') + last_element = 1; + + *(end++) = '\0'; + if (cur[0] == '\0') + /* consecutive /s */ + ; + else if (cur[0] == '.' && cur[1] == '\0') { + /* discard . */ + continue; + } else if (cur[0] == '.' && cur[1] == '.' && cur[2] == '\0') { + /* don't strip the leading '/' */ + if (res_len > 1) { + /* find the last '/', but don't strip the leading '/' */ + for(ptr = res + res_len - 1; *ptr != '/' && ptr > res + 1; --ptr) + ; + + /* strip the .. if possible, otherwise append it */ + *ptr = '\0'; + res_len = ptr - res; + } + } else { + /* a path element, copy it to res */ + len = strlen(cur) + 1; + if (res_len + len >= res_size) { + ptr = (char*)realloc(res, res_size += (len < 1000) ? 1000 : len); + if (ptr == NULL) { + free(res); + free(work); + dreturn("%p", NULL); + return NULL; + } + res = ptr; + } + if (res_len > 1 && res[res_len - 1] != '/') + res[res_len++] = '/'; + strcpy(res + res_len, cur); + res_len += len - 1; +#if defined HAVE_READLINK && defined HAVE_LSTAT64 + { + gd_stat64_t statbuf; + + /* check if it's a symlink */ + if (lstat64(res, &statbuf)) { + if (errno == ENOENT && *end == '\0') { + /* the leaf doesn't exist. I guess that means we're done. */ + goto _GD_CanonicalPath_DONE; + } + perror("lstat64"); + /* doesn't exist */ + free(res); + free(work); + dreturn("%p", NULL); + return NULL; + } + + if (S_ISLNK(statbuf.st_mode)) { + char target[PATH_MAX], *new; + ssize_t slen; + + /* check for symlink loop */ + if (loop_count++ > MAXSYMLINKS) { + errno = ELOOP; + free(res); + free(work); + dreturn("%p", NULL); + return NULL; + } + + /* get the link target */ + slen = readlink(res, target, PATH_MAX); + if (slen == -1) { + free(res); + free(work); + dreturn("%p", NULL); + return NULL; + } + + /* now we have to start all over again */ + ptr = target; + if (target[0] == '/') { + res[1] = '\0'; + res_len = 1; + ptr++; + slen--; + } else if (res_len > 1) { + /* strip the symlink name from res */ + for (ptr = res + res_len - 1; *ptr != '/'; --ptr) + ; + *(ptr + 1) = '\0'; + res_len = res - ptr + 1; + } + + /* now make a new work buffer of "target/remaining", asusming + * remaining is non-null, otherwise, just use target */ + if (*end == '\0') { + free(work); + end = work = strdup(target); + if (work == NULL) { + free(res); + dreturn("%p", NULL); + return NULL; + } + } else { + char slash[2] = "/"; + len = strlen(end) + slen + 2; + + if (*(ptr + slen - 1) == '/') { + slash[0] = '\0'; + len--; + } + + new = (char*)malloc(len); + if (new == NULL) { + free(res); + free(work); + dreturn("%p", NULL); + return NULL; + } + sprintf(new, "%s%s%s", ptr, slash, end); + free(work); + end = work = new; + } + } + } +#endif + } + } + +_GD_CanonicalPath_DONE: + free(work); + + /* trim */ + ptr = realloc(res, res_len + 1); + if (ptr) + res = ptr; + + dreturn("\"%s\"", res); + return res; +} + char *_GD_MakeFullPath(const DIRFILE *D, int dirfd, const char *name) { const char *dir; char *filepath; dtrace("%p, %i, \"%s\"", D, dirfd, name); - dir = _GD_DirName(D, dirfd); - if (dir == NULL) { - dreturn("%p", NULL); - return NULL; - } + if (dirfd >= 0) { + dir = _GD_DirName(D, dirfd); + if (dir == NULL) { + dreturn("%p", NULL); + return NULL; + } + } else + dir = NULL; - filepath = (char *)malloc(strlen(dir) + strlen(name) + 2); - if (filepath == NULL) { - dreturn("%p", NULL); - return NULL; - } + filepath = _GD_CanonicalPath(dir, name); - strcat(strcat(strcpy(filepath, dir), "/"), name); - dreturn("\"%s\"", filepath); return filepath; } @@ -951,10 +1202,7 @@ dtrace("%p, %i, \"%s\"", D, dirfd, name); - if (abs) - path = strdup(name); - else - path = _GD_MakeFullPath(D, dirfd, name); + path = _GD_MakeFullPath(D, dirfd, name); if (path == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); Modified: trunk/getdata/src/compat.c =================================================================== --- trunk/getdata/src/compat.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/compat.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,20 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <stdio.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <errno.h> -#include <time.h> -#endif - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - /* The MSVCRT gmtime() is threadsafe */ #ifndef HAVE_GMTIME_R struct tm *gmtime_r(const time_t *timep, struct tm *result) @@ -111,9 +97,11 @@ dtrace("%p, %i, \"%s\", %p, %x", D, dirfd, name, buf, flags); path = _GD_MakeFullPath(D, dirfd, name); +#ifdef HAVE_LSTAT if (flags & AT_SYMLINK_NOFOLLOW) ret = lstat(path, buf); else +#endif ret = stat(path, buf); free(path); Modified: trunk/getdata/src/constant.c =================================================================== --- trunk/getdata/src/constant.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/constant.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,10 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#endif - /* this function is little more than a public boilerplate for _GD_DoField */ int gd_get_constant(DIRFILE* D, const char *field_code_in, gd_type_t return_type, void *data_out) gd_nothrow Modified: trunk/getdata/src/debug.c =================================================================== --- trunk/getdata/src/debug.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/debug.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,7 +20,6 @@ */ #include "internal.h" -#include <string.h> extern char gd_debug_col[GD_COL_SIZE + 1]; extern int gd_col_count; Modified: trunk/getdata/src/del.c =================================================================== --- trunk/getdata/src/del.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/del.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,12 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#endif - static void _GD_ClearDerived(DIRFILE* D, gd_entry_t* E, const gd_entry_t* C, int check) { Modified: trunk/getdata/src/encoding.c =================================================================== --- trunk/getdata/src/encoding.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/encoding.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,17 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <inttypes.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <math.h> -#include <stdlib.h> -#include <string.h> -#endif - #ifdef USE_MODULES #ifdef USE_PTHREAD #ifdef HAVE_PTHREAD_H Modified: trunk/getdata/src/endian.c =================================================================== --- trunk/getdata/src/endian.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/endian.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,12 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#endif - static void _GD_ByteSwapFragment(DIRFILE* D, unsigned long byte_sex, int fragment, int move) { Modified: trunk/getdata/src/entry.c =================================================================== --- trunk/getdata/src/entry.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/entry.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,15 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <string.h> -#include <stdlib.h> -#endif - -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - void _GD_FreeE(DIRFILE *D, gd_entry_t* entry, int priv) { int i; Modified: trunk/getdata/src/errors.c =================================================================== --- trunk/getdata/src/errors.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/errors.c 2011-12-04 00:32:11 UTC (rev 629) @@ -21,12 +21,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#endif - /* Error strings. */ static const struct { int error; Modified: trunk/getdata/src/field_list.c =================================================================== --- trunk/getdata/src/field_list.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/field_list.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,10 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#endif - /* zero length lists */ static const char* zero_list[1] = { NULL }; static const gd_carray_t zero_carrays[1] = { {0, NULL} }; Modified: trunk/getdata/src/flimits.c =================================================================== --- trunk/getdata/src/flimits.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/flimits.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,12 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#endif - static void _GD_ShiftFragment(DIRFILE* D, off64_t offset, int fragment, int move) { Modified: trunk/getdata/src/flush.c =================================================================== --- trunk/getdata/src/flush.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/flush.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,20 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <time.h> -#include <limits.h> -#endif - -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - #define GD_MAX_PRETTY_FIELD_WIDTH 80 void _GD_Flush(DIRFILE* D, gd_entry_t *E, int clo) Modified: trunk/getdata/src/fpos.c =================================================================== --- trunk/getdata/src/fpos.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/fpos.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,11 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <string.h> -#include <stdlib.h> -#endif - off64_t _GD_GetFilePos(DIRFILE *D, gd_entry_t *E, off64_t index_pos) { int i; Modified: trunk/getdata/src/fragment.c =================================================================== --- trunk/getdata/src/fragment.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/fragment.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,10 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#endif - const char *gd_fragmentname(DIRFILE* D, int index) gd_nothrow { dtrace("%p, %i", D, index); Modified: trunk/getdata/src/getdata.c =================================================================== --- trunk/getdata/src/getdata.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/getdata.c 2011-12-04 00:32:11 UTC (rev 629) @@ -21,16 +21,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <inttypes.h> -#include <errno.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <math.h> -#include <stdlib.h> -#include <string.h> -#endif - #include "nan.h" #define EXTRACT_REPR(it,ot,f) \ Modified: trunk/getdata/src/globals.c =================================================================== --- trunk/getdata/src/globals.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/globals.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,11 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <string.h> -#include <stdlib.h> -#endif - /* This is nothing other than what the caller gave us. Presumably it should * be better at keeping track of such things than us, but this is present in * the event that it is not. */ Modified: trunk/getdata/src/gzip.c =================================================================== --- trunk/getdata/src/gzip.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/gzip.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,15 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <errno.h> -#include <time.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#endif - #ifdef HAVE_ZLIB_H #include <zlib.h> #endif Modified: trunk/getdata/src/include.c =================================================================== --- trunk/getdata/src/include.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/include.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,19 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <string.h> -#include <stdlib.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#endif - -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - /* Include a format file fragment -- returns the include index, or * -1 on error */ int _GD_Include(DIRFILE* D, const char* ename, const char* format_file, Modified: trunk/getdata/src/index.c =================================================================== --- trunk/getdata/src/index.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/index.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,11 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#endif - #include "nan.h" static double _GD_Extrapolate(DIRFILE *D, gd_entry_t *E, int repr, double value, Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/internal.h 2011-12-04 00:32:11 UTC (rev 629) @@ -27,17 +27,38 @@ #endif #include "getdata.h" + +/* library headers */ +#ifdef STDC_HEADERS +#include <stdlib.h> #include <string.h> +#include <stdio.h> #include <errno.h> +#include <sys/param.h> +#include <sys/types.h> +#include <sys/stat.h> #include <fcntl.h> -#include <sys/stat.h> +#include <ctype.h> +#include <limits.h> +#include <math.h> +#include <time.h> +#endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> +#ifdef HAVE_DIRENT_H +#include <dirent.h> #endif +#ifdef HAVE_INTTYPES_H +#include <inttypes.h> +#endif +#ifdef HAVE_LIBGEN_H +#include <libgen.h> +#endif #ifdef HAVE_STDINT_H #include <stdint.h> #endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif /* MSVC types */ #ifdef _MSC_VER @@ -117,6 +138,21 @@ #endif #endif +#ifndef PATH_MAX +# ifdef _POSIX_PATH_MAX +# define PATH_MAX _POSIX_PATH_MAX +# elif defined MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else +/* POSIX says we're supposed to check _pathconf in this case, but it goes on to + * say that the PATH_MAX value reported isn't guaranteed to be suitable for + * mallocing, so its not clear what they're trying to do there. The following + * will have to do. + */ +# define PATH_MAX 4096 +# endif +#endif + #if SIZEOF_INT < 4 #define GD_BUFFER_SIZE 32767 #else @@ -158,9 +194,6 @@ #endif #endif -/* For FILE */ -#include <stdio.h> - /* For the C99 integer types */ #ifdef HAVE_INTTYPES_H # ifndef __STDC_FORMAT_MACROS @@ -261,8 +294,10 @@ #ifdef HAVE__GETCWD # define gd_getcwd _getcwd +#elif defined HAVE_GETCWD +# define gd_getcwd getcwd #else -# define gd_getcwd getcwd +# define gd_getcwd(...) (NULL) #endif #ifndef HAVE_SNPRINTF @@ -279,8 +314,11 @@ # endif #endif -#ifndef HAVE_LSTAT -# define lstat stat +#ifndef HAVE_LSTAT64 +# ifdef HAVE_LSTAT +# define lstat64 lstat +# define HAVE_LSTAT64 +# endif #endif #ifdef HAVE__STRTOI64 @@ -825,10 +863,11 @@ extern const gd_entype_t _gd_entype_index[GD_N_ENTYPES]; -void* _GD_Alloc(DIRFILE* D, gd_type_t type, size_t n); +void *_GD_Alloc(DIRFILE*, gd_type_t, size_t) __attribute_malloc__; void _GD_ArmEndianise(uint64_t* databuffer, int is_complex, size_t ns); int _GD_BadInput(DIRFILE* D, gd_entry_t* E, int i); int _GD_CalculateEntry(DIRFILE* D, gd_entry_t* E); +char *_GD_CanonicalPath(const char*, const char*); void _GD_CInvertData(DIRFILE* D, void* data, gd_type_t return_type, GD_DCOMPLEXA(dividend), size_t n_read); Modified: trunk/getdata/src/legacy.c =================================================================== --- trunk/getdata/src/legacy.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/legacy.c 2011-12-04 00:32:11 UTC (rev 629) @@ -22,11 +22,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#endif - static struct { unsigned int n; DIRFILE** D; Modified: trunk/getdata/src/lzma.c =================================================================== --- trunk/getdata/src/lzma.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/lzma.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,14 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <errno.h> -#include <time.h> -#include <stdio.h> -#include <string.h> -#endif - #ifdef HAVE_LZMA_H #include <lzma.h> #endif Modified: trunk/getdata/src/meta_list.c =================================================================== --- trunk/getdata/src/meta_list.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/meta_list.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,11 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#endif - /* a zero length list */ static const char *zero_list[1] = { NULL }; static const gd_carray_t zero_carrays[1] = { {0, NULL} }; Modified: trunk/getdata/src/mod.c =================================================================== --- trunk/getdata/src/mod.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/mod.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,16 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#endif - -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - static unsigned int _gd_max(unsigned int A, unsigned int B) { return (A > B) ? A : B; Modified: trunk/getdata/src/move.c =================================================================== --- trunk/getdata/src/move.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/move.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,12 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#endif - int _GD_MogrifyFile(DIRFILE* D, gd_entry_t* E, unsigned long encoding, unsigned long byte_sex, off64_t offset, int finalise, int new_fragment, char* new_filebase) Modified: trunk/getdata/src/name.c =================================================================== --- trunk/getdata/src/name.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/name.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,12 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#endif - /* Check for a valid field name -- returns input on error */ char* _GD_ValidateField(const gd_entry_t* parent, const char* field_code, int standards, int strict, int* is_dot) Modified: trunk/getdata/src/native.c =================================================================== --- trunk/getdata/src/native.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/native.c 2011-12-04 00:32:11 UTC (rev 629) @@ -19,7 +19,6 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "internal.h" -#include <stdlib.h> gd_type_t _GD_NativeType(DIRFILE* D, gd_entry_t* E, int repr) { Modified: trunk/getdata/src/nframes.c =================================================================== --- trunk/getdata/src/nframes.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/nframes.c 2011-12-04 00:32:11 UTC (rev 629) @@ -22,10 +22,6 @@ #include "internal.h" #undef gd_nframes64 -#ifdef STDC_HEADERS -#include <errno.h> -#endif - off64_t gd_nframes64(DIRFILE* D) { off64_t nf; Modified: trunk/getdata/src/open.c =================================================================== --- trunk/getdata/src/open.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/open.c 2011-12-04 00:32:11 UTC (rev 629) @@ -21,24 +21,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <ctype.h> -#include <math.h> -#include <errno.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> -#endif - -#ifdef HAVE_DIRENT_H -#include <dirent.h> -#endif - -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - /* attempt to open or create a new dirfile - set error appropriately */ static FILE* _GD_CreateDirfile(DIRFILE* D, int dirfd, int dir_error, char* dirfile) @@ -316,20 +298,8 @@ * using chdir. */ - /* get a full path, if necessary */ - if (_GD_AbsPath(filedir)) - dirfile = strdup(filedir); - else { - dirfile = gd_getcwd(NULL, 0); - if (dirfile) { - char *ptr = realloc(dirfile, strlen(dirfile) + strlen(filedir) + 2); - if (ptr == NULL) { - free(dirfile); - dirfile = NULL; - } else - dirfile = strcat(strcat(ptr, "/"), filedir); - } - } + /* canonicalise the path */ + dirfile = _GD_CanonicalPath(NULL, filedir); /* that done, now stat the path to see if it exists (and is a directory) */ if (dirfile) { @@ -344,8 +314,14 @@ /* quickly, before it goes away, grab the directory (if it exists) */ dirfd = open(filedir, O_RDONLY); dirfd_error = errno; - dirfile = strdup(filedir); + /* There's a race condition here: someone might change a path element in + * filedir after we get dirfd but before we canonicalise the path. For that + * reason, anything requiring a full path must be treated with suspicion. + */ + dirfile = _GD_CanonicalPath(NULL, filedir); #endif + if (dirfile == NULL) + dirfile = strdup(filedir); _GD_InitialiseFramework(); @@ -428,14 +404,13 @@ dreturn("%p", D); return D; } - D->fragment[0].cname = malloc(strlen(filedir) + 8); + D->fragment[0].cname = _GD_CanonicalPath(dirfile, "format"); D->fragment[0].bname = strdup("format"); if (D->fragment[0].cname == NULL || D->fragment[0].bname == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", D); return D; } - strcat(strcpy(D->fragment[0].cname, filedir), "/format"); D->fragment[0].sname = NULL; /* The root format file needs no external name */ D->fragment[0].ename = NULL; Modified: trunk/getdata/src/parse.c =================================================================== --- trunk/getdata/src/parse.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/parse.c 2011-12-04 00:32:11 UTC (rev 629) @@ -21,25 +21,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <inttypes.h> -#include <ctype.h> -#include <math.h> -#include <errno.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> -#endif - -#ifdef HAVE_DIRENT_H -#include <dirent.h> -#endif - -#ifdef HAVE_LIBGEN_H -#include <libgen.h> -#endif - static gd_type_t _GD_RawType(const char* type, int standards, int pedantic) { gd_type_t t = GD_UNKNOWN;; Modified: trunk/getdata/src/protect.c =================================================================== --- trunk/getdata/src/protect.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/protect.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,10 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#endif - int gd_protection(DIRFILE* D, int fragment_index) gd_nothrow { dtrace("%p, %i", D, fragment_index); Modified: trunk/getdata/src/putdata.c =================================================================== --- trunk/getdata/src/putdata.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/putdata.c 2011-12-04 00:32:11 UTC (rev 629) @@ -22,14 +22,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <inttypes.h> -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <stdlib.h> -#endif - static size_t _GD_DoRawOut(DIRFILE *D, gd_entry_t *E, off64_t s0, size_t ns, gd_type_t data_type, const void *data_in) { Modified: trunk/getdata/src/raw.c =================================================================== --- trunk/getdata/src/raw.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/raw.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,14 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <fcntl.h> -#include <errno.h> -#endif - int _GD_RawOpen(int fd, struct _gd_raw_file* file, int swap __gd_unused, unsigned int mode) { Modified: trunk/getdata/src/sie.c =================================================================== --- trunk/getdata/src/sie.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/sie.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,17 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <inttypes.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <fcntl.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#endif - struct gd_siedata { int swap; ssize_t r; Modified: trunk/getdata/src/slim.c =================================================================== --- trunk/getdata/src/slim.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/slim.c 2011-12-04 00:32:11 UTC (rev 629) @@ -20,12 +20,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <errno.h> -#include <time.h> -#endif - #ifdef HAVE_SLIMLIB_H #include <slimlib.h> #endif Modified: trunk/getdata/src/spf.c =================================================================== --- trunk/getdata/src/spf.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/spf.c 2011-12-04 00:32:11 UTC (rev 629) @@ -21,11 +21,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <string.h> -#include <stdlib.h> -#endif - /* _GD_GetSPF: Get samples per frame for field */ gd_spf_t _GD_GetSPF(DIRFILE* D, gd_entry_t* E) Modified: trunk/getdata/src/types.c =================================================================== --- trunk/getdata/src/types.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/src/types.c 2011-12-04 00:32:11 UTC (rev 629) @@ -21,15 +21,6 @@ */ #include "internal.h" -#ifdef STDC_HEADERS -#include <inttypes.h> -#include <errno.h> -#include <fcntl.h> -#include <math.h> -#include <stdlib.h> -#include <string.h> -#endif - #ifdef GD_NO_C99_API #define TO_COMPLEX(ot,it) \ Modified: trunk/getdata/test/file.c =================================================================== --- trunk/getdata/test/file.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/test/file.c 2011-12-04 00:32:11 UTC (rev 629) @@ -64,7 +64,10 @@ rmdir(filedir); CHECKI(error, 0); - CHECKS(path,"dirfile/data"); + /* This only checks whether the end of the returned path is what we expect. + * This should work, since we can guarantee that both "dirfile" and "data" + * aren't symlinks. */ + CHECKEOS(path,"dirfile/data"); free(path); return r; Modified: trunk/getdata/test/fragment_name.c =================================================================== --- trunk/getdata/test/fragment_name.c 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/test/fragment_name.c 2011-12-04 00:32:11 UTC (rev 629) @@ -62,8 +62,11 @@ unlink(format); rmdir(filedir); - CHECKS(form0,"dirfile/format"); - CHECKS(form1,"dirfile/format1"); + /* This only checks whether the end of the returned path is what we expect. + * This should work, since we can guarantee that both "dirfile" and "format*" + * aren't symlinks. */ + CHECKEOS(form0,"dirfile/format"); + CHECKEOS(form1,"dirfile/format1"); free(form0); free(form1); Modified: trunk/getdata/test/test.h =================================================================== --- trunk/getdata/test/test.h 2011-12-01 16:31:32 UTC (rev 628) +++ trunk/getdata/test/test.h 2011-12-04 00:32:11 UTC (rev 629) @@ -89,6 +89,8 @@ #define CHECKSi(n,v) CHECKi(i,strcmp((n),(v)),n,"\"%s\"","\"%s\"",(n),(v)); #define CHECKSp(n,v) CHECK(strncmp((n),(v), sizeof(v) - 1),n,"\"%s\"",\ "\"%s\"",(n),(v)); +#define CHECKEOS(n,v) CHECK(strcmp((n) + strlen(n) - sizeof(v) + 1,(v)),n,\ + "...\"%s\"","\"%s\"",(n) + strlen(n) - sizeof(v) + 1,(v)); #define CHECKU(n,v) CHECK((n) != (v),n,"%llu","%llu",\ (unsigned long long)(n),(unsigned long long)(v)) #define CHECKUi(i,n,v) CHECKi(i,(n) != (v),n,"%llu","%llu",\ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-12-01 16:31:42
|
Revision: 628 http://getdata.svn.sourceforge.net/getdata/?rev=628&view=rev Author: ketiltrout Date: 2011-12-01 16:31:32 +0000 (Thu, 01 Dec 2011) Log Message: ----------- Fix writing of /PROTECT directives. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/src/flush.c Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-11-17 01:48:56 UTC (rev 627) +++ trunk/getdata/ChangeLog 2011-12-01 16:31:32 UTC (rev 628) @@ -1,3 +1,7 @@ +2011-12-01 D. V. Wiebe <ge...@ke...> svn:628 + * src/flush.c (_GD_FlushFragment): Write "/PROTECT data" when appropriate. + Bug report from Alexandra Rahlin. + 2011-11-13 D. V. Wiebe <ge...@ke...> svn:626 * src/entry.c (gd_raw_filename): Revert r613 changes. * src/gzip.c: Move OOP code out of gzip layer. Modified: trunk/getdata/src/flush.c =================================================================== --- trunk/getdata/src/flush.c 2011-11-17 01:48:56 UTC (rev 627) +++ trunk/getdata/src/flush.c 2011-12-01 16:31:32 UTC (rev 628) @@ -522,7 +522,7 @@ fputs("/PROTECT none\n", stream); else if (D->fragment[i].protection == GD_PROTECT_FORMAT) fputs("/PROTECT format\n", stream); - else if (D->fragment[i].protection == GD_PROTECT_FORMAT) + else if (D->fragment[i].protection == GD_PROTECT_DATA) fputs("/PROTECT data\n", stream); else fputs("/PROTECT all\n", stream); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-17 01:49:02
|
Revision: 627 http://getdata.svn.sourceforge.net/getdata/?rev=627&view=rev Author: ketiltrout Date: 2011-11-17 01:48:56 +0000 (Thu, 17 Nov 2011) Log Message: ----------- LZMA and slim updates. Modified Paths: -------------- trunk/getdata/src/encoding.c trunk/getdata/src/internal.h trunk/getdata/src/lzma.c trunk/getdata/src/slim.c Modified: trunk/getdata/src/encoding.c =================================================================== --- trunk/getdata/src/encoding.c 2011-11-13 21:11:09 UTC (rev 626) +++ trunk/getdata/src/encoding.c 2011-11-17 01:48:56 UTC (rev 627) @@ -398,8 +398,9 @@ } /* Perform a RAW field write */ -ssize_t _GD_WriteOut(DIRFILE *D, gd_entry_t *E, const struct encoding_t *enc, - const void *ptr, gd_type_t type, size_t n, int temp) +ssize_t _GD_WriteOut(DIRFILE *D gd_unused_d, gd_entry_t *E, + const struct encoding_t *enc, const void *ptr, gd_type_t type, size_t n, + int temp) { ssize_t n_wrote; @@ -876,7 +877,7 @@ int fd = -1; char *tmp = strdup(template); - dtrace("%i, \"%s\"", dirfd, template); + dtrace("%p, %i, \"%s\"", D, dirfd, template); if (!tmp) { dreturn("%i", -1); Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-11-13 21:11:09 UTC (rev 626) +++ trunk/getdata/src/internal.h 2011-11-17 01:48:56 UTC (rev 627) @@ -383,7 +383,11 @@ #endif #ifdef HAVE_OPENAT -# define gd_unused_d __gd_unused +# ifdef GETDATA_DEBUG +# define gd_unused_d /**/ +# else +# define gd_unused_d __gd_unused +# endif # define gd_OpenAt(d,...) openat(__VA_ARGS__) #else # define gd_unused_d /**/ Modified: trunk/getdata/src/lzma.c =================================================================== --- trunk/getdata/src/lzma.c 2011-11-13 21:11:09 UTC (rev 626) +++ trunk/getdata/src/lzma.c 2011-11-17 01:48:56 UTC (rev 627) @@ -115,12 +115,12 @@ return ptr; } -int _GD_LzmaOpen(int dirfd, int fd2 __gd_unused, struct _gd_raw_file* file, - int swap __gd_unused, unsigned int mode __gd_unused) +int _GD_LzmaOpen(int dirfd, struct _gd_raw_file* file, int swap __gd_unused, + unsigned int mode __gd_unused) { struct gd_lzmadata *ptr; - dtrace("%i, <unused>, %p, <unused>, <unused>", dirfd, file); + dtrace("%i, %p, <unused>, <unused>", dirfd, file); file->edata = ptr = _GD_LzmaDoOpen(dirfd, file); Modified: trunk/getdata/src/slim.c =================================================================== --- trunk/getdata/src/slim.c 2011-11-13 21:11:09 UTC (rev 626) +++ trunk/getdata/src/slim.c 2011-11-17 01:48:56 UTC (rev 627) @@ -41,10 +41,10 @@ /* The slim encoding scheme uses edata as a slimfile pointer. If a file is * open, idata = 0 otherwise idata = -1. */ -int _GD_SlimOpen(int dirfd, int fd2 __gd_unused, struct _gd_raw_file* file, - int swap __gd_unused, unsigned int mode __gd_unused) +int _GD_SlimOpen(int dirfd, struct _gd_raw_file* file, int swap __gd_unused, + unsigned int mode __gd_unused) { - dtrace("%i, <unused>, %p, <unused>, <unused>", dirfd, file); + dtrace("%i, %p, <unused>, <unused>", dirfd, file); { #ifdef HAVE_SLIMDOPEN This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-13 21:11:18
|
Revision: 626 http://getdata.svn.sourceforge.net/getdata/?rev=626&view=rev Author: ketiltrout Date: 2011-11-13 21:11:09 +0000 (Sun, 13 Nov 2011) Log Message: ----------- Move OOP write code into the bookkeeping layer. Report write errors. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/configure.ac trunk/getdata/src/ascii.c trunk/getdata/src/bzip.c trunk/getdata/src/encoding.c trunk/getdata/src/entry.c trunk/getdata/src/fpos.c trunk/getdata/src/gzip.c trunk/getdata/src/internal.h trunk/getdata/src/meta_list.c trunk/getdata/src/mod.c trunk/getdata/src/move.c trunk/getdata/src/putdata.c trunk/getdata/src/raw.c trunk/getdata/src/sie.c trunk/getdata/test/Makefile.am trunk/getdata/test/gzip_move_to.c trunk/getdata/test/gzip_put.c Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/ChangeLog 2011-11-13 21:11:09 UTC (rev 626) @@ -1,3 +1,16 @@ +2011-11-13 D. V. Wiebe <ge...@ke...> svn:626 + * src/entry.c (gd_raw_filename): Revert r613 changes. + * src/gzip.c: Move OOP code out of gzip layer. + * src/encoding.c (_GD_FiniRawIO _GD_InitRawIO) src/fpos.c (_GD_WriteSeek): + Handle OOP writes. + * src/encoding.c (_GD_WriteOut): Added. + * src/mod.c (_GD_Change) src/putdata.c (_GD_DoRawOut): Call _GD_WriteSeek and + _GD_WriteOut + + * src/putdata.c (_GD_DoRawOut): Correctly handle write errors. + + * configure.ac: Fix x86_64 host check. + 2011-11-10 D. V. Wiebe <ge...@ke...> svn:622 * configure.ac: Figure out whether unaligned memory access will work. * src/internal.h: Deal with UNALIGNED_ACCESS_OK Modified: trunk/getdata/configure.ac =================================================================== --- trunk/getdata/configure.ac 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/configure.ac 2011-11-13 21:11:09 UTC (rev 626) @@ -59,8 +59,8 @@ echo dnl Build/Host triplets +AC_CANONICAL_BUILD AC_CANONICAL_HOST -AC_CANONICAL_BUILD dnl Legacy API AC_ARG_ENABLE(legacy-api, AS_HELP_STRING([--disable-legacy-api], @@ -314,7 +314,7 @@ AC_MSG_CHECKING([whether ${host} supports fast unaligned memory access]) case "${host}" in - i?86-*-*|powerpc-*-*|x86-64) gd_unaligned_ok=yes; + i?86-*-*|powerpc-*-*|x86_64-*-*) gd_unaligned_ok=yes; AC_DEFINE([UNALIGNED_ACCESS_OK], [1], [Define to 1 if the platform supports fast unaligned memory access]) ;; Modified: trunk/getdata/src/ascii.c =================================================================== --- trunk/getdata/src/ascii.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/ascii.c 2011-11-13 21:11:09 UTC (rev 626) @@ -33,10 +33,10 @@ /* The ASCII encoding uses file->edata for the stream pointer */ -int _GD_AsciiOpen(int fd, int fd2 __gd_unused, struct _gd_raw_file* file, - int swap __gd_unused, unsigned int mode) +int _GD_AsciiOpen(int fd, struct _gd_raw_file* file, int swap __gd_unused, + unsigned int mode) { - dtrace("%i, <unused>, %p, <unused>, %u", fd, file, mode); + dtrace("%i, %p, <unused>, %u", fd, file, mode); if (!(mode & GD_FILE_TEMP)) { if (file->mode & mode) { Modified: trunk/getdata/src/bzip.c =================================================================== --- trunk/getdata/src/bzip.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/bzip.c 2011-11-13 21:11:09 UTC (rev 626) @@ -101,10 +101,10 @@ return ptr; } -int _GD_Bzip2Open(int dirfd, int fd2 __gd_unused, struct _gd_raw_file* file, - int swap __gd_unused, unsigned int mode __gd_unused) +int _GD_Bzip2Open(int dirfd, struct _gd_raw_file* file, int swap __gd_unused, + unsigned int mode __gd_unused) { - dtrace("%i, <unused>, %p, <unused>, <unused>", dirfd, file); + dtrace("%i, %p, <unused>, <unused>", dirfd, file); file->edata = _GD_Bzip2DoOpen(dirfd, file); Modified: trunk/getdata/src/encoding.c =================================================================== --- trunk/getdata/src/encoding.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/encoding.c 2011-11-13 21:11:09 UTC (rev 626) @@ -321,14 +321,38 @@ { const int clotemp = (flags & GD_FINIRAW_CLOTEMP) ? 1 : 0; const int old_mode = E->e->u.raw.file[0].mode; + const int oop_write = ((_gd_ef[E->e->u.raw.file[0].subenc].flags & GD_EF_OOP) + && (old_mode & GD_FILE_WRITE)) ? 1 : 0; dtrace("%p, %p, %i, 0x%X", D, E, fragment, flags); if ((E->e->u.raw.file[clotemp].idata >= 0) || - (clotemp == 0 && (_gd_ef[E->e->u.raw.file[0].subenc].flags & GD_EF_OOP) && - (E->e->u.raw.file[1].idata >= 0))) + (clotemp == 0 && oop_write && (E->e->u.raw.file[1].idata >= 0))) { + /* close the secondary file in write mode (but not temp mode) */ + if (oop_write && E->e->u.raw.file[1].idata >= 0) { + if (E->e->u.raw.file[0].idata >= 0) { + /* copy the rest of the input to the output */ + char buffer[GD_BUFFER_SIZE]; + int n_read, n_wrote; + + do { + n_read = (*_gd_ef[E->e->u.raw.file[0].subenc].read)(E->e->u.raw.file, + buffer, E->EN(raw,data_type), GD_BUFFER_SIZE); + if (n_read > 0) + n_wrote = (*_gd_ef[E->e->u.raw.file[0].subenc].write)( + E->e->u.raw.file + 1, buffer, E->EN(raw,data_type), n_read); + } while (n_read == GD_BUFFER_SIZE); + } + + if ((*_gd_ef[E->e->u.raw.file[0].subenc].close)(E->e->u.raw.file + 1)) { + dreturn("%i", -1); + return -1; + } + } + /* close the file */ - if ((*_gd_ef[E->e->u.raw.file[clotemp].subenc].close)(E->e->u.raw.file + + if ((E->e->u.raw.file[clotemp].idata >= 0) && + (*_gd_ef[E->e->u.raw.file[clotemp].subenc].close)(E->e->u.raw.file + clotemp)) { if (D->error == GD_E_OK) @@ -345,16 +369,15 @@ } /* take care of moving things into place */ - if ((old_mode == GD_FILE_WRITE && (_gd_ef[E->e->u.raw.file[0].subenc].flags - & GD_EF_OOP)) || flags & GD_FINIRAW_CLOTEMP) - { + if (oop_write || clotemp) { if (flags & GD_FINIRAW_DISCARD) { /* Throw away the temporary file */ if (gd_UnlinkAt(D, D->fragment[fragment].dirfd, E->e->u.raw.file[1].name, 0)) { if (D->error == GD_E_OK) - _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, NULL); + _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, + NULL); dreturn("%i", -1); return -1; } @@ -374,15 +397,47 @@ return 0; } +/* Perform a RAW field write */ +ssize_t _GD_WriteOut(DIRFILE *D, gd_entry_t *E, const struct encoding_t *enc, + const void *ptr, gd_type_t type, size_t n, int temp) +{ + ssize_t n_wrote; + + dtrace("%p, %p, %p, %p, 0x%X, %zu, %i", D, E, enc, ptr, type, n, temp); + + if (temp) + n_wrote = (*enc->write)(E->e->u.raw.file + 1, ptr, type, n); + else { + if (enc->flags & GD_EF_OOP) { + n_wrote = (*enc->write)(E->e->u.raw.file + 1, ptr, type, n); + + if (n_wrote > 0 && E->e->u.raw.file[0].idata >= 0) { + /* advance the read pointer by the appropriate amount */ + if ((*enc->seek)(E->e->u.raw.file, E->e->u.raw.file[0].pos + n_wrote, + E->EN(raw,data_type), GD_FILE_READ) < 0) + { + n_wrote = -1; + } + } + } else + n_wrote = (*enc->write)(E->e->u.raw.file, ptr, type, n); + } + + dreturn("%zi", n_wrote); + return n_wrote; +} + /* Open a raw file, if necessary; also check for required functions */ int _GD_InitRawIO(DIRFILE *D, gd_entry_t *E, const char *filebase, - int fragment, const struct encoding_t *new_enc, unsigned int funcs, + int fragment, const struct encoding_t *enc, unsigned int funcs, unsigned int mode, int swap) { int temp_fd = -1; const int touch = mode & GD_FILE_TOUCH; + int oop_write = 0; + dtrace("%p, %p, \"%s\", %i, %p, 0x%X, 0x%X, %i", D, E, filebase, fragment, - new_enc, funcs, mode, swap); + enc, funcs, mode, swap); if (mode & (GD_FILE_WRITE | GD_FILE_TOUCH)) funcs |= GD_EF_WRITE; @@ -394,18 +449,33 @@ dreturn("%i", 1); return 1; } - } - /* close the file, if necessary */ - if ((E->e->u.raw.file[0].idata >= 0 || - ((_gd_ef[E->e->u.raw.file[0].subenc].flags & GD_EF_OOP) && - (E->e->u.raw.file[1].idata >= 0))) && !(mode & GD_FILE_TEMP) && - (E->e->u.raw.file[0].mode & GD_FILE_RDWR) != (mode & GD_FILE_RDWR)) - { - if (_GD_FiniRawIO(D, E, E->fragment_index, GD_FINIRAW_KEEP)) { - dreturn("%i", 1); - return 1; + enc = _gd_ef + E->e->u.raw.file[0].subenc; + oop_write = ((enc->flags & GD_EF_OOP) && mode == GD_FILE_WRITE) ? 1 : 0; + + /* Do nothing, if possible */ + if (!touch && (((mode & GD_FILE_READ) && (E->e->u.raw.file[0].idata >= 0) + && (E->e->u.raw.file[0].mode & GD_FILE_READ)) + || ((mode & GD_FILE_WRITE) && (E->e->u.raw.file[oop_write].idata >= 0) + && (E->e->u.raw.file[0].mode & GD_FILE_WRITE)))) + { + dreturn("%i", 0); + return 0; } + + /* close the file, if necessary */ + if ((E->e->u.raw.file[0].idata >= 0 || ((enc->flags & GD_EF_OOP) + && (E->e->u.raw.file[1].idata >= 0))) + && ((mode == GD_FILE_READ && (enc->flags & GD_EF_OOP) + && (E->e->u.raw.file[0].mode & GD_FILE_WRITE)) + || (mode == GD_FILE_WRITE + && !(E->e->u.raw.file[0].mode & GD_FILE_WRITE)))) + { + if (_GD_FiniRawIO(D, E, E->fragment_index, GD_FINIRAW_KEEP)) { + dreturn("%i", 1); + return 1; + } + } } if (filebase == NULL) @@ -423,7 +493,7 @@ E->e->u.raw.file[1].name)) < 0) { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, NULL); - } else if ((*new_enc->open)(temp_fd, -1, E->e->u.raw.file + 1, swap, + } else if ((*enc->open)(temp_fd, E->e->u.raw.file + 1, swap, GD_FILE_WRITE | GD_FILE_TEMP)) { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, NULL); @@ -433,39 +503,50 @@ dreturn("%i", 1); return 1; } - } else if (E->e->u.raw.file[0].idata < 0) { - /* open a regular file, if necessary */ - if ((_gd_ef[E->e->u.raw.file[0].subenc].flags & GD_EF_OOP) && - mode == GD_FILE_WRITE) - { - /* an out-of-place write requires us to open a temporary file and pass - * in its fd */ - if (_GD_SetEncodedName(D, E->e->u.raw.file + 1, filebase, 1)) - { - dreturn("%i", 1); - return 1; - } else if ((temp_fd = _GD_MakeTempFile(D, - D->fragment[E->fragment_index].dirfd, E->e->u.raw.file[1].name)) - < 0) - { - dreturn("%i", 1); - return 1; - } - } + dreturn("%i", 0); + return 0; + } - if (_GD_SetEncodedName(D, E->e->u.raw.file, filebase, 0)) { + if (oop_write) { + /* an out-of-place write requires us to open a temporary file and pass + * in its fd */ + if (_GD_SetEncodedName(D, E->e->u.raw.file + 1, filebase, 1)) { dreturn("%i", 1); return 1; - } else if ((*_gd_ef[E->e->u.raw.file[0].subenc].open)( - D->fragment[E->fragment_index].dirfd, temp_fd, E->e->u.raw.file, - _GD_FileSwapBytes(D, E->fragment_index), mode)) + } else if ((temp_fd = _GD_MakeTempFile(D, + D->fragment[E->fragment_index].dirfd, E->e->u.raw.file[1].name)) + < 0) { + dreturn("%i", 1); + return 1; + } else if ((*enc->open)(temp_fd, E->e->u.raw.file + 1, _GD_FileSwapBytes(D, + E->fragment_index), GD_FILE_WRITE)) { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[0].name, errno, NULL); dreturn("%i", 1); return 1; } + /* The read file in OOP mode is flagged as RW. */ + mode = GD_FILE_RDWR; } + /* open a regular file, if necessary */ + if (E->e->u.raw.file[0].idata < 0) { + if (_GD_SetEncodedName(D, E->e->u.raw.file, filebase, 0)) { + dreturn("%i", 1); + return 1; + } else if ((*enc->open)(D->fragment[E->fragment_index].dirfd, + E->e->u.raw.file, _GD_FileSwapBytes(D, E->fragment_index), mode)) + { + /* In oop_write mode, it doesn't matter if the old file doesn't exist */ + if (!oop_write || errno != ENOENT) { + _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[0].name, errno, NULL); + dreturn("%i", 1); + return 1; + } + E->e->u.raw.file[0].mode = mode; + } + } + if (touch) _GD_FiniRawIO(D, E, E->fragment_index, GD_FINIRAW_KEEP); Modified: trunk/getdata/src/entry.c =================================================================== --- trunk/getdata/src/entry.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/entry.c 2011-11-13 21:11:09 UTC (rev 626) @@ -318,13 +318,13 @@ } } - filename = malloc(strlen(D->name) + strlen(E->e->u.raw.file->name) + 2); + filename = _GD_MakeFullPath(D, D->fragment[E->fragment_index].dirfd, + E->e->u.raw.file->name); if (filename == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } - sprintf(filename, "%s/%s", D->name, E->e->u.raw.file->name); dreturn("%p", filename); return filename; Modified: trunk/getdata/src/fpos.c =================================================================== --- trunk/getdata/src/fpos.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/fpos.c 2011-11-13 21:11:09 UTC (rev 626) @@ -155,17 +155,18 @@ return (off_t)gd_tell64(D, field_code); } -off64_t _GD_WriteSeek(DIRFILE *D, gd_entry_t *E, off64_t offset, - unsigned int mode) +off64_t _GD_WriteSeek(DIRFILE *D, gd_entry_t *E, const struct encoding_t *enc, + off64_t offset, unsigned int mode) { - off64_t pos; + off64_t pos = 0; + const int which = (mode & GD_FILE_TEMP) ? 1 : 0; + const int oop_write = ((enc->flags & GD_EF_OOP) && (mode & GD_FILE_WRITE)) + ? 1 : 0; - dtrace("%p, %p, %lli, 0x%X", D, E, (long long)offset, mode); + dtrace("%p, %p, %p, %lli, 0x%X", D, E, enc, (long long)offset, mode); /* in this case we need to close and then re-open the file */ - if ((offset < E->e->u.raw.file[0].pos) && mode == GD_FILE_WRITE && - (_gd_ef[E->e->u.raw.file[0].subenc].flags & GD_EF_OOP)) - { + if ((offset < E->e->u.raw.file[which].pos) && oop_write) { if (_GD_FiniRawIO(D, E, E->fragment_index, GD_FINIRAW_KEEP)) { dreturn("%i", -1); return -1; @@ -176,9 +177,52 @@ } } - pos = (*_gd_ef[E->e->u.raw.file[0].subenc].seek)(E->e->u.raw.file, offset, - E->EN(raw,data_type), mode); + if (oop_write && E->e->u.raw.file[0].idata >= 0) { + /* read from the old file until we reach the point we're interested in or + * run out of data */ + char buffer[GD_BUFFER_SIZE]; + ssize_t n_read, n_wrote; + while (offset * GD_SIZE(E->EN(raw,data_type)) > GD_BUFFER_SIZE) { + n_read = (*enc->read)(E->e->u.raw.file, buffer, E->EN(raw,data_type), + GD_BUFFER_SIZE); + if (n_read > 0) { + n_wrote = (*enc->write)(E->e->u.raw.file + 1, buffer, + E->EN(raw,data_type), n_read); + if (n_wrote != n_read) { + dreturn("%i", -1); + return -1; + } + offset -= n_wrote; + pos += n_wrote; + } else if (n_read < 0) { + dreturn("%i", -1); + return -1; + } + } + + if (offset > 0) { + n_read = (*enc->read)(E->e->u.raw.file, buffer, E->EN(raw,data_type), + offset); + if (n_read > 0) { + n_wrote = (*enc->write)(E->e->u.raw.file + 1, buffer, + E->EN(raw,data_type), n_read); + if (n_wrote != n_read) { + dreturn("%i", -1); + return -1; + } + offset -= n_wrote; + pos += n_wrote; + } else if (n_read < 0) { + dreturn("%i", -1); + return -1; + } + } + } + + pos += (*enc->seek)(E->e->u.raw.file + which, offset, E->EN(raw,data_type), + mode); + dreturn("%lli", (long long)pos); return pos; } @@ -213,8 +257,9 @@ break; } - if (_GD_WriteSeek(D, E, offset - E->EN(raw,spf) * - D->fragment[E->fragment_index].frame_offset, mode) == -1) + if (_GD_WriteSeek(D, E, _gd_ef + E->e->u.raw.file[0].subenc, offset - + E->EN(raw,spf) * D->fragment[E->fragment_index].frame_offset, mode) + == -1) { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[0].name, errno, NULL); } Modified: trunk/getdata/src/gzip.c =================================================================== --- trunk/getdata/src/gzip.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/gzip.c 2011-11-13 21:11:09 UTC (rev 626) @@ -43,76 +43,33 @@ #define _GD_GzipSize libgetdatagzip_LTX_GD_GzipSize #endif -#if SIZEOF_INT < 4 -#define GD_GZIP_BUFFER_SIZE 32767 -#else -#define GD_GZIP_BUFFER_SIZE 1000000 -#endif - /* The gzip encoding scheme uses edata as a gzFile object. If a file is * open, idata >= 0 otherwise idata = -1. Writes occur out-of-place. */ -int _GD_GzipOpen(int fd, int fd2, struct _gd_raw_file* file, - int swap __gd_unused, unsigned int mode) +int _GD_GzipOpen(int fd, struct _gd_raw_file* file, int swap __gd_unused, + unsigned int mode) { - dtrace("%i, %i, %p, <unused>, %u", fd, fd2, file, mode); + const char *gzmode = "w"; + dtrace("%i, %p, <unused>, %u", fd, file, mode); - if (!(mode & GD_FILE_TEMP)) { - if (file->idata > 0 && file->mode != mode) { - /* need to re-open */ - _GD_GzipClose(file); - } else if (file->idata > 0 && file->mode == mode) { - dreturn("%i", 0); - return 0; - } + if (mode & GD_FILE_READ) { + file->idata = gd_OpenAt(file->D, fd, file->name, O_RDONLY | O_BINARY, 0666); - file[0].idata = gd_OpenAt(file->D, fd, file->name, O_RDONLY | O_BINARY, - 0666); - - if (file[0].idata == -1) { - /* if we're in write mode, but the old file doesn't exist, it's not a - * problem */ - if (mode != GD_FILE_WRITE || errno != ENOENT) { - dreturn("%i", 1); - return 1; - } - file[0].edata = NULL; - } else { - /* regardless of mode, in the non-temp situation, file[0] is always - * opened read-only - */ - file[0].edata = gzdopen(file[0].idata, "r"); - - if (file[0].edata == NULL) { - close(file[0].idata); - file[0].idata = -1; - dreturn("%i", 1); - return 1; - } - } - - /* also open the out-of-place file in write mode */ - if (mode == GD_FILE_WRITE) { - file[1].edata = gzdopen(file[1].idata = fd2, "w"); - if (file[1].edata == NULL) { - close(file[1].idata); - if (file[0].idata >= 0) - close(file[0].idata); - file[1].idata = file[0].idata = -1; - dreturn("%i", 1); - return 1; - } - } - } else { - /* temporary files are always write only */ - file->edata = gzdopen(file->idata = fd, "w"); - - if (file->edata == NULL) { - close(file->idata); - file->idata = -1; + if (file->idata == -1) { dreturn("%i", 1); return 1; } + gzmode = "r"; + } else + file->idata = fd; + + file->edata = gzdopen(file->idata, gzmode); + + if (file->edata == NULL) { + close(file->idata); + file->idata = -1; + dreturn("%i", 1); + return 1; } file->mode = mode; @@ -135,37 +92,6 @@ count *= GD_SIZE(data_type); - if (mode == GD_FILE_WRITE && file[0].edata != NULL) { - /* read from the old file until we reach the point we're interested in or - * run out of data */ - char buffer[GD_GZIP_BUFFER_SIZE]; - int n_read, n_wrote; - - while (count > GD_GZIP_BUFFER_SIZE) { - n_read = gzread(file[0].edata, buffer, GD_GZIP_BUFFER_SIZE); - if (n_read >= 0) { - n_wrote = gzwrite(file[1].edata, buffer, n_read); - count -= n_wrote; - n += n_wrote; - } else { - dreturn("%i", -1); - return -1; - } - } - - if (count > 0) { - n_read = gzread(file[0].edata, buffer, count); - if (n_read >= 0) { - n_wrote = gzwrite(file[1].edata, buffer, n_read); - count -= n_wrote; - n += n_wrote; - } else { - dreturn("%i", -1); - return -1; - } - } - } - if (count > 0) { n = (off64_t)gzseek(file[(mode == GD_FILE_WRITE) ? 1 : 0].edata, (off_t)count, SEEK_SET); @@ -214,20 +140,8 @@ dtrace("%p, %p, 0x%X, %zu", file, ptr, data_type, nmemb); - if (file->mode & GD_FILE_TEMP) { - n = gzwrite(file[0].edata, ptr, GD_SIZE(data_type) * nmemb); - } else { - n = gzwrite(file[1].edata, ptr, GD_SIZE(data_type) * nmemb); + n = gzwrite(file->edata, ptr, GD_SIZE(data_type) * nmemb); - if (n > 0 && file[0].idata >= 0) { - /* advance the read pointer by the appropriate amount */ - if (gzseek(file[0].edata, (off_t)n, SEEK_CUR) < 0) { - gzerror(file[0].edata, &errnum); - if (errnum < 0) - n = -1; - } - } - } if (n >= 0) { n /= GD_SIZE(data_type); file->pos += n; @@ -237,7 +151,7 @@ n = -1; } - dreturn("%zu", n); + dreturn("%zi", n); return n; } @@ -257,37 +171,12 @@ dtrace("%p", file); - /* close the secondary file in write mode (but not temp mode) */ - if (file->mode == GD_FILE_WRITE) { - if (file[0].idata >= 0) { - /* copy the rest of the input to the output */ - char buffer[GD_GZIP_BUFFER_SIZE]; - int n_read, n_wrote; - - do { - n_read = gzread(file[0].edata, buffer, GD_GZIP_BUFFER_SIZE); - if (n_read > 0) - n_wrote = gzwrite(file[1].edata, buffer, n_read); - } while (n_read == GD_GZIP_BUFFER_SIZE); - } - - ret = gzclose(file[1].edata); - dwatch("%i", ret); - if (ret) { - dreturn("%i", ret); - return ret; - } - file[1].idata = -1; + ret = gzclose(file->edata); + if (ret) { + dreturn("%i", ret); + return ret; } - if (file[0].idata >= 0) { - ret = gzclose(file->edata); - if (ret) { - dreturn("%i", ret); - return ret; - } - } - file->idata = -1; file->edata = NULL; file->mode = 0; Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/internal.h 2011-11-13 21:11:09 UTC (rev 626) @@ -117,6 +117,12 @@ #endif #endif +#if SIZEOF_INT < 4 +#define GD_BUFFER_SIZE 32767 +#else +#define GD_BUFFER_SIZE 1000000 +#endif + #ifdef _MSC_VER # define _gd_static_inline static #else @@ -675,7 +681,7 @@ # define SCREWY_FLOATS #endif -typedef int (*gd_ef_open_t)(int, int, struct _gd_raw_file*, int, unsigned int); +typedef int (*gd_ef_open_t)(int, struct _gd_raw_file*, int, unsigned int); typedef off64_t (*gd_ef_seek_t)(struct _gd_raw_file*, off64_t, gd_type_t, unsigned int); typedef off64_t (*gd_ef_size_t)(int, struct _gd_raw_file*, gd_type_t, int); @@ -903,15 +909,17 @@ int standards, int pedantic); char* _GD_ValidateField(const gd_entry_t* parent, const char* field_code, int standards, int pedantic, int* is_dot); -off64_t _GD_WriteSeek(DIRFILE *D, gd_entry_t *E, off64_t offset, +off64_t _GD_WriteSeek(DIRFILE*, gd_entry_t*, const struct encoding_t*, off64_t, unsigned int mode); +ssize_t _GD_WriteOut(DIRFILE *D, gd_entry_t *E, const struct encoding_t *enc, + const void *buf, gd_type_t type, size_t n, int temp); /* generic I/O methods */ int _GD_GenericMove(int, struct _gd_raw_file* file, int, char* new_path); int _GD_GenericUnlink(int, struct _gd_raw_file* file); /* unencoded I/O methods */ -int _GD_RawOpen(int, int, struct _gd_raw_file* file, int swap, unsigned int); +int _GD_RawOpen(int, struct _gd_raw_file* file, int swap, unsigned int); off64_t _GD_RawSeek(struct _gd_raw_file* file, off64_t count, gd_type_t data_type, unsigned int); ssize_t _GD_RawRead(struct _gd_raw_file* file, void *ptr, gd_type_t data_type, @@ -924,7 +932,7 @@ int swap); /* text I/O methods */ -int _GD_AsciiOpen(int, int, struct _gd_raw_file* file, int swap, unsigned int); +int _GD_AsciiOpen(int, struct _gd_raw_file* file, int swap, unsigned int); off64_t _GD_AsciiSeek(struct _gd_raw_file* file, off64_t count, gd_type_t data_type, unsigned int); ssize_t _GD_AsciiRead(struct _gd_raw_file* file, void *ptr, gd_type_t data_type, @@ -938,7 +946,7 @@ int swap); /* bzip I/O methods */ -int _GD_Bzip2Open(int, int, struct _gd_raw_file* file, int swap, unsigned int); +int _GD_Bzip2Open(int, struct _gd_raw_file* file, int swap, unsigned int); off64_t _GD_Bzip2Seek(struct _gd_raw_file* file, off64_t count, gd_type_t data_type, unsigned int); ssize_t _GD_Bzip2Read(struct _gd_raw_file* file, void *ptr, gd_type_t data_type, @@ -948,7 +956,7 @@ int swap); /* gzip I/O methods */ -int _GD_GzipOpen(int, int, struct _gd_raw_file* file, int swap, unsigned int); +int _GD_GzipOpen(int, struct _gd_raw_file* file, int swap, unsigned int); off64_t _GD_GzipSeek(struct _gd_raw_file* file, off64_t count, gd_type_t data_type, unsigned int); ssize_t _GD_GzipRead(struct _gd_raw_file* file, void *ptr, gd_type_t data_type, @@ -961,7 +969,7 @@ int swap); /* lzma I/O methods */ -int _GD_LzmaOpen(int, int, struct _gd_raw_file* file, int swap, unsigned int); +int _GD_LzmaOpen(int, struct _gd_raw_file* file, int swap, unsigned int); off64_t _GD_LzmaSeek(struct _gd_raw_file* file, off64_t count, gd_type_t data_type, unsigned int); ssize_t _GD_LzmaRead(struct _gd_raw_file* file, void *ptr, gd_type_t data_type, @@ -971,7 +979,7 @@ int swap); /* slim I/O methods */ -int _GD_SlimOpen(int, int, struct _gd_raw_file* file, int, unsigned int); +int _GD_SlimOpen(int, struct _gd_raw_file* file, int, unsigned int); off64_t _GD_SlimSeek(struct _gd_raw_file* file, off64_t count, gd_type_t data_type, unsigned int); ssize_t _GD_SlimRead(struct _gd_raw_file* file, void *ptr, gd_type_t data_type, @@ -981,7 +989,7 @@ int swap); /* SIE I/O methods */ -int _GD_SampIndOpen(int, int, struct _gd_raw_file* file, int swap, +int _GD_SampIndOpen(int, struct _gd_raw_file* file, int swap, unsigned int); off64_t _GD_SampIndSeek(struct _gd_raw_file* file, off64_t count, gd_type_t data_type, unsigned int); Modified: trunk/getdata/src/meta_list.c =================================================================== --- trunk/getdata/src/meta_list.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/meta_list.c 2011-11-13 21:11:09 UTC (rev 626) @@ -124,7 +124,6 @@ free(e->carray_value_list); fl = (gd_carray_t *)malloc(sizeof(gd_carray_t) * (e->n_meta_carray + 1)); - dwatch("%i", e->n_meta_carray); if (fl == NULL) { dreturn("%p", NULL); Modified: trunk/getdata/src/mod.c =================================================================== --- trunk/getdata/src/mod.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/mod.c 2011-11-13 21:11:09 UTC (rev 626) @@ -306,11 +306,9 @@ if (_GD_InitRawIO(D, E, NULL, -1, enc, 0, GD_FILE_WRITE | GD_FILE_TEMP, _GD_FileSwapBytes(D, E->fragment_index))) break; - else if ((*enc->seek)(E->e->u.raw.file + 1, 0, E->EN(raw,data_type), - GD_FILE_WRITE) == -1) + else if (_GD_WriteSeek(D, E, enc, 0, GD_FILE_WRITE | GD_FILE_TEMP) + == -1) { - _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, - NULL); _GD_FiniRawIO(D, E, E->fragment_index, GD_FINIRAW_DISCARD | GD_FINIRAW_CLOTEMP); break; @@ -355,8 +353,8 @@ buffer2 = ptr; } - nwrote = (*enc->write)(E->e->u.raw.file + 1, buffer1, - Q.EN(raw,data_type), ns_out); + nwrote = _GD_WriteOut(D, E, enc, buffer1, Q.EN(raw,data_type), ns_out, + 1); if (nwrote < ns_out) { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, Modified: trunk/getdata/src/move.c =================================================================== --- trunk/getdata/src/move.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/move.c 2011-11-13 21:11:09 UTC (rev 626) @@ -170,21 +170,16 @@ GD_FILE_WRITE) == -1) { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[0].name, errno, NULL); - } else if ((*enc_out->seek)(E->e->u.raw.file + 1, -offset * E->EN(raw,spf), - E->EN(raw,data_type), GD_FILE_WRITE) == -1) - { - _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, NULL); - } + } else + _GD_WriteSeek(D, E, enc_out, -offset * E->EN(raw,spf), GD_FILE_WRITE + | GD_FILE_TEMP); } else { /* new offset is more, truncate old file */ if ((*enc_in->seek)(E->e->u.raw.file, offset * E->EN(raw,spf), E->EN(raw,data_type), GD_FILE_READ) == -1) { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[0].name, errno, NULL); - } else if ((*enc_out->seek)(E->e->u.raw.file + 1, 0, E->EN(raw,data_type), - GD_FILE_WRITE) == -1) - { - _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, NULL); - } + } else + _GD_WriteSeek(D, E, enc_out, 0, GD_FILE_WRITE | GD_FILE_TEMP); } if (D->error) { @@ -226,8 +221,8 @@ _GD_FixEndianness((char *)buffer, E->e->u.raw.size, nread); } - nwrote = (*enc_out->write)(E->e->u.raw.file + 1, buffer, - E->EN(raw,data_type), nread); + nwrote = _GD_WriteOut(D, E, enc_out, buffer, E->EN(raw,data_type), nread, + 1); if (nwrote < nread) { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, NULL); Modified: trunk/getdata/src/putdata.c =================================================================== --- trunk/getdata/src/putdata.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/putdata.c 2011-11-13 21:11:09 UTC (rev 626) @@ -33,7 +33,7 @@ static size_t _GD_DoRawOut(DIRFILE *D, gd_entry_t *E, off64_t s0, size_t ns, gd_type_t data_type, const void *data_in) { - size_t n_wrote; + ssize_t n_wrote; void *databuffer; /* check protection */ @@ -106,20 +106,27 @@ return 0; } - if (_GD_WriteSeek(D, E, s0, GD_FILE_WRITE) == -1) { + if (_GD_WriteSeek(D, E, _gd_ef + E->e->u.raw.file[0].subenc, s0, + GD_FILE_WRITE) == -1) + { _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[0].name, errno, NULL); free(databuffer); dreturn("%i", 0); return 0; } - n_wrote = (*_gd_ef[E->e->u.raw.file[0].subenc].write)(E->e->u.raw.file, - databuffer, E->EN(raw,data_type), ns); + n_wrote = _GD_WriteOut(D, E, _gd_ef + E->e->u.raw.file[0].subenc, databuffer, + E->EN(raw,data_type), ns, 0); + if (n_wrote < 0) { + _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[0].name, errno, NULL); + n_wrote = 0; + } + free(databuffer); - dreturn("%zu", n_wrote); - return n_wrote; + dreturn("%zi", n_wrote); + return (size_t)n_wrote; } static size_t _GD_DoLinterpOut(DIRFILE* D, gd_entry_t *E, off64_t first_samp, Modified: trunk/getdata/src/raw.c =================================================================== --- trunk/getdata/src/raw.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/raw.c 2011-11-13 21:11:09 UTC (rev 626) @@ -28,10 +28,10 @@ #include <errno.h> #endif -int _GD_RawOpen(int fd, int fd2 __gd_unused, struct _gd_raw_file* file, - int swap __gd_unused, unsigned int mode) +int _GD_RawOpen(int fd, struct _gd_raw_file* file, int swap __gd_unused, + unsigned int mode) { - dtrace("%i, <unused>, %p, <unused>, 0x%X", fd, file, mode); + dtrace("%i, %p, <unused>, 0x%X", fd, file, mode); if (!(mode & GD_FILE_TEMP)) { if (file->mode & mode) { Modified: trunk/getdata/src/sie.c =================================================================== --- trunk/getdata/src/sie.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/src/sie.c 2011-11-13 21:11:09 UTC (rev 626) @@ -75,10 +75,10 @@ return fd; } -int _GD_SampIndOpen(int fd, int fd2 __gd_unused, struct _gd_raw_file *file, - int swap, unsigned int mode) +int _GD_SampIndOpen(int fd, struct _gd_raw_file *file, int swap, + unsigned int mode) { - dtrace("%i, <unused>, %p, %i, 0x%X", fd, file, swap, mode); + dtrace("%i, %p, %i, 0x%X", fd, file, swap, mode); if (file->mode & mode) { dreturn("%i", 0); Modified: trunk/getdata/test/Makefile.am =================================================================== --- trunk/getdata/test/Makefile.am 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/test/Makefile.am 2011-11-13 21:11:09 UTC (rev 626) @@ -359,4 +359,4 @@ clean-local: $(MAKE) getdata-clean-dir - rm -rf *~ + rm -rf *~ Modified: trunk/getdata/test/gzip_move_to.c =================================================================== --- trunk/getdata/test/gzip_move_to.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/test/gzip_move_to.c 2011-11-13 21:11:09 UTC (rev 626) @@ -40,7 +40,7 @@ char command[4096]; int i; #endif - int fd, error, unlink_raw, unlink_gz, r = 0; + int fd, error, unlink_raw, r = 0; struct stat buf; rmdirfile(); @@ -65,7 +65,7 @@ gd_alter_encoding(D, GD_GZIP_ENCODED, 0, 1); error = gd_error(D); - gd_close(D); + gd_discard(D); #ifdef USE_GZIP if (stat(data_gz, &buf)) { @@ -101,17 +101,13 @@ #endif unlink_raw = unlink(data_raw); - unlink_gz = unlink(data_gz); unlink(format); rmdir(filedir); + CHECKI(unlink_raw, 0); #ifdef USE_GZIP - CHECKI(unlink_raw, -1); - CHECKI(unlink_gz, 0); CHECKI(error, GD_E_OK); #else - CHECKI(unlink_raw, 0); - CHECKI(unlink_gz, -1); CHECKI(error, GD_E_UNSUPPORTED); #endif Modified: trunk/getdata/test/gzip_put.c =================================================================== --- trunk/getdata/test/gzip_put.c 2011-11-11 02:42:05 UTC (rev 625) +++ trunk/getdata/test/gzip_put.c 2011-11-13 21:11:09 UTC (rev 626) @@ -49,7 +49,7 @@ uint8_t d; #endif struct stat buf; - int fd, i, n, error, stat_data, unlink_data, unlink_datagz, r = 0; + int fd, i, n, error, stat_data, unlink_data, r = 0; DIRFILE *D; memset(c, 0, 8); @@ -71,7 +71,7 @@ n = gd_putdata(D, "data", 5, 0, 1, 0, GD_UINT8, c); error = gd_error(D); - gd_close(D); + gd_discard(D); stat_data = stat(data_gz, &buf); #ifdef USE_GZIP @@ -105,18 +105,15 @@ } #endif - unlink_datagz = unlink(data_gz); unlink_data = unlink(data); unlink(format); rmdir(filedir); #ifdef USE_GZIP - CHECKI(unlink_datagz, 0); - CHECKI(unlink_data, -1); + CHECKI(unlink_data, 0); CHECKI(error, GD_E_OK); CHECKI(n, 8); #else - CHECKI(unlink_datagz, -1); CHECKI(unlink_data, -1); CHECKI(error, GD_E_UNSUPPORTED); CHECKI(n, 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-11 02:42:11
|
Revision: 625 http://getdata.svn.sourceforge.net/getdata/?rev=625&view=rev Author: ketiltrout Date: 2011-11-11 02:42:05 +0000 (Fri, 11 Nov 2011) Log Message: ----------- Typo. Modified Paths: -------------- trunk/getdata/src/internal.h Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-11-11 02:41:21 UTC (rev 624) +++ trunk/getdata/src/internal.h 2011-11-11 02:42:05 UTC (rev 625) @@ -131,7 +131,7 @@ #ifdef HAVE_ASM_UNALIGNED_H #include <asm/unaligned.h> #endif -#if defined HAVE_DECL__GET_UNALIGNED && HAVE_DECL_GET_UNALIGNED == 1 +#if defined HAVE_DECL_GET_UNALIGNED && HAVE_DECL_GET_UNALIGNED == 1 #define gd_get_unaligned64 get_unaligned #else _gd_static_inline int64_t gd_get_unaligned64(const void *p) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-11 02:41:27
|
Revision: 624 http://getdata.svn.sourceforge.net/getdata/?rev=624&view=rev Author: ketiltrout Date: 2011-11-11 02:41:21 +0000 (Fri, 11 Nov 2011) Log Message: ----------- typo Modified Paths: -------------- trunk/getdata/src/internal.h Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-11-10 05:02:10 UTC (rev 623) +++ trunk/getdata/src/internal.h 2011-11-11 02:41:21 UTC (rev 624) @@ -131,8 +131,7 @@ #ifdef HAVE_ASM_UNALIGNED_H #include <asm/unaligned.h> #endif -#if defined HAVE_DECL_HAVE_DECL_GET_UNALIGNED && \ - HAVE_DECL_HAVE_DECL_GET_UNALIGNED == 1 +#if defined HAVE_DECL__GET_UNALIGNED && HAVE_DECL_GET_UNALIGNED == 1 #define gd_get_unaligned64 get_unaligned #else _gd_static_inline int64_t gd_get_unaligned64(const void *p) @@ -142,8 +141,7 @@ return v; } #endif -#if defined HAVE_DECL_HAVE_DECL_PUT_UNALIGNED && \ - HAVE_DECL_HAVE_DECL_PUT_UNALIGNED == 1 +#if defined HAVE_DECL_PUT_UNALIGNED && HAVE_DECL_PUT_UNALIGNED == 1 #define gd_put_unaligned64 put_unaligned #else _gd_static_inline int64_t gd_put_unalinged64(int64_t v, void *p) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-10 05:02:16
|
Revision: 623 http://getdata.svn.sourceforge.net/getdata/?rev=623&view=rev Author: ketiltrout Date: 2011-11-10 05:02:10 +0000 (Thu, 10 Nov 2011) Log Message: ----------- Fix gd_put_unalinged64. Modified Paths: -------------- trunk/getdata/src/internal.h Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-11-10 04:56:10 UTC (rev 622) +++ trunk/getdata/src/internal.h 2011-11-10 05:02:10 UTC (rev 623) @@ -131,7 +131,8 @@ #ifdef HAVE_ASM_UNALIGNED_H #include <asm/unaligned.h> #endif -#ifdef HAVE_DECL_GET_UNALIGNED +#if defined HAVE_DECL_HAVE_DECL_GET_UNALIGNED && \ + HAVE_DECL_HAVE_DECL_GET_UNALIGNED == 1 #define gd_get_unaligned64 get_unaligned #else _gd_static_inline int64_t gd_get_unaligned64(const void *p) @@ -141,12 +142,13 @@ return v; } #endif -#ifdef HAVE_DECL_PUT_UNALIGNED +#if defined HAVE_DECL_HAVE_DECL_PUT_UNALIGNED && \ + HAVE_DECL_HAVE_DECL_PUT_UNALIGNED == 1 #define gd_put_unaligned64 put_unaligned #else _gd_static_inline int64_t gd_put_unalinged64(int64_t v, void *p) { - memcpy(p, v, 8); + memcpy(p, &v, 8); return v; } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-10 04:56:16
|
Revision: 622 http://getdata.svn.sourceforge.net/getdata/?rev=622&view=rev Author: ketiltrout Date: 2011-11-10 04:56:10 +0000 (Thu, 10 Nov 2011) Log Message: ----------- Handle CPUs which don't allow unaligned memory access. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/configure.ac trunk/getdata/src/internal.h trunk/getdata/src/sie.c Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-11-10 04:50:59 UTC (rev 621) +++ trunk/getdata/ChangeLog 2011-11-10 04:56:10 UTC (rev 622) @@ -1,3 +1,8 @@ +2011-11-10 D. V. Wiebe <ge...@ke...> svn:622 + * configure.ac: Figure out whether unaligned memory access will work. + * src/internal.h: Deal with UNALIGNED_ACCESS_OK + * src/sie.c (_GD_SampIndWrite): Handle unaligned memory access. + 2011-11-08 D. V. Wiebe <ge...@ke...> svn:615 * test/add_scalar_carray.c: Added. Modified: trunk/getdata/configure.ac =================================================================== --- trunk/getdata/configure.ac 2011-11-10 04:50:59 UTC (rev 621) +++ trunk/getdata/configure.ac 2011-11-10 04:56:10 UTC (rev 622) @@ -60,6 +60,7 @@ dnl Build/Host triplets AC_CANONICAL_HOST +AC_CANONICAL_BUILD dnl Legacy API AC_ARG_ENABLE(legacy-api, AS_HELP_STRING([--disable-legacy-api], @@ -310,6 +311,17 @@ AC_PROG_SED AC_CHECK_PROGS([DIFF], [diff], []) GD_MSYS_SHELL + +AC_MSG_CHECKING([whether ${host} supports fast unaligned memory access]) +case "${host}" in + i?86-*-*|powerpc-*-*|x86-64) gd_unaligned_ok=yes; + AC_DEFINE([UNALIGNED_ACCESS_OK], [1], + [Define to 1 if the platform supports fast unaligned memory access]) + ;; + *) gd_unaligned_ok=no ;; +esac +AC_MSG_RESULT([$gd_unaligned_ok]) + echo echo "*** Checking C compiler characteristics" echo @@ -523,7 +535,7 @@ echo echo "*** Looking for additional header files" echo -AC_CHECK_HEADERS([byteswap.h direct.h fcntl.h io.h libgen.h \ +AC_CHECK_HEADERS([asm/unaligned.h byteswap.h direct.h fcntl.h io.h libgen.h \ libkern/OSByteOrder.h stdint.h sys/endian.h unistd.h]) if test "x$disable_c99" = "xno"; then AC_CHECK_HEADERS([complex.h]) @@ -709,6 +721,13 @@ #endif ]) +AC_CHECK_DECLS([get_unaligned, put_unaligned],,, + [ +#ifdef HAVE_ASM_UNALIGNED_H +#include <asm/unaligned.h> +#endif +]) + dnl python if test "x$make_pybindings" = "xyes"; then echo Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-11-10 04:50:59 UTC (rev 621) +++ trunk/getdata/src/internal.h 2011-11-10 04:56:10 UTC (rev 622) @@ -117,6 +117,41 @@ #endif #endif +#ifdef _MSC_VER +# define _gd_static_inline static +#else +# define _gd_static_inline static inline +#endif + +/* unaligned access */ +#ifdef UNALIGNED_ACCESS_OK +#define gd_get_unaligned64(p) (*(p)) +#define gd_put_unaligned64(v,p) *(p) = (v) +#else +#ifdef HAVE_ASM_UNALIGNED_H +#include <asm/unaligned.h> +#endif +#ifdef HAVE_DECL_GET_UNALIGNED +#define gd_get_unaligned64 get_unaligned +#else +_gd_static_inline int64_t gd_get_unaligned64(const void *p) +{ + int64_t v; + memcpy(&v, p, 8); + return v; +} +#endif +#ifdef HAVE_DECL_PUT_UNALIGNED +#define gd_put_unaligned64 put_unaligned +#else +_gd_static_inline int64_t gd_put_unalinged64(int64_t v, void *p) +{ + memcpy(p, v, 8); + return v; +} +#endif +#endif + /* For FILE */ #include <stdio.h> @@ -352,6 +387,11 @@ #ifdef HAVE_FSTATAT # define gd_StatAt(d,...) fstatat(__VA_ARGS__) #else +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#else +struct stat; +#endif int gd_StatAt(const DIRFILE*, int, const char*, struct stat*, int); #endif @@ -954,11 +994,6 @@ off64_t _GD_SampIndSize(int, struct _gd_raw_file* file, gd_type_t data_type, int swap); -#ifdef _MSC_VER -# define _gd_static_inline static -#else -# define _gd_static_inline static inline -#endif _gd_static_inline int entry_cmp(const void *a, const void *b) { return strcmp((*(gd_entry_t**)a)->field, (*(gd_entry_t**)b)->field); Modified: trunk/getdata/src/sie.c =================================================================== --- trunk/getdata/src/sie.c 2011-11-10 04:50:59 UTC (rev 621) +++ trunk/getdata/src/sie.c 2011-11-10 04:56:10 UTC (rev 622) @@ -340,13 +340,13 @@ } p = p2; } - *cur_end = f->p + i - 1; + gd_put_unaligned64(f->p + i - 1, cur_end); cur_end = (int64_t*)((char*)p + size * rin); cur_datum = cur_end + 1; memcpy(cur_datum, ((const char*)ptr) + i * dlen, dlen); } } - *cur_end = f->p + nelem - 1; + gd_put_unaligned64(f->p + nelem - 1, cur_end); rin++; /* determine how many records we have to replace */ @@ -356,7 +356,7 @@ rout--; } - while (f->d[0] <= *cur_end) { + while (f->d[0] <= gd_get_unaligned64(cur_end)) { ++rout; r = _GD_Advance(f, sizeof(int64_t) + GD_SIZE(data_type)); @@ -370,9 +370,10 @@ /* fix the endianness */ if (f->swap) - for (i = 0; i < (size_t)rin; ++i) - *((uint64_t*)(((char*)p) + size * i)) = - gd_swap64(*((uint64_t*)(((char*)p) + size * i))); + for (i = 0; i < (size_t)rin; ++i) { + int64_t v = gd_get_unaligned64((int64_t*)(((char*)p) + size * i)); + gd_put_unaligned64(gd_swap64(v), (int64_t*)(((char*)p) + size * i)); + } /* now, do some moving: first, move the trailing records, forward by * (rin - rout) records */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-10 04:51:06
|
Revision: 621 http://getdata.svn.sourceforge.net/getdata/?rev=621&view=rev Author: ketiltrout Date: 2011-11-10 04:50:59 +0000 (Thu, 10 Nov 2011) Log Message: ----------- For the impatient: fastcheck. Modified Paths: -------------- trunk/getdata/test/Makefile.am Modified: trunk/getdata/test/Makefile.am =================================================================== --- trunk/getdata/test/Makefile.am 2011-11-10 01:02:40 UTC (rev 620) +++ trunk/getdata/test/Makefile.am 2011-11-10 04:50:59 UTC (rev 621) @@ -336,6 +336,12 @@ check_PROGRAMS=$(TESTS) +# fast tests +.PHONY: fastcheck +fastcheck: + touch $(TESTS) + ${MAKE} check + # valgrind valgrind.log: $(TESTS) rm -f $@; \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-10 01:02:46
|
Revision: 620 http://getdata.svn.sourceforge.net/getdata/?rev=620&view=rev Author: ketiltrout Date: 2011-11-10 01:02:40 +0000 (Thu, 10 Nov 2011) Log Message: ----------- Restore unlink. Modified Paths: -------------- trunk/getdata/test/endian_alter_sie.c Modified: trunk/getdata/test/endian_alter_sie.c =================================================================== --- trunk/getdata/test/endian_alter_sie.c 2011-11-09 00:19:22 UTC (rev 619) +++ trunk/getdata/test/endian_alter_sie.c 2011-11-10 01:02:40 UTC (rev 620) @@ -80,7 +80,7 @@ r = 1; } -// unlink(data); + unlink(data); unlink(format); rmdir(filedir); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-09 00:19:28
|
Revision: 619 http://getdata.svn.sourceforge.net/getdata/?rev=619&view=rev Author: ketiltrout Date: 2011-11-09 00:19:22 +0000 (Wed, 09 Nov 2011) Log Message: ----------- More minor corrections. Modified Paths: -------------- trunk/html/api.html trunk/html/bindings.html trunk/html/dirfile.html trunk/html/download.html trunk/html/encoding.html trunk/html/getdata.html trunk/html/index.html Modified: trunk/html/api.html =================================================================== --- trunk/html/api.html 2011-11-08 22:02:17 UTC (rev 618) +++ trunk/html/api.html 2011-11-09 00:19:22 UTC (rev 619) @@ -662,7 +662,7 @@ <div class="w3c"> <a href="http://validator.w3.org/check?uri=referer"><img src="valid_html.png" alt="Valid HTML 4.01 Strict" height="21" - width="60"></a><a href="http://jigsaw.w3.org/css-validator/"><img + width="60"></a><a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="valid_css.png" alt="Valid CSS" height="21" width="60"></a> </div> </div> Modified: trunk/html/bindings.html =================================================================== --- trunk/html/bindings.html 2011-11-08 22:02:17 UTC (rev 618) +++ trunk/html/bindings.html 2011-11-09 00:19:22 UTC (rev 619) @@ -351,7 +351,7 @@ <div class="w3c"> <a href="http://validator.w3.org/check?uri=referer"><img src="valid_html.png" alt="Valid HTML 4.01 Strict" height="21" - width="60"></a><a href="http://jigsaw.w3.org/css-validator/"><img + width="60"></a><a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="valid_css.png" alt="Valid CSS" height="21" width="60"></a> </div> </div> Modified: trunk/html/dirfile.html =================================================================== --- trunk/html/dirfile.html 2011-11-08 22:02:17 UTC (rev 618) +++ trunk/html/dirfile.html 2011-11-09 00:19:22 UTC (rev 619) @@ -220,7 +220,7 @@ word</i>, while a field specification line begins with a field name. As a result, no field may have the same name as a reserved word (although, as of Standards Version 8, all reserved words contain a forward slash - character (<b>/</b>), which are prohibited in field names in any case). + character, <b>/</b>, which are prohibited in field names in any case). <p>Since tokens are separated by whitespace, to include a whitespace character in a token, it must either be escaped by preceding it by a backslash character (<span class="syntax"><b>\</b></span>), or replaced by @@ -237,7 +237,7 @@ it (<span class="syntax"><b>\#</b></span>), otherwise the hash mark will be understood as the comment delimiter. <p>It is a syntax error to have a line which contains unmatched quotation - marks, or in which the last character is the backslash character. + marks, or in which the last character is an un-escaped backslash. <p>Several characters when escaped by a preceding backslash character are interpreted as special characters in tokens. Some of these have already been mentioned. The full list of character escape sequences is presented @@ -501,7 +501,7 @@ control characters (bytes 0x00 through 0x1F) and the reserved characters listed in Table 2 according to Standards Version. Furthermore, the field name of a <b>RAW</b> field may only contain characters allowed in - filenames<sup><a href="#fs_note">†</a></sup>. Although never + filenames<sup><a href="#fs_note1">†</a></sup>. Although never allowed in a field name, a forward slash (<b>/</b>) can be used to define metafields; see above under the <a href="#meta"><b>/META</b></a> directive. Like the rest of the format file, field names are case @@ -512,19 +512,19 @@ <tr><th>Version</th><th>Reserved Characters</th> </tr> <tr> - <td>0–4</td><td><b>#</b><sup>‡</sup> <b>/</b> - <i>whitespace</i><sup>‡</sup></td> + <td>0–4</td><td><b>#</b><sup>‡</sup> <b>/</b> + <i>whitespace</i><sup>‡</sup></td> </tr> <tr> - <td>5</td><td><b>#</b><sup>‡</sup> <b>/ & ; < > - |</b> <i>whitespace</i><sup>‡</sup></td> + <td>5</td><td><b>#</b><sup>‡</sup> <b>/ & ; < > + |</b> <i>whitespace</i><sup>‡</sup></td> </tr> <tr> <td>6—</td><td><b>/ & ; < > | .</b></td> </tr> </table> <div class="footnote"> - ‡: By virtue of there being no way to include such characters + ‡: By virtue of there being no way to include such characters in tokens. </div> </div> @@ -536,13 +536,16 @@ <p>Standards Version 3 and 4 restrict field names to 50 characters. Standards Version 2 and earlier restrict field names to 16 characters. Additionally, the filesystem will put restrictions on the length of a - <b>RAW</b> field name, regardless of Standards Version. + <b>RAW</b> field name, regardless of Standards Version<sup><a + href="#fs_note2">*</a></sup>. <div class="footnote inset"> <hr> - <a name="fs_note">†</a>: Consult the documentation of the + <p><a name="fs_note1">†</a>: Consult the documentation of the filesystem backing the database for details, although most modern filesystems permit any byte except NUL (0x00) or, failing that, any Unicode character except NUL. + <p><a name="fs_note2">*</a>: Again, consult the filesystem documentation, + but most modern filesystems permit filenames of at least 255 bytes. </div> <h3><a name="fieldtype">Field Types</a></h3> <p>There are thirteen field types. Of these, ten are of vector type @@ -794,11 +797,11 @@ <li><b>BIT, SBIT</b>: <span class="syntax">bitnum</span>, <span class="syntax">bits</span> <li><b>LINCOM</b>: any of the <span - class="syntax">m</span><sub><i>i</i></sub> or - <span class="syntax">b</span><sub><i>i</i></sub> + class="syntax">m</span><sub>i</sub> or + <span class="syntax">b</span><sub>i</sub> <li><b>PHASE</b>: <span class="syntax">shift</span> <li><b>POLYNOM</b>: any of the <span - class="syntax">a</span><sub><i>i</i></sub>. + class="syntax">a</span><sub>i</sub>. <li><b>RECIP</b>: <span class="syntax">dividend</span> </ul> Since it is possible to create a field code which is identical to a @@ -835,7 +838,7 @@ metafield, ie. "<i>parent/field</i>", <li>starting with Standards Version 7, either of the above, followed by - a period, followed by a <i>"representation suffix</i>, but only if the + a period, followed by a <i>representation suffix</i>, but only if the field or metafield specified is not a <b>STRING</b> type field; ie. "<i>field.r</i>", or "<i>parent/field.m</i>". </ul> @@ -848,7 +851,7 @@ The argument is in the range [−π, π], and a branch cut exists along the negative real axis. At the branch cut, −π is returned if the imaginary part is −0, and π is returned if the - branch cut is +0. If <i>z</i>=0, zero is returned. + imaginary part is +0. If <i>z</i>=0, zero is returned. <li><b>.i</b>: This representation indicates the projection of the value onto the imaginary axis (ie. the imaginary part of the number). <li><b>.m</b>: This representation indicates the modulus of the value @@ -889,12 +892,12 @@ and <b>COMPLEX128</b>. It also introduced representation suffixes to field codes, made the <span class="syntax">n_fields</span> parameter to <b>LINCOM</b> optional, and introduced the - directive-less method of specifying metafields. + directive-free method of specifying metafields. </td> </tr> <tr> <td>6</td><td>October 2008</td><td> Added the <b>/ENCODING</b>, - <b>/META</b>, <b>/PROTECT</b>, and <b>REFERENCE</b> directives and + <b>/META</b>, <b>/PROTECT</b>, and <b>/REFERENCE</b> directives and the <b>CONST</b> and <b>STRING</b> field types. It permitted whitespace in tokens and introduced the character escape sequences. It allowed <b>CONST</b> fields to be used as parameters in field @@ -954,7 +957,7 @@ <div class="w3c"> <a href="http://validator.w3.org/check?uri=referer"><img src="valid_html.png" alt="Valid HTML 4.01 Strict" height="21" - width="60"></a><a href="http://jigsaw.w3.org/css-validator/"><img + width="60"></a><a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="valid_css.png" alt="Valid CSS" height="21" width="60"></a> </div> </div> Modified: trunk/html/download.html =================================================================== --- trunk/html/download.html 2011-11-08 22:02:17 UTC (rev 618) +++ trunk/html/download.html 2011-11-09 00:19:22 UTC (rev 619) @@ -142,7 +142,7 @@ <dd>GetData is available in <a href="http://www.debian.org/">Debian</a> sid (unstable) and wheezy (testing). <i>NB:</i> In Debian, the GetData Project is packaged as <code><a - href="http://packages.debian.org/search?searchon=sourcenames&keywords=libgetdata">libgetdata</a></code> + href="http://packages.debian.org/search?searchon=sourcenames&keywords=libgetdata">libgetdata</a></code> and should not be confused with the unrelated getData package. These packages are maintained by Michael Milligan and S. J. Benton. <dt>Fedora & Red Hat Enterprise Linux:</dt> @@ -249,7 +249,7 @@ <div class="w3c"> <a href="http://validator.w3.org/check?uri=referer"><img src="valid_html.png" alt="Valid HTML 4.01 Strict" height="21" - width="60"></a><a href="http://jigsaw.w3.org/css-validator/"><img + width="60"></a><a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="valid_css.png" alt="Valid CSS" height="21" width="60"></a> </div> </div> Modified: trunk/html/encoding.html =================================================================== --- trunk/html/encoding.html 2011-11-08 22:02:17 UTC (rev 618) +++ trunk/html/encoding.html 2011-11-09 00:19:22 UTC (rev 619) @@ -298,7 +298,7 @@ <div class="w3c"> <a href="http://validator.w3.org/check?uri=referer"><img src="valid_html.png" alt="Valid HTML 4.01 Strict" height="21" - width="60"></a><a href="http://jigsaw.w3.org/css-validator/"><img + width="60"></a><a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="valid_css.png" alt="Valid CSS" height="21" width="60"></a> </div> </div> Modified: trunk/html/getdata.html =================================================================== --- trunk/html/getdata.html 2011-11-08 22:02:17 UTC (rev 618) +++ trunk/html/getdata.html 2011-11-09 00:19:22 UTC (rev 619) @@ -4619,7 +4619,7 @@ <div class="w3c"> <a href="http://validator.w3.org/check?uri=referer"><img src="valid_html.png" alt="Valid HTML 4.01 Strict" height="21" - width="60"></a><a href="http://jigsaw.w3.org/css-validator/"><img + width="60"></a><a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="valid_css.png" alt="Valid CSS" height="21" width="60"></a> </div> </div> Modified: trunk/html/index.html =================================================================== --- trunk/html/index.html 2011-11-08 22:02:17 UTC (rev 618) +++ trunk/html/index.html 2011-11-09 00:19:22 UTC (rev 619) @@ -171,7 +171,7 @@ <div class="w3c"> <a href="http://validator.w3.org/check?uri=referer"><img src="valid_html.png" alt="Valid HTML 4.01 Strict" height="21" - width="60"></a><a href="http://jigsaw.w3.org/css-validator/"><img + width="60"></a><a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="valid_css.png" alt="Valid CSS" height="21" width="60"></a> </div> </div> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-08 22:02:23
|
Revision: 618 http://getdata.svn.sourceforge.net/getdata/?rev=618&view=rev Author: ketiltrout Date: 2011-11-08 22:02:17 +0000 (Tue, 08 Nov 2011) Log Message: ----------- Fix the link, too. Modified Paths: -------------- trunk/html/getdata.html Modified: trunk/html/getdata.html =================================================================== --- trunk/html/getdata.html 2011-11-08 21:52:12 UTC (rev 617) +++ trunk/html/getdata.html 2011-11-08 22:02:17 UTC (rev 618) @@ -1942,7 +1942,7 @@ A <span class="syntax literal">NULL</span>-terminated array of strings is returned. The number of non-<span class="syntax literal">NULL</span> elements in the array will be equal to the number returned by <a - href="#gd_nmframes"><span class="syntax">gd_nmfields()</span></a>. + href="#gd_nmfields"><span class="syntax">gd_nmfields()</span></a>. <h3><a name="gd_mvector_list">gd_mvector_list()</a> <span class="manlink"><a This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-08 21:52:18
|
Revision: 617 http://getdata.svn.sourceforge.net/getdata/?rev=617&view=rev Author: ketiltrout Date: 2011-11-08 21:52:12 +0000 (Tue, 08 Nov 2011) Log Message: ----------- Some corrections from S. J. Benton. Also, debian. Modified Paths: -------------- trunk/html/download.html trunk/html/getdata.html trunk/html/index.html Modified: trunk/html/download.html =================================================================== --- trunk/html/download.html 2011-11-08 21:24:00 UTC (rev 616) +++ trunk/html/download.html 2011-11-08 21:52:12 UTC (rev 617) @@ -4,10 +4,10 @@ <HEAD> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > <LINK REL="stylesheet" HREF="getdata.css" TYPE="text/css"> - <TITLE>GetData</TITLE> + <TITLE>Get GetData</TITLE> </HEAD> <BODY> - <H1>The GetData Project</H1> + <H1>Get GetData</H1> <div class="topbar"> <a href="index.html">home</a> | download | @@ -102,28 +102,29 @@ <li><a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/" >0.7.3</a>. Three packages are available: - <ul> - <li><em><a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/getdata-0.7.3.tar.bz2/download">getdata-0.7.3.tar.bz2</a>/<a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/getdata-0.7.3.tar.gz/download">.gz</a>:</em> the full source code to the library, with bindings. This - package uses the GNU autotools build system, and is designed for POSIX - systems (UNIX, Linux, BSD, MacOS X, Cygwin, MSys, &c.) - <li><em><a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/getdata_win-0.7.3.zip/download">getdata_win-0.7.3.zip</a>:</em> a reduced - source code package, with the CMake build system designed to be built - on Microsoft Windows, either using the free MinGW compiler, or else - Microsoft's Visual C++ compiler. (The full source package above can - also be built using MinGW, if the MSys shell is used to run the build - system.) Currently, the only bindings provided by this package are - the C++ bindings, and the package lacks support for compressed - dirfiles, the Legacy API, and a few other features. This build is - used in native Microsoft Windows builds of <a - href="http://kst.kde.org/">kst2</a>. - <li><em><a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/idl_getdata-0.7.3.tar.bz2/download">idl_getdata-0.7.3.tar.bz2</a>/<a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/idl_getdata-0.7.3.tar.gz/download">.gz</a>:</em> the Interactive Data Language (IDL) bindings, - packaged separately with an autotools build system, designed to be - built against an already installed version of GetData. Due to - licensing restrictions, <a href="#distro">pre-built packages</a> - rarely come with these bindings, and this package allows end-users to - add support for IDL without having to recompile the whole GetData - package. - </ul> + <dl> + <dt><a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/getdata-0.7.3.tar.bz2/download">getdata-0.7.3.tar.bz2</a>/<a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/getdata-0.7.3.tar.gz/download">.gz</a>:</dt> + <dd>The full source code to the library, with bindings. This package + uses the GNU autotools build system, and is designed for POSIX systems + (UNIX, Linux, BSD, MacOS X, Cygwin, MSys, &c.)</dd> + <dt><a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/getdata_win-0.7.3.zip/download">getdata_win-0.7.3.zip</a>:</dt> + <dd>A reduced source code package, with the CMake build system + designed to be built on Microsoft Windows, either using the free MinGW + compiler, or else Microsoft's Visual C++ compiler. (The full source + package above can also be built using MinGW, if the MSys shell is used + to run the build system.) Currently, the only bindings provided by + this package are the C++ bindings, and the package lacks support for + compressed dirfiles, the Legacy API, and a few other features. This + build is used in native Microsoft Windows builds of <a + href="http://kst.kde.org/">kst-2</a>.</dd> + <dt><a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/idl_getdata-0.7.3.tar.bz2/download">idl_getdata-0.7.3.tar.bz2</a>/<a href="http://sourceforge.net/projects/getdata/files/getdata/0.7.3/idl_getdata-0.7.3.tar.gz/download">.gz</a>:</dt> + <dd>The Interactive Data Language (IDL) bindings, packaged separately + with an autotools build system, designed to be built against an + already installed version of GetData. Due to licensing restrictions, + <a href="#distro">pre-built packages</a> rarely come with these + bindings, and this package allows end-users to add support for IDL + without having to recompile the whole GetData package.</dd> + </dl> </ul> GetData may be <a href="http://sourceforge.net/projects/getdata/files/" @@ -137,6 +138,13 @@ <p>GetData has been packaged for release on various Linux distributions, including: <dl> + <dt>Debian:</dt> + <dd>GetData is available in <a href="http://www.debian.org/">Debian</a> + sid (unstable) and wheezy (testing). <i>NB:</i> In Debian, the GetData + Project is packaged as <code><a + href="http://packages.debian.org/search?searchon=sourcenames&keywords=libgetdata">libgetdata</a></code> + and should not be confused with the unrelated getData package. These + packages are maintained by Michael Milligan and S. J. Benton. <dt>Fedora & Red Hat Enterprise Linux:</dt> <dd>GetData has been included in <a href="http://fedoraproject.org/">Fedora</a> since Fedora 8 and EPEL @@ -153,7 +161,7 @@ href="https://launchpad.net/~stevebenton/+archive/kst2-jaunty" >kst2-jaunty</a> PPA, and for later versions, the <a href="https://launchpad.net/~stevebenton/+archive/kst2">kst2</a> PPA. - These packages are maintained by Steve Benton. + These packages are maintained by S. J. Benton. </dd> </dl> <h2><a name="svn">Subversion</a></h2> Modified: trunk/html/getdata.html =================================================================== --- trunk/html/getdata.html 2011-11-08 21:24:00 UTC (rev 616) +++ trunk/html/getdata.html 2011-11-08 21:52:12 UTC (rev 617) @@ -1354,7 +1354,7 @@ </tr> <tr> <td rowspan="3" class="syntax">const char*</td> - <td rowspan="3" class="syntax">infields[n]</td> + <td rowspan="3" class="syntax">in_fields[n]</td> <td>LINCOM</td><td>n≤3</td> <td colspan="2" rowspan="3">The input field(s). The number of array elements initialised depends on the field type (and, in the case @@ -1942,7 +1942,7 @@ A <span class="syntax literal">NULL</span>-terminated array of strings is returned. The number of non-<span class="syntax literal">NULL</span> elements in the array will be equal to the number returned by <a - href="#gd_nmframes"><span class="syntax">gd_nmframes()</span></a>. + href="#gd_nmframes"><span class="syntax">gd_nmfields()</span></a>. <h3><a name="gd_mvector_list">gd_mvector_list()</a> <span class="manlink"><a @@ -2220,10 +2220,7 @@ class="identifier">dirfile</span><span class="operator">,</span> <span class="keyword">const gd_entry_t</span> <span class="operator">*</span><span - class="identifier">entry</span><span class="operator">,</span> - <span class="keyword">int</span> <span - class="identifier">fragment_index</span><span - class="operator">);</span> + class="identifier">entry</span><span class="operator">);</span> </div> This will add the field described by the user-supplied <span class="syntax identifier">entry</span>. Alternate methods of adding Modified: trunk/html/index.html =================================================================== --- trunk/html/index.html 2011-11-08 21:24:00 UTC (rev 616) +++ trunk/html/index.html 2011-11-08 21:52:12 UTC (rev 617) @@ -4,7 +4,7 @@ <HEAD> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > <LINK REL="stylesheet" HREF="getdata.css" TYPE="text/css"> - <TITLE>GetData</TITLE> + <TITLE>The GetData Project</TITLE> </HEAD> <BODY> <H1>The GetData Project</H1> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-08 21:24:06
|
Revision: 616 http://getdata.svn.sourceforge.net/getdata/?rev=616&view=rev Author: ketiltrout Date: 2011-11-08 21:24:00 +0000 (Tue, 08 Nov 2011) Log Message: ----------- That's not right. Modified Paths: -------------- trunk/getdata/test/Makefile.am Modified: trunk/getdata/test/Makefile.am =================================================================== --- trunk/getdata/test/Makefile.am 2011-11-08 21:21:05 UTC (rev 615) +++ trunk/getdata/test/Makefile.am 2011-11-08 21:24:00 UTC (rev 616) @@ -314,8 +314,7 @@ XZ_TESTS=xz_get xz_nframes -TESTS=$(ADD_TESTS) -TEeTS=$(ADD_TESTS) $(ALTER_TESTS) $(ASCII_TESTS) \ +TESTS=$(ADD_TESTS) $(ALTER_TESTS) $(ASCII_TESTS) \ $(BOF_TESTS) $(BZIP_TESTS) $(CLOSE_TESTS) \ $(CONVERT_TESTS) $(CREAT_TESTS) $(CVLIST_TESTS) \ $(DEL_TESTS) $(DFES_TESTS) $(ENCODE_TESTS) \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-08 21:21:13
|
Revision: 615 http://getdata.svn.sourceforge.net/getdata/?rev=615&view=rev Author: ketiltrout Date: 2011-11-08 21:21:05 +0000 (Tue, 08 Nov 2011) Log Message: ----------- Copy scalar_ind elements passed to gd_add. Patch from S. J. Benton. Also test for same. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/src/add.c trunk/getdata/test/Makefile.am Added Paths: ----------- trunk/getdata/test/add_scalar_carray.c Property Changed: ---------------- trunk/getdata/test/ Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-11-08 04:56:06 UTC (rev 614) +++ trunk/getdata/ChangeLog 2011-11-08 21:21:05 UTC (rev 615) @@ -1,3 +1,9 @@ +2011-11-08 D. V. Wiebe <ge...@ke...> svn:615 + * test/add_scalar_carray.c: Added. + + * src/add.c (_GD_Add): Copy scalar_ind when copying scalars. Patch from + S. J. Benton. + 2011-11-08 D. V. Wiebe <ge...@ke...> svn:614 * test/gzip_put_get.c test/gzip_move_to.c test/gzip_add.c test/gzip_get_put.c test/gzip_put.c: Handle TEST_GZIP && !USE_GZIP. Modified: trunk/getdata/src/add.c =================================================================== --- trunk/getdata/src/add.c 2011-11-08 04:56:06 UTC (rev 614) +++ trunk/getdata/src/add.c 2011-11-08 21:21:05 UTC (rev 615) @@ -408,6 +408,7 @@ E->scalar[i] = NULL; else { E->scalar[i] = strdup(entry->scalar[i]); + E->scalar_ind[i] = entry->scalar_ind[i]; if (E->scalar[i] == NULL) _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); } Property changes on: trunk/getdata/test ___________________________________________________________________ Modified: svn:ignore - Makefile Makefile.in *.o *.odirfile *.swp *.exe .deps .libs convert_uint8_int8 convert_uint8_uint16 convert_uint8_int16 convert_uint8_uint32 convert_uint8_int32 convert_uint8_float32 convert_uint8_uint64 convert_uint8_int64 convert_uint8_float64 convert_int8_uint8 convert_int8_uint16 convert_int8_int16 convert_int8_uint32 convert_int8_int32 convert_int8_float32 convert_int8_uint64 convert_int8_int64 convert_int8_float64 convert_uint16_uint8 convert_uint16_int8 convert_uint16_int16 convert_uint16_uint32 convert_uint16_int32 convert_uint16_float32 convert_uint16_uint64 convert_uint16_int64 convert_uint16_float64 convert_int16_uint8 convert_int16_int8 convert_int16_uint16 convert_int16_uint32 convert_int16_int32 convert_int16_float32 convert_int16_uint64 convert_int16_int64 convert_int16_float64 convert_uint32_uint8 convert_uint32_int8 convert_uint32_uint16 convert_uint32_int16 convert_uint32_int32 convert_uint32_float32 convert_uint32_uint64 convert_uint32_int64 convert_uint32_float64 convert_int32_uint8 convert_int32_int8 convert_int32_uint16 convert_int32_int16 convert_int32_uint32 convert_int32_float32 convert_int32_uint64 convert_int32_int64 convert_int32_float64 convert_uint64_uint8 convert_uint64_int8 convert_uint64_uint16 convert_uint64_int16 convert_uint64_uint32 convert_uint64_int32 convert_uint64_float32 convert_uint64_int64 convert_uint64_float64 convert_int64_uint8 convert_int64_int8 convert_int64_uint16 convert_int64_int16 convert_int64_uint32 convert_int64_int32 convert_int64_float32 convert_int64_uint64 convert_int64_float64 convert_float32_uint8 convert_float32_int8 convert_float32_uint16 convert_float32_int16 convert_float32_uint32 convert_float32_int32 convert_float32_uint64 convert_float32_int64 convert_float32_float64 convert_float64_uint8 convert_float64_int8 convert_float64_uint16 convert_float64_int16 convert_float64_uint32 convert_float64_int32 convert_float64_float32 convert_float64_uint64 convert_float64_int64 creat creat_excl creat_rdonly flist flist_invalid get64 get_bad_code get_bit get_char get_endian8 get_endian16 get_endian32 get_endian64 get_endian_float32_big get_endian_float32_arm get_endian_float32_little get_endian_float64_big get_endian_float64_arm get_endian_float64_little get_ff get_float32 get_float64 get_foffs get_fs get_int8 get_int16 get_int32 get_int64 get_invalid get_lincom1 get_lincom2 get_lincom3 get_lincom_noin get_linterp get_linterp_noin get_linterp_notab get_multiply get_multiply_noin get_nonexistent get_null get_off64 get_phase get_recurse get_sf get_ss get_type get_uint16 get_uint32 get_uint64 legacy_get legacy_nframes legacy_nonexistent legacy_put legacy_spf nfields nfields_invalid nframes nframes64 nframes_empty nframes_invalid nframes_off64 nframes_spf open open_eaccess open_nonexistent open_notdirfile parse_badline parse_bit parse_bit4 parse_bit_bitnum parse_bit_bitsize parse_bit_ncols parse_bit_numbits parse_endian_bad parse_endian_big parse_endian_force parse_endian_little parse_foffs parse_include parse_include_nonexistent parse_index parse_lincom parse_lincom_ncols1 parse_lincom_ncols2 parse_lincom_nfields parse_lincom_nofields parse_linterp parse_linterp_ncols parse_multiply parse_multiply_ncols parse_ncols parse_phase parse_phase_ncols parse_raw parse_raw_char parse_raw_ncols parse_raw_spf parse_raw_type parse_version parse_version_include put64 put_bad_code put_bit put_bof put_char put_endian8 put_endian16 put_endian32 put_endian64 put_endian_float32_arm put_endian_float32_big put_endian_float32_little put_endian_float64_arm put_endian_float64_big put_endian_float64_little put_ff put_float32 put_float64 put_foffs put_fs put_int8 put_int16 put_int32 put_int64 put_invalid put_lincom1 put_lincom2 put_lincom_noin put_linterp put_linterp_notab put_multiply put_null put_off64 put_phase put_phase_noin put_rdonly put_recurse put_rofs put_sf put_ss put_type put_uint16 put_uint32 put_uint64 spf spf_lincom spf_multiply spf_recurse trunc trunc_rdonly trunc_rofs flush_invalid parse_version_slash flush_all flush close_null close parse_endian_slash error_error parse_name parse_include_slash close_bad parse_foffs_slash flush_bad_code dfes_bit dfes_lincom dfes_linterp dfes_multiply dfes_null dfes_phase dfes_raw dfes_zero entry_bad_code entry_bit entry_invalid entry_lincom entry_linterp entry_multiply entry_phase entry_raw legacy_get_put legacy_get_rofs add_phase add_lincom_nfields add_raw add_multiply add_bit_bitsize flush_meta add_type add_raw_type add_bit_bitnum add_bit add_format add_raw_spf put_linterp_noin error_short error add add_linterp nfragments add_duplicate add_code add_bit_numbits add_lincom add_rdonly ascii_get ascii_put ascii_nframes slim_get slim_nframes slim_put add_many add_sort nfields_type nfields_type_invalid nmeta nmeta_invalid nmeta_parent nmeta_type nmeta_type_invalid nmeta_type_parent nmeta_vectors nmeta_vectors_invalid nmeta_vectors_parent nvectors nvectors_invalid parse_const parse_const_ncols parse_duplicate parse_meta parse_meta_parent parse_meta_raw parse_quote parse_sort parse_string parse_string_ncols parse_whitespace madd_linterp_invalid madd_lincom_invalid vlist_invalid vlist_meta add_raw_invalid cvlist_invalid svlist_invalid cvlist svlist madd_phase_invalid add_invalid madd_phase add_phase_invalid add_spec_directive add_string add_linterp_invalid madd_multiply flist_type_invalid clist cvlist_meta_invalid flist_meta_invalid flist_type svlist_meta_invalid cvlist_meta vlist_meta_invalid svlist_meta parse_string_null madd_linterp madd_lincom vlist add_bit_invalid add_lincom_invalid madd_bit_invalid madd_bit add_multiply_invalid add_const madd_multiply_invalid madd add_spec_invalid flist_type_meta_invalid add_spec flist_type_meta flist_meta parse_meta_index entry_raw_scalar_code parse_bit_scalar entry_raw_scalar_type entry_lincom_scalar entry_phase_scalar entry_raw_scalar parse_lincom_scalar entry_bit_scalar parse_raw_scalar parse_phase_scalar include include_nonexistent include_creat include_invalid include_accmode include_index madd_spec_directive madd_spec_invalid madd_spec parse_quote_mismatch parse_eol parse_foffs_include put_string parse_protect_data put_const put_string_protect ref put_const_protect parse_protect_all ref_none parse_ref add_protect parse_protect_format parse_protect_bad ref_two put_protect include_rdonly parse_ref_nonexistent parse_protect_none parse_name_pedantic parse_name_dot parse_name_ext parse_duplicate_ignore gzip_get gzip_nframes gzip_put gzip_get_get bzip_get bzip_nframes bzip_put bzip_get_get global_name open_cb_abort open_cb_cont open_cb_ignore open_cb_rescan open_cb_invalid del_const_force del_const del_derived_force del_const_deref del_meta_force del_data del_meta del del_derived close_discard global_ref_set global_ref_empty include_ignore global_ref include_ref include_auto move move_index move_protect move_data_enc_ar bzip_move_from gzip_move_from move_data_foffs move_data_enc_ra move_data_endian move_data_nop alter_multiply alter_bit_bitnum alter_entry_recode alter_linterp_move alter_raw_spf alter_entry alter_bit_numbits alter_lincom_slope alter_raw_type alter_lincom_input alter_const alter_phase alter_lincom_offset alter_linterp foffs_get foffs_move foffs_alter endian_alter endian_move endian_get encode_alter encode_get encode_move protect_alter move_subdir unclude_del name_move unclude file name file_type unclude_move file_code parent protect_get global_ref_get alter_mspec alter_spec include_cb include_pc include_syntax fragment_index fragment_name fragment_name_oor entry_type alter_polynom_coeff get_polynom_noin get_polynom put_polynom_noin madd_polynom parse_polynom_scalar alter_polynom_ord parse_polynom spf_polynom entry_polynom_scalar put_polynom1 put_polynom2 parse_polynom_ncols1 parse_polynom_ncols2 alter_polynom_input add_polynom entry_polynom parse_lincom_non_ncols parse_lincom_non get_lincom_non xz_get xz_nframes lzma_get lzma_nframes add_sbit parse_sbit put_sbit get_sbit madd_sbit flush_spec index_domain madd_clincom index madd_const index_range add_clincom add_cpolynom get_clincom convert_float32_complex64 convert_int32_complex128 get_endian_complex128_big get_endian_complex128_arm get_endian_complex128_little convert_complex64_float64 parse_meta_index2 convert_uint16_complex128 put_endian_complex64_arm put_endian_complex64_big put_endian_complex64_little convert_uint16_complex64 convert_float64_complex128 repr_int8 convert_complex64_int64 convert_uint64_complex64 convert_complex64_complex128 get_const convert_uint8_complex128 parse_meta_implicit2 convert_float32_complex128 get_complex64 add_spec_meta convert_float64_complex64 convert_int16_complex128 alter_cpolynom madd_cpolynom convert_int32_complex64 alter_lincom_23 convert_complex64_uint64 repr_uint8 put_complex128 get_endian_complex64_big get_endian_complex64_arm get_endian_complex64_little alter_spec_meta repr_real_a repr_real_i repr_real_m repr_real_r repr_int16 convert_uint8_complex64 repr_int32 madd_string convert_complex128_float64 repr_uint16 repr_int64 put_endian_complex128_arm put_endian_complex128_big put_endian_complex128_little get_complex128 repr_uint32 convert_complex128_uint64 get_const_repr convert_complex128_int64 repr_float32 repr_uint64 convert_int16_complex64 repr_float64 put_complex64 convert_uint64_complex128 convert_int64_complex64 repr_a repr_i repr_m repr_r get_const_complex convert_int8_complex128 convert_uint32_complex128 parse_meta_implicit get_cpolynom put_repr convert_complex128_complex64 convert_int8_complex64 convert_uint32_complex64 convert_int64_complex128 move_meta add_scalar alter_entry_scalar2a alter_entry_scalar2n alter_entry_scalar3 alter_entry_scalar4 get_zero entry_scalar_repr header_complex version_5_strict parse_version_permissive version_7_strict version_0 version_1 version_2 version_3 version_4 version_5 version_6 version_7 version_6_strict eof eof_index eof_lincom eof_phase bof bof_lincom bof_phase put_linterp_nomono get_linterp_sort put_linterp_reverse alter_lincom_32 parse_recip parse_divide alter_recip dfes_recip add_crecip89 add_divide put_divide madd_recip add_crecip get_recip_const spf_divide add_divide_invalid version_8 alter_crecip89 put_recip spf_recip madd_crecip89 alter_divide get_recip alter_crecip madd_divide dfes_divide madd_crecip add_recip get_divide version_8_strict version_5_write version_0_write version_7_write version_2_write version_4_write version_6_write version_1_write version_8_write version_3_write put_carray_slice cvlist_array_meta del_carray get_carray_slice cvlist_array del_carray_deref nmeta_vectors_del get_carray parse_carray madd_carray add_carray put_carray get_carray_len parse_carray_long alter_carray_len alter_carray_type ascii_get_get parse_include_relabs parse_include_absrel parse_include_relrel parse_include_absolute add_raw_include alter_crecip_zero alter_recip_zero error_num sie_put_little sie_get_big sie_move_to sie_nframes_big sie_get_little sie_nframes_little sie_move_from sie_put_big seek_end get_here entry_divide tell get_heres entry_recip seek_cur put_here seek64 seek_set tell64 put_heres get_here_foffs seek_foffs get_rofs endian_alter_sie gzip_get_put gzip_put_get gzip_move_to ascii_add gzip_add + Makefile Makefile.in *.o *.odirfile *.swp *.exe .deps .libs convert_uint8_int8 convert_uint8_uint16 convert_uint8_int16 convert_uint8_uint32 convert_uint8_int32 convert_uint8_float32 convert_uint8_uint64 convert_uint8_int64 convert_uint8_float64 convert_int8_uint8 convert_int8_uint16 convert_int8_int16 convert_int8_uint32 convert_int8_int32 convert_int8_float32 convert_int8_uint64 convert_int8_int64 convert_int8_float64 convert_uint16_uint8 convert_uint16_int8 convert_uint16_int16 convert_uint16_uint32 convert_uint16_int32 convert_uint16_float32 convert_uint16_uint64 convert_uint16_int64 convert_uint16_float64 convert_int16_uint8 convert_int16_int8 convert_int16_uint16 convert_int16_uint32 convert_int16_int32 convert_int16_float32 convert_int16_uint64 convert_int16_int64 convert_int16_float64 convert_uint32_uint8 convert_uint32_int8 convert_uint32_uint16 convert_uint32_int16 convert_uint32_int32 convert_uint32_float32 convert_uint32_uint64 convert_uint32_int64 convert_uint32_float64 convert_int32_uint8 convert_int32_int8 convert_int32_uint16 convert_int32_int16 convert_int32_uint32 convert_int32_float32 convert_int32_uint64 convert_int32_int64 convert_int32_float64 convert_uint64_uint8 convert_uint64_int8 convert_uint64_uint16 convert_uint64_int16 convert_uint64_uint32 convert_uint64_int32 convert_uint64_float32 convert_uint64_int64 convert_uint64_float64 convert_int64_uint8 convert_int64_int8 convert_int64_uint16 convert_int64_int16 convert_int64_uint32 convert_int64_int32 convert_int64_float32 convert_int64_uint64 convert_int64_float64 convert_float32_uint8 convert_float32_int8 convert_float32_uint16 convert_float32_int16 convert_float32_uint32 convert_float32_int32 convert_float32_uint64 convert_float32_int64 convert_float32_float64 convert_float64_uint8 convert_float64_int8 convert_float64_uint16 convert_float64_int16 convert_float64_uint32 convert_float64_int32 convert_float64_float32 convert_float64_uint64 convert_float64_int64 creat creat_excl creat_rdonly flist flist_invalid get64 get_bad_code get_bit get_char get_endian8 get_endian16 get_endian32 get_endian64 get_endian_float32_big get_endian_float32_arm get_endian_float32_little get_endian_float64_big get_endian_float64_arm get_endian_float64_little get_ff get_float32 get_float64 get_foffs get_fs get_int8 get_int16 get_int32 get_int64 get_invalid get_lincom1 get_lincom2 get_lincom3 get_lincom_noin get_linterp get_linterp_noin get_linterp_notab get_multiply get_multiply_noin get_nonexistent get_null get_off64 get_phase get_recurse get_sf get_ss get_type get_uint16 get_uint32 get_uint64 legacy_get legacy_nframes legacy_nonexistent legacy_put legacy_spf nfields nfields_invalid nframes nframes64 nframes_empty nframes_invalid nframes_off64 nframes_spf open open_eaccess open_nonexistent open_notdirfile parse_badline parse_bit parse_bit4 parse_bit_bitnum parse_bit_bitsize parse_bit_ncols parse_bit_numbits parse_endian_bad parse_endian_big parse_endian_force parse_endian_little parse_foffs parse_include parse_include_nonexistent parse_index parse_lincom parse_lincom_ncols1 parse_lincom_ncols2 parse_lincom_nfields parse_lincom_nofields parse_linterp parse_linterp_ncols parse_multiply parse_multiply_ncols parse_ncols parse_phase parse_phase_ncols parse_raw parse_raw_char parse_raw_ncols parse_raw_spf parse_raw_type parse_version parse_version_include put64 put_bad_code put_bit put_bof put_char put_endian8 put_endian16 put_endian32 put_endian64 put_endian_float32_arm put_endian_float32_big put_endian_float32_little put_endian_float64_arm put_endian_float64_big put_endian_float64_little put_ff put_float32 put_float64 put_foffs put_fs put_int8 put_int16 put_int32 put_int64 put_invalid put_lincom1 put_lincom2 put_lincom_noin put_linterp put_linterp_notab put_multiply put_null put_off64 put_phase put_phase_noin put_rdonly put_recurse put_rofs put_sf put_ss put_type put_uint16 put_uint32 put_uint64 spf spf_lincom spf_multiply spf_recurse trunc trunc_rdonly trunc_rofs flush_invalid parse_version_slash flush_all flush close_null close parse_endian_slash error_error parse_name parse_include_slash close_bad parse_foffs_slash flush_bad_code dfes_bit dfes_lincom dfes_linterp dfes_multiply dfes_null dfes_phase dfes_raw dfes_zero entry_bad_code entry_bit entry_invalid entry_lincom entry_linterp entry_multiply entry_phase entry_raw legacy_get_put legacy_get_rofs add_phase add_lincom_nfields add_raw add_multiply add_bit_bitsize flush_meta add_type add_raw_type add_bit_bitnum add_bit add_format add_raw_spf put_linterp_noin error_short error add add_linterp nfragments add_duplicate add_code add_bit_numbits add_lincom add_rdonly ascii_get ascii_put ascii_nframes slim_get slim_nframes slim_put add_many add_sort nfields_type nfields_type_invalid nmeta nmeta_invalid nmeta_parent nmeta_type nmeta_type_invalid nmeta_type_parent nmeta_vectors nmeta_vectors_invalid nmeta_vectors_parent nvectors nvectors_invalid parse_const parse_const_ncols parse_duplicate parse_meta parse_meta_parent parse_meta_raw parse_quote parse_sort parse_string parse_string_ncols parse_whitespace madd_linterp_invalid madd_lincom_invalid vlist_invalid vlist_meta add_raw_invalid cvlist_invalid svlist_invalid cvlist svlist madd_phase_invalid add_invalid madd_phase add_phase_invalid add_spec_directive add_string add_linterp_invalid madd_multiply flist_type_invalid clist cvlist_meta_invalid flist_meta_invalid flist_type svlist_meta_invalid cvlist_meta vlist_meta_invalid svlist_meta parse_string_null madd_linterp madd_lincom vlist add_bit_invalid add_lincom_invalid madd_bit_invalid madd_bit add_multiply_invalid add_const madd_multiply_invalid madd add_spec_invalid flist_type_meta_invalid add_spec flist_type_meta flist_meta parse_meta_index entry_raw_scalar_code parse_bit_scalar entry_raw_scalar_type entry_lincom_scalar entry_phase_scalar entry_raw_scalar parse_lincom_scalar entry_bit_scalar parse_raw_scalar parse_phase_scalar include include_nonexistent include_creat include_invalid include_accmode include_index madd_spec_directive madd_spec_invalid madd_spec parse_quote_mismatch parse_eol parse_foffs_include put_string parse_protect_data put_const put_string_protect ref put_const_protect parse_protect_all ref_none parse_ref add_protect parse_protect_format parse_protect_bad ref_two put_protect include_rdonly parse_ref_nonexistent parse_protect_none parse_name_pedantic parse_name_dot parse_name_ext parse_duplicate_ignore gzip_get gzip_nframes gzip_put gzip_get_get bzip_get bzip_nframes bzip_put bzip_get_get global_name open_cb_abort open_cb_cont open_cb_ignore open_cb_rescan open_cb_invalid del_const_force del_const del_derived_force del_const_deref del_meta_force del_data del_meta del del_derived close_discard global_ref_set global_ref_empty include_ignore global_ref include_ref include_auto move move_index move_protect move_data_enc_ar bzip_move_from gzip_move_from move_data_foffs move_data_enc_ra move_data_endian move_data_nop alter_multiply alter_bit_bitnum alter_entry_recode alter_linterp_move alter_raw_spf alter_entry alter_bit_numbits alter_lincom_slope alter_raw_type alter_lincom_input alter_const alter_phase alter_lincom_offset alter_linterp foffs_get foffs_move foffs_alter endian_alter endian_move endian_get encode_alter encode_get encode_move protect_alter move_subdir unclude_del name_move unclude file name file_type unclude_move file_code parent protect_get global_ref_get alter_mspec alter_spec include_cb include_pc include_syntax fragment_index fragment_name fragment_name_oor entry_type alter_polynom_coeff get_polynom_noin get_polynom put_polynom_noin madd_polynom parse_polynom_scalar alter_polynom_ord parse_polynom spf_polynom entry_polynom_scalar put_polynom1 put_polynom2 parse_polynom_ncols1 parse_polynom_ncols2 alter_polynom_input add_polynom entry_polynom parse_lincom_non_ncols parse_lincom_non get_lincom_non xz_get xz_nframes lzma_get lzma_nframes add_sbit parse_sbit put_sbit get_sbit madd_sbit flush_spec index_domain madd_clincom index madd_const index_range add_clincom add_cpolynom get_clincom convert_float32_complex64 convert_int32_complex128 get_endian_complex128_big get_endian_complex128_arm get_endian_complex128_little convert_complex64_float64 parse_meta_index2 convert_uint16_complex128 put_endian_complex64_arm put_endian_complex64_big put_endian_complex64_little convert_uint16_complex64 convert_float64_complex128 repr_int8 convert_complex64_int64 convert_uint64_complex64 convert_complex64_complex128 get_const convert_uint8_complex128 parse_meta_implicit2 convert_float32_complex128 get_complex64 add_spec_meta convert_float64_complex64 convert_int16_complex128 alter_cpolynom madd_cpolynom convert_int32_complex64 alter_lincom_23 convert_complex64_uint64 repr_uint8 put_complex128 get_endian_complex64_big get_endian_complex64_arm get_endian_complex64_little alter_spec_meta repr_real_a repr_real_i repr_real_m repr_real_r repr_int16 convert_uint8_complex64 repr_int32 madd_string convert_complex128_float64 repr_uint16 repr_int64 put_endian_complex128_arm put_endian_complex128_big put_endian_complex128_little get_complex128 repr_uint32 convert_complex128_uint64 get_const_repr convert_complex128_int64 repr_float32 repr_uint64 convert_int16_complex64 repr_float64 put_complex64 convert_uint64_complex128 convert_int64_complex64 repr_a repr_i repr_m repr_r get_const_complex convert_int8_complex128 convert_uint32_complex128 parse_meta_implicit get_cpolynom put_repr convert_complex128_complex64 convert_int8_complex64 convert_uint32_complex64 convert_int64_complex128 move_meta add_scalar alter_entry_scalar2a alter_entry_scalar2n alter_entry_scalar3 alter_entry_scalar4 get_zero entry_scalar_repr header_complex version_5_strict parse_version_permissive version_7_strict version_0 version_1 version_2 version_3 version_4 version_5 version_6 version_7 version_6_strict eof eof_index eof_lincom eof_phase bof bof_lincom bof_phase put_linterp_nomono get_linterp_sort put_linterp_reverse alter_lincom_32 parse_recip parse_divide alter_recip dfes_recip add_crecip89 add_divide put_divide madd_recip add_crecip get_recip_const spf_divide add_divide_invalid version_8 alter_crecip89 put_recip spf_recip madd_crecip89 alter_divide get_recip alter_crecip madd_divide dfes_divide madd_crecip add_recip get_divide version_8_strict version_5_write version_0_write version_7_write version_2_write version_4_write version_6_write version_1_write version_8_write version_3_write put_carray_slice cvlist_array_meta del_carray get_carray_slice cvlist_array del_carray_deref nmeta_vectors_del get_carray parse_carray madd_carray add_carray put_carray get_carray_len parse_carray_long alter_carray_len alter_carray_type ascii_get_get parse_include_relabs parse_include_absrel parse_include_relrel parse_include_absolute add_raw_include alter_crecip_zero alter_recip_zero error_num sie_put_little sie_get_big sie_move_to sie_nframes_big sie_get_little sie_nframes_little sie_move_from sie_put_big seek_end get_here entry_divide tell get_heres entry_recip seek_cur put_here seek64 seek_set tell64 put_heres get_here_foffs seek_foffs get_rofs endian_alter_sie gzip_get_put gzip_put_get gzip_move_to ascii_add gzip_add add_scalar_carray Modified: trunk/getdata/test/Makefile.am =================================================================== --- trunk/getdata/test/Makefile.am 2011-11-08 04:56:06 UTC (rev 614) +++ trunk/getdata/test/Makefile.am 2011-11-08 21:21:05 UTC (rev 615) @@ -51,9 +51,9 @@ add_lincom_nfields add_linterp add_linterp_invalid add_multiply \ add_multiply_invalid add_phase add_phase_invalid add_polynom \ add_protect add_raw add_raw_include add_raw_invalid add_raw_spf \ - add_raw_type add_rdonly add_recip add_sbit add_scalar add_sort \ - add_spec add_spec_directive add_spec_invalid add_spec_meta \ - add_string add_type + add_raw_type add_rdonly add_recip add_sbit add_scalar \ + add_scalar_carray add_sort add_spec add_spec_directive \ + add_spec_invalid add_spec_meta add_string add_type ALTER_TESTS=alter_bit_bitnum alter_bit_numbits alter_carray_len \ alter_carray_type alter_const alter_cpolynom alter_crecip \ @@ -314,7 +314,8 @@ XZ_TESTS=xz_get xz_nframes -TESTS=$(ADD_TESTS) $(ALTER_TESTS) $(ASCII_TESTS) \ +TESTS=$(ADD_TESTS) +TEeTS=$(ADD_TESTS) $(ALTER_TESTS) $(ASCII_TESTS) \ $(BOF_TESTS) $(BZIP_TESTS) $(CLOSE_TESTS) \ $(CONVERT_TESTS) $(CREAT_TESTS) $(CVLIST_TESTS) \ $(DEL_TESTS) $(DFES_TESTS) $(ENCODE_TESTS) \ Added: trunk/getdata/test/add_scalar_carray.c =================================================================== --- trunk/getdata/test/add_scalar_carray.c (rev 0) +++ trunk/getdata/test/add_scalar_carray.c 2011-11-08 21:21:05 UTC (rev 615) @@ -0,0 +1,81 @@ +/* Copyright (C) 2009-2011 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 + */ +/* Add a dirfile field */ +#include "test.h" + +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> +#include <math.h> + +int main(void) +{ + const char *filedir = "dirfile"; + const char *format = "dirfile/format"; + int error, r = 0; + DIRFILE *D; + + gd_entry_t E, e; + E.field = "data"; + E.field_type = GD_LINCOM_ENTRY; + E.fragment_index = 0; + E.EN(lincom,n_fields) = 1; + E.comp_scal = 0; + E.in_fields[0] = "INDEX"; + E.EN(lincom,m)[0] = 1.; + E.scalar[0] = NULL; + E.scalar[0 + GD_MAX_LINCOM] = "c"; + E.scalar_ind[0 + GD_MAX_LINCOM] = 3; + + D = gd_open(filedir, GD_RDWR | GD_CREAT | GD_VERBOSE); + gd_add_spec(D, "c CARRAY INT64 1 2 3 4", 0); + gd_add(D, &E); + error = gd_error(D); + + /* check */ + gd_entry(D, "data", &e); + if (gd_error(D)) + r = 1; + else { + CHECKI(e.field_type, GD_LINCOM_ENTRY); + CHECKI(e.fragment_index, 0); + CHECKI(e.EN(lincom,n_fields), 1); + CHECKF(e.EN(lincom,m)[0], 1); + CHECKF(e.EN(lincom,b)[0], 4); + CHECKP(e.scalar[0]); + CHECKS(e.scalar[0 + GD_MAX_LINCOM], "c"); + CHECKI(e.scalar_ind[0 + GD_MAX_LINCOM], 3); + gd_free_entry_strings(&e); + } + + gd_close(D); + + unlink(format); + rmdir(filedir); + + CHECKI(error, GD_E_OK); + + return r; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-08 04:56:13
|
Revision: 614 http://getdata.svn.sourceforge.net/getdata/?rev=614&view=rev Author: ketiltrout Date: 2011-11-08 04:56:06 +0000 (Tue, 08 Nov 2011) Log Message: ----------- * Fix gzip tests for TEST_GZIP && !USE_GZIP. * Fix descriptor leak in sie.c. Modified Paths: -------------- trunk/getdata/ChangeLog trunk/getdata/src/encoding.c trunk/getdata/src/sie.c trunk/getdata/test/gzip_add.c trunk/getdata/test/gzip_get_put.c trunk/getdata/test/gzip_move_to.c trunk/getdata/test/gzip_put.c trunk/getdata/test/gzip_put_get.c Modified: trunk/getdata/ChangeLog =================================================================== --- trunk/getdata/ChangeLog 2011-11-06 08:39:54 UTC (rev 613) +++ trunk/getdata/ChangeLog 2011-11-08 04:56:06 UTC (rev 614) @@ -1,3 +1,11 @@ +2011-11-08 D. V. Wiebe <ge...@ke...> svn:614 + * test/gzip_put_get.c test/gzip_move_to.c test/gzip_add.c + test/gzip_get_put.c test/gzip_put.c: Handle TEST_GZIP && !USE_GZIP. + + * src/encoding.c (_GD_FiniRawIO): Don't change error code if already set. + + * src/sie.c (_GD_SampIndSize): Fix descriptor leak. + 2011-11-05 D. V. Wiebe <ge...@ke...> svn:610 * test/gzip_put_get.c test/ascii_add.c test/get_rofs.c test/gzip_move_to.c test/gzip_add.c test/endian_alter_sie.c test/gzip_get_put.c: Added. Modified: trunk/getdata/src/encoding.c =================================================================== --- trunk/getdata/src/encoding.c 2011-11-06 08:39:54 UTC (rev 613) +++ trunk/getdata/src/encoding.c 2011-11-08 04:56:06 UTC (rev 614) @@ -331,8 +331,9 @@ if ((*_gd_ef[E->e->u.raw.file[clotemp].subenc].close)(E->e->u.raw.file + clotemp)) { - _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[clotemp].name, errno, - NULL); + if (D->error == GD_E_OK) + _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[clotemp].name, errno, + NULL); dreturn("%i", 1); return 1; } @@ -352,7 +353,8 @@ if (gd_UnlinkAt(D, D->fragment[fragment].dirfd, E->e->u.raw.file[1].name, 0)) { - _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, NULL); + if (D->error == GD_E_OK) + _GD_SetError(D, GD_E_RAW_IO, 0, E->e->u.raw.file[1].name, errno, NULL); dreturn("%i", -1); return -1; } Modified: trunk/getdata/src/sie.c =================================================================== --- trunk/getdata/src/sie.c 2011-11-06 08:39:54 UTC (rev 613) +++ trunk/getdata/src/sie.c 2011-11-08 04:56:06 UTC (rev 614) @@ -503,6 +503,8 @@ if (swap) n = gd_swap64(n); + fclose(f.fp); + dreturn("%llx", (long long unsigned)n); return (off64_t)n; } Modified: trunk/getdata/test/gzip_add.c =================================================================== --- trunk/getdata/test/gzip_add.c 2011-11-06 08:39:54 UTC (rev 613) +++ trunk/getdata/test/gzip_add.c 2011-11-08 04:56:06 UTC (rev 614) @@ -38,36 +38,47 @@ const char *format = "dirfile/format"; const char *data = "dirfile/data.gz"; gd_entry_t e; - int error, r = 0; + int e1, e2, unlink_data, r = 0; DIRFILE *D; rmdirfile(); +#ifdef USE_GZIP D = gd_open(filedir, GD_RDWR | GD_CREAT | GD_VERBOSE | GD_GZIP_ENCODED); +#else + D = gd_open(filedir, GD_RDWR | GD_CREAT | GD_GZIP_ENCODED); +#endif gd_add_raw(D, "data", GD_UINT8, 2, 0); - error = gd_error(D); + e1 = gd_error(D); /* check */ - gd_entry(D, "data", &e); - if (gd_error(D)) - r = 1; - else { + e2 = gd_entry(D, "data", &e); +#ifdef USE_GZIP + CHECKI(e2, 0); + if (e2 == 0) { CHECKI(e.field_type, GD_RAW_ENTRY); CHECKI(e.fragment_index, 0); CHECKI(e.EN(raw,spf), 2); CHECKI(e.EN(raw,data_type), GD_UINT8); gd_free_entry_strings(&e); } +#else + CHECKI(e2, -1); +#endif gd_close(D); + unlink_data = unlink(data); - if (unlink(data)) { - perror("unlink"); - r = 1; - } +#ifdef USE_GZIP + CHECKI(unlink_data, 0); + CHECKI(e1, GD_E_OK); +#else + CHECKI(unlink_data, -1); + CHECKI(e1, GD_E_UNSUPPORTED); +#endif + unlink(format); rmdir(filedir); - CHECKI(error, GD_E_OK); return r; #endif } Modified: trunk/getdata/test/gzip_get_put.c =================================================================== --- trunk/getdata/test/gzip_get_put.c 2011-11-06 08:39:54 UTC (rev 613) +++ trunk/getdata/test/gzip_get_put.c 2011-11-08 04:56:06 UTC (rev 614) @@ -82,7 +82,7 @@ }; uint8_t b, c[8], d[8]; char command[4096]; - int fd, i, m, n, e1, e2, r = 0; + int fd, i, m, n, e1, e2, unlink_data, unlink_datagz, r = 0; DIRFILE *D; memset(c, 0, 8); @@ -100,7 +100,11 @@ write(fd, gzdata, 279); close(fd); +#ifdef USE_GZIP D = gd_open(filedir, GD_RDWR | GD_GZIP_ENCODED | GD_VERBOSE); +#else + D = gd_open(filedir, GD_RDWR | GD_GZIP_ENCODED); +#endif n = gd_getdata(D, "data", 5, 0, 1, 0, GD_UINT8, c); e1 = gd_error(D); m = gd_putdata(D, "data", 5, 0, 1, 0, GD_UINT8, d); @@ -108,6 +112,7 @@ gd_close(D); +#ifdef USE_GZIP /* uncompress */ snprintf(command, 4096, "%s -f %s > /dev/null", GUNZIP, data); if (gd_system(command)) { @@ -130,15 +135,28 @@ for (i = 0; i < 8; ++i) CHECKIi(i, c[i], 40 + i); +#endif - unlink(data); + unlink_data = unlink(data); + unlink_datagz = unlink(data_gz); unlink(format); rmdir(filedir); +#ifdef USE_GZIP + CHECKI(unlink_data, 0); + CHECKI(unlink_datagz, -1); CHECKI(e1, GD_E_OK); CHECKI(e2, GD_E_OK); CHECKI(n, 8); CHECKI(m, 8); +#else + CHECKI(unlink_data, -1); + CHECKI(unlink_datagz, 0); + CHECKI(e1, GD_E_UNSUPPORTED); + CHECKI(e2, GD_E_UNSUPPORTED); + CHECKI(n, 0); + CHECKI(m, 0); +#endif return r; #endif Modified: trunk/getdata/test/gzip_move_to.c =================================================================== --- trunk/getdata/test/gzip_move_to.c 2011-11-06 08:39:54 UTC (rev 613) +++ trunk/getdata/test/gzip_move_to.c 2011-11-08 04:56:06 UTC (rev 614) @@ -33,10 +33,14 @@ const char *data_gz = "dirfile/data.gz"; const char *data_raw = "dirfile/data"; const char *format_data = "data RAW UINT8 8\n/ENCODING none\n/ENDIAN little\n"; - uint8_t data_in[256], d; + uint8_t data_in[256]; DIRFILE *D; +#ifdef USE_GZIP + uint8_t d; char command[4096]; - int fd, i, error, r = 0; + int i; +#endif + int fd, error, unlink_raw, unlink_gz, r = 0; struct stat buf; rmdirfile(); @@ -53,18 +57,31 @@ write(fd, data_in, 256); close(fd); +#ifdef USE_GZIP D = gd_open(filedir, GD_RDWR | GD_VERBOSE); +#else + D = gd_open(filedir, GD_RDWR); +#endif gd_alter_encoding(D, GD_GZIP_ENCODED, 0, 1); error = gd_error(D); gd_close(D); +#ifdef USE_GZIP if (stat(data_gz, &buf)) { perror("stat"); r = 1; } CHECKI(stat(data_raw, &buf), -1); +#else + if (stat(data_raw, &buf)) { + perror("stat"); + r = 1; + } + CHECKI(stat(data_gz, &buf), -1); +#endif +#ifdef USE_GZIP /* uncompress */ snprintf(command, 4096, "%s -f %s > /dev/null", GUNZIP, data_gz); if (gd_system(command)) { @@ -81,12 +98,22 @@ close(fd); } } +#endif - unlink(data_raw); + unlink_raw = unlink(data_raw); + unlink_gz = unlink(data_gz); unlink(format); rmdir(filedir); - CHECKI(error, 0); +#ifdef USE_GZIP + CHECKI(unlink_raw, -1); + CHECKI(unlink_gz, 0); + CHECKI(error, GD_E_OK); +#else + CHECKI(unlink_raw, 0); + CHECKI(unlink_gz, -1); + CHECKI(error, GD_E_UNSUPPORTED); +#endif return r; } Modified: trunk/getdata/test/gzip_put.c =================================================================== --- trunk/getdata/test/gzip_put.c 2011-11-06 08:39:54 UTC (rev 613) +++ trunk/getdata/test/gzip_put.c 2011-11-08 04:56:06 UTC (rev 614) @@ -43,10 +43,13 @@ const char *data_gz = "dirfile/data.gz"; const char *data = "dirfile/data"; const char *format_data = "data RAW UINT8 8\n"; - uint8_t c[8], d; + uint8_t c[8]; +#ifdef USE_GZIP char command[4096]; + uint8_t d; +#endif struct stat buf; - int fd, i, n, error, r = 0; + int fd, i, n, error, stat_data, unlink_data, unlink_datagz, r = 0; DIRFILE *D; memset(c, 0, 8); @@ -60,17 +63,27 @@ write(fd, format_data, strlen(format_data)); close(fd); +#ifdef USE_GZIP D = gd_open(filedir, GD_RDWR | GD_GZIP_ENCODED | GD_VERBOSE); +#else + D = gd_open(filedir, GD_RDWR | GD_GZIP_ENCODED); +#endif n = gd_putdata(D, "data", 5, 0, 1, 0, GD_UINT8, c); error = gd_error(D); gd_close(D); - if (stat(data_gz, &buf)) { + stat_data = stat(data_gz, &buf); +#ifdef USE_GZIP + if (stat_data) { perror("stat"); - r = 1; } + CHECKI(stat_data, 0); +#else + CHECKI(stat_data, -1); +#endif +#ifdef USE_GZIP /* uncompress */ snprintf(command, 4096, "%s -f %s > /dev/null", GUNZIP, data); if (gd_system(command)) { @@ -90,13 +103,24 @@ close(fd); } } +#endif - unlink(data); + unlink_datagz = unlink(data_gz); + unlink_data = unlink(data); unlink(format); rmdir(filedir); +#ifdef USE_GZIP + CHECKI(unlink_datagz, 0); + CHECKI(unlink_data, -1); CHECKI(error, GD_E_OK); CHECKI(n, 8); +#else + CHECKI(unlink_datagz, -1); + CHECKI(unlink_data, -1); + CHECKI(error, GD_E_UNSUPPORTED); + CHECKI(n, 0); +#endif return r; #endif Modified: trunk/getdata/test/gzip_put_get.c =================================================================== --- trunk/getdata/test/gzip_put_get.c 2011-11-06 08:39:54 UTC (rev 613) +++ trunk/getdata/test/gzip_put_get.c 2011-11-08 04:56:06 UTC (rev 614) @@ -43,7 +43,7 @@ const char *data = "dirfile/data.gz"; const char *format_data = "data RAW UINT8 8\n"; uint8_t c[8], d[8]; - int fd, i, m, n, e1, e2, r = 0; + int fd, i, m, n, e1, e2, unlink_data, r = 0; DIRFILE *D; memset(c, 0, 8); @@ -57,7 +57,11 @@ write(fd, format_data, strlen(format_data)); close(fd); +#ifdef USE_GZIP D = gd_open(filedir, GD_RDWR | GD_GZIP_ENCODED | GD_VERBOSE); +#else + D = gd_open(filedir, GD_RDWR | GD_GZIP_ENCODED); +#endif n = gd_putdata(D, "data", 5, 0, 1, 0, GD_UINT8, c); e1 = gd_error(D); m = gd_getdata(D, "data", 5, 0, 1, 0, GD_UINT8, d); @@ -65,14 +69,23 @@ gd_close(D); - unlink(data); + unlink_data = unlink(data); unlink(format); rmdir(filedir); +#ifdef USE_GZIP + CHECKI(unlink_data, 0); CHECKI(e1, GD_E_OK); CHECKI(e2, GD_E_OK); CHECKI(n, 8); CHECKI(m, 8); +#else + CHECKI(unlink_data, -1); + CHECKI(e1, GD_E_UNSUPPORTED); + CHECKI(e2, GD_E_UNSUPPORTED); + CHECKI(n, 0); + CHECKI(m, 0); +#endif for (i = 0; i < m; ++i) CHECKIi(i, d[i], c[i]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-06 08:40:00
|
Revision: 613 http://getdata.svn.sourceforge.net/getdata/?rev=613&view=rev Author: ketiltrout Date: 2011-11-06 08:39:54 +0000 (Sun, 06 Nov 2011) Log Message: ----------- MSVCRT fixes. Modified Paths: -------------- trunk/getdata/src/ascii.c trunk/getdata/src/entry.c trunk/getdata/src/sie.c trunk/getdata/test/gzip_get_put.c trunk/getdata/test/seek64.c trunk/getdata/test/tell64.c Modified: trunk/getdata/src/ascii.c =================================================================== --- trunk/getdata/src/ascii.c 2011-11-05 22:52:00 UTC (rev 612) +++ trunk/getdata/src/ascii.c 2011-11-06 08:39:54 UTC (rev 613) @@ -342,8 +342,10 @@ ret = fflush((FILE *)file->edata); +#ifndef __MSVCRT__ if (!ret) ret = fsync(fileno((FILE *)file->edata)); +#endif dreturn("%i", ret); return ret; Modified: trunk/getdata/src/entry.c =================================================================== --- trunk/getdata/src/entry.c 2011-11-05 22:52:00 UTC (rev 612) +++ trunk/getdata/src/entry.c 2011-11-06 08:39:54 UTC (rev 613) @@ -318,13 +318,13 @@ } } - filename = _GD_MakeFullPath(D, D->fragment[E->fragment_index].dirfd, - E->e->u.raw.file->name); + filename = malloc(strlen(D->name) + strlen(E->e->u.raw.file->name) + 2); if (filename == NULL) { _GD_SetError(D, GD_E_ALLOC, 0, NULL, 0, NULL); dreturn("%p", NULL); return NULL; } + sprintf(filename, "%s/%s", D->name, E->e->u.raw.file->name); dreturn("%p", filename); return filename; Modified: trunk/getdata/src/sie.c =================================================================== --- trunk/getdata/src/sie.c 2011-11-05 22:52:00 UTC (rev 612) +++ trunk/getdata/src/sie.c 2011-11-06 08:39:54 UTC (rev 613) @@ -123,24 +123,16 @@ if (f->swap) f->d[0] = gd_swap64(f->d[0]); - if (ferror(f->fp)) { - dreturn("%i", -2); - return -2; - } else if (n != 1) { - /* ignore short reads, resulting from corrupted files .. go back to - * the last good record */ - fseek(f->fp, -n, SEEK_CUR); - /* and restore it */ - memcpy(f->d, p, 3 * sizeof(int64_t)); - f->s = f->d[0]; - f->p = f->d[0] + 1; - dreturn("%i", -1); - return -1; - } else if (feof(f->fp)) { - f->s = f->d[0]; - f->p = f->d[0] + 1; - dreturn("%i", -1); - return -1; + if (n != 1) { + if (ferror(f->fp)) { + dreturn("%i", -2); + return -2; + } else { + f->s = f->d[0]; + f->p = f->d[0] + 1; + dreturn("%i", -1); + return -1; + } } f->s = f->p = p[0] + 1; @@ -190,11 +182,14 @@ /* back up and update the file */ fseek(f->fp, -size, SEEK_CUR); fwrite(f->d, size, 1, f->fp); + /* The MSVCRT's stdio seems to screw up without the following: */ + fflush(f->fp); } else { /* add a new record */ f->d[0] = sample; f->d[1] = f->d[2] = 0; fwrite(f->d, size, 1, f->fp); + fflush(f->fp); } f->s = sample; } Modified: trunk/getdata/test/gzip_get_put.c =================================================================== --- trunk/getdata/test/gzip_get_put.c 2011-11-05 22:52:00 UTC (rev 612) +++ trunk/getdata/test/gzip_get_put.c 2011-11-06 08:39:54 UTC (rev 613) @@ -96,7 +96,7 @@ write(fd, format_data, strlen(format_data)); close(fd); - fd = open(data_gz, O_CREAT | O_EXCL | O_WRONLY, 0666); + fd = open(data_gz, O_CREAT | O_EXCL | O_WRONLY | O_BINARY, 0666); write(fd, gzdata, 279); close(fd); Modified: trunk/getdata/test/seek64.c =================================================================== --- trunk/getdata/test/seek64.c 2011-11-05 22:52:00 UTC (rev 612) +++ trunk/getdata/test/seek64.c 2011-11-06 08:39:54 UTC (rev 613) @@ -19,6 +19,8 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* gd_seek() */ +#define _LARGEFILE64_SOURCE 1 + #include "test.h" #include <stdlib.h> Modified: trunk/getdata/test/tell64.c =================================================================== --- trunk/getdata/test/tell64.c 2011-11-05 22:52:00 UTC (rev 612) +++ trunk/getdata/test/tell64.c 2011-11-06 08:39:54 UTC (rev 613) @@ -19,6 +19,8 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* gd_tell() */ +#define _LARGEFILE64_SOURCE 1 + #include "test.h" #include <stdlib.h> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-05 22:52:07
|
Revision: 612 http://getdata.svn.sourceforge.net/getdata/?rev=612&view=rev Author: ketiltrout Date: 2011-11-05 22:52:00 +0000 (Sat, 05 Nov 2011) Log Message: ----------- Cygwin. Modified Paths: -------------- trunk/getdata/configure.ac trunk/getdata/src/internal.h Modified: trunk/getdata/configure.ac =================================================================== --- trunk/getdata/configure.ac 2011-11-05 00:53:18 UTC (rev 611) +++ trunk/getdata/configure.ac 2011-11-05 22:52:00 UTC (rev 612) @@ -661,9 +661,9 @@ AC_CHECK_FUNCS([_chsize _chsize_s _commit fchmod _fdopen fdopendir fseeko \ fseeko64 _fstat fstat64 _fstat64 fstatat fstatat64 fsync \ ftello ftello64 ftruncate ftruncate64 getcwd _getcwd getdelim \ - gmtime_r _lseeki64 lstat _mkdir nan _open openat _read \ - renameat _rmdir _snprintf stat64 _stat64 _strtoi64 strtoll \ - _strtoui64 strtoull _unlink unlinkat _write]) + gmtime_r lseek64 _lseeki64 lstat _mkdir nan _open openat _read \ + renameat _rmdir snprintf _snprintf stat64 _stat64 _strtoi64 \ + strtoll _strtoui64 strtoull _unlink unlinkat _write]) if test "x$disable_c99" = "xno"; then AC_CHECK_FUNCS([cabs]) fi Modified: trunk/getdata/src/internal.h =================================================================== --- trunk/getdata/src/internal.h 2011-11-05 00:53:18 UTC (rev 611) +++ trunk/getdata/src/internal.h 2011-11-05 22:52:00 UTC (rev 612) @@ -49,6 +49,9 @@ typedef int mode_t; #endif +#ifndef HAVE_OFF64_T +typedef off_t off64_t; +#endif #ifdef _MSC_VER /* missing in sys/stat.h */ @@ -61,10 +64,6 @@ #define GD_NO_DIR_OPEN #endif -#ifdef __APPLE__ -typedef off_t off64_t; -#endif - #ifdef GD_NO_C99_API # define GD_DCOMPLEXP_t double * # define GD_DCOMPLEXA(v) double v[2] @@ -225,8 +224,10 @@ # define gd_getcwd getcwd #endif -#ifdef HAVE__SNPRINTF -# define snprintf _snprintf +#ifndef HAVE_SNPRINTF +# ifdef HAVE__SNPRINTF +# define snprintf _snprintf +# endif #endif #ifndef HAVE_FTELLO64 @@ -270,8 +271,12 @@ struct tm *gmtime_r(const time_t *timep, struct tm *result); #endif -#ifdef HAVE__LSEEKI64 -#define lseek64 (off64_t)_lseeki64 +#ifndef HAVE_LSEEK64 +# ifdef HAVE__LSEEKI64 +# define lseek64 (off64_t)_lseeki64 +# else +# define lseek64 (off64_t)lseek +# endif #endif #ifdef MKDIR_NO_MODE @@ -624,14 +629,6 @@ #define BUFFER_SIZE 9000000 -#ifndef HAVE_OFF64_T -# ifndef __APPLE__ -typedef off_t off64_t; -# endif -# define lseek64 lseek -# define stat64 stat -#endif - /* helper macro */ #if defined ARM_ENDIAN_FLOATS || \ ((defined WORDS_BIGENDIAN) ^ (defined FLOATS_BIGENDIAN)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ket...@us...> - 2011-11-05 00:53:24
|
Revision: 611 http://getdata.svn.sourceforge.net/getdata/?rev=611&view=rev Author: ketiltrout Date: 2011-11-05 00:53:18 +0000 (Sat, 05 Nov 2011) Log Message: ----------- --enable-modules fixes Modified Paths: -------------- trunk/getdata/src/encoding.c Modified: trunk/getdata/src/encoding.c =================================================================== --- trunk/getdata/src/encoding.c 2011-11-05 00:43:40 UTC (rev 610) +++ trunk/getdata/src/encoding.c 2011-11-05 00:53:18 UTC (rev 611) @@ -43,7 +43,7 @@ #endif /* encoding schemas */ -#define GD_EF_NULL_SET NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \ +#define GD_EF_NULL_SET NULL, NULL, NULL, NULL, NULL, NULL, NULL, \ &_GD_GenericMove, &_GD_GenericUnlink #ifdef USE_MODULES #define GD_EXT_ENCODING(sc,ex,ec,af,ff) \ @@ -76,7 +76,7 @@ #ifdef USE_BZIP2 #define GD_EF_PROVIDES \ - GD_EF_OPEN | GD_EF_CLOSE | GD_EF_SEEK | GD_EF_READ | GD_EF_SIZE, + GD_EF_OPEN | GD_EF_CLOSE | GD_EF_SEEK | GD_EF_READ | GD_EF_SIZE #define GD_INT_FUNCS \ &_GD_Bzip2Open, &_GD_Bzip2Close, &_GD_Bzip2Seek, &_GD_Bzip2Read, \ &_GD_Bzip2Size, NULL /* WRITE */, NULL /* SYNC */, &_GD_GenericMove, \ @@ -92,7 +92,7 @@ #ifdef USE_SLIM #define GD_EF_PROVIDES \ - GD_EF_OPEN | GD_EF_CLOSE | GD_EF_SEEK | GD_EF_READ | GD_EF_SIZE, + GD_EF_OPEN | GD_EF_CLOSE | GD_EF_SEEK | GD_EF_READ | GD_EF_SIZE #define GD_INT_FUNCS \ &_GD_SlimOpen, &_GD_SlimClose, &_GD_SlimSeek, &_GD_SlimRead, &_GD_SlimSize, \ NULL /* WRITE */, NULL /* SYNC */, &_GD_GenericMove, &_GD_GenericUnlink @@ -107,7 +107,7 @@ #ifdef USE_LZMA #define GD_EF_PROVIDES \ - GD_EF_OPEN | GD_EF_CLOSE | GD_EF_SEEK | GD_EF_READ | GD_EF_SIZE, + GD_EF_OPEN | GD_EF_CLOSE | GD_EF_SEEK | GD_EF_READ | GD_EF_SIZE #define GD_INT_FUNCS \ &_GD_LzmaOpen, &_GD_LzmaClose, &_GD_LzmaSeek, &_GD_LzmaRead, &_GD_LzmaSize, \ NULL /* WRITE */, NULL /* SYNC */, &_GD_GenericMove, &_GD_GenericUnlink @@ -230,37 +230,29 @@ /* Try to resolve the symbols */ if (_gd_ef[encoding].provides & GD_EF_OPEN) - _gd_ef[encoding].open = (int (*)(int, struct _gd_raw_file*, int, - int))_GD_ResolveSymbol(lib, _gd_ef + encoding, "Open"); + _gd_ef[encoding].open = (gd_ef_open_t)_GD_ResolveSymbol(lib, + _gd_ef + encoding, "Open"); if (_gd_ef[encoding].provides & GD_EF_CLOSE) - _gd_ef[encoding].close = - (int (*)(struct _gd_raw_file*))_GD_ResolveSymbol(lib, _gd_ef + encoding, - "Close"); + _gd_ef[encoding].close = (gd_ef_close_t)_GD_ResolveSymbol(lib, + _gd_ef + encoding, "Close"); if (_gd_ef[encoding].provides & GD_EF_SEEK) - _gd_ef[encoding].seek = (off64_t (*)(struct _gd_raw_file*, off64_t, - gd_type_t, int))_GD_ResolveSymbol(lib, _gd_ef + encoding, "Seek"); + _gd_ef[encoding].seek = (gd_ef_seek_t)_GD_ResolveSymbol(lib, + _gd_ef + encoding, "Seek"); if (_gd_ef[encoding].provides & GD_EF_READ) - _gd_ef[encoding].read = (ssize_t (*)(struct _gd_raw_file*, void*, - gd_type_t, size_t))_GD_ResolveSymbol(lib, _gd_ef + encoding, - "Read"); + _gd_ef[encoding].read = (gd_ef_read_t)_GD_ResolveSymbol(lib, + _gd_ef + encoding, "Read"); if (_gd_ef[encoding].provides & GD_EF_SIZE) - _gd_ef[encoding].size = (off64_t (*)(int, struct _gd_raw_file*, - gd_type_t))_GD_ResolveSymbol(lib, _gd_ef + encoding, "Size"); + _gd_ef[encoding].size = (gd_ef_size_t)_GD_ResolveSymbol(lib, + _gd_ef + encoding, "Size"); if (_gd_ef[encoding].provides & GD_EF_WRITE) - _gd_ef[encoding].write = (ssize_t (*)(struct _gd_raw_file*, const void*, - gd_type_t, size_t))_GD_ResolveSymbol(lib, _gd_ef + encoding, - "Write"); + _gd_ef[encoding].write = (gd_ef_write_t)_GD_ResolveSymbol(lib, + _gd_ef + encoding, "Write"); if (_gd_ef[encoding].provides & GD_EF_SYNC) - _gd_ef[encoding].sync = - (int (*)(struct _gd_raw_file*))_GD_ResolveSymbol(lib, _gd_ef + encoding, - "Sync"); + _gd_ef[encoding].sync = (gd_ef_sync_t)_GD_ResolveSymbol(lib, + _gd_ef + encoding, "Sync"); if (_gd_ef[encoding].provides & GD_EF_UNLINK) - _gd_ef[encoding].unlink = (int (*)(int, - struct _gd_raw_file*))_GD_ResolveSymbol(lib, _gd_ef + encoding, - "Unlink"); - if (_gd_ef[encoding].provides & GD_EF_TEMP) - _gd_ef[encoding].temp = (int (*)(int, int, struct _gd_raw_file*, int, - int))_GD_ResolveSymbol(lib, _gd_ef + encoding, "Temp"); + _gd_ef[encoding].unlink = (gd_ef_unlink_t)_GD_ResolveSymbol(lib, + _gd_ef + encoding, "Unlink"); /* we tried our best, don't bother trying again */ _gd_ef[encoding].provides = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |