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