xref: /aosp_15_r20/external/dtc/util.h (revision cd60bc56d4bea3af4ec04523e4d71c2b272c8aff)
1*cd60bc56SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-or-later */
2*cd60bc56SAndroid Build Coastguard Worker #ifndef UTIL_H
3*cd60bc56SAndroid Build Coastguard Worker #define UTIL_H
4*cd60bc56SAndroid Build Coastguard Worker 
5*cd60bc56SAndroid Build Coastguard Worker #include <stdlib.h>
6*cd60bc56SAndroid Build Coastguard Worker #include <stdarg.h>
7*cd60bc56SAndroid Build Coastguard Worker #include <stdbool.h>
8*cd60bc56SAndroid Build Coastguard Worker #include <getopt.h>
9*cd60bc56SAndroid Build Coastguard Worker 
10*cd60bc56SAndroid Build Coastguard Worker /*
11*cd60bc56SAndroid Build Coastguard Worker  * Copyright 2011 The Chromium Authors, All Rights Reserved.
12*cd60bc56SAndroid Build Coastguard Worker  * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc.
13*cd60bc56SAndroid Build Coastguard Worker  */
14*cd60bc56SAndroid Build Coastguard Worker 
15*cd60bc56SAndroid Build Coastguard Worker #ifdef __GNUC__
16*cd60bc56SAndroid Build Coastguard Worker #if __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
17*cd60bc56SAndroid Build Coastguard Worker #define PRINTF(i, j)	__attribute__((format (gnu_printf, i, j)))
18*cd60bc56SAndroid Build Coastguard Worker #else
19*cd60bc56SAndroid Build Coastguard Worker #define PRINTF(i, j)	__attribute__((format (printf, i, j)))
20*cd60bc56SAndroid Build Coastguard Worker #endif
21*cd60bc56SAndroid Build Coastguard Worker #define NORETURN	__attribute__((noreturn))
22*cd60bc56SAndroid Build Coastguard Worker #else
23*cd60bc56SAndroid Build Coastguard Worker #define PRINTF(i, j)
24*cd60bc56SAndroid Build Coastguard Worker #define NORETURN
25*cd60bc56SAndroid Build Coastguard Worker #endif
26*cd60bc56SAndroid Build Coastguard Worker 
27*cd60bc56SAndroid Build Coastguard Worker #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
28*cd60bc56SAndroid Build Coastguard Worker 
29*cd60bc56SAndroid Build Coastguard Worker #define stringify(s)	stringify_(s)
30*cd60bc56SAndroid Build Coastguard Worker #define stringify_(s)	#s
31*cd60bc56SAndroid Build Coastguard Worker 
die(const char * str,...)32*cd60bc56SAndroid Build Coastguard Worker static inline void NORETURN PRINTF(1, 2) die(const char *str, ...)
33*cd60bc56SAndroid Build Coastguard Worker {
34*cd60bc56SAndroid Build Coastguard Worker 	va_list ap;
35*cd60bc56SAndroid Build Coastguard Worker 
36*cd60bc56SAndroid Build Coastguard Worker 	va_start(ap, str);
37*cd60bc56SAndroid Build Coastguard Worker 	fprintf(stderr, "FATAL ERROR: ");
38*cd60bc56SAndroid Build Coastguard Worker 	vfprintf(stderr, str, ap);
39*cd60bc56SAndroid Build Coastguard Worker 	va_end(ap);
40*cd60bc56SAndroid Build Coastguard Worker 	exit(1);
41*cd60bc56SAndroid Build Coastguard Worker }
42*cd60bc56SAndroid Build Coastguard Worker 
xmalloc(size_t len)43*cd60bc56SAndroid Build Coastguard Worker static inline void *xmalloc(size_t len)
44*cd60bc56SAndroid Build Coastguard Worker {
45*cd60bc56SAndroid Build Coastguard Worker 	void *new = malloc(len);
46*cd60bc56SAndroid Build Coastguard Worker 
47*cd60bc56SAndroid Build Coastguard Worker 	if (!new)
48*cd60bc56SAndroid Build Coastguard Worker 		die("malloc() failed\n");
49*cd60bc56SAndroid Build Coastguard Worker 
50*cd60bc56SAndroid Build Coastguard Worker 	return new;
51*cd60bc56SAndroid Build Coastguard Worker }
52*cd60bc56SAndroid Build Coastguard Worker 
xrealloc(void * p,size_t len)53*cd60bc56SAndroid Build Coastguard Worker static inline void *xrealloc(void *p, size_t len)
54*cd60bc56SAndroid Build Coastguard Worker {
55*cd60bc56SAndroid Build Coastguard Worker 	void *new = realloc(p, len);
56*cd60bc56SAndroid Build Coastguard Worker 
57*cd60bc56SAndroid Build Coastguard Worker 	if (!new)
58*cd60bc56SAndroid Build Coastguard Worker 		die("realloc() failed (len=%zd)\n", len);
59*cd60bc56SAndroid Build Coastguard Worker 
60*cd60bc56SAndroid Build Coastguard Worker 	return new;
61*cd60bc56SAndroid Build Coastguard Worker }
62*cd60bc56SAndroid Build Coastguard Worker 
63*cd60bc56SAndroid Build Coastguard Worker extern char *xstrdup(const char *s);
64*cd60bc56SAndroid Build Coastguard Worker extern char *xstrndup(const char *s, size_t len);
65*cd60bc56SAndroid Build Coastguard Worker 
66*cd60bc56SAndroid Build Coastguard Worker extern int PRINTF(2, 3) xasprintf(char **strp, const char *fmt, ...);
67*cd60bc56SAndroid Build Coastguard Worker extern int PRINTF(2, 3) xasprintf_append(char **strp, const char *fmt, ...);
68*cd60bc56SAndroid Build Coastguard Worker extern int xavsprintf_append(char **strp, const char *fmt, va_list ap);
69*cd60bc56SAndroid Build Coastguard Worker extern char *join_path(const char *path, const char *name);
70*cd60bc56SAndroid Build Coastguard Worker 
71*cd60bc56SAndroid Build Coastguard Worker /**
72*cd60bc56SAndroid Build Coastguard Worker  * Check a property of a given length to see if it is all printable and
73*cd60bc56SAndroid Build Coastguard Worker  * has a valid terminator. The property can contain either a single string,
74*cd60bc56SAndroid Build Coastguard Worker  * or multiple strings each of non-zero length.
75*cd60bc56SAndroid Build Coastguard Worker  *
76*cd60bc56SAndroid Build Coastguard Worker  * @param data	The string to check
77*cd60bc56SAndroid Build Coastguard Worker  * @param len	The string length including terminator
78*cd60bc56SAndroid Build Coastguard Worker  * @return 1 if a valid printable string, 0 if not
79*cd60bc56SAndroid Build Coastguard Worker  */
80*cd60bc56SAndroid Build Coastguard Worker bool util_is_printable_string(const void *data, int len);
81*cd60bc56SAndroid Build Coastguard Worker 
82*cd60bc56SAndroid Build Coastguard Worker /*
83*cd60bc56SAndroid Build Coastguard Worker  * Parse an escaped character starting at index i in string s.  The resulting
84*cd60bc56SAndroid Build Coastguard Worker  * character will be returned and the index i will be updated to point at the
85*cd60bc56SAndroid Build Coastguard Worker  * character directly after the end of the encoding, this may be the '\0'
86*cd60bc56SAndroid Build Coastguard Worker  * terminator of the string.
87*cd60bc56SAndroid Build Coastguard Worker  */
88*cd60bc56SAndroid Build Coastguard Worker char get_escape_char(const char *s, int *i);
89*cd60bc56SAndroid Build Coastguard Worker 
90*cd60bc56SAndroid Build Coastguard Worker /**
91*cd60bc56SAndroid Build Coastguard Worker  * Read a device tree file into a buffer. This will report any errors on
92*cd60bc56SAndroid Build Coastguard Worker  * stderr.
93*cd60bc56SAndroid Build Coastguard Worker  *
94*cd60bc56SAndroid Build Coastguard Worker  * @param filename	The filename to read, or - for stdin
95*cd60bc56SAndroid Build Coastguard Worker  * @param len		If non-NULL, the amount of data we managed to read
96*cd60bc56SAndroid Build Coastguard Worker  * @return Pointer to allocated buffer containing fdt, or NULL on error
97*cd60bc56SAndroid Build Coastguard Worker  */
98*cd60bc56SAndroid Build Coastguard Worker char *utilfdt_read(const char *filename, size_t *len);
99*cd60bc56SAndroid Build Coastguard Worker 
100*cd60bc56SAndroid Build Coastguard Worker /**
101*cd60bc56SAndroid Build Coastguard Worker  * Read a device tree file into a buffer. Does not report errors, but only
102*cd60bc56SAndroid Build Coastguard Worker  * returns them. The value returned can be passed to strerror() to obtain
103*cd60bc56SAndroid Build Coastguard Worker  * an error message for the user.
104*cd60bc56SAndroid Build Coastguard Worker  *
105*cd60bc56SAndroid Build Coastguard Worker  * @param filename	The filename to read, or - for stdin
106*cd60bc56SAndroid Build Coastguard Worker  * @param buffp		Returns pointer to buffer containing fdt
107*cd60bc56SAndroid Build Coastguard Worker  * @param len		If non-NULL, the amount of data we managed to read
108*cd60bc56SAndroid Build Coastguard Worker  * @return 0 if ok, else an errno value representing the error
109*cd60bc56SAndroid Build Coastguard Worker  */
110*cd60bc56SAndroid Build Coastguard Worker int utilfdt_read_err(const char *filename, char **buffp, size_t *len);
111*cd60bc56SAndroid Build Coastguard Worker 
112*cd60bc56SAndroid Build Coastguard Worker /**
113*cd60bc56SAndroid Build Coastguard Worker  * Write a device tree buffer to a file. This will report any errors on
114*cd60bc56SAndroid Build Coastguard Worker  * stderr.
115*cd60bc56SAndroid Build Coastguard Worker  *
116*cd60bc56SAndroid Build Coastguard Worker  * @param filename	The filename to write, or - for stdout
117*cd60bc56SAndroid Build Coastguard Worker  * @param blob		Pointer to buffer containing fdt
118*cd60bc56SAndroid Build Coastguard Worker  * @return 0 if ok, -1 on error
119*cd60bc56SAndroid Build Coastguard Worker  */
120*cd60bc56SAndroid Build Coastguard Worker int utilfdt_write(const char *filename, const void *blob);
121*cd60bc56SAndroid Build Coastguard Worker 
122*cd60bc56SAndroid Build Coastguard Worker /**
123*cd60bc56SAndroid Build Coastguard Worker  * Write a device tree buffer to a file. Does not report errors, but only
124*cd60bc56SAndroid Build Coastguard Worker  * returns them. The value returned can be passed to strerror() to obtain
125*cd60bc56SAndroid Build Coastguard Worker  * an error message for the user.
126*cd60bc56SAndroid Build Coastguard Worker  *
127*cd60bc56SAndroid Build Coastguard Worker  * @param filename	The filename to write, or - for stdout
128*cd60bc56SAndroid Build Coastguard Worker  * @param blob		Pointer to buffer containing fdt
129*cd60bc56SAndroid Build Coastguard Worker  * @return 0 if ok, else an errno value representing the error
130*cd60bc56SAndroid Build Coastguard Worker  */
131*cd60bc56SAndroid Build Coastguard Worker int utilfdt_write_err(const char *filename, const void *blob);
132*cd60bc56SAndroid Build Coastguard Worker 
133*cd60bc56SAndroid Build Coastguard Worker /**
134*cd60bc56SAndroid Build Coastguard Worker  * Decode a data type string. The purpose of this string
135*cd60bc56SAndroid Build Coastguard Worker  *
136*cd60bc56SAndroid Build Coastguard Worker  * The string consists of an optional character followed by the type:
137*cd60bc56SAndroid Build Coastguard Worker  *	Modifier characters:
138*cd60bc56SAndroid Build Coastguard Worker  *		hh or b	1 byte
139*cd60bc56SAndroid Build Coastguard Worker  *		h	2 byte
140*cd60bc56SAndroid Build Coastguard Worker  *		l	4 byte, default
141*cd60bc56SAndroid Build Coastguard Worker  *
142*cd60bc56SAndroid Build Coastguard Worker  *	Type character:
143*cd60bc56SAndroid Build Coastguard Worker  *		s	string
144*cd60bc56SAndroid Build Coastguard Worker  *		i	signed integer
145*cd60bc56SAndroid Build Coastguard Worker  *		u	unsigned integer
146*cd60bc56SAndroid Build Coastguard Worker  *		x	hex
147*cd60bc56SAndroid Build Coastguard Worker  *		r	raw
148*cd60bc56SAndroid Build Coastguard Worker  *
149*cd60bc56SAndroid Build Coastguard Worker  * TODO: Implement ll modifier (8 bytes)
150*cd60bc56SAndroid Build Coastguard Worker  * TODO: Implement o type (octal)
151*cd60bc56SAndroid Build Coastguard Worker  *
152*cd60bc56SAndroid Build Coastguard Worker  * @param fmt		Format string to process
153*cd60bc56SAndroid Build Coastguard Worker  * @param type		Returns type found(s/d/u/x), or 0 if none
154*cd60bc56SAndroid Build Coastguard Worker  * @param size		Returns size found(1,2,4,8) or 4 if none
155*cd60bc56SAndroid Build Coastguard Worker  * @return 0 if ok, -1 on error (no type given, or other invalid format)
156*cd60bc56SAndroid Build Coastguard Worker  */
157*cd60bc56SAndroid Build Coastguard Worker int utilfdt_decode_type(const char *fmt, int *type, int *size);
158*cd60bc56SAndroid Build Coastguard Worker 
159*cd60bc56SAndroid Build Coastguard Worker /*
160*cd60bc56SAndroid Build Coastguard Worker  * This is a usage message fragment for the -t option. It is the format
161*cd60bc56SAndroid Build Coastguard Worker  * supported by utilfdt_decode_type.
162*cd60bc56SAndroid Build Coastguard Worker  */
163*cd60bc56SAndroid Build Coastguard Worker 
164*cd60bc56SAndroid Build Coastguard Worker #define USAGE_TYPE_MSG \
165*cd60bc56SAndroid Build Coastguard Worker 	"<type>\ts=string, i=int, u=unsigned, x=hex, r=raw\n" \
166*cd60bc56SAndroid Build Coastguard Worker 	"\tOptional modifier prefix:\n" \
167*cd60bc56SAndroid Build Coastguard Worker 	"\t\thh or b=byte, h=2 byte, l=4 byte (default)";
168*cd60bc56SAndroid Build Coastguard Worker 
169*cd60bc56SAndroid Build Coastguard Worker /**
170*cd60bc56SAndroid Build Coastguard Worker  * Print property data in a readable format to stdout
171*cd60bc56SAndroid Build Coastguard Worker  *
172*cd60bc56SAndroid Build Coastguard Worker  * Properties that look like strings will be printed as strings. Otherwise
173*cd60bc56SAndroid Build Coastguard Worker  * the data will be displayed either as cells (if len is a multiple of 4
174*cd60bc56SAndroid Build Coastguard Worker  * bytes) or bytes.
175*cd60bc56SAndroid Build Coastguard Worker  *
176*cd60bc56SAndroid Build Coastguard Worker  * If len is 0 then this function does nothing.
177*cd60bc56SAndroid Build Coastguard Worker  *
178*cd60bc56SAndroid Build Coastguard Worker  * @param data	Pointers to property data
179*cd60bc56SAndroid Build Coastguard Worker  * @param len	Length of property data
180*cd60bc56SAndroid Build Coastguard Worker  */
181*cd60bc56SAndroid Build Coastguard Worker void utilfdt_print_data(const char *data, int len);
182*cd60bc56SAndroid Build Coastguard Worker 
183*cd60bc56SAndroid Build Coastguard Worker /**
184*cd60bc56SAndroid Build Coastguard Worker  * Show source version and exit
185*cd60bc56SAndroid Build Coastguard Worker  */
186*cd60bc56SAndroid Build Coastguard Worker void NORETURN util_version(void);
187*cd60bc56SAndroid Build Coastguard Worker 
188*cd60bc56SAndroid Build Coastguard Worker /**
189*cd60bc56SAndroid Build Coastguard Worker  * Show usage and exit
190*cd60bc56SAndroid Build Coastguard Worker  *
191*cd60bc56SAndroid Build Coastguard Worker  * This helps standardize the output of various utils.  You most likely want
192*cd60bc56SAndroid Build Coastguard Worker  * to use the usage() helper below rather than call this.
193*cd60bc56SAndroid Build Coastguard Worker  *
194*cd60bc56SAndroid Build Coastguard Worker  * @param errmsg	If non-NULL, an error message to display
195*cd60bc56SAndroid Build Coastguard Worker  * @param synopsis	The initial example usage text (and possible examples)
196*cd60bc56SAndroid Build Coastguard Worker  * @param short_opts	The string of short options
197*cd60bc56SAndroid Build Coastguard Worker  * @param long_opts	The structure of long options
198*cd60bc56SAndroid Build Coastguard Worker  * @param opts_help	An array of help strings (should align with long_opts)
199*cd60bc56SAndroid Build Coastguard Worker  */
200*cd60bc56SAndroid Build Coastguard Worker void NORETURN util_usage(const char *errmsg, const char *synopsis,
201*cd60bc56SAndroid Build Coastguard Worker 			 const char *short_opts,
202*cd60bc56SAndroid Build Coastguard Worker 			 struct option const long_opts[],
203*cd60bc56SAndroid Build Coastguard Worker 			 const char * const opts_help[]);
204*cd60bc56SAndroid Build Coastguard Worker 
205*cd60bc56SAndroid Build Coastguard Worker /**
206*cd60bc56SAndroid Build Coastguard Worker  * Show usage and exit
207*cd60bc56SAndroid Build Coastguard Worker  *
208*cd60bc56SAndroid Build Coastguard Worker  * If you name all your usage variables with usage_xxx, then you can call this
209*cd60bc56SAndroid Build Coastguard Worker  * help macro rather than expanding all arguments yourself.
210*cd60bc56SAndroid Build Coastguard Worker  *
211*cd60bc56SAndroid Build Coastguard Worker  * @param errmsg	If non-NULL, an error message to display
212*cd60bc56SAndroid Build Coastguard Worker  */
213*cd60bc56SAndroid Build Coastguard Worker #define usage(errmsg) \
214*cd60bc56SAndroid Build Coastguard Worker 	util_usage(errmsg, usage_synopsis, usage_short_opts, \
215*cd60bc56SAndroid Build Coastguard Worker 		   usage_long_opts, usage_opts_help)
216*cd60bc56SAndroid Build Coastguard Worker 
217*cd60bc56SAndroid Build Coastguard Worker /**
218*cd60bc56SAndroid Build Coastguard Worker  * Call getopt_long() with standard options
219*cd60bc56SAndroid Build Coastguard Worker  *
220*cd60bc56SAndroid Build Coastguard Worker  * Since all util code runs getopt in the same way, provide a helper.
221*cd60bc56SAndroid Build Coastguard Worker  */
222*cd60bc56SAndroid Build Coastguard Worker #define util_getopt_long() getopt_long(argc, argv, usage_short_opts, \
223*cd60bc56SAndroid Build Coastguard Worker 				       usage_long_opts, NULL)
224*cd60bc56SAndroid Build Coastguard Worker 
225*cd60bc56SAndroid Build Coastguard Worker /* Helper for aligning long_opts array */
226*cd60bc56SAndroid Build Coastguard Worker #define a_argument required_argument
227*cd60bc56SAndroid Build Coastguard Worker 
228*cd60bc56SAndroid Build Coastguard Worker /* Helper for usage_short_opts string constant */
229*cd60bc56SAndroid Build Coastguard Worker #define USAGE_COMMON_SHORT_OPTS "hV"
230*cd60bc56SAndroid Build Coastguard Worker 
231*cd60bc56SAndroid Build Coastguard Worker /* Helper for usage_long_opts option array */
232*cd60bc56SAndroid Build Coastguard Worker #define USAGE_COMMON_LONG_OPTS \
233*cd60bc56SAndroid Build Coastguard Worker 	{"help",      no_argument, NULL, 'h'}, \
234*cd60bc56SAndroid Build Coastguard Worker 	{"version",   no_argument, NULL, 'V'}, \
235*cd60bc56SAndroid Build Coastguard Worker 	{NULL,        no_argument, NULL, 0x0}
236*cd60bc56SAndroid Build Coastguard Worker 
237*cd60bc56SAndroid Build Coastguard Worker /* Helper for usage_opts_help array */
238*cd60bc56SAndroid Build Coastguard Worker #define USAGE_COMMON_OPTS_HELP \
239*cd60bc56SAndroid Build Coastguard Worker 	"Print this help and exit", \
240*cd60bc56SAndroid Build Coastguard Worker 	"Print version and exit", \
241*cd60bc56SAndroid Build Coastguard Worker 	NULL
242*cd60bc56SAndroid Build Coastguard Worker 
243*cd60bc56SAndroid Build Coastguard Worker /* Helper for getopt case statements */
244*cd60bc56SAndroid Build Coastguard Worker #define case_USAGE_COMMON_FLAGS \
245*cd60bc56SAndroid Build Coastguard Worker 	case 'h': usage(NULL); \
246*cd60bc56SAndroid Build Coastguard Worker 	case 'V': util_version(); \
247*cd60bc56SAndroid Build Coastguard Worker 	case '?': usage("unknown option");
248*cd60bc56SAndroid Build Coastguard Worker 
249*cd60bc56SAndroid Build Coastguard Worker #endif /* UTIL_H */
250