Commit Graph

20 Commits

Author SHA1 Message Date
Iván Pérez 153e2e5985 Spaces to tab 2016-09-12 09:00:04 +02:00
Iván Pérez 0ff75111b6 WString: add `toDouble`
`toFloat` internally converts into double and then truncates into a
float, so why not add a method to return the double?
2016-09-12 08:56:02 +02:00
Sandeep Mistry 5636b0488c Make String::move of an invalidated String result in an invalidated String 2016-07-12 17:29:13 -04:00
Matthijs Kooijman c6750aa1a1 Check for __cplusplus >= 201103L as well as __GXX_EXPERIMENTAL_CXX0X__
Gcc 4.8 defines __cplusplus as 201103L, so we can check for that now. It
still also defines __GXX_EXPERIMENTAL_CXX0X__, but this could help on
other compilers, or if gcc ever decides to stop defining the
experimental macro.
2015-07-16 13:06:10 +02:00
Matthijs Kooijman 8c20fbb966 Fix off-by-one in String::substring
When checking the `left` argument, it previously allowed having
left == len. However, this means the substring starts one past the last
character in the string and should return the empty string. In practice,
this already worked correctly, because buffer[len] contains the trailing
nul, so it would (re)assign the empty string to `out`.

However, fixing this check makes it a bit more logical, and prevents a
fairly unlikely out-of-buffer write (to address 0x0) when calling
substring on an invalidated String:

	String bar = (char*)NULL;
	bar.substring(0, 0);
2014-09-10 13:42:06 +02:00
Matthijs Kooijman 0ef95bcf76 Simplify String::remove(unsigned int)
Previously, this method calculated the length of the string from the
given index onwards. However, the other remove() method called already
contains code for this calculation, which is used when the count passed
in is too big. This means we can just pass in a very big count that is
guaranteed to point past the end of the string, shrinking the remove
method by a few bytes.
2014-09-10 12:33:25 +02:00
Matthijs Kooijman 33df998351 Fix bounds check in String::remove()
Previously, if you passed in a very big index and/or count, the
`index + count` could overflow, making the count be used as-is instead
of being truncated (causing the string to be updated wrongly and
potentially writing to arbitrary memory locations).

We can rewrite the comparison to use `len - index` instead. Since we
know that index < len, we are sure this subtraction does not overflow,
regardless of what values of index and count we pass in.

As an added bonus, the `len - index` value already needed be calculated
inside the if, so this saves a few instructions in the generated code.

To illustrate this problem, consider this code:

String foo = "foo";
Serial.println(foo.length()); // Prints 3
foo.remove(1, 65535); // Should remove all but first character
Serial.println(foo.length()); // Prints 4 without this patch

Not shown in this is example is that some arbitrary memory is written
as well.
2014-09-10 12:33:25 +02:00
Matthijs Kooijman 57b3cf3203 Remove unneeded check in String::remove(unsigned int)
This check already happens in the remove(unsigned int, unsigned int)
method that is caled, so there is no need to also check this here.
2014-09-10 12:33:24 +02:00
Cristian Maglie 72da34cadc Improved portability of String class (maniacbug) 2014-01-01 17:22:40 +01:00
Matthijs Kooijman d2829c7885 Use PGM_P instead of prog_char
On later versions of avr-libc, prog_char is deprecated. In 0acebeeff48
the one occurence of prog_char was replaced by "char PROGMEM", which is
not entirely correct (PROGMEM is supposed to be an attribute on a
variable, not on a type, even though this is how things work in older
libc versions). However, in 1130fede3a2 a few new occurences of
prog_char are introduced, which break compilation on newer libc versions
again.

This commit changes all these pointer types to use the PGM_P macro from
<avr/pgmspace.h>. This macro is just "const char *" in newer libc
versions and "const prog_char *" in older versions, so it should always
work.

References #795
2013-12-31 20:01:40 +01:00
Cristian Maglie 4f71b3baa7 Fixed String class regression after f80c6c5f35cddcf4761a3c97feb8504425e9d27d
This should make explicit String-from-integer constructor working again:

   int a = 10;
   String(a, 4);
2013-09-03 18:40:30 +02:00
Cristian Maglie 4418604a48 Removed unused flags from String (free 1 byte of SRAM) 2013-08-20 15:15:47 +02:00
Cristian Maglie bc4f2afde9 String: fixed number of whitespaces in concat() methods 2013-06-28 09:53:25 +02:00
Cristian Maglie 44f4e7988e String: changed default to 2 decimal digits 2013-06-21 21:23:12 +02:00
Cristian Maglie ffb7f776e9 Fixed buffer overflow on String class (Paul Stoffregen) 2013-06-06 20:04:43 +02:00
Cristian Maglie cad0f00c61 Merged various bugfix / improvements to String class.
Merge branch 'master' into ide-1.5.x
2013-06-06 19:54:58 +02:00
Cristian Maglie 16351896d0 Added support for Flash string on String class. 2013-06-06 16:33:20 +02:00
Cristian Maglie bfee6f1bf2 String class: removed deep copy on substring method.
Small code cleanup.
2013-06-06 16:33:20 +02:00
Cristian Maglie 49d12c697e Pre-merge upstream Arduino 2012-05-22 11:23:47 +02:00
Cristian Maglie 822dcb0989 Created second level in hardware folder: hardware/PACKAGE/PLATFORM/...
Made some helper class for files filtering.
platforms.txt now contains only one platform at a time.
Some cleanup in Compiler and AvrDudeUploader classes.
2011-12-30 15:46:04 +01:00