- Port to SL-5

SKIPPED:
	psi/tecs/make_crv
This commit is contained in:
koennecke
2008-01-03 09:56:55 +00:00
parent 64e5c22369
commit 1f862889ce
21 changed files with 912 additions and 517 deletions

107
nxxml.c
View File

@@ -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;