blob: 25fe1131c1304901f3168c14fc24a4fe3599b843 [file] [log] [blame]
/*
* Routines specific to AIF structure objects.
*
* Copyright (c) 1996-2002 by Guardsoft Pty Ltd.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /* HAVE_CONFIG_H */
#include <stdio.h>
#ifndef WIN32
#include <unistd.h>
#endif /* !WIN32 */
#include "aif.h"
#include "aifint.h"
#include "aiferr.h"
int
AIFNumFields(AIF *a)
{
if ( a == (AIF *)NULL )
{
SetAIFError(AIFERR_BADARG, NULL);
return -1;
}
if ( AIFType(a) != AIF_STRUCT )
{
SetAIFError(AIFERR_TYPE, NULL);
return -1;
}
return FDSNumFields(AIF_FORMAT(a));
}
int
AIFFieldType(AIF *a, char *name)
{
int ret;
char * type;
if ( a == (AIF *)NULL )
{
SetAIFError(AIFERR_BADARG, NULL);
return AIF_INVALID;
}
if ( AIFType(a) != AIF_STRUCT )
{
SetAIFError(AIFERR_TYPE, NULL);
return AIF_INVALID;
}
if ( FDSStructFieldByName(AIF_FORMAT(a), name, &type) < 0 )
{
SetAIFError(AIFERR_FDS, NULL);
return AIF_INVALID;
}
ret = FDSType(type);
_aif_free(type);
return ret;
}
int
AIFFieldToInt(AIF *a, char *name, int *val)
{
AIFLONGEST l;
if ( AIFFieldToLongest(a, name, &l) < 0 )
return -1;
*val = (int)l; /* potential loss of precision */
return 0;
}
/*XXX
* AIFFieldToLongest() and AIFFieldToDoublest() are broken because of the
* new structure format. We need to add AIFField().
*/
int
AIFFieldToLongest(AIF *a, char *name, AIFLONGEST *val)
{
char * type;
if ( a == (AIF *)NULL || name == NULL )
{
SetAIFError(AIFERR_BADARG, NULL);
return -1;
}
if ( AIFType(a) != AIF_STRUCT )
{
SetAIFError(AIFERR_TYPE, NULL);
return -1;
}
if ( name != NULL )
{
if ( FDSStructFieldByName(AIF_FORMAT(a), name, &type) < 0 )
{
SetAIFError(AIFERR_FDS, NULL);
return -1;
}
if ( FDSType(type) != AIF_INTEGER )
{
SetAIFError(AIFERR_TYPE, NULL);
return -1;
}
}
/* return _aif_to_longest(AIF_DATA(a) + off, size, val);*/
return 0;
}
int
AIFFieldToDouble(AIF *a, char *name, double *val)
{
AIFDOUBLEST d;
if ( AIFFieldToDoublest(a, name, &d) < 0 )
return -1;
*val = (double)d; /* possible loss of precision */
return 0;
}
/*XXX*/
int
AIFFieldToDoublest(AIF *a, char *name, AIFDOUBLEST *val)
{
char * type;
if ( a == (AIF *)NULL || name == NULL )
{
SetAIFError(AIFERR_BADARG, NULL);
return -1;
}
if ( AIFType(a) != AIF_STRUCT )
{
SetAIFError(AIFERR_TYPE, NULL);
return -1;
}
if ( name != NULL )
{
if ( FDSStructFieldByName(AIF_FORMAT(a), name, &type) < 0 )
{
SetAIFError(AIFERR_FDS, NULL);
return -1;
}
if ( FDSType(type) != AIF_FLOATING )
{
SetAIFError(AIFERR_TYPE, NULL);
return -1;
}
}
/* return _aif_to_doublest(AIF_DATA(a) + off, size, val);*/
return 0;
}