[med-svn] [SCM] aghermann branch, master, updated. 551e213a23b59b71cba6a9c3a282d1b60e21b854

Andrei Zavada johnhommer at gmail.com
Sun Apr 21 23:18:13 UTC 2013


The following commit has been merged in the master branch:
commit 421ba21d75d4e35fbe50eb6e4f05bd40bb58f6d6
Author: Andrei Zavada <johnhommer at gmail.com>
Date:   Sat Apr 20 00:30:47 2013 +0300

    catch exceptions from stof when parsing "EDF Annotations"

diff --git a/src/libsigfile/edf.cc b/src/libsigfile/edf.cc
index da07a95..cfa3ee7 100644
--- a/src/libsigfile/edf.cc
+++ b/src/libsigfile/edf.cc
@@ -845,38 +845,44 @@ _extract_embedded_annotations()
 
 	size_t alen = AH.samples_per_record * 2;
 
-	for ( size_t r = 0; r < n_data_records; ++r ) {
-		char   *this_a =
-			(char*)_mmapping + header_length
-			+ r * _total_samples_per_record * 2	// full records before
-			+ AH._at;				// offset to our samples
-		string	abuf (this_a, alen); // NULL-terminated, possibly at pos <alen
-
-		time_t	record_start = _start_time + r * data_record_size;
-
-		float	offset,
-			duration;
-		const char
-		       *offset_p = abuf.c_str(),
-		       *duration_p,
-		       *tals_p;
-		while ( (tals_p = index( offset_p, 21)) ) {
-			if ( (duration = 0.,
-			      (duration_p = index( offset_p, 20))) &&
-			     duration_p < tals_p ) {
-				offset = stof( string (offset_p, duration_p - offset_p));
-				duration = stof( string (duration_p, tals_p - duration_p));
-			} else
-				offset = stof( string (offset_p, tals_p - offset_p));
-
-			auto tals = tokens( tals_p, (char)20);
-			for ( auto& t : tals )
-				common_annotations.emplace_back(
-					record_start + offset,
-					record_start + offset + duration,
-					t,
-					SAnnotation::TType::plain);
+	try {
+		for ( size_t r = 0; r < n_data_records; ++r ) {
+			char   *this_a =
+				(char*)_mmapping + header_length
+				+ r * _total_samples_per_record * 2	// full records before
+				+ AH._at;				// offset to our samples
+			string	abuf (this_a, alen); // NULL-terminated, possibly at pos <alen
+
+			time_t	record_start = _start_time + r * data_record_size;
+
+			float	offset,
+				duration;
+			const char
+				*offset_p = abuf.c_str(),
+				*duration_p,
+				*tals_p;
+			printf( "here's one: %s\n", offset_p);
+			while ( (tals_p = index( offset_p, 21)) ) {
+				if ( (duration = 0.,
+				      (duration_p = index( offset_p, 20))) &&
+				     duration_p < tals_p ) {
+					offset = stof( string (offset_p, duration_p - offset_p));
+					duration = stof( string (duration_p, tals_p - duration_p));
+				} else
+					offset = stof( string (offset_p, tals_p - offset_p));
+
+				auto tals = tokens( tals_p, (char)20);
+				for ( auto& t : tals )
+					common_annotations.emplace_back(
+						record_start + offset,
+						record_start + offset + duration,
+						t,
+						SAnnotation::TType::plain);
+			}
 		}
+	} catch (invalid_argument& ex) {
+		fprintf( stderr, "Bad offset or duration of embedded annotation\n");
+		return -1;
 	}
 
 	return 0;

-- 
Sleep experiment manager



More information about the debian-med-commit mailing list