diff options
Diffstat (limited to 'contrib/libucl/tests/test_basic.c')
-rw-r--r-- | contrib/libucl/tests/test_basic.c | 208 |
1 files changed, 157 insertions, 51 deletions
diff --git a/contrib/libucl/tests/test_basic.c b/contrib/libucl/tests/test_basic.c index 45a9c8b..b7acc73 100644 --- a/contrib/libucl/tests/test_basic.c +++ b/contrib/libucl/tests/test_basic.c @@ -23,20 +23,27 @@ #include "ucl.h" #include "ucl_internal.h" +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> + int main (int argc, char **argv) { - char *inbuf; + char *inbuf = NULL; struct ucl_parser *parser = NULL, *parser2 = NULL; - ucl_object_t *obj; + ucl_object_t *obj, *comments = NULL; ssize_t bufsize, r; FILE *in, *out; unsigned char *emitted = NULL; const char *fname_in = NULL, *fname_out = NULL; - int ret = 0, opt, json = 0, compact = 0, yaml = 0; + int ret = 0, opt, json = 0, compact = 0, yaml = 0, + save_comments = 0, skip_macro = 0, + flags, fd_out, fd_in, use_fd = 0; + struct ucl_emitter_functions *func; - while ((opt = getopt(argc, argv, "jcy")) != -1) { + while ((opt = getopt(argc, argv, "fjcyCM")) != -1) { switch (opt) { case 'j': json = 1; @@ -44,11 +51,20 @@ main (int argc, char **argv) case 'c': compact = 1; break; + case 'C': + save_comments = 1; + break; case 'y': yaml = 1; break; + case 'M': + skip_macro = true; + break; + case 'f': + use_fd = true; + break; default: /* '?' */ - fprintf (stderr, "Usage: %s [-jcy] [in] [out]\n", + fprintf (stderr, "Usage: %s [-jcy] [-CM] [-f] [in] [out]\n", argv[0]); exit (EXIT_FAILURE); } @@ -67,64 +83,113 @@ main (int argc, char **argv) break; } - if (fname_in != NULL) { - in = fopen (fname_in, "r"); - if (in == NULL) { - exit (-errno); + if (!use_fd) { + if (fname_in != NULL) { + in = fopen (fname_in, "r"); + if (in == NULL) { + exit (-errno); + } + } + else { + in = stdin; } } else { - in = stdin; + if (fname_in != NULL) { + fd_in = open (fname_in, O_RDONLY); + if (fd_in == -1) { + exit (-errno); + } + } + else { + fd_in = STDIN_FILENO; + } } - parser = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE); + + flags = UCL_PARSER_KEY_LOWERCASE; + + if (save_comments) { + flags |= UCL_PARSER_SAVE_COMMENTS; + } + + if (skip_macro) { + flags |= UCL_PARSER_DISABLE_MACRO; + } + + parser = ucl_parser_new (flags); ucl_parser_register_variable (parser, "ABI", "unknown"); if (fname_in != NULL) { ucl_parser_set_filevars (parser, fname_in, true); } - inbuf = malloc (BUFSIZ); - bufsize = BUFSIZ; - r = 0; + if (!use_fd) { + inbuf = malloc (BUFSIZ); + bufsize = BUFSIZ; + r = 0; - while (!feof (in) && !ferror (in)) { - if (r == bufsize) { - inbuf = realloc (inbuf, bufsize * 2); - bufsize *= 2; - if (inbuf == NULL) { - perror ("realloc"); - exit (EXIT_FAILURE); + while (!feof (in) && !ferror (in)) { + if (r == bufsize) { + inbuf = realloc (inbuf, bufsize * 2); + bufsize *= 2; + if (inbuf == NULL) { + perror ("realloc"); + exit (EXIT_FAILURE); + } } + r += fread (inbuf + r, 1, bufsize - r, in); } - r += fread (inbuf + r, 1, bufsize - r, in); - } - if (ferror (in)) { - fprintf (stderr, "Failed to read the input file.\n"); - exit (EXIT_FAILURE); - } + if (ferror (in)) { + fprintf (stderr, "Failed to read the input file.\n"); + exit (EXIT_FAILURE); + } - ucl_parser_add_chunk (parser, (const unsigned char *)inbuf, r); - fclose (in); + ucl_parser_add_chunk (parser, (const unsigned char *)inbuf, r); + fclose (in); + } + else { + ucl_parser_add_fd (parser, fd_in); + close (fd_in); + } - if (fname_out != NULL) { - out = fopen (fname_out, "w"); - if (out == NULL) { - exit (-errno); + if (!use_fd) { + if (fname_out != NULL) { + out = fopen (fname_out, "w"); + if (out == NULL) { + exit (-errno); + } + } + else { + out = stdout; } } else { - out = stdout; + if (fname_out != NULL) { + fd_out = open (fname_out, O_WRONLY | O_CREAT, 00644); + if (fd_out == -1) { + exit (-errno); + } + } + else { + fd_out = STDOUT_FILENO; + } } + if (ucl_parser_get_error (parser) != NULL) { - fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser)); + fprintf (out, "Error occurred (phase 1): %s\n", + ucl_parser_get_error(parser)); ret = 1; goto end; } obj = ucl_parser_get_object (parser); + if (save_comments) { + comments = ucl_object_ref (ucl_parser_get_comments (parser)); + } + if (json) { if (compact) { emitted = ucl_object_emit (obj, UCL_EMIT_JSON_COMPACT); @@ -137,16 +202,27 @@ main (int argc, char **argv) emitted = ucl_object_emit (obj, UCL_EMIT_YAML); } else { - emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG); + emitted = NULL; + func = ucl_object_emit_memory_funcs ((void **)&emitted); + + if (func != NULL) { + ucl_object_emit_full (obj, UCL_EMIT_CONFIG, func, comments); + ucl_object_emit_funcs_free (func); + } } +#if 0 + fprintf (out, "%s\n****\n", emitted); +#endif + ucl_parser_free (parser); ucl_object_unref (obj); - parser2 = ucl_parser_new (UCL_PARSER_KEY_LOWERCASE); + parser2 = ucl_parser_new (flags); ucl_parser_add_string (parser2, (const char *)emitted, 0); if (ucl_parser_get_error(parser2) != NULL) { - fprintf (out, "Error occurred: %s\n", ucl_parser_get_error(parser2)); + fprintf (out, "Error occurred (phase 2): %s\n", + ucl_parser_get_error(parser2)); fprintf (out, "%s\n", emitted); ret = 1; goto end; @@ -155,38 +231,68 @@ main (int argc, char **argv) if (emitted != NULL) { free (emitted); } + if (comments) { + ucl_object_unref (comments); + comments = NULL; + } + + if (save_comments) { + comments = ucl_object_ref (ucl_parser_get_comments (parser2)); + } obj = ucl_parser_get_object (parser2); - if (json) { - if (compact) { - emitted = ucl_object_emit (obj, UCL_EMIT_JSON_COMPACT); + + if (!use_fd) { + func = ucl_object_emit_file_funcs (out); + } + else { + func = ucl_object_emit_fd_funcs (fd_out); + } + + if (func != NULL) { + if (json) { + if (compact) { + ucl_object_emit_full (obj, UCL_EMIT_JSON_COMPACT, + func, comments); + } + else { + ucl_object_emit_full (obj, UCL_EMIT_JSON, + func, comments); + } + } + else if (yaml) { + ucl_object_emit_full (obj, UCL_EMIT_YAML, + func, comments); } else { - emitted = ucl_object_emit (obj, UCL_EMIT_JSON); + ucl_object_emit_full (obj, UCL_EMIT_CONFIG, + func, comments); } + + ucl_object_emit_funcs_free (func); } - else if (yaml) { - emitted = ucl_object_emit (obj, UCL_EMIT_YAML); + + if (!use_fd) { + fprintf (out, "\n"); + fclose (out); } else { - emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG); + write (fd_out, "\n", 1); + close (fd_out); } - fprintf (out, "%s\n", emitted); ucl_object_unref (obj); end: - if (emitted != NULL) { - free (emitted); - } if (parser2 != NULL) { ucl_parser_free (parser2); } + if (comments) { + ucl_object_unref (comments); + } if (inbuf != NULL) { free (inbuf); } - fclose (out); - return ret; } |