apreq_util.h revision d5ef50bb5810983012435957be0680bde34d1e44
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke** Licensed to the Apache Software Foundation (ASF) under one or more
9eb6a481980d81a55898ba418fba72fc3c09d8c8Dominik Luecke** contributor license agreements. See the NOTICE file distributed with
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke** this work for additional information regarding copyright ownership.
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu** The ASF licenses this file to You under the Apache License, Version 2.0
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke** (the "License"); you may not use this file except in compliance with
2eeec5240b424984e3ee26296da1eeab6c6d739eChristian Maeder** the License. You may obtain a copy of the License at
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke** Unless required by applicable law or agreed to in writing, software
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder** distributed under the License is distributed on an "AS IS" BASIS,
2af38fde95f93562f2124ec615fba0e509c8202eDominik Luecke** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2af38fde95f93562f2124ec615fba0e509c8202eDominik Luecke** See the License for the specific language governing permissions and
2af38fde95f93562f2124ec615fba0e509c8202eDominik Luecke** limitations under the License.
16e124196c6b204769042028c74f533509c9b5d3Christian Maeder * This header contains useful functions for creating new
16e124196c6b204769042028c74f533509c9b5d3Christian Maeder * parsers, hooks or modules. It includes
16e124196c6b204769042028c74f533509c9b5d3Christian Maeder * - string <-> array converters
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * - substring search functions
16e124196c6b204769042028c74f533509c9b5d3Christian Maeder * - simple encoders & decoders for urlencoded strings
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke * - simple time, date, & file-size converters
fcac596b16bb10f475066c323b9b1ca44db2b755Dominik Luecke * @brief Utility functions for apreq.
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke * @ingroup libapreq2
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke * Join an array of values. The result is an empty string if there are
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke * @param p Pool to allocate return value.
da955132262baab309a50fdffe228c9efe68251dCui Jian * @param sep String that is inserted between the joined values.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param arr Array of apreq_value_t entries.
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke * @param mode Join type- see apreq_join_t.
16e124196c6b204769042028c74f533509c9b5d3Christian Maeder * @return Joined string, or NULL on error
16e124196c6b204769042028c74f533509c9b5d3Christian MaederAPREQ_DECLARE(char *) apreq_join(apr_pool_t *p,
b72a390042c19e630cf221494b60c9df2a60d187Dominik Luecke * Returns offset of match string's location, or -1 if no match is found.
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke * @param hay Location of bytes to scan.
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke * @param hlen Number of bytes available for scanning.
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke * @param ndl Search string
da955132262baab309a50fdffe228c9efe68251dCui Jian * @param nlen Length of search string.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param type Match type.
548f3850942936a8c6021185c8391dfcd3b03018Dominik Luecke * @return Offset of match string, or -1 if no match is found.
548f3850942936a8c6021185c8391dfcd3b03018Dominik LueckeAPREQ_DECLARE(apr_ssize_t) apreq_index(const char* hay, apr_size_t hlen,
548f3850942936a8c6021185c8391dfcd3b03018Dominik Luecke * Places a quoted copy of src into dest. Embedded quotes are escaped with a
5b2e9f4673599e1bc6e18a43ad615da28305b8e1Christian Maeder * backslash ('\').
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke * @param dest Location of quoted copy. Must be large enough to hold the copy
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke * and trailing null byte.
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke * @param src Original string.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param slen Length of original string.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param dest Destination string.
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke * @return length of quoted copy in dest.
a23e572c8f957cc051a1b0831abd6fe9380d45c7Christian MaederAPREQ_DECLARE(apr_size_t) apreq_quote(char *dest, const char *src,
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * Same as apreq_quote() except when src begins and ends in quote marks. In
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * that case it assumes src is quoted correctly, and just copies src to dest.
fcac596b16bb10f475066c323b9b1ca44db2b755Dominik Luecke * @param dest Location of quoted copy. Must be large enough to hold the copy
fcac596b16bb10f475066c323b9b1ca44db2b755Dominik Luecke * and trailing null byte.
0859769b65851f4c06d6d32fac084b0f4db56c94Christian Maeder * @param src Original string.
da955132262baab309a50fdffe228c9efe68251dCui Jian * @param slen Length of original string.
4df63f7187b1ba16cbe5c781db187a42f2f49579Dominik Luecke * @param dest Destination string.
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke * @return length of quoted copy in dest.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian MaederAPREQ_DECLARE(apr_size_t) apreq_quote_once(char *dest, const char *src,
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke * Url-encodes a string.
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke * @param dest Location of url-encoded result string. Caller must ensure it
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke * is large enough to hold the encoded string and trailing '\\0'.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param src Original string.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param slen Length of original string.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @return length of url-encoded string in dest; does not exceed 3 * slen.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian MaederAPREQ_DECLARE(apr_size_t) apreq_encode(char *dest, const char *src,
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * Convert a string from cp1252 to utf8. Caller must ensure it is large enough
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * to hold the encoded string and trailing '\\0'.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param dest Location of utf8-encoded result string. Caller must ensure it
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * is large enough to hold the encoded string and trailing '\\0'.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param src Original string.
a7be28e157e9ceeec73a8fd0e642c36ea29d4218Christian Maeder * @param slen Length of original string.
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * @return length of utf8-encoded string in dest; does not exceed 3 * slen.
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian MaederAPREQ_DECLARE(apr_size_t) apreq_cp1252_to_utf8(char *dest,
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * Heuristically determine the charset of a string.
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * @param src String to scan.
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * @param slen Length of string.
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * @return APREQ_CHARSET_ASCII if the string contains only 7-bit chars;
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * @return APREQ_CHARSET_UTF8 if the string is a valid utf8 byte sequence;
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * @return APREQ_CHARSET_LATIN1 if the string has no control chars;
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * @return APREQ_CHARSET_CP1252 if the string has control chars.
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian MaederAPREQ_DECLARE(apreq_charset_t) apreq_charset_divine(const char *src,
202df46772cac2ee2e8627ba196a5faebb6f9a05Christian Maeder * Url-decodes a string.
static APR_INLINE
char *rv;
return NULL;
return rv;
const char *path);
static APR_INLINE
apr_bucket *e;
e = APR_BUCKET_NEXT(e))
return rv;
return APR_SUCCESS;
static APR_INLINE
apr_bucket *e;
e = APR_BUCKET_NEXT(e))
apr_bucket *c;
return rv;
APR_BRIGADE_INSERT_TAIL(d, c);
return APR_SUCCESS;
static APR_INLINE
apr_bucket *e)
apr_bucket *f;
if (e != APR_BRIGADE_SENTINEL(s)) {
APR_BRIGADE_CONCAT(d, s);
const char *name,
const char **val,
const char *temp_dir,
#ifdef __cplusplus