int outprintf(const gs_memory_t *mem, const char *fmt, ...) { int count; char buf[PRINTF_BUF_LENGTH]; va_list args; va_start(args, fmt); count = vsnprintf(buf, sizeof(buf), fmt, args); if (count >= sizeof(buf) || count < 0) { /* C99 || MSVC */ outwrite(mem, buf, sizeof(buf) - 1); outwrite(mem, msg_truncated, sizeof(msg_truncated) - 1); } else { outwrite(mem, buf, count); } va_end(args); return count; }
int outprintf(const gs_memory_t *mem, const char *fmt, ...) { int count; char buf[PRINTF_BUF_LENGTH]; va_list args; va_start(args, fmt); count = vsprintf(buf, fmt, args); outwrite(mem, buf, count); if (count >= PRINTF_BUF_LENGTH) { count = sprintf(buf, "PANIC: printf exceeded %d bytes. Stack has been corrupted.\n", PRINTF_BUF_LENGTH); outwrite(mem, buf, count); } va_end(args); return count; }
/* Write a buffer to stdout, potentially writing to callback */ static int s_stdout_write_process(stream_state * st, stream_cursor_read * ignore_pr, stream_cursor_write * pw, bool last) { uint count = pr->limit - pr->ptr; int written; if (count == 0) return 0; written = outwrite(st->memory, pr->ptr + 1, count); if (written < count) { return ERRC; pr->ptr += written; return 0; } static int stdout_open(gx_io_device * iodev, const char *access, stream ** ps, gs_memory_t * mem) { i_ctx_t *i_ctx_p = (i_ctx_t *)iodev->state; /* see above */ stream *s; if (!streq1(access, 'w')) return_error(e_invalidfileaccess); if (file_is_invalid(s, &ref_stdout)) { gs_memory_t *mem = imemory_system; byte *buf; s = file_alloc_stream(mem, "stdout_open(stream)"); buf = gs_alloc_bytes(mem, STDOUT_BUF_SIZE, "stdout_open(buffer)"); if (s == 0 || buf == 0) return_error(e_VMerror); swrite_file(s, gs_stdout, buf, STDOUT_BUF_SIZE); s->save_close = s->procs.flush; s->procs.close = file_close_file; s->procs.process = s_stdout_write_process; make_file(&ref_stdout, a_write | avm_system, s->write_id, s); *ps = s; return 1; } *ps = s; return 0; }