You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

681 lines
23 KiB

############################################################
# Created: 21st June 2005
# Updated: 10th January 2011
require 'recls' # Download from http://synesis.com.au/software
require 'synsoft/srcutil' # Download from http://synesis.com.au/software
############################################################
# functions
def declare_template_parameter_list(f, i)
if false
f << "template< typename T0" << ENDL
(1 ... i).each do |j|
f << " , typename T#{j}" << ENDL
end
f << " >" << ENDL
else
s = "template<typename T0";
(1 ... i).each do |j|
s = s + ", typename T#{j}"
end
s = s + ">"
f << s << ENDL
end
end # declare_template_parameter_list
def declare_function_parameter_list(f, from, to)
if false
(from ... to - 1).each do |j|
f << " , T#{j} const &v#{j}" << ENDL
end
f << " , T#{to - 1} const &v#{to - 1})" << ENDL
else
s = " "
(from ... to - 1).each do |j|
s = s + ", T#{j} const& v#{j}"
end
s = s + ", T#{to - 1} const& v#{to - 1})"
f << s << ENDL
end
end # declare_function_parameter_list
def round_up(n, granularity)
((n + (granularity - 1)) / granularity) * granularity
end
############################################################
numParams = 32
if ARGV.length > 0
n = Integer(ARGV[0])
if n > 0 && n < 256
numParams = n
end
end
NUM_PARAMS = numParams
PARAM_RANGE = (1 .. NUM_PARAMS)
TAB_SIZE = 1 #4
TAB = " " * TAB_SIZE
SHORT_ARG_LMARGIN = 2
USE_USING_DECLARATION = true
USE_SHIM_PAIR_MACRO = true
USE_SHORT_ARG_LMARGIN = true
INITIALISERS_INLINE = true
#CALL_LMARGIN = " "
#CALL_LMARGIN = " "
CALL_LMARGIN = "#{TAB}#{TAB}"
PARAMS_LIMIT_SYMBOL = "PANTHEIOS_APPL_PARAMS_LIMIT"
SEVERITY_LEVELS = %w{ EMERGENCY ALERT CRITICAL ERROR WARNING NOTICE INFORMATIONAL DEBUG }
############################################################
d = Recls::stat(".")
if d.fileName == "scripts"
d = Recls::stat("../include/pantheios")
end
if !d or d.fileName != "pantheios"
abort "Not running in the correct directory; needs to be /???/include/pantheios"
end
SEP = Recls::pathNameSeparator
ENDL = "\n"
C_LOG_FUNCTIONS_HEADER_NAME = "internal/generated/log_functions.h"
C_LOG_FUNCTIONS_IMPL_NAME = "internal/generated/log_functions.c"
C_LOG_DISPATCH_FUNCTIONS_HEADER_NAME = "internal/generated/log_dispatch_functions.h"
Cpp_LOG_DISPATCH_FUNCTIONS_HEADER_NAME = "internal/generated/log_dispatch_functions.hpp"
Cpp_LOG_FUNCTIONS_HEADER_NAME = "internal/generated/log_functions.hpp"
Cpp_LOG_SEV_FUNCTIONS_HEADER_NAME = "internal/generated/log_sev_functions.hpp"
C_LOG_FUNCTIONS_HEADER = "#{d.path}#{SEP}" + C_LOG_FUNCTIONS_HEADER_NAME.gsub('/', SEP)
C_LOG_FUNCTIONS_IMPL = "#{d.path}#{SEP}" + C_LOG_FUNCTIONS_IMPL_NAME.gsub('/', SEP)
C_LOG_DISPATCH_FUNCTIONS_HEADER = "#{d.path}#{SEP}" + C_LOG_DISPATCH_FUNCTIONS_HEADER_NAME.gsub('/', SEP)
Cpp_LOG_DISPATCH_FUNCTIONS_HEADER = "#{d.path}#{SEP}" + Cpp_LOG_DISPATCH_FUNCTIONS_HEADER_NAME.gsub('/', SEP)
Cpp_LOG_FUNCTIONS_HEADER = "#{d.path}#{SEP}" + Cpp_LOG_FUNCTIONS_HEADER_NAME.gsub('/', SEP)
Cpp_LOG_SEV_FUNCTIONS_HEADER = "#{d.path}#{SEP}" + Cpp_LOG_SEV_FUNCTIONS_HEADER_NAME.gsub('/', SEP)
num_pantheios_log_N_declarations = 0
num_pantheios_log_N_no_test_declarations = 0
num_pantheios_log_N_no_test_definitions = 0
num_pantheios_log_N_definitions = 0
num_log_dispatch_N_definitions = 0
num_log_definitions = 0
num_log_sev_definitions = 0
############################################################
# C_LOG_FUNCTIONS_HEADER_NAME
puts C_LOG_FUNCTIONS_HEADER_NAME
f = File::new(C_LOG_FUNCTIONS_HEADER, "w")
f << "/* /////////////////////////////////////////////////////////////////////////" << "" << ENDL
f << " * File: pantheios/" << C_LOG_FUNCTIONS_HEADER_NAME << "" << ENDL
f << " *" << "" << ENDL
f << " * Purpose: Declarations of the pantheios_log_<N>() functions" << ENDL
f << " *" << "" << ENDL
f << " * Generated: #{SrcUtil::currentDate}" << "" << ENDL
f << " *" << "" << ENDL
f << " * Status: This file is auto-generated: DO NOT EDIT!" << "" << ENDL
f << " *" << "" << ENDL
f << " * Copyright: The copyright restrictions of the Pantheios library," << "" << ENDL
f << " * enumerated in the header file <pantheios/pantheios.h>," << "" << ENDL
f << " * apply to this file" << "" << ENDL
f << " *" << "" << ENDL
f << " * ////////////////////////////////////////////////////////////////////// */" << "" << ENDL
f << "" << ENDL
# f << "/** \\file pantheios/#{C_LOG_FUNCTIONS_HEADER_NAME} [C, C++] INTERNAL, AUTO-GENERATED FILE: Do not include directly */" << ENDL
f << "" << ENDL
f << "#ifndef PANTHEIOS_INCLUDING_C_API_FUNCTIONS" << "" << ENDL
f << "# error This file is included by the Pantheios API, and cannot be included directly" << "" << ENDL
f << "#endif /* !PANTHEIOS_INCLUDING_C_API_FUNCTIONS */" << "" << ENDL
f << "" << ENDL
f << "#define PANTHEIOS_APPL_PARAMS_LIMIT_MAX_GENERATED (#{NUM_PARAMS})" << "" << ENDL
f << "" << ENDL
PARAM_RANGE.each do |i|
sig = "PANTHEIOS_CALL(int) pantheios_log_#{i}("
if USE_SHORT_ARG_LMARGIN
len = SHORT_ARG_LMARGIN
else
len = round_up(sig.length, TAB_SIZE)
end
len0 = len - TAB_SIZE
sig = sig.ljust(len)
plural = (i > 1) ? "s" : ""
# Documentation comment
f << "/** Logs #{i} parameter#{plural}, subject to external (not in \\ref group__core_library) severity-level filtering " << ENDL
f << " * \\ingroup group__application_layer_interface__generated" << ENDL
f << " */" << ENDL
# Function signature
f << "#{sig}pan_sev_t severity" << ENDL
(0 ... i). each do |j|
f << "".ljust(len0) + ", pan_char_t const* p#{j}, int l#{j} /* -1 => 'strlen(p#{j})' */" << ENDL
end
f << ");" << ENDL;
f << "" << ENDL
num_pantheios_log_N_declarations = 1 + num_pantheios_log_N_declarations
end
f.close()
f = nil
############################################################
# C_LOG_FUNCTIONS_IMPL_NAME
puts C_LOG_FUNCTIONS_IMPL_NAME
f = File::new(C_LOG_FUNCTIONS_IMPL, "w")
f << "/* /////////////////////////////////////////////////////////////////////////" << "" << ENDL
f << " * File: pantheios/" << C_LOG_FUNCTIONS_IMPL_NAME << "" << ENDL
f << " *" << "" << ENDL
f << " * Purpose: Definitions of the pantheios_log_<N>() and" << ENDL
f << " * pantheios_log_<N>_no_test() functions" << ENDL
f << " *" << "" << ENDL
f << " * Generated: #{SrcUtil::currentDate}" << "" << ENDL
f << " *" << "" << ENDL
f << " * Status: This file is auto-generated: DO NOT EDIT!" << "" << ENDL
f << " *" << "" << ENDL
f << " * Copyright: The copyright restrictions of the Pantheios library," << "" << ENDL
f << " * enumerated in the header file <pantheios/pantheios.h>," << "" << ENDL
f << " * apply to this file" << "" << ENDL
f << " *" << "" << ENDL
f << " * ////////////////////////////////////////////////////////////////////// */" << "" << ENDL
f << "" << ENDL
# f << "/** \\file pantheios/#{C_LOG_FUNCTIONS_IMPL_NAME} [C++ only] INTERNAL, AUTO-GENERATED FILE: Do not include directly */" << ENDL
f << "" << ENDL
f << "#ifndef __cplusplus" << ENDL
f << "# error This file cannot be used independently, nor as part of a C compilation unit. It should only be included from within pantheios_core.cpp" << ENDL
f << "#endif /* __cplusplus */" << ENDL
f << "" << ENDL
f << "" << ENDL
PARAM_RANGE.each do |i|
sig = "PANTHEIOS_CALL(int) pantheios_log_#{i}_no_test("
if USE_SHORT_ARG_LMARGIN
len = SHORT_ARG_LMARGIN
else
len = round_up(sig.length, TAB_SIZE)
end
len0 = len - TAB_SIZE
sig = sig.ljust(len)
f << "#{sig}pan_sev_t severity" << ENDL
(0 ... i - 1). each do |j|
f << "".ljust(len0) + ", pan_slice_t const& slice#{j}" << ENDL
end
f << "".ljust(len0) + ", pan_slice_t const& slice#{i - 1})" << ENDL
f << "{" << ENDL
f << "#{TAB}const pan_slice_t slices[#{i}] =" << ENDL
f << "#{TAB}{" << ENDL
if INITIALISERS_INLINE
f << "#{TAB}#{TAB}slice0"
(1 ... i). each do |j|
f << ", slice#{j}"
end
f << "" << ENDL
else
f << "#{TAB}#{TAB} slice0" << ENDL
(1 ... i). each do |j|
f << "#{TAB}#{TAB}, slice#{j}" << ENDL
end
end
f << "#{TAB}};" << ENDL
f << "" << ENDL
f << "#{TAB}return pantheios_log_n(severity, STLSOFT_NUM_ELEMENTS(slices), slices);" << ENDL
f << "}" << ENDL
f << "" << ENDL
num_pantheios_log_N_no_test_definitions = 1 + num_pantheios_log_N_no_test_definitions
end
PARAM_RANGE.each do |i|
sig = "PANTHEIOS_CALL(int) pantheios_log_#{i}("
if USE_SHORT_ARG_LMARGIN
len = SHORT_ARG_LMARGIN
else
len = round_up(sig.length, TAB_SIZE)
end
len0 = len - TAB_SIZE
sig = sig.ljust(len)
f << "#{sig}pan_sev_t severity" << ENDL
(0 ... i - 1). each do |j|
f << "".ljust(len0) + ", pan_char_t const* p#{j}, int l#{j}" << ENDL
end
f << "".ljust(len0) + ", pan_char_t const* p#{i - 1}, int l#{i - 1})" << ENDL
f << "{" << ENDL
f << "#{TAB}if(!pantheios_isSeverityLogged(severity))" << ENDL
f << "#{TAB}{" << ENDL
f << "#{TAB}#{TAB}#{TAB}return 0;" << ENDL
f << "#{TAB}}" << ENDL
f << "#{TAB}else" << ENDL
f << "#{TAB}{" << ENDL
f << "#{TAB}#{TAB}const pan_slice_t slices[#{i}] =" << ENDL
f << "#{TAB}#{TAB}{" << ENDL
if INITIALISERS_INLINE
f << "#{TAB}#{TAB}#{TAB}pan_slice_t(l0, p0)"
else
f << "#{TAB}#{TAB}#{TAB}pan_slice_t(l0, p0)" << ENDL
end
(1 ... i). each do |j|
if INITIALISERS_INLINE
f << ", pan_slice_t(l#{j}, p#{j})"
else
f << "#{TAB}#{TAB}#{TAB}, pan_slice_t(l#{j}, p#{j})" << ENDL
end
end
if INITIALISERS_INLINE
f << "" << ENDL
end
f << "#{TAB}#{TAB}};" << ENDL
f << "" << ENDL
f << "#{TAB}#{TAB}return pantheios_log_n(severity, STLSOFT_NUM_ELEMENTS(slices), slices);" << ENDL
f << "#{TAB}}" << ENDL
f << "}" << ENDL
f << "" << ENDL
num_pantheios_log_N_definitions = 1 + num_pantheios_log_N_definitions
end
f.close()
f = nil
############################################################
# C_LOG_DISPATCH_FUNCTIONS_HEADER_NAME
puts C_LOG_DISPATCH_FUNCTIONS_HEADER_NAME
f = File::new(C_LOG_DISPATCH_FUNCTIONS_HEADER, "w")
f << "/* /////////////////////////////////////////////////////////////////////////" << "" << ENDL
f << " * File: pantheios/" << C_LOG_DISPATCH_FUNCTIONS_HEADER_NAME << "" << ENDL
f << " *" << "" << ENDL
f << " * Purpose: Declarations of the pantheios_log_<N>_no_test() functions" << ENDL
f << " *" << "" << ENDL
f << " * Generated: #{SrcUtil::currentDate}" << "" << ENDL
f << " *" << "" << ENDL
f << " * Status: This file is auto-generated: DO NOT EDIT!" << "" << ENDL
f << " *" << "" << ENDL
f << " * Copyright: The copyright restrictions of the Pantheios library," << "" << ENDL
f << " * enumerated in the header file <pantheios/pantheios.h>," << "" << ENDL
f << " * apply to this file" << "" << ENDL
f << " *" << "" << ENDL
f << " * ////////////////////////////////////////////////////////////////////// */" << "" << ENDL
f << "" << ENDL
# f << "/** \\file pantheios/#{C_LOG_DISPATCH_FUNCTIONS_HEADER_NAME} [C, C++] INTERNAL, AUTO-GENERATED FILE: Do not include directly */" << ENDL
f << "" << ENDL
f << "#ifndef PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS" << "" << ENDL
f << "# error This file is included by the Pantheios API, and cannot be included directly" << "" << ENDL
f << "#endif /* !PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS */" << "" << ENDL
f << "" << ENDL
f << "" << ENDL
PARAM_RANGE.each do |i|
sig = "PANTHEIOS_CALL(int) pantheios_log_#{i}_no_test("
if USE_SHORT_ARG_LMARGIN
len = SHORT_ARG_LMARGIN
else
len = round_up(sig.length, TAB_SIZE)
end
len0 = len - TAB_SIZE
sig = sig.ljust(len)
# Template parameter list
# Function signature
f << "#{sig}" << ENDL
f << "".ljust(len0) + " pan_sev_t severity" << ENDL
(0 ... i). each do |j|
f << "".ljust(len0) + ", pan_slice_t const& s#{j}" << ENDL
end
f << ");" << ENDL
f << "" << ENDL
num_pantheios_log_N_no_test_declarations = 1 + num_pantheios_log_N_no_test_declarations
end
f.close()
f = nil
############################################################
# Cpp_LOG_DISPATCH_FUNCTIONS_HEADER_NAME
puts Cpp_LOG_DISPATCH_FUNCTIONS_HEADER_NAME
f = File::new(Cpp_LOG_DISPATCH_FUNCTIONS_HEADER, "w")
f << "/* /////////////////////////////////////////////////////////////////////////" << "" << ENDL
f << " * File: pantheios/" << Cpp_LOG_DISPATCH_FUNCTIONS_HEADER_NAME << "" << ENDL
f << " *" << "" << ENDL
f << " * Purpose: Inline definitions of the log_dispatch_<N>() functions" << ENDL
f << " *" << "" << ENDL
f << " * Generated: #{SrcUtil::currentDate}" << "" << ENDL
f << " *" << "" << ENDL
f << " * Status: This file is auto-generated: DO NOT EDIT!" << "" << ENDL
f << " *" << "" << ENDL
f << " * Copyright: The copyright restrictions of the Pantheios library," << "" << ENDL
f << " * enumerated in the header file <pantheios/pantheios.h>," << "" << ENDL
f << " * apply to this file" << "" << ENDL
f << " *" << "" << ENDL
f << " * ////////////////////////////////////////////////////////////////////// */" << "" << ENDL
f << "" << ENDL
# f << "/** \\file pantheios/#{Cpp_LOG_DISPATCH_FUNCTIONS_HEADER_NAME} [C++ only] INTERNAL, AUTO-GENERATED FILE: Do not include directly */" << ENDL
f << "" << ENDL
f << "#ifndef PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS" << "" << ENDL
f << "# error This file is included by the Pantheios API, and cannot be included directly" << "" << ENDL
f << "#endif /* !PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS */" << "" << ENDL
f << "" << ENDL
f << "" << ENDL
PARAM_RANGE.each do |i|
sig = "inline int log_dispatch_#{i}("
if USE_SHORT_ARG_LMARGIN
len = SHORT_ARG_LMARGIN
else
len = round_up(sig.length, TAB_SIZE)
end
len0 = len - TAB_SIZE
sig = sig.ljust(len)
plural = (i > 1) ? "s" : ""
# Pre-processor limits
f << "#if #{PARAMS_LIMIT_SYMBOL} >= #{i}" << ENDL << ENDL
# Template parameter list
# Function signature
f << "#{sig}pan_sev_t severity" << ENDL
(0 ... i). each do |j|
f << "".ljust(len0) + ", size_t l#{j}, pan_char_t const* p#{j}" << ENDL
end
f << ")" << ENDL
f << "{" << ENDL
stm = " return pantheios_log_#{i}_no_test("
if USE_SHORT_ARG_LMARGIN
len = SHORT_ARG_LMARGIN
else
len = round_up(sig.length, TAB_SIZE)
end
len0 = len - TAB_SIZE
stm = stm.ljust(len)
f << "#{stm}severity" << ENDL
(0 ... i).each do |j|
f << "".ljust(len0) + ", pan_slice_t(p#{j}, l#{j})" << ENDL
end
f << "".ljust(len0) + ");" << ENDL
f << "}" << ENDL
f << "" << ENDL
num_log_dispatch_N_definitions = 1 + num_log_dispatch_N_definitions
end
PARAM_RANGE.each { |i| f << "#endif /* #{PARAMS_LIMIT_SYMBOL} >= #{NUM_PARAMS - i + 1} */" << ENDL }
f.close()
f = nil
############################################################
# Cpp_LOG_FUNCTIONS_HEADER_NAME
puts Cpp_LOG_FUNCTIONS_HEADER_NAME
f = File::new(Cpp_LOG_FUNCTIONS_HEADER, "w")
f << "/* /////////////////////////////////////////////////////////////////////////" << "" << ENDL
f << " * File: pantheios/" << Cpp_LOG_FUNCTIONS_HEADER_NAME << "" << ENDL
f << " *" << "" << ENDL
f << " * Purpose: Definitions of the log() functions" << ENDL
f << " *" << "" << ENDL
f << " * Generated: #{SrcUtil::currentDate}" << "" << ENDL
f << " *" << "" << ENDL
f << " * Status: This file is auto-generated: DO NOT EDIT!" << "" << ENDL
f << " *" << "" << ENDL
f << " * Copyright: The copyright restrictions of the Pantheios library," << "" << ENDL
f << " * enumerated in the header file <pantheios/pantheios.h>," << "" << ENDL
f << " * apply to this file" << "" << ENDL
f << " *" << "" << ENDL
f << " * ////////////////////////////////////////////////////////////////////// */" << "" << ENDL
f << "" << ENDL
# f << "/** \\file pantheios/#{Cpp_LOG_FUNCTIONS_HEADER_NAME} [C++ only] INTERNAL, AUTO-GENERATED FILE: Do not include directly */" << ENDL
f << "" << ENDL
f << "#ifndef PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS" << "" << ENDL
f << "# error This file is included by the Pantheios API, and cannot be included directly" << "" << ENDL
f << "#endif /* !PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS */" << "" << ENDL
f << "" << ENDL
f << "" << ENDL
PARAM_RANGE.each do |i|
plural = (i > 1) ? "s" : ""
# Pre-processor limits
f << "#if #{PARAMS_LIMIT_SYMBOL} >= #{i}" << ENDL << ENDL
# Documentation comment
f << "/** Logs #{i} object#{plural} of arbitrary type, subject to severity-level filtering" << ENDL
f << " * \\ingroup group__application_layer_interface__generated" << ENDL
f << " * \\note The \\c c_str_data_a() and \\c c_str_len_a() string access shims are applied to each parameter, to form a string slice" << ENDL
f << " */" << ENDL
# Template parameter list
declare_template_parameter_list(f, i)
# Function signature
f << "inline int log( pan_sev_t severity" << ENDL
declare_function_parameter_list(f, 0, i)
# Function body
f << "{" << ENDL
# isSeverityLogged() test
f << "#{TAB}if(!pantheios_isSeverityLogged(severity))" << ENDL
f << "#{TAB}{" << ENDL
f << "#{TAB}#{TAB}return 0;" << ENDL
f << "#{TAB}}" << ENDL
f << "#{TAB}else" << ENDL
f << "#{TAB}{" << ENDL
# log_dispatch_N() call
if USE_USING_DECLARATION
f << "#{TAB}#{TAB}PANTHEIOS_DECLARE_SHIM_PAIR_();" << ENDL
f << ENDL
end
f << "#ifndef PANTHEIOS_FORCE_ALLOW_FUNDAMENTAL_ARGUMENTS" << ENDL;
f << "#{TAB}#{TAB}// NOTE: if one of the following lines causes a compile error," << ENDL;
f << "#{TAB}#{TAB}// you have passed a fundamental type to the log() statement." << ENDL;
(0 ... i).each do |j|
f << "#{TAB}#{TAB}PANTHEIOS_VALIDATE_TYPE_NOT_FUNDAMENTAL_(T#{j});" << ENDL;
end
f << "#endif /* PANTHEIOS_FORCE_ALLOW_FUNDAMENTAL_ARGUMENTS */" << ENDL;
f << ENDL
f << "#{TAB}#{TAB}return internal::log_dispatch_#{i}(severity" << ENDL
(0 ... i).each do |j|
if USE_SHIM_PAIR_MACRO
f << "#{CALL_LMARGIN}, PANTHEIOS_INVOKE_SHIM_PAIR_(v#{j})" << ENDL
elsif USE_USING_DECLARATION
f << "#{CALL_LMARGIN}, c_str_len_a(v#{j}), c_str_data_a(v#{j})" << ENDL
else
f << "#{CALL_LMARGIN}, ::stlsoft::c_str_len_a(v#{j}), ::stlsoft::c_str_data_a(v#{j})" << ENDL
end
end
f << "#{TAB}#{TAB});" << ENDL
f << "#{TAB}}" << ENDL
f << "}" << ENDL
f << "" << ENDL
num_log_definitions = 1 + num_log_definitions
end
PARAM_RANGE.each { |i| f << "#endif /* #{PARAMS_LIMIT_SYMBOL} >= #{NUM_PARAMS - i + 1} */" << ENDL }
f.close()
f = nil
############################################################
# Cpp_LOG_SEV_FUNCTIONS_HEADER_NAME
puts Cpp_LOG_SEV_FUNCTIONS_HEADER_NAME
f = File::new(Cpp_LOG_SEV_FUNCTIONS_HEADER, "w")
f << "/* /////////////////////////////////////////////////////////////////////////" << "" << ENDL
f << " * File: pantheios/" << Cpp_LOG_SEV_FUNCTIONS_HEADER_NAME << "" << ENDL
f << " *" << "" << ENDL
f << " * Purpose: Definitions of the log_<LEVEL>() functions" << ENDL
f << " *" << "" << ENDL
f << " * Generated: #{SrcUtil::currentDate}" << "" << ENDL
f << " *" << "" << ENDL
f << " * Status: This file is auto-generated: DO NOT EDIT!" << "" << ENDL
f << " *" << "" << ENDL
f << " * Copyright: The copyright restrictions of the Pantheios library," << "" << ENDL
f << " * enumerated in the header file <pantheios/pantheios.h>," << "" << ENDL
f << " * apply to this file" << "" << ENDL
f << " *" << "" << ENDL
f << " * ////////////////////////////////////////////////////////////////////// */" << "" << ENDL
f << "" << ENDL
# f << "/** \\file pantheios/#{Cpp_LOG_SEV_FUNCTIONS_HEADER_NAME} [C++ only] INTERNAL, AUTO-GENERATED FILE: Do not include directly */" << ENDL
f << "" << ENDL
f << "#ifndef PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS" << "" << ENDL
f << "# error This file is included by the Pantheios API, and cannot be included directly" << "" << ENDL
f << "#endif /* !PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS */" << "" << ENDL
f << "" << ENDL
f << "" << ENDL
SEVERITY_LEVELS.each do |severityLevel|
PARAM_RANGE.each do |i|
plural = (i > 1) ? "s" : ""
# Pre-processor limits
f << "#if #{PARAMS_LIMIT_SYMBOL} >= #{i}" << ENDL << ENDL
# Documentation comment
f << "/** Logs #{i} object#{plural} of arbitrary type, subject to severity-level filtering, at severity level \\link pantheios::SEV_#{severityLevel} #{severityLevel}\\endlink" << ENDL
f << " * \\ingroup group__application_layer_interface__generated" << ENDL
f << " * \\note The \\c c_str_data_a() and \\c c_str_len_a() string access shims are applied to each parameter, to form a string slice" << ENDL
f << " */" << ENDL
# Template parameter list
declare_template_parameter_list(f, i)
# Function signature
if i == 1
f << "inline int log_#{severityLevel}(T0 const& v0)" << ENDL
else
sig = "inline int log_#{severityLevel}("
len = ((sig.length + 3) / TAB_SIZE) * TAB_SIZE
len0 = len - 2
sig = sig.ljust(len)
f << "#{sig}T0 const &v0" << ENDL
declare_function_parameter_list(f, 1, i)
end
# Function body
f << "{" << ENDL
# isSeverityLogged() test
f << "#{TAB}if(!pantheios_isSeverityLogged(PANTHEIOS_SEV_#{severityLevel}))" << ENDL
f << "#{TAB}{" << ENDL
f << "#{TAB}#{TAB}return 0;" << ENDL
f << "#{TAB}}" << ENDL
f << "#{TAB}else" << ENDL
f << "#{TAB}{" << ENDL
# log_dispatch_N() call
if USE_USING_DECLARATION
f << "#{TAB}#{TAB}PANTHEIOS_DECLARE_SHIM_PAIR_();" << ENDL
f << ENDL
end
f << "#ifndef PANTHEIOS_FORCE_ALLOW_FUNDAMENTAL_ARGUMENTS" << ENDL;
f << "#{TAB}#{TAB}// NOTE: if one of the following lines causes a compile error," << ENDL;
f << "#{TAB}#{TAB}// you have passed a fundamental type to the log_#{severityLevel}() statement." << ENDL;
(0 ... i).each do |j|
f << "#{TAB}#{TAB}PANTHEIOS_VALIDATE_TYPE_NOT_FUNDAMENTAL_(T#{j});" << ENDL;
end
f << "#endif /* PANTHEIOS_FORCE_ALLOW_FUNDAMENTAL_ARGUMENTS */" << ENDL;
f << ENDL
f << "#{TAB}#{TAB}return internal::log_dispatch_#{i}(PANTHEIOS_SEV_#{severityLevel}" << ENDL
(0 ... i).each do |j|
if USE_SHIM_PAIR_MACRO
f << "#{CALL_LMARGIN}, PANTHEIOS_INVOKE_SHIM_PAIR_(v#{j})" << ENDL
elsif USE_USING_DECLARATION
f << "#{CALL_LMARGIN}, c_str_len_a(v#{j}), c_str_data_a(v#{j})" << ENDL
else
f << "#{CALL_LMARGIN}, ::stlsoft::c_str_len_a(v#{j}), ::stlsoft::c_str_data_a(v#{j})" << ENDL
end
end
f << "#{TAB}#{TAB});" << ENDL;
f << "#{TAB}}" << ENDL
f << "}" << ENDL
f << "" << ENDL
num_log_sev_definitions = 1 + num_log_sev_definitions
end
PARAM_RANGE.each { |i| f << "#endif /* #{PARAMS_LIMIT_SYMBOL} >= #{NUM_PARAMS - i + 1} */" << ENDL }
f << ENDL;
end
f.close()
f = nil
puts
puts "# of pantheios_log_N() declarations: #{num_pantheios_log_N_declarations}"
puts "# of pantheios_log_N_no_test() declarations: #{num_pantheios_log_N_no_test_declarations}"
puts "# of pantheios_log_N_no_test() definitions: #{num_pantheios_log_N_no_test_definitions}"
puts "# of pantheios_log_N() definitions: #{num_pantheios_log_N_definitions}"
puts "# of log_dispatch_N() definitions: #{num_log_dispatch_N_definitions}"
puts "# of log() definitions: #{num_log_definitions}"
puts "# of log_SEV() definitions: #{num_log_sev_definitions}"
puts "--------------------------------------------"
puts "# of function declarations: #{num_pantheios_log_N_declarations + num_pantheios_log_N_no_test_declarations}"
puts "# of function definitions: #{num_pantheios_log_N_no_test_definitions + num_pantheios_log_N_definitions + num_log_dispatch_N_definitions + num_log_definitions + num_log_sev_definitions}"