#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(const char *cmd, file *f){ const char *offset = strstr(cmd, SETTINGS_COMMAND_REPLACE_STR); int count = 0; char *out; char *pos; unsigned long i = 0; while(f->file_name[i]) { if (f->file_name[i] == '\'') { count++; } i++; } out = malloc(strlen(cmd) + 1 + (strlen(f->file_name)+(count*3)) + 3); pos = out; if (offset) { memcpy(pos, cmd, offset - cmd); pos += offset - cmd; } else { memcpy(pos, cmd, strlen(cmd)); pos += strlen(cmd) + 1; pos[-1] = ' '; } *pos = '\''; pos++; i = 0; while(f->file_name[i]) { if (f->file_name[i] == '\'') { *pos++ = '\''; *pos++ = '\\'; *pos++ = '\''; } *pos = f->file_name[i]; pos++; i++; } *pos = '\''; if (offset) { pos[1]= ' '; memcpy(pos + 1, offset+1, strlen(offset+1)); pos[strlen(offset+1)] = '\0'; } else { pos[1] = '\0'; } return out; } char* parse_path(char *path){ int count = 0; char *out; char *pos; unsigned long i = 0; while(path[i]) { if (path[i] == '\'') { count++; } i++; } out = malloc((strlen(path)+(count*3)) + 4); pos = out; pos++; out[0] = '\''; i = 0; while(path[i]) { if (path[i] == '\'') { *pos++ = '\''; *pos++ = '\\'; *pos++ = '\''; } *pos = path[i]; pos++; i++; } pos[0] = '\''; pos[1]= ' '; pos[2] = '\0'; return out; }