void init_factor_from_args(F_CHAR *image, int argc, F_CHAR **argv, bool embedded) { F_PARAMETERS p; default_parameters(&p); if(image) p.image = image; CELL i; posix_argc = argc; posix_argv = safe_malloc(argc * sizeof(F_CHAR*)); posix_argv[0] = safe_strdup(argv[0]); for(i = 1; i < argc; i++) { posix_argv[i] = safe_strdup(argv[i]); if(factor_arg(argv[i],STR_FORMAT("-datastack=%d"),&p.ds_size)); else if(factor_arg(argv[i],STR_FORMAT("-retainstack=%d"),&p.rs_size)); else if(factor_arg(argv[i],STR_FORMAT("-generations=%d"),&p.gen_count)); else if(factor_arg(argv[i],STR_FORMAT("-young=%d"),&p.young_size)); else if(factor_arg(argv[i],STR_FORMAT("-aging=%d"),&p.aging_size)); else if(factor_arg(argv[i],STR_FORMAT("-tenured=%d"),&p.tenured_size)); else if(factor_arg(argv[i],STR_FORMAT("-codeheap=%d"),&p.code_size)); else if(STRCMP(argv[i],STR_FORMAT("-securegc")) == 0) p.secure_gc = true; else if(STRCMP(argv[i],STR_FORMAT("-fep")) == 0) p.fep = true; else if(STRNCMP(argv[i],STR_FORMAT("-i="),3) == 0) p.image = argv[i] + 3; else if(STRCMP(argv[i],STR_FORMAT("-console")) == 0) p.console = true; else if(STRCMP(argv[i],STR_FORMAT("-no-stack-traces")) == 0) p.stack_traces = false; } init_factor(&p); nest_stacks(); F_ARRAY *args = allot_array(ARRAY_TYPE,argc,F); for(i = 1; i < argc; i++) { REGISTER_UNTAGGED(args); CELL arg = tag_object(from_native_string(argv[i])); UNREGISTER_UNTAGGED(args); set_array_nth(args,i,arg); } userenv[ARGS_ENV] = tag_object(args); const F_CHAR *executable_path = vm_executable_path(); if(!executable_path) executable_path = argv[0]; userenv[EXECUTABLE_ENV] = tag_object(from_native_string(executable_path)); userenv[EMBEDDED_ENV] = (embedded ? T : F); if(p.fep) factorbug(); c_to_factor_toplevel(userenv[BOOT_ENV]); unnest_stacks(); for(i = 0; i < argc; i++) free(posix_argv[i]); free(posix_argv); }
void error(const char* fm, ...) { if(logLevel > LOG_ERROR) return; STR_FORMAT(LOG_SIZE); output(buf,"ERROR"); }
void warn(const char* fm, ...) { if(logLevel > LOG_WARN) return; STR_FORMAT(LOG_SIZE); output(buf,"WARN"); }
void info(const char* fm, ...) { if(logLevel > LOG_INFO) return; STR_FORMAT(LOG_SIZE); output(buf,"INFO"); }
void debug(const char* fm, ...) { if(logLevel > LOG_DEBUG) return; STR_FORMAT(LOG_SIZE); output(buf,"DEBUG"); }
void logData (int level, LogDataFormatter *formatLogData, const void *data) { const char *prefix = NULL; if (level & LOG_FLG_CATEGORY) { int category = level & LOG_MSK_CATEGORY; if (!logCategoryFlags[category]) return; level = categoryLogLevel; { const LogCategoryEntry *ctg = &logCategoryTable[category]; prefix = ctg->prefix; } } { int write = level <= systemLogLevel; int print = level <= stderrLogLevel; if (write || print) { int oldErrno = errno; char record[0X1000]; STR_BEGIN(record, sizeof(record)); if (prefix) STR_PRINTF("%s: ", prefix); STR_FORMAT(formatLogData, data); STR_END; if (write) { writeLogRecord(record); #if defined(WINDOWS) if (windowsEventLog != INVALID_HANDLE_VALUE) { const char *strings[] = {record}; ReportEvent(windowsEventLog, toWindowsEventType(level), 0, 0, NULL, ARRAY_COUNT(strings), 0, strings, NULL); } #elif defined(__MSDOS__) #elif defined(__ANDROID__) __android_log_write(toAndroidLogPriority(level), PACKAGE_TARNAME, record); #elif defined(HAVE_SYSLOG_H) if (syslogOpened) syslog(level, "%s", record); #endif /* write system log */ } if (print) { FILE *stream = stderr; lockStream(stream); if (logPrefixStack) { const char *prefix = logPrefixStack->prefix; if (*prefix) { fputs(prefix, stream); fputs(": ", stream); } } fputs(record, stream); fputc('\n', stream); flushStream(stream); unlockStream(stream); } errno = oldErrno; } } }