Merge template string with one or more parameters.
Syntax:
cPrintf(cTemplate, params..... ) -> cFormatedString
cPrintf( NIL , cFmt , ...params... ) -> see bottom 'Enhancements...'
// Parse some embedded escape sequences in cFmt
Parameters:
<cTemplate>
cTemplate will use the same wildcards as sprintf().
This string contains one or more variables with format
specifications -> Format Specifications.
<params>
follow the rules of nFpCall() so NIL values have special meaning
internally uses sprintf() from the C stdlib so cTemplate will
use the same wildcards as sprintf()
FORMAT SPECIFICATIONS
A format specification, which consists of optional and required fields, has the following form:
%[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}] type
Each field of the format specification is a single character or a number signifying a particular format option.
The simplest format specification contains only the percent sign and a type character (for example, %s).
If a percent sign is followed by a character that has no meaning as a format field, the character is not changed.
For example, to print a percent-sign character, use %%.
The optional fields, which appear before the type character, control other aspects of the formatting, as follows:
type
Required character that determines whether the associated argument
is interpreted as a character, a string, or a number (see the "printf
Type Field Characters" table in printf Type Field Characters).
flags
Optional character or characters that control justification of output
and printing of signs, blanks, decimal points, and octal and hexadecimal
prefixes (see the "Flag Characters" table in Flag Directives).
More than one flag can appear in a format specification.
width
Optional number that specifies the minimum number of characters output
(see printf width specification).
precision
Optional number that specifies the maximum number of characters printed
for all or part of the output field, or the minimum number of digits printed
for integer values (see the "How Precision Values Affect Type" table in Precision Specification).
h| l| ll| I| I32| I64
Optional prefixes to type-that specify the size of argument
(see the "Size Prefixes" table in Size and Distance Specification).
TYPE FIELD CHARACTERS
The type character is the only required format field; it appears after any optional format fields. The type character determines whether the associated argument is interpreted as a character, string, or number. The types C, n, p, and S, and the behavior of c and s with printf functions, are Microsoft extensions and are not ANSI compatible.
c
int or wint_t
When used with printf functions, specifies a single-byte character;
when used with wprintf functions, specifies a wide character.
C
int or wint_t
When used with printf functions, specifies a wide character;
when used with wprintf functions, specifies a single-byte character.
d
int
Signed decimal integer.
i
int
Signed decimal integer.
o
int
Unsigned octal integer.
u
int
Unsigned decimal integer.
x
int
Unsigned hexadecimal integer, using "abcdef."
X
int
Unsigned hexadecimal integer, using "ABCDEF."
e
double
Signed value having the form [-]d.dddd e [sign]dd[d] where d is a single decimal digit, dddd is one or more decimal digits, dd[d] is two or three decimal digits depending on the output format and size of the exponent, and sign is + or -.
E
double
Identical to the e format except that E rather than e introduces the exponent.
f
double
Signed value having the form [-]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.
g
double
Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than -4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.
G
double
Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).
a
double
Signed hexadecimal double precision floating point value having the form
[-]0xh.hhhh p±dd, where h.hhhh are the hex digits (using lower case letters)
of the mantissa, and dd are one or more digits for the exponent.
The precision specifies the number of digits after the point.
A
double
Signed hexadecimal double precision floating point value having the form [-]0Xh.hhhh P±dd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.
n
Pointer to integer
Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument. See Security Note below.
p
Pointer to void
Prints the argument as an address in hexadecimal digits.
s
String
When used with printf functions, specifies a single-byte-character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.
S
String
When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte-character string. Characters are printed up to the first null character or until the precision value is reached.
? cPrintf( "Computer Name : [%s]", cGetComputerName() )
-> Computer Name : [MyPC]
? cPrintf( "My %s is in %s ","home","Germany")
-> My home is in Germany
Enhancement:
starting with 001.005.002.204 cPrintf() function now has no character limit.
Previous versions had a limit of 1024 chars.
starting with 001.005.003.126 cPrintf() function now can parse some embedded escape sequences:
if first parameter is NIL ...
cPrintf( NIL , cFmt , ...params... ) // Parse some embedded escape sequences in cFmt
\xnn // Hex character
\dnnn // dec character // ot4xb extension
\q // Double Quote // ot4xb extension
\a // Bell
\b // Backspace
\f // Formfeed
\n // New line
\r // Carriage return
\t // Horizontal tab
\v // Vertical tab
\\ // Backslash
Some compilers like C provide a literal escape string parsing during the compilation step.
So something like
cVar = "First Line\r\nSecond Line"
is automatically translated to
cVar = "First Line" + Chr(13) + (Chr(10) +"Second Line"
Because this is a compiler task common runtime functions like printf() assume this
transformations are resolved previously by the compiler.
The original ot4xb cPrintf(cFmt,...params... ) syntax does nothing with this escape sequences
just a wrapper for the _sprintf() function of the C runtime
I was decide don't change this behavior because cFmt can come from any source
( literal in the prg , string resource, database, filenames with path, .... ) so any changes in this behavior
will break the existing code.
So I added an alternate syntax cPrintf( , cFmt , ....params.... ) shifting all the arguments 1 position
to got the extended behavior that parse escape sequences embedded in the cFmt string
Example:
? cPrintf( "This is the amp character \x26" )
-> "This is the amp character \x26"
? cPrintf( NIL,"This is the amp character \x26" )
-> "This is the amp character &"
The first syntax will output the string "\x26" untransformed while the second syntax will replace \x26 to &