Provide additional useful information, such as time stamp.
There is currently no **FLL** wrapper for `strftime()`.
This does require bringing in a new dependency `f_time`.
This is all optional via the `_en_print_time_on_cancel_` and `_en_print_time_on_failure_` defines.
The modes `time` and `individual_time` are used to enable this.
The `time` mode is added by default.
The `f_time` is not a dependency if `time` or `individual_time` modes are not used.
Update the boot strap script to pass `time` and `individual_time` accordingly to just `fake`.
local build_mode_extra_value_1=
local build_mode_extra_param_2=
local build_mode_extra_value_2=
+ local build_mode_extra_param_3=
+ local build_mode_extra_value_3=
+ local build_mode_extra_param_4=
+ local build_mode_extra_value_4=
local shell_command=bash
local exclude_programs=
local fake_programs="fss_read fss_write iki_read iki_write status_code"
build_mode_extra_value_1=
build_mode_extra_param_2=
build_mode_extra_value_2=
+ build_mode_extra_param_3=
+ build_mode_extra_value_3=
+ build_mode_extra_param_4=
+ build_mode_extra_value_4=
if [[ ${1} == "${mode_part}-individual" ]] ; then
build_mode="individual"
build_mode_extra_value_1=${mode_thread_value}
fi
+ if [[ ${mode_part} == "fake" ]] ; then
+ build_mode_extra_param_3="-m"
+ build_mode_extra_value_3="time"
+
+ if [[ ${build_mode} == "individual" ]] ; then
+ build_mode_extra_param_4="-m"
+ build_mode_extra_value_4="individual_time"
+ fi
+ fi
+
${shell_command} build/scripts/package.sh ${verbose} ${color} rebuild ${mode_parameter} ${mode_value} &&
cd package/${mode_path}/${mode_part}-${version}/ &&
${shell_command} ./bootstrap.sh clean ${verbose} ${color} &&
- ${shell_command} ./bootstrap.sh build ${verbose} ${color} ${shared} ${static} -w ${path_work} -m ${build_mode} ${mode_debug_param} ${mode_debug_value} ${build_mode_extra_param_1} ${build_mode_extra_value_1} ${build_mode_extra_param_2} ${build_mode_extra_value_2} ${mode_custom_param} ${mode_custom_value} ${mode_compiler_param} ${mode_compiler_value} &&
+ ${shell_command} ./bootstrap.sh build ${verbose} ${color} ${shared} ${static} -w ${path_work} -m ${build_mode} ${mode_debug_param} ${mode_debug_value} ${build_mode_extra_param_1} ${build_mode_extra_value_1} ${build_mode_extra_param_2} ${build_mode_extra_value_2} ${build_mode_extra_param_3} ${build_mode_extra_value_3} ${build_mode_extra_param_4} ${build_mode_extra_value_4} ${mode_custom_param} ${mode_custom_value} ${mode_compiler_param} ${mode_compiler_value} &&
${shell_command} ./install.sh ${verbose} ${color} ${shared} ${static} -w ${path_work}
build_mode_extra_value_1=
build_mode_extra_param_2=
build_mode_extra_value_2=
+ build_mode_extra_param_3=
+ build_mode_extra_value_3=
+ build_mode_extra_param_4=
+ build_mode_extra_value_4=
if [[ ${1} == "programs-individual" ]] ; then
build_mode="individual"
continue
fi
+ if [[ ${i} == "fake-${version}" ]] ; then
+ build_mode_extra_param_3="-m"
+ build_mode_extra_value_3="time"
+
+ if [[ ${build_mode} == "individual" ]] ; then
+ build_mode_extra_param_4="-m"
+ build_mode_extra_value_4="individual_time"
+ fi
+ else
+ build_mode_extra_param_3=
+ build_mode_extra_value_3=
+ build_mode_extra_param_4=
+ build_mode_extra_value_4=
+ fi
+
cd ${path_original}package/program/${i} &&
${shell_command} ./bootstrap.sh clean ${verbose} ${color} &&
- ${shell_command} ./bootstrap.sh build ${verbose} ${color} ${shared} ${static} -w ${path_work} -m ${build_mode} ${mode_debug_param} ${mode_debug_value} ${build_mode_extra_param_1} ${build_mode_extra_value_1} ${build_mode_extra_param_2} ${build_mode_extra_value_2} ${mode_custom_param} ${mode_custom_value} ${mode_compiler_param} ${mode_compiler_value} &&
+ ${shell_command} ./bootstrap.sh build ${verbose} ${color} ${shared} ${static} -w ${path_work} -m ${build_mode} ${mode_debug_param} ${mode_debug_value} ${build_mode_extra_param_1} ${build_mode_extra_value_1} ${build_mode_extra_param_2} ${build_mode_extra_value_2} ${build_mode_extra_param_3} ${build_mode_extra_value_3} ${build_mode_extra_param_4} ${build_mode_extra_value_4} ${mode_custom_param} ${mode_custom_value} ${mode_compiler_param} ${mode_compiler_value} &&
${shell_command} ./install.sh ${verbose} ${color} ${shared} ${static} -w ${path_work}
if [[ ${i} == "${j}-${version}" ]] ; then
cd ${path_original}package/program/${i} &&
- fake clean make ${verbose} ${color} ${shared} ${static} -w ${path_work} -m ${build_mode} ${mode_debug_param} ${mode_debug_value} ${build_mode_extra_param_1} ${build_mode_extra_value_1} ${build_mode_extra_param_2} ${build_mode_extra_value_2} ${mode_custom_param} ${mode_custom_value} ${mode_compiler_param} ${mode_compiler_value} &&
+ fake clean make ${verbose} ${color} ${shared} ${static} -w ${path_work} -m ${build_mode} ${mode_debug_param} ${mode_debug_value} ${build_mode_extra_param_1} ${build_mode_extra_value_1} ${build_mode_extra_param_2} ${build_mode_extra_value_2} ${build_mode_extra_param_3} ${build_mode_extra_value_3} ${build_mode_extra_param_4} ${build_mode_extra_value_4} ${mode_custom_param} ${mode_custom_value} ${mode_compiler_param} ${mode_compiler_value} &&
${shell_command} ./install.sh ${verbose} ${color} ${shared} ${static} -w ${path_work}
//
// Example:
// echo > /tmp/all.txt
-// for i in f_type f_status f_memory f_type_array f_string f_utf f_abstruse f_account f_capability f_color f_compare f_console f_control_group f_conversion f_directory f_environment f_execute f_file f_fss f_iki f_limit f_network f_parse f_path f_pipe f_print f_rip f_serialize f_signal f_thread ; do grep -horP '\b_di_f_\w*\b' level_0/$i/c >> /tmp/all.txt ; grep -horP '\b_di_macro_\w*\b' level_0/$i/c >> /tmp/all.txt ; done
+// for i in f_type f_status f_memory f_type_array f_string f_utf f_abstruse f_account f_capability f_color f_compare f_console f_control_group f_conversion f_directory f_environment f_execute f_file f_fss f_iki f_limit f_network f_parse f_path f_pipe f_print f_rip f_serialize f_signal f_time f_thread ; do grep -horP '\b_di_f_\w*\b' level_0/$i/c >> /tmp/all.txt ; grep -horP '\b_di_macro_\w*\b' level_0/$i/c >> /tmp/all.txt ; done
// for i in fl_control_group fl_conversion fl_directory fl_environment fl_execute fl_fss fl_iki fl_path fl_print ; do grep -horP '\b_di_fl_\w*\b' level_1/$i/c >> /tmp/all.txt ; grep -horP '\b_di_macro_\w*\b' level_1/$i/c >> /tmp/all.txt ; done
// for i in fll_error fll_execute fll_file fll_fss fll_print fll_program ; do grep -horP '\b_di_fll_\w*\b' level_2/$i/c >> /tmp/all.txt ; grep -horP '\b_di_macro_\w*\b' level_2/$i/c >> /tmp/all.txt ; done
// sort /tmp/all.txt | uniq | sed -e 's|^_|#define &|g' > /tmp/sorted.txt
#define _di_f_thread_spinss_destroy_callback_
#define _di_f_thread_spinss_t_
#define _di_f_thread_unlock_
-#define _di_f_time_part_t_
+#define _di_f_time_calendar_string_
+#define _di_f_time_calendar_string_part_
+#define _di_f_time_clock_get_
+#define _di_f_time_clock_precision_
+#define _di_f_time_clock_set_
+#define _di_f_time_d_
+//#define _di_f_time_epoch_get_
+//#define _di_f_time_local_get_
+#define _di_f_time_of_day_get_
+#define _di_f_time_of_day_set_
+//#define _di_f_time_part_t_
#define _di_f_time_simple_t_
#define _di_f_time_simples_t_
#define _di_f_time_simpless_delete_callback_
#define _di_f_time_simpless_destroy_callback_
#define _di_f_time_simpless_t_
+#define _di_f_time_sleep_spec_
+#define _di_f_time_spec_millisecond_
+#define _di_f_time_spec_nanosecond_
#define _di_f_time_spec_t_
#define _di_f_time_t_
+#define _di_f_time_utc_get_
#define _di_f_time_value_t_
//#define _di_f_type_d_
//#define _di_f_type_file_defaults_d_
settings:
fail exit
- modes android clang coverage debug fanalyzer flex_arrays gcc pinephone test thread threadless
+ modes android clang coverage debug fanalyzer flex_arrays gcc pinephone test thread threadless time
environment PATH LD_LIBRARY_PATH
environment LANG LC_ALL LC_COLLATE LC_CTYPE LC_FASTMSG LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME LOCPATH NLSPATH
# - test: Compile for a test, such as unit testing.
# - thread: Compile with thread support.
# - threadless: Compile without thread support.
+# - time: Support printing time on some cancellations and failures.
#
build_name fake
version_file micro
version_target minor
-modes android clang coverage debug fanalyzer flex_arrays gcc pinephone test thread threadless
-modes_default debug gcc thread
+modes android clang coverage debug fanalyzer flex_arrays gcc pinephone test thread threadless time
+modes_default debug gcc thread time
build_compiler gcc
build_compiler-clang clang
build_sources_program fll/level_0/signal.c
build_sources_program fll/level_0/string.c fll/level_0/private-string.c fll/level_0/string/common.c
build_sources_program fll/level_0/string/dynamic.c fll/level_0/string/dynamics.c fll/level_0/string/dynamicss.c fll/level_0/string/map.c fll/level_0/string/maps.c fll/level_0/string/mapss.c fll/level_0/string/map_multi.c fll/level_0/string/map_multis.c fll/level_0/string/map_multiss.c fll/level_0/string/static.c fll/level_0/string/statics.c fll/level_0/string/staticss.c fll/level_0/string/triple.c fll/level_0/string/triples.c fll/level_0/string/tripless.c
+build_sources_program fll/level_0/time.c
build_sources_program fll/level_0/type_array/cell.c fll/level_0/type_array/date.c fll/level_0/type_array/file.c fll/level_0/type_array/fll_id.c fll/level_0/type_array/int8.c fll/level_0/type_array/int16.c fll/level_0/type_array/int32.c fll/level_0/type_array/int64.c fll/level_0/type_array/int128.c fll/level_0/type_array/number_signed.c fll/level_0/type_array/number_unsigned.c fll/level_0/type_array/poll.c fll/level_0/type_array/quantity.c fll/level_0/type_array/quantitys.c fll/level_0/type_array/quantityss.c fll/level_0/type_array/range.c fll/level_0/type_array/ranges.c fll/level_0/type_array/rangess.c fll/level_0/type_array/state.c fll/level_0/type_array/status.c fll/level_0/type_array/time.c fll/level_0/type_array/uint8.c fll/level_0/type_array/uint16.c fll/level_0/type_array/uint32.c fll/level_0/type_array/uint64.c fll/level_0/type_array/uint128.c
build_sources_program fll/level_0/utf.c fll/level_0/private-utf.c fll/level_0/private-utf_alphabetic.c fll/level_0/private-utf_combining.c fll/level_0/private-utf_control.c fll/level_0/private-utf_digit.c fll/level_0/private-utf_emoji.c fll/level_0/private-utf_numeric.c fll/level_0/private-utf_phonetic.c fll/level_0/private-utf_private.c fll/level_0/private-utf_punctuation.c fll/level_0/private-utf_subscript.c fll/level_0/private-utf_superscript.c fll/level_0/private-utf_symbol.c fll/level_0/private-utf_unassigned.c fll/level_0/private-utf_valid.c fll/level_0/private-utf_whitespace.c fll/level_0/private-utf_wide.c fll/level_0/private-utf_word.c fll/level_0/private-utf_zero_width.c
build_sources_program fll/level_0/utf/common.c fll/level_0/utf/convert.c fll/level_0/utf/dynamic.c fll/level_0/utf/dynamics.c fll/level_0/utf/dynamicss.c fll/level_0/utf/is.c fll/level_0/utf/is_character.c fll/level_0/utf/map.c fll/level_0/utf/maps.c fll/level_0/utf/mapss.c fll/level_0/utf/map_multi.c fll/level_0/utf/map_multis.c fll/level_0/utf/map_multiss.c fll/level_0/utf/static.c fll/level_0/utf/statics.c fll/level_0/utf/staticss.c fll/level_0/utf/string.c fll/level_0/utf/triple.c fll/level_0/utf/triples.c fll/level_0/utf/tripless.c
defines-pinephone -D_di_f_thread_mutex_priority_ceiling_get_ -D_di_f_thread_mutex_priority_ceiling_set_ -D_di_f_thread_mutex_attribute_priority_ceiling_get_ -D_di_f_thread_mutex_attribute_priority_ceiling_set_
defines-thread -D_pthread_attr_unsupported_ -D_pthread_sigqueue_unsupported_
defines-threadless -D_di_thread_support_
+defines-time -D_en_print_time_on_cancel_ -D_en_print_time_on_failure_
flags -O2 -pipe -g -fdiagnostics-color=always -Wno-logical-not-parentheses -Wno-parentheses -Wno-missing-braces -Wno-main
flags -fstack-clash-protection -fno-delete-null-pointer-checks
#include <fll/level_0/print.h>
#include <fll/level_0/rip.h>
#include <fll/level_0/signal.h>
+#include <fll/level_0/time.h>
#ifndef _di_thread_support_
#include <fll/level_0/thread.h>
f_print_dynamic(fake_other_operation_skeleton_s, print->to);
}
- fl_print_format("%]%[' failed.%]%r", print->to, print->notable, print->context, print->context, f_string_eol_s);
+ #ifdef _en_print_time_on_failure_
+ time_t time = 0;
+
+ f_status_t status = f_time_epoch_get(&time);
+
+ if (F_status_is_error_not(status)) {
+ f_time_part_t part = f_time_part_t_initialize;
+
+ status = f_time_local_get(time, &part);
+
+ if (F_status_is_error_not(status)) {
+ char now_string[100];
+ const f_string_static_t now = macro_f_string_static_t_initialize_2(now_string, 100);
+
+ memset(&now_string, 0, now.used);
+
+ strftime(now_string, sizeof(now_string), "%Y-%m-%d %I:%M:%S%P %Z", &part);
+
+ fl_print_format("%]%[' failed at%] ", print->to, print->notable, print->context, print->context);
+ fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, now, print->notable);
+ fl_print_format(f_string_format_sentence_end_single_quote_s.string, print->to, print->context, print->context, f_string_eol_s);
+
+ status = F_okay;
+ }
+ }
+
+ if (F_status_is_error(status)) {
+ fl_print_format("%]%[' failed.%]%r", print->to, print->notable, print->context, print->context, f_string_eol_s);
+ }
+ #else
+ fl_print_format("%]%[' failed.%]%r", print->to, print->notable, print->context, print->context, f_string_eol_s);
+ #endif // _en_print_time_on_failure_
f_file_stream_unlock(print->to);
f_print_dynamic(fake_other_operation_skeleton_s, print->to);
}
- fl_print_format("%]%[' is cancelled.%]%r", print->to, print->notable, print->context, print->context, f_string_eol_s);
+ #ifdef _en_print_time_on_cancel_
+ time_t time = 0;
+
+ f_status_t status = f_time_epoch_get(&time);
+
+ if (F_status_is_error_not(status)) {
+ f_time_part_t part = f_time_part_t_initialize;
+
+ status = f_time_local_get(time, &part);
+
+ if (F_status_is_error_not(status)) {
+ char now_string[100];
+ const f_string_static_t now = macro_f_string_static_t_initialize_2(now_string, 100);
+
+ memset(&now_string, 0, now.used);
+
+ strftime(now_string, sizeof(now_string), "%Y-%m-%d %I:%M:%S%P %Z", &part);
+
+ fl_print_format("%]%[' is cancelled at%] ", print->to, print->notable, print->context, print->context);
+ fl_print_format(f_string_format_Q_single_s.string, print->to, print->notable, now, print->notable);
+ fl_print_format(f_string_format_sentence_end_single_quote_s.string, print->to, print->context, print->context, f_string_eol_s);
+
+ status = F_okay;
+ }
+ }
+
+ if (F_status_is_error(status)) {
+ fl_print_format("%]%[' is cancelled.%]%r", print->to, print->notable, print->context, print->context, f_string_eol_s);
+ }
+ #else
+ fl_print_format("%]%[' is cancelled.%]%r", print->to, print->notable, print->context, print->context, f_string_eol_s);
+ #endif // _en_print_time_on_cancel_
f_file_stream_flush(print->to);
f_file_stream_unlock(print->to);
_di_libcap_ Disable libcap support, allow for compiling and linking without libcap (-lcap).
_di_thread_support_ Disables thread support.
+_en_print_time_on_cancel_ Enables printing time on some cancellations.
+_en_print_time_on_failure_ Enables printing time on some failures.
+
_libcap_legacy_only_ Disable functionality provided by later versions of libcap (2.43 and later).
_pthread_attr_unsupported_ Disable non-portable functionality associated with pthread_attr.
f_rip
f_signal
f_thread
+f_time
fl_control_group
fl_conversion
settings:
fail exit
- modes android clang coverage debug fanalyzer flex_arrays gcc individual individual_thread level monolithic pinephone test thread threadless
+ modes android clang coverage debug fanalyzer flex_arrays gcc individual individual_thread individual_time level monolithic pinephone test thread threadless time
environment PATH LD_LIBRARY_PATH
environment LANG LC_ALL LC_COLLATE LC_CTYPE LC_FASTMSG LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME LOCPATH NLSPATH
# - gcc: Use GCC specific settings.
# - individual: Compile using per project (individual) libraries, does not handle thread or threadless cases.
# - individual_thread: This is required when compiling in individual mode with "thread" mode.
+# - individual_time: This is required when compiling in individual mode with "time" mode.
# - level: Compile using per level libraries.
# - monolithic: Compile using per monolithic libraries.
# - pinephone: Compile on a pinephone system.
# - test: Compile for a test, such as unit testing.
# - thread: Compile with thread support.
# - threadless: Compile without thread support.
+# - time: Support printing time on some cancellations and failures.
#
build_name fake
process_pre process_pre.sh
process_post process_post.sh
-modes android clang coverage debug fanalyzer flex_arrays gcc individual individual_thread level monolithic pinephone test thread threadless
-modes_default debug gcc monolithic thread
+modes android clang coverage debug fanalyzer flex_arrays gcc individual individual_thread individual_time level monolithic pinephone test thread threadless time
+modes_default debug gcc monolithic thread time
build_compiler gcc
build_compiler-clang clang
build_libraries_shared -lc -lcap
build_libraries_shared-individual -lfll_error -lfll_execute -lfll_file -lfll_fss -lfll_print -lfll_program
build_libraries_shared-individual -lfl_control_group -lfl_conversion -lfl_directory -lfl_environment -lfl_fss -lfl_iki -lfl_path -lfl_print
-build_libraries_shared-individual -lf_abstruse -lf_account -lf_capability -lf_color -lf_compare -lf_console -lf_control_group -lf_conversion -lf_directory -lf_environment -lf_execute -lf_file -lf_fss -lf_iki -lf_limit -lf_memory -lf_parse -lf_path -lf_pipe -lf_print -lf_rip -lf_signal -lf_status_string -lf_string -lf_type_array -lf_utf
+build_libraries_shared-individual -lf_abstruse -lf_account -lf_capability -lf_color -lf_compare -lf_console -lf_control_group -lf_conversion -lf_directory -lf_environment -lf_execute -lf_file -lf_fss -lf_iki -lf_limit -lf_memory -lf_parse -lf_path -lf_pipe -lf_print -lf_rip -lf_signal -lf_status_string -lf_string -lf_type_array -lf_utf
+build_libraries_shared-individual_time -lf_time
build_libraries_shared-individual_thread -lf_thread
build_libraries_shared-level -lfll_2 -lfll_1 -lfll_0
build_libraries_shared-monolithic -lfll
build_libraries_static -l:libc.a -l:libcap.a
build_libraries_static-individual -l:libfll_error.a -l:libfll_execute.a -l:libfll_file.a -l:libfll_fss.a -l:libfll_print.a -l:libfll_program.a
build_libraries_static-individual -l:libfl_control_group.a -l:libfl_conversion.a -l:libfl_directory.a -l:libfl_environment.a -l:libfl_fss.a -l:libfl_iki.a -l:libfl_path.a -l:libfl_print.a
-build_libraries_static-individual -l:libf_abstruse.a -l:libf_account.a -l:libf_capability.a -l:libf_color.a -l:libf_compare.a -l:libf_console.a -l:libf_control_group.a -l:libf_conversion.a -l:libf_directory.a -l:libf_environment.a -l:libf_execute.a -l:libf_file.a -l:libf_fss.a -l:libf_iki.a -l:libf_limit.a -l:libf_memory.a -l:libf_parse.a -l:libf_path.a -l:libf_pipe.a -l:libf_print.a -l:libf_rip.a -l:libf_signal.a -l:libf_status_string.a -l:libf_string.a -l:libf_type_array.a -l:libf_utf.a
+build_libraries_static-individual -l:libf_abstruse.a -l:libf_account.a -l:libf_capability.a -l:libf_color.a -l:libf_compare.a -l:libf_console.a -l:libf_control_group.a -l:libf_conversion.a -l:libf_directory.a -l:libf_environment.a -l:libf_execute.a -l:libf_file.a -l:libf_fss.a -l:libf_iki.a -l:libf_limit.a -l:libf_memory.a -l:libf_parse.a -l:libf_path.a -l:libf_pipe.a -l:libf_print.a -l:libf_rip.a -l:libf_signal.a -l:libf_status_string.a -l:libf_string.a -l:libf_type_array.a -l:libf_utf.a
build_libraries_static-individual_thread -l:libf_thread.a
+build_libraries_static-individual_time -l:libf_time.a
build_libraries_static-level -l:libfll_2.a -l:libfll_1.a -l:libfll_0.a
build_libraries_static-monolithic -l:libfll.a
defines-pinephone -D_di_f_thread_mutex_priority_ceiling_get_ -D_di_f_thread_mutex_priority_ceiling_set_ -D_di_f_thread_mutex_attribute_priority_ceiling_get_ -D_di_f_thread_mutex_attribute_priority_ceiling_set_
defines-thread -D_pthread_attr_unsupported_ -D_pthread_sigqueue_unsupported_
defines-threadless -D_di_thread_support_
+defines-time -D_en_print_time_on_cancel_ -D_en_print_time_on_failure_
flags -O2 -pipe -g -fdiagnostics-color=always -Wno-logical-not-parentheses -Wno-parentheses -Wno-missing-braces -Wno-main
flags -fstack-clash-protection -fno-delete-null-pointer-checks