00001 /* Licensed to the Apache Software Foundation (ASF) under one or more 00002 * contributor license agreements. See the NOTICE file distributed with 00003 * this work for additional information regarding copyright ownership. 00004 * The ASF licenses this file to You under the Apache License, Version 2.0 00005 * (the "License"); you may not use this file except in compliance with 00006 * the License. You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #ifndef APR_GENERAL_H 00018 #define APR_GENERAL_H 00019 00020 /** 00021 * @file apr_general.h 00022 * This is collection of oddballs that didn't fit anywhere else, 00023 * and might move to more appropriate headers with the release 00024 * of APR 1.0. 00025 * @brief APR Miscellaneous library routines 00026 */ 00027 00028 #include "apr.h" 00029 #include "apr_pools.h" 00030 #include "apr_errno.h" 00031 00032 #if APR_HAVE_SIGNAL_H 00033 #include <signal.h> 00034 #endif 00035 00036 #ifdef __cplusplus 00037 extern "C" { 00038 #endif /* __cplusplus */ 00039 00040 /** 00041 * @defgroup apr_general Miscellaneous library routines 00042 * @ingroup APR 00043 * This is collection of oddballs that didn't fit anywhere else, 00044 * and might move to more appropriate headers with the release 00045 * of APR 1.0. 00046 * @{ 00047 */ 00048 00049 /** FALSE */ 00050 #ifndef FALSE 00051 #define FALSE 0 00052 #endif 00053 /** TRUE */ 00054 #ifndef TRUE 00055 #define TRUE (!FALSE) 00056 #endif 00057 00058 /** a space */ 00059 #define APR_ASCII_BLANK '\040' 00060 /** a carrige return */ 00061 #define APR_ASCII_CR '\015' 00062 /** a line feed */ 00063 #define APR_ASCII_LF '\012' 00064 /** a tab */ 00065 #define APR_ASCII_TAB '\011' 00066 00067 /** signal numbers typedef */ 00068 typedef int apr_signum_t; 00069 00070 /** 00071 * Finding offsets of elements within structures. 00072 * Taken from the X code... they've sweated portability of this stuff 00073 * so we don't have to. Sigh... 00074 * @param p_type pointer type name 00075 * @param field data field within the structure pointed to 00076 * @return offset 00077 */ 00078 00079 #if defined(CRAY) || (defined(__arm) && !defined(LINUX)) 00080 #ifdef __STDC__ 00081 #define APR_OFFSET(p_type,field) _Offsetof(p_type,field) 00082 #else 00083 #ifdef CRAY2 00084 #define APR_OFFSET(p_type,field) \ 00085 (sizeof(int)*((unsigned int)&(((p_type)NULL)->field))) 00086 00087 #else /* !CRAY2 */ 00088 00089 #define APR_OFFSET(p_type,field) ((unsigned int)&(((p_type)NULL)->field)) 00090 00091 #endif /* !CRAY2 */ 00092 #endif /* __STDC__ */ 00093 #else /* ! (CRAY || __arm) */ 00094 00095 #define APR_OFFSET(p_type,field) \ 00096 ((long) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL))) 00097 00098 #endif /* !CRAY */ 00099 00100 /** 00101 * Finding offsets of elements within structures. 00102 * @param s_type structure type name 00103 * @param field data field within the structure 00104 * @return offset 00105 */ 00106 #if defined(offsetof) && !defined(__cplusplus) 00107 #define APR_OFFSETOF(s_type,field) offsetof(s_type,field) 00108 #else 00109 #define APR_OFFSETOF(s_type,field) APR_OFFSET(s_type*,field) 00110 #endif 00111 00112 #ifndef DOXYGEN 00113 00114 /* A couple of prototypes for functions in case some platform doesn't 00115 * have it 00116 */ 00117 #if (!APR_HAVE_STRCASECMP) && (APR_HAVE_STRICMP) 00118 #define strcasecmp(s1, s2) stricmp(s1, s2) 00119 #elif (!APR_HAVE_STRCASECMP) 00120 int strcasecmp(const char *a, const char *b); 00121 #endif 00122 00123 #if (!APR_HAVE_STRNCASECMP) && (APR_HAVE_STRNICMP) 00124 #define strncasecmp(s1, s2, n) strnicmp(s1, s2, n) 00125 #elif (!APR_HAVE_STRNCASECMP) 00126 int strncasecmp(const char *a, const char *b, size_t n); 00127 #endif 00128 00129 #endif 00130 00131 /** 00132 * Alignment macros 00133 */ 00134 00135 /* APR_ALIGN() is only to be used to align on a power of 2 boundary */ 00136 #define APR_ALIGN(size, boundary) \ 00137 (((size) + ((boundary) - 1)) & ~((boundary) - 1)) 00138 00139 /** Default alignment */ 00140 #define APR_ALIGN_DEFAULT(size) APR_ALIGN(size, 8) 00141 00142 00143 /** 00144 * String and memory functions 00145 */ 00146 00147 /* APR_STRINGIFY is defined here, and also in apr_release.h, so wrap it */ 00148 #ifndef APR_STRINGIFY 00149 /** Properly quote a value as a string in the C preprocessor */ 00150 #define APR_STRINGIFY(n) APR_STRINGIFY_HELPER(n) 00151 /** Helper macro for APR_STRINGIFY */ 00152 #define APR_STRINGIFY_HELPER(n) #n 00153 #endif 00154 00155 #if (!APR_HAVE_MEMMOVE) 00156 #define memmove(a,b,c) bcopy(b,a,c) 00157 #endif 00158 00159 #if (!APR_HAVE_MEMCHR) 00160 void *memchr(const void *s, int c, size_t n); 00161 #endif 00162 00163 /** @} */ 00164 00165 /** 00166 * @defgroup apr_library Library initialization and termination 00167 * @{ 00168 */ 00169 00170 /** 00171 * Setup any APR internal data structures. This MUST be the first function 00172 * called for any APR library. 00173 * @remark See apr_app_initialize if this is an application, rather than 00174 * a library consumer of apr. 00175 */ 00176 APR_DECLARE(apr_status_t) apr_initialize(void); 00177 00178 /** 00179 * Set up an application with normalized argc, argv (and optionally env) in 00180 * order to deal with platform-specific oddities, such as Win32 services, 00181 * code pages and signals. This must be the first function called for any 00182 * APR program. 00183 * @param argc Pointer to the argc that may be corrected 00184 * @param argv Pointer to the argv that may be corrected 00185 * @param env Pointer to the env that may be corrected, may be NULL 00186 * @remark See apr_initialize if this is a library consumer of apr. 00187 * Otherwise, this call is identical to apr_initialize, and must be closed 00188 * with a call to apr_terminate at the end of program execution. 00189 */ 00190 APR_DECLARE(apr_status_t) apr_app_initialize(int *argc, 00191 char const * const * *argv, 00192 char const * const * *env); 00193 00194 /** 00195 * Tear down any APR internal data structures which aren't torn down 00196 * automatically. 00197 * @remark An APR program must call this function at termination once it 00198 * has stopped using APR services. The APR developers suggest using 00199 * atexit to ensure this is called. When using APR from a language 00200 * other than C that has problems with the calling convention, use 00201 * apr_terminate2() instead. 00202 */ 00203 APR_DECLARE_NONSTD(void) apr_terminate(void); 00204 00205 /** 00206 * Tear down any APR internal data structures which aren't torn down 00207 * automatically, same as apr_terminate 00208 * @remark An APR program must call either the apr_terminate or apr_terminate2 00209 * function once it it has finished using APR services. The APR 00210 * developers suggest using atexit(apr_terminate) to ensure this is done. 00211 * apr_terminate2 exists to allow non-c language apps to tear down apr, 00212 * while apr_terminate is recommended from c language applications. 00213 */ 00214 APR_DECLARE(void) apr_terminate2(void); 00215 00216 /** @} */ 00217 00218 /** 00219 * @defgroup apr_random Random Functions 00220 * @{ 00221 */ 00222 00223 #if APR_HAS_RANDOM || defined(DOXYGEN) 00224 00225 /* TODO: I'm not sure this is the best place to put this prototype...*/ 00226 /** 00227 * Generate random bytes. 00228 * @param buf Buffer to fill with random bytes 00229 * @param length Length of buffer in bytes 00230 */ 00231 APR_DECLARE(apr_status_t) apr_generate_random_bytes(unsigned char * buf, 00232 apr_size_t length); 00233 00234 #endif 00235 /** @} */ 00236 00237 #ifdef __cplusplus 00238 } 00239 #endif 00240 00241 #endif /* ! APR_GENERAL_H */