/*
 * SPDX-License-Identifier: GPL-2.0-or-later
 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
 *
 * Portions from U-Boot cmd_fdt.c (C) Copyright 2007
 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com
 * Based on code written by:
 *    Pantelis Antoniou <pantelis.antoniou@gmail.com> and
 *    Matthew McClintock <msm@freescale.com>
 *
 * This program 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.
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <assert.h>
#include <ctype.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <libfdt.h>

//#include "util.h"
#include <ctype.h>


#define FALIGN(x, a)    (((x) + ((a) - 1)) & ~((a) - 1))
#define PALIGN(p, a)    ((void *)(FALIGN((unsigned long)(p), (a))))
#define GET_CELL(p)     (p += 4, *((const uint32_t *)(p-4))) 


static void report_error(const char *where, int err)
{
	fprintf(stderr, "Error at '%s': %s\n", where, fdt_strerror(err));
}

int util_is_printable_string(const void *data, int len)
{
	const char *s = data;
	const char *ss, *se;

	/* zero length is not */
	if (len == 0)
		return 0;

	/* must terminate with zero */
	if (s[len - 1] != '\0')
		return 0;

	se = s + len;

	while (s < se) {
		ss = s;
		while (s < se && *s && isprint((unsigned char)*s))
			s++;

		/* not zero, or not done yet */
		if (*s != '\0' || s == ss)
			return 0;

		s++;
	}

	return 1;
}


/**
 *  * Displays data of a given length according to selected options
 *   *
 *    * If a specific data type is provided in disp, then this is used. Otherwise
 *     * we try to guess the data type / size from the contents.
 *      *
 *       * @param disp		Display information / options
 *        * @param data		Data to display
 *         * @param len		Maximum length of buffer
 *          * @return 0 if ok, -1 if data does not match format
 *           */
int show_data(struct display_info *disp, const char *data, int len)
{
	int i, size;
	const uint8_t *p = (const uint8_t *)data;
	const char *s;
	int value;
	int is_string;
	char fmt[3];

	/* no data, don't print */
	if (len == 0)
		return 0;

	is_string = (disp->type) == 's' ||
		(!disp->type && util_is_printable_string(data, len));
	if (is_string) {
		if (data[len - 1] != '\0') {
			fprintf(stderr, "Unterminated string\n");
			return -1;
		}
		for (s = data; s - data < len; s += strlen(s) + 1) {
			if (s != data)
				printf(" ");
			printf("%s", (const char *)s);
		}
		return 0;
	}
	size = disp->size;
	if (size == -1) {
		size = (len % 4) == 0 ? 4 : 1;
	} else if (len % size) {
		fprintf(stderr, "Property length must be a multiple of "
				"selected data size\n");
		return -1;
	}
	fmt[0] = '%';
	fmt[1] = disp->type ? disp->type : 'x';
	fmt[2] = '\0';
	for (i = 0; i < len; i += size, p += size) {
		if (i)
			printf(" ");
		value = size == 4 ? fdt32_to_cpu(*(const uint32_t *)p) :
			size == 2 ? (*p << 8) | p[1] : *p;
		//printf(" Sid in libfdtget\n" );
		printf(fmt, value);
	}
	return 0;
}

/**
 *  * List all properties in a node, one per line.
 *   *
 *    * @param blob		FDT blob
 *     * @param node		Node to display
 *      * @return 0 if ok, or FDT_ERR... if not.
 *       */
int list_properties(const void *blob, int node)
{
	const struct fdt_property *data;
	const char *name;
	int prop;

	prop = fdt_first_property_offset(blob, node);
	do {
		/* Stop silently when there are no more properties */
		if (prop < 0)
			return prop == -FDT_ERR_NOTFOUND ? 0 : prop;
		data = fdt_get_property_by_offset(blob, prop, NULL);
		name = fdt_string(blob, fdt32_to_cpu(data->nameoff));
		if (name)
			puts(name);
		prop = fdt_next_property_offset(blob, prop);
	} while (1);
}

#define MAX_LEVEL	32		/* how deeply nested we will go */

/**
 *  * List all subnodes in a node, one per line
 *   *
 *    * @param blob		FDT blob
 *     * @param node		Node to display
 *      * @return 0 if ok, or FDT_ERR... if not.
 *       */
int list_subnodes(const void *blob, int node)
{
	int nextoffset;		/* next node offset from libfdt */
	uint32_t tag;		/* current tag */
	int level = 0;		/* keep track of nesting level */
	const char *pathp;
	int depth = 1;		/* the assumed depth of this node */

	while (level >= 0) {
		tag = fdt_next_tag(blob, node, &nextoffset);
		switch (tag) {
			case FDT_BEGIN_NODE:
				pathp = fdt_get_name(blob, node, NULL);
				if (level <= depth) {
					if (pathp == NULL)
						pathp = "/* NULL pointer error */";
					if (*pathp == '\0')
						pathp = "/";	/* root is nameless */
					if (level == 1)
						puts(pathp);
				}
				level++;
				if (level >= MAX_LEVEL) {
					printf("Nested too deep, aborting.\n");
					return 1;
				}
				break;
			case FDT_END_NODE:
				level--;
				if (level == 0)
					level = -1;		/* exit the loop */
				break;
			case FDT_END:
				return 1;
			case FDT_PROP:
				break;
			default:
				if (level <= depth)
					printf("Unknown tag 0x%08X\n", tag);
				return 1;
		}
		node = nextoffset;
	}
	return 0;
}

/**
 *  * Show the data for a given node (and perhaps property) according to the
 *   * display option provided.
 *    *
 *     * @param blob		FDT blob
 *      * @param disp		Display information / options
 *       * @param node		Node to display
 *        * @param property	Name of property to display, or NULL if none
 *         * @return 0 if ok, -ve on error
 *          */
int show_data_for_item(const void *blob, struct display_info *disp,
		int node, const char *property)
{
	const void *value = NULL;
	int len, err = 0;

	switch (disp->mode) {
		case MODE_LIST_PROPS:
			err = list_properties(blob, node);
			break;

		case MODE_LIST_SUBNODES:
			err = list_subnodes(blob, node);
			break;

		default:
			assert(property);
			value = fdt_getprop(blob, node, property, &len);
			if (value) {
				if (show_data(disp, value, len))
					err = -1;
				else
					printf("\n");
			} else if (disp->default_val) {
				puts(disp->default_val);
			} else {
				report_error(property, len);
				err = -1;
			}
			break;
	}

	return err;
}

/**
 *  * Run the main fdtget operation, given a filename and valid arguments
 *   *
 *    * @param disp		Display information / options
 *     * @param filename	Filename of blob file
 *      * @param arg		List of arguments to process
 *       * @param arg_count	Number of arguments
 *        * @param return 0 if ok, -ve on error
 *         */
int do_fdtget(struct display_info *disp, const char *filename,
		char **arg, int arg_count, int args_per_step)
{
	char *blob;
	const char *prop;
	int i, node;

	//blob = utilfdt_read(filename);
	blob = NULL;
	if (!blob)
		return -1;

	for (i = 0; i + args_per_step <= arg_count; i += args_per_step) {
		node = fdt_path_offset(blob, arg[i]);
		if (node < 0) {
			if (disp->default_val) {
				puts(disp->default_val);
				continue;
			} else {
				report_error(arg[i], node);
				return -1;
			}
		}
		prop = args_per_step == 1 ? NULL : arg[i + 1];

		if (show_data_for_item(blob, disp, node, prop))
			return -1;
	}
	return 0;
}

static const char *usage_msg =
"fdtget - read values from device tree\n"
"\n"
"Each value is printed on a new line.\n\n"
"Usage:\n"
"	fdtget <options> <dt file> [<node> <property>]...\n"
"	fdtget -p <options> <dt file> [<node> ]...\n"
"Options:\n"
"\t-t <type>\tType of data\n"
"\t-p\t\tList properties for each node\n"
"\t-l\t\tList subnodes for each node\n"
"\t-d\t\tDefault value to display when the property is "
"missing\n"
"\t-h\t\tPrint this help\n\n"
;
static void usage(const char *msg)
{
	if (msg)
		fprintf(stderr, "Error: %s\n\n", msg);

	fprintf(stderr, "%s", usage_msg);
	exit(2);
}

int test_main(int argc, char *argv[])
{
	char *filename = NULL;
	struct display_info disp;
	int args_per_step = 2;

	/* set defaults */
	memset(&disp, '\0', sizeof(disp));
	disp.size = -1;
	disp.mode = MODE_SHOW_VALUE;
	for (;;) {
		int c = getopt(argc, argv, "d:hlpt:");
		if (c == -1)
			break;

		switch (c) {
			case 'h':
			case '?':
				usage(NULL);

			case 't':
				/*if (utilfdt_decode_type(optarg, &disp.type,
							&disp.size))
					usage("Invalid type string");*/
				break;

			case 'p':
				disp.mode = MODE_LIST_PROPS;
				args_per_step = 1;
				break;

			case 'l':
				disp.mode = MODE_LIST_SUBNODES;
				args_per_step = 1;
				break;

			case 'd':
				disp.default_val = optarg;
				break;
		}
	}

	if (optind < argc)
		filename = argv[optind++];
	if (!filename)
		usage("Missing filename");

	argv += optind;
	argc -= optind;

	/* Allow no arguments, and silently succeed */
	if (!argc)
		return 0;

	/* Check for node, property arguments */
	if (args_per_step == 2 && (argc % 2))
		usage("Must have an even number of arguments");

	if (do_fdtget(&disp, filename, argv, argc, args_per_step))
		return 1;
	return 0;
}

