action_syntax_error(struct action_context *ctx, const char *message, ...) { if (action_error_handle_common(ctx)) { return; } struct ds s; ds_init(&s); ds_put_cstr(&s, "Syntax error"); if (ctx->lexer->token.type == LEX_T_END) { ds_put_cstr(&s, " at end of input"); } else if (ctx->lexer->start) { ds_put_format(&s, " at `%.*s'", (int) (ctx->lexer->input - ctx->lexer->start), ctx->lexer->start); } if (message) { ds_put_char(&s, ' '); va_list args; va_start(args, message); ds_put_format_valist(&s, message, args); va_end(args); } ds_put_char(&s, '.'); ctx->error = ds_steal_cstr(&s); }
void ds_put_format(struct ds *ds, const char *format, ...) { va_list args; va_start(args, format); ds_put_format_valist(ds, format, args); va_end(args); }
log_wakeup(const struct backtrace *backtrace, const char *format, ...) { struct ds ds; va_list args; ds_init(&ds); va_start(args, format); ds_put_format_valist(&ds, format, args); va_end(args); if (backtrace) { int i; ds_put_char(&ds, ':'); for (i = 0; i < backtrace->n_frames; i++) { ds_put_format(&ds, " 0x%x", backtrace->frames[i]); } } VLOG_DBG("%s", ds_cstr(&ds)); ds_destroy(&ds); }
void status_reply_put(struct status_reply *sr, const char *content, ...) { size_t old_length = sr->output.length; size_t added; va_list args; /* Append the status reply to the output. */ ds_put_format(&sr->output, "%s.", sr->category->name); va_start(args, content); ds_put_format_valist(&sr->output, content, args); va_end(args); if (ds_last(&sr->output) != '\n') { ds_put_char(&sr->output, '\n'); } /* Drop what we just added if it doesn't match the request. */ added = sr->output.length - old_length; if (added < sr->request.length || memcmp(&sr->output.string[old_length], sr->request.string, sr->request.length)) { ds_truncate(&sr->output, old_length); } }