• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <stdarg.h>
17 #include <stdlib.h>
18 #include <string.h>
19 
20 #include "jerryscript-port.h"
21 #include "jerryscript-port-default.h"
22 #include "jerryscript-debugger.h"
23 
24 #ifndef DISABLE_EXTRA_API
25 
26 /**
27  * Actual log level
28  */
29 static jerry_log_level_t jerry_port_default_log_level = JERRY_LOG_LEVEL_ERROR;
30 
31 #define JERRY_PORT_DEFAULT_LOG_LEVEL jerry_port_default_log_level
32 
33 /**
34  * Get the log level
35  *
36  * @return current log level
37  *
38  * Note:
39  *      This function is only available if the port implementation library is
40  *      compiled without the DISABLE_EXTRA_API macro.
41  */
42 jerry_log_level_t
jerry_port_default_get_log_level(void)43 jerry_port_default_get_log_level (void)
44 {
45   return jerry_port_default_log_level;
46 } /* jerry_port_default_get_log_level */
47 
48 /**
49  * Set the log level
50  *
51  * Note:
52  *      This function is only available if the port implementation library is
53  *      compiled without the DISABLE_EXTRA_API macro.
54  */
55 void
jerry_port_default_set_log_level(jerry_log_level_t level)56 jerry_port_default_set_log_level (jerry_log_level_t level) /**< log level */
57 {
58   jerry_port_default_log_level = level;
59 } /* jerry_port_default_set_log_level */
60 
61 #else /* DISABLE_EXTRA_API */
62 #define JERRY_PORT_DEFAULT_LOG_LEVEL JERRY_LOG_LEVEL_ERROR
63 #endif /* !DISABLE_EXTRA_API */
64 
65 /**
66  * Default implementation of jerry_port_log. Prints log message to the standard
67  * error with 'vfprintf' if message log level is less than or equal to the
68  * current log level.
69  *
70  * If debugger support is enabled, printing happens first to an in-memory buffer,
71  * which is then sent both to the standard error and to the debugger client.
72  *
73  * Note:
74  *      Changing the log level from JERRY_LOG_LEVEL_ERROR is only possible if
75  *      the port implementation library is compiled without the
76  *      DISABLE_EXTRA_API macro.
77  */
78 void
jerry_port_log(jerry_log_level_t level,const char * format,...)79 jerry_port_log (jerry_log_level_t level, /**< message log level */
80                 const char *format, /**< format string */
81                 ...)  /**< parameters */
82 {
83   if (level <= JERRY_PORT_DEFAULT_LOG_LEVEL)
84   {
85     va_list args;
86     va_start (args, format);
87 #if defined (JERRY_DEBUGGER) && (JERRY_DEBUGGER == 1)
88     if (jerry_debugger_is_connected())
89     {
90       int length = vsnprintf (NULL, 0, format, args);
91       va_end (args);
92       va_start (args, format);
93 
94       JERRY_VLA (char, buffer, length + 1);
95       vsnprintf (buffer, (size_t) length + 1, format, args);
96 
97       fprintf (stderr, "[JERRYSCRIPT]%s", buffer);
98       jerry_debugger_send_log (level, (jerry_char_t *) buffer, (jerry_size_t) length);
99     }
100     else
101     {
102       vfprintf (stderr, format, args);
103     }
104 #else /* If jerry-debugger isn't defined, libc is turned on */
105     vfprintf (stderr, format, args);
106 #endif /* defined (JERRY_DEBUGGER) && (JERRY_DEBUGGER == 1) */
107     va_end (args);
108   }
109 } /* jerry_port_log */
110 
111 #if defined (JERRY_DEBUGGER) && (JERRY_DEBUGGER == 1)
112 
113 #define DEBUG_BUFFER_SIZE (256)
114 static char debug_buffer[DEBUG_BUFFER_SIZE];
115 static int debug_buffer_index = 0;
116 
117 #endif /* defined (JERRY_DEBUGGER) && (JERRY_DEBUGGER == 1) */
118 
119 /**
120  * Default implementation of jerry_port_print_char. Uses 'putchar' to
121  * print a single character to standard output.
122  */
123 void
jerry_port_print_char(char c)124 jerry_port_print_char (char c) /**< the character to print */
125 {
126   putchar (c);
127 
128 #if defined (JERRY_DEBUGGER) && (JERRY_DEBUGGER == 1)
129   debug_buffer[debug_buffer_index++] = c;
130 
131   if ((debug_buffer_index == DEBUG_BUFFER_SIZE) || (c == '\n'))
132   {
133     jerry_debugger_send_output ((jerry_char_t *) debug_buffer, (jerry_size_t) debug_buffer_index);
134     debug_buffer_index = 0;
135   }
136 #endif /* defined (JERRY_DEBUGGER) && (JERRY_DEBUGGER == 1) */
137 } /* jerry_port_print_char */
138