| 
									
										
										
										
											2017-04-27 20:18:03 +02:00
										 |  |  | // SPDX-License-Identifier: GPL-2.0
 | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | #ifndef MEMBUFFER_H
 | 
					
						
							|  |  |  | #define MEMBUFFER_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 09:40:49 -08:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <ctype.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | struct membuffer { | 
					
						
							| 
									
										
										
										
											2014-02-09 09:40:49 -08:00
										 |  |  | 	unsigned int len, alloc; | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | 	char *buffer; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __GNUC__
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | #define __printf(x, y) __attribute__((__format__(__printf__, x, y)))
 | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | #define __printf(x, y)
 | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-24 12:47:26 +12:00
										 |  |  | extern char *detach_buffer(struct membuffer *b); | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | extern void free_buffer(struct membuffer *); | 
					
						
							|  |  |  | extern void flush_buffer(struct membuffer *, FILE *); | 
					
						
							|  |  |  | extern void put_bytes(struct membuffer *, const char *, int); | 
					
						
							|  |  |  | extern void put_string(struct membuffer *, const char *); | 
					
						
							| 
									
										
										
										
											2014-06-02 20:10:54 +03:00
										 |  |  | extern void put_quoted(struct membuffer *, const char *, int, int); | 
					
						
							| 
									
										
										
										
											2014-02-09 09:40:49 -08:00
										 |  |  | extern void strip_mb(struct membuffer *); | 
					
						
							| 
									
										
										
										
											2014-03-07 09:46:17 -08:00
										 |  |  | extern const char *mb_cstring(struct membuffer *); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | extern __printf(2, 0) void put_vformat(struct membuffer *, const char *, va_list); | 
					
						
							|  |  |  | extern __printf(2, 3) void put_format(struct membuffer *, const char *fmt, ...); | 
					
						
							| 
									
										
										
										
											2015-02-14 17:48:19 -08:00
										 |  |  | extern __printf(2, 0) char *add_to_string_va(const char *old, const char *fmt, va_list args); | 
					
						
							|  |  |  | extern __printf(2, 3) char *add_to_string(const char *old, const char *fmt, ...); | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-24 12:47:26 +12:00
										 |  |  | /* Helpers that use membuffers internally */ | 
					
						
							|  |  |  | extern __printf(1, 0) char *vformat_string(const char *, va_list); | 
					
						
							|  |  |  | extern __printf(1, 2) char *format_string(const char *, ...); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | /* Output one of our "milli" values with type and pre/post data */ | 
					
						
							|  |  |  | extern void put_milli(struct membuffer *, const char *, int, const char *); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Helper functions for showing particular types. If the type | 
					
						
							|  |  |  |  * is empty, nothing is done, and the function returns false. | 
					
						
							|  |  |  |  * Otherwise, it returns true. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The two "const char *" at the end are pre/post data. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The reason for the pre/post data is so that you can easily | 
					
						
							|  |  |  |  * prepend and append a string without having to test whether the | 
					
						
							|  |  |  |  * type is empty. So | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     put_temperature(b, temp, "Temp=", " C\n"); | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * writes nothing to the buffer if there is no temperature data, | 
					
						
							|  |  |  |  * but otherwise would a string that looks something like | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     "Temp=28.1 C\n" | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * to the memory buffer (typically the post/pre will be some XML | 
					
						
							|  |  |  |  * pattern and unit string or whatever). | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-03-07 20:33:22 -08:00
										 |  |  | extern void put_temperature(struct membuffer *, temperature_t, const char *, const char *); | 
					
						
							|  |  |  | extern void put_depth(struct membuffer *, depth_t, const char *, const char *); | 
					
						
							|  |  |  | extern void put_duration(struct membuffer *, duration_t, const char *, const char *); | 
					
						
							|  |  |  | extern void put_pressure(struct membuffer *, pressure_t, const char *, const char *); | 
					
						
							|  |  |  | extern void put_salinity(struct membuffer *, int, const char *, const char *); | 
					
						
							| 
									
										
										
										
											2014-04-05 13:01:34 -07:00
										 |  |  | extern void put_degrees(struct membuffer *b, degrees_t value, const char *, const char *); | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 09:40:49 -08:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 09:03:11 +07:00
										 |  |  | #endif
 |