// SPDX-License-Identifier: LGPL-2.1-or-later
/*
 * libfdt - Flat Device Tree manipulation
 *	Testcase for fdt_setprop_inplace()
 * Copyright (C) 2006 David Gibson, IBM Corporation.
 */

#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdint.h>

#include <libfdt.h>

#include "tests.h"
#include "testdata.h"

int main(int argc, char *argv[])
{
	void *fdt;
	const uint32_t *intp;
	const uint64_t *int64p;
	const char *strp;
	char *xstr;
	int xlen, i;
	int err;

	test_init(argc, argv);
	fdt = load_blob_arg(argc, argv);

	intp = check_getprop_cell(fdt, 0, "prop-int", TEST_VALUE_1);

	verbose_printf("Old int value was 0x%08x\n", *intp);
	err = fdt_setprop_inplace_cell(fdt, 0, "prop-int", ~TEST_VALUE_1);
	if (err)
		FAIL("Failed to set \"prop-int\" to 0x%08x: %s",
		     ~TEST_VALUE_1, fdt_strerror(err));
	intp = check_getprop_cell(fdt, 0, "prop-int", ~TEST_VALUE_1);
	verbose_printf("New int value is 0x%08x\n", *intp);

	strp = check_getprop(fdt, 0, "prop-str", strlen(TEST_STRING_1)+1,
			     TEST_STRING_1);


	int64p = check_getprop_64(fdt, 0, "prop-int64", TEST_VALUE64_1);

	verbose_printf("Old int64 value was 0x%016" PRIx64 "\n", *int64p);
	err = fdt_setprop_inplace_u64(fdt, 0, "prop-int64", ~TEST_VALUE64_1);
	if (err)
		FAIL("Failed to set \"prop-int64\" to 0x%016llx: %s",
		     ~TEST_VALUE64_1, fdt_strerror(err));
	int64p = check_getprop_64(fdt, 0, "prop-int64", ~TEST_VALUE64_1);
	verbose_printf("New int64 value is 0x%016" PRIx64 "\n", *int64p);

	strp = check_getprop(fdt, 0, "prop-str", strlen(TEST_STRING_1)+1,
			     TEST_STRING_1);

	verbose_printf("Old string value was \"%s\"\n", strp);
	xstr = strdup(strp);
	xlen = strlen(xstr);
	for (i = 0; i < xlen; i++)
		xstr[i] = toupper(xstr[i]);
	err = fdt_setprop_inplace(fdt, 0, "prop-str", xstr, xlen+1);
	if (err)
		FAIL("Failed to set \"prop-str\" to \"%s\": %s",
		     xstr, fdt_strerror(err));

	strp = check_getprop(fdt, 0, "prop-str", xlen+1, xstr);
	verbose_printf("New string value is \"%s\"\n", strp);

	err = fdt_setprop_inplace_namelen_partial(fdt, 0, "compatible",
						  strlen("compatible"), 4,
						  TEST_STRING_4_PARTIAL,
						  strlen(TEST_STRING_4_PARTIAL));
	if (err)
		FAIL("Failed to set \"compatible\": %s\n", fdt_strerror(err));

	check_getprop(fdt, 0, "compatible", strlen(TEST_STRING_4_RESULT) + 1,
		      TEST_STRING_4_RESULT);

	PASS();
}
