#include #include #define concat(out, s1, s2, _free) { \ concat## _free(out, s1, s2); \ } #define concat0(out, s1, s2) \ char *result = malloc(strlen(s1) + strlen(s2) + 1); \ memcpy(result, s1, strlen(s1)); \ memcpy(result + strlen(s1), s2, strlen(s2) + 1); \ out = result; #define concat1(out, s1, s2) \ char *result = malloc(strlen(s1) + strlen(s2) + 1); \ memcpy(result, s1, strlen(s1)); \ memcpy(result + strlen(s1), s2, strlen(s2) + 1); \ free(s1); \ out = result; #define concat2(out, s1, s2) \ char *result = malloc(strlen(s1) + strlen(s2) + 1); \ memcpy(result, s1, strlen(s1)); \ memcpy(result + strlen(s1), s2, strlen(s2) + 1); \ free(s2); \ out = result; #define concat3(out, s1, s2) \ char *result = malloc(strlen(s1) + strlen(s2) + 1); \ memcpy(result, s1, strlen(s1)); \ memcpy(result + strlen(s1), s2, strlen(s2) + 1); \ free(s1); \ free(s2); \ out = result; char* smartstrcasestr(const char *haystack, const char *needle){ char smart = 0; char *ret; char passes = 0; while (*needle) { if (*needle >= 'A' && *needle <= 'Z') { smart = 1; break; } passes++; needle++; } needle -= passes; if (smart == 0) { char *needle_case = malloc(strlen(needle)+1); memcpy(needle_case, needle, strlen(needle)+1); passes = 0; while (*needle_case) { *needle_case = *needle_case | ' '; needle_case++; passes++; } needle_case -= passes; char *haystack_case = malloc(strlen(haystack)+1); memcpy(haystack_case, haystack, strlen(haystack)+1); passes = 0; while (*haystack_case) { *haystack_case = *haystack_case | ' '; haystack_case++; passes++; } haystack_case -= passes; ret = strstr(haystack_case, needle_case); free(needle_case); free(haystack_case); } else { ret = strstr(haystack, needle); } return ret; }