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.