Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Custom ucl emitters
Baptiste Daroussin committed 12 years ago
commit 364ec454e69b408ccd16a0e82088612acff4db82
parent 36cccae
3 files changed +163 -15
modified libpkg/pkg_manifest.c
@@ -807,7 +807,6 @@ pkg_emit_filelist(struct pkg *pkg, FILE *f)
{
	ucl_object_t *obj = NULL, *seq;
	struct pkg_file *file = NULL;
-
	char *output;
	const char *name, *origin, *version;
	struct sbuf *b = NULL;

@@ -824,9 +823,7 @@ pkg_emit_filelist(struct pkg *pkg, FILE *f)
	if (seq != NULL)
		obj = ucl_object_insert_key(obj, seq, "files", 5, false);

-
	output = ucl_object_emit(obj, UCL_EMIT_JSON_COMPACT);
-
	fprintf(f, "%s", output);
-
	free(output);
+
	ucl_object_emit_file(obj, UCL_EMIT_JSON_COMPACT, f);

	if (b != NULL)
		sbuf_delete(b);
@@ -837,7 +834,7 @@ pkg_emit_filelist(struct pkg *pkg, FILE *f)
}

static int
-
emit_manifest(struct pkg *pkg, char **out, short flags)
+
emit_manifest(struct pkg *pkg, struct sbuf **out, short flags)
{
	struct pkg_dep		*dep      = NULL;
	struct pkg_option	*option   = NULL;
@@ -1065,9 +1062,9 @@ emit_manifest(struct pkg *pkg, char **out, short flags)
	}

	if ((flags & PKG_MANIFEST_EMIT_PRETTY) == PKG_MANIFEST_EMIT_PRETTY)
-
		*out = ucl_object_emit(top, UCL_EMIT_YAML);
+
		ucl_object_emit_sbuf(top, UCL_EMIT_YAML, out);
	else
-
		*out = ucl_object_emit(top, UCL_EMIT_JSON_COMPACT);
+
		ucl_object_emit_sbuf(top, UCL_EMIT_JSON_COMPACT, out);

	ucl_object_free(top);

@@ -1097,7 +1094,7 @@ static int
pkg_emit_manifest_generic(struct pkg *pkg, void *out, short flags,
	    char **pdigest, bool out_is_a_sbuf)
{
-
	char *output;
+
	struct sbuf *output = NULL;
	unsigned char digest[SHA256_DIGEST_LENGTH];
	SHA256_CTX *sign_ctx = NULL;
	int rc;
@@ -1108,15 +1105,16 @@ pkg_emit_manifest_generic(struct pkg *pkg, void *out, short flags,
		SHA256_Init(sign_ctx);
	}

+
	if (out_is_a_sbuf)
+
		output = out;
+

	rc = emit_manifest(pkg, &output, flags);

	if (sign_ctx != NULL)
-
		SHA256_Update(sign_ctx, output, strlen(output));
+
		SHA256_Update(sign_ctx, sbuf_data(output), sbuf_len(output));

-
	if (out_is_a_sbuf)
-
		sbuf_cat(out, output);
-
	else
-
		fprintf(out, "%s\n", output);
+
	if (!out_is_a_sbuf)
+
		fprintf(out, "%s\n", sbuf_data(output));

	if (pdigest != NULL) {
		SHA256_Final(digest, sign_ctx);
@@ -1124,7 +1122,8 @@ pkg_emit_manifest_generic(struct pkg *pkg, void *out, short flags,
		free(sign_ctx);
	}

-
	free (output);
+
	if (!out_is_a_sbuf)
+
		sbuf_free(output);

	return (rc);
}
modified libpkg/private/pkg.h
@@ -476,4 +476,7 @@ int do_extract_mtree(char *mtree, const char *prefix);

int repo_update_binary_pkgs(struct pkg_repo *repo, bool force);

+
bool ucl_object_emit_sbuf(ucl_object_t *obj, enum ucl_emitter emit_type, struct sbuf **buf);
+
bool ucl_object_emit_file(ucl_object_t *obj, enum ucl_emitter emit_type, FILE *);
+

#endif
modified libpkg/utils.c
@@ -1,5 +1,5 @@
/*-
-
 * Copyright (c) 2011-2013 Baptiste Daroussin <bapt@FreeBSD.org>
+
 * Copyright (c) 2011-2014 Baptiste Daroussin <bapt@FreeBSD.org>
 * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
 * Copyright (c) 2013 Vsevolod Stakhov <vsevolod@FreeBSD.org>
 * All rights reserved.
@@ -43,6 +43,8 @@
#include <ctype.h>
#include <fnmatch.h>
#include <paths.h>
+
#include <float.h>
+
#include <math.h>

#include "pkg.h"
#include "private/event.h"
@@ -699,3 +701,147 @@ process_spawn_pipe(FILE *inout[2], const char *command)
	return (-1); /* ? */
}

+
static int
+
ucl_file_append_character(unsigned char c, size_t len, void *data)
+
{
+
	size_t i;
+
	FILE *out = data;
+

+
	for (i = 0; i < len; i++)
+
		fprintf(out, "%c", c);
+

+
	return (0);
+
}
+

+
static int
+
ucl_file_append_len(const unsigned char *str, size_t len, void *data)
+
{
+
	FILE *out = data;
+

+
	fprintf(out, "%.*s", (int)len, str);
+

+
	return (0);
+
}
+

+
static int
+
ucl_file_append_int(int64_t val, void *data)
+
{
+
	FILE *out = data;
+

+
	fprintf(out, "%"PRId64, val);
+

+
	return (0);
+
}
+

+
static int
+
ucl_file_append_double(double val, void *data)
+
{
+
	FILE *out = data;
+
	const double delta = 0.0000001;
+

+
	if (val == (double)(int)val) {
+
		fprintf(out, "%.1lf", val);
+
	} else if (fabs(val - (double)(int)val) < delta) {
+
		fprintf(out, "%.*lg", DBL_DIG, val);
+
	} else {
+
		fprintf(out, "%lf", val);
+
	}
+

+
	return (0);
+
}
+

+
static int
+
ucl_sbuf_append_character(unsigned char c, size_t len, void *data)
+
{
+
	struct sbuf *buf = data;
+
	size_t i;
+

+
	for (i = 0; i < len; i++)
+
		sbuf_putc(buf, c);
+

+
	return (0);
+
}
+

+
static int
+
ucl_sbuf_append_len(const unsigned char *str, size_t len, void *data)
+
{
+
	struct sbuf *buf = data;
+

+
	sbuf_bcat(buf, str, len);
+

+
	return (0);
+
}
+

+
static int
+
ucl_sbuf_append_int(int64_t val, void *data)
+
{
+
	struct sbuf *buf = data;
+

+
	sbuf_printf(buf, "%"PRId64, val);
+

+
	return (0);
+
}
+

+
static int
+
ucl_sbuf_append_double(double val, void *data)
+
{
+
	struct sbuf *buf = data;
+
	const double delta = 0.0000001;
+

+
	if (val == (double)(int)val) {
+
		sbuf_printf(buf, "%.1lf", val);
+
	} else if (fabs(val - (double)(int)val) < delta) {
+
		sbuf_printf(buf, "%.*lg", DBL_DIG, val);
+
	} else {
+
		sbuf_printf(buf, "%lf", val);
+
	}
+

+
	return (0);
+
}
+

+
bool
+
ucl_object_emit_file(ucl_object_t *obj, enum ucl_emitter emit_type, FILE *out)
+
{
+
	struct ucl_emitter_functions func = {
+
		.ucl_emitter_append_character = ucl_file_append_character,
+
		.ucl_emitter_append_len = ucl_file_append_len,
+
		.ucl_emitter_append_int = ucl_file_append_int,
+
		.ucl_emitter_append_double = ucl_file_append_double
+
	};
+

+
	func.ud = out;
+

+
	if (obj = NULL)
+
		return (false);
+

+
	func.ud = NULL;
+

+
	return (ucl_object_emit_full(obj, emit_type, &func));
+

+

+
}
+

+
bool
+
ucl_object_emit_sbuf(ucl_object_t *obj, enum ucl_emitter emit_type,
+
                     struct sbuf **buf)
+
{
+
	bool ret = false;
+
	struct ucl_emitter_functions func = {
+
		.ucl_emitter_append_character = ucl_sbuf_append_character,
+
		.ucl_emitter_append_len = ucl_sbuf_append_len,
+
		.ucl_emitter_append_int = ucl_sbuf_append_int,
+
		.ucl_emitter_append_double = ucl_sbuf_append_double
+
	};
+

+
	if (*buf == NULL)
+
		*buf = sbuf_new_auto();
+
	else
+
		sbuf_clear(*buf);
+

+
	func.ud = *buf;
+

+
	ret = ucl_object_emit_full(obj, emit_type, &func);
+
	sbuf_done(*buf);
+

+
	return (ret);
+
}