You can utilize macros to generate code similar to your:
#include <stdio.h>
#define TEST_FIRST_1(arr, c0) ((c0) == *(arr))
#define TEST_FIRST_2(arr, c0, ...) (TEST_FIRST_1(arr, c0) && TEST_FIRST_1((arr) + 1, __VA_ARGS__))
#define TEST_FIRST_3(arr, c0, ...) (TEST_FIRST_1(arr, c0) && TEST_FIRST_2((arr) + 1, __VA_ARGS__))
#define TEST_FIRST_4(arr, c0, ...) (TEST_FIRST_1(arr, c0) && TEST_FIRST_3((arr) + 1, __VA_ARGS__))
#define TEST_FIRST_5(arr, c0, ...) (TEST_FIRST_1(arr, c0) && TEST_FIRST_4((arr) + 1, __VA_ARGS__))
/* continue, if need */
static unsigned char data[30] = {
1,2,3,4,5,6,7,8,9,10,11,12,13,
};
int main(int argc, char **argv)
{
/* true cases */
printf("%d\n", TEST_FIRST_1(data, 1));
printf("%d\n", TEST_FIRST_2(data, 1, 2));
printf("%d\n", TEST_FIRST_3(data, 1, 2, 3));
printf("%d\n", TEST_FIRST_4(data, 1, 2, 3, 4));
printf("%d\n", TEST_FIRST_5(data, 1, 2, 3, 4, 5));
/* false cases */
printf("%d\n", TEST_FIRST_5(data, 0, 0, 0, 0, 0));
printf("%d\n", TEST_FIRST_4(data, 0, 0, 0, 0));
printf("%d\n", TEST_FIRST_3(data, 0, 0, 0));
return 0;
}
It may appear to be not clean at first look, but anyway doesn't lead to creating of an extra string literals for pattern to compare with.