elemental-on-terminal/src/command.c

117 lines
No EOL
2.3 KiB
C

#include "map.h"
#include <ctype.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUF_LENGTH 1024
#define MAX_COMBO_LENGTH 1024
int fix_delim(char *command, char *needle) {
char *delim = strstr(command, needle);
if (!delim)
return 0;
delim[0] = ';';
return 1;
}
int sort_comp(const void *a, const void *b) {
return strcmp(*(char **)a, *(char **)b);
}
#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || \
(defined(__APPLE__) && defined(__MACH__)))
int inv_handler(const void *key, unsigned long size, unsigned long val,
void *usr)
#else
int inv_handler(const void *key, unsigned long long size,
unsigned long long val, void *usr)
#endif
{
if (val == 0)
return 0;
char *key2 = (char *)key;
if (key2[strlen(key2) - 1] == '\n') {
printf("- %s", (char *)key);
} else {
printf("- %s\n", (char *)key);
}
return 1;
}
int slash_command(char *command, hashmap *inv) {
if (command[0] == '/') {
command++;
} else {
return 0;
}
if (strcmp(command, "inv\n") == 0) {
printf("Your inventory:\n");
hashmap_iterate(inv, inv_handler, "inv");
}
return 1;
}
int get_command(char *command, char *command_re, char **sort_tmp) {
while (1) {
int get_out = 0;
get_out |= fix_delim(command, "+");
get_out |= fix_delim(command, ",");
if (!get_out)
break;
}
if (command[0] == ';') {
command++;
}
int cl = strlen(command);
if (cl < 2)
return 0;
command[cl - 1] = '\0';
for (int i = 0; i < cl - 1; i++) {
command[i] = tolower(command[i]);
}
sort_tmp[0] = command;
int combos = 0;
for (int i = 1; i < MAX_COMBO_LENGTH; i++) {
combos = i;
sort_tmp[i] = strstr(sort_tmp[i - 1], ";");
if (sort_tmp[i] == 0 || sort_tmp[i] == sort_tmp[i - 1])
break;
if (strlen(sort_tmp[i]) < 2) {
sort_tmp[i][0] = '\0';
break;
}
sort_tmp[i][0] = '\0';
sort_tmp[i]++;
}
qsort(sort_tmp, combos, sizeof(char *), sort_comp);
char *command_re_tmp = command_re;
for (int i = 0; i < combos; i++) {
if (i != 0) {
command_re_tmp[0] = ';';
command_re_tmp++;
}
char *last = sort_tmp[i];
strcpy(command_re_tmp, last);
command_re_tmp += strlen(last);
}
return combos;
}