From 50e964d3a06171570bff92d79afbb42121ed23cd Mon Sep 17 00:00:00 2001 From: vx-clutch Date: Fri, 18 Jul 2025 15:44:30 -0400 Subject: [PATCH] save --- core/e.c | 14 ------------ core/e.h | 14 ------------ core/file.c | 38 +++++++++---------------------- core/file.h | 7 +++--- core/standard.c | 4 ++-- yait/main.c | 59 +++++++++++++++++++++++++++++++++++++++++++++---- 6 files changed, 71 insertions(+), 65 deletions(-) delete mode 100644 core/e.c delete mode 100644 core/e.h diff --git a/core/e.c b/core/e.c deleted file mode 100644 index 59e307d..0000000 --- a/core/e.c +++ /dev/null @@ -1,14 +0,0 @@ -#include "e.h" -#include "print.h" -#include - -error_t -unwrap (error_t err) -{ - if (!err.null) - { - printfn ("error: %s", err.src); - exit (err.status); - } - return err; -} diff --git a/core/e.h b/core/e.h deleted file mode 100644 index 0dcbf05..0000000 --- a/core/e.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ERROR_H -#define ERROR_H - -#include - -typedef struct { - bool null; - int status; - const char *src; -} error_t; - -error_t unwrap(error_t); - -#endif diff --git a/core/file.c b/core/file.c index 7180ea4..bd79a6c 100644 --- a/core/file.c +++ b/core/file.c @@ -1,25 +1,17 @@ #include "file.h" -#include "e.h" #include #include #include -#include #include #include -error_t +int touch (char *path, char *format, ...) { - error_t err = { 0 }; - err.null = true; - FILE *fp = fopen (path, "w"); if (!fp) { - err.null = false; - err.status = errno; - err.src = strerror (errno); - return err; + return 0; } else @@ -31,15 +23,12 @@ touch (char *path, char *format, ...) } fclose (fp); - return err; + return 0; } -error_t +int dir (char *format, ...) { - error_t err = { 0 }; - err.null = true; // success by default - va_list args; va_start (args, format); @@ -50,28 +39,23 @@ dir (char *format, ...) if (mkdir (path, 0777) < 0) { - err.null = false; - err.status = errno; - err.src = strerror (errno); + return errno; } - return err; + return 0; } -error_t +int take (const char *dirname) { - error_t err = dir ("%s", dirname); - if (!err.null) + int err = dir ("%s", dirname); + if (err) { return err; } if (chdir (dirname) != 0) { - err.null = false; - err.status = errno; - err.src = strerror (errno); - return err; + return errno; } - return err; + return 0; } diff --git a/core/file.h b/core/file.h index 3d2f48a..46869af 100644 --- a/core/file.h +++ b/core/file.h @@ -1,12 +1,11 @@ #ifndef FILE_H #define FILE_H -#include "e.h" #include -error_t take(const char *dirname); +int take(const char *dirname); -error_t touch(char *, char *, ...); -error_t dir(char *, ...); +int touch(char *, char *, ...); +int dir(char *, ...); #endif diff --git a/core/standard.c b/core/standard.c index 1224992..4bcf4f5 100644 --- a/core/standard.c +++ b/core/standard.c @@ -5,13 +5,13 @@ #include int -parse_standard_options (void (*usage) (), int argc, char **argv) +parse_standard_options (void (*usage) (int), int argc, char **argv) { for (int i = 1; i < argc; ++i) { if (strcmp (argv[i], "--help") == 0) { - usage (); + usage (0); exit (0); } else if (strcmp (argv[i], "--version") == 0) diff --git a/yait/main.c b/yait/main.c index 3abac26..d212732 100644 --- a/yait/main.c +++ b/yait/main.c @@ -3,14 +3,42 @@ #include "../core/print.h" #include "../core/standard.h" #include "format.h" +#include #include +#include #include #include #include int create (format_t); -void usage () {}; +#define print_option(left, right) \ + printf (" %-20s %-20s" \ + "\n", \ + left, right) + +void +usage (int status) +{ + if (status != 0) + fprintf (stderr, "Try 'yait --help' for more information.\n"); + else + { + printf ("Usage: yait [OPTION]... [PROJECT] (NAME)\n"); + printf ("Creates a C project with opinionated defaults.\nWhen only " + "given first argument it will detect your name\n\n"); + printf ("Mandatory arguments to long options are mandatory for short " + "options too\n"); + print_option ("-l, --license=NAME", + "Set license (gpl, mit, bsd) [default: gpl]"); + print_option ("--use-cpp", "Uses the CPP language instead of C"); + print_option ("--git", "Initialize git repository"); + print_option ("--GNU", + "Adds stand GNU argument parsing to your project"); + printf (" --help\tdisplay the help text and exit\n"); + printf (" --version\toutput version information and exit\n"); + } +} int main (int argc, char **argv) @@ -45,10 +73,10 @@ main (int argc, char **argv) int create (format_t fmt) { - error_t err = take (fmt.project); - if (!err.null) + int err = take (fmt.project); + if (err) { - printfn ("failed to create or enter directory: %s", err.src); + printfn ("failed to create or enter directory: %s", strerror (err)); return 1; } if (fmt.git) @@ -125,6 +153,24 @@ create (format_t fmt) "printf \"LDFLAGS=%%s\\n\" \"$LDFLAGS\" >> config.mak\n" "printf \"CC=%%s\\n\" \"$CC\" >> config.mak\n" "printf \"done\\n\"\n"); + char *mkfile_name; + strcpy(mkfile_name, fmt.project); + for (char *p = mkfile_name; *p; ++p) *p = toupper(*p); + touch ("Makefile", + "prefix = /usr/bin\n\n%s_SRCS := $(wildcard yait/*.c) $(wildcard " + "core/*.c)\n%s_OBJS := $(patsubst " + "yait/%.c,c-out/obj/%.o,$(%s_SRCS))\n\n%s := " + "c-out/bin/yait\n\n-include config.mak\n\nifeq ($(wildcard " + "config.mak),)\nall:\n\t@echo \"File config.mak not found, run " + "configure\"\n\t@exit 1\nelse\n\nall: build $(%s) " + "$(%s_DOC)\n\nbuild:\n\tmkdir -p c-out/bin\n\tmkdir -p " + "c-out/obj\n\nc-out/obj/%.o: yait/%.c\n\t$(CC) $(CFLAGS) -c $< -o " + "$@\n\n$(%s): $(%s_OBJS)\n\t$(CC) $(CFLAGS) -DCOMMIT=$(shell git " + "rev-list --count --all) $^ -o $@\n\n\nendif\n\ninstall:\n\t@echo " + "\"NOT IMPL\"\n\texit 1\n\nuninstall:\n\t@echo \"NOT IMPL\"\n\texit " + "1\n\nclean:\n\trm -rf c-out\n\ndist-clean: clean\n\trm -f " + "config.mak\n\n.PHONY: all clean dist-clean install uninstall build " + "format\n", mkfile_name, mkfile_name, mkfile_name, mkfile_name, mkfile_name, mkfile_name); if (fmt.clang_format) touch (".clang-format", "Language: Cpp\nBasedOnStyle: GNU\n"); switch (fmt.licence) @@ -162,5 +208,10 @@ create (format_t fmt) default: break; } + take (fmt.project); + touch ("main.c", + "#include \n\nint main(void) {\n printf(\"%s: Hello " + "%s!\\n\");\nreturn 0;\n}", + fmt.project, fmt.name); return 0; }