mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 08:42:39 +01:00 
			
		
		
		
	Moved all build settings to `ArduinoJson/Configuration.hpp` Added AppVeyor settings in source tree
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright Benoit Blanchon 2014-2016
 | |
| // MIT License
 | |
| //
 | |
| // Arduino JSON library
 | |
| // https://github.com/bblanchon/ArduinoJson
 | |
| // If you like this project, please add a star!
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #ifndef ARDUINO
 | |
| 
 | |
| #include "../Internals/JsonFloat.hpp"
 | |
| #include "../Internals/JsonInteger.hpp"
 | |
| 
 | |
| #include <stddef.h>
 | |
| #include <stdint.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| #if defined(_MSC_VER) && _MSC_VER <= 1800
 | |
| // snprintf has been added in Visual Studio 2015
 | |
| #define ARDUINOJSON_SNPRINTF _snprintf
 | |
| #else
 | |
| #define ARDUINOJSON_SNPRINTF snprintf
 | |
| #endif
 | |
| 
 | |
| // This class reproduces Arduino's Print class
 | |
| class Print {
 | |
|  public:
 | |
|   virtual ~Print() {}
 | |
| 
 | |
|   virtual size_t write(uint8_t) = 0;
 | |
| 
 | |
|   size_t print(const char* s) {
 | |
|     size_t n = 0;
 | |
|     while (*s) {
 | |
|       n += write(*s++);
 | |
|     }
 | |
|     return n;
 | |
|   }
 | |
| 
 | |
|   size_t print(ArduinoJson::Internals::JsonFloat value, int digits = 2) {
 | |
|     char tmp[32];
 | |
| 
 | |
|     // https://github.com/arduino/Arduino/blob/db8cbf24c99dc930b9ccff1a43d018c81f178535/hardware/arduino/sam/cores/arduino/Print.cpp#L220
 | |
|     bool isBigDouble = value > 4294967040.0 || value < -4294967040.0;
 | |
| 
 | |
|     if (isBigDouble) {
 | |
|       // Arduino's implementation prints "ovf"
 | |
|       // We prefer using the scientific notation, since we have sprintf
 | |
|       ARDUINOJSON_SNPRINTF(tmp, sizeof(tmp), "%g", value);
 | |
|     } else {
 | |
|       // Here we have the exact same output as Arduino's implementation
 | |
|       ARDUINOJSON_SNPRINTF(tmp, sizeof(tmp), "%.*f", digits, value);
 | |
|     }
 | |
| 
 | |
|     return print(tmp);
 | |
|   }
 | |
| 
 | |
|   size_t print(ArduinoJson::Internals::JsonInteger value) {
 | |
|     // see http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_3:Exercise_4
 | |
|     char buffer[22];
 | |
| 
 | |
|     size_t n = 0;
 | |
|     if (value < 0) {
 | |
|       value = -value;
 | |
|       n += write('-');
 | |
|     }
 | |
|     uint8_t i = 0;
 | |
|     do {
 | |
|       ArduinoJson::Internals::JsonInteger digit = value % 10;
 | |
|       value /= 10;
 | |
|       buffer[i++] = static_cast<char>(digit >= 0 ? '0' + digit : '0' - digit);
 | |
|     } while (value);
 | |
| 
 | |
|     while (i > 0) {
 | |
|       n += write(buffer[--i]);
 | |
|     }
 | |
| 
 | |
|     return n;
 | |
|   }
 | |
| 
 | |
|   size_t println() { return write('\r') + write('\n'); }
 | |
| };
 | |
| 
 | |
| #else
 | |
| 
 | |
| #include <Print.h>
 | |
| 
 | |
| #endif
 |