/* $Id: SdifFWrite.h,v 3.7 2000/07/18 15:08:35 tisseran Exp $ * * Copyright (c) 1998 by IRCAM - Centre Pompidou * All rights reserved. * * For any information regarding this and other IRCAM software, please * send email to: * manager@ircam.fr * * LIBRARY * SdifFWrite.h * * F : SdifFileT* SdifF, Write : sdif file write (SdifF->Stream) * * * author: Dominique Virolle 1997 * EXAMPLE L'exemple suivant essaye de montrer l'ordonnancement des appels de fonction. Biensûr ce code devrait être plus modulaire. En effet, il devrait y avoir une fonction par niveau structurel d'écriture: une(plus) fonction(s) d'écriture de matrice, une(plus fonction(s) d'écriture de frame...
#include "sdif.h" void main(void) { SdifFileT *SdifF; SdifUInt4 NbMatrix = 3; SdifUInt4 NumID = 0; SdifFloat8 Time = 0.0; SdifFloat4 TabValue[] = {1,2,3,4,5,6,7}; SdifFloat4 *pTabValue; size_t SizeFrameW; size_t SizeMatrixW; pTabValue = TabValue; // pour permettre le cast par pointeur SdifGenInit("SdifTypes.STYP"); SdifF = SdifOpenFile("NewFile.sdif", eWriteFile); // remplir les tables NameValues, MatrixTypesTable, // FrameTypesTable et StreamIDsTable. [ ..... ] // écriture de l'entête SdifFWriteGeneralHeader (SdifF); // écriture des chunks ASCII SdifFWriteAllASCIIChunks (SdifF) // ***FRAME HEADER**** // Mise à jour le l'entête de frame à écrire SdifSetCurrFrameHeader (SdifF, '1FOB', _SdifUnknownSize, NbMatrix, NumID, Time); // écriture de l'entête de frame SizeFrameW = SdifFWriteFrameHeader (SdifF); // ***FIRST MATRIX** // Mise à jour le l'entête de matrice à écrire : 1 ligne, 1 colonne SdifSetCurrMatrixHeader (SdifF, '1FQ0', eFloat4, 1, 1); // écriture de l'entête de frame SizeMatrixW = SdifFWriteMatrixHeader (SdifF); // Mise à jour de la ligne-buffer de SdifF // La largeur des données est conservée par le eFloat4 de l'entête de matrice SdifSetCurrOneRow (SdifF, (void*) pTabValue); // écriture de la ligne SizeMatrixW += SdifFWriteOneRow (SdifF); // Si on a d'autres lignes à écrire alors // on répette SdifSetCurrOneRow et SizeMatrixW += SdifFWriteOneRow... // écriture du Padding en fin de matrice et ajout de la taille de la matrice écrite // à la taile du frame. SizeMatrixW += SdifFWritePadding(SdifF, SdifFPaddingCalculate(SdifF->Stream, SizeMatrixW)) SizeFrameW += SizeMatrixW; // * MATRIX 2 & 3 [. 2 matrices à écrire . .] // pas de padding en fin de frame car on est déjà aligné // la taille écrite ne doit pas compter la signature et la taille===> -8 SizeFrameW -= 8; SdifFUpdateChunkSize(SdifF, SizeFrameW); SdifCloseFile(SdifF); SdifGenKill(); }LOG * $Log: SdifFWrite.h,v $ * Revision 3.7 2000/07/18 15:08:35 tisseran * This release implements the New SDIF Specification (june 1999): * - Name Values Table are written in a 1NVT frame which contains a 1NVT matrix * - Frame and matrix type declaration are written in a 1TYP frame which contains a 1TYP matrix. * - Stream ID are written in a 1IDS frame which contains a 1IDS matrix. * * Read function accept the previous version of the specification (read a text frame without matrix) to be compatible with older SDIF files. * * SdifString.h and SdifString.c implements some string mangement (creation, destruction, append, test of end of string, getc, ungetc). * * WATCH OUT: * We don't care about the old SDIF Specification (_SdifFormatVersion < 3) * To use _SdifFormatVersion < 3, get the previous release. * * Revision 3.6 2000/05/10 15:32:13 schwarz * Added functions to calculate the Size argument for SdifFSetCurrFrameHeader: * SdifSizeOfFrameHeader and SdifSizeOfMatrix * * Revision 3.5 2000/04/11 14:31:57 schwarz * SdifFWriteTextMatrix * * Revision 3.4 2000/03/01 11:19:46 schwarz * Added functions for matrix-wise writing: SdifUpdateFrameHeader, * SdifFWriteMatrixData, SdifFWriteMatrix, SdifFWriteFrameAndOneMatrix * * Revision 3.3 1999/09/28 13:08:56 schwarz * Included #include
size_t
désignant le nombre de bytes qui sépare la
position actuelle d'écriture avec une position connue où le fichier
est aligné sur 64 bits (en général, c'est la taille de la matrice en
cours d'écriture: NbRow*NbCol*DatWitdh). */
size_t SdifFWritePadding (SdifFileT *SdifF, size_t Padding);
/*
//FUNCTION GROUP: Writing Frames
*/
/*DOC:
Après avoir donner une valueur à chaque champ de SdifF->CurrFramH
gràce à la fonction SdifFSetCurrFrameHeader, SdifFWriteFrameHeader
écrit toute l'entête de frame. Lorsque la taille est inconnue au
moment de l'écriture, donner la valeur _SdifUnknownSize. Ensuite,
compter le nombre de bytes écrit dans le frame et réaliser un
SdifUpdateChunkSize avec la taille calculée. */
size_t SdifFWriteFrameHeader (SdifFileT *SdifF);
/*DOC:
Execute un retour fichier de ChunkSize bytes et l'écrit, donc on
écrase la taille du chunk ou du frame. Dans le cas où le fichier
est stderr ou stdout, l'action n'est pas réalisée. */
void SdifUpdateChunkSize (SdifFileT *SdifF, size_t ChunkSize);
/*DOC:
Rewrite given frame size and number of matrices in frame header.
Return -1 on error or if file is not seekable (stdout or stderr). */
int SdifUpdateFrameHeader (SdifFileT *SdifF, size_t ChunkSize,
SdifInt4 NumMatrix);
/*DOC:
Write a whole frame containing one matrix:
frame header, matrix header, matrix data, and padding.
Data points to NbRow * NbCol * SdifSizeofDataType (DataType) bytes in
row-major order.
This function has the big advantage that the frame size is known in
advance, so there's no need to rewind and update after the matrix
has been written. */
size_t SdifFWriteFrameAndOneMatrix (SdifFileT *SdifF,
SdifSignature FrameSignature,
SdifUInt4 NumID,
SdifFloat8 Time,
SdifSignature MatrixSignature,
SdifDataTypeET DataType,
SdifUInt4 NbRow,
SdifUInt4 NbCol,
void *Data);
/*DOC:
Return (constant) size of frame header after signature and size field.
Use this to calculate the Size argument for SdifFSetCurrFrameHeader. */
size_t SdifSizeOfFrameHeader (void);
/*DOC:
Return size of matrix (header, data, padding).
Use this to calculate the Size argument for SdifFSetCurrFrameHeader. */
size_t SdifSizeOfMatrix (SdifDataTypeET DataType,
SdifUInt4 NbRow,
SdifUInt4 NbCol);
/*DOC:
Write a text matrix using a string.
Return number of bytes written.
*/
size_t SdifFWriteTextFrame(SdifFileT *SdifF,
SdifSignature FrameSignature,
SdifUInt4 NumID,
SdifFloat8 Time,
SdifSignature MatrixSignature,
char *str,
size_t length);
/*DOC:
Write a text matrix using a SdifString.
Return number of bytes written.
*/
size_t SdifFWriteTextFrameSdifString(SdifFileT *SdifF,
SdifSignature FrameSignature,
SdifUInt4 NumID,
SdifFloat8 Time,
SdifSignature MatrixSignature,
SdifStringT *SdifString);
/*
* obsolete
*/
size_t SdifFWriteNameValueCurrHT (SdifFileT *SdifF);
size_t SdifFWriteAllNameValueHT (SdifFileT *SdifF);
#endif /* _SdifFWrite_ */