- Port to SL-5
SKIPPED: psi/tecs/make_crv
This commit is contained in:
107
nxxml.c
107
nxxml.c
@@ -31,6 +31,7 @@
|
||||
|
||||
extern void *NXpData;
|
||||
|
||||
char *nxitrim(char *str); /* from napi.c */
|
||||
|
||||
/*----------------------- our data structures --------------------------
|
||||
One might wonder why a node stack is still needed even if this API
|
||||
@@ -388,28 +389,24 @@ NXstatus NXXmakedata (NXhandle fid,
|
||||
if(dimensions[0] < 0){
|
||||
dimensions[0] = 1;
|
||||
}
|
||||
if ((datatype == NX_CHAR) && (rank > 1)) {
|
||||
NXIReportError(NXpData,"NeXus XML-API does not yet support multi-dimensional character arrays");
|
||||
return NX_ERROR;
|
||||
}
|
||||
|
||||
current = xmlHandle->stack[xmlHandle->stackPointer].current;
|
||||
dataNode = mxmlNewElement(current,name);
|
||||
typestring = buildTypeString(datatype,rank,dimensions);
|
||||
if(typestring != NULL){
|
||||
mxmlElementSetAttr(dataNode,TYPENAME,typestring);
|
||||
free(typestring);
|
||||
} else {
|
||||
NXIReportError(NXpData,"Failed to allocate typestring");
|
||||
return NX_ERROR;
|
||||
}
|
||||
/*
|
||||
NX_CHAR maps to MXML_OPAQUE datasets
|
||||
*/
|
||||
dataNode = mxmlNewElement(current,name);
|
||||
if(datatype == NX_CHAR){
|
||||
newData = mxmlNewOpaque(dataNode,"");
|
||||
return NX_OK;
|
||||
} else {
|
||||
typestring = buildTypeString(datatype,rank,dimensions);
|
||||
if(typestring != NULL){
|
||||
mxmlElementSetAttr(dataNode,TYPENAME,typestring);
|
||||
free(typestring);
|
||||
} else {
|
||||
NXIReportError(NXpData,"Failed to allocate typestring");
|
||||
return NX_ERROR;
|
||||
}
|
||||
newData = (mxml_node_t *)malloc(sizeof(mxml_node_t));
|
||||
if(!newData){
|
||||
NXIReportError(NXpData,"Failed to allocate space for dataset");
|
||||
@@ -458,24 +455,6 @@ static mxml_node_t *searchSDSLinks(pXMLNexus xmlHandle, CONSTCHAR *name){
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
static int strtrimcr(char *szStr, char *szSet)
|
||||
{
|
||||
int i, j; /* Locale counters */
|
||||
|
||||
/*-------------------------------------------------*/
|
||||
|
||||
j = i = strlen(szStr) - 1; /* Find length of string */
|
||||
|
||||
while (strrchr(szSet, szStr[ i ])
|
||||
&& (0 <= i))
|
||||
{
|
||||
/* While string is terminated by one of the specified characters */
|
||||
szStr[ i-- ] = '\0'; /*- Replace character with '\0' */
|
||||
}
|
||||
|
||||
return(j - i); /* Return the difference between old and new length */
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
NXstatus NXXopendata (NXhandle fid, CONSTCHAR *name){
|
||||
pXMLNexus xmlHandle = NULL;
|
||||
@@ -547,7 +526,8 @@ NXstatus NXXputdata (NXhandle fid, void *data){
|
||||
mxml_node_t *userData = NULL;
|
||||
mxml_node_t *current = NULL;
|
||||
pNXDS dataset;
|
||||
int length;
|
||||
int i, length, type, rank, dim[NX_MAXRANK];
|
||||
char *pPtr = NULL;
|
||||
|
||||
xmlHandle = (pXMLNexus)fid;
|
||||
assert(xmlHandle);
|
||||
@@ -562,9 +542,28 @@ NXstatus NXXputdata (NXhandle fid, void *data){
|
||||
assert(userData != NULL);
|
||||
if(userData->type == MXML_OPAQUE){
|
||||
/*
|
||||
text data
|
||||
Text data. We have to make sure that the text is \0 terminated.
|
||||
Some language bindings do not ensure that this is the case.
|
||||
*/
|
||||
mxmlSetOpaque(userData,(const char *)data);
|
||||
if(NXXgetinfo(fid,&rank, dim, &type) == NX_OK){
|
||||
length = 1;
|
||||
for(i=0; i<rank; i++)
|
||||
{
|
||||
length *= dim[i];
|
||||
}
|
||||
pPtr = (char *)malloc((length+1)*sizeof(char));
|
||||
if(pPtr != NULL){
|
||||
memcpy(pPtr,data,length);
|
||||
pPtr[length] = '\0';
|
||||
mxmlSetOpaque(userData,(const char *)pPtr);
|
||||
free(pPtr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
NXIReportError(NXpData,"Unable to determine size of character dataset");
|
||||
return NX_ERROR;
|
||||
}
|
||||
} else {
|
||||
dataset = (pNXDS)userData->value.custom.data;
|
||||
assert(dataset);
|
||||
@@ -579,7 +578,7 @@ NXstatus NXXgetdata (NXhandle fid, void *data){
|
||||
mxml_node_t *userData = NULL;
|
||||
mxml_node_t *current = NULL;
|
||||
pNXDS dataset;
|
||||
int length;
|
||||
int i, length, type, rank, dim[NX_MAXRANK];
|
||||
|
||||
xmlHandle = (pXMLNexus)fid;
|
||||
assert(xmlHandle);
|
||||
@@ -596,7 +595,17 @@ NXstatus NXXgetdata (NXhandle fid, void *data){
|
||||
/*
|
||||
text data
|
||||
*/
|
||||
strcpy((char *)data,userData->value.opaque);
|
||||
if(NXXgetinfo(fid,&rank, dim, &type) == NX_OK){
|
||||
length = 1;
|
||||
for(i=0; i<rank; i++)
|
||||
{
|
||||
length *= dim[i];
|
||||
}
|
||||
strncpy((char *)data,userData->value.opaque,length);
|
||||
} else {
|
||||
strcpy((char *)data,nxitrim(userData->value.opaque));
|
||||
}
|
||||
|
||||
} else {
|
||||
dataset = (pNXDS)userData->value.custom.data;
|
||||
assert(dataset);
|
||||
@@ -613,6 +622,7 @@ NXstatus NXXgetinfo (NXhandle fid, int *rank,
|
||||
mxml_node_t *current = NULL;
|
||||
pNXDS dataset;
|
||||
int myRank, i;
|
||||
const char *attr = NULL;
|
||||
|
||||
xmlHandle = (pXMLNexus)fid;
|
||||
assert(xmlHandle);
|
||||
@@ -629,9 +639,15 @@ NXstatus NXXgetinfo (NXhandle fid, int *rank,
|
||||
/*
|
||||
text data
|
||||
*/
|
||||
*rank = 1;
|
||||
*iType = NX_CHAR;
|
||||
dimension[0]= strlen(userData->value.opaque);
|
||||
attr = mxmlElementGetAttr(current, TYPENAME);
|
||||
if(attr == NULL){
|
||||
*rank = 1;
|
||||
*iType = NX_CHAR;
|
||||
dimension[0]= strlen(userData->value.opaque);
|
||||
} else {
|
||||
analyzeDim(attr,rank,dimension,iType);
|
||||
*iType = NX_CHAR;
|
||||
}
|
||||
} else {
|
||||
dataset = (pNXDS)userData->value.custom.data;
|
||||
assert(dataset);
|
||||
@@ -868,14 +884,18 @@ static NXstatus NXXsetnumberformat(NXhandle fid,
|
||||
/*============================ Attributes ============================*/
|
||||
static char *formatAttributeData(void *data, int datalen, int iType){
|
||||
int intData = 0;
|
||||
long iValue;
|
||||
double dValue;
|
||||
long iValue = -99999;
|
||||
double dValue = -1e38;
|
||||
char type[20];
|
||||
char *number;
|
||||
|
||||
|
||||
if(iType == NX_CHAR){
|
||||
return strdup((char *)data);
|
||||
/* data may not be NULL terminated */
|
||||
number = (char*)malloc((datalen+1) * sizeof(char));
|
||||
memcpy(number, data, datalen * sizeof(char));
|
||||
number[datalen] = '\0';
|
||||
return number;
|
||||
}
|
||||
|
||||
number = (char *)malloc(132*sizeof(char));
|
||||
@@ -1454,7 +1474,7 @@ NXstatus NXXmakelink (NXhandle fid, NXlink* sLink){
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
NXstatus NXXmakenamedlink (NXhandle fid, char *name, NXlink* sLink){
|
||||
NXstatus NXXmakenamedlink (NXhandle fid, CONSTCHAR *name, NXlink* sLink){
|
||||
pXMLNexus xmlHandle = NULL;
|
||||
mxml_node_t *current = NULL, *linkNode = NULL;
|
||||
mxml_node_t *linkedNode = NULL;
|
||||
@@ -1511,6 +1531,7 @@ void NXXassignFunctions(pNexusFunction fHandle){
|
||||
fHandle->nxputslab=NXXputslab;
|
||||
fHandle->nxgetdataID=NXXgetdataID;
|
||||
fHandle->nxmakelink=NXXmakelink;
|
||||
fHandle->nxmakenamedlink=NXXmakenamedlink;
|
||||
fHandle->nxgetdata=NXXgetdata;
|
||||
fHandle->nxgetinfo=NXXgetinfo;
|
||||
fHandle->nxgetnextentry=NXXgetnextentry;
|
||||
|
||||
Reference in New Issue
Block a user