| The Android Open Source Project | dd7bc33 | 2009-03-03 19:32:55 -0800 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2008 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 | #ifndef _ADB_UTILS_H | 
 | 17 | #define _ADB_UTILS_H | 
 | 18 |  | 
 | 19 | /* bounded buffer functions */ | 
 | 20 |  | 
 | 21 | /* all these functions are used to append data to a bounded buffer. | 
 | 22 |  * | 
 | 23 |  * after each operation, the buffer is guaranteed to be zero-terminated, | 
 | 24 |  * even in the case of an overflow. they all return the new buffer position | 
 | 25 |  * which allows one to use them in succession, only checking for overflows | 
 | 26 |  * at the end. For example: | 
 | 27 |  * | 
 | 28 |  *    BUFF_DECL(temp,p,end,1024); | 
 | 29 |  *    char*    p; | 
 | 30 |  * | 
 | 31 |  *    p = buff_addc(temp, end, '"'); | 
 | 32 |  *    p = buff_adds(temp, end, string); | 
 | 33 |  *    p = buff_addc(temp, end, '"'); | 
 | 34 |  * | 
 | 35 |  *    if (p >= end) { | 
 | 36 |  *        overflow detected. note that 'temp' is | 
 | 37 |  *        zero-terminated for safety.  | 
 | 38 |  *    } | 
 | 39 |  *    return strdup(temp); | 
 | 40 |  */ | 
 | 41 |  | 
 | 42 | /* tries to add a character to the buffer, in case of overflow | 
 | 43 |  * this will only write a terminating zero and return buffEnd. | 
 | 44 |  */ | 
 | 45 | char*   buff_addc (char*  buff, char*  buffEnd, int  c); | 
 | 46 |  | 
 | 47 | /* tries to add a string to the buffer */ | 
 | 48 | char*   buff_adds (char*  buff, char*  buffEnd, const char*  s); | 
 | 49 |  | 
 | 50 | /* tries to add a bytes to the buffer. the input can contain zero bytes, | 
 | 51 |  * but a terminating zero will always be appended at the end anyway | 
 | 52 |  */ | 
 | 53 | char*   buff_addb (char*  buff, char*  buffEnd, const void*  data, int  len); | 
 | 54 |  | 
 | 55 | /* tries to add a formatted string to a bounded buffer */ | 
 | 56 | char*   buff_add  (char*  buff, char*  buffEnd, const char*  format, ... ); | 
 | 57 |  | 
 | 58 | /* convenience macro used to define a bounded buffer, as well as | 
 | 59 |  * a 'cursor' and 'end' variables all in one go. | 
 | 60 |  * | 
 | 61 |  * note: this doesn't place an initial terminating zero in the buffer, | 
 | 62 |  * you need to use one of the buff_ functions for this. or simply | 
 | 63 |  * do _cursor[0] = 0 manually. | 
 | 64 |  */ | 
 | 65 | #define  BUFF_DECL(_buff,_cursor,_end,_size)   \ | 
 | 66 |     char   _buff[_size], *_cursor=_buff, *_end = _cursor + (_size) | 
 | 67 |  | 
 | 68 | #endif /* _ADB_UTILS_H */ |