1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/*
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is free software; you can redistribute it and/or
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * modify it under the terms of the GNU Lesser General Public
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * License as published by the Free Software Foundation;
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * version 2.1 of the License (not later!)
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This program is distributed in the hope that it will be useful,
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * but WITHOUT ANY WARRANTY; without even the implied warranty of
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * GNU Lesser General Public License for more details.
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * You should have received a copy of the GNU Lesser General Public
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * License along with this program; if not,  see <http://www.gnu.org/licenses>
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng *
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __UTIL_H
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __UTIL_H
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <ctype.h>
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Can be overridden */
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid die(const char *fmt, ...);
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid *malloc_or_die(unsigned int size);
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid warning(const char *fmt, ...);
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid pr_stat(const char *fmt, ...);
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid vpr_stat(const char *fmt, va_list ap);
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* Always available */
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __die(const char *fmt, ...);
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __warning(const char *fmt, ...);
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __pr_stat(const char *fmt, ...);
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __vdie(const char *fmt, ...);
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __vwarning(const char *fmt, ...);
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid __vpr_stat(const char *fmt, ...);
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define min(x, y) ({				\
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	typeof(x) _min1 = (x);			\
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	typeof(y) _min2 = (y);			\
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	(void) (&_min1 == &_min2);		\
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	_min1 < _min2 ? _min1 : _min2; })
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline char *strim(char *string)
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char *ret;
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!string)
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return NULL;
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while (*string) {
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (!isspace(*string))
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			break;
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		string++;
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	ret = string;
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	string = ret + strlen(ret) - 1;
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while (string > ret) {
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (!isspace(*string))
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			break;
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		string--;
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	string[1] = 0;
67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return ret;
69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline int has_text(const char *text)
72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	if (!text)
74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		return 0;
75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	while (*text) {
77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		if (!isspace(*text))
78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			return 1;
79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		text++;
80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	}
81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return 0;
83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif
86