1e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson/*
2e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * libfdt - Flat Device Tree manipulation
3e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson *	Testcase for string escapes in dtc
4e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * Copyright (C) 2006 David Gibson, IBM Corporation.
5e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson *
6e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * This library is free software; you can redistribute it and/or
7e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * modify it under the terms of the GNU Lesser General Public License
8e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * as published by the Free Software Foundation; either version 2.1 of
9e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * the License, or (at your option) any later version.
10e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson *
11e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * This library is distributed in the hope that it will be useful, but
12e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * WITHOUT ANY WARRANTY; without even the implied warranty of
13e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * Lesser General Public License for more details.
15e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson *
16e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * You should have received a copy of the GNU Lesser General Public
17e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * License along with this library; if not, write to the Free Software
18e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson */
20e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#include <stdlib.h>
21e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#include <stdio.h>
22e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#include <string.h>
23e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#include <stdint.h>
24e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#include <errno.h>
25e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
26e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#include <libfdt.h>
27e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
28e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#include "tests.h"
29e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#include "testdata.h"
30e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
31e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson#define CHUNKSIZE	1024
32e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
3301a2d8a3e9f19cb1f5ee923af23682fad783a799David Gibsonstatic char *load_file(const char *name, int *len)
34e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson{
35e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	FILE *f;
3636786db6154533b67d736b414ef63b4457009326David Gibson	char *buf = NULL;
37e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	int bufsize = 0, n;
38e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
39e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	*len = 0;
40e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
41e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	f = fopen(name, "r");
42e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	if (!f)
43e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson		FAIL("Couldn't open \"%s\": %s", name, strerror(errno));
44e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
45e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	while (!feof(f)) {
46e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson		if (bufsize < (*len + CHUNKSIZE)) {
47e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson			buf = xrealloc(buf, *len + CHUNKSIZE);
48e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson			bufsize = *len + CHUNKSIZE;
49e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson		}
50e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
51e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson		n = fread(buf + *len, 1, CHUNKSIZE, f);
52e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson		if (ferror(f))
53e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson			FAIL("Error reading \"%s\": %s", name, strerror(errno));
54e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson		*len += n;
55e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	}
56e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
57e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	return buf;
58e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson}
59e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
60e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibsonint main(int argc, char *argv[])
61e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson{
6236786db6154533b67d736b414ef63b4457009326David Gibson	void *fdt;
6336786db6154533b67d736b414ef63b4457009326David Gibson	char *incbin;
64e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	int len;
65e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
66e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	test_init(argc, argv);
67e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
68e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	incbin = load_file("incbin.bin", &len);
69e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	fdt = load_blob_arg(argc, argv);
70e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
71e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	check_getprop(fdt, 0, "incbin", len, incbin);
72e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	check_getprop(fdt, 0, "incbin-partial", 17, incbin + 13);
73e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson
74e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson	PASS();
75e37ec7d5889fa04047daaa7a4ff55150ed7954d4David Gibson}
76