Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/base/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ libsidbase_la_SOURCES = mem.c \
list.c \
comms.c \
util.c \
hash.c
hash.c \
formatter.c

basedir = $(pkgincludedir)/base

Expand Down
2 changes: 1 addition & 1 deletion src/base/buffer-type-linear.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@

#include "base/common.h"

#include "base/buffer-type.h"
#include "base/mem.h"
#include "buffer-type.h"

#include <errno.h>
#include <stdio.h>
Expand Down
2 changes: 1 addition & 1 deletion src/base/buffer-type-vector.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@

#include "base/common.h"

#include "base/buffer-type.h"
#include "base/mem.h"
#include "buffer-type.h"

#include <errno.h>
#include <sys/mman.h>
Expand Down
2 changes: 1 addition & 1 deletion src/base/buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@

#include "base/buffer.h"

#include "base/buffer-type.h"
#include "base/mem.h"
#include "buffer-type.h"

#include <errno.h>

Expand Down
210 changes: 210 additions & 0 deletions src/base/formatter.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
/*
* This file is part of SID.
*
* Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
* Copyright (C) 2004-2021 Red Hat, Inc. All rights reserved.
*
* SID is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* SID is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with SID. If not, see <http://www.gnu.org/licenses/>.
*/
#include "base/formatter.h"

#include <inttypes.h>
#include <stdio.h>

#define PRINT_JSON_START_ARRAY "[\n"
#define PRINT_JSON_START_ELEM "{\n"
#define PRINT_JSON_END_MAPS "}\n"
#define PRINT_JSON_END_ELEM "},\n"
#define PRINT_JSON_END_LAST "}"
#define PRINT_JSON_END_ARRAY "]"
#define PRINT_JSON_INDENT " "

void print_indent(int level, struct buffer *buf)
{
for (int i = 0; i < level; i++) {
buffer_fmt_add(buf, NULL, PRINT_JSON_INDENT);
}
}

void print_start_document(output_format_t format, struct buffer *buf, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, PRINT_JSON_START_ELEM);
}
}

void print_end_document(output_format_t format, struct buffer *buf, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "%s\n", PRINT_JSON_END_LAST);
}
}

void print_start_array(char *array_name, output_format_t format, struct buffer *buf, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "\"%s\": %s", array_name, PRINT_JSON_START_ARRAY);
}
}

void print_end_array(bool needs_comma, output_format_t format, struct buffer *buf, int level)
{
if (format == JSON) {
buffer_fmt_add(buf, NULL, "\n");
print_indent(level, buf);
buffer_fmt_add(buf, NULL, PRINT_JSON_END_ARRAY);
if (needs_comma)
buffer_fmt_add(buf, NULL, "%s", ",\n");
else
buffer_fmt_add(buf, NULL, "%s", "\n");
}
}

void print_start_elem(bool needs_comma, output_format_t format, struct buffer *buf, int level)
{
if (format == JSON) {
if (needs_comma)
buffer_fmt_add(buf, NULL, ",\n");
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "%s", PRINT_JSON_START_ELEM);
} else {
buffer_fmt_add(buf, NULL, "%s", "\n");
}
}

void print_end_elem(output_format_t format, struct buffer *buf, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "%s", PRINT_JSON_END_LAST);
} else {
buffer_fmt_add(buf, NULL, "%s", "\n");
}
}

void print_str_field(char *field_name, char *value, output_format_t format, struct buffer *buf, bool trailing_comma, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "\"%s\": ", field_name);
buffer_fmt_add(buf, NULL, "\"%s\"", value);
if (trailing_comma)
buffer_fmt_add(buf, NULL, ",");
buffer_fmt_add(buf, NULL, "\n");
} else {
buffer_fmt_add(buf, NULL, "%s", field_name);
buffer_fmt_add(buf, NULL, "%s", ": ");
buffer_fmt_add(buf, NULL, "%s", value);
buffer_fmt_add(buf, NULL, "%s", "\n");
}
}

void print_uint_field(char *field_name, uint value, output_format_t format, struct buffer *buf, bool trailing_comma, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "\"%s\": ", field_name);
buffer_fmt_add(buf, NULL, "%u", value);
if (trailing_comma)
buffer_fmt_add(buf, NULL, ",");
buffer_fmt_add(buf, NULL, "%s", "\n");
} else {
buffer_fmt_add(buf, NULL, "%s", field_name);
buffer_fmt_add(buf, NULL, "%s", ": ");
buffer_fmt_add(buf, NULL, "%u", value);
buffer_fmt_add(buf, NULL, "%s", "\n");
}
}

void print_uint64_field(char * field_name,
uint64_t value,
output_format_t format,
struct buffer * buf,
bool trailing_comma,
int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "\"%s\": ", field_name);
buffer_fmt_add(buf, NULL, "%" PRIu64, value);
if (trailing_comma)
buffer_fmt_add(buf, NULL, ",");
buffer_fmt_add(buf, NULL, "%s", "\n");
} else {
buffer_fmt_add(buf, NULL, "%s", field_name);
buffer_fmt_add(buf, NULL, "%s", ": ");
buffer_fmt_add(buf, NULL, "%" PRIu64, value);
buffer_fmt_add(buf, NULL, "%s", "\n");
}
}

void print_int64_field(char *field_name, uint64_t value, output_format_t format, struct buffer *buf, bool trailing_comma, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "\"%s\": ", field_name);
buffer_fmt_add(buf, NULL, "%" PRIu64, value);
if (trailing_comma)
buffer_fmt_add(buf, NULL, ",");
buffer_fmt_add(buf, NULL, "%s", "\n");
} else {
buffer_fmt_add(buf, NULL, "%s", field_name);
buffer_fmt_add(buf, NULL, "%s", ": ");
buffer_fmt_add(buf, NULL, "%" PRIu64, value);
buffer_fmt_add(buf, NULL, "%s", "\n");
}
}

void print_bool_array_elem(char *field_name, bool value, output_format_t format, struct buffer *buf, bool trailing_comma, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "{\"%s\": %s}", field_name, value ? "true" : "false");
if (trailing_comma)
buffer_fmt_add(buf, NULL, "%s", ",\n");
} else {
if (value) {
buffer_fmt_add(buf, NULL, "%s", field_name);
buffer_fmt_add(buf, NULL, "%s", "\n");
}
}
}

void print_uint_array_elem(uint value, output_format_t format, struct buffer *buf, bool trailing_comma, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "%u", value);
if (trailing_comma)
buffer_fmt_add(buf, NULL, "%s", ",\n");
} else {
buffer_fmt_add(buf, NULL, "%u", value);
}
}

void print_str_array_elem(char *value, output_format_t format, struct buffer *buf, bool trailing_comma, int level)
{
if (format == JSON) {
print_indent(level, buf);
buffer_fmt_add(buf, NULL, "\"%s\"", value);
if (trailing_comma)
buffer_fmt_add(buf, NULL, "%s", ",\n");
} else {
buffer_fmt_add(buf, NULL, "%s", value);
buffer_fmt_add(buf, NULL, "\n");
}
}
File renamed without changes.
1 change: 1 addition & 0 deletions src/include/base/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#ifndef _SID_BUFFER_H
#define _SID_BUFFER_H

#include "base/buffer-type.h"
#include "base/buffer-common.h"

#include <sys/types.h>
Expand Down
75 changes: 75 additions & 0 deletions src/include/base/formatter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* This file is part of SID.
*
* Copyright (C) 2017-2020 Red Hat, Inc. All rights reserved.
*
* SID is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* SID is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with SID. If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef _SID_FORMATTER_H
#define _SID_FORMATTER_H

#include "base/buffer-type.h"
#include "base/buffer.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum
{
TABLE,
JSON,
} output_format_t;

void print_indent(int level, struct buffer *buf);
void print_start_document(output_format_t format, struct buffer *buf, int level);
void print_end_document(output_format_t format, struct buffer *buf, int level);
void print_start_array(char *array_name, output_format_t format, struct buffer *buf, int level);
void print_end_array(bool needs_comma, output_format_t format, struct buffer *buf, int level);
void print_start_elem(bool needs_comma, output_format_t format, struct buffer *buf, int level);
void print_end_elem(output_format_t format, struct buffer *buf, int level);
void print_str_field(char *field_name, char *value, output_format_t format, struct buffer *buf, bool trailing_comma, int level);
void print_uint_field(char *field_name, uint value, output_format_t format, struct buffer *buf, bool trailing_comma, int level);
void print_uint64_field(char * field_name,
uint64_t value,
output_format_t format,
struct buffer * buf,
bool trailing_comma,
int level);
void print_int64_field(char * field_name,
uint64_t value,
output_format_t format,
struct buffer * buf,
bool trailing_comma,
int level);
void print_bool_array_elem(char * field_name,
bool value,
output_format_t format,
struct buffer * buf,
bool trailing_comma,
int level);
void print_uint_array_elem(uint value, output_format_t format, struct buffer *buf, bool trailing_comma, int level);
void print_str_array_elem(char *value, output_format_t format, struct buffer *buf, bool trailing_comma, int level);

#ifdef __cplusplus
}
#endif

#endif
5 changes: 4 additions & 1 deletion src/include/iface/usid.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ typedef enum
USID_CMD_VERSION = 6,
USID_CMD_DUMP = 7,
USID_CMD_STATS = 8,
_USID_CMD_END = USID_CMD_STATS,
USID_CMD_TREE = 9,
_USID_CMD_END = USID_CMD_TREE,
} usid_cmd_t;

static const char *const usid_cmd_names[] = {
Expand All @@ -58,6 +59,7 @@ static const char *const usid_cmd_names[] = {
[USID_CMD_VERSION] = "version",
[USID_CMD_DUMP] = "dump",
[USID_CMD_STATS] = "stats",
[USID_CMD_TREE] = "tree",
};

bool usid_cmd_root_only[] = {
Expand All @@ -70,6 +72,7 @@ bool usid_cmd_root_only[] = {
[USID_CMD_VERSION] = false,
[USID_CMD_DUMP] = false,
[USID_CMD_STATS] = false,
[USID_CMD_TREE] = false,
};

#define COMMAND_STATUS_MASK_OVERALL UINT64_C(0x0000000000000001)
Expand Down
2 changes: 2 additions & 0 deletions src/include/resource/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include "base/common.h"

#include "base/buffer.h"
#include "iface/service-link.h"

#include <signal.h>
Expand Down Expand Up @@ -234,6 +235,7 @@ int sid_resource_exit_event_loop(sid_resource_t *res);
* miscellanous functions
*/
void sid_resource_dump_all_in_dot(sid_resource_t *res);
int sid_resource_write_tree_recursively(sid_resource_t *res, bool add_comma, struct buffer *outbuf, int level);

#ifdef __cplusplus
}
Expand Down
Loading