return p;
 }
+
+char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints)
+{
+       /*
+        * FIXME: replace this with an expression using log10() when we
+        * find a suitable implementation, maybe the one in the dvb drivers...
+        *
+        * "%s == %d || " = log10(MAXINT) * 2 + 8 chars for the operators
+        */
+       size_t size = nints * 28 + 1; /* \0 */
+       size_t i, printed = 0;
+       char *expr = malloc(size);
+
+       if (expr) {
+               const char *or_and = "||", *eq_neq = "==";
+               char *e = expr;
+
+               if (!in) {
+                       or_and = "&&";
+                       eq_neq = "!=";
+               }
+
+               for (i = 0; i < nints; ++i) {
+                       if (printed == size)
+                               goto out_err_overflow;
+
+                       if (i > 0)
+                               printed += snprintf(e + printed, size - printed, " %s ", or_and);
+                       printed += scnprintf(e + printed, size - printed,
+                                            "%s %s %d", var, eq_neq, ints[i]);
+               }
+       }
+
+       return expr;
+
+out_err_overflow:
+       free(expr);
+       return NULL;
+}
 
 int lzma_decompress_to_file(const char *input, int output_fd);
 #endif
 
+char *asprintf_expr_inout_ints(const char *var, bool in, size_t nints, int *ints);
+
+static inline char *asprintf_expr_in_ints(const char *var, size_t nints, int *ints)
+{
+       return asprintf_expr_inout_ints(var, true, nints, ints);
+}
+
+static inline char *asprintf_expr_not_in_ints(const char *var, size_t nints, int *ints)
+{
+       return asprintf_expr_inout_ints(var, false, nints, ints);
+}
+
 #endif /* GIT_COMPAT_UTIL_H */