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 /* Portions of this file are covered by */ 00018 /* -*- mode: c; c-file-style: "k&r" -*- 00019 00020 strnatcmp.c -- Perform 'natural order' comparisons of strings in C. 00021 Copyright (C) 2000 by Martin Pool <mbp@humbug.org.au> 00022 00023 This software is provided 'as-is', without any express or implied 00024 warranty. In no event will the authors be held liable for any damages 00025 arising from the use of this software. 00026 00027 Permission is granted to anyone to use this software for any purpose, 00028 including commercial applications, and to alter it and redistribute it 00029 freely, subject to the following restrictions: 00030 00031 1. The origin of this software must not be misrepresented; you must not 00032 claim that you wrote the original software. If you use this software 00033 in a product, an acknowledgment in the product documentation would be 00034 appreciated but is not required. 00035 2. Altered source versions must be plainly marked as such, and must not be 00036 misrepresented as being the original software. 00037 3. This notice may not be removed or altered from any source distribution. 00038 */ 00039 00040 #ifndef APR_STRINGS_H 00041 #define APR_STRINGS_H 00042 00043 /** 00044 * @file apr_strings.h 00045 * @brief APR Strings library 00046 */ 00047 00048 #include "apr.h" 00049 #include "apr_errno.h" 00050 #include "apr_pools.h" 00051 #define APR_WANT_IOVEC 00052 #include "apr_want.h" 00053 00054 #if APR_HAVE_STDARG_H 00055 #include <stdarg.h> 00056 #endif 00057 00058 #ifdef __cplusplus 00059 extern "C" { 00060 #endif /* __cplusplus */ 00061 00062 /** 00063 * @defgroup apr_strings String routines 00064 * @ingroup APR 00065 * @{ 00066 */ 00067 00068 /** 00069 * Do a natural order comparison of two strings. 00070 * @param a The first string to compare 00071 * @param b The second string to compare 00072 * @return Either <0, 0, or >0. If the first string is less than the second 00073 * this returns <0, if they are equivalent it returns 0, and if the 00074 * first string is greater than second string it retuns >0. 00075 */ 00076 APR_DECLARE(int) apr_strnatcmp(char const *a, char const *b); 00077 00078 /** 00079 * Do a natural order comparison of two strings ignoring the case of the 00080 * strings. 00081 * @param a The first string to compare 00082 * @param b The second string to compare 00083 * @return Either <0, 0, or >0. If the first string is less than the second 00084 * this returns <0, if they are equivalent it returns 0, and if the 00085 * first string is greater than second string it retuns >0. 00086 */ 00087 APR_DECLARE(int) apr_strnatcasecmp(char const *a, char const *b); 00088 00089 /** 00090 * duplicate a string into memory allocated out of a pool 00091 * @param p The pool to allocate out of 00092 * @param s The string to duplicate 00093 * @return The new string 00094 */ 00095 APR_DECLARE(char *) apr_pstrdup(apr_pool_t *p, const char *s); 00096 00097 /** 00098 * Create a null-terminated string by making a copy of a sequence 00099 * of characters and appending a null byte 00100 * @param p The pool to allocate out of 00101 * @param s The block of characters to duplicate 00102 * @param n The number of characters to duplicate 00103 * @return The new string 00104 * @remark This is a faster alternative to apr_pstrndup, for use 00105 * when you know that the string being duplicated really 00106 * has 'n' or more characters. If the string might contain 00107 * fewer characters, use apr_pstrndup. 00108 */ 00109 APR_DECLARE(char *) apr_pstrmemdup(apr_pool_t *p, const char *s, apr_size_t n); 00110 00111 /** 00112 * Duplicate at most n characters of a string into memory allocated 00113 * out of a pool; the new string will be NUL-terminated 00114 * @param p The pool to allocate out of 00115 * @param s The string to duplicate 00116 * @param n The maximum number of characters to duplicate 00117 * @return The new string 00118 * @remark The amount of memory allocated from the pool is the length 00119 * of the returned string including the NUL terminator 00120 */ 00121 APR_DECLARE(char *) apr_pstrndup(apr_pool_t *p, const char *s, apr_size_t n); 00122 00123 /** 00124 * Duplicate a block of memory. 00125 * 00126 * @param p The pool to allocate from 00127 * @param m The memory to duplicate 00128 * @param n The number of bytes to duplicate 00129 * @return The new block of memory 00130 */ 00131 APR_DECLARE(void *) apr_pmemdup(apr_pool_t *p, const void *m, apr_size_t n); 00132 00133 /** 00134 * Concatenate multiple strings, allocating memory out a pool 00135 * @param p The pool to allocate out of 00136 * @param ... The strings to concatenate. The final string must be NULL 00137 * @return The new string 00138 */ 00139 APR_DECLARE_NONSTD(char *) apr_pstrcat(apr_pool_t *p, ...); 00140 00141 /** 00142 * Concatenate multiple strings specified in a writev-style vector 00143 * @param p The pool from which to allocate 00144 * @param vec The strings to concatenate 00145 * @param nvec The number of strings to concatenate 00146 * @param nbytes (output) strlen of new string (pass in NULL to omit) 00147 * @return The new string 00148 */ 00149 APR_DECLARE(char *) apr_pstrcatv(apr_pool_t *p, const struct iovec *vec, 00150 apr_size_t nvec, apr_size_t *nbytes); 00151 00152 /** 00153 * printf-style style printing routine. The data is output to a string 00154 * allocated from a pool 00155 * @param p The pool to allocate out of 00156 * @param fmt The format of the string 00157 * @param ap The arguments to use while printing the data 00158 * @return The new string 00159 */ 00160 APR_DECLARE(char *) apr_pvsprintf(apr_pool_t *p, const char *fmt, va_list ap); 00161 00162 /** 00163 * printf-style style printing routine. The data is output to a string 00164 * allocated from a pool 00165 * @param p The pool to allocate out of 00166 * @param fmt The format of the string 00167 * @param ... The arguments to use while printing the data 00168 * @return The new string 00169 */ 00170 APR_DECLARE_NONSTD(char *) apr_psprintf(apr_pool_t *p, const char *fmt, ...) 00171 __attribute__((format(printf,2,3))); 00172 00173 /** 00174 * Copy up to dst_size characters from src to dst; does not copy 00175 * past a NUL terminator in src, but always terminates dst with a NUL 00176 * regardless. 00177 * @param dst The destination string 00178 * @param src The source string 00179 * @param dst_size The space available in dst; dst always receives 00180 * NUL termination, so if src is longer than 00181 * dst_size, the actual number of characters copied is 00182 * dst_size - 1. 00183 * @return Pointer to the NUL terminator of the destination string, dst 00184 * @remark 00185 * <PRE> 00186 * Note the differences between this function and strncpy(): 00187 * 1) strncpy() doesn't always NUL terminate; apr_cpystrn() does. 00188 * 2) strncpy() pads the destination string with NULs, which is often 00189 * unnecessary; apr_cpystrn() does not. 00190 * 3) strncpy() returns a pointer to the beginning of the dst string; 00191 * apr_cpystrn() returns a pointer to the NUL terminator of dst, 00192 * to allow a check for truncation. 00193 * </PRE> 00194 */ 00195 APR_DECLARE(char *) apr_cpystrn(char *dst, const char *src, 00196 apr_size_t dst_size); 00197 00198 /** 00199 * Strip spaces from a string 00200 * @param dest The destination string. It is okay to modify the string 00201 * in place. Namely dest == src 00202 * @param src The string to rid the spaces from. 00203 * @return The destination string, dest. 00204 */ 00205 APR_DECLARE(char *) apr_collapse_spaces(char *dest, const char *src); 00206 00207 /** 00208 * Convert the arguments to a program from one string to an array of 00209 * strings terminated by a NULL pointer 00210 * @param arg_str The arguments to convert 00211 * @param argv_out Output location. This is a pointer to an array of strings. 00212 * @param token_context Pool to use. 00213 */ 00214 APR_DECLARE(apr_status_t) apr_tokenize_to_argv(const char *arg_str, 00215 char ***argv_out, 00216 apr_pool_t *token_context); 00217 00218 /** 00219 * Split a string into separate null-terminated tokens. The tokens are 00220 * delimited in the string by one or more characters from the sep 00221 * argument. 00222 * @param str The string to separate; this should be specified on the 00223 * first call to apr_strtok() for a given string, and NULL 00224 * on subsequent calls. 00225 * @param sep The set of delimiters 00226 * @param last Internal state saved by apr_strtok() between calls. 00227 * @return The next token from the string 00228 */ 00229 APR_DECLARE(char *) apr_strtok(char *str, const char *sep, char **last); 00230 00231 /** 00232 * @defgroup APR_Strings_Snprintf snprintf implementations 00233 * @warning 00234 * These are snprintf implementations based on apr_vformatter(). 00235 * 00236 * Note that various standards and implementations disagree on the return 00237 * value of snprintf, and side-effects due to %n in the formatting string. 00238 * apr_snprintf (and apr_vsnprintf) behaves as follows: 00239 * 00240 * Process the format string until the entire string is exhausted, or 00241 * the buffer fills. If the buffer fills then stop processing immediately 00242 * (so no further %n arguments are processed), and return the buffer 00243 * length. In all cases the buffer is NUL terminated. It will return the 00244 * number of characters inserted into the buffer, not including the 00245 * terminating NUL. As a special case, if len is 0, apr_snprintf will 00246 * return the number of characters that would have been inserted if 00247 * the buffer had been infinite (in this case, *buffer can be NULL) 00248 * 00249 * In no event does apr_snprintf return a negative number. 00250 * @{ 00251 */ 00252 00253 /** 00254 * snprintf routine based on apr_vformatter. This means it understands the 00255 * same extensions. 00256 * @param buf The buffer to write to 00257 * @param len The size of the buffer 00258 * @param format The format string 00259 * @param ... The arguments to use to fill out the format string. 00260 */ 00261 APR_DECLARE_NONSTD(int) apr_snprintf(char *buf, apr_size_t len, 00262 const char *format, ...) 00263 __attribute__((format(printf,3,4))); 00264 00265 /** 00266 * vsnprintf routine based on apr_vformatter. This means it understands the 00267 * same extensions. 00268 * @param buf The buffer to write to 00269 * @param len The size of the buffer 00270 * @param format The format string 00271 * @param ap The arguments to use to fill out the format string. 00272 */ 00273 APR_DECLARE(int) apr_vsnprintf(char *buf, apr_size_t len, const char *format, 00274 va_list ap); 00275 /** @} */ 00276 00277 /** 00278 * create a string representation of an int, allocated from a pool 00279 * @param p The pool from which to allocate 00280 * @param n The number to format 00281 * @return The string representation of the number 00282 */ 00283 APR_DECLARE(char *) apr_itoa(apr_pool_t *p, int n); 00284 00285 /** 00286 * create a string representation of a long, allocated from a pool 00287 * @param p The pool from which to allocate 00288 * @param n The number to format 00289 * @return The string representation of the number 00290 */ 00291 APR_DECLARE(char *) apr_ltoa(apr_pool_t *p, long n); 00292 00293 /** 00294 * create a string representation of an apr_off_t, allocated from a pool 00295 * @param p The pool from which to allocate 00296 * @param n The number to format 00297 * @return The string representation of the number 00298 */ 00299 APR_DECLARE(char *) apr_off_t_toa(apr_pool_t *p, apr_off_t n); 00300 00301 /** 00302 * Convert a numeric string into an apr_off_t numeric value. 00303 * @param offset The value of the parsed string. 00304 * @param buf The string to parse. It may contain optional whitespace, 00305 * followed by an optional '+' (positive, default) or '-' (negative) 00306 * character, followed by an optional '0x' prefix if base is 0 or 16, 00307 * followed by numeric digits appropriate for base. 00308 * @param end A pointer to the end of the valid character in buf. If 00309 * not NULL, it is set to the first invalid character in buf. 00310 * @param base A numeric base in the range between 2 and 36 inclusive, 00311 * or 0. If base is zero, buf will be treated as base ten unless its 00312 * digits are prefixed with '0x', in which case it will be treated as 00313 * base 16. 00314 * @bug *end breaks type safety; where *buf is const, *end needs to be 00315 * declared as const in APR 2.0 00316 */ 00317 APR_DECLARE(apr_status_t) apr_strtoff(apr_off_t *offset, const char *buf, 00318 char **end, int base); 00319 00320 /** 00321 * parse a numeric string into a 64-bit numeric value 00322 * @param buf The string to parse. It may contain optional whitespace, 00323 * followed by an optional '+' (positive, default) or '-' (negative) 00324 * character, followed by an optional '0x' prefix if base is 0 or 16, 00325 * followed by numeric digits appropriate for base. 00326 * @param end A pointer to the end of the valid character in buf. If 00327 * not NULL, it is set to the first invalid character in buf. 00328 * @param base A numeric base in the range between 2 and 36 inclusive, 00329 * or 0. If base is zero, buf will be treated as base ten unless its 00330 * digits are prefixed with '0x', in which case it will be treated as 00331 * base 16. 00332 * @return The numeric value of the string. On overflow, errno is set 00333 * to ERANGE. 00334 */ 00335 APR_DECLARE(apr_int64_t) apr_strtoi64(const char *buf, char **end, int base); 00336 00337 /** 00338 * parse a base-10 numeric string into a 64-bit numeric value. 00339 * Equivalent to apr_strtoi64(buf, (char**)NULL, 10). 00340 * @param buf The string to parse 00341 * @return The numeric value of the string 00342 */ 00343 APR_DECLARE(apr_int64_t) apr_atoi64(const char *buf); 00344 00345 /** 00346 * Format a binary size (magnitiudes are 2^10 rather than 10^3) from an apr_off_t, 00347 * as bytes, K, M, T, etc, to a four character compacted human readable string. 00348 * @param size The size to format 00349 * @param buf The 5 byte text buffer (counting the trailing null) 00350 * @return The buf passed to apr_strfsize() 00351 * @remark All negative sizes report ' - ', apr_strfsize only formats positive values. 00352 */ 00353 APR_DECLARE(char *) apr_strfsize(apr_off_t size, char *buf); 00354 00355 /** @} */ 00356 00357 #ifdef __cplusplus 00358 } 00359 #endif 00360 00361 #endif /* !APR_STRINGS_H */