1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef APR_OPTIONAL_H 18#define APR_OPTIONAL_H 19 20#include "apu.h" 21/** 22 * @file apr_optional.h 23 * @brief APR-UTIL registration of functions exported by modules 24 */ 25#ifdef __cplusplus 26extern "C" { 27#endif 28 29/** 30 * @defgroup APR_Util_Opt Optional Functions 31 * @ingroup APR_Util 32 * 33 * Typesafe registration and retrieval of functions that may not be present 34 * (i.e. functions exported by optional modules) 35 * @{ 36 */ 37 38/** 39 * The type of an optional function. 40 * @param name The name of the function 41 */ 42#define APR_OPTIONAL_FN_TYPE(name) apr_OFN_##name##_t 43 44/** 45 * Declare an optional function. 46 * @param ret The return type of the function 47 * @param name The name of the function 48 * @param args The function arguments (including brackets) 49 */ 50#define APR_DECLARE_OPTIONAL_FN(ret,name,args) \ 51typedef ret (APR_OPTIONAL_FN_TYPE(name)) args 52 53/** 54 * XXX: This doesn't belong here, then! 55 * Private function! DO NOT USE! 56 * @internal 57 */ 58 59typedef void (apr_opt_fn_t)(void); 60/** @internal */ 61APU_DECLARE_NONSTD(void) apr_dynamic_fn_register(const char *szName, 62 apr_opt_fn_t *pfn); 63 64/** 65 * Register an optional function. This can be later retrieved, type-safely, by 66 * name. Like all global functions, the name must be unique. Note that, 67 * confusingly but correctly, the function itself can be static! 68 * @param name The name of the function 69 */ 70#define APR_REGISTER_OPTIONAL_FN(name) do { \ 71 APR_OPTIONAL_FN_TYPE(name) *apu__opt = name; \ 72 apr_dynamic_fn_register(#name,(apr_opt_fn_t *)apu__opt); \ 73} while (0) 74 75/** @internal 76 * Private function! DO NOT USE! 77 */ 78APU_DECLARE(apr_opt_fn_t *) apr_dynamic_fn_retrieve(const char *szName); 79 80/** 81 * Retrieve an optional function. Returns NULL if the function is not present. 82 * @param name The name of the function 83 */ 84#define APR_RETRIEVE_OPTIONAL_FN(name) \ 85 (APR_OPTIONAL_FN_TYPE(name) *)apr_dynamic_fn_retrieve(#name) 86 87/** @} */ 88#ifdef __cplusplus 89} 90#endif 91 92#endif /* APR_OPTIONAL_H */ 93