include/apreq_util.h

Go to the documentation of this file.
00001 /*
00002 **  Licensed to the Apache Software Foundation (ASF) under one or more
00003 ** contributor license agreements.  See the NOTICE file distributed with
00004 ** this work for additional information regarding copyright ownership.
00005 ** The ASF licenses this file to You under the Apache License, Version 2.0
00006 ** (the "License"); you may not use this file except in compliance with
00007 ** the License.  You may obtain a copy of the License at
00008 **
00009 **      http://www.apache.org/licenses/LICENSE-2.0
00010 **
00011 **  Unless required by applicable law or agreed to in writing, software
00012 **  distributed under the License is distributed on an "AS IS" BASIS,
00013 **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014 **  See the License for the specific language governing permissions and
00015 **  limitations under the License.
00016 */
00017 
00018 #ifndef APREQ_UTIL_H
00019 #define APREQ_UTIL_H
00020 
00021 #include "apr_file_io.h"
00022 #include "apr_buckets.h"
00023 #include "apreq.h"
00024 
00025 #ifdef  __cplusplus
00026  extern "C" {
00027 #endif
00028 
00053 APREQ_DECLARE(char *) apreq_join(apr_pool_t *p,
00054                                  const char *sep,
00055                                  const apr_array_header_t *arr,
00056                                  apreq_join_t mode);
00057 
00070 APREQ_DECLARE(apr_ssize_t) apreq_index(const char* hay, apr_size_t hlen,
00071                                        const char* ndl, apr_size_t nlen,
00072                                        const apreq_match_t type);
00073 
00086 APREQ_DECLARE(apr_size_t) apreq_quote(char *dest, const char *src,
00087                                       const apr_size_t slen);
00088 
00102 APREQ_DECLARE(apr_size_t) apreq_quote_once(char *dest, const char *src,
00103                                            const apr_size_t slen);
00104 
00115 APREQ_DECLARE(apr_size_t) apreq_encode(char *dest, const char *src,
00116                                        const apr_size_t slen);
00117 
00129 APREQ_DECLARE(apr_size_t) apreq_cp1252_to_utf8(char *dest,
00130                                                const char *src, apr_size_t slen);
00131 
00143 APREQ_DECLARE(apreq_charset_t) apreq_charset_divine(const char *src,
00144                                                     apr_size_t slen);
00145 
00166 APREQ_DECLARE(apr_status_t) apreq_decode(char *dest, apr_size_t *dlen,
00167                                          const char *src, apr_size_t slen);
00168 
00189 APREQ_DECLARE(apr_status_t) apreq_decodev(char *dest, apr_size_t *dlen,
00190                                           struct iovec *v, int nelts);
00191 
00204 static APR_INLINE
00205 char *apreq_escape(apr_pool_t *p, const char *src, const apr_size_t slen)
00206 {
00207     char *rv;
00208 
00209     if (src == NULL)
00210         return NULL;
00211 
00212     rv = (char *)apr_palloc(p, 3 * slen + 1);
00213     apreq_encode(rv, src, slen);
00214     return rv;
00215 }
00216 
00224 static APR_INLINE apr_ssize_t apreq_unescape(char *str)
00225 {
00226     apr_size_t len;
00227     apr_status_t rv = apreq_decode(str, &len, str, strlen(str));
00228     if (rv == APR_SUCCESS)
00229         return (apr_ssize_t)len;
00230     else
00231         return -1;
00232 }
00233 
00245 APREQ_DECLARE(apr_int64_t) apreq_atoi64f(const char *s);
00246 
00258 APREQ_DECLARE(apr_int64_t) apreq_atoi64t(const char *s);
00259 
00277 APREQ_DECLARE(apr_status_t) apreq_brigade_fwrite(apr_file_t *f,
00278                                                  apr_off_t *wlen,
00279                                                  apr_bucket_brigade *bb);
00296 APREQ_DECLARE(apr_status_t) apreq_file_mktemp(apr_file_t **fp,
00297                                               apr_pool_t *pool,
00298                                               const char *path);
00299 
00309 static APR_INLINE
00310 apr_status_t apreq_brigade_setaside(apr_bucket_brigade *bb, apr_pool_t *p)
00311 {
00312     apr_bucket *e;
00313     for (e = APR_BRIGADE_FIRST(bb); e != APR_BRIGADE_SENTINEL(bb);
00314          e = APR_BUCKET_NEXT(e))
00315     {
00316         apr_status_t rv = apr_bucket_setaside(e, p);
00317         if (rv != APR_SUCCESS)
00318             return rv;
00319     }
00320     return APR_SUCCESS;
00321 }
00322 
00323 
00336 static APR_INLINE
00337 apr_status_t apreq_brigade_copy(apr_bucket_brigade *d, apr_bucket_brigade *s) {
00338     apr_bucket *e;
00339     for (e = APR_BRIGADE_FIRST(s); e != APR_BRIGADE_SENTINEL(s);
00340          e = APR_BUCKET_NEXT(e))
00341     {
00342         apr_bucket *c;
00343         apr_status_t rv = apr_bucket_copy(e, &c);
00344         if (rv != APR_SUCCESS)
00345             return rv;
00346 
00347         APR_BRIGADE_INSERT_TAIL(d, c);
00348     }
00349     return APR_SUCCESS;
00350 }
00351 
00363 static APR_INLINE
00364 void apreq_brigade_move(apr_bucket_brigade *d, apr_bucket_brigade *s,
00365                         apr_bucket *e)
00366 {
00367     apr_bucket *f;
00368 
00369     if (e != APR_BRIGADE_SENTINEL(s)) {
00370         f = APR_RING_FIRST(&s->list);
00371         if (f == e) /* zero buckets to be moved */
00372             return;
00373 
00374         /* obtain the last bucket to be moved */
00375         e = APR_RING_PREV(e, link);
00376 
00377         APR_RING_UNSPLICE(f, e, link);
00378         APR_RING_SPLICE_HEAD(&d->list, f, e, apr_bucket, link);
00379     }
00380     else {
00381         APR_BRIGADE_CONCAT(d, s);
00382     }
00383 }
00384 
00385 
00399 APREQ_DECLARE(apr_status_t) apreq_header_attribute(const char *hdr,
00400                                                    const char *name,
00401                                                    const apr_size_t nlen,
00402                                                    const char **val,
00403                                                    apr_size_t *vlen);
00404 
00405 
00423 APREQ_DECLARE(apr_status_t) apreq_brigade_concat(apr_pool_t *pool,
00424                                                  const char *temp_dir,
00425                                                  apr_size_t brigade_limit,
00426                                                  apr_bucket_brigade *out,
00427                                                  apr_bucket_brigade *in);
00428 
00437 APREQ_DECLARE(apr_file_t *)apreq_brigade_spoolfile(apr_bucket_brigade *bb);
00438 
00439 #ifdef __cplusplus
00440  }
00441 #endif
00442 
00443 #endif /* APREQ_UTIL_H */