commit a4e8747785682a4b4f016afe80fe9ec5d3231a8f
parent d37c72dd5a988c4215f5264d071bcf78e05f9c8f
Author: bsandro <email@bsandro.tech>
Date: Wed, 30 Sep 2026 00:57:13 +0300
parser calls actual commands
Diffstat:
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;
}