1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "util.h" 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "string.h" 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define K 1024LL 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * perf_atoll() 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Parse (\d+)(b|B|kb|KB|mb|MB|gb|GB|tb|TB) (e.g. "256MB") 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * and return its numeric value 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengs64 perf_atoll(const char *str) 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unsigned int i; 13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng s64 length = -1, unit = 1; 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!isdigit(str[0])) 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (i = 1; i < strlen(str); i++) { 19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng switch (str[i]) { 20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'B': 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'b': 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'K': 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (str[i + 1] != 'B') 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto kilo; 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'k': 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (str[i + 1] != 'b') 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengkilo: 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unit = K; 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'M': 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (str[i + 1] != 'B') 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto mega; 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'm': 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (str[i + 1] != 'b') 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengmega: 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unit = K * K; 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'G': 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (str[i + 1] != 'B') 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto giga; 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'g': 51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (str[i + 1] != 'b') 52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenggiga: 54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unit = K * K * K; 55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 'T': 57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (str[i + 1] != 'B') 58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto tera; 61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case 't': 62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (str[i + 1] != 'b') 63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengtera: 65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unit = K * K * K * K; 66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng case '\0': /* only specified figures */ 68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng unit = 1; 69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng default: 71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!isdigit(str[i])) 72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out_err; 73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng length = atoll(str) * unit; 78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out; 79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengout_err: 81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng length = -1; 82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengout: 83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return length; 84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Helper function for splitting a string into an argv-like array. 88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * originally copied from lib/argv_split.c 89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic const char *skip_sep(const char *cp) 91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*cp && isspace(*cp)) 93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cp++; 94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return cp; 96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic const char *skip_arg(const char *cp) 99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*cp && !isspace(*cp)) 101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng cp++; 102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return cp; 104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic int count_argc(const char *str) 107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int count = 0; 109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*str) { 111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng str = skip_sep(str); 112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*str) { 113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng count++; 114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng str = skip_arg(str); 115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return count; 119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * argv_free - free an argv 123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @argv - the argument vector to be freed 124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Frees an argv and the strings it points to. 126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid argv_free(char **argv) 128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char **p; 130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (p = argv; *p; p++) 131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(*p); 132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng free(argv); 134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * argv_split - split a string at whitespace, returning an argv 138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @str: the string to be split 139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @argcp: returned argument count 140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Returns an array of pointers to strings which are split out from 142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @str. This is performed by strictly splitting on white-space; no 143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * quote processing is performed. Multiple whitespace characters are 144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * considered to be a single argument separator. The returned array 145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * is always NULL-terminated. Returns NULL on memory allocation 146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * failure. 147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengchar **argv_split(const char *str, int *argcp) 149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int argc = count_argc(str); 151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char **argv = zalloc(sizeof(*argv) * (argc+1)); 152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char **argvp; 153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (argv == NULL) 155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto out; 156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (argcp) 158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *argcp = argc; 159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng argvp = argv; 161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*str) { 163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng str = skip_sep(str); 164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*str) { 166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng const char *p = str; 167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng char *t; 168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng str = skip_arg(str); 170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng t = strndup(p, str-p); 172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (t == NULL) 173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto fail; 174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *argvp++ = t; 175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *argvp = NULL; 178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengout: 180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return argv; 181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfail: 183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng argv_free(argv); 184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return NULL; 185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* Character class matching */ 188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic bool __match_charclass(const char *pat, char c, const char **npat) 189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng bool complement = false, ret = true; 191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*pat == '!') { 193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng complement = true; 194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pat++; 195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*pat++ == c) /* First character is special */ 197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto end; 198e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 199e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*pat && *pat != ']') { /* Matching */ 200e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*pat == '-' && *(pat + 1) != ']') { /* Range */ 201e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*(pat - 1) <= c && c <= *(pat + 1)) 202e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto end; 203e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*(pat - 1) > *(pat + 1)) 204e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto error; 205e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pat += 2; 206e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else if (*pat++ == c) 207e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto end; 208e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 209e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!*pat) 210e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto error; 211e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret = false; 212e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 213e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengend: 214e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*pat && *pat != ']') /* Searching closing */ 215e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pat++; 216e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!*pat) 217e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng goto error; 218e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *npat = pat + 1; 219e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return complement ? !ret : ret; 220e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 221e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengerror: 222e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return false; 223e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 224e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 225e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* Glob/lazy pattern matching */ 226e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic bool __match_glob(const char *str, const char *pat, bool ignore_space) 227e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 228e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*str && *pat && *pat != '*') { 229e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (ignore_space) { 230e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* Ignore spaces for lazy matching */ 231e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (isspace(*str)) { 232e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng str++; 233e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng continue; 234e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 235e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (isspace(*pat)) { 236e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pat++; 237e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng continue; 238e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 239e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 240e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*pat == '?') { /* Matches any single character */ 241e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng str++; 242e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pat++; 243e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng continue; 244e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else if (*pat == '[') /* Character classes/Ranges */ 245e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (__match_charclass(pat + 1, *str, &pat)) { 246e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng str++; 247e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng continue; 248e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else 249e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return false; 250e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else if (*pat == '\\') /* Escaped char match as normal char */ 251e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pat++; 252e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*str++ != *pat++) 253e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return false; 254e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 255e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* Check wild card */ 256e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (*pat == '*') { 257e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*pat == '*') 258e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pat++; 259e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!*pat) /* Tail wild card matches all */ 260e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return true; 261e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*str) 262e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (__match_glob(str++, pat, ignore_space)) 263e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return true; 264e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 265e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return !*str && !*pat; 266e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 267e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 268e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 269e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * strglobmatch - glob expression pattern matching 270e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @str: the target string to match 271e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @pat: the pattern string to match 272e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 273e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * This returns true if the @str matches @pat. @pat can includes wildcards 274e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * ('*','?') and character classes ([CHARS], complementation and ranges are 275e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * also supported). Also, this supports escape character ('\') to use special 276e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * characters as normal character. 277e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 278e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Note: if @pat syntax is broken, this always returns false. 279e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 280e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengbool strglobmatch(const char *str, const char *pat) 281e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 282e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return __match_glob(str, pat, false); 283e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 284e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 285e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/** 286e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * strlazymatch - matching pattern strings lazily with glob pattern 287e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @str: the target string to match 288e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * @pat: the pattern string to match 289e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 290e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * This is similar to strglobmatch, except this ignores spaces in 291e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * the target string. 292e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 293e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengbool strlazymatch(const char *str, const char *pat) 294e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 295e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return __match_glob(str, pat, true); 296e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 297