mirror of
https://github.com/X11Libre/xf86-input-libinput.git
synced 2026-03-25 18:08:39 +00:00
Compare commits
15 Commits
xlibre-xf8
...
submit/uti
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d30a76fb1 | ||
|
|
7d617d1150 | ||
|
|
2146a29bdf | ||
|
|
64def2e59a | ||
|
|
8a743e7740 | ||
|
|
87dc6b6a3e | ||
|
|
110f454c1e | ||
|
|
bd7f165019 | ||
|
|
49ee2103a1 | ||
|
|
318a6119a8 | ||
|
|
6465d3cae8 | ||
|
|
94cfaa6b2d | ||
|
|
d941ac25f1 | ||
|
|
0ef9a59835 | ||
|
|
c77c82d92c |
@@ -59,36 +59,6 @@ next_word(const char **state, size_t *len, const char *separators)
|
||||
return next;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a null-terminated string array with the contents of argv
|
||||
* duplicated.
|
||||
*
|
||||
* Use strv_free() to free the array.
|
||||
*
|
||||
* @return A null-terminated string array or NULL on errors
|
||||
*/
|
||||
char**
|
||||
strv_from_argv(int argc, char **argv)
|
||||
{
|
||||
char **strv = NULL;
|
||||
|
||||
assert(argc >= 0);
|
||||
|
||||
if (argc == 0)
|
||||
return NULL;
|
||||
|
||||
strv = zalloc((argc + 1) * sizeof *strv);
|
||||
for (int i = 0; i < argc; i++) {
|
||||
char *copy = safe_strdup(argv[i]);
|
||||
if (!copy) {
|
||||
strv_free(strv);
|
||||
return NULL;
|
||||
}
|
||||
strv[i] = copy;
|
||||
}
|
||||
return strv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a null-terminated string array with the tokens in the input
|
||||
* string, e.g. "one two\tthree" with a separator list of " \t" will return
|
||||
@@ -142,103 +112,3 @@ strv_from_string(const char *in, const char *separators, size_t *num_elements)
|
||||
|
||||
return strv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a newly allocated string with all elements joined by the
|
||||
* joiner, same as Python's string.join() basically.
|
||||
* A strv of ["one", "two", "three", NULL] with a joiner of ", " results
|
||||
* in "one, two, three".
|
||||
*
|
||||
* An empty strv ([NULL]) returns NULL, same for passing NULL as either
|
||||
* argument.
|
||||
*
|
||||
* @param strv Input string array
|
||||
* @param joiner Joiner between the elements in the final string
|
||||
*
|
||||
* @return A null-terminated string joining all elements
|
||||
*/
|
||||
char *
|
||||
strv_join(char **strv, const char *joiner)
|
||||
{
|
||||
char **s;
|
||||
char *str;
|
||||
size_t slen = 0;
|
||||
size_t count = 0;
|
||||
|
||||
if (!strv || !joiner)
|
||||
return NULL;
|
||||
|
||||
if (strv[0] == NULL)
|
||||
return NULL;
|
||||
|
||||
for (s = strv, count = 0; *s; s++, count++) {
|
||||
slen += strlen(*s);
|
||||
}
|
||||
|
||||
assert(slen < 1000);
|
||||
assert(strlen(joiner) < 1000);
|
||||
assert(count > 0);
|
||||
assert(count < 100);
|
||||
|
||||
slen += (count - 1) * strlen(joiner);
|
||||
|
||||
str = zalloc(slen + 1); /* trailing \0 */
|
||||
for (s = strv; *s; s++) {
|
||||
strcat(str, *s);
|
||||
--count;
|
||||
if (count > 0)
|
||||
strcat(str, joiner);
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a pointer to the basename within filename.
|
||||
* If the filename the empty string or a directory (i.e. the last char of
|
||||
* filename is '/') NULL is returned.
|
||||
*/
|
||||
const char *
|
||||
safe_basename(const char *filename)
|
||||
{
|
||||
const char *basename;
|
||||
|
||||
if (*filename == '\0')
|
||||
return NULL;
|
||||
|
||||
basename = strrchr(filename, '/');
|
||||
if (basename == NULL)
|
||||
return filename;
|
||||
|
||||
if (*(basename + 1) == '\0')
|
||||
return NULL;
|
||||
|
||||
return basename + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Similar to basename() but returns the trunk only without the (last)
|
||||
* trailing suffix, so that:
|
||||
*
|
||||
* - foo.c returns foo
|
||||
* - foo.a.b returns foo.a
|
||||
* - foo returns foo
|
||||
* - foo/ returns ""
|
||||
*
|
||||
* @return an allocated string representing the trunk name of the file
|
||||
*/
|
||||
char *
|
||||
trunkname(const char *filename)
|
||||
{
|
||||
const char *base = safe_basename(filename);
|
||||
char *suffix;
|
||||
|
||||
if (base == NULL)
|
||||
return safe_strdup("");
|
||||
|
||||
suffix = rindex(base, '.');
|
||||
if (suffix == NULL)
|
||||
return safe_strdup(base);
|
||||
else
|
||||
return strndup(base, suffix-base);
|
||||
}
|
||||
|
||||
@@ -43,120 +43,6 @@
|
||||
|
||||
#include "util-macros.h"
|
||||
|
||||
static inline bool
|
||||
streq(const char *str1, const char *str2)
|
||||
{
|
||||
/* one NULL, one not NULL is always false */
|
||||
if (str1 && str2)
|
||||
return strcmp(str1, str2) == 0;
|
||||
return str1 == str2;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
strneq(const char *str1, const char *str2, int n)
|
||||
{
|
||||
/* one NULL, one not NULL is always false */
|
||||
if (str1 && str2)
|
||||
return strncmp(str1, str2, n) == 0;
|
||||
return str1 == str2;
|
||||
}
|
||||
|
||||
static inline void *
|
||||
zalloc(size_t size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
/* We never need to alloc anything more than 1,5 MB so we can assume
|
||||
* if we ever get above that something's going wrong */
|
||||
if (size > 1536 * 1024)
|
||||
assert(!"bug: internal malloc size limit exceeded");
|
||||
|
||||
p = calloc(1, size);
|
||||
if (!p)
|
||||
abort();
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* strdup guaranteed to succeed. If the input string is NULL, the output
|
||||
* string is NULL. If the input string is a string pointer, we strdup or
|
||||
* abort on failure.
|
||||
*/
|
||||
static inline char*
|
||||
safe_strdup(const char *str)
|
||||
{
|
||||
char *s;
|
||||
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
s = strdup(str);
|
||||
if (!s)
|
||||
abort();
|
||||
return s;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
safe_atoi_base(const char *str, int *val, int base)
|
||||
{
|
||||
char *endptr;
|
||||
long v;
|
||||
|
||||
assert(base == 10 || base == 16 || base == 8);
|
||||
|
||||
errno = 0;
|
||||
v = strtol(str, &endptr, base);
|
||||
if (errno > 0)
|
||||
return false;
|
||||
if (str == endptr)
|
||||
return false;
|
||||
if (*str != '\0' && *endptr != '\0')
|
||||
return false;
|
||||
|
||||
if (v > INT_MAX || v < INT_MIN)
|
||||
return false;
|
||||
|
||||
*val = v;
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
safe_atoi(const char *str, int *val)
|
||||
{
|
||||
return safe_atoi_base(str, val, 10);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
safe_atou_base(const char *str, unsigned int *val, int base)
|
||||
{
|
||||
char *endptr;
|
||||
unsigned long v;
|
||||
|
||||
assert(base == 10 || base == 16 || base == 8);
|
||||
|
||||
errno = 0;
|
||||
v = strtoul(str, &endptr, base);
|
||||
if (errno > 0)
|
||||
return false;
|
||||
if (str == endptr)
|
||||
return false;
|
||||
if (*str != '\0' && *endptr != '\0')
|
||||
return false;
|
||||
|
||||
if ((long)v < 0)
|
||||
return false;
|
||||
|
||||
*val = v;
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
safe_atou(const char *str, unsigned int *val)
|
||||
{
|
||||
return safe_atou_base(str, val, 10);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
safe_atod(const char *str, double *val)
|
||||
{
|
||||
@@ -211,9 +97,7 @@ safe_atod(const char *str, double *val)
|
||||
return true;
|
||||
}
|
||||
|
||||
char **strv_from_argv(int argc, char **argv);
|
||||
char **strv_from_string(const char *in, const char *separator, size_t *num_elements);
|
||||
char *strv_join(char **strv, const char *joiner);
|
||||
|
||||
static inline void
|
||||
strv_free(char **strv) {
|
||||
@@ -271,150 +155,3 @@ out:
|
||||
free(numv);
|
||||
return result;
|
||||
}
|
||||
|
||||
struct key_value_str{
|
||||
char *key;
|
||||
char *value;
|
||||
};
|
||||
|
||||
struct key_value_double {
|
||||
double key;
|
||||
double value;
|
||||
};
|
||||
|
||||
static inline ssize_t
|
||||
kv_double_from_string(const char *string,
|
||||
const char *pair_separator,
|
||||
const char *kv_separator,
|
||||
struct key_value_double **result_out)
|
||||
|
||||
{
|
||||
struct key_value_double *result = NULL;
|
||||
|
||||
if (!pair_separator || pair_separator[0] == '\0' ||
|
||||
!kv_separator || kv_separator[0] == '\0')
|
||||
return -1;
|
||||
|
||||
size_t npairs;
|
||||
char **pairs = strv_from_string(string, pair_separator, &npairs);
|
||||
if (!pairs || npairs == 0)
|
||||
goto error;
|
||||
|
||||
result = zalloc(npairs * sizeof *result);
|
||||
|
||||
for (size_t idx = 0; idx < npairs; idx++) {
|
||||
char *pair = pairs[idx];
|
||||
size_t nelem;
|
||||
char **kv = strv_from_string(pair, kv_separator, &nelem);
|
||||
double k, v;
|
||||
|
||||
if (!kv || nelem != 2 ||
|
||||
!safe_atod(kv[0], &k) ||
|
||||
!safe_atod(kv[1], &v)) {
|
||||
strv_free(kv);
|
||||
goto error;
|
||||
}
|
||||
|
||||
result[idx].key = k;
|
||||
result[idx].value = v;
|
||||
|
||||
strv_free(kv);
|
||||
}
|
||||
|
||||
strv_free(pairs);
|
||||
|
||||
*result_out = result;
|
||||
|
||||
return npairs;
|
||||
|
||||
error:
|
||||
strv_free(pairs);
|
||||
free(result);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Strip any of the characters in what from the beginning and end of the
|
||||
* input string.
|
||||
*
|
||||
* @return a newly allocated string with none of "what" at the beginning or
|
||||
* end of string
|
||||
*/
|
||||
static inline char *
|
||||
strstrip(const char *input, const char *what)
|
||||
{
|
||||
char *str, *last;
|
||||
|
||||
str = safe_strdup(&input[strspn(input, what)]);
|
||||
|
||||
last = str;
|
||||
|
||||
for (char *c = str; *c != '\0'; c++) {
|
||||
if (!strchr(what, *c))
|
||||
last = c + 1;
|
||||
}
|
||||
|
||||
*last = '\0';
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if str ends in suffix, false otherwise. If the suffix is the
|
||||
* empty string, strendswith() always returns false.
|
||||
*/
|
||||
static inline bool
|
||||
strendswith(const char *str, const char *suffix)
|
||||
{
|
||||
size_t slen = strlen(str);
|
||||
size_t suffixlen = strlen(suffix);
|
||||
size_t offset;
|
||||
|
||||
if (slen == 0 || suffixlen == 0 || suffixlen > slen)
|
||||
return false;
|
||||
|
||||
offset = slen - suffixlen;
|
||||
return strneq(&str[offset], suffix, suffixlen);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
strstartswith(const char *str, const char *prefix)
|
||||
{
|
||||
size_t prefixlen = strlen(prefix);
|
||||
|
||||
return prefixlen > 0 ? strneq(str, prefix, strlen(prefix)) : false;
|
||||
}
|
||||
|
||||
const char *
|
||||
safe_basename(const char *filename);
|
||||
|
||||
char *
|
||||
trunkname(const char *filename);
|
||||
|
||||
/**
|
||||
* Return a copy of str with all % converted to %% to make the string
|
||||
* acceptable as printf format.
|
||||
*/
|
||||
static inline char *
|
||||
str_sanitize(const char *str)
|
||||
{
|
||||
if (!str)
|
||||
return NULL;
|
||||
|
||||
if (!strchr(str, '%'))
|
||||
return strdup(str);
|
||||
|
||||
size_t slen = min(strlen(str), 512);
|
||||
char *sanitized = zalloc(2 * slen + 1);
|
||||
const char *src = str;
|
||||
char *dst = sanitized;
|
||||
|
||||
for (size_t i = 0; i < slen; i++) {
|
||||
if (*src == '%')
|
||||
*dst++ = '%';
|
||||
*dst++ = *src++;
|
||||
}
|
||||
*dst = '\0';
|
||||
|
||||
return sanitized;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user