sw-battle-test-c

Interesting test task in C instead of C++
git clone git://bsandro.tech/sw-battle-test-c
Log | Files | Refs | README

commit a4e8747785682a4b4f016afe80fe9ec5d3231a8f
parent d37c72dd5a988c4215f5264d071bcf78e05f9c8f
Author: bsandro <email@bsandro.tech>
Date:   Wed, 30 Sep 2026 00:57:13 +0300

parser calls actual commands

Diffstat:
Mcommands/CREATE_MAP.c | 15+++++++++++++--
Mcore/command.h | 7+++++--
Mcore/parser.c | 33++++++++++++++++++++++++++++++---
Mcore/parser.h | 2+-
Mmain.c | 31+++----------------------------
5 files changed, 52 insertions(+), 36 deletions(-)

diff --git a/commands/CREATE_MAP.c b/commands/CREATE_MAP.c @@ -1,5 +1,16 @@ #include "core/command.h" -void cmd_create_map(World *w, int arg1, int arg2) { - printf("create map %d %d\n", arg1, arg2); +static void create_map(World *w, int width, int height) { + printf("create_map(%p,%d,%d)\n", (void *)w, width, height); + Map_Init(&w->map, width, height); + puts("map init ok"); } + +void cmd_create_map(World *w, int argc, char **argv) { + if (argc!=2) { + puts("cmd_create_map() invalid arguments"); + return; + } + create_map(w, atoi(argv[0]), atoi(argv[1])); +} + diff --git a/core/command.h b/core/command.h @@ -1,10 +1,13 @@ #pragma once +#include <stdlib.h> #include <stdio.h> #include "core/world.h" -//typedef void Command_Func(World *w, ...); -typedef void Command_Func(); +#define MAX_CMD_NAME_LEN 64 +#define MAX_CMD_ARG_LEN 8 + +typedef void Command_Func(World *w, int argc, char **argv); typedef struct Command { const char *name; diff --git a/core/parser.c b/core/parser.c @@ -1,14 +1,41 @@ #include <stdio.h> #include <string.h> +#include <stdlib.h> +#include "core/command.h" #include "core/parser.h" +#include "commands/_registry.h" -void try_parse_call(char *line) { - //printf("\n=======\nline: %s\n=======\n", line); +void try_parse_call(World *w, char *line) { char *saveptr = NULL; + char cmd[MAX_CMD_NAME_LEN] = {0}; + int argc = -1; + char **argv = NULL; for (char *src=line;;src=NULL) { char *token=strtok_r(src, " \r\n", &saveptr); if (token==NULL) break; printf(" -> %s", token); + int token_len = strlen(token); + if (argc==-1) { + strncpy(cmd, token, MAX_CMD_NAME_LEN-1); + argc++; + } else { + argc++; + argv = realloc(argv, argc*sizeof(char *)); + if (argv==NULL) puts("!!! realloc error"); + argv[argc-1] = strndup(token, MAX_CMD_ARG_LEN-1); + } } - printf("\n---------\n"); + printf("\n argc: %d\n---------\n", argc); + for (int i=0;i<COMMANDS_COUNT;++i) { + if (strncmp(COMMANDS[i].name, cmd, MAX_CMD_NAME_LEN)==0) { + COMMANDS[i].func(w, argc, argv); + //goto fin; + break; + } + } + // cleanup + for (int i=0;i<argc;++i) { + free(argv[i]); + } + free(argv); } diff --git a/core/parser.h b/core/parser.h @@ -1,3 +1,3 @@ #pragma once -void try_parse_call(char *line); +void try_parse_call(World *w, char *line); diff --git a/main.c b/main.c @@ -3,20 +3,15 @@ #include <string.h> #include "core/world.h" #include "core/parser.h" -#include "commands/_registry.h" #include "systems/actions.h" #include "systems/death.h" -#define MAX_COMMAND_SIZE 32 - int main(int argc, char **argv) { World w; - Map_Init(&w.map, 3, 4); - puts("map init ok"); int turn = 0; World_Add_System(&w, &(System){ .run = actions_run }); World_Add_System(&w, &(System){ .run = death_run }); - puts("world init ok"); + puts("world create ok"); if (argc>1) { FILE *f = fopen(argv[1], "r"); @@ -27,32 +22,12 @@ int main(int argc, char **argv) { while ((slen=getline(&line, &linesize, f))!=-1) { if (slen==1) continue; //printf("[%zd] %s", slen, line); - try_parse_call(line); -/* - printf("\n=======\nline: %s\n=======\n", line); - char *saveptr = NULL; - for (char *src=line;;src=NULL) { - char *token=strtok_r(src, " \r\n", &saveptr); - if (token==NULL) break; - printf(" -> %s", token); - } - printf("\n---------\n"); -*/ + try_parse_call(&w, line); } free(line); fclose(f); - for (int i=0;i<COMMANDS_COUNT;++i) { - if (strncmp(COMMANDS[i].name, "CREATE_MAP", MAX_COMMAND_SIZE)==0) { - COMMANDS[i].func(&w, 10, 20); - //goto fin; - break; - } - } } - //puts("unknown command"); - return 0; -fin: while (World_Run_Systems(&w)) { printf("[turn %3d] world systems run ok\n", turn++); // safeguard @@ -62,6 +37,6 @@ fin: } } - puts("ok"); + puts("simulation ok"); return 0; }