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