mirror of
https://github.com/arduino/Arduino.git
synced 2025-02-06 01:08:25 +01:00
[sam] updated Print class and all derivated classes.
This commit is contained in:
parent
f09771258e
commit
4da2833a81
@ -19,28 +19,24 @@
|
|||||||
#ifndef HardwareSerial_h
|
#ifndef HardwareSerial_h
|
||||||
#define HardwareSerial_h
|
#define HardwareSerial_h
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
#include "RingBuffer.h"
|
|
||||||
|
|
||||||
class HardwareSerial : public Stream
|
class HardwareSerial : public Stream
|
||||||
{
|
{
|
||||||
protected:
|
|
||||||
RingBuffer *_rx_buffer ;
|
|
||||||
RingBuffer *_tx_buffer ;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void begin( const uint32_t dwBaudRate ) =0 ;
|
void begin(unsigned long);
|
||||||
virtual void end( void ) =0 ;
|
void end();
|
||||||
virtual int available( void ) =0 ;
|
virtual int available(void);
|
||||||
virtual int peek( void ) =0 ;
|
virtual int peek(void);
|
||||||
virtual int read( void ) =0 ;
|
virtual int read(void);
|
||||||
virtual void flush( void ) =0 ;
|
virtual void flush(void);
|
||||||
virtual void write( const uint8_t c ) =0 ;
|
virtual size_t write(uint8_t);
|
||||||
|
using Print::write; // pull in write(str) and write(buf, size) from Print
|
||||||
|
operator bool();
|
||||||
|
};
|
||||||
|
|
||||||
// virtual void write( const char *str ) ;
|
extern void serialEventRun(void) __attribute__((weak));
|
||||||
// virtual void write( const uint8_t *buffer, size_t size ) ;
|
|
||||||
using Print::write ; // pull in write(str) and write(buf, size) from Print
|
|
||||||
} ;
|
|
||||||
|
|
||||||
#endif // HardwareSerial_h
|
#endif
|
||||||
|
@ -30,141 +30,173 @@
|
|||||||
// Public Methods //////////////////////////////////////////////////////////////
|
// Public Methods //////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/* default implementation: may be overridden */
|
/* default implementation: may be overridden */
|
||||||
void Print::write(const char *str)
|
size_t Print::write(const uint8_t *buffer, size_t size)
|
||||||
{
|
{
|
||||||
while (*str)
|
size_t n = 0;
|
||||||
write(*str++);
|
while (size--) {
|
||||||
}
|
n += write(*buffer++);
|
||||||
|
|
||||||
/* default implementation: may be overridden */
|
|
||||||
void Print::write(const uint8_t *buffer, size_t size)
|
|
||||||
{
|
|
||||||
while (size--)
|
|
||||||
write(*buffer++);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Print::print( const String &s )
|
|
||||||
{
|
|
||||||
for ( int i = 0 ; i < (int)s.length() ; i++ )
|
|
||||||
{
|
|
||||||
write( s[i] ) ;
|
|
||||||
}
|
}
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::print(const char str[])
|
size_t Print::print(const __FlashStringHelper *ifsh)
|
||||||
{
|
{
|
||||||
write(str);
|
return print(reinterpret_cast<const char *>(ifsh));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::print(char c)
|
size_t Print::print(const String &s)
|
||||||
{
|
{
|
||||||
write(c);
|
size_t n = 0;
|
||||||
|
for (uint16_t i = 0; i < s.length(); i++) {
|
||||||
|
n += write(s[i]);
|
||||||
|
}
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::print(unsigned char b, int base)
|
size_t Print::print(const char str[])
|
||||||
{
|
{
|
||||||
print((unsigned long) b, base);
|
return write(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::print(int n, int base)
|
size_t Print::print(char c)
|
||||||
{
|
{
|
||||||
print((long) n, base);
|
return write(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::print(unsigned int n, int base)
|
size_t Print::print(unsigned char b, int base)
|
||||||
{
|
{
|
||||||
print((unsigned long) n, base);
|
return print((unsigned long) b, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::print(long n, int base)
|
size_t Print::print(int n, int base)
|
||||||
|
{
|
||||||
|
return print((long) n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Print::print(unsigned int n, int base)
|
||||||
|
{
|
||||||
|
return print((unsigned long) n, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Print::print(long n, int base)
|
||||||
{
|
{
|
||||||
if (base == 0) {
|
if (base == 0) {
|
||||||
write(n);
|
return write(n);
|
||||||
} else if (base == 10) {
|
} else if (base == 10) {
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
print('-');
|
int t = print('-');
|
||||||
n = -n;
|
n = -n;
|
||||||
|
return printNumber(n, 10) + t;
|
||||||
}
|
}
|
||||||
printNumber(n, 10);
|
return printNumber(n, 10);
|
||||||
} else {
|
} else {
|
||||||
printNumber(n, base);
|
return printNumber(n, base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::print(unsigned long n, int base)
|
size_t Print::print(unsigned long n, int base)
|
||||||
{
|
{
|
||||||
if (base == 0) write(n);
|
if (base == 0) return write(n);
|
||||||
else printNumber(n, base);
|
else return printNumber(n, base);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::print(double n, int digits)
|
size_t Print::print(double n, int digits)
|
||||||
{
|
{
|
||||||
printFloat(n, digits);
|
return printFloat(n, digits);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(void)
|
size_t Print::println(const __FlashStringHelper *ifsh)
|
||||||
{
|
{
|
||||||
print('\r');
|
size_t n = print(ifsh);
|
||||||
print('\n');
|
n += println();
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(const String &s)
|
size_t Print::print(const Printable& x)
|
||||||
{
|
{
|
||||||
print(s);
|
return x.printTo(*this);
|
||||||
println();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(const char c[])
|
size_t Print::println(void)
|
||||||
{
|
{
|
||||||
print(c);
|
size_t n = print('\r');
|
||||||
println();
|
n += print('\n');
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(char c)
|
size_t Print::println(const String &s)
|
||||||
{
|
{
|
||||||
print(c);
|
size_t n = print(s);
|
||||||
println();
|
n += println();
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(unsigned char b, int base)
|
size_t Print::println(const char c[])
|
||||||
{
|
{
|
||||||
print(b, base);
|
size_t n = print(c);
|
||||||
println();
|
n += println();
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(int n, int base)
|
size_t Print::println(char c)
|
||||||
{
|
{
|
||||||
print(n, base);
|
size_t n = print(c);
|
||||||
println();
|
n += println();
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(unsigned int n, int base)
|
size_t Print::println(unsigned char b, int base)
|
||||||
{
|
{
|
||||||
print(n, base);
|
size_t n = print(b, base);
|
||||||
println();
|
n += println();
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(long n, int base)
|
size_t Print::println(int num, int base)
|
||||||
{
|
{
|
||||||
print(n, base);
|
size_t n = print(num, base);
|
||||||
println();
|
n += println();
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(unsigned long n, int base)
|
size_t Print::println(unsigned int num, int base)
|
||||||
{
|
{
|
||||||
print(n, base);
|
size_t n = print(num, base);
|
||||||
println();
|
n += println();
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::println(double n, int digits)
|
size_t Print::println(long num, int base)
|
||||||
{
|
{
|
||||||
print(n, digits);
|
size_t n = print(num, base);
|
||||||
println();
|
n += println();
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Print::println(unsigned long num, int base)
|
||||||
|
{
|
||||||
|
size_t n = print(num, base);
|
||||||
|
n += println();
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Print::println(double num, int digits)
|
||||||
|
{
|
||||||
|
size_t n = print(num, digits);
|
||||||
|
n += println();
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t Print::println(const Printable& x)
|
||||||
|
{
|
||||||
|
size_t n = print(x);
|
||||||
|
n += println();
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Private Methods /////////////////////////////////////////////////////////////
|
// Private Methods /////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void Print::printNumber(unsigned long n, uint8_t base) {
|
size_t Print::printNumber(unsigned long n, uint8_t base) {
|
||||||
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
|
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
|
||||||
char *str = &buf[sizeof(buf) - 1];
|
char *str = &buf[sizeof(buf) - 1];
|
||||||
|
|
||||||
@ -180,15 +212,17 @@ void Print::printNumber(unsigned long n, uint8_t base) {
|
|||||||
*--str = c < 10 ? c + '0' : c + 'A' - 10;
|
*--str = c < 10 ? c + '0' : c + 'A' - 10;
|
||||||
} while(n);
|
} while(n);
|
||||||
|
|
||||||
write(str);
|
return write(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Print::printFloat(double number, uint8_t digits)
|
size_t Print::printFloat(double number, uint8_t digits)
|
||||||
{
|
{
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
// Handle negative numbers
|
// Handle negative numbers
|
||||||
if (number < 0.0)
|
if (number < 0.0)
|
||||||
{
|
{
|
||||||
print('-');
|
n += print('-');
|
||||||
number = -number;
|
number = -number;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,18 +236,21 @@ void Print::printFloat(double number, uint8_t digits)
|
|||||||
// Extract the integer part of the number and print it
|
// Extract the integer part of the number and print it
|
||||||
unsigned long int_part = (unsigned long)number;
|
unsigned long int_part = (unsigned long)number;
|
||||||
double remainder = number - (double)int_part;
|
double remainder = number - (double)int_part;
|
||||||
print(int_part);
|
n += print(int_part);
|
||||||
|
|
||||||
// Print the decimal point, but only if there are digits beyond
|
// Print the decimal point, but only if there are digits beyond
|
||||||
if (digits > 0)
|
if (digits > 0) {
|
||||||
print(".");
|
n += print(".");
|
||||||
|
}
|
||||||
|
|
||||||
// Extract digits from the remainder one at a time
|
// Extract digits from the remainder one at a time
|
||||||
while (digits-- > 0)
|
while (digits-- > 0)
|
||||||
{
|
{
|
||||||
remainder *= 10.0;
|
remainder *= 10.0;
|
||||||
int toPrint = int(remainder);
|
int toPrint = int(remainder);
|
||||||
print(toPrint);
|
n += print(toPrint);
|
||||||
remainder -= toPrint;
|
remainder -= toPrint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <stdio.h> // for size_t
|
#include <stdio.h> // for size_t
|
||||||
|
|
||||||
#include "WString.h"
|
#include "WString.h"
|
||||||
|
#include "Printable.h"
|
||||||
|
|
||||||
#define DEC 10
|
#define DEC 10
|
||||||
#define HEX 16
|
#define HEX 16
|
||||||
@ -33,33 +34,45 @@
|
|||||||
class Print
|
class Print
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
void printNumber(unsigned long, uint8_t);
|
int write_error;
|
||||||
void printFloat(double, uint8_t);
|
size_t printNumber(unsigned long, uint8_t);
|
||||||
|
size_t printFloat(double, uint8_t);
|
||||||
|
protected:
|
||||||
|
void setWriteError(int err = 1) { write_error = err; }
|
||||||
public:
|
public:
|
||||||
virtual void write(uint8_t) = 0;
|
Print() : write_error(0) {}
|
||||||
virtual void write(const char *str);
|
|
||||||
virtual void write(const uint8_t *buffer, size_t size);
|
int getWriteError() { return write_error; }
|
||||||
|
void clearWriteError() { setWriteError(0); }
|
||||||
|
|
||||||
|
virtual size_t write(uint8_t) = 0;
|
||||||
|
size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); }
|
||||||
|
virtual size_t write(const uint8_t *buffer, size_t size);
|
||||||
|
|
||||||
|
size_t print(const __FlashStringHelper *);
|
||||||
|
size_t print(const String &);
|
||||||
|
size_t print(const char[]);
|
||||||
|
size_t print(char);
|
||||||
|
size_t print(unsigned char, int = DEC);
|
||||||
|
size_t print(int, int = DEC);
|
||||||
|
size_t print(unsigned int, int = DEC);
|
||||||
|
size_t print(long, int = DEC);
|
||||||
|
size_t print(unsigned long, int = DEC);
|
||||||
|
size_t print(double, int = 2);
|
||||||
|
size_t print(const Printable&);
|
||||||
|
|
||||||
void print(const String &);
|
size_t println(const __FlashStringHelper *);
|
||||||
void print(const char[]);
|
size_t println(const String &s);
|
||||||
void print(char);
|
size_t println(const char[]);
|
||||||
void print(unsigned char, int = DEC);
|
size_t println(char);
|
||||||
void print(int, int = DEC);
|
size_t println(unsigned char, int = DEC);
|
||||||
void print(unsigned int, int = DEC);
|
size_t println(int, int = DEC);
|
||||||
void print(long, int = DEC);
|
size_t println(unsigned int, int = DEC);
|
||||||
void print(unsigned long, int = DEC);
|
size_t println(long, int = DEC);
|
||||||
void print(double, int = 2);
|
size_t println(unsigned long, int = DEC);
|
||||||
|
size_t println(double, int = 2);
|
||||||
void println(const String &s);
|
size_t println(const Printable&);
|
||||||
void println(const char[]);
|
size_t println(void);
|
||||||
void println(char);
|
|
||||||
void println(unsigned char, int = DEC);
|
|
||||||
void println(int, int = DEC);
|
|
||||||
void println(unsigned int, int = DEC);
|
|
||||||
void println(long, int = DEC);
|
|
||||||
void println(unsigned long, int = DEC);
|
|
||||||
void println(double, int = 2);
|
|
||||||
void println(void);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
40
hardware/arduino/sam/cores/sam/Printable.h
Normal file
40
hardware/arduino/sam/cores/sam/Printable.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
Printable.h - Interface class that allows printing of complex types
|
||||||
|
Copyright (c) 2011 Adrian McEwen. All right reserved.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Printable_h
|
||||||
|
#define Printable_h
|
||||||
|
|
||||||
|
#include <new.h>
|
||||||
|
|
||||||
|
class Print;
|
||||||
|
|
||||||
|
/** The Printable class provides a way for new classes to allow themselves to be printed.
|
||||||
|
By deriving from Printable and implementing the printTo method, it will then be possible
|
||||||
|
for users to print out instances of this class by passing them into the usual
|
||||||
|
Print::print and Print::println methods.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Printable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual size_t printTo(Print& p) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -107,7 +107,7 @@ void UARTClass::flush( void )
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UARTClass::write( const uint8_t uc_data )
|
size_t UARTClass::write( const uint8_t uc_data )
|
||||||
{
|
{
|
||||||
// Check if the transmitter is ready
|
// Check if the transmitter is ready
|
||||||
while ((_pUart->UART_SR & UART_SR_TXRDY) != UART_SR_TXRDY)
|
while ((_pUart->UART_SR & UART_SR_TXRDY) != UART_SR_TXRDY)
|
||||||
@ -115,6 +115,7 @@ void UARTClass::write( const uint8_t uc_data )
|
|||||||
|
|
||||||
// Send character
|
// Send character
|
||||||
_pUart->UART_THR = uc_data;
|
_pUart->UART_THR = uc_data;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UARTClass::IrqHandler( void )
|
void UARTClass::IrqHandler( void )
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#define _UART_CLASS_
|
#define _UART_CLASS_
|
||||||
|
|
||||||
#include "HardwareSerial.h"
|
#include "HardwareSerial.h"
|
||||||
|
#include "RingBuffer.h"
|
||||||
|
|
||||||
// Includes Atmel CMSIS
|
// Includes Atmel CMSIS
|
||||||
#include <chip.h>
|
#include <chip.h>
|
||||||
@ -43,7 +44,7 @@ class UARTClass : public HardwareSerial
|
|||||||
int peek( void ) ;
|
int peek( void ) ;
|
||||||
int read( void ) ;
|
int read( void ) ;
|
||||||
void flush( void ) ;
|
void flush( void ) ;
|
||||||
void write( const uint8_t c ) ;
|
size_t write( const uint8_t c ) ;
|
||||||
|
|
||||||
void IrqHandler( void ) ;
|
void IrqHandler( void ) ;
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ void USARTClass::flush( void )
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
void USARTClass::write( const uint8_t uc_data )
|
size_t USARTClass::write( const uint8_t uc_data )
|
||||||
{
|
{
|
||||||
// Check if the transmitter is ready
|
// Check if the transmitter is ready
|
||||||
while ((_pUsart->US_CSR & US_CSR_TXRDY) != US_CSR_TXRDY)
|
while ((_pUsart->US_CSR & US_CSR_TXRDY) != US_CSR_TXRDY)
|
||||||
@ -116,6 +116,7 @@ void USARTClass::write( const uint8_t uc_data )
|
|||||||
|
|
||||||
// Send character
|
// Send character
|
||||||
_pUsart->US_THR = uc_data ;
|
_pUsart->US_THR = uc_data ;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void USARTClass::IrqHandler( void )
|
void USARTClass::IrqHandler( void )
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#define _USART_CLASS_
|
#define _USART_CLASS_
|
||||||
|
|
||||||
#include "HardwareSerial.h"
|
#include "HardwareSerial.h"
|
||||||
|
#include "RingBuffer.h"
|
||||||
|
|
||||||
// Includes Atmel CMSIS
|
// Includes Atmel CMSIS
|
||||||
#include <chip.h>
|
#include <chip.h>
|
||||||
@ -43,7 +44,7 @@ class USARTClass : public HardwareSerial
|
|||||||
int peek( void ) ;
|
int peek( void ) ;
|
||||||
int read( void ) ;
|
int read( void ) ;
|
||||||
void flush( void ) ;
|
void flush( void ) ;
|
||||||
void write( const uint8_t c ) ;
|
size_t write( const uint8_t c ) ;
|
||||||
|
|
||||||
void IrqHandler( void ) ;
|
void IrqHandler( void ) ;
|
||||||
|
|
||||||
|
@ -39,7 +39,6 @@ public:
|
|||||||
virtual int read(void);
|
virtual int read(void);
|
||||||
virtual void flush(void);
|
virtual void flush(void);
|
||||||
virtual size_t write(uint8_t);
|
virtual size_t write(uint8_t);
|
||||||
virtual void write(uint8_t);
|
|
||||||
operator bool();
|
operator bool();
|
||||||
};
|
};
|
||||||
extern Serial_ Serial;
|
extern Serial_ Serial;
|
||||||
|
@ -150,13 +150,13 @@ unsigned char String::changeBuffer(unsigned int maxStrLen)
|
|||||||
/* Copy and Move */
|
/* Copy and Move */
|
||||||
/*********************************************/
|
/*********************************************/
|
||||||
|
|
||||||
String & String::copy(const char *cstr, unsigned int length)
|
String & String::copy(const char *cstr, unsigned int _length)
|
||||||
{
|
{
|
||||||
if (!reserve(length)) {
|
if (!reserve(_length)) {
|
||||||
invalidate();
|
invalidate();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
len = length;
|
len = _length;
|
||||||
strcpy(buffer, cstr);
|
strcpy(buffer, cstr);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -224,11 +224,11 @@ unsigned char String::concat(const String &s)
|
|||||||
return concat(s.buffer, s.len);
|
return concat(s.buffer, s.len);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char String::concat(const char *cstr, unsigned int length)
|
unsigned char String::concat(const char *cstr, unsigned int _length)
|
||||||
{
|
{
|
||||||
unsigned int newlen = len + length;
|
unsigned int newlen = len + _length;
|
||||||
if (!cstr) return 0;
|
if (!cstr) return 0;
|
||||||
if (length == 0) return 1;
|
if (_length == 0) return 1;
|
||||||
if (!reserve(newlen)) return 0;
|
if (!reserve(newlen)) return 0;
|
||||||
strcpy(buffer + len, cstr);
|
strcpy(buffer + len, cstr);
|
||||||
len = newlen;
|
len = newlen;
|
||||||
@ -252,7 +252,7 @@ unsigned char String::concat(char c)
|
|||||||
unsigned char String::concat(unsigned char num)
|
unsigned char String::concat(unsigned char num)
|
||||||
{
|
{
|
||||||
char buf[4];
|
char buf[4];
|
||||||
// itoa(num, buf, 10);
|
itoa(num, buf, 10);
|
||||||
return concat(buf, strlen(buf));
|
return concat(buf, strlen(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,9 +499,9 @@ int String::lastIndexOf( char theChar ) const
|
|||||||
return lastIndexOf(theChar, len - 1);
|
return lastIndexOf(theChar, len - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int String::lastIndexOf(char ch, int fromIndex) const
|
int String::lastIndexOf(char ch, unsigned int fromIndex) const
|
||||||
{
|
{
|
||||||
if (fromIndex >= len || fromIndex < 0) return -1;
|
if (fromIndex >= len) return -1;
|
||||||
char tempchar = buffer[fromIndex + 1];
|
char tempchar = buffer[fromIndex + 1];
|
||||||
buffer[fromIndex + 1] = '\0';
|
buffer[fromIndex + 1] = '\0';
|
||||||
char* temp = strrchr( buffer, ch );
|
char* temp = strrchr( buffer, ch );
|
||||||
@ -515,15 +515,15 @@ int String::lastIndexOf(const String &s2) const
|
|||||||
return lastIndexOf(s2, len - s2.len);
|
return lastIndexOf(s2, len - s2.len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int String::lastIndexOf(const String &s2, int fromIndex) const
|
int String::lastIndexOf(const String &s2, unsigned int fromIndex) const
|
||||||
{
|
{
|
||||||
if (s2.len == 0 || len == 0 || s2.len > len || fromIndex < 0) return -1;
|
if (s2.len == 0 || len == 0 || s2.len > len) return -1;
|
||||||
if (fromIndex >= len) fromIndex = len - 1;
|
if (fromIndex >= len) fromIndex = len - 1;
|
||||||
int found = -1;
|
int found = -1;
|
||||||
for (char *p = buffer; p <= buffer + fromIndex; p++) {
|
for (char *p = buffer; p <= buffer + fromIndex; p++) {
|
||||||
p = strstr(p, s2.buffer);
|
p = strstr(p, s2.buffer);
|
||||||
if (!p) break;
|
if (!p) break;
|
||||||
if (p - buffer <= fromIndex) found = p - buffer;
|
if ((unsigned int)(p - buffer) <= fromIndex) found = p - buffer;
|
||||||
}
|
}
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
@ -554,24 +554,24 @@ String String::substring(unsigned int left, unsigned int right) const
|
|||||||
/* Modification */
|
/* Modification */
|
||||||
/*********************************************/
|
/*********************************************/
|
||||||
|
|
||||||
void String::replace(char find, char replace)
|
void String::replace(char find, char _replace)
|
||||||
{
|
{
|
||||||
if (!buffer) return;
|
if (!buffer) return;
|
||||||
for (char *p = buffer; *p; p++) {
|
for (char *p = buffer; *p; p++) {
|
||||||
if (*p == find) *p = replace;
|
if (*p == find) *p = _replace;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void String::replace(const String& find, const String& replace)
|
void String::replace(const String& find, const String& _replace)
|
||||||
{
|
{
|
||||||
if (len == 0 || find.len == 0) return;
|
if (len == 0 || find.len == 0) return;
|
||||||
int diff = replace.len - find.len;
|
int diff = _replace.len - find.len;
|
||||||
char *readFrom = buffer;
|
char *readFrom = buffer;
|
||||||
char *foundAt;
|
char *foundAt;
|
||||||
if (diff == 0) {
|
if (diff == 0) {
|
||||||
while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
|
while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
|
||||||
memcpy(foundAt, replace.buffer, replace.len);
|
memcpy(foundAt, _replace.buffer, _replace.len);
|
||||||
readFrom = foundAt + replace.len;
|
readFrom = foundAt + _replace.len;
|
||||||
}
|
}
|
||||||
} else if (diff < 0) {
|
} else if (diff < 0) {
|
||||||
char *writeTo = buffer;
|
char *writeTo = buffer;
|
||||||
@ -579,8 +579,8 @@ void String::replace(const String& find, const String& replace)
|
|||||||
unsigned int n = foundAt - readFrom;
|
unsigned int n = foundAt - readFrom;
|
||||||
memcpy(writeTo, readFrom, n);
|
memcpy(writeTo, readFrom, n);
|
||||||
writeTo += n;
|
writeTo += n;
|
||||||
memcpy(writeTo, replace.buffer, replace.len);
|
memcpy(writeTo, _replace.buffer, _replace.len);
|
||||||
writeTo += replace.len;
|
writeTo += _replace.len;
|
||||||
readFrom = foundAt + find.len;
|
readFrom = foundAt + find.len;
|
||||||
len += diff;
|
len += diff;
|
||||||
}
|
}
|
||||||
@ -594,12 +594,12 @@ void String::replace(const String& find, const String& replace)
|
|||||||
if (size == len) return;
|
if (size == len) return;
|
||||||
if (size > capacity && !changeBuffer(size)) return; // XXX: tell user!
|
if (size > capacity && !changeBuffer(size)) return; // XXX: tell user!
|
||||||
int index = len - 1;
|
int index = len - 1;
|
||||||
while ((index = lastIndexOf(find, index)) >= 0) {
|
while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
|
||||||
readFrom = buffer + index + find.len;
|
readFrom = buffer + index + find.len;
|
||||||
memmove(readFrom + diff, readFrom, len - (readFrom - buffer));
|
memmove(readFrom + diff, readFrom, len - (readFrom - buffer));
|
||||||
len += diff;
|
len += diff;
|
||||||
buffer[len] = 0;
|
buffer[len] = 0;
|
||||||
memcpy(buffer + index, replace.buffer, replace.len);
|
memcpy(buffer + index, _replace.buffer, _replace.len);
|
||||||
index--;
|
index--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -153,9 +153,9 @@ public:
|
|||||||
int indexOf( const String &str ) const;
|
int indexOf( const String &str ) const;
|
||||||
int indexOf( const String &str, unsigned int fromIndex ) const;
|
int indexOf( const String &str, unsigned int fromIndex ) const;
|
||||||
int lastIndexOf( char ch ) const;
|
int lastIndexOf( char ch ) const;
|
||||||
int lastIndexOf( char ch, int fromIndex ) const;
|
int lastIndexOf( char ch, unsigned int fromIndex ) const;
|
||||||
int lastIndexOf( const String &str ) const;
|
int lastIndexOf( const String &str ) const;
|
||||||
int lastIndexOf( const String &str, int fromIndex ) const;
|
int lastIndexOf( const String &str, unsigned int fromIndex ) const;
|
||||||
String substring( unsigned int beginIndex ) const;
|
String substring( unsigned int beginIndex ) const;
|
||||||
String substring( unsigned int beginIndex, unsigned int endIndex ) const;
|
String substring( unsigned int beginIndex, unsigned int endIndex ) const;
|
||||||
|
|
||||||
|
18
hardware/arduino/sam/cores/sam/new.cpp
Normal file
18
hardware/arduino/sam/cores/sam/new.cpp
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#include <new.h>
|
||||||
|
|
||||||
|
void * operator new(size_t size)
|
||||||
|
{
|
||||||
|
return malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator delete(void * ptr)
|
||||||
|
{
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);};
|
||||||
|
void __cxa_guard_release (__guard *g) {*(char *)g = 1;};
|
||||||
|
void __cxa_guard_abort (__guard *) {};
|
||||||
|
|
||||||
|
void __cxa_pure_virtual(void) {};
|
||||||
|
|
22
hardware/arduino/sam/cores/sam/new.h
Normal file
22
hardware/arduino/sam/cores/sam/new.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/* Header to define new/delete operators as they aren't provided by avr-gcc by default
|
||||||
|
Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NEW_H
|
||||||
|
#define NEW_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void * operator new(size_t size);
|
||||||
|
void operator delete(void * ptr);
|
||||||
|
|
||||||
|
__extension__ typedef int __guard __attribute__((mode (__DI__)));
|
||||||
|
|
||||||
|
extern "C" int __cxa_guard_acquire(__guard *);
|
||||||
|
extern "C" void __cxa_guard_release (__guard *);
|
||||||
|
extern "C" void __cxa_guard_abort (__guard *);
|
||||||
|
|
||||||
|
extern "C" void __cxa_pure_virtual(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user