This is an automated email from the git hooks/post-receive script. hmmr-guest pushed a commit to branch master in repository aghermann.
commit d9db86c5537166be13644af898b410520615db2c Author: Andrei Zavada <[email protected]> Date: Tue Sep 10 02:21:07 2013 +0300 SF: patterns fixes and improvements * load patterns from symlinked files; * rename, not delete, bad files in various pattern locations; * regression fixes. --- upstream/ChangeLog | 4 + upstream/src/aghermann/patterns/patterns.cc | 180 ++++++++++---------- upstream/src/aghermann/patterns/patterns.hh | 7 +- upstream/src/aghermann/patterns/patterns.ii | 2 +- .../src/aghermann/ui/sf/d/patterns-profiles.cc | 4 +- .../src/aghermann/ui/sf/d/patterns-profiles_cb.cc | 6 +- 6 files changed, 110 insertions(+), 93 deletions(-) diff --git a/upstream/ChangeLog b/upstream/ChangeLog index db22760..a12124b 100644 --- a/upstream/ChangeLog +++ b/upstream/ChangeLog @@ -1,5 +1,9 @@ v.0.9.2 (2013-xx-xx) * Separate upstream tree from various distribution-related files. + * SF: trivial optimisation in pattern search. + * SF: load patterns from symlinked files. + * SF: don't blindly delete files in various pattern locations, + just append ~ to their file names. v.0.9.1.1 (2013-07-24) * Fix 32-bit builds where sizeof(size_t) != sizeof(unsigned long). diff --git a/upstream/src/aghermann/patterns/patterns.cc b/upstream/src/aghermann/patterns/patterns.cc index b4289d9..2062d51 100644 --- a/upstream/src/aghermann/patterns/patterns.cc +++ b/upstream/src/aghermann/patterns/patterns.cc @@ -34,87 +34,6 @@ template int CPatternTool<TFloat>::do_search( const valarray<TFloat>&, size_t); namespace agh { namespace pattern { -template <> -int -agh::pattern::SPattern<TFloat>:: -load( const string& fname_) -{ - const auto& fname = fname_.c_str(); - - FILE *fd = fopen( fname, "r"); - if ( fd ) { - size_t full_sample; - double t1, t2, t3, t4; - if ( fscanf( fd, - "%lg %u %lg %lg %lg %lg %u" - " %lg %lg %lg %lg" - " %zu %zu %zu %zu\n" - "--DATA--\n", - &Pp.env_scope, - &Pp.bwf_order, &Pp.bwf_ffrom, &Pp.bwf_fupto, - &Pp.dzcdf_step, &Pp.dzcdf_sigma, &Pp.dzcdf_smooth, - &t1, &t2, &t3, &t4, - &samplerate, &context.first, &context.second, - &full_sample) == 15 ) { - - criteria = CMatch<float>(t1, t2, t3, t4); - - if ( samplerate == 0 || samplerate > 4096 || - full_sample == 0 || full_sample > samplerate * 10 || - context.first > samplerate * 2 || - context.second > samplerate * 2 || - not Pp.is_sane() ) { - string msg = agh::str::sasprintf( - "load_pattern(\"%s\"): bogus data in header; removing file", - fname); - fprintf( stderr, "%s\n", msg.c_str()); - thing.resize( 0); - fclose( fd); - unlink( fname); - return -3; - } - - thing.resize( full_sample); - for ( size_t i = 0; i < full_sample; ++i ) { - double d; - if ( fscanf( fd, "%la", &d) != 1 ) { - string msg = agh::str::sasprintf( - "load_pattern(\"%s\"): short read at sample %zu; removing file", - fname, i); - fprintf( stderr, "%s\n", msg.c_str()); - thing.resize( 0); - fclose( fd); - unlink( fname); - throw invalid_argument (msg); - } else - thing[i] = d; - } - - } else { - thing.resize( 0); - string msg = agh::str::sasprintf( "load_pattern(\"%s\"): bad header, so removing file", fname); - fprintf( stderr, "%s\n", msg.c_str()); - fclose( fd); - unlink( fname); - return -2; - } - - fclose( fd); - - } else { - string msg = agh::str::sasprintf( "Failed to open pattern %s", fname); - fprintf( stderr, "%s\n", msg.c_str()); - return -1; - } - - printf( "loaded pattern in %s\n", fname); - saved = true; - name = agh::str::tokens( fname, "/").back(); - path = fname; - - return 0; -} - template <> int @@ -168,6 +87,87 @@ save() } + +template <> +int +agh::pattern::SPattern<TFloat>:: +load( const string& fname_) +{ + string msg; + using agh::str::sasprintf; + + const char* fname = fname_.c_str(); + + FILE *fd = NULL; + + try { + { + struct stat attr; + if ( 0 != lstat( fname, &attr) ||!S_ISREG (attr.st_mode) ) + return -1; + } + + if ( !(fd = fopen( fname, "r")) ) + throw invalid_argument ("Failed to open"); + + size_t full_sample; + double t1, t2, t3, t4; + if ( 15 != fscanf( fd, + "%lg %u %lg %lg %lg %lg %u" + " %lg %lg %lg %lg" + " %zu %zu %zu %zu\n" + "--DATA--\n", + &Pp.env_scope, + &Pp.bwf_order, &Pp.bwf_ffrom, &Pp.bwf_fupto, + &Pp.dzcdf_step, &Pp.dzcdf_sigma, &Pp.dzcdf_smooth, + &t1, &t2, &t3, &t4, + &samplerate, &context.first, &context.second, + &full_sample) ) { + throw invalid_argument ("Bogus data in header"); + } + + criteria = CMatch<float>(t1, t2, t3, t4); + + if ( samplerate == 0 || samplerate > 4096 || + full_sample == 0 || full_sample > samplerate * 10 || + context.first > samplerate * 2 || + context.second > samplerate * 2 || + not Pp.is_sane() ) + throw invalid_argument ("Inconsistent data in header"); + + thing.resize( full_sample); + for ( size_t i = 0; i < full_sample; ++i ) { + double d; + if ( fscanf( fd, "%la", &d) != 1 ) + throw invalid_argument (sasprintf( "short read at sample %zu", i)); + thing[i] = d; + } + + fclose( fd); + + printf( "loaded pattern in %s\n", fname); + saved = true; + name = agh::str::tokens( fname, "/").back(); + path = fname; + + return 0; + + } catch (invalid_argument& msg) { + + fprintf( stderr, "load_pattern(\"%s\"): %s\n", fname, msg.what()); + if ( fd ) + fclose( fd); + + if (0 == rename( fname, (string(fname) + "~").c_str())) + fprintf( stderr, "load_pattern(\"%s\"): file renamed as *~\n", fname); + else + fprintf( stderr, "load_pattern(\"%s\"): tried, but failed, to rename as *~\n", fname); + + return -2; + } +} + + template <> int SPattern<TFloat>:: @@ -199,17 +199,23 @@ load_patterns_from_location<TFloat>( const string& loc, agh::TExpDirLevel origin if ( total != -1 ) { for ( int i = 0; i < total; ++i ) { - try { - ret.emplace_back( loc + '/' + eps[i]->d_name); - ret.back().origin = origin; - } catch (invalid_argument& ex) { - ; - } + const string fname = loc + '/' + eps[i]->d_name; + struct stat attr; + if ( 0 == lstat( fname.c_str(), &attr) && S_ISREG (attr.st_mode) && + '~' != fname.back() ) + try { + ret.emplace_back( fname); + ret.back().origin = origin; + } catch (invalid_argument& ex) { + ; + } + free( eps[i]); } free( (void*)eps); } + printf("found %zu patterns in %s\n", ret.size(), agh::exp_dir_level_s(origin)); return move(ret); } diff --git a/upstream/src/aghermann/patterns/patterns.hh b/upstream/src/aghermann/patterns/patterns.hh index 629ac26..cd7a2a8 100644 --- a/upstream/src/aghermann/patterns/patterns.hh +++ b/upstream/src/aghermann/patterns/patterns.hh @@ -225,7 +225,12 @@ struct SPattern { explicit SPattern<T> (const string& fname) { - load( fname); + if (load( fname)) + throw invalid_argument (string("Bad pattern in ") + fname); + } + ~SPattern<T> () + { + save(); } SPattern& diff --git a/upstream/src/aghermann/patterns/patterns.ii b/upstream/src/aghermann/patterns/patterns.ii index 9b0c704..eac2a20 100644 --- a/upstream/src/aghermann/patterns/patterns.ii +++ b/upstream/src/aghermann/patterns/patterns.ii @@ -26,7 +26,7 @@ do_search( const valarray<T>& fenv_l, { size_t fsize = ftarget_freq.size(); if ( inc == 0 || inc > fsize ) { - fprintf( stderr, "%s: bad search increment: %zu\n", __FUNCTION__, inc); + fprintf( stderr, "bad search increment: %zu\n", inc); return -1; } diff --git a/upstream/src/aghermann/ui/sf/d/patterns-profiles.cc b/upstream/src/aghermann/ui/sf/d/patterns-profiles.cc index 95f67ec..f92f936 100644 --- a/upstream/src/aghermann/ui/sf/d/patterns-profiles.cc +++ b/upstream/src/aghermann/ui/sf/d/patterns-profiles.cc @@ -143,7 +143,9 @@ populate_combo() if ( not patterns.empty() ) { GtkTreeIter iter, current_pattern_iter; for ( auto I = patterns.begin(); I != patterns.end(); ++I ) { - gtk_list_store_append( mSFFDPatterns, &iter); + gtk_list_store_append( + mSFFDPatterns, + &iter); gtk_list_store_set( mSFFDPatterns, &iter, 0, snprintf_buf( "%s %s", agh::exp_dir_level_s(I->origin), I->name.c_str()), diff --git a/upstream/src/aghermann/ui/sf/d/patterns-profiles_cb.cc b/upstream/src/aghermann/ui/sf/d/patterns-profiles_cb.cc index baff403..457b737 100644 --- a/upstream/src/aghermann/ui/sf/d/patterns-profiles_cb.cc +++ b/upstream/src/aghermann/ui/sf/d/patterns-profiles_cb.cc @@ -69,9 +69,8 @@ bSFFDProfileSave_clicked_cb( // replace unnamed, else make a duplicate auto& P = (FD.current_pattern->origin == agh::TExpDirLevel::transient) - ? *FD.current_pattern - : (FD.patterns.insert(FD.current_pattern, *FD.current_pattern), - *(++FD.current_pattern)); + ? * FD.current_pattern + : *(FD.current_pattern = FD.patterns.insert(FD.current_pattern, *FD.current_pattern)); P.name = gtk_entry_get_text( FD.eSFFDPatternSaveName); @@ -88,6 +87,7 @@ bSFFDProfileSave_clicked_cb( TExpDirLevel::user, pattern::make_user_location()); + P.path.append( "/").append( P.name); P.saved = false; FD.populate_combo(); -- Alioth's /git/debian-med/git-commit-notice on /srv/git.debian.org/git/debian-med/aghermann.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
