1c99fb5f9SBaptiste Daroussin /* Copyright (c) 2013, Vsevolod Stakhov
2c99fb5f9SBaptiste Daroussin * All rights reserved.
3c99fb5f9SBaptiste Daroussin *
4c99fb5f9SBaptiste Daroussin * Redistribution and use in source and binary forms, with or without
5c99fb5f9SBaptiste Daroussin * modification, are permitted provided that the following conditions are met:
6c99fb5f9SBaptiste Daroussin * * Redistributions of source code must retain the above copyright
7c99fb5f9SBaptiste Daroussin * notice, this list of conditions and the following disclaimer.
8c99fb5f9SBaptiste Daroussin * * Redistributions in binary form must reproduce the above copyright
9c99fb5f9SBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the
10c99fb5f9SBaptiste Daroussin * documentation and/or other materials provided with the distribution.
11c99fb5f9SBaptiste Daroussin *
12c99fb5f9SBaptiste Daroussin * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
13c99fb5f9SBaptiste Daroussin * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14c99fb5f9SBaptiste Daroussin * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15c99fb5f9SBaptiste Daroussin * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
16c99fb5f9SBaptiste Daroussin * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17c99fb5f9SBaptiste Daroussin * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18c99fb5f9SBaptiste Daroussin * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
19c99fb5f9SBaptiste Daroussin * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20c99fb5f9SBaptiste Daroussin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21c99fb5f9SBaptiste Daroussin * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22c99fb5f9SBaptiste Daroussin */
23c99fb5f9SBaptiste Daroussin
24c99fb5f9SBaptiste Daroussin #include <sys/types.h>
25c99fb5f9SBaptiste Daroussin #include <sys/mman.h>
26c99fb5f9SBaptiste Daroussin #include <sys/stat.h>
27c99fb5f9SBaptiste Daroussin #include <sys/time.h>
28c99fb5f9SBaptiste Daroussin #include <stdio.h>
29c99fb5f9SBaptiste Daroussin #include <errno.h>
30c99fb5f9SBaptiste Daroussin #include <unistd.h>
31c99fb5f9SBaptiste Daroussin #include <fcntl.h>
32c99fb5f9SBaptiste Daroussin #include <time.h>
33c99fb5f9SBaptiste Daroussin
34c99fb5f9SBaptiste Daroussin #ifdef __APPLE__
35*97bd480fSBaptiste Daroussin #ifdef HAVE_MACH_MACH_TIME_H
36c99fb5f9SBaptiste Daroussin #include <mach/mach_time.h>
37c99fb5f9SBaptiste Daroussin #endif
38*97bd480fSBaptiste Daroussin #endif
39c99fb5f9SBaptiste Daroussin
40c99fb5f9SBaptiste Daroussin #include "ucl.h"
41c99fb5f9SBaptiste Daroussin
42c99fb5f9SBaptiste Daroussin static double
get_ticks(void)43c99fb5f9SBaptiste Daroussin get_ticks (void)
44c99fb5f9SBaptiste Daroussin {
45c99fb5f9SBaptiste Daroussin double res;
46c99fb5f9SBaptiste Daroussin
47c99fb5f9SBaptiste Daroussin #ifdef __APPLE__
48c99fb5f9SBaptiste Daroussin res = mach_absolute_time () / 1000000000.;
49c99fb5f9SBaptiste Daroussin #else
50c99fb5f9SBaptiste Daroussin struct timespec ts;
51c99fb5f9SBaptiste Daroussin clock_gettime (CLOCK_MONOTONIC, &ts);
52c99fb5f9SBaptiste Daroussin
53c99fb5f9SBaptiste Daroussin res = (double)ts.tv_sec + ts.tv_nsec / 1000000000.;
54c99fb5f9SBaptiste Daroussin #endif
55c99fb5f9SBaptiste Daroussin
56c99fb5f9SBaptiste Daroussin return res;
57c99fb5f9SBaptiste Daroussin }
58c99fb5f9SBaptiste Daroussin
59c99fb5f9SBaptiste Daroussin int
main(int argc,char ** argv)60c99fb5f9SBaptiste Daroussin main (int argc, char **argv)
61c99fb5f9SBaptiste Daroussin {
62c99fb5f9SBaptiste Daroussin void *map;
63c99fb5f9SBaptiste Daroussin struct ucl_parser *parser;
64c99fb5f9SBaptiste Daroussin ucl_object_t *obj;
65c99fb5f9SBaptiste Daroussin int fin;
66c99fb5f9SBaptiste Daroussin unsigned char *emitted;
67c99fb5f9SBaptiste Daroussin struct stat st;
68c99fb5f9SBaptiste Daroussin const char *fname_in = NULL;
69c99fb5f9SBaptiste Daroussin int ret = 0;
70c99fb5f9SBaptiste Daroussin double start, end, seconds;
71c99fb5f9SBaptiste Daroussin
72c99fb5f9SBaptiste Daroussin switch (argc) {
73c99fb5f9SBaptiste Daroussin case 2:
74c99fb5f9SBaptiste Daroussin fname_in = argv[1];
75c99fb5f9SBaptiste Daroussin break;
76c99fb5f9SBaptiste Daroussin }
77c99fb5f9SBaptiste Daroussin
78c99fb5f9SBaptiste Daroussin fin = open (fname_in, O_RDONLY);
79c99fb5f9SBaptiste Daroussin if (fin == -1) {
80c99fb5f9SBaptiste Daroussin perror ("open failed");
81c99fb5f9SBaptiste Daroussin exit (EXIT_FAILURE);
82c99fb5f9SBaptiste Daroussin }
83c99fb5f9SBaptiste Daroussin parser = ucl_parser_new (UCL_PARSER_ZEROCOPY);
84c99fb5f9SBaptiste Daroussin
85c99fb5f9SBaptiste Daroussin (void)fstat (fin, &st);
86c99fb5f9SBaptiste Daroussin map = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fin, 0);
87c99fb5f9SBaptiste Daroussin if (map == MAP_FAILED) {
88c99fb5f9SBaptiste Daroussin perror ("mmap failed");
89c99fb5f9SBaptiste Daroussin exit (EXIT_FAILURE);
90c99fb5f9SBaptiste Daroussin }
91c99fb5f9SBaptiste Daroussin
92c99fb5f9SBaptiste Daroussin close (fin);
93c99fb5f9SBaptiste Daroussin
94c99fb5f9SBaptiste Daroussin start = get_ticks ();
95c99fb5f9SBaptiste Daroussin ucl_parser_add_chunk (parser, map, st.st_size);
96c99fb5f9SBaptiste Daroussin
97c99fb5f9SBaptiste Daroussin obj = ucl_parser_get_object (parser);
98c99fb5f9SBaptiste Daroussin end = get_ticks ();
99c99fb5f9SBaptiste Daroussin
100c99fb5f9SBaptiste Daroussin seconds = end - start;
101c99fb5f9SBaptiste Daroussin printf ("ucl: parsed input in %.4f seconds\n", seconds);
102c99fb5f9SBaptiste Daroussin if (ucl_parser_get_error(parser)) {
103c99fb5f9SBaptiste Daroussin printf ("Error occurred: %s\n", ucl_parser_get_error(parser));
104c99fb5f9SBaptiste Daroussin ret = 1;
105c99fb5f9SBaptiste Daroussin goto err;
106c99fb5f9SBaptiste Daroussin }
107c99fb5f9SBaptiste Daroussin
108c99fb5f9SBaptiste Daroussin start = get_ticks ();
109c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_CONFIG);
110c99fb5f9SBaptiste Daroussin end = get_ticks ();
111c99fb5f9SBaptiste Daroussin
112c99fb5f9SBaptiste Daroussin seconds = end - start;
113c99fb5f9SBaptiste Daroussin printf ("ucl: emitted config in %.4f seconds\n", seconds);
114c99fb5f9SBaptiste Daroussin
115c99fb5f9SBaptiste Daroussin free (emitted);
116c99fb5f9SBaptiste Daroussin
117c99fb5f9SBaptiste Daroussin start = get_ticks ();
118c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_JSON);
119c99fb5f9SBaptiste Daroussin end = get_ticks ();
120c99fb5f9SBaptiste Daroussin
121c99fb5f9SBaptiste Daroussin seconds = end - start;
122c99fb5f9SBaptiste Daroussin printf ("ucl: emitted json in %.4f seconds\n", seconds);
123c99fb5f9SBaptiste Daroussin
124c99fb5f9SBaptiste Daroussin free (emitted);
125c99fb5f9SBaptiste Daroussin
126c99fb5f9SBaptiste Daroussin start = get_ticks ();
127c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_JSON_COMPACT);
128c99fb5f9SBaptiste Daroussin end = get_ticks ();
129c99fb5f9SBaptiste Daroussin
130c99fb5f9SBaptiste Daroussin seconds = end - start;
131c99fb5f9SBaptiste Daroussin printf ("ucl: emitted compact json in %.4f seconds\n", seconds);
132c99fb5f9SBaptiste Daroussin
133c99fb5f9SBaptiste Daroussin free (emitted);
134c99fb5f9SBaptiste Daroussin
135c99fb5f9SBaptiste Daroussin start = get_ticks ();
136c99fb5f9SBaptiste Daroussin emitted = ucl_object_emit (obj, UCL_EMIT_YAML);
137c99fb5f9SBaptiste Daroussin end = get_ticks ();
138c99fb5f9SBaptiste Daroussin
139c99fb5f9SBaptiste Daroussin seconds = end - start;
140c99fb5f9SBaptiste Daroussin printf ("ucl: emitted yaml in %.4f seconds\n", seconds);
141c99fb5f9SBaptiste Daroussin
142c99fb5f9SBaptiste Daroussin free (emitted);
143c99fb5f9SBaptiste Daroussin
144c99fb5f9SBaptiste Daroussin ucl_parser_free (parser);
145c99fb5f9SBaptiste Daroussin ucl_object_unref (obj);
146c99fb5f9SBaptiste Daroussin
147c99fb5f9SBaptiste Daroussin err:
148c99fb5f9SBaptiste Daroussin munmap (map, st.st_size);
149c99fb5f9SBaptiste Daroussin
150c99fb5f9SBaptiste Daroussin return ret;
151c99fb5f9SBaptiste Daroussin }
152