As for the (SMSHeader *) cast, it is only there because I was trying to see if it would help, but didn't. I guess it isn't doing anything.
Here is GetSmsHeader:
Code:
int GetSmsHeader (char *pChFileName, SMSHeader **ppSmsHeader,
FILE **ppSmsFile)
{
int iHeadBSize, iRecordBSize, nRecords;
int iMagicNumber;
/* open file for reading */
if ((*ppSmsFile = fopen (pChFileName, "r")) == NULL)
return (SMS_NOPEN);
/* read magic number */
if (fread ((void *) &iMagicNumber, (size_t) sizeof(int), (size_t)1,
*ppSmsFile) < (size_t)1)
return (SMS_RDERR);
if (iMagicNumber != SMS_MAGIC)
return (SMS_NSMS);
/* read size of of header */
if (fread ((void *) &iHeadBSize, (size_t) sizeof(int), (size_t)1,
*ppSmsFile) < (size_t)1)
return (SMS_RDERR);
if (iHeadBSize <= 0)
return (SMS_RDERR);
/* read number of data Records */
if (fread ((void *) &nRecords, (size_t) sizeof(int), (size_t)1,
*ppSmsFile) < (size_t)1)
return (SMS_RDERR);
if (nRecords <= 0)
return (SMS_RDERR);
/* read size of data Records */
if (fread ((void *) &iRecordBSize, (size_t) sizeof(int), (size_t)1,
*ppSmsFile) < (size_t)1)
return (SMS_RDERR);
if (iRecordBSize <= 0)
return (SMS_RDERR);
/* allocate memory for header */
if (((*ppSmsHeader) = (SMSHeader *)malloc (iHeadBSize)) == NULL)
return (SMS_MALLOC);
/* read header */
rewind (*ppSmsFile);
if (fread ((void *) (*ppSmsHeader), 1, iHeadBSize, *ppSmsFile) < iHeadBSize)
return (SMS_RDERR);
/* set pointers to variable part of header */
if ((*ppSmsHeader)->nLoopRecords > 0)
(*ppSmsHeader)->pILoopRecords = (int *) ((char *)(*ppSmsHeader) +
sizeof(SMSHeader));
if ((*ppSmsHeader)->nSpecEnvelopePoints > 0)
(*ppSmsHeader)->pFSpectralEnvelope =
(float *) ((char *)(*ppSmsHeader) + sizeof(SMSHeader) +
sizeof(int) * (*ppSmsHeader)->nLoopRecords);
if ((*ppSmsHeader)->nTextCharacters > 0)
(*ppSmsHeader)->pChTextCharacters =
(char *) ((char *)(*ppSmsHeader) + sizeof(SMSHeader) +
sizeof(int) * (*ppSmsHeader)->nLoopRecords +
sizeof(float) * (*ppSmsHeader)->nSpecEnvelopePoints);
return (SMS_OK);
}
I will admit that I am not sure why a double pointer is used, but that is how the code was handed to me. I'm not sure I understand what you wrote about modifying the local variable; the local variable is a pointer to the structure.
thanks for the help,
Rich