void exerror(const char* format, ...) { Sfio_t* sp; if (expr.program->disc->errorf && !expr.program->errors && (sp = sfstropen())) { va_list ap; char* s; char buf[64]; expr.program->errors = 1; excontext(expr.program, buf, sizeof(buf)); sfputr(sp, buf, -1); va_start(ap, format); sfvprintf(sp, format, ap); va_end(ap); if (!(s = sfstruse(sp))) s = "out of space"; (*expr.program->disc->errorf)(expr.program, expr.program->disc, (expr.program->disc->flags & EX_FATAL) ? 3 : 2, "%s", s); sfclose(sp); } else if (expr.program->disc->flags & EX_FATAL) exit(1); }
static int post(Css_t* css, Cssdisc_t* disc, Connection_t* from, register Connection_t* to, int channel, const char* format, ...) { State_t* state = (State_t*)disc; char* s; ssize_t n; Sfulong_t m; va_list ap; sfprintf(state->tmp, "%d", channel); if (from) sfprintf(state->tmp, ".%d", from->fp->fd); sfputc(state->tmp, ' '); va_start(ap, format); sfvprintf(state->tmp, format, ap); va_end(ap); sfputc(state->tmp, '\n'); n = sfstrtell(state->tmp); if (!(s = sfstruse(state->tmp))) error(ERROR_SYSTEM|3, "out of space"); m = CHAN_MASK(channel); state->logged = 0; if (!to) { for (to = state->all; to; to = to->next) if ((to->mask & m) && to != from) note(css, to, state->log, s, n, 0, disc); } else if (to->mask & m) note(css, to, state->log, s, n, 0, disc); return 0; }
int vsnprintf(char* s, int n, const char* form, va_list args) { Sfio_t* f; ssize_t rv; /* make a temp stream */ if(!(f = sfnew(NIL(Sfio_t*),NIL(char*),(size_t)SF_UNBOUND, -1,SF_WRITE|SF_STRING)) ) return -1; if((rv = sfvprintf(f,form,args)) >= 0 ) { if(s && n > 0) { if((rv+1) >= n) n--; else n = rv; memcpy(s, f->data, n); s[n] = 0; } _Sfi = rv; } sfclose(f); return rv; }
int printf(const char* fmt, ...) { va_list args; int v; va_start(args, fmt); v = sfvprintf(sfstdout, fmt, args); va_end(args); return v; }
void errorv(const char* id, int level, va_list ap) { char* a; char* s; int flags; if (level < 0) flags = 0; else { flags = level & ~ERROR_LEVEL; level &= ERROR_LEVEL; } a = va_arg(ap, char*); if (level && ((s = error_info.id) || (s = (char*)id))) { if (!(flags & ERROR_USAGE)) sfprintf(sfstderr, "%s: ", s); else if (strcmp(a, "%s")) sfprintf(sfstderr, "Usage: %s ", s); } if (flags & ERROR_USAGE) /*nop*/; else if (level < 0) sfprintf(sfstderr, "debug%d: ", level); else if (level) { if (level == ERROR_WARNING) { sfprintf(sfstderr, "warning: "); error_info.warnings++; } else { error_info.errors++; if (level == ERROR_PANIC) sfprintf(sfstderr, "panic: "); } if (error_info.line) { if (error_info.file && *error_info.file) sfprintf(sfstderr, "\"%s\", ", error_info.file); sfprintf(sfstderr, "line %d: ", error_info.line); } } sfvprintf(sfstderr, a, ap); sfprintf(sfstderr, "\n"); if (level >= ERROR_FATAL) exit(level - ERROR_FATAL + 1); }
static int ccsfprintf(int from, int to, Sfio_t* sp, const char* format, ...) { va_list ap; Sfio_t* tp; char* s; int n; va_start(ap, format); if (from == to) n = sfvprintf(sp, format, ap); else if (tp = sfstropen()) { n = sfvprintf(tp, format, ap); s = sfstrbase(tp); ccmaps(s, n, from, to); n = sfwrite(sp, s, n); sfstrclose(tp); } else n = -1; return n; }
void errorv(const char *id, int level, va_list ap) { char *s; int flags; if (level < error_info.trace) return; if (level < 0) flags = 0; else { flags = level & ~ERROR_LEVEL; level &= ERROR_LEVEL; } if (level && ((s = error_info.id) || (s = (char *) id))) { if (flags & ERROR_USAGE) sfprintf(sfstderr, "Usage: %s ", s); else sfprintf(sfstderr, "%s: ", s); } if (flags & ERROR_USAGE) /*nop */ ; else if (level < 0) { int i; for (i = 0; i < error_info.indent; i++) sfprintf(sfstderr, " "); sfprintf(sfstderr, "debug%d: ", level); } else if (level) { if (level == ERROR_WARNING) { sfprintf(sfstderr, "warning: "); error_info.warnings++; } else { error_info.errors++; if (level == ERROR_PANIC) sfprintf(sfstderr, "panic: "); } if (error_info.line) { if (error_info.file && *error_info.file) sfprintf(sfstderr, "\"%s\", ", error_info.file); sfprintf(sfstderr, "line %d: ", error_info.line); } } s = va_arg(ap, char *); sfvprintf(sfstderr, s, ap); if (flags & ERROR_SYSTEM) sfprintf(sfstderr, "\n%s", strerror(errno)); sfprintf(sfstderr, "\n"); if (level >= ERROR_FATAL) exit(level - ERROR_FATAL + 1); }
int vasprintf(char** s, const char* fmt, va_list args) { Sfio_t* f; int v; if (f = sfstropen()) { v = sfvprintf(f, fmt, args); if (!(*s = strdup(sfstruse(f)))) v = -1; sfstrclose(f); } else { *s = 0; v = -1; } return v; }
void exwarn(const char *format, ...) { Sfio_t *sp; if (expr.program->disc->errorf && (sp = sfstropen())) { va_list ap; char *s; char buf[64]; excontext(expr.program, buf, sizeof(buf)); sfputr(sp, buf, -1); sfputr(sp, "\n -- ", -1); va_start(ap, format); sfvprintf(sp, format, ap); va_end(ap); s = sfstruse(sp); (*expr.program->disc->errorf) (expr.program, expr.program->disc, ERROR_WARNING, "%s", s); sfclose(sp); } }
int astquery(int quit, const char* format, ...) { va_list ap; register int n; register int c; Sfio_t* ip; Sfio_t* op; static Sfio_t* rfp; static Sfio_t* wfp; va_start(ap, format); if (!format) return 0; if (!rfp) { c = errno; if (isatty(sffileno(sfstdin))) rfp = sfstdin; else if (!(rfp = sfopen(NiL, "/dev/tty", "r"))) return -1; if (isatty(sffileno(sfstderr))) wfp = sfstderr; else if (!(wfp = sfopen(NiL, "/dev/tty", "w"))) return -1; errno = c; } if (quit & ERROR_PROMPT) { quit &= ~ERROR_PROMPT; ip = rfp; op = wfp; } else { ip = sfstdin; op = sfstderr; } sfsync(sfstdout); sfvprintf(op, format, ap); sfsync(op); for (n = c = sfgetc(ip);; c = sfgetc(ip)) switch (c) { case EOF: n = c; /*FALLTHROUGH*/ case '\n': switch (n) { case EOF: case 'q': case 'Q': if (quit >= 0) exit(quit); return -1; case '1': case 'y': case 'Y': case '+': return 0; } return 1; } va_end(ap); /*NOTREACHED*/ }