From 930fa5dbad7178255bbe1128cec6902a3497fb7e Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Sun, 1 Mar 2026 23:36:33 +0900 Subject: [PATCH] wip --- .gitignore | 2 ++ objs.mk | 3 +++ src/seed.c | 33 +++++++++++++++++++++++++++++++++ src/site.c | 34 ++++++++++++++++++++++++++++++++++ src/taiga.h | 28 ++++++++++++++++++++++++++++ 5 files changed, 100 insertions(+) diff --git a/.gitignore b/.gitignore index b7653c3..18f9c76 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ *.o *.exe /taiga +/build +/site diff --git a/objs.mk b/objs.mk index 851e49b..92b4198 100644 --- a/objs.mk +++ b/objs.mk @@ -26,3 +26,6 @@ src/src_seed.o: src/seed.c OBJS += src/src_site.o src/src_site.o: src/site.c $(CC) $(CFLAGS) -c -o $@ src/site.c +OBJS += src/src_util.o +src/src_util.o: src/util.c + $(CC) $(CFLAGS) -c -o $@ src/util.c diff --git a/src/seed.c b/src/seed.c index aeadcdd..9ed7f55 100644 --- a/src/seed.c +++ b/src/seed.c @@ -1,5 +1,38 @@ #include +static void describe(const char* path, const char* what){ + char space[64]; + int i; + + memset(space, 0, sizeof(space)); + for(i = 0; i < (32 - strlen(path)); i++) space[i] = ' '; + + printf("%s%s# %s\n", path, space, what); +} + int action_seed(int argc, char** argv){ + FILE* f; + + io_mkdir("site", 0755); + io_mkdir("site/content", 0755); + + if((f = fopen("site/skinconf.xml", "w")) == NULL){ + fprintf(stderr, "Failed to open site/skinconf.xml\n"); + return 1; + } + fprintf(f, "\n"); + fprintf(f, "\n"); + fprintf(f, " \n"); + fprintf(f, " Example Co, Ltd.\n"); + fprintf(f, " 2026\n"); + fprintf(f, " https://example.com\n"); + fprintf(f, "\n"); + fclose(f); + + printf("Template project created!\n"); + printf("\n"); + printf("Here is an outline of the generated files:\n"); + describe("site/skinconf.xml", "Skin configuration"); + return 0; } diff --git a/src/site.c b/src/site.c index ddf0010..fa2c1bb 100644 --- a/src/site.c +++ b/src/site.c @@ -1,5 +1,39 @@ #include +static void scan(const char* path){ + char* in = u_strvacat("site/content/", path, NULL); + char* out = u_strvacat("build/", path, NULL); + IO_DIR* dir; + + if((dir = io_opendir(in)) != NULL){ + struct io_dirent* d; + + while((d = io_readdir(dir)) != NULL){ + char* p; + struct io_stat s; + + if(strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) continue; + + p = u_strvacat(in, d->d_name, "/", NULL); + if(io_stat(p, &s) == 0){ + if(IO_S_ISDIR(s.st_mode)){ + scan(p); + } + } + free(p); + } + + io_closedir(dir); + } + + free(out); + free(in); +} + int action_site(int argc, char** argv){ + io_mkdir("build", 0755); + + scan(""); + return 0; } diff --git a/src/taiga.h b/src/taiga.h index 52e1aff..8e29e2d 100644 --- a/src/taiga.h +++ b/src/taiga.h @@ -4,10 +4,35 @@ #include #include #include +#include +#include +#include #ifdef _WIN32 #include +#include #else #include +#include +#endif + +#ifdef _WIN32 +#define io_mkdir(x,y) _mkdir(x) +#define io_chdir(x) _chdir(x) +#define io_stat _stat + +#define IO_S_ISDIR(m) ((m) & _S_IFDIR) +#else +#define io_mkdir mkdir +#define io_chdir chdir +#define io_stat stat + +#define IO_S_ISDIR(m) ((m) & S_IFDIR) + +#define IO_DIR DIR +#define io_dirent dirent +#define io_opendir opendir +#define io_readdir readdir +#define io_closedir closedir #endif /* site.c */ @@ -19,4 +44,7 @@ int action_help(int argc, char** argv); /* seed.c */ int action_seed(int argc, char** argv); +/* util.c */ +char* u_strvacat(const char* str, ...); + #endif