summaryrefslogtreecommitdiff
path: root/silx/io/specfile/src/sfwrite.c
diff options
context:
space:
mode:
Diffstat (limited to 'silx/io/specfile/src/sfwrite.c')
-rw-r--r--silx/io/specfile/src/sfwrite.c592
1 files changed, 0 insertions, 592 deletions
diff --git a/silx/io/specfile/src/sfwrite.c b/silx/io/specfile/src/sfwrite.c
deleted file mode 100644
index c77f400..0000000
--- a/silx/io/specfile/src/sfwrite.c
+++ /dev/null
@@ -1,592 +0,0 @@
-# /*##########################################################################
-# Copyright (C) 1995-2017 European Synchrotron Radiation Facility
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-# THE SOFTWARE.
-#
-# ############################################################################*/
-/************************************************************************
- *
- * File: sfwrite.c
- *
- * Project: SpecFile library
- *
- * Description: Functions for scan output
- *
- * Author: V.Rey
- *
- * Date: $Date: 2003/09/12 13:20:35 $
- *
- ************************************************************************/
-/*
- * Log: $Log: sfwrite.c,v $
- * Log: Revision 1.1 2003/09/12 13:20:35 rey
- * Log: Initial revision
- * Log:
- * Log: Revision 3.0 2000/12/20 14:17:19 rey
- * Log: Python version available
- * Log:
- * Revision 2.1 2000/07/31 19:05:14 19:05:14 rey (Vicente Rey-Bakaikoa)
- * SfUpdate and bug corrected in ReadIndex
- *
- * Revision 2.0 2000/04/13 13:28:54 13:28:54 rey (Vicente Rey-Bakaikoa)
- * New version of the library. Complete rewrite
- * Adds support for MCA
- */
-#include <SpecFile.h>
-#include <SpecFileP.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-/*
- * Declarations
- */
-DllExport SpecFileOut *SfoInit ( SpecFile *sf, int *error );
-DllExport void SfoClose ( SpecFileOut *sfo );
-DllExport long SfoSelectAll ( SpecFileOut *sfo, int *error );
-DllExport long SfoSelectOne ( SpecFileOut *sfo, long index,
- int *error );
-DllExport long SfoSelect ( SpecFileOut *sfo, long *list,
- int *error );
-DllExport long SfoSelectRange ( SpecFileOut *sfo, long begin,
- long end, int *error );
-DllExport long SfoRemoveOne ( SpecFileOut *sfo, long index,
- int *error );
-DllExport long SfoRemove ( SpecFileOut *sfo, long *list,
- int *error );
-DllExport long SfoRemoveRange ( SpecFileOut *sfo, long begin,
- long end, int *error );
-DllExport long SfoRemoveAll ( SpecFileOut *sfo, int *error );
-DllExport long SfoWrite ( SpecFileOut *sfo, char *name,
- int *error );
-DllExport long SfoGetList ( SpecFileOut *sfo, long **list,
- int *error );
-
-/*
- * Internal functions
- */
-static int sfoWriteOne(SpecFileOut *sfo,int output, long index,int *error);
-
-
-/*********************************************************************
- * Function: SpecFileOut *SfoInit( sf, error )
- *
- * Description: Initializes a SpecFileOut structure:
- * - pointer to SpecFile
- * - list of scans to be copied
- * - size of this list
- * - last written file header
- * Parameters:
- * Input : (1) SpecFile pointer
- *
- * Output:
- * (2) error number
- * Returns:
- * Pointer to the initialized SpecFileOut structure.
- * NULL in case of an error.
- *
- * Possible errors:
- * SF_ERR_MEMOREY_ALLOC
- *
- * Remark: This function MUST be the FIRST called before
- * any other WRITE function is called !
- *
- *********************************************************************/
-DllExport SpecFileOut *
-SfoInit( SpecFile *sf, int *error )
-{
- SpecFileOut *sfo;
-
- /*
- * Alloc memory
- */
- sfo = (SpecFileOut *) malloc ( sizeof(SpecFileOut) );
-
- if ( sfo == (SpecFileOut *)NULL ) {
- *error = SF_ERR_MEMORY_ALLOC;
- return( (SpecFileOut *)NULL );
- }
-
- /*
- * Initialize
- */
- sfo->sf = sf;
- sfo->list = (long *)NULL;
- sfo->list_size = 0;
- sfo->file_header = -1;
-
- return( sfo );
-}
-
-
-/*********************************************************************
- * Function: long SfoGetList( sfo, list, error )
- *
- * Description: Makes a copy of the SpecFileOut list.
- *
- * Parameters:
- * Input : (1) SpecFileOut pointer
- *
- * Output: (2) Copy of the output list of spec scan indices.
- * (3) error code
- * Returns:
- * Number of scan indices in the output list ,
- * ( 0 ) => list empty( (long *)NULL ) ), no errors
- * ( -1 ) in case of an error.
- *
- * Possible errors:
- * SF_ERR_MEMOREY_ALLOC
- *
- * Remark: The memory allocated should be freed by the application
- *
- *********************************************************************/
-DllExport long
-SfoGetList( SpecFileOut *sfo, long **list, int *error )
-{
- long i;
-
- *list = (long *)NULL;
-
- if ( sfo->list_size > 0 ) {
- *list = (long *)malloc( sfo->list_size * sizeof(long) );
- if ( *list == (long *)NULL ) {
- *error = SF_ERR_MEMORY_ALLOC;
- return( -1 );
- }
- for ( i=0 ; i < sfo->list_size ; i++ ) {
- (*list)[i] = sfo->list[i];
- }
- } else *list = (long *)NULL;
-
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: long SfoSelectOne( sfo, index, error )
- *
- * Description: Adds one scan index to the SpecFileOut list.
- *
- * Parameters:
- * Input : (1) SpecFileOut pointer
- * (2) Scan index
- * Output:
- * (3) error code
- * Returns:
- * ( -1 ) => error
- * Number of scan indices in the SpecFileOut list.
- *
- * Possible errors:
- * SF_ERR_MEMORY_ALLOC
- *
- *********************************************************************/
-DllExport long
-SfoSelectOne( SpecFileOut *sfo, long index, int *error )
-{
- long i;
-
- /*
- * Check if index exists or if it's out of range.
- */
- if ( index > sfo->sf->no_scans || index < 1 ) {
- return( sfo->list_size );
- }
-
- /*
- * Alloc memory for the new index and add it to the list.
- */
- if ( sfo->list == (long *)NULL ) {
- sfo->list = (long *)malloc( sizeof(long) );
- if ( sfo->list == (long *)NULL ) {
- *error = SF_ERR_MEMORY_ALLOC;
- return( -1 );
- }
- sfo->list_size = 1;
- } else {
- /*
- * Is the new index already in list ?
- */
- for ( i=0 ; i<sfo->list_size ; i++ )
- if ( index == sfo->list[i] ) return( sfo->list_size );
- sfo->list = realloc( sfo->list, ++(sfo->list_size) * sizeof(long) );
- if ( sfo->list == (long *)NULL ) {
- *error = SF_ERR_MEMORY_ALLOC;
- sfo->list_size = 0;
- return( -1 );
- }
- }
- sfo->list[sfo->list_size-1] = index;
- printf("Adding scan %ld\n",index);
-
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: long SfoSelect( sfo, list, error )
- *
- * Description: Adds several scan indices to the SpecFileOut list.
- *
- * Parameters:
- * Input : (1) SpecFileOut pointer
- * (2) List scan indices (!The last element
- * MUST be a '0' !)
- * Output:
- * (3) error code
- * Returns:
- * ( -1 ) => error
- * Number of scan indices in the SpecFileOut list.
- *
- * Possible errors:
- * SF_ERR_MEMORY_ALLOC | => SfoSelectOne()
- *
- *********************************************************************/
-DllExport long
-SfoSelect( SpecFileOut *sfo, long *list, int *error )
-{
- for ( ; *list != 0 ; list++ ) {
- if ( SfoSelectOne( sfo, *list , error ) < 0 ) return( -1 );
- }
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: long SfoSelectRange( sfo, begin, end, error )
- *
- * Description: Adds scan indices between 'begin' and 'end'
- * to the SpecFileOut list.
- *
- * Parameters:
- * Input : (1) SpecFileOut pointer
- * (2) First ...
- * (3) Last index to be added
- * Output:
- * (4) error code
- * Returns:
- * ( -1 ) => error
- * Number of scan indices in the SpecFileOut list.
- *
- * Possible errors:
- * SF_ERR_MEMORY_ALLOC | => SfoSelectOne()
- *
- *********************************************************************/
-DllExport long
-SfoSelectRange( SpecFileOut *sfo, long begin, long end, int *error )
-{
- long i;
-
- if ( begin > end ) {
- i=begin;
- begin = end;
- end = i;
- }
- if ( begin < 1 || end > sfo->sf->no_scans ) {
- return( sfo->list_size );
- }
- for ( i=begin ; i<=end ; i++ ) {
- if ( SfoSelectOne( sfo, i , error ) < 0 ) return( -1 );
- }
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: long SfoSelectAll( sfo, error )
- *
- * Description: Writes all scan indices in the SpecFileOut list.
- *
- * Parameters:
- * Input : (1) SpecFileOutput pointer
- * Output: (2) error number
- * Returns:
- * ( -1 ) => error
- * Number of scan indices in the SpecFileOut list.
- *
- * Possible errors:
- * SF_ERR_MEMORY_ALLOC
- *
- *********************************************************************/
-DllExport long
-SfoSelectAll( SpecFileOut *sfo, int *error )
-{
- long i;
-
- if ( sfo->sf->no_scans > 0 ) {
- for ( i=1 ; i<=sfo->sf->no_scans ; i++ ) {
- if ( SfoSelectOne( sfo, i , error ) < 0 ) return( -1 );
- }
- }
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: long SfoRemoveOne( sfo, index, error )
- *
- * Description: Removes one scan index from the SpecFileOut list.
- *
- * Parameters:
- * Input : (1) SpecFileOut pointer
- * (2) Scan index to be removed
- * Output:
- * (3) error code
- * Returns:
- * Number of scans left ,
- * ( 0 ) => list empty( (long *)NULL ) ), no errors
- * ( -1 ) => error.
- *
- * Possible errors:
- * SF_ERR_MEMORY_ALLOC
- *
- *********************************************************************/
-DllExport long
-SfoRemoveOne( SpecFileOut *sfo, long index, int *error )
-{
- long i;
- int found = 0;
-
- /*
- * Look for scan index and delete.
- */
- for ( i=0 ; i < (sfo->list_size - found) ; i++ ) {
- if ( sfo->list[i] == index ) found = 1;
- if ( found ) sfo->list[i]=sfo->list[i+1];
- }
-
- /*
- * Free unused memory
- */
- if ( found ) {
- (sfo->list_size)--;
- sfo->list = realloc( sfo->list, sfo->list_size * sizeof(long) );
- if ( sfo->list == (long *)NULL && sfo->list_size != 0 ) {
- *error = SF_ERR_MEMORY_ALLOC;
- return( -1 );
- }
- }
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: long SfoRemove( sfo, list, error )
- *
- * Description: Removes several scans indices from the
- * SpecFileOut list.
- *
- * Parameters:
- * Input : (1) SpecFileOut pointer
- * (2) List of scan indices to be removed
- * ( !!! The last element MUST be a '0' !!! )
- * Output:
- * (3) error code
- * Returns:
- * Number of scan indices left ,
- * ( 0 ) => list empty( (long *)NULL ) ), no errors
- * ( -1 ) => error.
- *
- * Possible errors:
- * SF_ERR_MEMORY_ALLOC | => SfoRemoveOne()
- *
- *********************************************************************/
-DllExport long
-SfoRemove( SpecFileOut *sfo, long *list, int *error )
-{
- for ( ; *list != 0 ; list++ ) {
- if ( SfoRemoveOne( sfo, *list , error ) < 0 ) return( -1 );
- }
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: long SfoRemoveRange( sfo, begin, end, error )
- *
- * Description: Removes scans indices from 'begin' to 'end'
- * from the SpecFileOut list.
- *
- * Parameters:
- * Input :
- * (1) SpecFileOut pointer
- * (2) First ...
- * (3) Last index to be removed
- * Output:
- * (4) error code
- * Returns:
- * Number of scan indices left ,
- * ( 0 ) => list empty( (long *)NULL ) ), no errors
- * ( -1 ) => error.
- *
- * Possible errors:
- * SF_ERR_MEMORY_ALLOC | => SfoRemoveOne()
- *
- *********************************************************************/
-DllExport long
-SfoRemoveRange( SpecFileOut *sfo, long begin, long end, int *error )
-{
- long i;
-
- if ( begin > end ) {
- i=begin;
- begin = end;
- end = i;
- }
- if ( begin < 1 || end > sfo->sf->no_scans ) {
- return( sfo->list_size );
- }
- for ( i=begin ; i <= end ; i++ ) {
- if ( SfoRemoveOne( sfo, i, error ) < 0 ) return( -1 );
- }
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: long SfoRemoveAll( sfo, error )
- *
- * Description: Removes all scans indices
- * from the SpecFileOut list.
- *
- * Parameters:
- * Input :
- * (1) SpecFileOut pointer
- * Output:
- * (2) error code
- * Returns:
- * ( 0 ) => OK
- *
- *********************************************************************/
-DllExport long
-SfoRemoveAll( SpecFileOut *sfo, int *error )
-{
- free( sfo->list );
- sfo->list = (long *)NULL;
- sfo->list_size = 0;
- sfo->file_header = -1;
- return( 0 );
-}
-
-
-/*********************************************************************
- * Function: int SfoWrite( sfo, name, error )
- *
- * Description: Writes (appends) SpecScans specified in the sfo->list
- * in the file 'name'. Related file headers are copied
- * too.
- * Parameters:
- * Input : (1) SpecFileOut pointer
- * (2) Output file name
- * Output:
- * (3) error number
- * Returns:
- * Number of written scans,
- * (-1 ) => Errors occured
- * Possible errors:
- * SF_ERR_FILE_WRITE | => cpyBlock()
- * SF_ERR_FILE_READ
- * SF_ERR_FILE_OPEN
- * SF_ERR_FILE_CLOSE
- *
- *********************************************************************/
-DllExport long
-SfoWrite( SpecFileOut *sfo, char *name, int *error )
-{
- int output;
- long i;
-
- if ( sfo == (SpecFileOut *)NULL || sfo->list_size<1 ) return( 0 );
-
- /*
- * Open file
- */
- if ( (output = open(name, O_CREAT | O_RDWR | O_APPEND, SF_UMASK )) == (int)NULL ) {
- *error = SF_ERR_FILE_OPEN;
- return( -1 );
- }
-
- for ( i=0 ; i < sfo->list_size ; i++ )
- sfoWriteOne(sfo,output,sfo->list[i],error);
-
- if ( close( output ) ) {
- *error = SF_ERR_FILE_CLOSE;
- return( -1 );
- }
-
- return( sfo->list_size );
-}
-
-
-/*********************************************************************
- * Function: int SfoClose( sfo )
- *
- * Description: Frees all memory used by
- * SpecFileOut structure.
- * Parameters:
- * Input : (1) SpecFileOut pointer
- *
- * Remark: This function should be called after all
- * writing operations.
- *
- *********************************************************************/
-DllExport void
-SfoClose( SpecFileOut *sfo )
-{
- /*
- * Free memory.
- */
- free( sfo->list );
- free( sfo );
-}
-
-
-static int
-sfoWriteOne(SpecFileOut *sfo,int output,long index,int *error)
-{
- long file_header,size;
- SpecFile *sf;
-
- if ( sfSetCurrent(sfo->sf,index,error) == -1 ) {
- *error = SF_ERR_SCAN_NOT_FOUND;
- return(-1);
- }
-
- /*
- * File header
- */
- sf = sfo->sf;
-
- file_header = ((SpecScan *)sf->current->contents)->size;
-
- if (file_header != -1 && file_header != sfo->file_header ) {
- printf("Writing %ld bytes\n",sf->filebuffersize);
- write(output, (void *) sf->filebuffer, sf->filebuffersize);
- sfo->file_header = file_header;
- }
-
- /*
- * write scan
- */
- size = ((SpecScan *)sf->current->contents)->size;
-
- if ( write(output,(void *) sf->scanbuffer,size) == -1 ) {
- *error = SF_ERR_FILE_WRITE;
- return(-1);
- }
- return(0);
-}