Import libxo-1.4.0:
- Two changes to encoder options: encoder options may use plus or colon, but only one encoder names can be specified as "@name" This results in the syntax: df --libxo @csv:no-header:leafs=name.available-blocks / - If xo_set_program is called before xo_parse_args, honor the requested value - add xo_errorn* function; repair newline-adding-on-xo_error bug - test programs now use fixed name, since linux libtool prefixs "lt-" - Fix "horse butt" comment in source code - update test cases PR: 242686
This commit is contained in:
commit
5c5819b2b6
@ -12,7 +12,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
AC_PREREQ(2.2)
|
AC_PREREQ(2.2)
|
||||||
AC_INIT([libxo], [1.3.1], [phil@juniper.net])
|
AC_INIT([libxo], [1.4.0], [phil@juniper.net])
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign -Wno-portability])
|
AM_INIT_AUTOMAKE([-Wall -Werror foreign -Wno-portability])
|
||||||
|
|
||||||
# Support silent build rules. Requires at least automake-1.11.
|
# Support silent build rules. Requires at least automake-1.11.
|
||||||
|
@ -1204,6 +1204,11 @@ message associated with either *errno* or the *code* parameter::
|
|||||||
xo_err(1, "cannot open file '%s'", filename);
|
xo_err(1, "cannot open file '%s'", filename);
|
||||||
|
|
||||||
.. index:: xo_error
|
.. index:: xo_error
|
||||||
|
.. index:: xo_error_h
|
||||||
|
.. index:: xo_error_hv
|
||||||
|
.. index:: xo_errorn
|
||||||
|
.. index:: xo_errorn_h
|
||||||
|
.. index:: xo_errorn_hv
|
||||||
|
|
||||||
xo_error
|
xo_error
|
||||||
~~~~~~~~
|
~~~~~~~~
|
||||||
@ -1214,6 +1219,50 @@ xo_error
|
|||||||
:type fmt: const char *
|
:type fmt: const char *
|
||||||
:returns: void
|
:returns: void
|
||||||
|
|
||||||
|
.. c:function:: void xo_error_h (xo_handle_t *xop, const char *fmt, ...)
|
||||||
|
|
||||||
|
:param xop: libxo handle pointer
|
||||||
|
:type xop: xo_handle_t *
|
||||||
|
:param fmt: Format string
|
||||||
|
:type fmt: const char *
|
||||||
|
:returns: void
|
||||||
|
|
||||||
|
.. c:function:: void xo_error_hv (xo_handle_t *xop, const char *fmt, va_list vap)
|
||||||
|
|
||||||
|
:param xop: libxo handle pointer
|
||||||
|
:type xop: xo_handle_t *
|
||||||
|
:param fmt: Format string
|
||||||
|
:type fmt: const char *
|
||||||
|
:param vap: variadic arguments
|
||||||
|
:type xop: va_list
|
||||||
|
:returns: void
|
||||||
|
|
||||||
|
.. c:function:: void xo_errorn (const char *fmt, ...)
|
||||||
|
|
||||||
|
:param fmt: Format string
|
||||||
|
:type fmt: const char *
|
||||||
|
:returns: void
|
||||||
|
|
||||||
|
.. c:function:: void xo_errorn_h (xo_handle_t *xop, const char *fmt, ...)
|
||||||
|
|
||||||
|
:param xop: libxo handle pointer
|
||||||
|
:type xop: xo_handle_t *
|
||||||
|
:param fmt: Format string
|
||||||
|
:type fmt: const char *
|
||||||
|
:returns: void
|
||||||
|
|
||||||
|
.. c:function:: void xo_errorn_hv (xo_handle_t *xop, int need_newline, const char *fmt, va_list vap)
|
||||||
|
|
||||||
|
:param xop: libxo handle pointer
|
||||||
|
:type xop: xo_handle_t *
|
||||||
|
:param need_newline: boolean indicating need for trailing newline
|
||||||
|
:type need_newline: int
|
||||||
|
:param fmt: Format string
|
||||||
|
:type fmt: const char *
|
||||||
|
:param vap: variadic arguments
|
||||||
|
:type xop: va_list
|
||||||
|
:returns: void
|
||||||
|
|
||||||
The `xo_error` function can be used for generic errors that should
|
The `xo_error` function can be used for generic errors that should
|
||||||
be reported over the handle, rather than to stderr. The `xo_error`
|
be reported over the handle, rather than to stderr. The `xo_error`
|
||||||
function behaves like `xo_err` for TEXT and HTML output styles, but
|
function behaves like `xo_err` for TEXT and HTML output styles, but
|
||||||
@ -1226,6 +1275,16 @@ xo_error
|
|||||||
JSON::
|
JSON::
|
||||||
"error": { "message": "Does not compute" }
|
"error": { "message": "Does not compute" }
|
||||||
|
|
||||||
|
The `xo_error_h` and `xo_error_hv` add a handle object and a
|
||||||
|
variadic-ized parameter to the signature, respectively.
|
||||||
|
|
||||||
|
The `xo_errorn` function supplies a newline at the end the error
|
||||||
|
message if the format string does not include one. The
|
||||||
|
`xo_errorn_h` and `xo_errorn_hv` functions add a handle object and
|
||||||
|
a variadic-ized parameter to the signature, respectively. The
|
||||||
|
`xo_errorn_hv` function also adds a boolean to indicate the need for
|
||||||
|
a trailing newline.
|
||||||
|
|
||||||
.. index:: xo_no_setlocale
|
.. index:: xo_no_setlocale
|
||||||
.. index:: Locale
|
.. index:: Locale
|
||||||
|
|
||||||
|
@ -26,12 +26,13 @@ example uses the "cbor" encoder, saving the output into a file::
|
|||||||
df --libxo encoder=cbor > df-output.cbor
|
df --libxo encoder=cbor > df-output.cbor
|
||||||
|
|
||||||
Encoders can support specific options that can be accessed by
|
Encoders can support specific options that can be accessed by
|
||||||
following the encoder name with a colon (':') and one of more options,
|
following the encoder name with a colon (':') or a plus sign ('+') and
|
||||||
separated by a plus sign "+"::
|
one of more options, separated by the same character::
|
||||||
|
|
||||||
df --libxo encoder=csv:path=filesystem+leaf=name+no-header
|
df --libxo encoder=csv+path=filesystem+leaf=name+no-header
|
||||||
|
df --libxo encoder=csv:path=filesystem:leaf=name:no-header
|
||||||
|
|
||||||
This example instructs libxo to load the "csv" encoder and pass the
|
These examples instructs libxo to load the "csv" encoder and pass the
|
||||||
following options::
|
following options::
|
||||||
|
|
||||||
path=filesystem
|
path=filesystem
|
||||||
@ -42,6 +43,10 @@ Each of these option is interpreted by the encoder, and all such
|
|||||||
options names and semantics are specific to the particular encoder.
|
options names and semantics are specific to the particular encoder.
|
||||||
Refer to the intended encoder for documentation on its options.
|
Refer to the intended encoder for documentation on its options.
|
||||||
|
|
||||||
|
The string "@" can be used in place of the string "encoder=".
|
||||||
|
|
||||||
|
df --libxo @csv:no-header
|
||||||
|
|
||||||
.. _csv_encoder:
|
.. _csv_encoder:
|
||||||
|
|
||||||
CSV - Comma Separated Values
|
CSV - Comma Separated Values
|
||||||
|
@ -162,3 +162,23 @@ foreground and background output to "yellow", give only the fifth
|
|||||||
mapping, skipping the first four mappings with bare plus signs ("+")::
|
mapping, skipping the first four mappings with bare plus signs ("+")::
|
||||||
|
|
||||||
--libxo colors=++++yellow/yellow
|
--libxo colors=++++yellow/yellow
|
||||||
|
|
||||||
|
Encoders
|
||||||
|
--------
|
||||||
|
|
||||||
|
In addition to the four "built-in" formats, libxo supports an
|
||||||
|
extensible mechanism for adding encoders. These are activated
|
||||||
|
using the "encoder" keyword::
|
||||||
|
|
||||||
|
--libxo encoder=cbor
|
||||||
|
|
||||||
|
The encoder can include encoder-specific options, separated by either
|
||||||
|
colons (":") or plus signs ("+"):
|
||||||
|
|
||||||
|
--libxo encoder=csv+path=filesystem+leaf=name+no-header
|
||||||
|
--libxo encoder=csv:path=filesystem:leaf=name:no-header
|
||||||
|
|
||||||
|
For brevity, the string "@" can be used in place of the string
|
||||||
|
"encoder=".
|
||||||
|
|
||||||
|
df --libxo @csv:no-header
|
||||||
|
@ -41,10 +41,12 @@
|
|||||||
* (double) quote characters.
|
* (double) quote characters.
|
||||||
* - Leading and trialing whitespace require fields be quoted.
|
* - Leading and trialing whitespace require fields be quoted.
|
||||||
*
|
*
|
||||||
* Cheesy, but simple. The RFC also requires MS-DOS end-of-line, which
|
* Cheesy, but simple. The RFC also requires MS-DOS end-of-line,
|
||||||
* we only do with the "dos" option. Strange that we still live in a
|
* which we only do with the "dos" option. Strange that we still live
|
||||||
* DOS-friendly world, but then again, we make spaceships based on the
|
* in a DOS-friendly world, but then again, we make spaceships based
|
||||||
* horse butts (http://www.astrodigital.org/space/stshorse.html).
|
* on the horse butts (http://www.astrodigital.org/space/stshorse.html
|
||||||
|
* though the "built by English expatriates” bit is rubbish; better to
|
||||||
|
* say the first engines used in America were built by Englishmen.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -655,10 +657,12 @@ csv_record_path (xo_handle_t *xop, csv_private_t *csv, const char *path_raw)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Extract the option values. The format is:
|
* Extract the option values. The format is:
|
||||||
* -libxo encoder=csv:kw=val+kw=val+kw=val,pretty,etc
|
* -libxo encoder=csv:kw=val:kw=val:kw=val,pretty
|
||||||
|
* -libxo encoder=csv+kw=val+kw=val+kw=val,pretty
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
csv_options (xo_handle_t *xop, csv_private_t *csv, const char *raw_opts)
|
csv_options (xo_handle_t *xop, csv_private_t *csv,
|
||||||
|
const char *raw_opts, char opts_char)
|
||||||
{
|
{
|
||||||
ssize_t len = strlen(raw_opts);
|
ssize_t len = strlen(raw_opts);
|
||||||
char *options = alloca(len + 1);
|
char *options = alloca(len + 1);
|
||||||
@ -667,7 +671,7 @@ csv_options (xo_handle_t *xop, csv_private_t *csv, const char *raw_opts)
|
|||||||
|
|
||||||
char *cp, *ep, *np, *vp;
|
char *cp, *ep, *np, *vp;
|
||||||
for (cp = options, ep = options + len + 1; cp && cp < ep; cp = np) {
|
for (cp = options, ep = options + len + 1; cp && cp < ep; cp = np) {
|
||||||
np = strchr(cp, '+');
|
np = strchr(cp, opts_char);
|
||||||
if (np)
|
if (np)
|
||||||
*np++ = '\0';
|
*np++ = '\0';
|
||||||
|
|
||||||
@ -761,7 +765,11 @@ csv_handler (XO_ENCODER_HANDLER_ARGS)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case XO_OP_OPTIONS:
|
case XO_OP_OPTIONS:
|
||||||
rc = csv_options(xop, csv, value);
|
rc = csv_options(xop, csv, value, ':');
|
||||||
|
break;
|
||||||
|
|
||||||
|
case XO_OP_OPTIONS_PLUS:
|
||||||
|
rc = csv_options(xop, csv, value, '+');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XO_OP_OPEN_LIST:
|
case XO_OP_OPEN_LIST:
|
||||||
|
@ -2371,6 +2371,25 @@ xo_set_options (xo_handle_t *xop, const char *input)
|
|||||||
if (np)
|
if (np)
|
||||||
*np++ = '\0';
|
*np++ = '\0';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "@foo" is a shorthand for "encoder=foo". This is driven
|
||||||
|
* chiefly by a desire to make pluggable encoders not appear
|
||||||
|
* so distinct from built-in encoders.
|
||||||
|
*/
|
||||||
|
if (*cp == '@') {
|
||||||
|
vp = cp + 1;
|
||||||
|
|
||||||
|
if (*vp == '\0')
|
||||||
|
xo_failure(xop, "missing value for encoder option");
|
||||||
|
else {
|
||||||
|
rc = xo_encoder_init(xop, vp);
|
||||||
|
if (rc)
|
||||||
|
xo_warnx("error initializing encoder: %s", vp);
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
vp = strchr(cp, '=');
|
vp = strchr(cp, '=');
|
||||||
if (vp)
|
if (vp)
|
||||||
*vp++ = '\0';
|
*vp++ = '\0';
|
||||||
@ -8007,7 +8026,7 @@ xo_finish_atexit (void)
|
|||||||
* Generate an error message, such as would be displayed on stderr
|
* Generate an error message, such as would be displayed on stderr
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
xo_error_hv (xo_handle_t *xop, const char *fmt, va_list vap)
|
xo_errorn_hv (xo_handle_t *xop, int need_newline, const char *fmt, va_list vap)
|
||||||
{
|
{
|
||||||
xop = xo_default(xop);
|
xop = xo_default(xop);
|
||||||
|
|
||||||
@ -8015,6 +8034,7 @@ xo_error_hv (xo_handle_t *xop, const char *fmt, va_list vap)
|
|||||||
* If the format string doesn't end with a newline, we pop
|
* If the format string doesn't end with a newline, we pop
|
||||||
* one on ourselves.
|
* one on ourselves.
|
||||||
*/
|
*/
|
||||||
|
if (need_newline) {
|
||||||
ssize_t len = strlen(fmt);
|
ssize_t len = strlen(fmt);
|
||||||
if (len > 0 && fmt[len - 1] != '\n') {
|
if (len > 0 && fmt[len - 1] != '\n') {
|
||||||
char *newfmt = alloca(len + 2);
|
char *newfmt = alloca(len + 2);
|
||||||
@ -8023,6 +8043,7 @@ xo_error_hv (xo_handle_t *xop, const char *fmt, va_list vap)
|
|||||||
newfmt[len + 1] = '\0';
|
newfmt[len + 1] = '\0';
|
||||||
fmt = newfmt;
|
fmt = newfmt;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (xo_style(xop)) {
|
switch (xo_style(xop)) {
|
||||||
case XO_STYLE_TEXT:
|
case XO_STYLE_TEXT:
|
||||||
@ -8069,7 +8090,7 @@ xo_error_h (xo_handle_t *xop, const char *fmt, ...)
|
|||||||
va_list vap;
|
va_list vap;
|
||||||
|
|
||||||
va_start(vap, fmt);
|
va_start(vap, fmt);
|
||||||
xo_error_hv(xop, fmt, vap);
|
xo_errorn_hv(xop, 0, fmt, vap);
|
||||||
va_end(vap);
|
va_end(vap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8082,7 +8103,30 @@ xo_error (const char *fmt, ...)
|
|||||||
va_list vap;
|
va_list vap;
|
||||||
|
|
||||||
va_start(vap, fmt);
|
va_start(vap, fmt);
|
||||||
xo_error_hv(NULL, fmt, vap);
|
xo_errorn_hv(NULL, 0, fmt, vap);
|
||||||
|
va_end(vap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
xo_errorn_h (xo_handle_t *xop, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list vap;
|
||||||
|
|
||||||
|
va_start(vap, fmt);
|
||||||
|
xo_errorn_hv(xop, 1, fmt, vap);
|
||||||
|
va_end(vap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate an error message, such as would be displayed on stderr
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
xo_errorn (const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list vap;
|
||||||
|
|
||||||
|
va_start(vap, fmt);
|
||||||
|
xo_errorn_hv(NULL, 1, fmt, vap);
|
||||||
va_end(vap);
|
va_end(vap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8099,6 +8143,10 @@ xo_parse_args (int argc, char **argv)
|
|||||||
char *cp;
|
char *cp;
|
||||||
int i, save;
|
int i, save;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If xo_set_program has always been called, we honor that value
|
||||||
|
*/
|
||||||
|
if (xo_program == NULL) {
|
||||||
/* Save our program name for xo_err and friends */
|
/* Save our program name for xo_err and friends */
|
||||||
xo_program = argv[0];
|
xo_program = argv[0];
|
||||||
cp = strrchr(xo_program, '/');
|
cp = strrchr(xo_program, '/');
|
||||||
@ -8107,7 +8155,11 @@ xo_parse_args (int argc, char **argv)
|
|||||||
else
|
else
|
||||||
cp = argv[0]; /* Reset to front of string */
|
cp = argv[0]; /* Reset to front of string */
|
||||||
|
|
||||||
/* GNU tools add an annoying ".test" as the program extension; remove it */
|
/*
|
||||||
|
* GNU libtool add an annoying ".test" as the program
|
||||||
|
* extension; we remove it. libtool also adds a "lt-" prefix
|
||||||
|
* that we cannot remove.
|
||||||
|
*/
|
||||||
size_t len = strlen(xo_program);
|
size_t len = strlen(xo_program);
|
||||||
static const char gnu_ext[] = ".test";
|
static const char gnu_ext[] = ".test";
|
||||||
if (len >= sizeof(gnu_ext)) {
|
if (len >= sizeof(gnu_ext)) {
|
||||||
@ -8115,6 +8167,7 @@ xo_parse_args (int argc, char **argv)
|
|||||||
if (xo_streq(cp, gnu_ext))
|
if (xo_streq(cp, gnu_ext))
|
||||||
*cp = '\0';
|
*cp = '\0';
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
xo_handle_t *xop = xo_default(NULL);
|
xo_handle_t *xop = xo_default(NULL);
|
||||||
|
|
||||||
|
@ -389,6 +389,15 @@ xo_error_h (xo_handle_t *xop, const char *fmt, ...);
|
|||||||
void
|
void
|
||||||
xo_error (const char *fmt, ...);
|
xo_error (const char *fmt, ...);
|
||||||
|
|
||||||
|
void
|
||||||
|
xo_errorn_hv (xo_handle_t *xop, int need_newline, const char *fmt, va_list vap);
|
||||||
|
|
||||||
|
void
|
||||||
|
xo_errorn_h (xo_handle_t *xop, const char *fmt, ...);
|
||||||
|
|
||||||
|
void
|
||||||
|
xo_errorn (const char *fmt, ...);
|
||||||
|
|
||||||
xo_ssize_t
|
xo_ssize_t
|
||||||
xo_flush_h (xo_handle_t *xop);
|
xo_flush_h (xo_handle_t *xop);
|
||||||
|
|
||||||
|
@ -290,8 +290,21 @@ xo_encoder_init (xo_handle_t *xop, const char *name)
|
|||||||
{
|
{
|
||||||
xo_encoder_setup();
|
xo_encoder_setup();
|
||||||
|
|
||||||
const char *opts = strchr(name, ':');
|
char opts_char = '\0';
|
||||||
|
const char *col_opts = strchr(name, ':');
|
||||||
|
const char *plus_opts = strchr(name, '+');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the option-separating character (plus or colon) which
|
||||||
|
* appears first in the options string.
|
||||||
|
*/
|
||||||
|
const char *opts = (col_opts == NULL) ? plus_opts
|
||||||
|
: (plus_opts == NULL) ? col_opts
|
||||||
|
: (plus_opts < col_opts) ? plus_opts : col_opts;
|
||||||
|
|
||||||
if (opts) {
|
if (opts) {
|
||||||
|
opts_char = *opts;
|
||||||
|
|
||||||
/* Make a writable copy of the name */
|
/* Make a writable copy of the name */
|
||||||
size_t len = strlen(name);
|
size_t len = strlen(name);
|
||||||
char *copy = alloca(len + 1);
|
char *copy = alloca(len + 1);
|
||||||
@ -329,7 +342,11 @@ xo_encoder_init (xo_handle_t *xop, const char *name)
|
|||||||
|
|
||||||
int rc = xo_encoder_handle(xop, XO_OP_CREATE, name, NULL, 0);
|
int rc = xo_encoder_handle(xop, XO_OP_CREATE, name, NULL, 0);
|
||||||
if (rc == 0 && opts != NULL) {
|
if (rc == 0 && opts != NULL) {
|
||||||
rc = xo_encoder_handle(xop, XO_OP_OPTIONS, name, opts, 0);
|
xo_encoder_op_t op;
|
||||||
|
|
||||||
|
/* Encoder API is limited, so we're stuck with two different options */
|
||||||
|
op = (opts_char == '+') ? XO_OP_OPTIONS_PLUS : XO_OP_OPTIONS;
|
||||||
|
rc = xo_encoder_handle(xop, op, name, opts, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -90,6 +90,7 @@ typedef unsigned xo_encoder_op_t;
|
|||||||
#define XO_OP_ATTRIBUTE 15 /* Attribute name/value */
|
#define XO_OP_ATTRIBUTE 15 /* Attribute name/value */
|
||||||
#define XO_OP_VERSION 16 /* Version string */
|
#define XO_OP_VERSION 16 /* Version string */
|
||||||
#define XO_OP_OPTIONS 17 /* Additional command line options */
|
#define XO_OP_OPTIONS 17 /* Additional command line options */
|
||||||
|
#define XO_OP_OPTIONS_PLUS 18 /* Additional command line options */
|
||||||
|
|
||||||
#define XO_ENCODER_HANDLER_ARGS \
|
#define XO_ENCODER_HANDLER_ARGS \
|
||||||
xo_handle_t *xop __attribute__ ((__unused__)), \
|
xo_handle_t *xop __attribute__ ((__unused__)), \
|
||||||
|
@ -88,7 +88,7 @@ TEST_JIG = \
|
|||||||
|
|
||||||
TEST_JIG2 = \
|
TEST_JIG2 = \
|
||||||
echo "... $$test ... $$fmt ..."; \
|
echo "... $$test ... $$fmt ..."; \
|
||||||
xoopts==warn,encoder=csv$$csv ; \
|
xoopts==warn,$$csv ; \
|
||||||
${TEST_JIG}; true;
|
${TEST_JIG}; true;
|
||||||
|
|
||||||
TEST_FORMATS = T XP JP HP X J H HIPx
|
TEST_FORMATS = T XP JP HP X J H HIPx
|
||||||
@ -111,9 +111,12 @@ test tests: ${bin_PROGRAMS}
|
|||||||
done) \
|
done) \
|
||||||
done)
|
done)
|
||||||
-@ (${TEST_TRACE} test=test_01.c; base=test_01; \
|
-@ (${TEST_TRACE} test=test_01.c; base=test_01; \
|
||||||
( fmt=Ecsv1; csv= ; ${TEST_JIG2} ); \
|
( fmt=Ecsv1; csv=encoder=csv ; \
|
||||||
( fmt=Ecsv2; csv=:path=top/data/item+no-header ; ${TEST_JIG2} ); \
|
${TEST_JIG2} ); \
|
||||||
( fmt=Ecsv3; csv=:path=item+leafs=sku.sold+no-quotes ; ${TEST_JIG2} ); \
|
( fmt=Ecsv2; csv=encoder=csv:path=top/data/item:no-header ; \
|
||||||
|
${TEST_JIG2} ); \
|
||||||
|
( fmt=Ecsv3; csv=@csv:path=item:leafs=sku.sold:no-quotes ; \
|
||||||
|
${TEST_JIG2} ); \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
@ -225,3 +225,18 @@
|
|||||||
<div class="error">Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
<div class="error">Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
<div class="error">err message (1)</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
<div class="error">err message (2)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
<div class="error">err message (1)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
<div class="error">err message (2)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@ -225,3 +225,18 @@
|
|||||||
<div class="error">Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
<div class="error">Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
<div class="error">err message (1)</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
<div class="error">err message (2)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
<div class="error">err message (1)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
<div class="error">err message (2)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@ -1 +1 @@
|
|||||||
{"top": {"data": {"name":"em0","flags":"0x8843","name":"em0","flags":"0x8843","what":"braces","length":"abcdef","fd":-1,"error":"Bad file descriptor","test":"good","fd":-1,"error":"Bad fi","test":"good","lines":20,"words":30,"characters":40, "bytes": [0,1,2,3,4],"mbuf-current":10,"mbuf-cache":20,"mbuf-total":30,"distance":50,"location":"Boston","memory":64,"total":640,"memory":64,"total":640,"ten":10,"eleven":11,"unknown":1010,"unknown":1010,"min":15,"cur":20,"max":125,"min":15,"cur":20,"max":125,"min":15,"cur":20,"max":125,"min":15,"cur":20,"max":125,"val1":21,"val2":58368,"val3":100663296,"val4":44470272,"val5":1342172800, "flag": ["one","two","three"],"works":null,"empty-tag":true,"t1":"1000","t2":"test5000","t3":"ten-longx","t4":"xtest", "__error": {"message":"this is an error"}, "__error": {"message":"two more errors"}, "__warning": {"message":"this is an warning"}, "__warning": {"message":"two more warnings"},"count":10,"test":4, "error": {"message":"Shut 'er down, Clancey! She's a-pumpin' mud! <>!,\"!<>\n"}}}}
|
{"top": {"data": {"name":"em0","flags":"0x8843","name":"em0","flags":"0x8843","what":"braces","length":"abcdef","fd":-1,"error":"Bad file descriptor","test":"good","fd":-1,"error":"Bad fi","test":"good","lines":20,"words":30,"characters":40, "bytes": [0,1,2,3,4],"mbuf-current":10,"mbuf-cache":20,"mbuf-total":30,"distance":50,"location":"Boston","memory":64,"total":640,"memory":64,"total":640,"ten":10,"eleven":11,"unknown":1010,"unknown":1010,"min":15,"cur":20,"max":125,"min":15,"cur":20,"max":125,"min":15,"cur":20,"max":125,"min":15,"cur":20,"max":125,"val1":21,"val2":58368,"val3":100663296,"val4":44470272,"val5":1342172800, "flag": ["one","two","three"],"works":null,"empty-tag":true,"t1":"1000","t2":"test5000","t3":"ten-longx","t4":"xtest", "__error": {"message":"this is an error"}, "__error": {"message":"two more errors"}, "__warning": {"message":"this is an warning"}, "__warning": {"message":"two more warnings"},"count":10,"test":4, "error": {"message":"Shut 'er down, Clancey! She's a-pumpin' mud! <>!,\"!<>\n"}, "error": {"message":"err message (1)"}, "error": {"message":"err message (2)\n"}, "error": {"message":"err message (1)\n"}, "error": {"message":"err message (2)\n"}}}}
|
||||||
|
@ -80,6 +80,18 @@
|
|||||||
"test": 4,
|
"test": 4,
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Shut 'er down, Clancey! She's a-pumpin' mud! <>!,\"!<>\n"
|
"message": "Shut 'er down, Clancey! She's a-pumpin' mud! <>!,\"!<>\n"
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"message": "err message (1)"
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"message": "err message (2)\n"
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"message": "err message (1)\n"
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"message": "err message (2)\n"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,2 +1,5 @@
|
|||||||
test_02: key field emitted after normal value field: 'name'
|
test_02: key field emitted after normal value field: 'name'
|
||||||
Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
||||||
|
err message (1)err message (2)
|
||||||
|
err message (1)
|
||||||
|
err message (2)
|
||||||
|
@ -4,4 +4,7 @@
|
|||||||
</message><length>abcdef</length><fd>-1</fd><error>Bad file descriptor</error><test>good</test><fd>-1</fd><error>Bad fi</error><test>good</test><message>improper use of profanity; ten yard penalty; first down
|
</message><length>abcdef</length><fd>-1</fd><error>Bad file descriptor</error><test>good</test><fd>-1</fd><error>Bad fi</error><test>good</test><message>improper use of profanity; ten yard penalty; first down
|
||||||
</message><lines>20</lines><words>30</words><characters>40</characters><bytes>0</bytes><bytes>1</bytes><bytes>2</bytes><bytes>3</bytes><bytes>4</bytes><mbuf-current>10</mbuf-current><mbuf-cache>20</mbuf-cache><mbuf-total>30</mbuf-total><distance units="miles">50</distance><location>Boston</location><memory units="k">64</memory><total units="kb">640</total><memory units="k">64</memory><total units="kilobytes">640</total><ten>10</ten><eleven>11</eleven><unknown>1010</unknown><unknown>1010</unknown><min>15</min><cur>20</cur><max>125</max><min>15</min><cur>20</cur><max>125</max><min>15</min><cur>20</cur><max>125</max><min>15</min><cur>20</cur><max>125</max><val1>21</val1><val2>58368</val2><val3>100663296</val3><val4>44470272</val4><val5>1342172800</val5><flag>one</flag><flag>two</flag><flag>three</flag><works>null</works><empty-tag></empty-tag><t1>1000</t1><t2>test5000</t2><t3>ten-longx</t3><t4>xtest</t4><__error><message>this is an error</message></__error><__error><message>two more errors</message></__error><__warning><message>this is an warning</message></__warning><__warning><message>two more warnings</message></__warning><count>10</count><test>4</test><message>improper use of profanity; ten yard penalty; first down
|
</message><lines>20</lines><words>30</words><characters>40</characters><bytes>0</bytes><bytes>1</bytes><bytes>2</bytes><bytes>3</bytes><bytes>4</bytes><mbuf-current>10</mbuf-current><mbuf-cache>20</mbuf-cache><mbuf-total>30</mbuf-total><distance units="miles">50</distance><location>Boston</location><memory units="k">64</memory><total units="kb">640</total><memory units="k">64</memory><total units="kilobytes">640</total><ten>10</ten><eleven>11</eleven><unknown>1010</unknown><unknown>1010</unknown><min>15</min><cur>20</cur><max>125</max><min>15</min><cur>20</cur><max>125</max><min>15</min><cur>20</cur><max>125</max><min>15</min><cur>20</cur><max>125</max><val1>21</val1><val2>58368</val2><val3>100663296</val3><val4>44470272</val4><val5>1342172800</val5><flag>one</flag><flag>two</flag><flag>three</flag><works>null</works><empty-tag></empty-tag><t1>1000</t1><t2>test5000</t2><t3>ten-longx</t3><t4>xtest</t4><__error><message>this is an error</message></__error><__error><message>two more errors</message></__error><__warning><message>this is an warning</message></__warning><__warning><message>two more warnings</message></__warning><count>10</count><test>4</test><message>improper use of profanity; ten yard penalty; first down
|
||||||
</message><error><message>Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
</message><error><message>Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
||||||
|
</message></error><error><message>err message (1)</message></error><error><message>err message (2)
|
||||||
|
</message></error><error><message>err message (1)
|
||||||
|
</message></error><error><message>err message (2)
|
||||||
</message></error></data></top>
|
</message></error></data></top>
|
@ -85,6 +85,21 @@
|
|||||||
</message>
|
</message>
|
||||||
<error>
|
<error>
|
||||||
<message>Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
<message>Shut 'er down, Clancey! She's a-pumpin' mud! <>!,"!<>
|
||||||
|
</message>
|
||||||
|
</error>
|
||||||
|
<error>
|
||||||
|
<message>err message (1)</message>
|
||||||
|
</error>
|
||||||
|
<error>
|
||||||
|
<message>err message (2)
|
||||||
|
</message>
|
||||||
|
</error>
|
||||||
|
<error>
|
||||||
|
<message>err message (1)
|
||||||
|
</message>
|
||||||
|
</error>
|
||||||
|
<error>
|
||||||
|
<message>err message (2)
|
||||||
</message>
|
</message>
|
||||||
</error>
|
</error>
|
||||||
</data>
|
</data>
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
xo_set_program("test_02");
|
||||||
|
|
||||||
argc = xo_parse_args(argc, argv);
|
argc = xo_parse_args(argc, argv);
|
||||||
if (argc < 0)
|
if (argc < 0)
|
||||||
return 1;
|
return 1;
|
||||||
@ -144,6 +146,10 @@ main (int argc, char **argv)
|
|||||||
"ten yard penalty", "first down");
|
"ten yard penalty", "first down");
|
||||||
|
|
||||||
xo_error("Shut 'er down, Clancey! She's a-pumpin' mud! <>!,\"!<>\n");
|
xo_error("Shut 'er down, Clancey! She's a-pumpin' mud! <>!,\"!<>\n");
|
||||||
|
xo_error("err message (%d)", 1);
|
||||||
|
xo_error("err message (%d)\n", 2);
|
||||||
|
xo_errorn("err message (%d)", 1);
|
||||||
|
xo_errorn("err message (%d)\n", 2);
|
||||||
|
|
||||||
xo_close_container("data");
|
xo_close_container("data");
|
||||||
|
|
||||||
|
@ -25,6 +25,8 @@ main (int argc, char **argv)
|
|||||||
xo_emit_flags_t flags = XOEF_RETAIN;
|
xo_emit_flags_t flags = XOEF_RETAIN;
|
||||||
int opt_color = 1;
|
int opt_color = 1;
|
||||||
|
|
||||||
|
xo_set_program("test_12");
|
||||||
|
|
||||||
argc = xo_parse_args(argc, argv);
|
argc = xo_parse_args(argc, argv);
|
||||||
if (argc < 0)
|
if (argc < 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -3,10 +3,10 @@
|
|||||||
.Fx
|
.Fx
|
||||||
uses
|
uses
|
||||||
.Nm libxo
|
.Nm libxo
|
||||||
version 1.3.1.
|
version 1.4.0.
|
||||||
Complete documentation can be found on github:
|
Complete documentation can be found on github:
|
||||||
.Bd -literal -offset indent
|
.Bd -literal -offset indent
|
||||||
https://juniper.github.io/libxo/1.3.1/html/index.html
|
https://juniper.github.io/libxo/1.4.0/html/index.html
|
||||||
.Ed
|
.Ed
|
||||||
.Pp
|
.Pp
|
||||||
.Nm libxo
|
.Nm libxo
|
||||||
|
@ -183,16 +183,16 @@
|
|||||||
/* #undef LIBXO_TEXT_ONLY */
|
/* #undef LIBXO_TEXT_ONLY */
|
||||||
|
|
||||||
/* Version number as dotted value */
|
/* Version number as dotted value */
|
||||||
#define LIBXO_VERSION "1.3.1"
|
#define LIBXO_VERSION "1.4.0"
|
||||||
|
|
||||||
/* Version number extra information */
|
/* Version number extra information */
|
||||||
#define LIBXO_VERSION_EXTRA ""
|
#define LIBXO_VERSION_EXTRA ""
|
||||||
|
|
||||||
/* Version number as a number */
|
/* Version number as a number */
|
||||||
#define LIBXO_VERSION_NUMBER 1003001
|
#define LIBXO_VERSION_NUMBER 1004000
|
||||||
|
|
||||||
/* Version number as string */
|
/* Version number as string */
|
||||||
#define LIBXO_VERSION_STRING "1003001"
|
#define LIBXO_VERSION_STRING "1004000"
|
||||||
|
|
||||||
/* Enable local wcwidth implementation */
|
/* Enable local wcwidth implementation */
|
||||||
#define LIBXO_WCWIDTH 1
|
#define LIBXO_WCWIDTH 1
|
||||||
@ -210,7 +210,7 @@
|
|||||||
#define PACKAGE_NAME "libxo"
|
#define PACKAGE_NAME "libxo"
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
/* Define to the full name and version of this package. */
|
||||||
#define PACKAGE_STRING "libxo 1.3.1"
|
#define PACKAGE_STRING "libxo 1.4.0"
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
/* Define to the one symbol short name of this package. */
|
||||||
#define PACKAGE_TARNAME "libxo"
|
#define PACKAGE_TARNAME "libxo"
|
||||||
@ -219,7 +219,7 @@
|
|||||||
#define PACKAGE_URL ""
|
#define PACKAGE_URL ""
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
/* Define to the version of this package. */
|
||||||
#define PACKAGE_VERSION "1.3.1"
|
#define PACKAGE_VERSION "1.4.0"
|
||||||
|
|
||||||
/* If using the C implementation of alloca, define if you know the
|
/* If using the C implementation of alloca, define if you know the
|
||||||
direction of stack growth for your system; otherwise it will be
|
direction of stack growth for your system; otherwise it will be
|
||||||
@ -236,7 +236,7 @@
|
|||||||
/* #undef USE_INT_RETURN_CODES */
|
/* #undef USE_INT_RETURN_CODES */
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "1.3.1"
|
#define VERSION "1.4.0"
|
||||||
|
|
||||||
/* Retain hash bucket size */
|
/* Retain hash bucket size */
|
||||||
/* #undef XO_RETAIN_SIZE */
|
/* #undef XO_RETAIN_SIZE */
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
BASE=/usr/share/libxo
|
BASE=/usr/share/libxo
|
||||||
VERSION=1.3.1
|
VERSION=1.4.0
|
||||||
CMD=cat
|
CMD=cat
|
||||||
DONE=
|
DONE=
|
||||||
WEB=http://juniper.github.io/libxo/${VERSION}/xohtml
|
WEB=http://juniper.github.io/libxo/${VERSION}/xohtml
|
||||||
|
Loading…
Reference in New Issue
Block a user