prefix = JS_smprintf("%swarning: ", tmp ? tmp : "");
prefix = JS_smprintf("%s%swarning: ", tmp ? tmp : "", JSREPORT_IS_STRICT(report->flags) ? "strict " : "");
my_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report){    int i, j, k, n;    char *prefix, *tmp;    const char *ctmp;    if (!report) {	fprintf(gErrFile, "%s\n", message);	return;    }    /* Conditionally ignore reported warnings. */    if (JSREPORT_IS_WARNING(report->flags) && !reportWarnings)	return;    prefix = NULL;    if (report->filename)	prefix = JS_smprintf("%s:", report->filename);    if (report->lineno) {	tmp = prefix;	prefix = JS_smprintf("%s%u: ", tmp ? tmp : "", report->lineno);	JS_free(cx, tmp);    }    if (JSREPORT_IS_WARNING(report->flags)) {	tmp = prefix;	prefix = JS_smprintf("%swarning: ", tmp ? tmp : "");	JS_free(cx, tmp);    }    /* embedded newlines -- argh! */    while ((ctmp = strchr(message, '\n')) != 0) {	ctmp++;	if (prefix)            fputs(prefix, gErrFile);	fwrite(message, 1, ctmp - message, gErrFile);	message = ctmp;    }    /* If there were no filename or lineno, the prefix might be empty */    if (prefix)        fputs(prefix, gErrFile);    fputs(message, gErrFile);    if (!report->linebuf) {	fputc('\n', gErrFile);	goto out;    }    /* report->linebuf usually ends with a newline. */    n = strlen(report->linebuf);    fprintf(gErrFile, ":\n%s%s%s%s",            prefix,            report->linebuf,            (n > 0 && report->linebuf[n-1] == '\n') ? "" : "\n",            prefix);    n = PTRDIFF(report->tokenptr, report->linebuf, char);    for (i = j = 0; i < n; i++) {	if (report->linebuf[i] == '\t') {            for (k = (j + 8) & ~7; j < k; j++) {		fputc('.', gErrFile);            }	    continue;	}	fputc('.', gErrFile);	j++;    }    fputs("^\n", gErrFile); out:    gExitCode = EXITCODE_RUNTIME_ERROR;    JS_free(cx, prefix);}