Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add hack to deal with DAP2 signed byte conversion. #1317

Merged
merged 1 commit into from
Feb 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion libdap2/ncd2dispatch.c
Original file line number Diff line number Diff line change
Expand Up @@ -780,11 +780,45 @@ fprintf(stderr,"\n");
}
var->ncid = varid;
if(var->attributes != NULL) {
NCattribute* unsignedatt = NULL;
int unsignedval = 0;
/* See if variable has _Unsigned attribute */
for(j=0;j<nclistlength(var->attributes);j++) {
NCattribute* att = (NCattribute*)nclistget(var->attributes,j);
if(strcmp(att->name,"_Unsigned") == 0) {
char* value = nclistget(att->values,0);
unsignedatt = att;
if(value != NULL) {
if(strcasecmp(value,"false")==0
|| strcmp(value,"0")==0)
unsignedval = 0;
else
unsignedval = 1;
}
break;
}
}
for(j=0;j<nclistlength(var->attributes);j++) {
NCattribute* att = (NCattribute*)nclistget(var->attributes,j);
char* val = NULL;
/* Check for _FillValue/Variable mismatch */
if(strcmp(att->name,"_FillValue")==0) {
if(att->etype != var->etype) {
/* Special case var is byte, fillvalue is int16 and
unsignedattr == 0;
This exception is needed because DAP2 byte type
is equivalent to netcdf ubyte type. So passing
a signed byte thru DAP2 requires some type and
signedness hacking that we have to undo.
*/
if(var->etype == NC_UBYTE
&& att->etype == NC_SHORT
&& unsignedatt != NULL && unsignedval == 0) {
/* Forcibly change the attribute type and signedness */
att->etype = NC_BYTE;
val = nclistremove(unsignedatt->values,0);
if(val) free(val);
nclistpush(unsignedatt->values,strdup("false"));
} else if(att->etype != var->etype) {/* other mismatches */
/* Log a message */
nclog(NCLOGERR,"_FillValue/Variable type mismatch: variable=%s",var->ncbasename);
/* See if mismatch is allowed */
Expand Down
1 change: 1 addition & 0 deletions oc2/ochttp.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ ocfetchurl(CURL* curl, const char* url, NCbytes* buf, long* filetime)
fail:
nclog(NCLOGERR, "curl error: %s", curl_easy_strerror(cstat));
switch (httpcode) {
case 400: stat = OC_EBADURL; break;
case 401: stat = OC_EAUTH; break;
case 404: stat = OC_ENOFILE; break;
case 500: stat = OC_EDAPSVC; break;
Expand Down