This commit is contained in:
2025-07-28 12:31:40 -04:00
parent 4a9c1f17b7
commit a9da6ecfee
6 changed files with 131 additions and 133 deletions

BIN
c-out/bin/yait Executable file

Binary file not shown.

BIN
c-out/obj/main.o Normal file

Binary file not shown.

BIN
c-out/obj/yait.o Normal file

Binary file not shown.

4
config.mak Normal file
View File

@@ -0,0 +1,4 @@
PREFIX=/usr/bin/
CFLAGS=-Wall -Wextra -O2
LDFLAGS=
CC=gcc

35
yait/debug.h Normal file
View File

@@ -0,0 +1,35 @@
#ifndef DEBUG_H
#define DEBUG_H
#ifdef DEBUG
#define on_error(msg, code) \
if (err) \
{ \
fprintf (stderr, "\n"); \
printfn (msg ": %s", strerror (err)); \
return code; \
}
#else
#define on_error(msg, code) \
if (err) \
{ \
printfn (msg ": %s", strerror (err)); \
return code; \
}
#endif
#ifdef DEBUG
#define debug(fmt, ...) \
fprintf (stderr, "\e[0;32m[%8d]\e[0;33m " fmt "\e[0m\n", __LINE__, \
##__VA_ARGS__)
#define debugc(fmt, ...) \
fprintf (stderr, "\e[0;32m[%8d]\e[0;33m " fmt "... \e[0m", __LINE__, \
##__VA_ARGS__)
#define done fprintf (stderr, "done.\n")
#else
#define debug(fmt, ...) ((void)0)
#define debugc(fmt, ...) ((void)0)
#define done ((void)0)
#endif
#endif // DEBUG_H

View File

@@ -23,6 +23,7 @@
#include "../core/standard.h"
#include "contents.h"
#include "format.h"
#include "debug.h"
#define DEFAULT_USER_NAME "unknown"
#define DEFAULT_PROJECT_NAME "Project"
@@ -30,55 +31,13 @@
#define DEFAULT_GIT_INIT true
#define DEFAULT_CLANG_FORMAT true
#define print_option(option, description) \
printf (" %-20s %-20s\n", option, description)
#ifdef DEBUG
#define on_error(msg, code) \
if (err) \
{ \
fprintf (stderr, "\n"); \
printfn (msg ": %s", strerror (err)); \
return code; \
}
#else
#define on_error(msg, code) \
if (err) \
{ \
printfn (msg ": %s", strerror (err)); \
return code; \
}
#endif
#ifdef DEBUG
#define debug(fmt, ...) \
fprintf (stderr, "\e[0;32m[%8d]\e[0;33m " fmt "\e[0m\n", __LINE__, \
##__VA_ARGS__)
#define debugc(fmt, ...) \
fprintf (stderr, "\e[0;32m[%8d]\e[0;33m " fmt "... \e[0m", __LINE__, \
##__VA_ARGS__)
#define done fprintf (stderr, "done.\n")
#else
#define debug(fmt, ...)
#define debugc(fmt, ...)
#define done
#endif
int create_license (format_t);
int create_configure ();
int create_makefile (format_t);
int create_project (format_t);
int generate_source_code (format_t);
int maybe_apply_clang_format (format_t);
int reset_path_ ();
int sanitize (format_t *);
int setup_git (format_t);
int parse_arguments (format_t *, int, char **);
/* This is to keep track of how deep we are within
the project tree. This is used in reset_path */
int depth;
#define print_option(option, description) \
printf (" %-20s %-20s\n", option, description)
void
usage (int status)
{
@@ -102,94 +61,6 @@ usage (int status)
printf (" --version output version information and exit\n");
}
int
main (int argc, char **argv)
{
int err;
if (argc < 2)
{
printfn ("error: not enough arguments.");
return 1;
}
err = initialize_main (&argc, &argv);
err = parse_standard_options (usage, argc, argv);
if (err && err != HELP_REQUESTED)
{
printfn ("error: %s", strerror (err));
return err;
}
format_t conf = { 0 };
// TODO: Argument Parsing
conf.project = "sample_project";
conf.name = "vx_clutch";
if (!conf.name)
{
struct passwd *pw = getpwuid (getuid ());
conf.name = (pw && pw->pw_name) ? pw->pw_name : DEFAULT_USER_NAME;
}
conf.flag.git = DEFAULT_GIT_INIT;
conf.flag.clang_format = DEFAULT_CLANG_FORMAT;
conf.license = DEFAULT_LICENSE;
err = create_project (conf);
if (!err)
debug ("project made successfully");
else
debug ("something when wrong");
return err;
}
int
create_project (format_t fmt)
{
int err;
debugc ("sanitize");
err = sanitize (&fmt);
on_error ("failed to sanitize format", err);
done;
debugc ("take %s", fmt.project);
err = create_and_enter_directory (fmt.project);
depth = 0;
on_error ("failed to create or enter directory", err);
done;
// debug ("create licenseing");
// err = create_license_if_needed (fmt);
// on_error ("failed to create license", err);
debugc ("create makefile");
err = create_makefile (fmt);
on_error ("failed to create Makefile", err);
done;
debug ("setup git");
err = setup_git (fmt);
if (err)
printfn ("warning: git initialization failed: %s", strerror (err));
debug ("create .clang-format");
err = maybe_apply_clang_format (fmt);
if (err)
printfn ("warning: clang-format setup failed: %s", strerror (err));
debugc ("generate source code");
err = generate_source_code (fmt);
on_error ("failed to generate source code", err);
done;
return 0;
}
/* This macro exist purely because I like how it looks. */
#define reset_path reset_path_ ()
int
@@ -405,3 +276,91 @@ parse_arguments (format_t *conf, int argc, char **argv)
}
return 0;
}
int
create_project (format_t fmt)
{
int err;
debugc ("sanitize");
err = sanitize (&fmt);
on_error ("failed to sanitize format", err);
done;
debugc ("take %s", fmt.project);
err = create_and_enter_directory (fmt.project);
depth = 0;
on_error ("failed to create or enter directory", err);
done;
// debug ("create licenseing");
// err = create_license_if_needed (fmt);
// on_error ("failed to create license", err);
debugc ("create makefile");
err = create_makefile (fmt);
on_error ("failed to create Makefile", err);
done;
debug ("setup git");
err = setup_git (fmt);
if (err)
printfn ("warning: git initialization failed: %s", strerror (err));
debug ("create .clang-format");
err = maybe_apply_clang_format (fmt);
if (err)
printfn ("warning: clang-format setup failed: %s", strerror (err));
debugc ("generate source code");
err = generate_source_code (fmt);
on_error ("failed to generate source code", err);
done;
return 0;
}
int
main (int argc, char **argv)
{
int err;
if (argc < 2)
{
printfn ("error: not enough arguments.");
return 1;
}
err = initialize_main (&argc, &argv);
err = parse_standard_options (usage, argc, argv);
if (err && err != HELP_REQUESTED)
{
printfn ("error: %s", strerror (err));
return err;
}
format_t conf = { 0 };
// TODO: Argument Parsing
conf.project = "sample_project";
conf.name = "vx_clutch";
if (!conf.name)
{
struct passwd *pw = getpwuid (getuid ());
conf.name = (pw && pw->pw_name) ? pw->pw_name : DEFAULT_USER_NAME;
}
conf.flag.git = DEFAULT_GIT_INIT;
conf.flag.clang_format = DEFAULT_CLANG_FORMAT;
conf.license = DEFAULT_LICENSE;
err = create_project (conf);
if (!err)
debug ("project made successfully");
else
debug ("something when wrong");
return err;
}