18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef _ANDROID_UTILS_BUFPRINT_H 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _ANDROID_UTILS_BUFPRINT_H 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdarg.h> 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** FORMATTED BUFFER PRINTING 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** bufprint() allows your to easily and safely append formatted string 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** content to a given bounded character buffer, in a way that is easier 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** to use than raw snprintf() 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 'buffer' is the start position in the buffer, 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 'buffend' is the end of the buffer, the function assumes (buffer <= buffend) 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 'format' is a standard printf-style format string, followed by any number 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** of formatting arguments 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** the function returns the next position in the buffer if everything fits 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** in it. in case of overflow or formatting error, it will always return "buffend" 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** this allows you to chain several calls to bufprint() and only check for 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** overflow at the end, for exemple: 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** char buffer[1024]; 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** char* p = buffer; 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** char* end = p + sizeof(buffer); 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** p = bufprint(p, end, "%s/%s", first, second); 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** p = bufprint(p, end, "/%s", third); 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** if (p >= end) ---> overflow 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** as a convenience, the appended string is zero-terminated if there is no overflow. 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** (this means that even if p >= end, the content of "buffer" is zero-terminated) 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** vbufprint() is a variant that accepts a va_list argument 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char* vbufprint(char* buffer, char* buffend, const char* fmt, va_list args ); 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char* bufprint (char* buffer, char* buffend, const char* fmt, ... ); 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** USEFUL DIRECTORY SUPPORT 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** bufprint_add_dir() appends the application's directory to a given bounded buffer 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** bufprint_config_path() appends the applications' user-specific configuration directory 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** to a bounded buffer. on Unix this is usually ~/.android, and something a bit more 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** complex on Windows 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** bufprint_config_file() appends the name of a file or directory relative to the 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** user-specific configuration directory to a bounded buffer. this really is equivalent 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** to concat-ing the config path + path separator + 'suffix' 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** bufprint_temp_dir() appends the temporary directory's path to a given bounded buffer 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** bufprint_temp_file() appens the name of a file or directory relative to the 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** temporary directory. equivalent to concat-ing the temp path + path separator + 'suffix' 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char* bufprint_app_dir (char* buffer, char* buffend); 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char* bufprint_config_path(char* buffer, char* buffend); 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char* bufprint_config_file(char* buffer, char* buffend, const char* suffix); 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char* bufprint_temp_dir (char* buffer, char* buffend); 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern char* bufprint_temp_file (char* buffer, char* buffend, const char* suffix); 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* _ANDROID_UTILS_BUFPRINT_H */ 77