1 /* 2 * Copyright (c) 2011 The Chromium 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 "ppapi/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 104