Enlightenment CVS committal Author : mej Project : eterm Module : libast
Dir : eterm/libast/include Modified Files: libast.h Log Message: Sun Feb 23 22:00:55 2003 Michael Jennings (mej) Still working on the documentation. If you run "doxygen" from the top-level directory, you can see what's there so far. At some point, I'll be needing a logo. So if you're artistically inclined, feel free to take a stab at one. :) =================================================================== RCS file: /cvsroot/enlightenment/eterm/libast/include/libast.h,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- libast.h 20 Feb 2003 05:44:44 -0000 1.29 +++ libast.h 24 Feb 2003 03:03:19 -0000 1.30 @@ -21,6 +21,17 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/** + * @file libast.h + * Global LibAST header file. + * + * This file contains all general-purpose macros, function + * declarations, etc. for LibAST. It is also responsible for + * including all required system headers and LibAST Object headers. + * + * @author Michael Jennings <[EMAIL PROTECTED]> + */ + #ifndef _LIBAST_H_ #define _LIBAST_H_ @@ -119,11 +130,12 @@ /** * Mark a variable as used. * - * This macro is used to explicitly mark a variable as "used." It intentionally - * generates no real code, but suppresses gcc warnings about unused variables - * and/or parameters. That way, the programmer can explicitly acknowledge that - * certain variables/parameters are intentionally unused, making the warnings - * more effective by eliminating false positives. + * This macro is used to explicitly mark a variable as "used." It + * intentionally generates no real code, but suppresses gcc warnings + * about unused variables and/or parameters. That way, the programmer + * can explicitly acknowledge that certain variables/parameters are + * intentionally unused, making the warnings more effective by + * eliminating false positives. * * @param x Any variable or parameter name. */ @@ -133,36 +145,37 @@ * @def MIN(a, b) * Return the lesser of @a a or @a b. * - * This macro compares its two parameters, @a a and @a b, and returns the lesser - * of the two (the minimum). When building under gcc, a GNU-specific extension - * is used which prevents expressions used as parameters from being evaluated - * multiple times. + * This macro compares its two parameters, @a a and @a b, and returns + * the lesser of the two (the minimum). When building under gcc, a + * GNU-specific extension is used which prevents expressions used as + * parameters from being evaluated multiple times. * * @param a Any expression that evaluates to a value. * @param b Any expression that evaluates to a value. - * @return The lesser of the two values + * @return The lesser of the two values. */ /** * @def MAX(a, b) * Return the greater of @a a or @a b. * - * This macro compares its two parameters, @a a and @a b, and returns the greater - * of the two (the maximum). When building under gcc, a GNU-specific extension - * is used which prevents expressions used as parameters from being evaluated - * multiple times. + * This macro compares its two parameters, @a a and @a b, and returns + * the greater of the two (the maximum). When building under gcc, a + * GNU-specific extension is used which prevents expressions used as + * parameters from being evaluated multiple times. * * @param a Any expression that evaluates to a value. * @param b Any expression that evaluates to a value. - * @return The greater of the two values + * @return The greater of the two values. */ /** * @def LOWER_BOUND(current, other) * Force a lower bound on a variable. * - * This macro checks the value of its first parameter, @a current, and makes sure - * it is greater than or equal to the value of @a other. If @a current is less - * than @a other, @a current is assigned the value of @a other. In essence, this - * establishes a "lower bound" on @a current equal to the value of @a other. + * This macro checks the value of its first parameter, @a current, and + * makes sure it is greater than or equal to the value of @a other. + * If @a current is less than @a other, @a current is assigned the + * value of @a other. In essence, this establishes a "lower bound" on + * @a current equal to the value of @a other. * * @param current The variable to check. * @param other The value by which @a current will be bound. @@ -172,10 +185,11 @@ * @def UPPER_BOUND(current, other) * Force an upper bound on a variable. * - * This macro checks the value of its first parameter, @a current, and makes sure - * it is less than or equal to the value of @a other. If @a current is greater - * than @a other, @a current is assigned the value of @a other. In essence, this - * establishes an "upper bound" on @a current equal to the value of @a other. + * This macro checks the value of its first parameter, @a current, and + * makes sure it is less than or equal to the value of @a other. If + * @a current is greater than @a other, @a current is assigned the + * value of @a other. In essence, this establishes an "upper bound" + * on @a current equal to the value of @a other. * * @param current The variable to check. * @param other The value by which @a current will be bound. @@ -185,11 +199,12 @@ * @def BOUND(val, min, max) * Force a variable to be within a given range. * - * This macro checks the value of its first parameter, @a val, and makes sure - * it is between @a min and @a max, inclusive. If @a val is above this range, it - * is assigned the value of @a max. Likewise, if @a val is below this range, it - * is assigned the value of @a min. In essence, this establishes both an "upper - * bound" and a "lower bound" on @a val. + * This macro checks the value of its first parameter, @a val, and + * makes sure it is between @a min and @a max, inclusive. If @a val + * is above this range, it is assigned the value of @a max. Likewise, + * if @a val is below this range, it is assigned the value of @a min. + * In essence, this establishes both an "upper bound" and a "lower + * bound" on @a val. * * @param val The variable to check. * @param min The lowest value @a val may have. @@ -209,7 +224,7 @@ # define UPPER_BOUND(current, other) __extension__ ({__typeof__(other) o = (other); ((current) > o) ? ((current) = o) : (current);}) # define BOUND(val, min, max) __extension__ ({__typeof__(min) m1 = (min); __typeof__(max) m2 = (max); ((val) < m1) ? ((val) = m1) : (((val) > m2) ? ((val) = m2) : (val));}) #else -# define MIN(a,b) (((a) < (b)) ? (a) : (b)) +# define MIN(a,b) (((a) < (b)) ? (a) : (b)) # define MAX(a,b) (((a) > (b)) ? (a) : (b)) # define LOWER_BOUND(current, other) (((current) < (other)) ? ((current) = (other)) : (current)) # define UPPER_BOUND(current, other) (((current) > (other)) ? ((current) = (other)) : (current)) @@ -228,7 +243,8 @@ /** * Swaps two values. * - * This macro swaps the values of its first two parameters using the third as temporary storage. + * This macro swaps the values of its first two parameters using the + * third as temporary storage. * * @param one The first variable. * @param two The second variable. @@ -236,12 +252,63 @@ */ #define SWAP_IT(one, two, tmp) do {(tmp) = (one); (one) = (two); (two) = (tmp);} while (0) +/** + * @def SWAP(a, b) + * Swaps two values. + * + * This macro performs the same task as the SWAP_IT() macro, except + * that no temporary variable is required. Instead, a temporary + * variable is created by the macro itself. Under gcc, the + * __typeof__() extension is used to create a temporary variable of + * the same type as @a a. Under other compilers, a void pointer is + * used. + * + * @param a The first variable. + * @param b The second variable. + */ +#ifdef __GNUC__ +# define SWAP(a, b) (void) __extension__ ({__typeof__(a) tmp = (a); (a) = (b); (b) = tmp;}) +#else +# define SWAP(a, b) do {void *tmp = ((void *)(a)); (a) = (b); (b) = tmp;} while (0) +#endif +/** + * Swaps two values. + * + * This macro swaps the values of @a a and @a b using the now-infamous + * chained XOR trick. + * + * @attention ONLY use this with like variables, and only those which + * can safely be cast to and from a long. If you're unsure of whether + * or not it would be safe, use SWAP() or SWAP_IT() instead! + * + * @param a The first variable. + * @param b The second variable. + */ +#define BINSWAP(a, b) (((long) (a)) ^= ((long) (b)) ^= ((long) (a)) ^= ((long) (b))) + +/** + * Make sure a char pointer is non-NULL before printing it. + * + * This is a convenience macro primarily targetted at systems like + * Solaris where doing a printf() on a NULL char pointer using %s + * results in a segmentation fault rather than helpful message. This + * macro should be used in any place where a string is printed which + * could potentially be NULL. + * + * @param x A string (char *). + * @return @a x, or if @a x is NULL, the string "<@a x null>" + */ +#define NONULL(x) (((char *) (x)) ? ((char *) (x)) : ((char *) ("<" #x " null>"))) + /****************************** DEBUGGING GOOP ********************************/ #ifndef LIBAST_DEBUG_FD /** * Where to send debugging output. * - * This defines where debugging output should be sent. Should be either stdout or stderr. + * This defines where debugging output should be sent. Should be + * either stdout or stderr. + * + * @ingroup DOXGRP_DEBUG */ # define LIBAST_DEBUG_FD (stderr) #endif @@ -249,9 +316,13 @@ /** * Maximum compile-time debugging level. * - * LibAST supports debugging levels, allowing for progressively more verbosity of debugging - * output as the level gets higher. This defines the compile-time maximum; support for higher - * debugging levels than this will not even be compiled in, so use care when setting this. + * LibAST supports debugging levels, allowing for progressively more + * verbosity of debugging output as the level gets higher. This + * defines the compile-time maximum; support for higher debugging + * levels than this will not even be compiled in, so use care when + * setting this. + * + * @ingroup DOXGRP_DEBUG */ # define DEBUG 0 #endif @@ -264,22 +335,37 @@ /** Does nothing. This macro is a nop (no operation). It does nothing. */ #define NOP ((void)0) -/** A fix-me NOP. This is the same as NOP(), but is used to mark something needing to be fixed. */ +/** + * A fix-me NOP. + * + * This is the same as NOP(), but is used to mark something needing to + * be fixed. + */ #define FIXME_NOP(x) -/** Mark a block of code needing fixing. This marks a block of code needing fixing and removes it. */ +/** + * Mark a block of code needing fixing. + * + * This marks a block of code needing fixing and removes it. + */ #define FIXME_BLOCK 0 -/** Mark unused blocks of code. This marks a block of code as unused and removes it. */ +/** + * Mark unused blocks of code. + * + * This marks a block of code as unused and removes it. + */ #define UNUSED_BLOCK 0 /** * @def __DEBUG() * Format and print debugging output. * - * This macro formats and prints debugging output by prepending a timestamp, the filename, the - * line number, and (if available) the function name. + * This macro formats and prints debugging output by prepending a + * timestamp, the filename, the line number, and (if available) the + * function name. * * This is an internal macro and should not be used directly. + * @ingroup DOXGRP_DEBUG */ #if defined(__FILE__) && defined(__LINE__) # ifdef __GNUC__ @@ -294,13 +380,101 @@ /** * Assert reaching a line of code. * - * This macro is simply a quick-and-dirty way of printing out a unique message which proves - * that a particular portion of code was reached and executed properly. + * This macro is simply a quick-and-dirty way of printing out a unique + * message which proves that a particular portion of code was reached + * and executed properly. + * + * @ingroup DOXGRP_DEBUG */ #define MOO() do {__DEBUG(); libast_dprintf("Moo.\n");} while (0) -/* Assertion/abort macros which are quite a bit more useful than assert() and abort(). These are defined - differently based on the use of gcc, the presence of __FILE__ and __LINE__, and the DEBUG setting. */ +/** + * @def ASSERT(x) + * Asserts that a condition is true. + * + * This macro evaluates an expression, @a x, and takes action if the + * expression evaluates to false (0). It works similarly to the libc + * function assert(), with the exception that it will not call abort() + * if the assertion fails. Instead, it will either issue a fatal + * error (generally resulting in a backtrace) if debugging is active, + * or print a warning if it is not. In either event, the warning/error + * message will contain the filename, line number, and (if available) + * function name where the error occured. + * + * If only a warning is generated, the function will return + * immediately. + * + * @param x Any valid boolean expression. + * @ingroup DOXGRP_DEBUG + */ +/** + * @def ASSERT_RVAL(x, val) + * Asserts that a condition is true, and provides a return value in + * case it isn't. + * + * This macro is identical to ASSERT(), except that it returns a + * value, @a val, instead of returning void. + * + * @param x Any valid boolean expression. + * @param val The return value to use if @a x evaluates to false. + * @ingroup DOXGRP_DEBUG + */ +/** + * @def ASSERT_NOTREACHED() + * Asserts that a particular piece of code is not reached. + * + * This macro is used in sections of code that should never be + * reached. Its actions are similar to those of ASSERT(), but instead + * of evaluating an expression, it always evaluates to false. + * + * @ingroup DOXGRP_DEBUG + */ +/** + * @def ASSERT_NOTREACHED_RVAL(val) + * Asserts that a particular piece of code is not reached, and + * provides a return value in case it is. + * + * This macro is identical to ASSERT_NOTREACHED(), except that it + * returns a value, @a val, instead of returning void. + * + * @ingroup DOXGRP_DEBUG + */ +/** + * @def ABORT() + * Throw a fatal exception. + * + * This macro is a replacement for the libc abort() function. This + * version provides file/line/function information in the fatal error + * message. + * + * @ingroup DOXGRP_DEBUG + */ +/** + * @def REQUIRE(x) + * Return if an expression is false. + * + * This macro is similar to ASSERT(), except that @a x evaluating to + * false is not necessarily an error. Normally, this macro simply + * causes the function to return. However, if debugging is active, a + * message is printed noting the expression @a x and the location of + * the failure. This macro is often used to test preconditions, such + * as making sure pointers are non-NULL before using them. + * + * @param x Any valid boolean expression. + * @ingroup DOXGRP_DEBUG + */ +/** + * @def REQUIRE_RVAL(x, v) + * Return @a v if an expression is false. + * + * This macro is identical to REQUIRE(), except that a return value + * for the function is supplied. + * + * @param x Any valid boolean expression + * @param v The function return value to use if @a x evaluates to + * false. + * @ingroup DOXGRP_DEBUG + */ #if DEBUG >= 1 # if defined(__FILE__) && defined(__LINE__) # ifdef __GNUC__ @@ -351,9 +525,133 @@ # define REQUIRE_RVAL(x, v) do {if (!(x)) return (v);} while (0) #endif -#define NONULL(x) (((char *) (x)) ? ((char *) (x)) : ((char *) ("<" #x " null>"))) - -/* Macros for printing debugging messages */ +/** + * @def DPRINTF(x) + * Print debugging output. + * + * This macro can be used for unconditional debugging output. If any + * level of debugging support has been compiled in, this macro will + * print a debugging message. + * + * This macro will almost never be used directly; instead, use the + * D_*() macros. + * + * @attention Calls to this and other debugging output macros + * MUST be double-parenthesized, like so: DPRINTF((...)); + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF1(x) + * Print level 1 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 1 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF2(x) + * Print level 2 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 2 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF3(x) + * Print level 3 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 3 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF4(x) + * Print level 4 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 4 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF5(x) + * Print level 5 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 5 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF6(x) + * Print level 6 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 6 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF7(x) + * Print level 7 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 7 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF8(x) + * Print level 8 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 8 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ +/** + * @def DPRINTF9(x) + * Print level 9 debugging output. + * + * This macro is identical to DPRINTF(), except that the message will + * only be printed if the debug level is 9 or higher. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ #if DEBUG >= 1 # ifndef DPRINTF # define DPRINTF(x) do { __DEBUG(); libast_dprintf x; } while (0) @@ -382,25 +680,368 @@ # define DPRINTF9(x) NOP #endif -/* Use this for stuff that you only want turned on in dire situations */ +/** + * Debugging output you (almost) never want. + * + * This macro is used for mapping debugging output you almost never + * want to see. Map D_*() macros to this for overly verbose or + * problematic debugging information, then manually redefine this as + * needed. + * + * @param x A parenthesized argument list suitable for a printf-style + * function. + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ #define D_NEVER(x) NOP +/** Set options debugging to level 1. @see DOXGRP_DEBUG */ #define DEBUG_OPTIONS 1 +/** + * Option debugging macro. + * + * This macro is used for debugging output related to the options + * subsystem. It maps to DPRINTF1() so that options-related debugging + * output will occur at debug level 1 and higher. + * + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ #define D_OPTIONS(x) DPRINTF1(x) +/** Set object system debugging to level 2. @see DOXGRP_DEBUG */ #define DEBUG_OBJ 2 +/** + * Object debugging macro. + * + * This macro is used for debugging output related to the object + * subsystem. It maps to DPRINTF2() so that object-related debugging + * output will occur at debug level 2 and higher. + * + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ #define D_OBJ(x) DPRINTF2(x) +/** Set config file parser debugging to level 3. @see DOXGRP_DEBUG */ #define DEBUG_CONF 3 +/** + * Config file parser debugging macro. + * + * This macro is used for debugging output related to the config file + * parser. It maps to DPRINTF3() so that config-related debugging + * output will occur at debug level 3 and higher. + * + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ #define D_CONF(x) DPRINTF3(x) +/** Set memory allocation debugging to level 5. @see DOXGRP_DEBUG */ #define DEBUG_MEM 5 +/** + * Memory allocation debugging macro. + * + * This macro is used for debugging output related to the memory + * allocation subsystem. It maps to DPRINTF1() so that mem-related + * debugging output will occur at debug level 5 and higher. + * + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ #define D_MEM(x) DPRINTF5(x) +/** Set strings module debugging to level 9999. @see DOXGRP_DEBUG */ #define DEBUG_STRINGS 9999 +/** + * String routine debugging macro. + * + * This macro is used for debugging output related to the string + * manipulation subsystem. It maps to D_NEVER() so that + * string-related debugging output can only be activated manually. + * + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ #define D_STRINGS(x) D_NEVER(x) +/** Set lexer/parser debugging to level 9999. @see DOXGRP_DEBUG */ #define DEBUG_PARSE 9999 +/** + * Lexer/parser debugging macro. + * + * This macro is used for debugging output related to the lexer/parser + * portion of the config parser. It maps to D_NEVER() so that + * parser-related debugging output can only be activated manually. + * + * @see DOXGRP_DEBUG + * @ingroup DOXGRP_DEBUG + */ #define D_PARSE(x) D_NEVER(x) /********************************* MEM GOOP ***********************************/ +/** + * @def MALLOC(sz) + * Allocate @a sz bytes of memory. + * + * This macro is a replacement for the libc function malloc(). It + * allocates the specified number of bytes of memory on the heap and + * returns a pointer to that memory location. This macro calls libc's + * malloc() if memory debugging is off, and libast_malloc() if it's + * on. + * + * @param sz The size in bytes of the block of memory to allocate. + * @return A pointer to the allocated memory. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def CALLOC(type, n) + * Allocate enough memory for @a n objects of type @a type. + * + * This macro is a replacement for the libc function calloc(). It + * allocates a block of memory on the heap large enough to hold @a n + * objects of type @a type (e.g., a @a type array of size @a n). The + * memory area is zeroed out prior to the pointer to it being + * returned. This macro calls libc's calloc() if memory debugging is + * off and libast_calloc() if it's on. + * + * @param type The type of object to be allocated (e.g., int). + * @param n The number of objects to be allocated. + * @return A pointer to the allocated memory. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def REALLOC(mem, sz) + * Resize the memory block pointed to by @a mem to @a sz bytes. + * + * This macro is a replacement for the libc function realloc(). It + * changes the size of a chunk of memory previously allocated by + * malloc() or calloc() (or, by extension, the MALLOC()/CALLOC() + * macros) and returns a pointer to the (possibly moved) memory area. + * This macro calls libc's realloc() if memory debugging is off and + * libast_realloc() if it's on. + * + * @param mem The old pointer whose size will be changed. + * @param sz The new size, in bytes, to be allocated. + * @return The new pointer value, which may or may not differ from the + * old value. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def FREE(ptr) + * Free a previously-allocated memory block. + * + * This macro is a replacement for the libc function free(). It + * returns the previously-allocated memory block pointed to by @a ptr + * to the heap. This macro calls libc's free() if memory debugging is + * off and libast_free() if it's on. The @a ptr parameter is assigned + * the value of NULL after it has been freed. + * + * @param ptr The pointer to be freed. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def STRDUP(s) + * Duplicate a string pointer and return a pointer to the new copy. + * + * This macro is a replacement for the libc function strdup(). It + * allocates a section of memory large enough to hold the string @a s + * (including the trailing NUL character), copies the contents of @a s + * into the new buffer, and returns a pointer to the new copy. This + * macro calls libc's strdup() of memory debugging is off and + * libast_strdup() if it's on. + * + * @param s The string to duplicate. + * @return A pointer to the newly-created copy. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def MALLOC_DUMP() + * Dumps a listing of all allocated pointers along with their sizes + * and contents in both hex and ASCII. + * + * This macro is used to view the status of memory allocated via the + * LibAST memory management system. First the pointers used to track + * allocated memory are dumped (that's what pointer #0 is); then, each + * allocated pointer is dumped along with its size and contents, the + * latter being displayed both in hexadecimal form and ASCII form. + * Non-printable characters are replaced by dots ('.'). You can see + * a sample of the output in the + * @link mem_example.c memory management system example @endlink. + * + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def X_CREATE_PIXMAP(d, win, w, h, depth) + * Create an X pixmap. + * + * This macro is a replacement for the Xlib function XCreatePixmap(). + * It creates a pixmap of the specified size and returns an X resource + * ID for it. This macro calls Xlib's XCreatePixmap() if memory + * debugging is off and libast_x_create_pixmap() if it's on. + * + * @param d The X display connection. + * @param win The X drawable on whose display the pixmap will be + * created. + * @param w The width in pixels of the pixmap. + * @param h The height in pixels of the pixmap. + * @param depth The color depth for the pixmap. + * @return The Pixmap ID for the new pixmap. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def X_FREE_PIXMAP(d, p) + * Free the specified X pixmap. + * + * This macro is a replacement for the Xlib function XFreePixmap(). + * It frees the specified pixmap. This macro calls Xlib's + * XFreePixmap() if memory debugging is off and libast_x_free_pixmap() + * if it's on. + * + * @param d The X display connection. + * @param p The Pixmap to be freed. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def IMLIB_REGISTER_PIXMAP(p) + * Register a pixmap generated by Imlib2 so LibAST can track it. + * + * Unfortunately, there is no easy way to wrap all the different ways + * Imlib2 could conceivably create an image. So instead, simply use + * this macro to register the pixmaps Imlib2 creates. Then LibAST + * will be able to track them. This macro calls + * libast_imlib_register_pixmap() if memory debugging is on and if + * Imlib2 support has been enabled. Otherwise, it's a NOP(). + * + * @param p The Pixmap Imlib2 created. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def IMLIB_FREE_PIXMAP(p) + * Free a pixmap (and its mask) generated by Imlib2. + * + * Once an Imlib2-generated pixmap has been registered, you should + * use this macro to free it. It calls libast_imlib_free_pixmap() if + * Imlib2 support has been enabled. Otherwise, it's a NOP(). + * + * @param p The Imlib2-generated Pixmap to be freed. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def PIXMAP_DUMP() + * Dump a listing of allocated pixmaps. + * + * This macro is analogous to the MALLOC_DUMP() macro; rather than + * dumping a list of pointers, however, it dumps a list of allocated + * pixmaps. Like MALLOC_DUMP(), this macro is a NOP() if memory + * debugging support has not been compiled into LibAST. + * + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def X_CREATE_GC(d, win, f, gcv) + * Create an X graphics context. + * + * This macro is a replacement for the Xlib function XCreateGC(). It + * creates a graphics context (GC) object and returns its X resource + * ID. This macro calls Xlib's XCreateGC() if memory debugging is + * off and libast_x_create_gc() if it's on. + * + * @param d The X display connection. + * @param win The X drawable on whose screen the GC will be created. + * @param f The GC flags noting which members of @a gcv have set + * values. + * @param gcv The GCValues structure defining properties of the GC. + * @return The ID of the new GC. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def X_FREE_GC(d, gc) + * Free an X graphics context. + * + * This macro is a replacement for the Xlib function XFreeGC(). It + * frees a previously allocated graphics context (GC) object. This + * macro calls Xlib's XFreeGC() if memory debugging is off and + * libast_x_free_gc() if it's on. + * + * @param d The X display connection. + * @param gc The graphics context object to free. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def GC_DUMP() + * Dump a list of allocated graphics context objects. + * + * This macro is analogous to the MALLOC_DUMP() macro; rather than + * dumping a list of pointers, however, it dumps a list of allocated + * GC's. Like MALLOC_DUMP(), this macro is a NOP() if memory + * debugging support has not been compiled into LibAST. + * + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def MALLOC_MOD + * MALLOC() call count interval. + * + * LibAST has the ability to count calls to MALLOC(); this defines the + * interval for reporting the call count. The default is 25, meaning + * that LibAST will print the current count every 25 calls. Note that + * MALLOC_CALL_DEBUG must be defined when compiling LibAST, in + * addition to memory debugging, for this feature to work. + * + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def REALLOC_MOD + * REALLOC() call count interval. + * + * LibAST has the ability to count calls to REALLOC(); this defines + * the interval for reporting the call count. The default is 25, + * meaning that LibAST will print the current count every 25 calls. + * Note that MALLOC_CALL_DEBUG must be defined when compiling LibAST, + * in addition to memory debugging, for this feature to work. + * + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def CALLOC_MOD + * CALLOC() call count interval. + * + * LibAST has the ability to count calls to CALLOC(); this defines the + * interval for reporting the call count. The default is 25, meaning + * that LibAST will print the current count every 25 calls. Note that + * MALLOC_CALL_DEBUG must be defined when compiling LibAST, in + * addition to memory debugging, for this feature to work. + * + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ +/** + * @def FREE_MOD + * FREE() call count interval. + * + * LibAST has the ability to count calls to FREE(); this defines the + * interval for reporting the call count. The default is 25, meaning + * that LibAST will print the current count every 25 calls. Note that + * MALLOC_CALL_DEBUG must be defined when compiling LibAST, in + * addition to memory debugging, for this feature to work. + * + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ #if (DEBUG >= DEBUG_MEM) # define MALLOC(sz) libast_malloc(__FILE__, __LINE__, (sz)) # define CALLOC(type,n) libast_calloc(__FILE__, __LINE__, (n), (sizeof(type))) @@ -449,11 +1090,33 @@ /* Fast memset() macro contributed by vendu */ #if (SIZEOF_LONG == 8) +/** UNDOCUMENTED */ # define MEMSET_LONG() (l |= l<<32) #else +/** UNDOCUMENTED */ # define MEMSET_LONG() NOP #endif +/** + * @def MEMSET(s, c, count) + * Initialize a memory region to a particular value. + * + * This macro is a replacement for the libc function memset(). It + * initializes the memory region pointed to by @a s to the value + * specified by @a c. The size of the memory region is specified by + * @a count. Note that @a c must be a byte (char) value. + * + * This macro has been optimized to set as many bits simultaneously as + * the architecture can handle, so it should offer superior + * performance to libc's memset() function. + * + * @param s A pointer to the memory region to initialize. + * @param c The value to which all bytes in the block will be + * set. + * @param count The size, in bytes, of the memory region. + * @see DOXGRP_MEM + * @ingroup DOXGRP_MEM + */ #define MEMSET(s, c, count) do { \ char *end = (char *)(s) + (count); \ long l; \ @@ -495,21 +1158,57 @@ /******************************* STRINGS GOOP *********************************/ - -#ifdef __GNUC__ -# define SWAP(a, b) (void) __extension__ ({__typeof__(a) tmp = (a); (a) = (b); (b) = tmp;}) -#else -# define SWAP(a, b) do {void *tmp = ((void *)(a)); (a) = (b); (b) = tmp;} while (0) -#endif -#define BINSWAP(a, b) (((long) (a)) ^= ((long) (b)) ^= ((long) (a)) ^= ((long) (b))) - +/** + * Returns the length of a literal string. + * + * This macro is like libc's strlen() function, except that it + * requires the string parameter be a literal rather than a variable. + * This makes calculating the string length for a literal easy without + * incurring the speed penalty of a call to strlen(). + * + * @param x The literal string (i.e., a fixed string in quotes, like + * "this."). + * @return The length of the string. + * @see DOXGRP_STRINGS + * @ingroup DOXGRP_STRINGS + */ #define CONST_STRLEN(x) (sizeof(x) - 1) +/** + * Compares the beginning of a string with a literal. + * + * This macro, like the libc str*cmp() functions, returns an integer + * less than, equal to, or greater than zero depending on if the + * initial part of string @a s is found to be less than, to match, or + * to be greater than the literal string. Generally, this is used as + * a boolean value (as !BEG_STRCASECMP()) to determine whether or not + * @a s starts with @a constr or not. Note that case is ignored, as + * the name implies. + * + * @param s The string variable to compare to. + * @param constr A literal string representing what should be the + * beginning of @a s. + * @return See above. + * @see DOXGRP_STRINGS + * @ingroup DOXGRP_STRINGS + */ #define BEG_STRCASECMP(s, constr) (strncasecmp(s, constr, CONST_STRLEN(constr))) /******************************** CONF GOOP ***********************************/ - +/** + * @def PATH_MAX + * The maximum length of a path specifier. + * + * LibAST requires PATH_MAX to be properly defined. Unfortunately, + * some UNIX versions (namely HP-UX) define it incorrectly. Most UNIX + * versions support a PATH_MAX of 1024, but all must support at least + * 255. So if PATH_MAX is defined to be less than 255 (like HP-UX and + * its absolutely ludicrous value of 14), LibAST forceably redefines + * it to be 255. + * @see DOXGRP_CONF + * @ingroup DOXGRP_CONF + */ #if defined(PATH_MAX) && (PATH_MAX < 255) # undef PATH_MAX #endif @@ -517,6 +1216,14 @@ # define PATH_MAX 255 #endif +/** + * Maximum length of a line in a config file. + * + * At no time during parsing can any line in a config file exceed this + * length (20 kB by default). + * @see DOXGRP_CONF + * @ingroup DOXGRP_CONF + */ #define CONFIG_BUFF 20480 #define CONF_BEGIN_CHAR ((char) 1) #define CONF_BEGIN_STRING "\001" @@ -532,12 +1239,13 @@ #define ctx_name_to_id(the_id, n, i) do { \ for ((i)=0; (i) <= ctx_idx; (i)++) { \ if (!strcasecmp((n), context[(i)].name)) { \ - (the_id) = (i); \ - break; \ - } \ - } \ + (the_id) = (i); \ + break; \ + } \ + } \ if ((i) > ctx_idx) { \ - print_error("Parsing file %s, line %lu: No such context \"%s\"\n", file_peek_path(), file_peek_line(), (n)); \ + print_error("Parsing file %s, line %lu: No such context \"%s\"\n", \ + file_peek_path(), file_peek_line(), (n)); \ (the_id) = 0; \ } \ } while (0) ------------------------------------------------------- This SF.net email is sponsored by: SlickEdit Inc. Develop an edge. The most comprehensive and flexible code editor you can use. Code faster. C/C++, C#, Java, HTML, XML, many more. FREE 30-Day Trial. www.slickedit.com/sourceforge _______________________________________________ enlightenment-cvs mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs