#include #include #include #include "config.h" #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; } char* parse_cmd_char(const char *cmd, const char *path){ char *index = strstr(cmd, SETTINGS_COMMAND_REPLACE_STR); char *out; if (index) { out = malloc(strlen(cmd) + 1 + strlen(path) + 1); char *o = out; memcpy(out, cmd, index - cmd); o += index-cmd; *o = '\"'; o++; memcpy(o, path, strlen(path)); o += strlen(path); *o = '\"'; memcpy(o+1, index + 1, strlen(index+1)); *(o+strlen(index+1)+1) = '\0'; return out; } else { concat(out, cmd, " ./\"", 0); concat(out, out, path, 1); concat(out, out, "\"", 1); } return out; }