
1: /* -*- mode: C; c-file-style: "gnu" -*- */ 2: /* dbus-string-private.h String utility class (internal to D-Bus implementation) 3: * 4: * Copyright (C) 2002, 2003 Red Hat, Inc. 5: * 6: * Licensed under the Academic Free License version 2.1 7: * 8: * This program is free software; you can redistribute it and/or modify 9: * it under the terms of the GNU General Public License as published by 10: * the Free Software Foundation; either version 2 of the License, or 11: * (at your option) any later version. 12: * 13: * This program is distributed in the hope that it will be useful, 14: * but WITHOUT ANY WARRANTY; without even the implied warranty of 15: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16: * GNU General Public License for more details. 17: * 18: * You should have received a copy of the GNU General Public License 19: * along with this program; if not, write to the Free Software 20: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21: * 22: */ 23: 24: #ifndef DBUS_STRING_PRIVATE_H 25: #define DBUS_STRING_PRIVATE_H 26: 27: #include <config.h> 28: 29: #include <dbus/dbus-memory.h> 30: #include <dbus/dbus-types.h> 31: 32: #ifndef DBUS_CAN_USE_DBUS_STRING_PRIVATE 33: #error "Don't go including dbus-string-private.h for no good reason" 34: #endif 35: 36: DBUS_BEGIN_DECLS 37: 38: /** 39: * @brief Internals of DBusString. 40: * 41: * DBusString internals. DBusString is an opaque objects, it must be 42: * used via accessor functions. 43: */ 44: typedef struct 45: { 46: unsigned char *str; /**< String data, plus nul termination */ 47: int len; /**< Length without nul */ 48: int allocated; /**< Allocated size of data */ 49: int max_length; /**< Max length of this string, without nul byte */ 50: unsigned int constant : 1; /**< String data is not owned by DBusString */ 51: unsigned int locked : 1; /**< DBusString has been locked and can't be changed */ 52: unsigned int invalid : 1; /**< DBusString is invalid (e.g. already freed) */ 53: unsigned int align_offset : 3; /**< str - align_offset is the actual malloc block */ 54: } DBusRealString; 55: 56: 57: /** 58: * @defgroup DBusStringInternals DBusString implementation details 59: * @ingroup DBusInternals 60: * @brief DBusString implementation details 61: * 62: * The guts of DBusString. 63: * 64: * @{ 65: */ 66: 67: /** 68: * This is the maximum max length (and thus also the maximum length) 69: * of a DBusString 70: */ 71: #define _DBUS_STRING_MAX_MAX_LENGTH (_DBUS_INT32_MAX - _DBUS_STRING_ALLOCATION_PADDING) 72: 73: /** 74: * Checks a bunch of assertions about a string object 75: * 76: * @param real the DBusRealString 77: */ 78: #define DBUS_GENERIC_STRING_PREAMBLE(real) _dbus_assert ((real) != NULL); _dbus_assert (!(real)->invalid); _dbus_assert ((real)->len >= 0); _dbus_assert ((real)->allocated >= 0); _dbus_assert ((real)->max_length >= 0); _dbus_assert ((real)->len <= ((real)->allocated - _DBUS_STRING_ALLOCATION_PADDING)); _dbus_assert ((real)->len <= (real)->max_length) 79: 80: /** 81: * Checks assertions about a string object that needs to be 82: * modifiable - may not be locked or const. Also declares 83: * the "real" variable pointing to DBusRealString. 84: * @param str the string 85: */ 86: #define DBUS_STRING_PREAMBLE(str) DBusRealString *real = (DBusRealString*) str; \ 87: DBUS_GENERIC_STRING_PREAMBLE (real); \ 88: _dbus_assert (!(real)->constant); \ 89: _dbus_assert (!(real)->locked) 90: 91: /** 92: * Checks assertions about a string object that may be locked but 93: * can't be const. i.e. a string object that we can free. Also 94: * declares the "real" variable pointing to DBusRealString. 95: * 96: * @param str the string 97: */ 98: #define DBUS_LOCKED_STRING_PREAMBLE(str) DBusRealString *real = (DBusRealString*) str; \ 99: DBUS_GENERIC_STRING_PREAMBLE (real); \ 100: _dbus_assert (!(real)->constant) 101: 102: /** 103: * Checks assertions about a string that may be const or locked. Also 104: * declares the "real" variable pointing to DBusRealString. 105: * @param str the string. 106: */ 107: #define DBUS_CONST_STRING_PREAMBLE(str) const DBusRealString *real = (DBusRealString*) str; \ 108: DBUS_GENERIC_STRING_PREAMBLE (real) 109: 110: /** 111: * Checks for ASCII blank byte 112: * @param c the byte 113: */ 114: #define DBUS_IS_ASCII_BLANK(c) ((c) == ' ' || (c) == '\t') 115: 116: /** 117: * Checks for ASCII whitespace byte 118: * @param c the byte 119: */ 120: #define DBUS_IS_ASCII_WHITE(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r') 121: 122: /** @} */ 123: 124: DBUS_END_DECLS 125: 126: #endif /* DBUS_STRING_PRIVATE_H */