mirror of
https://gittea.dev/nova/th.git
synced 2026-01-30 08:40:10 -05:00
109 lines
2.4 KiB
C
109 lines
2.4 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#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;
|
|
|
|
}
|