@@ -565,6 +565,11 @@ static int mmapflush( segy_datasource* self ) {
565565 return SEGY_OK ;
566566}
567567
568+ static int memflush ( segy_datasource * self ) {
569+ (void )self ; // mark parameter as unused
570+ return SEGY_OK ;
571+ }
572+
568573static int mmapclose ( segy_datasource * self ) {
569574#ifdef HAVE_MMAP
570575 int err = mmapflush ( self );
@@ -578,6 +583,12 @@ static int mmapclose( segy_datasource* self ) {
578583 return SEGY_OK ;
579584}
580585
586+ static int memclose ( segy_datasource * self ) {
587+ memfile * mp = (memfile * )self -> stream ;
588+ free ( mp );
589+ return SEGY_OK ;
590+ }
591+
581592static int formatsize ( int format ) {
582593 switch ( format ) {
583594 case SEGY_IBM_FLOAT_4_BYTE : return 4 ;
@@ -676,6 +687,47 @@ segy_file* segy_open( const char* path, const char* mode ) {
676687 return ds ;
677688}
678689
690+ segy_datasource * segy_memopen ( unsigned char * addr , size_t size ) {
691+ if ( !addr || !size ) return NULL ;
692+
693+ /* as we don't support operations that change file size on update, no memory
694+ * resize would be needed
695+ */
696+ memfile * mp = malloc ( sizeof ( memfile ) );
697+ if ( !mp ) {
698+ return NULL ;
699+ }
700+ mp -> addr = addr ;
701+ mp -> cur = addr ;
702+ mp -> size = size ;
703+
704+ segy_datasource * ds = malloc ( sizeof ( segy_datasource ) );
705+ if ( !ds ) {
706+ free ( mp );
707+ return NULL ;
708+ }
709+ ds -> stream = mp ;
710+
711+ ds -> read = memread ;
712+ ds -> write = memwrite ;
713+ ds -> seek = memseek ;
714+ ds -> tell = memtell ;
715+ ds -> size = memsize ;
716+ ds -> flush = memflush ;
717+ ds -> close = memclose ;
718+
719+ ds -> writable = true;
720+
721+ // on init assume a size of 4-bytes-per-element and big-endian
722+ ds -> elemsize = 4 ;
723+ ds -> lsb = false;
724+
725+ ds -> minimize_requests_number = false;
726+ ds -> memory_speedup = true;
727+
728+ return ds ;
729+ }
730+
679731int segy_mmap ( segy_datasource * ds ) {
680732#ifndef HAVE_MMAP
681733 return SEGY_MMAP_INVALID ;
@@ -735,7 +787,7 @@ int segy_flush( segy_datasource* ds ) {
735787 if ( !ds -> writable ) return SEGY_OK ;
736788
737789 int flusherr = ds -> flush ( ds );
738- if ( flusherr != 0 ) return SEGY_DS_ERROR ;
790+ if ( flusherr != 0 ) return SEGY_DS_FLUSH_ERROR ;
739791
740792 return SEGY_OK ;
741793}
@@ -759,7 +811,7 @@ int segy_close( segy_datasource* ds ) {
759811
760812 err = ds -> close (ds );
761813 free ( ds );
762- if ( err != 0 ) return SEGY_DS_ERROR ;
814+ if ( err != 0 ) return SEGY_DS_CLOSE_ERROR ;
763815 return SEGY_OK ;
764816}
765817
0 commit comments