[Pkg-octave-devel] Bug#296375: [bill@givebillmoney.com: Bug#296375: octave2.1: strftime crashes with an invalid structure as an argument]
John W. Eaton
"John W. Eaton" <jwe@bevo.che.wisc.edu>, 296375@bugs.debian.org
Tue, 22 Feb 2005 10:30:36 -0500
On 22-Feb-2005, Laurent Mazet <laurent.mazet@motorola.com> wrote:
| On Tue, 22 Feb 2005 06:57:53 -0600
| Rafael Laboissiere <rafael@debian.org> wrote:
| > package octave2.1
| > forwarded 296375 bug@octave.org
| > thank
| >
| >
| > Dear Octave maintainers,
| >
| > I confirm that the problem reported below against the octave2.1 Debian
| > package persists in Octave 2.1.65.
| >
| > tm.year = 2000;
| > tm.mon = 1;
| > tm.day = 1;
| >
| > strftime("%Y%m%d", tm)
|
| This patch fixs the uncomplet tm structure
Thanks for the patch. I chose a slightly different solution.
jwe
src/ChangeLog:
2005-02-22 John W. Eaton <jwe@octave.org>
* oct-map.cc (Octave_map::intfield, Octave_map::stringfield):
New functions.
* oct-map.h: Provide decls.
* DLD-FUNCTIONS/time.cc (extract_tm): Use intfield and stringfield
to access map elements.
Index: src/oct-map.cc
===================================================================
RCS file: /usr/local/cvsroot/octave/src/oct-map.cc,v
retrieving revision 1.37
diff -u -r1.37 oct-map.cc
--- src/oct-map.cc 9 Nov 2004 18:31:26 -0000 1.37
+++ src/oct-map.cc 22 Feb 2005 15:22:38 -0000
@@ -42,6 +42,33 @@
return p != end () ? p->second : Cell ();
}
+int
+Octave_map::intfield (const std::string& k, int def_val) const
+{
+ int retval = def_val;
+
+ Cell c = contents (k);
+
+ if (! c.is_empty ())
+ retval = c(0).int_value ();
+
+ return retval;
+}
+
+std::string
+Octave_map::stringfield (const std::string& k,
+ const std::string& def_val) const
+{
+ std::string retval = def_val;
+
+ Cell c = contents (k);
+
+ if (! c.is_empty ())
+ retval = c(0).string_value ();
+
+ return retval;
+}
+
string_vector
Octave_map::keys (void) const
{
Index: src/oct-map.h
===================================================================
RCS file: /usr/local/cvsroot/octave/src/oct-map.h,v
retrieving revision 1.35
diff -u -r1.35 oct-map.h
--- src/oct-map.h 9 Nov 2004 18:31:26 -0000 1.35
+++ src/oct-map.h 22 Feb 2005 15:22:38 -0000
@@ -99,6 +99,11 @@
Cell contents (const_iterator p) const
{ return contents (key(p)); }
+ int intfield (const std::string& k, int def_val = 0) const;
+
+ std::string stringfield (const std::string& k,
+ const std::string& def_val = std::string ()) const;
+
const_iterator seek (const std::string& k) const { return map.find (k); }
bool contains (const std::string& k) const
Index: src/DLD-FUNCTIONS/time.cc
===================================================================
RCS file: /usr/local/cvsroot/octave/src/DLD-FUNCTIONS/time.cc,v
retrieving revision 1.18
diff -u -r1.18 time.cc
--- src/DLD-FUNCTIONS/time.cc 22 Sep 2004 12:38:10 -0000 1.18
+++ src/DLD-FUNCTIONS/time.cc 22 Feb 2005 15:22:39 -0000
@@ -60,17 +60,17 @@
{
octave_base_tm tm;
- tm.usec (m.contents ("usec")(0) . int_value ());
- tm.sec (m.contents ("sec")(0) . int_value ());
- tm.min (m.contents ("min")(0) . int_value ());
- tm.hour (m.contents ("hour")(0) . int_value ());
- tm.mday (m.contents ("mday")(0) . int_value ());
- tm.mon (m.contents ("mon")(0) . int_value ());
- tm.year (m.contents ("year")(0) . int_value ());
- tm.wday (m.contents ("wday")(0) . int_value ());
- tm.yday (m.contents ("yday")(0) . int_value ());
- tm.isdst (m.contents ("isdst")(0) . int_value ());
- tm.zone (m.contents ("zone")(0) . string_value ());
+ tm.usec (m.intfield ("usec"));
+ tm.sec (m.intfield ("sec"));
+ tm.min (m.intfield ("min"));
+ tm.hour (m.intfield ("hour"));
+ tm.mday (m.intfield ("mday"));
+ tm.mon (m.intfield ("mon"));
+ tm.year (m.intfield ("year"));
+ tm.wday (m.intfield ("wday"));
+ tm.yday (m.intfield ("yday"));
+ tm.isdst (m.intfield ("isdst"));
+ tm.zone (m.stringfield ("zone"));
return tm;
}