OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. | |
3 * Use of this source code is governed by a BSD-style license that can be | |
4 * found in the LICENSE file. | |
5 */ | |
6 | |
7 #include <stdarg.h> | |
8 #include <stdlib.h> | |
9 #include <string.h> | |
10 | |
11 #include "native_client/src/trusted/plugin/utility.h" | |
12 | |
13 namespace plugin { | |
14 | |
15 int gNaClPluginDebugPrintEnabled = -1; | |
16 FILE* gNaClPluginLogFile = NULL; | |
17 | |
18 /* | |
19 * Prints formatted message to the log. | |
20 */ | |
21 int NaClPluginPrintLog(const char *format, ...) { | |
22 if (NULL == gNaClPluginLogFile) { | |
23 return 0; | |
24 } | |
25 va_list arg; | |
26 int done; | |
27 va_start(arg, format); | |
28 done = vfprintf(gNaClPluginLogFile, format, arg); | |
29 va_end(arg); | |
30 fflush(gNaClPluginLogFile); | |
31 return done; | |
32 } | |
33 | |
34 /* | |
35 * Opens file where plugin log should be written. The file name is | |
36 * taken from NACL_PLUGIN_LOG environment variable. | |
37 * If environment variable doesn't exist or file can't be opened, | |
38 * the function returns stdout. | |
39 */ | |
40 FILE* NaClPluginLogFileEnv() { | |
41 char* file = getenv("NACL_PLUGIN_LOG"); | |
42 if (NULL != file) { | |
43 FILE* log_file = fopen(file, "w+"); | |
44 if (NULL == log_file) { | |
45 return stdout; | |
46 } | |
47 return log_file; | |
48 } | |
49 return stdout; | |
50 } | |
51 | |
52 /* | |
53 * Currently looks for presence of NACL_PLUGIN_DEBUG and returns | |
54 * 0 if absent and 1 if present. In the future we may include notions | |
55 * of verbosity level. | |
56 */ | |
57 int NaClPluginDebugPrintCheckEnv() { | |
58 char* env = getenv("NACL_PLUGIN_DEBUG"); | |
59 return (NULL != env); | |
60 } | |
61 | |
62 bool IsValidIdentifierString(const char* strval, uint32_t* length) { | |
63 // This function is supposed to recognize valid ECMAScript identifiers, | |
64 // as described in | |
65 // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf | |
66 // It is currently restricted to only the ASCII subset. | |
67 // TODO(sehr): Recognize the full Unicode formulation of identifiers. | |
68 // TODO(sehr): Make this table-driven if efficiency becomes a problem. | |
69 if (NULL != length) { | |
70 *length = 0; | |
71 } | |
72 if (NULL == strval) { | |
73 return false; | |
74 } | |
75 static const char* kValidFirstChars = | |
76 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$_"; | |
77 static const char* kValidOtherChars = | |
78 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$_" | |
79 "0123456789"; | |
80 if (NULL == strchr(kValidFirstChars, strval[0])) { | |
81 return false; | |
82 } | |
83 uint32_t pos; | |
84 for (pos = 1; ; ++pos) { | |
85 if (0 == pos) { | |
86 // Unsigned overflow. | |
87 return false; | |
88 } | |
89 int c = strval[pos]; | |
90 if (0 == c) { | |
91 break; | |
92 } | |
93 if (NULL == strchr(kValidOtherChars, c)) { | |
94 return false; | |
95 } | |
96 } | |
97 if (NULL != length) { | |
98 *length = pos; | |
99 } | |
100 return true; | |
101 } | |
102 | |
103 } // namespace plugin | |
OLD | NEW |