This is smsIO.c in view mode; [Download] [Up]
#include "../sms.h"
#define READMODE "rb"
#define WRITEMODE "wb"
/* initialize the header structure
*
* SMSHeader *pSmsHeader header for SMS file
*/
int initSmsHeader (SMSHeader *pSmsHeader)
{
pSmsHeader->iSmsMagic = SMS_MAGIC;
pSmsHeader->iHeadBSize = sizeof(SMSHeader);
pSmsHeader->nRecords = 0;
pSmsHeader->iRecordBSize = 0;
pSmsHeader->iFormat = FORMAT_HARMONIC;
pSmsHeader->iFrameRate = 0;
pSmsHeader->iStochasticType = STOC_FILTER_TYPE;
pSmsHeader->nTrajectories = 0;
pSmsHeader->nStochasticCoeff = 0;
pSmsHeader->fAmplitude = 0;
pSmsHeader->fFrequency = 0;
pSmsHeader->iBegSteadyState = 0;
pSmsHeader->iEndSteadyState = 0;
pSmsHeader->fResidualPerc = 0;
pSmsHeader->nLoopRecords = 0;
pSmsHeader->nSpecEnvelopePoints = 0;
pSmsHeader->nTextCharacters = 0;
pSmsHeader->pILoopRecords = NULL;
pSmsHeader->pFSpectralEnvelope = NULL;
pSmsHeader->pChTextCharacters = NULL;
pSmsHeader->pChDataRecords = NULL;
return (1);
}
/* write SMS header and data to file
*
* char *pChFileName file name for SMS file
* SMSHeader *pSmsHeader header for SMS file
*/
int writeSmsFile (char *pChFileName, SMSHeader *pSmsHeader)
{
FILE *pOutputFile;
int iVariableSize = 0;
if (pSmsHeader->iSmsMagic != SMS_MAGIC)
return(SMS_NSMS);
if ((pOutputFile = fopen(pChFileName, WRITEMODE)) == NULL)
return(SMS_NOPEN);
/* check variable size of header */
iVariableSize = sizeof (int) * pSmsHeader->nLoopRecords +
sizeof (float) * pSmsHeader->nSpecEnvelopePoints +
sizeof(char) * pSmsHeader->nTextCharacters;
pSmsHeader->iHeadBSize = sizeof(SMSHeader) + iVariableSize;
/* write header */
if (fwrite((void *)pSmsHeader, (size_t)1, (size_t)sizeof(SMSHeader),
pOutputFile) < (size_t)sizeof(SMSHeader))
quit ("Error: Cannot write SMS header");
/* write variable part of header */
if (pSmsHeader->nLoopRecords > 0)
{
char *pChStart = (char *) pSmsHeader->pILoopRecords;
int iSize = sizeof (int) * pSmsHeader->nLoopRecords;
if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pOutputFile) <
(size_t)iSize)
quit ("Error: Cannot write SMS header");
}
if (pSmsHeader->nSpecEnvelopePoints > 0)
{
char *pChStart = (char *) pSmsHeader->pFSpectralEnvelope;
int iSize = sizeof (float) * pSmsHeader->nSpecEnvelopePoints;
if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pOutputFile) <
(size_t)iSize)
quit ("Error: Cannot write SMS header");
}
if (pSmsHeader->nTextCharacters > 0)
{
char *pChStart = (char *) pSmsHeader->pChTextCharacters;
int iSize = sizeof(char) * pSmsHeader->nTextCharacters;
if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pOutputFile) <
(size_t)iSize)
quit ("Error: Cannot write SMS header");
}
/* write records */
if (pSmsHeader->iRecordBSize <= 0 ||
pSmsHeader->nRecords <= 0 ||
pSmsHeader->iHeadBSize <= 0)
quit ("Error: Cannot write data records");
else
{
char *pChStart = (char *) pSmsHeader->pChDataRecords;
int iSize = pSmsHeader->iRecordBSize * pSmsHeader->nRecords;
if (fwrite ((void *)pChStart, (size_t)1, (size_t)iSize, pOutputFile) <
(size_t)iSize)
quit ("Error: Cannot write data records");
}
fclose(pOutputFile);
return (SMS_OK);
}
/* function to read SMS header and data
* char *pChFileName; file name for SMS file
* SMSHeader **ppSmsHeader; SMS header
*
* returns SMS_NOPEN if can't open
* SMS_NSMS if not a SMS file
* SMS_RDERR if reads fail
* SMS_MALLOC if can't get memory
* SMS_OK otherwise
*/
int readSmsFile (char *pChFileName, SMSHeader **ppSmsHeader)
{
FILE *pInputFile;
int iHeadBSize, iRecordBSize, nRecords;
int iMagicNumber, iSize;
if ((pInputFile = fopen(pChFileName, READMODE)) == NULL)
return (SMS_NOPEN);
if (fread ((void *) &iMagicNumber, (size_t) sizeof(int), (size_t)1,
pInputFile) < (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,
pInputFile) < (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,
pInputFile) < (size_t)1)
return (SMS_RDERR);
if (nRecords <= 0)
return (SMS_RDERR);
if (fread ((void *) &iRecordBSize, (size_t) sizeof(int), (size_t)1,
pInputFile) < (size_t)1)
return (SMS_RDERR);
if (iRecordBSize <= 0)
return (SMS_RDERR);
/* allocate virtual memory for file */
if (((*ppSmsHeader) =
(SMSHeader *)malloc ((size_t)(iHeadBSize+
(iRecordBSize * nRecords)))) == NULL)
return (SMS_MALLOC);
/* read header plus data */
rewind (pInputFile);
iSize = iHeadBSize + iRecordBSize * nRecords;
if (fread ((void *) (*ppSmsHeader), (size_t)1, (size_t) iSize,
pInputFile) < iSize)
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);
(*ppSmsHeader)->pChDataRecords =
(char *) ((char *)(*ppSmsHeader) + sizeof(SMSHeader) +
sizeof(int) * (*ppSmsHeader)->nLoopRecords +
sizeof(float) * (*ppSmsHeader)->nSpecEnvelopePoints +
sizeof(char) * (*ppSmsHeader)->nTextCharacters);
return (SMS_OK);
}
/* function return the size in bytes of the record in a SMS file
* SMSHeader *pSmsHeader; pointer to SMS header
*/
int getRecordBSize (SMSHeader *pSmsHeader)
{
int iSize = 0, nGain = 1, nComp = 2;
if (pSmsHeader->iStochasticType == STOC_NONE)
nGain = 0;
if (pSmsHeader->iFormat == FORMAT_HARMONIC_WITH_PHASE ||
pSmsHeader->iFormat == FORMAT_INHARMONIC_WITH_PHASE)
nComp = 3;
iSize = sizeof (float) * (nComp * pSmsHeader->nTrajectories +
pSmsHeader->nStochasticCoeff + nGain);
return(iSize);
}
/* set the pointers of the SMS data to the right places in a record
*
*/
int setSmsRecord (SMSHeader *pSmsHeader, char *pData, SMS_DATA *pSmsData)
{
int iOffset = 0;
if ((pData + pSmsHeader->iRecordBSize) >
(char *) pSmsHeader->pChDataRecords +
((pSmsHeader->nRecords + 1) * pSmsHeader->iRecordBSize))
return (SMS_WRERR);
pSmsData->nTraj = pSmsHeader->nTrajectories;
pSmsData->nCoeff = pSmsHeader->nStochasticCoeff;
pSmsData->pFFreqTraj = (float *) pData;
iOffset += sizeof(float) * pSmsData->nTraj;
pSmsData->pFMagTraj = (float *) (pData + iOffset);
iOffset += sizeof(float) * pSmsData->nTraj;
if (pSmsHeader->iFormat == FORMAT_HARMONIC_WITH_PHASE ||
pSmsHeader->iFormat == FORMAT_INHARMONIC_WITH_PHASE)
{
pSmsData->pFPhaTraj = (float *) (pData + iOffset);
iOffset += sizeof(float) * pSmsData->nTraj;
}
else
pSmsData->pFPhaTraj = NULL;
if (pSmsData->nCoeff > 0)
{
pSmsData->pFStocCoeff = (float *)(pData + iOffset);
iOffset += sizeof(float) * pSmsData->nCoeff;
pSmsData->pFStocGain = (float *)(pData + iOffset);
}
else
{
pSmsData->pFStocCoeff = NULL;
pSmsData->pFStocGain = NULL;
}
return (SMS_OK);
}
int quit (char *pChText)
{
fprintf (stderr, pChText);
fprintf (stderr, "\n");
exit (1);
return (1);
} These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.