| 
									
										
										
										
											2014-07-22 20:28:59 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  | * Arduino JSON library | 
					
						
							|  |  |  | * Benoit Blanchon 2014 - MIT License | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2014-07-18 15:43:20 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "JsonToken.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-19 12:44:27 +02:00
										 |  |  | using namespace ArduinoJson::Parser; | 
					
						
							| 
									
										
										
										
											2014-07-18 15:43:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  | char* JsonToken::getText() | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  |     char* s = json + token->start; | 
					
						
							|  |  |  |     json[token->end] = 0; | 
					
						
							| 
									
										
										
										
											2014-09-07 20:11:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  |     unescapeString(s); | 
					
						
							| 
									
										
										
										
											2014-09-07 20:11:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  |     return s; | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  | inline void JsonToken::unescapeString(char* s) | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     char* readPtr = s; | 
					
						
							|  |  |  |     char* writePtr = s; | 
					
						
							| 
									
										
										
										
											2014-09-07 19:55:54 +02:00
										 |  |  |     char c; | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-07 19:55:54 +02:00
										 |  |  |     do | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  |         c = *readPtr++; | 
					
						
							| 
									
										
										
										
											2014-09-07 19:55:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (c == '\\') | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-09-07 19:55:54 +02:00
										 |  |  |             c = unescapeChar(*readPtr++); | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-07 19:55:54 +02:00
										 |  |  |         *writePtr++ = c; | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-07 19:55:54 +02:00
										 |  |  |     } while (c != 0); | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  | inline char JsonToken::unescapeChar(char c) | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  |     // Optimized for code size on a 8-bit AVR
 | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  |     const char* p = "b\bf\fn\nr\rt\t"; | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-09 21:23:37 +02:00
										 |  |  |     while (true) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (p[0] == 0) return c; | 
					
						
							|  |  |  |         if (p[0] == c) return p[1]; | 
					
						
							|  |  |  |         p += 2; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-09-04 21:45:41 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-18 16:18:03 +02:00
										 |  |  | JsonToken JsonToken::nextSibling() const | 
					
						
							| 
									
										
										
										
											2014-07-18 15:43:20 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-07-22 20:28:59 +02:00
										 |  |  |     // start with current token
 | 
					
						
							| 
									
										
										
										
											2014-07-18 15:43:20 +02:00
										 |  |  |     jsmntok_t* t = token; | 
					
						
							| 
									
										
										
										
											2014-07-22 20:28:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // count the number of token to skip
 | 
					
						
							| 
									
										
										
										
											2014-07-18 16:22:09 +02:00
										 |  |  |     int yetToVisit = 1; | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2014-07-22 20:28:59 +02:00
										 |  |  |     // skip all nested tokens
 | 
					
						
							| 
									
										
										
										
											2014-07-18 15:43:20 +02:00
										 |  |  |     while (yetToVisit) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-07-18 16:22:09 +02:00
										 |  |  |         yetToVisit += t->size - 1; | 
					
						
							| 
									
										
										
										
											2014-07-18 15:43:20 +02:00
										 |  |  |         t++; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 20:28:59 +02:00
										 |  |  |     // build a JsonToken at the new location
 | 
					
						
							| 
									
										
										
										
											2014-07-19 12:44:27 +02:00
										 |  |  |     return JsonToken(json, t); | 
					
						
							| 
									
										
										
										
											2014-07-18 15:43:20 +02:00
										 |  |  | } |