print_objc2_util.c [plain text]
#include "print_objc2_util.h"
#include <stdarg.h>
#include <stdio.h>
void
indent_reset(
struct indent* indent)
{
indent->level = 0;
indent->widths[indent->level] = 0;
}
void
indent_push(
struct indent* indent,
uint32_t width)
{
indent->level += 1;
if (indent->level < MAXINDENT)
indent->widths[indent->level] = width;
}
void
indent_pop(
struct indent* indent)
{
if (indent->level)
indent->level -= 1;
}
void
print_field_scalar(
struct indent* indent,
const char* label,
const char* fmt,
...)
{
print_field_label(indent, label);
if (fmt) {
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
}
void
print_field_label(
struct indent* indent,
const char* label,
...)
{
va_list ap;
int width = 0;
uint32_t label_indent;
uint32_t label_width;
label_indent = indent->level * 4;
#if 1
label_width = (indent->level < MAXINDENT ?
indent->widths[indent->level] : 0);
#else
uint32_t right = 0;
for (uint32_t i = 0; i < MAXINDENT; ++i) {
if (i > indent->level)
break;
uint32_t r = i * 4 + indent->widths[i];
if (r > right)
right = r;
}
label_width = right - label_indent;
#endif
va_start(ap, label);
if (label) {
width = vsnprintf(NULL, 0, label, ap);
}
va_end(ap);
width = width < label_width ? label_width - width : 0;
printf("%*s", label_indent, "");
if (label) {
va_start(ap, label);
vprintf(label, ap);
va_end(ap);
}
if (label)
printf("%*s", width + 1, "");
}
void warn_about_zerofill(
const char* segname,
const char* sectname,
const char* typename,
struct indent* indent,
enum bool indentFlag,
enum bool newline)
{
if (indentFlag)
indent_push(indent, 0);
print_field_label(indent,
"(%s contents stored in zerofill (%.16s,%.16s) section)",
typename, segname, sectname);
if (newline)
printf("\n");
if (indentFlag)
indent_pop(indent);
}