[segyio] 314/376: Add segy_read_ext_textheader

Jørgen Kvalsvik jokva-guest at moszumanska.debian.org
Wed Sep 20 08:04:51 UTC 2017


This is an automated email from the git hooks/post-receive script.

jokva-guest pushed a commit to branch debian
in repository segyio.

commit d7deb1cef1837e3cf4bea82f0a6030b54bd5c697
Author: Jørgen Kvalsvik <jokva at statoil.com>
Date:   Mon Jun 26 14:29:24 2017 +0200

    Add segy_read_ext_textheader
    
    Add the missing functionality of reading extended textual headers.
---
 lib/include/segyio/segy.h |  6 ++++++
 lib/src/segy.c            | 26 ++++++++++++++++++--------
 lib/src/segy.def          |  1 +
 python/segyio/_segyio.c   |  4 +++-
 4 files changed, 28 insertions(+), 9 deletions(-)

diff --git a/lib/include/segyio/segy.h b/lib/include/segyio/segy.h
index 37e4e9b..d4e2b11 100644
--- a/lib/include/segyio/segy.h
+++ b/lib/include/segyio/segy.h
@@ -89,6 +89,12 @@ int segy_sample_indices( segy_file*,
 /* text header operations */
 int segy_read_textheader( segy_file*, char *buf);
 int segy_textheader_size( void );
+/*
+ * read the extended textual headers. `pos = 0` gives the first *extended*
+ * header, i.e. the first textual header following the binary header.
+ * Behaviour is undefined if the file does not have extended headers
+ */
+int segy_read_ext_textheader( segy_file*, int pos, char* buf );
 int segy_write_textheader( segy_file*, int pos, const char* buf );
 
 /* Read the trace header at `traceno` into `buf`. */
diff --git a/lib/src/segy.c b/lib/src/segy.c
index 2072f7a..14b4570 100644
--- a/lib/src/segy.c
+++ b/lib/src/segy.c
@@ -1504,17 +1504,27 @@ int segy_crossline_stride( int sorting,
     }
 }
 
-int segy_read_textheader( segy_file* fp, char *buf) { //todo: Missing position/index support
-    if(fp == NULL) {
-        return SEGY_FSEEK_ERROR;
-    }
-    rewind( fp->fp );
+int segy_read_textheader( segy_file* fp, char *buf) {
+    return segy_read_ext_textheader(fp, -1, buf );
+}
+
+int segy_read_ext_textheader( segy_file* fp, int pos, char *buf) {
+    if( pos < -1 ) return SEGY_INVALID_ARGS;
+    if( !fp ) return SEGY_FSEEK_ERROR;
+
+    const long offset = pos == -1 ? 0 :
+                        SEGY_TEXT_HEADER_SIZE + SEGY_BINARY_HEADER_SIZE +
+                        ((pos-1) * SEGY_TEXT_HEADER_SIZE);
+
+    int err = fseek( fp->fp, offset, SEEK_SET );
+    if( err != 0 ) return SEGY_FSEEK_ERROR;
 
-    const size_t read = fread( buf, 1, SEGY_TEXT_HEADER_SIZE, fp->fp );
+    char localbuf[ SEGY_TEXT_HEADER_SIZE + 1 ];
+    const size_t read = fread( localbuf, 1, SEGY_TEXT_HEADER_SIZE, fp->fp );
     if( read != SEGY_TEXT_HEADER_SIZE ) return SEGY_FREAD_ERROR;
 
-    buf[ SEGY_TEXT_HEADER_SIZE ] = '\0';
-    ebcdic2ascii( buf, buf );
+    localbuf[ SEGY_TEXT_HEADER_SIZE ] = '\0';
+    ebcdic2ascii( localbuf, buf );
     return SEGY_OK;
 }
 
diff --git a/lib/src/segy.def b/lib/src/segy.def
index 260f029..269cfd3 100644
--- a/lib/src/segy.def
+++ b/lib/src/segy.def
@@ -21,6 +21,7 @@ segy_traces
 segy_sample_indices
 segy_read_textheader
 segy_textheader_size
+segy_read_ext_textheader
 segy_write_textheader
 segy_traceheader
 segy_write_traceheader
diff --git a/python/segyio/_segyio.c b/python/segyio/_segyio.c
index a0caf87..f8f553e 100644
--- a/python/segyio/_segyio.c
+++ b/python/segyio/_segyio.c
@@ -235,7 +235,9 @@ static PyObject *py_read_texthdr(PyObject *self, PyObject *args) {
 
     char *buffer = malloc(sizeof(char) * (segy_textheader_size()));
 
-    int error = segy_read_textheader(p_FILE, buffer);
+    int error = index == 0
+              ? segy_read_textheader(p_FILE, buffer)
+              : segy_read_ext_textheader(p_FILE, index - 1, buffer);
 
     if (error != 0) {
         free(buffer);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/segyio.git



More information about the debian-science-commits mailing list