void print_usage(char* progname, int argc, char* argv[]) { progname = basename(progname); if (!plugins) return; if (argc >= 1) { CFStringRef name = cfstr(argv[0]); const DBPlugin* plugin = DBGetPluginWithName(name); if (plugin) { _DBPluginSetCurrentPlugin(plugin); CFStringRef usage = plugin->usage(); cfprintf(stderr, "usage: %s [-f db] [-b build] %@ %@\n", progname, name, usage); CFRelease(usage); return; } else { cfprintf(stderr, "%s: no such command: %@\n", progname, name); } } cfprintf(stderr, "usage: %s [-f db] [-b build] <command> ...\n", progname); cfprintf(stderr, "commands:\n"); CFArrayRef pluginNames = dictionaryGetSortedKeys(plugins); CFIndex i, count = CFArrayGetCount(pluginNames); for (i = 0; i < count; ++i) { CFStringRef name = CFArrayGetValueAtIndex(pluginNames, i); const DBPlugin* plugin = DBGetPluginWithName(name); _DBPluginSetCurrentPlugin(plugin); CFStringRef usage = plugin->usage(); cfprintf(stderr, "\t%@ %@\n", name, usage); CFRelease(usage); } }
// Debug an object with extra verbosity, displaying non-enumerable properties. void fh_debug_verbose(FILE *stream, js_val *val, int indent) { switch (val->type) { case T_BOOLEAN: fprintf(stream, "Boolean: (%s)", !val->boolean.val ? "false" : "true"); break; case T_NUMBER: debug_num(stream, val); break; case T_STRING: cfprintf(stream, ANSI_YELLOW, "String: '%s'", val->string.ptr); break; case T_NULL: cfprintf(stream, ANSI_GRAY, "null"); break; case T_UNDEF: cfprintf(stream, ANSI_GRAY, "undefined"); break; case T_OBJECT: if (IS_ARR(val)) fprintf(stream, "Array: "); else if (IS_FUNC(val)) cfprintf(stream, ANSI_BLUE, "Function: "); else fprintf(stream, "Object: "); break; } if (IS_OBJ(val)) debug_obj(stream, val, indent, true); fprintf(stream, "\n"); }
void fh_debug(FILE *stream, js_val *val, int indent, bool newline) { switch (val->type) { case T_BOOLEAN: fprintf(stream, "%s", !val->boolean.val ? "false" : "true"); break; case T_NUMBER: debug_num(stream, val); break; case T_STRING: if (fh->opt_interactive) cfprintf(stream, ANSI_YELLOW, "'%s'", val->string.ptr); else fprintf(stream, "%s", val->string.ptr); break; case T_NULL: cfprintf(stream, ANSI_GRAY, "null"); break; case T_UNDEF: cfprintf(stream, ANSI_GRAY, "undefined"); break; case T_OBJECT: if (IS_ARR(val)) debug_arr(stream, val, indent); else if (IS_FUNC(val)) cfprintf(stream, ANSI_BLUE, "[Function]"); else if (IS_DATE(val)) fprintf(stream, "[Date %ld]", (long)val->object.primitive->number.val); else debug_obj(stream, val, indent, false); break; } if (newline) fprintf(stream, "\n"); }
void lprintf(logType t, const char *f, ...) { char output[MAX_STRLEN] = {0}; va_list args; va_start(args, f); vsprintf(output, f, args); switch (t) { case LOG_INFO: cfprintf(stdout, "^0[^gINFO^0] %s\n", output); break; case LOG_SCRIPT: cfprintf(stdout, "^0[^cSCRIPT^0] %s\n", output); break; case LOG_WARNING: cfprintf(stdout, "^0[^yWARNING^0] %s\n", output); break; case LOG_ERROR: cfprintf(stderr, "^0[^rERROR^0] %s\n", output); break; } va_end(args); }
void deathlog_command(const char *arg, struct session *ses) { FILE *fh; char fname[BUFFER_SIZE], text[BUFFER_SIZE], temp[BUFFER_SIZE], lfname[BUFFER_SIZE]; if (*arg) { arg = get_arg_in_braces(arg, temp, 0); arg = get_arg_in_braces(arg, text, 1); substitute_vars(temp, fname); substitute_myvars(fname, temp, ses); expand_filename(temp, fname, lfname); substitute_vars(text, temp); substitute_myvars(temp, text, ses); if ((fh = fopen(lfname, "a"))) { cfprintf(fh, "%s\n", text); fclose(fh); } else tintin_eprintf(ses, "#ERROR: COULDN'T OPEN FILE {%s}.", fname); } else tintin_eprintf(ses, "#ERROR: valid syntax is: #deathlog <file> <text>"); }
static void debug_num(FILE *stream, js_val *num) { if (num->number.is_nan) cfprintf(stream, ANSI_ORANGE, "NaN"); else if (num->number.is_inf) cfprintf(stream, ANSI_ORANGE, "%sInfinity", num->number.is_neg ? "-" : ""); else { char *fmt = "%f"; if (fmod(num->number.val, 1) == 0) fmt = "%.0f"; if (fabs(num->number.val) > 1e21) fmt = "%g"; cfprintf(stream, ANSI_ORANGE, fmt, num->number.val); } }
static void debug_arr(FILE *stream, js_val *arr, int indent) { if (arr->object.length == 0) { fprintf(stream, "[]"); return; } fprintf(stream, "[ "); bool first = true; js_prop *prop; unsigned long i; for (i = 0; i < arr->object.length; i++) { prop = fh_get_prop(arr, JSNUMKEY(i)->string.ptr); if (!first) fprintf(stream, ", "); else first = false; if (!prop) continue; if (prop->circular) cfprintf(stream, ANSI_BLUE, "[Circular]"); else fh_debug(stream, prop->ptr, 0, false); } fprintf(stream, " ]"); }
static void debug_obj(FILE *stream, js_val *obj, int indent, bool force_enum) { js_prop *x; bool first = true; OBJ_ITER(obj, x) { if (!x->enumerable && !force_enum) continue; if (first) { if (indent) fprintf(stream, "%*s", indent, " "); fprintf(stream, "{"); first = false; } else { fprintf(stream, ",\n"); fprintf(stream, "%*s", indent + 1, " "); } fprintf(stream, " %s: ", x->name); if (x->circular) cfprintf(stream, ANSI_BLUE, "[Circular]"); else fh_debug(stream, x->ptr, indent + 3, false); }; fprintf(stream, first ? "{}" : " }"); }
static int run(CFArrayRef argv) { if (CFArrayGetCount(argv) > 1) return -1; CFStringRef build = DBGetCurrentBuild(); CFStringRef project = NULL; CFDictionaryRef projectEnv = NULL; CFDictionaryRef globalEnv = DBCopyPropDictionary(build, NULL, CFSTR("environment")); if (CFArrayGetCount(argv) == 1) { project = CFArrayGetValueAtIndex(argv, 0); projectEnv = DBCopyPropDictionary(build, project, CFSTR("environment")); } CFMutableDictionaryRef env = NULL; if (globalEnv && projectEnv) { env = (CFMutableDictionaryRef)mergeDictionaries(projectEnv, globalEnv); } else if (globalEnv) { env = (CFMutableDictionaryRef)globalEnv; } else if (projectEnv) { env = (CFMutableDictionaryRef)projectEnv; } else { return 0; } // Auto-generate some variables based on RC_ARCHS and RC_NONARCH_CFLAGS // RC_CFLAGS=$RC_NONARCH_CFLAGS -arch ${arch} // RC_${arch}=YES CFStringRef str = CFDictionaryGetValue(env, CFSTR("RC_NONARCH_CFLAGS")); if (!str) str = CFSTR(""); CFMutableStringRef cflags = CFStringCreateMutableCopy(NULL, 0, str); str = CFDictionaryGetValue(env, CFSTR("RC_ARCHS")); if (str) { CFMutableStringRef trimmed = CFStringCreateMutableCopy(NULL, 0, str); CFStringTrimWhitespace(trimmed); CFArrayRef archs = tokenizeString(trimmed); CFIndex i, count = CFArrayGetCount(archs); for (i = 0; i < count; ++i) { CFStringRef arch = CFArrayGetValueAtIndex(archs, i); // -arch ${arch} CFStringAppendFormat(cflags, NULL, CFSTR(" -arch %@"), arch); // RC_${arch}=YES CFStringRef name = CFStringCreateWithFormat(NULL, NULL, CFSTR("RC_%@"), arch); CFDictionarySetValue(env, name, CFSTR("YES")); CFRelease(name); } CFRelease(trimmed); } CFDictionarySetValue(env, CFSTR("RC_CFLAGS"), cflags); // print variables to stdout CFArrayRef keys = dictionaryGetSortedKeys(env); CFIndex i, count = CFArrayGetCount(keys); for (i = 0; i < count; ++i) { CFStringRef name = CFArrayGetValueAtIndex(keys, i); CFStringRef value = CFDictionaryGetValue(env, name); cfprintf(stdout, "%@=%@\n", name, value); } return 0; }
int main(void) { /* * Print colors on stderr */ const char* text = "A random text"; fprintf(stderr, "\e[35m%s\e[m\n", text); cfprintf(stderr, MAGENTA, NORMAL, NOBOLD, "%s\n", text); return 0; }
int DBPluginPropertyDefaultRun(CFArrayRef argv) { DBPlugin* plugin = _DBPluginGetCurrentPlugin(); assert(plugin != NULL); assert(plugin->name != NULL); CFStringRef build = DBGetCurrentBuild(); CFIndex argc = CFArrayGetCount(argv); CFStringRef project = (argc > 0) ? CFArrayGetValueAtIndex(argv, 0) : NULL; // kDBPluginProjectPropertyType must have project argument, // kDBPluginBuildPropertyType must not have project argument, // kDBPluginPropertyType may have project argument. if (plugin->type == kDBPluginProjectPropertyType && argc != 1) return -1; if (plugin->type == kDBPluginBuildPropertyType && argc != 0) return -1; if (plugin->type == kDBPluginPropertyType && argc != 0 && argc != 1) return -1; if (plugin->datatype == CFStringGetTypeID()) { CFStringRef value = DBCopyPropString(build, project, plugin->name); // kDBPluginPropertyType: if no value in project, look in build. if (!value && project) value = DBCopyPropString(build, NULL, plugin->name); if (value) cfprintf(stdout, "%@\n", value); } else if (plugin->datatype == CFArrayGetTypeID()) { CFArrayRef value = DBCopyPropArray(build, project, plugin->name); CFIndex i, count = value ? CFArrayGetCount(value) : 0; // kDBPluginPropertyType: if no value in project, look in build. if ((!value || !count) && project) { value = DBCopyPropArray(build, NULL, plugin->name); count = value ? CFArrayGetCount(value) : 0; } for (i = 0; i < count; ++i) { cfprintf(stdout, "%@\n", CFArrayGetValueAtIndex(value, i)); } } else { fprintf(stderr, "internal error: no default handler for CFDictionary type\n"); return -1; } return 0; }
void bfs_warning_prefix(const struct cmdline *cmdline) { cfprintf(cmdline->cerr, "${bld}%s:${rs} ${wr}warning:${rs} ", xbasename(cmdline->argv[0])); }
void bfs_error_prefix(const struct cmdline *cmdline) { cfprintf(cmdline->cerr, "${bld}%s:${rs} ${er}error:${rs} ", xbasename(cmdline->argv[0])); }