New Upstream Snapshot - lastz
Ready changes
Summary
Merged new upstream version: 1.04.22+git20221105.1.e66c1da (was: 1.04.22).
Resulting package
Built on 2022-11-18T11:53 (took 8m31s)
The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:
apt install -t fresh-snapshots lastz-dbgsymapt install -t fresh-snapshots lastz-examplesapt install -t fresh-snapshots lastz
Lintian Result
- lastz-dbgsym_1.04.22+git20221105.1.e66c1da-1~jan+nus1_amd64.deb
- lastz-examples_1.04.22+git20221105.1.e66c1da-1~jan+nus1_all.deb
- lastz_1.04.22+git20221105.1.e66c1da-1~jan+nus1.dsc
- lastz_1.04.22+git20221105.1.e66c1da-1~jan+nus1_amd64.buildinfo
- lastz_1.04.22+git20221105.1.e66c1da-1~jan+nus1_amd64.deb
- lastz_1.04.22+git20221105.1.e66c1da-1~jan+nus1_amd64.changes
Diff
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index c7ddc1a..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,18 +0,0 @@
-# Compiled source #
-###################
-*.o
-src/lastz
-src/lastz_D
-src/lastz_32
-
-# Makefile variants #
-###################
-Makefile.*
-
-# Test results #
-###################
-test_results/base_test.*
-
-# OS generated files #
-######################
-.DS_Store
diff --git a/debian/changelog b/debian/changelog
index e33da10..d4c5866 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+lastz (1.04.22+git20221105.1.e66c1da-1) UNRELEASED; urgency=low
+
+ * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk> Fri, 18 Nov 2022 11:46:47 -0000
+
lastz (1.04.22-2) unstable; urgency=medium
* Fix watch file
diff --git a/debian/patches/fix_signed_char.patch b/debian/patches/fix_signed_char.patch
index 83377c3..decdd5d 100644
--- a/debian/patches/fix_signed_char.patch
+++ b/debian/patches/fix_signed_char.patch
@@ -3,8 +3,10 @@ Description: Fix Build issue on a couple of architectures
Author: Andreas Tille <tille@debian.org>
Last-Update: Thu, 15 Oct 2020 11:02:55 +0200
---- a/src/sequences.c
-+++ b/src/sequences.c
+Index: lastz.git/src/sequences.c
+===================================================================
+--- lastz.git.orig/src/sequences.c
++++ lastz.git/src/sequences.c
@@ -5101,14 +5101,14 @@ static int find_next_general_fasta_coi
// find the next header
diff --git a/debian/patches/propagate_cflags.patch b/debian/patches/propagate_cflags.patch
index 00ed4d7..7e06504 100644
--- a/debian/patches/propagate_cflags.patch
+++ b/debian/patches/propagate_cflags.patch
@@ -6,9 +6,11 @@ Description: Propagate DEB_CFLAGS_MAINT_APPEND = -Wno-stringop-truncation
Reviewed-By: Étienne Mollier <emollier@debian.org>
Last-Update: 2021-11-02
---- lastz.orig/src/Makefile
-+++ lastz/src/Makefile
-@@ -71,7 +71,7 @@
+Index: lastz.git/src/Makefile
+===================================================================
+--- lastz.git.orig/src/Makefile
++++ lastz.git/src/Makefile
+@@ -71,7 +71,7 @@ VERSION_FLAGS= \
-DSUBVERSION_REV="\"${SUBVERSION_REV}"\"
@@ -17,7 +19,7 @@ Last-Update: 2021-11-02
srcFiles = lastz infer_scores \
-@@ -91,23 +91,23 @@
+@@ -91,23 +91,23 @@ incFiles = lastz.h infer_scores.h \
utilities.h dna_utilities.h sequences.h capsule.h
%.o: %.c version.mak ${incFiles}
diff --git a/debian/patches/spelling.patch b/debian/patches/spelling.patch
index bbd29c8..eb0098f 100644
--- a/debian/patches/spelling.patch
+++ b/debian/patches/spelling.patch
@@ -2,8 +2,10 @@ Description: Fix spelling
Author: Andreas Tille <tille@debian.org>
Last-Update: Thu, 15 Oct 2020 11:02:55 +0200
---- a/src/dna_utilities.c
-+++ b/src/dna_utilities.c
+Index: lastz.git/src/dna_utilities.c
+===================================================================
+--- lastz.git.orig/src/dna_utilities.c
++++ lastz.git/src/dna_utilities.c
@@ -1147,7 +1147,7 @@ exscoreset* read_score_set
if ((xss->ss.gapOpenSet) && (xss->ss.gapOpen + xss->ss.gapExtend <= 0))
@@ -13,9 +15,11 @@ Last-Update: Thu, 15 Oct 2020 11:02:55 +0200
name, xss->ss.gapOpen, xss->ss.gapExtend);
if ((xss->ss.gapExtendSet) && (xss->ss.gapExtend < 0))
suicidef (scoreFmt " is not a valid gap extension penalty (in %s)\n",
---- a/src/lastz.c
-+++ b/src/lastz.c
-@@ -4883,7 +4883,7 @@ static void format_options (void)
+Index: lastz.git/src/lastz.c
+===================================================================
+--- lastz.git.orig/src/lastz.c
++++ lastz.git/src/lastz.c
+@@ -4918,7 +4918,7 @@ static void format_options (void)
fprintf (helpout, "there may be a question as to whether or not lastz completed successfully. The\n");
fprintf (helpout, "line \"# lastz end-of-file\" is written to output as the last line. Note that\n");
fprintf (helpout, "in some formats this is *not* a legal line; the user must remove it before any\n");
@@ -24,7 +28,7 @@ Last-Update: Thu, 15 Oct 2020 11:02:55 +0200
exit (EXIT_FAILURE);
}
-@@ -8771,7 +8771,7 @@ static void parse_options
+@@ -8843,7 +8843,7 @@ static void parse_options
if ((haveGapOpen) && (gapOpen + gapExtend <= 0))
chastise ("%s is not a valid gap open penalty with extension penalty %s\n"
diff --git a/src/gapped_extend.c b/src/gapped_extend.c
index 84e6936..71843d5 100755
--- a/src/gapped_extend.c
+++ b/src/gapped_extend.c
@@ -32,6 +32,18 @@
//
//----------
+//----------
+//
+// ~~~ github issue 52 ~~~
+//
+// Some of the code here has potential overflow issues if tb->size > INT_MAX.
+// This is because it, and some derived variables, are incorrectly treated as
+// if they were ints. As this writing (Oct/2022) it is more prudent to limit
+// tb->size to INT_MAX (that limit is enforced in lastz.c) than to risk
+// breaking the core gapped alignment code here.
+//
+//----------
+
//----------
//
// other files
@@ -2252,6 +2264,10 @@ static score score_identical_partition_of
//
//----------
+// ~~~ github issue 52 ~~~
+// The formula here to compute the number of cells is subject to integer
+// overflow if size>INT_MAX.
+
tback* new_traceback
(u32 size)
{
@@ -3306,6 +3322,7 @@ static void tbrow_needed (u32 rowsNeeded)
if (rowsNeeded <= tbRowLen) return;
+ // ~~~ github issue 52 ~~~ this should test for overflow
needed = round_up(sizeof(u32)*(rowsNeeded+1+rowsNeeded/16), 512*1024);
tbRow = realloc_or_die ("ydrop_one_sided_align tbRow", tbRow, needed);
tbRowLen = needed / sizeof(u32);
@@ -3320,6 +3337,9 @@ void free_traceback_rows (void)
//=== ydrop_one_sided_align ===
+// ~~~ github issue 52 ~~~
+// tbLen should be u32, not int
+// tbNeeded should be u32, not int
static score ydrop_one_sided_align
(alignio* io,
@@ -3574,6 +3594,7 @@ static score ydrop_one_sided_align
if (RY < LY) RY = LY; // (see note 11)
tbNeeded = RY - LY + yDropTail;
+ // ~~~ github issue 52 ~~~ could this test fail due to overflow?
if ((tbp - tb->space) + tbNeeded >= tbLen)
{
if (gapped_extend_inhibitTruncationReport)
@@ -3778,6 +3799,7 @@ dp_finished:
cTemp = 0; // (place to set a breakpoint)
#endif // snoopAlgorithm
+ // ~~~ github issue 52 ~~~ need to check if this loop has overflow issues
for (prevOp=0 ; (row>=1) || (col>0) ; prevOp=op)
{
link = tb->space[tbRow[row] + col];
diff --git a/src/lastz.c b/src/lastz.c
index 82d5011..4ae8595 100755
--- a/src/lastz.c
+++ b/src/lastz.c
@@ -126,6 +126,7 @@ char* programRevisionDate = REVISION_DATE;
#include <string.h> // standard C string stuff
#include <ctype.h> // standard C upper/lower stuff
#include <stdarg.h> // standard C variable argument list stuff
+#include <limits.h> // standard C value limit stuff
#include <math.h> // standard C math stuff
#include <time.h> // standard C time stuff
#include "build_options.h" // build options
@@ -447,6 +448,8 @@ static const int defaultTwinsYes = false;
static const int defaultTwinMinGap = 0;
static const int defaultTwinMaxGap = 10;
+static int forceReportFilteredHsps = false;
+
static int dbgShowMatrix = false;
static int dbgDumpTargetSequence = false;
static int dbgDumpQuerySequence = false;
@@ -470,6 +473,7 @@ static char* dbgQueryProgressPrefix = "";
static int dbgTargetProgress = 0;
static char* dbgTargetProgressPrefix = "";
#endif // allowSeveralTargets
+static int dbgFilterProgress = 0;
static int dbgReportFinish = false;
#define innerWordSize 7 // word size for inner alignment seed
@@ -585,7 +589,7 @@ static void remove_interval_seeds (unspos b, unspos e, void* info);
static u32 report_hsps (void* info,
unspos pos1, unspos pos2, unspos length,
score s);
-static u32 collect_filtered_hsps (void* info,
+static u32 report_filtered_hsps (void* info,
unspos pos1, unspos pos2, unspos length,
score s);
static u32 collect_hsps (void* info,
@@ -2806,9 +2810,14 @@ void set_up_hit_processor
&& (dbgShowHspCountsMin == (u32)-1)))
hpInfo->reporter = report_hsps;
- if ((params->hspImmediate) && (!params->gappedExtend))
+ if (forceReportFilteredHsps)
{
- hpInfo->reporter = collect_filtered_hsps;
+ hpInfo->reporter = report_filtered_hsps;
+ hpInfo->reporterInfo = NULL;
+ }
+ else if ((params->hspImmediate) && (!params->gappedExtend))
+ {
+ hpInfo->reporter = report_filtered_hsps;
hpInfo->reporterInfo = NULL;
}
else if ((params->hspImmediate) && (params->gappedExtend))
@@ -2910,25 +2919,25 @@ void set_up_hit_processor
}
#ifdef snoopHitProc
- if (*_hitProc == process_for_plain_hit) fprintf (stderr, "hitProc == process_for_plain_hit (%p)\n", *_hitProc);
- else if (*_hitProc == process_for_recoverable_hit) fprintf (stderr, "hitProc == process_for_recoverable_hit (%p)\n", *_hitProc);
- else if (*_hitProc == process_for_simple_hit) fprintf (stderr, "hitProc == process_for_simple_hit (%p)\n", *_hitProc);
- else if (*_hitProc == process_for_twin_hit) fprintf (stderr, "hitProc == process_for_twin_hit (%p)\n", *_hitProc);
- else fprintf (stderr, "hitProc == ??? (%p)\n", *_hitProc);
-
- if (*_hitProcInfo == &simpleInfo) fprintf (stderr, "hitProcInfo == simpleInfo (%p)\n", *_hitProcInfo);
- else if (*_hitProcInfo == &twinInfo) fprintf (stderr, "hitProcInfo == twinInfo (%p)\n", *_hitProcInfo);
- else fprintf (stderr, "hitProcInfo == ??? (%p)\n", *_hitProcInfo);
-
- if (hpInfo->reporter == collect_hsps) fprintf (stderr, "hpInfo->reporter == collect_hsps (%p)\n", hpInfo->reporter);
- else if (hpInfo->reporter == report_hsps) fprintf (stderr, "hpInfo->reporter == report_hsps (%p)\n", hpInfo->reporter);
- else if (hpInfo->reporter == collect_filtered_hsps) fprintf (stderr, "hpInfo->reporter == collect_filtered_hsps (%p)\n", hpInfo->reporter);
- else if (hpInfo->reporter == gappily_extend_hsps) fprintf (stderr, "hpInfo->reporter == gappily_extend_hsps (%p)\n", hpInfo->reporter);
- else fprintf (stderr, "hpInfo->reporter == ??? (%p)\n", hpInfo->reporter);
-
- if (hpInfo->reporterInfo == &gappilyInfo) fprintf (stderr, "hpInfo->reporterInfo == gappily_extend_hsps (%p)\n", hpInfo->reporterInfo);
- else if (hpInfo->reporterInfo == NULL) fprintf (stderr, "hpInfo->reporterInfo == NULL (%p)\n", hpInfo->reporterInfo);
- else fprintf (stderr, "hpInfo->reporterInfo == ??? (%p)\n", hpInfo->reporterInfo);
+ if (*_hitProc == process_for_plain_hit) fprintf (stderr, "hitProc == process_for_plain_hit (%p)\n", *_hitProc);
+ else if (*_hitProc == process_for_recoverable_hit) fprintf (stderr, "hitProc == process_for_recoverable_hit (%p)\n", *_hitProc);
+ else if (*_hitProc == process_for_simple_hit) fprintf (stderr, "hitProc == process_for_simple_hit (%p)\n", *_hitProc);
+ else if (*_hitProc == process_for_twin_hit) fprintf (stderr, "hitProc == process_for_twin_hit (%p)\n", *_hitProc);
+ else fprintf (stderr, "hitProc == ??? (%p)\n", *_hitProc);
+
+ if (*_hitProcInfo == &simpleInfo) fprintf (stderr, "hitProcInfo == simpleInfo (%p)\n", *_hitProcInfo);
+ else if (*_hitProcInfo == &twinInfo) fprintf (stderr, "hitProcInfo == twinInfo (%p)\n", *_hitProcInfo);
+ else fprintf (stderr, "hitProcInfo == ??? (%p)\n", *_hitProcInfo);
+
+ if (hpInfo->reporter == collect_hsps) fprintf (stderr, "hpInfo->reporter == collect_hsps (%p)\n", hpInfo->reporter);
+ else if (hpInfo->reporter == report_hsps) fprintf (stderr, "hpInfo->reporter == report_hsps (%p)\n", hpInfo->reporter);
+ else if (hpInfo->reporter == report_filtered_hsps) fprintf (stderr, "hpInfo->reporter == report_filtered_hsps (%p)\n", hpInfo->reporter);
+ else if (hpInfo->reporter == gappily_extend_hsps) fprintf (stderr, "hpInfo->reporter == gappily_extend_hsps (%p)\n", hpInfo->reporter);
+ else fprintf (stderr, "hpInfo->reporter == ??? (%p)\n", hpInfo->reporter);
+
+ if (hpInfo->reporterInfo == &gappilyInfo) fprintf (stderr, "hpInfo->reporterInfo == gappily_extend_hsps (%p)\n", hpInfo->reporterInfo);
+ else if (hpInfo->reporterInfo == NULL) fprintf (stderr, "hpInfo->reporterInfo == NULL (%p)\n", hpInfo->reporterInfo);
+ else fprintf (stderr, "hpInfo->reporterInfo == ??? (%p)\n", hpInfo->reporterInfo);
#endif // snoopHitProc
}
@@ -3798,6 +3807,98 @@ static u32 report_hsps
return length;
}
+//----------
+// [[-- a seed hit reporter function --]]
+//
+// report_filtered_hsps--
+// Report a seed hit or HSP (i.e. just write it to output), so long as it
+// satisfies the current filtering criteria.
+//
+// Arguments and Return value: (see seed_search.h)
+//
+//----------
+//
+// Note: in earlier versions, this was collect_filtered_hsps(), but that was a
+// misnomer.
+//
+//----------
+
+static u32 report_filtered_hsps
+ (arg_dont_complain(void* info),
+ unspos pos1,
+ unspos pos2,
+ unspos length,
+ score s)
+ {
+ static u64 numHsps = 0;
+ static u64 numRejected = 0;
+ unspos startPos1 = pos1 - length;
+ unspos startPos2 = pos2 - length;
+ segment seg;
+
+ numHsps++;
+
+ if ((dbgFilterProgress != 0) && (numHsps % dbgFilterProgress == 1))
+ {
+ char* name2 = NULL;
+
+ if (currParams->seq2->partition.p == NULL) // sequence 2 is not partitioned
+ name2 = (currParams->seq1->useFullNames)? currParams->seq2->header
+ : currParams->seq2->shortHeader;
+ if ((name2 == NULL) || (name2[0] == 0)) name2 = "seq2";
+
+ fprintf (stderr, "filter: passed %s HSPs / rejected %s (%.2f%%) / %s.%s.pos=%s (%.2f%%)\n",
+ ucommatize(numHsps-numRejected), ucommatize(numRejected),
+ (100.0*numRejected) / numHsps,
+ name2,currParams->seq2->revCompFlags==rcf_forward?"fwd":"rev",ucommatize(pos2),
+ (100.0*pos2 / currParams->seq2->len));
+ }
+
+ // filter HSP by identity and/or coverage
+
+ if ((currParams->minIdentity > 0) || (currParams->maxIdentity < 1))
+ {
+ if (filter_segment_by_identity (currParams->seq1, startPos1,
+ currParams->seq2, startPos2, length,
+ currParams->minIdentity,
+ currParams->maxIdentity))
+ goto rejected;
+ }
+
+ if ((currParams->minCoverage > 0) || (currParams->maxCoverage < 1))
+ {
+ seg.pos1 = startPos1;
+ seg.pos2 = startPos2;
+ seg.length = length;
+ if (filter_segment_by_coverage (currParams->seq1, currParams->seq2, &seg,
+ currParams->minCoverage,
+ currParams->maxCoverage))
+ goto rejected;
+ }
+
+ if (currParams->minMatchCount > 0)
+ {
+ if (filter_segment_by_match_count (currParams->seq1, startPos1,
+ currParams->seq2, startPos2, length,
+ currParams->minMatchCount))
+ goto rejected;
+ }
+
+ if (currParams->maxMismatchCount >= 0)
+ {
+ if (filter_segment_by_mismatch_count (currParams->seq1, startPos1,
+ currParams->seq2, startPos2, length,
+ currParams->minMatchCount))
+ goto rejected;
+ }
+
+ return report_hsps (info, pos1, pos2, length, s);
+
+rejected:
+ numRejected++;
+ return 0;
+ }
+
//----------
// [[-- a seed hit reporter function --]]
//
@@ -3889,72 +3990,6 @@ static u32 collect_hsps
return 2*length;
}
-//----------
-// [[-- a seed hit reporter function --]]
-//
-// collect_filtered_hsps--
-// Collect a seed hit or HSP, so long as it satisfies the current filtering
-// criteria.
-//
-// Arguments and Return value: (see seed_search.h)
-//
-//----------
-
-static u32 collect_filtered_hsps
- (arg_dont_complain(void* info),
- unspos pos1,
- unspos pos2,
- unspos length,
- score s)
- {
- unspos startPos1 = pos1 - length;
- unspos startPos2 = pos2 - length;
- segment seg;
-
- // filter HSP by identity and/or coverage
-
- if ((currParams->minIdentity > 0) || (currParams->maxIdentity < 1))
- {
- if (filter_segment_by_identity (currParams->seq1, startPos1,
- currParams->seq2, startPos2, length,
- currParams->minIdentity,
- currParams->maxIdentity))
- goto filtered;
- }
-
- if ((currParams->minCoverage > 0) || (currParams->maxCoverage < 1))
- {
- seg.pos1 = startPos1;
- seg.pos2 = startPos2;
- seg.length = length;
- if (filter_segment_by_coverage (currParams->seq1, currParams->seq2, &seg,
- currParams->minCoverage,
- currParams->maxCoverage))
- goto filtered;
- }
-
- if (currParams->minMatchCount > 0)
- {
- if (filter_segment_by_match_count (currParams->seq1, startPos1,
- currParams->seq2, startPos2, length,
- currParams->minMatchCount))
- goto filtered;
- }
-
- if (currParams->maxMismatchCount >= 0)
- {
- if (filter_segment_by_mismatch_count (currParams->seq1, startPos1,
- currParams->seq2, startPos2, length,
- currParams->minMatchCount))
- goto filtered;
- }
-
- return report_hsps (info, pos1, pos2, length, s);
-
-filtered:
- return 0;
- }
-
//----------
//
// mirror_alignments--
@@ -6293,6 +6328,14 @@ static void parse_options_loop
}
// --allocate:traceback=<bytes> or --traceback=<bytes> or m=<bytes>
+ //
+ // ~~~ github issue 52 ~~~
+ // though tracebackMem is a u32, this must *not* exceed the maximum
+ // signed int; this is because some code in gapped_extend.c incorrectly
+ // treats tracebackMem, and derived variables, as if they were ints; as
+ // of this writing (Oct/2022) it is more prudent to limit tracebackMem
+ // to INT_MAX than to risk breaking the core code in gapped_extend.c;
+ // see notes in gapped_extend.c marked "github issue 52"
if ((strcmp_prefix (arg, "--allocate:traceback=") == 0)
|| (strcmp_prefix (arg, "--alloc:traceback=" ) == 0)
@@ -6301,7 +6344,15 @@ static void parse_options_loop
|| (strcmp_prefix (arg, "--traceback=" ) == 0)
|| (strcmp_prefix (arg, "m=" ) == 0))
{
- lzParams->tracebackMem = string_to_unitized_int (argStr, false /*units of 1,024*/);
+ int64 tracebackMemArg;
+ tracebackMemArg = string_to_unitized_int64 (argStr, false /*units of 1,024*/);
+ if (tracebackMemArg < 0)
+ chastise ("--allocate:traceback cannot be negative (%s)\n",arg);
+ if (tracebackMemArg == ((u32) INT_MAX)+1)
+ tracebackMemArg = INT_MAX; // special case so that "2G" is accepted
+ else if (tracebackMemArg > INT_MAX)
+ chastise ("--allocate:traceback cannot be more than 2G (%s)\n",arg);
+ lzParams->tracebackMem = (u32) tracebackMemArg;
goto next_arg;
}
@@ -7664,10 +7715,17 @@ static void parse_options_loop
|| (strcmp (arg, "--help=yasra") == 0))
{ expander_options ("yasra-specific options", "--yasra"); }
- // --tryout=<what> (unadvertised)
+ // --force:<what> (unadvertised)
+
+ if ((strcmp (arg, "--force:reportfilteredhsps") == 0)
+ || (strcmp (arg, "--force=reportfilteredhsps") == 0))
+ { forceReportFilteredHsps = true; goto next_arg; }
+
+ // --tryout:<what> (unadvertised)
#ifdef tryout
- if (strcmp (arg, "--tryout=immediategapped") == 0)
+ if ((strcmp (arg, "--tryout:immediategapped") == 0)
+ || (strcmp (arg, "--tryout=immediategapped") == 0))
{
lzParams->hspImmediate = true;
goto next_arg;
@@ -7931,6 +7989,12 @@ static void parse_options_loop
{ dbgQueryProgressPrefix = dbgTargetProgressPrefix = "==================== "; goto next_arg; }
#endif // allowSeveralTargets
+ if (strcmp_prefix (arg, "--progress:filter=") == 0)
+ {
+ dbgFilterProgress = string_to_unitized_int (argStr, true /*units of 1,000*/);
+ goto next_arg;
+ }
+
if ((strcmp (arg, "--debug=converge") == 0)
|| (strcmp (arg, "--debug=convergence") == 0))
{ infer_scores_watchConverge = true; goto next_arg; }
@@ -8562,6 +8626,14 @@ static void parse_options
lzParams->gappedExtend = false;
}
+ if (forceReportFilteredHsps)
+ {
+ if (lzParams->gappedExtend)
+ chastise ("-force:reportfilteredhsps can only be used with --nogapped\n");
+ if (lzParams->hspThreshold.t != 'S') // (hsps are adaptive)
+ chastise ("-force:reportfilteredhsps cannot be used with an adaptive HSP threshold\n");
+ }
+
//////////
// set up score set
//////////
diff --git a/src/lastz.h b/src/lastz.h
index e3b730e..ac5c1f1 100755
--- a/src/lastz.h
+++ b/src/lastz.h
@@ -240,6 +240,10 @@ typedef struct control
// .. alignment
u32 tracebackMem; // number of bytes to allocate to track
// .. gapped alignment traceback
+ // ~~~ github issue 52 ~~~
+ // though declared as a u32, tracebackMem
+ // .. must *not* exceed the maximum signed
+ // .. int
tback* traceback; // memory in which to track gapped alignment
// .. traceback
int nIsAmbiguous; // true => N is an ambiguous nucleotide
diff --git a/src/utilities.c b/src/utilities.c
index 6670552..5c534de 100755
--- a/src/utilities.c
+++ b/src/utilities.c
@@ -728,6 +728,7 @@ int string_to_unitized_int
if (isFloat)
{
+ // nota bene: this test is not correct when vf=2.0 and mult=2^30
if ((vf > 0) && ( vf*mult > INT_MAX)) goto overflow;
if ((vf < 0) && (-vf*mult > INT_MAX)) goto overflow;
v = (vf * mult) + .5;
diff --git a/src/version.mak b/src/version.mak
index fa5bdea..a453249 100644
--- a/src/version.mak
+++ b/src/version.mak
@@ -1,4 +1,4 @@
VERSION_MAJOR=1
VERSION_MINOR=04
-VERSION_SUBMINOR=22
-REVISION_DATE=20220807
+VERSION_SUBMINOR=29
+REVISION_DATE=20221105
Debdiff
[The following lists of changes regard files as different if they have different names, permissions or owners.]
Files in second set of .debs but not in first
-rw-r--r-- root/root /usr/lib/debug/.build-id/47/6960fe25c0e8c4a34e854191b01955c3c48499.debug -rw-r--r-- root/root /usr/lib/debug/.build-id/5c/ce8ba282556ea19930c6e05cf7576963b67494.debug
Files in first set of .debs but not in second
-rw-r--r-- root/root /usr/lib/debug/.build-id/98/0e632202a72e2e6c34dc3eac376256770a95da.debug -rw-r--r-- root/root /usr/lib/debug/.build-id/ca/3663c95ac4fe43396f1b0bd353db510a1d9186.debug
No differences were encountered between the control files of package lastz
Control files of package lastz-dbgsym: lines which differ (wdiff format)
Build-Ids: 980e632202a72e2e6c34dc3eac376256770a95da ca3663c95ac4fe43396f1b0bd353db510a1d9186 476960fe25c0e8c4a34e854191b01955c3c48499 5cce8ba282556ea19930c6e05cf7576963b67494
No differences were encountered between the control files of package lastz-examples