34 if (!xctx->flags_is_mutable_copy ||
41 xctx->flags_count = count;
42 xctx->flags_is_mutable_copy =
true;
49 impl_set_applicable_flags(
83 impl_flag_add_included_by(
99 already_included =
false;
102 &iterator, &data_type, (
const void **)&flag_id, xctx);
105 already_included =
true;
120 if (!already_included) {
147 memcpy(new_applicable,
163 &iterator, &data_type, (
const void **)&flag_id, xctx);
169 impl_flag_add_included_by(included_by, parent, xctx);
187 if (!internal_env->default_flag_ids)
return;
194 for (flag_id = internal_env->default_flag_ids; *flag_id; flag_id++) {
195 impl_set_applicable_flags(*flag_id,
true,
false, flags, flags_count,
212 afw_flag_internal_early_register_core(
afw_xctx_t *xctx)
218 &afw_s_a_flag_unspecified,
219 &afw_s_a_flag_unspecified_brief,
220 &afw_s_a_flag_unspecified_description,
226 &afw_s_a_flag_debug_detail,
227 &afw_s_a_flag_debug_detail_brief,
228 &afw_s_a_flag_debug_detail_description,
235 &afw_s_a_flag_debug_brief,
236 &afw_s_a_flag_debug_description,
237 &afw_s_a_flag_debug_detail,
240 #ifdef AFW_LOCK_DEBUG
243 &afw_s_a_flag_debug_lock,
244 &afw_s_a_flag_debug_lock_brief,
245 &afw_s_a_flag_debug_lock_description,
250 #ifdef AFW_POOL_DEBUG
253 &afw_s_a_flag_debug_pool_detail,
254 &afw_s_a_flag_debug_pool_detail_brief,
255 &afw_s_a_flag_debug_pool_detail_description,
256 &afw_s_a_flag_debug_detail,
260 &afw_s_a_flag_debug_pool_detail,
265 &afw_s_a_flag_debug_pool,
266 &afw_s_a_flag_debug_pool_brief,
267 &afw_s_a_flag_debug_pool_description,
271 &afw_s_a_flag_debug_pool,
272 &afw_s_a_flag_debug_detail,
276 &afw_s_a_flag_debug_pool,
282 &afw_s_a_flag_debug_function_active_detail,
283 &afw_s_a_flag_debug_function_active_detail_brief,
284 &afw_s_a_flag_debug_function_active_detail_description,
285 &afw_s_a_flag_debug_detail,
289 &afw_s_a_flag_debug_function_active_detail,
294 &afw_s_a_flag_debug_function_active,
295 &afw_s_a_flag_debug_function_active_brief,
296 &afw_s_a_flag_debug_function_active_description,
300 &afw_s_a_flag_debug_function_active,
301 &afw_s_a_flag_debug_detail,
304 &afw_s_a_flag_debug_function_active,
305 &afw_s_a_flag_debug_function_active_detail,
309 &afw_s_a_flag_debug_function_active,
314 &afw_s_a_flag_response_error,
315 &afw_s_a_flag_response_error_brief,
316 &afw_s_a_flag_response_error_description,
322 &afw_s_a_flag_response_error_backtrace,
323 &afw_s_a_flag_response_error_backtrace_brief,
324 &afw_s_a_flag_response_error_backtrace_description,
325 &afw_s_a_flag_response_error,
329 &afw_s_a_flag_response_error_backtrace,
334 &afw_s_a_flag_response_error_backtraceEvaluation,
335 &afw_s_a_flag_response_error_backtraceEvaluation_brief,
336 &afw_s_a_flag_response_error_backtraceEvaluation_description,
337 &afw_s_a_flag_response_error,
341 &afw_s_a_flag_response_error_backtraceEvaluation,
346 &afw_s_a_flag_response_error_contextual,
347 &afw_s_a_flag_response_error_contextual_brief,
348 &afw_s_a_flag_response_error_contextual_description,
349 &afw_s_a_flag_response_error,
353 &afw_s_a_flag_response_error_contextual,
358 &afw_s_a_flag_response_error_hasAdditionalDetail,
359 &afw_s_a_flag_response_error_hasAdditionalDetail_brief,
360 &afw_s_a_flag_response_error_hasAdditionalDetail_description,
361 &afw_s_a_flag_response_error,
365 &afw_s_a_flag_response_error_hasAdditionalDetail,
368 &afw_s_a_flag_response_error_hasAdditionalDetail,
369 &afw_s_a_flag_response_error_backtrace,
372 &afw_s_a_flag_response_error_hasAdditionalDetail,
373 &afw_s_a_flag_response_error_backtraceEvaluation,
376 &afw_s_a_flag_response_error_hasAdditionalDetail,
377 &afw_s_a_flag_response_error_contextual,
382 &afw_s_a_flag_response_console,
383 &afw_s_a_flag_response_console_brief,
384 &afw_s_a_flag_response_console_description,
388 &afw_s_a_flag_response_console_stream,
389 &afw_s_a_flag_response_console_stream_brief,
390 &afw_s_a_flag_response_console_stream_description,
394 &afw_s_a_flag_response_console,
395 &afw_s_a_flag_response_console_stream,
399 &afw_s_a_flag_response_stderr,
400 &afw_s_a_flag_response_stderr_brief,
401 &afw_s_a_flag_response_stderr_description,
405 &afw_s_a_flag_response_stderr_stream,
406 &afw_s_a_flag_response_stderr_stream_brief,
407 &afw_s_a_flag_response_stderr_stream_description,
411 &afw_s_a_flag_response_stderr,
412 &afw_s_a_flag_response_stderr_stream,
416 &afw_s_a_flag_response_stdout,
417 &afw_s_a_flag_response_stdout_brief,
418 &afw_s_a_flag_response_stdout_description,
422 &afw_s_a_flag_response_stdout_stream,
423 &afw_s_a_flag_response_stdout_stream_brief,
424 &afw_s_a_flag_response_stdout_stream_description,
428 &afw_s_a_flag_response_stdout,
429 &afw_s_a_flag_response_stdout_stream,
435 &afw_s_a_flag_trace_detail,
436 &afw_s_a_flag_trace_detail_brief,
437 &afw_s_a_flag_trace_detail_description,
444 &afw_s_a_flag_trace_brief,
445 &afw_s_a_flag_trace_description,
446 &afw_s_a_flag_trace_detail,
451 &afw_s_a_flag_trace_adaptor_detail,
452 &afw_s_a_flag_trace_adaptor_detail_brief,
453 &afw_s_a_flag_trace_adaptor_detail_description,
454 &afw_s_a_flag_trace_detail,
459 &afw_s_a_flag_trace_adaptor,
460 &afw_s_a_flag_trace_adaptor_brief,
461 &afw_s_a_flag_trace_adaptor_description,
465 &afw_s_a_flag_trace_adaptor,
466 &afw_s_a_flag_trace_adaptor_detail,
471 &afw_s_a_flag_trace_authorizationHandler_detail,
472 &afw_s_a_flag_trace_authorizationHandler_detail_brief,
473 &afw_s_a_flag_trace_authorizationHandler_detail_description,
474 &afw_s_a_flag_trace_detail,
479 &afw_s_a_flag_trace_authorizationHandler,
480 &afw_s_a_flag_trace_authorizationHandler_brief,
481 &afw_s_a_flag_trace_authorizationHandler_description,
485 &afw_s_a_flag_trace_authorizationHandler,
486 &afw_s_a_flag_trace_authorizationHandler_detail,
491 &afw_s_a_flag_trace_evaluation_detail,
492 &afw_s_a_flag_trace_evaluation_detail_brief,
493 &afw_s_a_flag_trace_evaluation_detail_description,
494 &afw_s_a_flag_trace_detail,
498 &afw_s_a_flag_trace_evaluation_detail,
503 &afw_s_a_flag_trace_request_detail,
504 &afw_s_a_flag_trace_request_detail_brief,
505 &afw_s_a_flag_trace_request_detail_description,
506 &afw_s_a_flag_trace_detail,
510 &afw_s_a_flag_trace_request_detail,
515 &afw_s_a_flag_trace_request,
516 &afw_s_a_flag_trace_request_brief,
517 &afw_s_a_flag_trace_request_description,
521 &afw_s_a_flag_trace_request,
522 &afw_s_a_flag_trace_request_detail,
526 &afw_s_a_flag_trace_request,
539 ? xctx->env->flag_by_index[flag_index]
605 self->flag_id = flag_id;
608 self->description = description;
610 &afw_s__AdaptiveFlag_, self->flag_id,
self, p, xctx);
620 if (flags_count_allocated == 0) {
621 flags_count_allocated = AFW_FLAG_INITIAL_ALLOCATED_COUNT;
624 flags_count_allocated = flags_count_allocated * 2;
636 flags_count_allocated *
sizeof(
afw_flag_t **), xctx);
645 internal_env->base_xctx->flags =
647 internal_env->base_xctx->flags_count =
653 self->applicable_flags_count_allocated = flags_count_allocated;
655 ((
afw_boolean_t *)self->applicable_flags)[
self->flag_index] =
true;
658 afw_environemnt_registry_type_flag, flag_id,
self, xctx);
663 if (included_by_flag_id) {
665 afw_environemnt_registry_type_flag,
666 included_by_flag_id, xctx);
674 impl_flag_add_included_by(
self, included_by, xctx);
679 impl_refresh_default_flags(xctx);
699 if (!flag || !included_by) {
701 "Both flag_id and included_by_flag_id must already be registered",
706 impl_flag_add_included_by(flag, included_by, xctx);
733 if (internal_env->default_flag_ids) {
734 for (
id = (
const afw_utf8_t **)internal_env->default_flag_ids;
741 if (!internal_env->default_flag_ids || !*
id) {
746 if (internal_env->default_flag_ids) {
747 for (
id = (
const afw_utf8_t **)internal_env->default_flag_ids;
756 internal_env->default_flag_ids = new_ids;
757 if (internal_env->default_flags_ids_p) {
760 internal_env->default_flags_ids_p = new_p;
765 else if (internal_env->default_flag_ids && *
id) {
771 impl_refresh_default_flags(xctx);
789 impl_insure_flags_mutable(xctx);
790 impl_set_applicable_flags(flag_id, set_to,
true,
805 flags_count = xctx->env->flags_count_allocated;
807 memcpy(flags, (
void *)xctx->env->default_flags,
810 xctx->flags_count = flags_count;
811 xctx->flags_is_mutable_copy =
true;
813 for (flag_id = flag_ids; *flag_id; flag_id++) {
814 impl_set_applicable_flags(*flag_id,
true,
true,
815 flags, flags_count, xctx);
844 for (
id = ids;;
id++) {
846 &iterator, &data_type, (
const void **)&s, xctx);
850 "Default flagIds most all be strings", xctx);
855 internal_env->default_flag_ids = ids;
856 if (internal_env->default_flags_ids_p) {
859 internal_env->default_flags_ids_p = p;
860 impl_refresh_default_flags(xctx);
AFW_DEFINE(const afw_object_t *)
#define AFW_DEFINE_INTERNAL(type)
Define an internal function for /src/afw/ source*.c files.
#define AFW_DECLARE(type)
Declare a public afw function.
Adaptive Framework Core Internal.
afw_value_create_list(const afw_list_t *internal, const afw_pool_t *p, afw_xctx_t *xctx)
Create function for unmanaged data type list value.
afw_value_create_object(const afw_object_t *internal, const afw_pool_t *p, afw_xctx_t *xctx)
Create function for unmanaged data type object value.
afw_value_create_string(const afw_utf8_t *internal, const afw_pool_t *p, afw_xctx_t *xctx)
Create function for unmanaged data type string value.
afw_data_type_string
Data type struct for string.
#define afw_data_type_is_string(A_DATA_TYPE)
Macro to determine if data type is string.
#define AFW_UTF8_FMT_ARG(A_STRING)
Convenience Macro for use with AFW_UTF8_FMT to specify arg.
struct afw_iterator_s afw_iterator_t
#define AFW_UTF8_FMT
Format string specifier used for afw_utf8_t.
apr_size_t afw_size_t
size_t.
afw_environment_registry_register(int type_number, const afw_utf8_t *key, const void *value, afw_xctx_t *xctx)
Register a value by key for a registry type.
const afw_flag_t * afw_environment_get_flag(const afw_utf8_t *flag_id, afw_xctx_t *xctx)
Get the flag instance associated with flag_id.
afw_environment_registry_get(int type_number, const afw_utf8_t *key, afw_xctx_t *xctx)
Get the value associated with a key for a registry type.
#define AFW_THROW_ERROR_FZ(code, xctx, format_z,...)
Macro used to set error and 0 rv in xctx and throw it.
#define AFW_THROW_ERROR_Z(code, message_z, xctx)
Macro used to set error and 0 rv in xctx and throw it.
afw_boolean_t afw_flag_by_id_is_active(const afw_utf8_t *flag_id, afw_xctx_t *xctx)
Determine if flag for flag id is set in xctx.
afw_flag_set_default(const afw_utf8_t *flag_id, afw_boolean_t set_to, afw_xctx_t *xctx)
Set the default value of a flag.
#define afw_flag_is_active(flag_index, xctx)
Determine if flag for flag index is set in xctx.
afw_flag_set_to_defaults_plus_array(const afw_utf8_t *const *flag_ids, afw_xctx_t *xctx)
Set xctx default flags plus one or more additional flags.
afw_flag_get_by_index(afw_size_t flag_index, afw_xctx_t *xctx)
Get flag by index.
afw_flag_set_default_flag_ids(const afw_list_t *default_flag_ids, afw_xctx_t *xctx)
Set a new default flags list.
afw_flag_set(const afw_utf8_t *flag_id, afw_boolean_t set_to, afw_xctx_t *xctx)
Set a flag in xctx.
void afw_flag_environment_register_flag(const afw_utf8_t *flag_id, const afw_utf8_t *brief, const afw_utf8_t *description, const afw_utf8_t *included_by_flag_id, afw_xctx_t *xctx)
Register a flag definition.
afw_flag_get_index(const afw_utf8_t *flag_id, afw_xctx_t *xctx)
Get the flag index for a flag id.
void afw_flag_add_included_by(const afw_utf8_t *flag_id, const afw_utf8_t *included_by_flag_id, afw_xctx_t *xctx)
Add another include_by flag to a registered flag.
#define afw_list_get_next_internal(instance, iterator, data_type, internal, xctx)
Call method get_next_internal of interface afw_list.
#define afw_list_get_count(instance, xctx)
Call method get_count of interface afw_list.
afw_list_add_value(const afw_list_t *instance, const afw_value_t *value, afw_xctx_t *xctx)
Call method add_value of interface afw_list_setter.
#define afw_list_of_create(data_type, p, xctx)
Create an list of a specific data type in memory.
#define AFW_LOCK_BEGIN(instance)
Macro to begin a lock section.
#define AFW_LOCK_END
Macro to end a lock section.
#define afw_pool_destroy(instance, xctx)
Call method destroy of interface afw_pool.
#define afw_pool_malloc(instance, size, xctx)
Call method malloc of interface afw_pool.
#define afw_pool_calloc(instance, size, xctx)
Call method calloc of interface afw_pool.
#define afw_pool_calloc_type(instance, type, xctx)
Macro to allocate cleared memory to hold type in pool.
const afw_pool_t * afw_pool_create(const afw_pool_t *parent, afw_xctx_t *xctx)
Create a new pool.
afw_runtime_object_create_indirect(const afw_utf8_t *object_type_id, const afw_utf8_t *object_id, void *internal, const afw_pool_t *p, afw_xctx_t *xctx)
Create an indirect runtime object.
afw_runtime_env_set_object(const afw_object_t *object, afw_boolean_t overwrite, afw_xctx_t *xctx)
Set an object pointer in the environment's runtime objects.
afw_boolean_t afw_utf8_equal(const afw_utf8_t *s1, const afw_utf8_t *s2)
Check to see if a string equals another string.
const afw_utf8_t * afw_utf8_clone(const afw_utf8_t *string, const afw_pool_t *p, afw_xctx_t *xctx)
Clone a utf-8 string into a specific pool.
#define afw_xctx_malloc(size, xctx)
Macro to allocate uncleared memory in xctx's pool.
Interface afw_data_type public struct.
Struct for typedef afw_environment_t defined in afw_common.h.
AFW_ATOMIC const afw_boolean_t * default_flags
Default flags array indexed by flag_index.
afw_size_t flag_index_trace_request_detail
Flag index of trace:request:detail.
AFW_ATOMIC afw_size_t flags_count_allocated
The number of flags allocated in global_flags.
afw_size_t flag_index_debug_pool
Flag index of debug:pool.
afw_size_t flag_index_response_error_hasAdditionalDetail
Flag index of response:error:hasAdditionalDetail.
afw_size_t flag_index_response_error_contextual
Flag index of response:error:contextual.
afw_size_t flag_index_debug_function_active_detail
Flag index of debug:function_active:detail.
afw_size_t flag_index_trace_evaluation_detail
Flag index of trace:evaluation:detail.
const afw_pool_t * p
Pool used to hold environment.
afw_size_t flag_index_response_error_backtraceEvaluation
Flag index of response:error:backtraceEvaluation.
afw_size_t flag_index_debug_function_active
Flag index of debug:function_active.
const afw_lock_t * flags_lock
Lock for protecting changes to flags (internal to afw_flag.c).
const afw_flag_t *AFW_ATOMIC const * flag_by_index
Flag struct indexed by flag_index.
afw_size_t flag_index_debug_pool_detail
Flag index of debug:pool:detail.
afw_size_t flag_index_response_error_backtrace
Flag index of response:error:backtrace.
AFW_ATOMIC afw_size_t flags_count_registered
The number of flags registered.
afw_size_t flag_index_trace_request
Flag index of trace:request.
Struct used for a registered flag.
const afw_value_list_t * included_by_value
list value of all flags that include this flag.
const afw_value_t * flag_id_value
sting value of objectId of this flag.
const afw_boolean_t * applicable_flags
Applicable flags indexed by associated flag_index.
const afw_utf8_t * flag_id
objectId of this flag.
afw_size_t flag_index
Index of this flag in flags array.
const afw_value_list_t * includes_value
list value of all other flags this flag includes.
afw_size_t applicable_flags_count_allocated
Count of applicable_flags.
Interface afw_list public struct.
Interface afw_pool public struct.
NFC normalized UTF-8 string.
struct for data type list values.
Interface afw_xctx public struct.