The following commit has been merged in the master branch:
commit 8fdfabfb4a8ed8c893e186c0ad29c651fa1d876f
Author: Andrei Zavada <[email protected]>
Date:   Mon Jul 15 01:11:09 2013 +0300

    sink some common code in libsigfile

diff --git a/src/common/subject_id.cc b/src/common/subject_id.cc
index 93518d3..cacede8 100644
--- a/src/common/subject_id.cc
+++ b/src/common/subject_id.cc
@@ -14,6 +14,7 @@
 #include <string>
 #include <cstring>
 #include "string.hh"
+#include "libsigfile/source-base.hh" // for CEDFFile::TStatus flags
 #include "subject_id.hh"
 
 #if HAVE_CONFIG_H && !defined(VERSION)
@@ -181,6 +182,31 @@ update_from( const SSubjectId& j)
 }
 
 
+int
+SSubjectId::
+parse_recording_id_edf_style( const string& s)
+{
+       using namespace agh::str;
+       int_least32_t status = 0;
+       auto subfields = tokens( s, " ");
+       if ( subfields.size() < 4 ) {
+               id = subfields.front();
+               status |= sigfile::CSource::nonconforming_patient_id;
+       } else {
+               if ( subfields.size() > 4 )
+                       status |= sigfile::CSource::extra_patientid_subfields;
+               auto i = subfields.begin();
+               id = *i++;
+               gender = agh::SSubjectId::char_to_gender((*i++)[0]);
+               dob = agh::SSubjectId::str_to_dob(*i++);
+               name = join( tokens(*i++, "_"), " ");
+               if ( not valid() )
+                       status |= sigfile::CSource::invalid_subject_details;
+       }
+       return status;
+}
+
+
 // Local Variables:
 // Mode: c++
 // indent-tabs-mode: 8
diff --git a/src/common/subject_id.hh b/src/common/subject_id.hh
index ff1442a..b9ee48e 100644
--- a/src/common/subject_id.hh
+++ b/src/common/subject_id.hh
@@ -82,7 +82,7 @@ struct SSubjectId {
                }
        int update_from( const SSubjectId&);
 
-       string make_recording_id() const
+       string make_recording_id_edf_style() const
                {
                        return agh::str::sasprintf(
                                "%s %c %s %s",
@@ -90,6 +90,9 @@ struct SSubjectId {
                                name.c_str());
                }
 
+       // flag bits as in CEDFFile::TStatus
+       int parse_recording_id_edf_style( const string&);
+
        static char gender_sign( TGender);
        static TGender char_to_gender( char);
        static time_t str_to_dob( const string&);
diff --git a/src/libsigfile/edf-io.cc b/src/libsigfile/edf-io.cc
index 2e369b7..b4170c1 100644
--- a/src/libsigfile/edf-io.cc
+++ b/src/libsigfile/edf-io.cc
@@ -20,7 +20,7 @@ CEDFFile::
 get_region_original_smpl( const int h,
                          const size_t sa, const size_t sz) const
 {
-       if ( unlikely (_status & (TStatus::bad_header | TStatus::bad_version)) )
+       if ( unlikely (_status & (CSource::TStatus::bad_header | 
TStatus::bad_version)) )
                throw invalid_argument ("CEDFFile::get_region_original(): 
broken source");
        if ( unlikely (_mmapping == NULL) )
                throw invalid_argument ("CEDFFile::get_region_original(): no 
data");
@@ -71,7 +71,7 @@ put_region_smpl( const int h,
                 const valarray<TFloat>& src,
                 const size_t offset)
 {
-       if ( unlikely (_status & (TStatus::bad_header | TStatus::bad_version)) )
+       if ( unlikely (_status & (CSource::TStatus::bad_header | 
TStatus::bad_version)) )
                throw invalid_argument("CEDFFile::put_region_(): broken 
source");
        if ( unlikely (_mmapping == NULL) )
                throw invalid_argument("CEDFFile::put_region_(): no data");
diff --git a/src/libsigfile/edf.cc b/src/libsigfile/edf.cc
index 827c7ab..5428814 100644
--- a/src/libsigfile/edf.cc
+++ b/src/libsigfile/edf.cc
@@ -124,12 +124,12 @@ CEDFFile (const string& fname_, const int flags_)
                struct stat stat0;
                int stst = stat( fname_.c_str(), &stat0);
                if ( stst == -1 )
-                       throw invalid_argument (explain_status(_status |= 
TStatus::sysfail));
+                       throw invalid_argument (explain_status(_status |= 
CSource::TStatus::sysfail));
                _fsize = stat0.st_size;
        }
        _fd = open( fname_.c_str(), O_RDWR);
        if ( _fd == -1 )
-               throw invalid_argument (explain_status(_status |= 
TStatus::sysfail));
+               throw invalid_argument (explain_status(_status |= sysfail));
 
       // mmap
        _mmapping =
@@ -195,7 +195,7 @@ CEDFFile (const string& fname_, const TSubtype subtype_, 
const int flags_,
 {
        _fd = open( fname_.c_str(), O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | 
S_IWUSR | S_IRGRP);
        if ( _fd == -1 )
-               throw invalid_argument (explain_status(_status |= 
TStatus::sysfail));
+               throw invalid_argument (explain_status(_status |= 
CSource::TStatus::sysfail));
 
        header_length = 256 + (channels_.size() * 256);
        size_t total_samplerate = 0;
@@ -205,7 +205,7 @@ CEDFFile (const string& fname_, const TSubtype subtype_, 
const int flags_,
        _fsize = header_length + 2 * total_samplerate * data_record_size * 
n_data_records;
        // extend
        if ( lseek( _fd, _fsize-1, SEEK_SET) == -1 || write( _fd, "\0", 1) != 1 
)
-               throw invalid_argument (explain_status(_status |= 
TStatus::sysfail));
+               throw invalid_argument (explain_status(_status |= sysfail));
 
 //     size_t sys_page_size = (size_t) sysconf( _SC_PAGESIZE);
        _mmapping =
@@ -226,7 +226,7 @@ CEDFFile (const string& fname_, const TSubtype subtype_, 
const int flags_,
        strncpy( header.version_number, version_string, 8);
 
        _subject = {"Fafa_1", "Mr. Fafa"};
-       set_patient_id( _subject.make_recording_id());
+       set_patient_id( _subject.make_recording_id_edf_style());
 
        set_recording_id( "Zzz");
        set_comment( fname_);
@@ -494,25 +494,10 @@ _parse_header()
                _recording_id = trim( string (header.patient_id, 80));
 
              // sub-parse patient_id into SSubjectId struct
-               {
-                       auto subfields = tokens( _patient_id, " ");
-                       if ( unlikely (_patient_id.empty()) ) {
-                               _status |= missing_patient_id;
-                       } else if ( subfields.size() < 4 ) {
-                               _subject.id = subfields.front();
-                               _status |= nonconforming_patient_id;
-                       } else {
-                               if ( subfields.size() > 4 )
-                                       _status |= extra_patientid_subfields;
-                               auto i = subfields.begin();
-                               _subject.id = *i++;
-                               _subject.gender = 
agh::SSubjectId::char_to_gender((*i++)[0]);
-                               _subject.dob = 
agh::SSubjectId::str_to_dob(*i++);
-                               _subject.name = join( tokens(*i++, "_"), " ");
-                               if ( not _subject.valid() )
-                                       _status |= invalid_subject_details;
-                       }
-               }
+               if ( unlikely (_patient_id.empty()) )
+                       _status |= missing_patient_id;
+               _status |=
+                       _subject.parse_recording_id_edf_style( _patient_id);
 
              // deal with episode and session
                int parsed_status;
diff --git a/src/libsigfile/edf.hh b/src/libsigfile/edf.hh
index a223b2e..04f0358 100644
--- a/src/libsigfile/edf.hh
+++ b/src/libsigfile/edf.hh
@@ -358,34 +358,16 @@ class CEDFFile
 
 
        enum TStatus : int_least32_t {
-               ok                        = 0,
-               bad_header                = (1 <<  0),
-               bad_version               = (1 <<  1),
-               bad_numfld                = (1 <<  2),
-               bad_recording             = (1 <<  3),
-               date_unparsable           = (1 <<  4),
-               time_unparsable           = (1 <<  5),
-               nosession                 = (1 <<  6),
-               noepisode                 = (1 <<  7),
-               nonkemp_signaltype        = (1 <<  8),
-               non1020_channel           = (1 <<  9),
-               dup_channels              = (1 << 10),
-               nogain                    = (1 << 11),
-               sysfail                   = (1 << 12),
-               too_many_channels         = (1 << 13),
-               nonconforming_patient_id  = (1 << 14),
-               missing_patient_id        = (1 << 15),
-               invalid_subject_details   = (1 << 16),
-               file_truncated            = (1 << 17),
-               trailing_junk             = (1 << 18),
-               extra_patientid_subfields = (1 << 19),
-               recognised_channel_conflicting_type = (1 << 20),
-               mmap_error                = (1 << 21),
+               bad_version               = (1 << (COMMON_STATUS_BITS + 1)),
+               file_truncated            = (1 << (COMMON_STATUS_BITS + 2)),
+               trailing_junk             = (1 << (COMMON_STATUS_BITS + 3)),
+               mmap_error                = (1 << (COMMON_STATUS_BITS + 4)),
+               nogain                    = (1 << (COMMON_STATUS_BITS + 5)),
+               recognised_channel_conflicting_type = (1 << (COMMON_STATUS_BITS 
+ 6)),
 
                inoperable               = (bad_header
                                           | bad_version
                                           | bad_numfld
-                                          | bad_recording
                                           | date_unparsable | time_unparsable
                                           | dup_channels
                                           | nogain
diff --git a/src/libsigfile/source-base.hh b/src/libsigfile/source-base.hh
index b39c513..bea96f8 100644
--- a/src/libsigfile/source-base.hh
+++ b/src/libsigfile/source-base.hh
@@ -221,12 +221,31 @@ class CSource {
                no_ancillary_files         = 1<<1,
                no_field_consistency_check = 1<<2,
        };
+       enum TStatus : int_least32_t {
+               ok                        = 0,
+               bad_header                = (1 <<  0),
+               bad_numfld                = (1 <<  1),
+               date_unparsable           = (1 <<  2),
+               time_unparsable           = (1 <<  3),
+               nosession                 = (1 <<  4),
+               noepisode                 = (1 <<  5),
+               nonkemp_signaltype        = (1 <<  6),
+               non1020_channel           = (1 <<  7),
+               dup_channels              = (1 <<  8),
+               sysfail                   = (1 <<  9),
+               too_many_channels         = (1 << 10),
+               nonconforming_patient_id  = (1 << 11),
+               missing_patient_id        = (1 << 12),
+               invalid_subject_details   = (1 << 13),
+               extra_patientid_subfields = (1 << 14),
+               bad_channel_count         = (1 << 15)
+       };
+       const static unsigned COMMON_STATUS_BITS = 15;
     protected:
        string  _filename;
 
-       int     _status;
-       void clear_status()
-               { _status = 0; }
+       int_least32_t
+               _status;
 
        int     _flags;
 
diff --git a/src/libsigfile/tsv.cc b/src/libsigfile/tsv.cc
index 8b1ffa6..2c11920 100644
--- a/src/libsigfile/tsv.cc
+++ b/src/libsigfile/tsv.cc
@@ -57,11 +57,11 @@ CTSVFile (const string& fname_, const int flags_)
                struct stat stat0;
                int stst = stat( fname_.c_str(), &stat0);
                if ( stst == -1 )
-                       throw invalid_argument (explain_status(_status |= 
TStatus::sysfail));
+                       throw invalid_argument (explain_status(_status |= 
CSource::TStatus::sysfail));
        }
        _f = fopen( fname_.c_str(), "r");
        if ( !_f )
-               throw invalid_argument (explain_status(_status |= 
TStatus::sysfail));
+               throw invalid_argument (explain_status(_status |= sysfail));
 
       // parse header
        if ( _parse_header() ) {  // creates channels list
diff --git a/src/libsigfile/tsv.hh b/src/libsigfile/tsv.hh
index 779f8f7..528639a 100644
--- a/src/libsigfile/tsv.hh
+++ b/src/libsigfile/tsv.hh
@@ -321,23 +321,6 @@ class CTSVFile
 
 
        enum TStatus : int_least32_t {
-               ok                        = 0,
-               bad_header                = (1 <<  0),
-               bad_numfld                = (1 <<  2),
-               date_unparsable           = (1 <<  4),
-               time_unparsable           = (1 <<  5),
-               nosession                 = (1 <<  6),
-               noepisode                 = (1 <<  7),
-               nonkemp_signaltype        = (1 <<  8),
-               non1020_channel           = (1 <<  9),
-               dup_channels              = (1 << 10),
-               sysfail                   = (1 << 12),
-               too_many_channels         = (1 << 13),
-               nonconforming_patient_id  = (1 << 14),
-               missing_patient_id        = (1 << 15),
-               invalid_subject_details   = (1 << 16),
-               extra_patientid_subfields = (1 << 19),
-
                inoperable               = (bad_header
                                           | bad_numfld
                                           | date_unparsable | time_unparsable

-- 
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