uses vnprintf