1/* Copyright JS Foundation and other contributors, http://js.foundation
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <stdlib.h>
17#include <string.h>
18
19#include "jerryscript.h"
20#include "jerryscript-port.h"
21
22/**
23 * Maximum size of source code / snapshots buffer
24 */
25#define JERRY_BUFFER_SIZE (1048576)
26
27/**
28 * Standalone Jerry exit codes
29 */
30#define JERRY_STANDALONE_EXIT_CODE_OK   (0)
31#define JERRY_STANDALONE_EXIT_CODE_FAIL (1)
32
33static uint8_t buffer[ JERRY_BUFFER_SIZE ];
34
35static const uint8_t *
36read_file (const char *file_name,
37           size_t *out_size_p)
38{
39  FILE *file = fopen (file_name, "rb");
40  if (file == NULL)
41  {
42    jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: failed to open file: %s\n", file_name);
43    return NULL;
44  }
45
46  size_t bytes_read = fread (buffer, 1u, sizeof (buffer), file);
47  if (!bytes_read)
48  {
49    jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: failed to read file: %s\n", file_name);
50    fclose (file);
51    return NULL;
52  }
53
54  fclose (file);
55
56  *out_size_p = bytes_read;
57  return (const uint8_t *) buffer;
58} /* read_file */
59
60static void
61print_help (char *name)
62{
63  printf ("Usage: %s [OPTION]... [FILE]...\n"
64          "\n"
65          "Options:\n"
66          "  -h, --help\n"
67          "\n",
68          name);
69} /* print_help */
70
71int
72main (int argc,
73      char **argv)
74{
75  union
76  {
77    double d;
78    unsigned u;
79  } now = { .d = jerry_port_get_current_time () };
80  srand (now.u);
81  if (argc <= 1 || (argc == 2 && (!strcmp ("-h", argv[1]) || !strcmp ("--help", argv[1]))))
82  {
83    print_help (argv[0]);
84    return JERRY_STANDALONE_EXIT_CODE_OK;
85  }
86
87  jerry_init (JERRY_INIT_EMPTY);
88  jerry_value_t ret_value = jerry_create_undefined ();
89
90  for (int i = 1; i < argc; i++)
91  {
92    const char *file_name = argv[i];
93    size_t source_size;
94
95    const jerry_char_t *source_p = read_file (file_name, &source_size);
96
97    if (source_p == NULL)
98    {
99      ret_value = jerry_create_error (JERRY_ERROR_COMMON, (jerry_char_t *) "");
100      break;
101    }
102    else
103    {
104      ret_value = jerry_parse (NULL, 0, source_p, source_size, JERRY_PARSE_NO_OPTS);
105
106      if (!jerry_value_is_error (ret_value))
107      {
108        jerry_value_t func_val = ret_value;
109        ret_value = jerry_run (func_val);
110        jerry_release_value (func_val);
111      }
112    }
113
114    if (jerry_value_is_error (ret_value))
115    {
116      break;
117    }
118
119    jerry_release_value (ret_value);
120    ret_value = jerry_create_undefined ();
121  }
122
123  int ret_code = JERRY_STANDALONE_EXIT_CODE_OK;
124
125  if (jerry_value_is_error (ret_value))
126  {
127    jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Unhandled exception: Script Error!\n");
128    ret_code = JERRY_STANDALONE_EXIT_CODE_FAIL;
129  }
130
131  jerry_release_value (ret_value);
132  jerry_cleanup ();
133
134  return ret_code;
135} /* main */
136