The following commit has been merged in the master branch:
commit 34181470e48e01c3b5945d8b257da36e0997d2fe
Author: Andrei Zavada <[email protected]>
Date:   Mon Jul 1 01:41:02 2013 +0300

    WIP

diff --git a/src/libsigfile/edf.cc b/src/libsigfile/edf.cc
index e237229..5d188a5 100644
--- a/src/libsigfile/edf.cc
+++ b/src/libsigfile/edf.cc
@@ -515,41 +515,11 @@ _parse_header()
                }
 
              // deal with episode and session
-               {
-                     // (a) parsed from RecordingID_raw
-                       char int_session[81], int_episode[81];
-                       string rec_id_isolated (trim( string 
(header.recording_id, 80)));
-#define T "%80[-a-zA-Z0-9 _]"
-                       if ( sscanf( rec_id_isolated.c_str(), T ", " T,     
int_episode, int_session) == 2 ||
-                            sscanf( rec_id_isolated.c_str(), T ": " T,     
int_session, int_episode) == 2 ||
-                            sscanf( rec_id_isolated.c_str(), T "/"  T,     
int_session, int_episode) == 2 ||
-                            sscanf( rec_id_isolated.c_str(), T " (" T ")", 
int_session, int_episode) == 2 )
-                               ;
-                       else
-                               _status |= (nosession | noepisode);
-#undef T
-                     // (b) identified from file name
-                       string fn_episode;
-                       size_t basename_start = _filename.rfind( '/');
-                       fn_episode =
-                               _filename.substr(
-                                       basename_start + 1,
-                                       _filename.size() - basename_start - 4 
/* strlen(".edf") */ - 1);
-                       // chip away '-1' if present
-                       if ( fn_episode.size() >= 3 /* strlen("a-1") */ ) {
-                               size_t sz = fn_episode.size();
-                               if ( fn_episode[sz-2] == '-' && 
isdigit(fn_episode[sz-1]) )
-                                       fn_episode.erase( sz-2, 2);
-                       }
-
-                       if ( _status & noepisode ) { // (a) failed
-                               _episode.assign( fn_episode);    // use 
RecordingID_raw as Session
-                               _session.assign( rec_id_isolated);
-                       } else {
-                               _episode.assign( int_episode);
-                               _session.assign( int_session);
-                       }
-               }
+               int parsed_status;
+               tie (_session, _episode, parsed_status) =
+                       figure_session_and_episode();
+               if ( parsed_status )
+                       _status |= (nosession | noepisode);
 
              // parse times
                {
diff --git a/src/libsigfile/source-base.cc b/src/libsigfile/source-base.cc
index 01772c9..59dc3aa 100644
--- a/src/libsigfile/source-base.cc
+++ b/src/libsigfile/source-base.cc
@@ -273,6 +273,62 @@ CSource (CSource&& rv)
 }
 
 
+
+
+
+
+
+
+tuple<string, string, int>
+sigfile::CSource::
+figure_session_and_episode()
+{
+       int status = 0;
+       string session, episode;
+
+       // (a) parsed from RecordingID_raw
+       char int_session[81], int_episode[81];
+       string rec_id_isolated (agh::str::trim( recording_id()));
+#define T "%80[-a-zA-Z0-9 _]"
+       if ( sscanf( rec_id_isolated.c_str(), T "," T,      int_episode, 
int_session) == 2 ||
+            sscanf( rec_id_isolated.c_str(), T ":" T,      int_session, 
int_episode) == 2 ||
+            sscanf( rec_id_isolated.c_str(), T "/"  T,     int_session, 
int_episode) == 2 ||
+            sscanf( rec_id_isolated.c_str(), T " (" T ")", int_session, 
int_episode) == 2 )
+               ;
+       else
+               status = 1;
+#undef T
+
+       // (b) identified from file name
+       ///// if ( sscanf( agh::fs::path_elements( filename).back().c_str(), 
"%*s-%d.%s", ) == 3 )
+       size_t  basename_start = _filename.rfind( '/'),
+               dot = _filename.rfind('.');
+       string fn_episode =
+               _filename.substr(
+                       basename_start + 1,
+                       dot - basename_start - 1);
+       // chip away '-1' if present
+       if ( fn_episode.size() >= 3 /* strlen("a-1") */ ) {
+               size_t sz = fn_episode.size();
+               if ( fn_episode[sz-2] == '-' && isdigit(fn_episode[sz-1]) )
+                       fn_episode.erase( sz-2, 2);
+       }
+
+       if ( status ) { // (a) failed
+               episode.assign( fn_episode);    // use RecordingID_raw as 
Session
+               session.assign( rec_id_isolated);
+       } else {
+               episode.assign( int_episode);
+               session.assign( int_session);
+       }
+
+       return make_tuple( session, episode, status);
+}
+
+
+
+
+
 // Local Variables:
 // Mode: c++
 // indent-tabs-mode: 8
diff --git a/src/libsigfile/source-base.hh b/src/libsigfile/source-base.hh
index 72437b2..8a8acdf 100644
--- a/src/libsigfile/source-base.hh
+++ b/src/libsigfile/source-base.hh
@@ -12,6 +12,8 @@
 #ifndef _SIGFILE_SOURCE_BASE_H
 #define _SIGFILE_SOURCE_BASE_H
 
+#include <tuple>
+
 #include "common/fs.hh"
 #include "common/alg.hh"
 #include "common/subject_id.hh"
@@ -407,6 +409,10 @@ class CSource {
                {
                        return sigfile::make_fname_annotations( filename(), 
channel);
                }
+
+      // supporting functions
+       tuple<string, string, int>
+       figure_session_and_episode();
 };
 
 
diff --git a/src/libsigfile/tsv.cc b/src/libsigfile/tsv.cc
index c770a01..733869d 100644
--- a/src/libsigfile/tsv.cc
+++ b/src/libsigfile/tsv.cc
@@ -164,44 +164,19 @@ CTSVFile::
 _parse_header()
 {
        size_t  n_channels;
-       _subtype = TSubtype::tsv;
 
-       // deal with episode and session
-       {
-               // (a) parsed from RecordingID_raw
-               char int_session[81], int_episode[81];
-               string rec_id_isolated (trim( _recording_id));
-#define T "%80[-a-zA-Z0-9 _]"
-               if ( sscanf( rec_id_isolated.c_str(), T ", " T,     
int_episode, int_session) == 2 ||
-                    sscanf( rec_id_isolated.c_str(), T ": " T,     
int_session, int_episode) == 2 ||
-                    sscanf( rec_id_isolated.c_str(), T "/"  T,     
int_session, int_episode) == 2 ||
-                    sscanf( rec_id_isolated.c_str(), T " (" T ")", 
int_session, int_episode) == 2 )
-                       ;
-               else
-                       _status |= (nosession | noepisode);
-#undef T
-               // (b) identified from file name
-               string fn_episode;
-               size_t basename_start = _filename.rfind( '/');
-               fn_episode =
-                       _filename.substr(
-                               basename_start + 1,
-                               _filename.size() - basename_start - 4 /* 
strlen(".edf") */ - 1);
-               // chip away '-1' if present
-               if ( fn_episode.size() >= 3 /* strlen("a-1") */ ) {
-                       size_t sz = fn_episode.size();
-                       if ( fn_episode[sz-2] == '-' && 
isdigit(fn_episode[sz-1]) )
-                               fn_episode.erase( sz-2, 2);
-               }
+      // 1. read metadata
+       do {
+               
+       } while ();
 
-               if ( _status & noepisode ) { // (a) failed
-                       _episode.assign( fn_episode);    // use RecordingID_raw 
as Session
-                       _session.assign( rec_id_isolated);
-               } else {
-                       _episode.assign( int_episode);
-                       _session.assign( int_session);
-               }
-       }
+      // 2. pick essential bits
+       
+
+      // 3. deal with episode and session
+       
+       tie( _session, _episode, parsed_successfully) =
+               figure_session_and_episode( _recording_id, _filename);
 
 
        // are channels unique?
@@ -214,6 +189,9 @@ _parse_header()
                }
 outer_break:
 
+      // 4. read one line of channel data, figure subtype and number of 
channels
+       
+
        return 0;
 }
 

-- 
Sleep experiment manager

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to