commit a38010ec62158f1d742cf5d48b4781db3422e144
parent 8fb97ffa8fd7e2cec654b5148e7e570e42672f67
Author: vx-clutch <[email protected]>
Date: Fri, 22 Aug 2025 20:51:25 -0400
feat: FASM target
Diffstat:
7 files changed, 106 insertions(+), 58 deletions(-)
diff --git a/Makefile b/Makefile
@@ -17,8 +17,8 @@ all: build $(YAIT)
build:
mkdir -p bin
-$(YAIT): $(YAIT_SRCS)
- $(CC) $(CFLAGS) -Iinclude -DCOMMIT=$(shell git rev-list --count --all) $^ -o $@
+$(YAIT): $(YAIT_SRCS) config.mak
+ $(CC) $(CFLAGS) -Iinclude -DCOMMIT=$(shell git rev-list --count --all) $(YAIT_SRCS) -o $@
endif
diff --git a/TODO b/TODO
@@ -4,7 +4,6 @@ Todo:
* Project formats
* GNU
* FASM
- * POSIX
* LIBRARY
end of file TODO
diff --git a/include/yait.h b/include/yait.h
@@ -22,20 +22,9 @@ typedef struct {
bool linenoise;
} libmap_t;
-typedef enum {
- MIT,
- GPL,
- BSD,
- UNL,
-} licence_t;
-
-typedef enum {
- POSIX,
- SIMPLE,
- GNU,
- LIBRARY,
- FASM,
-} style_t;
+typedef enum { MIT, GPL, BSD, UNL, _LICENCE_COUNT_ } licence_t;
+
+typedef enum { POSIX, SIMPLE, GNU, LIBRARY, FASM, _STYLE_COUNT_ } style_t;
typedef struct {
libmap_t libraries;
diff --git a/src/create_project.c b/src/create_project.c
@@ -6,51 +6,80 @@
* <https://opensource.org/licence/bsd-3-clause>
*/
+#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
+#include <ctype.h>
#include "../include/yait.h"
#include "util.h"
#include "contents.h"
-char buffer[BUFSIZ];
+#define emit_progress_file \
+ fprintf(stderr, "Created files %d\r", a); \
+ a++
int create_project(manifest_t manifest)
{
- mkdir_p(manifest.project);
- chdir(manifest.project);
+ int status, a = 1;
+ char buffer[BUFSIZ];
- if (manifest.style == SIMPLE) {
- /* This only works if the source
- files's root name is the same as the target on all of the Makefile becuase of how it checks for files. */
+ status = mkdir_p(manifest.project);
+ if (status)
+ return 1;
+
+ status = chdir(manifest.project);
+ if (status)
+ return 1;
+
+ switch (manifest.style) {
+ case SIMPLE:
cfprintf(
"Makefile",
".POSIX:\nCC ::= gcc\nCFLAGS ::= -Wall --std=c23 -Wpedantic\n\nall: %s",
manifest.project);
- fprintf(stderr, "Created files 1\r");
+ emit_progress_file;
cfprintf("README", "%s", manifest.project);
- fprintf(stderr, "Created files 2\r");
+ emit_progress_file;
snprintf(buffer, BUFSIZ, "%s.c", manifest.project);
cfprintf(buffer, "");
- fputs("Created files 3, done.\n", stderr);
- /* We exit early because the simple flag is an overridding flag. */
- return 0;
- }
+ fprintf(stderr, "Created files %d, done.\n", a);
+ break;
- cfprintf("Makefile", "");
- cfprintf("configure", configure);
- cfprintf(".clang-format", "");
- cfprintf("README", readme, manifest.name);
- cfprintf("src/main.c", "");
+ case POSIX:
+ cfprintf("Makefile", "");
+ cfprintf("configure", configure);
+ cfprintf(".clang-format", "");
+ cfprintf("README", readme, manifest.name);
+ cfprintf("src/main.c", "");
- snprintf(buffer, BUFSIZ, "include/%s.h", manifest.project);
- cfprintf(buffer, "");
+ snprintf(buffer, BUFSIZ, "include/%s.h", manifest.project);
+ cfprintf(buffer, "");
- snprintf(buffer, BUFSIZ, "man/%s.1", manifest.project);
- cfprintf(buffer, "");
+ snprintf(buffer, BUFSIZ, "man/%s.1", manifest.project);
+ cfprintf(buffer, ".\\\" %s.1 - Manual page for %s",
+ manifest.project, manifest.project);
- cfprintf("doc/WHATNEXT", what_next);
+ cfprintf("doc/WHATNEXT", what_next);
+ break;
+ case FASM:
+ snprintf(buffer, BUFSIZ, "%s.txt", manifest.project);
+ for (int i = 0; buffer[i] != '\0'; ++i)
+ buffer[i] = toupper((unsigned char)buffer[i]);
+ cfprintf(
+ buffer,
+ "<https://github.com/tgrysztar/fasm/blob/master/FASM.TXT>");
+ cfprintf(
+ "SOURCE/main.c",
+ "#include <stdio.h>\n\nint main() {\n\tputs(\"Hei!\");\n\treturn 0;\n}");
+ cfprintf("TOOLS/build.sh",
+ "#!/bin/sh\n\ncc SOURCE/main.c -o %s",
+ manifest.project);
+ break;
+ default:
+ abort();
+ }
return 0;
}
diff --git a/src/main.c b/src/main.c
@@ -24,15 +24,6 @@
#define print_option(option, description) \
printf(" %-20s %-20s\n", option, description)
-char *str_dup(char *s)
-{
- char *new = malloc(strlen(s) + 1);
- if (!new)
- return NULL;
- strcpy(new, s);
- return new;
-}
-
static void usage(int status)
{
if (status != 0) {
@@ -46,8 +37,10 @@ static void usage(int status)
puts("Mandatory arguments to long options are mandatory for short options too");
print_option("--no-git", "Do not inititize git reposity");
print_option("--clang", "Add clang-format files and tooling");
- print_option("-L <licence>", "Set licence");
- print_option("-l <library>", "Add a library");
+ print_option("-L <licence>",
+ "Set licence. This list can be found by passing 'list'");
+ print_option("-l <library>",
+ "Add a library. This list can be found by passing 'list'");
print_option("-n <name>", "Set the name of the project");
print_option(
"--style=<style>",
@@ -68,14 +61,16 @@ static int parse_arguments(manifest_t *conf, int argc, char **argv)
{ 0, 0, 0, 0 } };
// clang-format on
- // TODO(vx-clutch): lL
- while ((opt = getopt_long(argc, argv, "s:gcn", long_opts, NULL)) !=
+ // TODO(vx-clutch): libraries
+ while ((opt = getopt_long(argc, argv, "s:gcn:L:", long_opts, NULL)) !=
-1) {
switch (opt) {
case 's':
if (strcmp(optarg, "list") == 0) {
- fputs("", stderr);
+ puts("posix\nsimple\nGNU\nlib\nfasm");
+ exit(EXIT_SUCCESS);
}
+ conf->style = TOstyle(optarg);
break;
case 'g':
conf->flags.git = false;
@@ -86,6 +81,9 @@ static int parse_arguments(manifest_t *conf, int argc, char **argv)
case 'n':
conf->name = str_dup(optarg);
break;
+ case 'L':
+ conf->licence = TOlicence(optarg);
+ break;
default:
return 1;
}
@@ -161,6 +159,11 @@ int main(int argc, char **argv)
get_name(&manifest.name);
status = create_project(manifest);
+ if (status) {
+ fprintf(stderr, "%s\n", strerror(status));
+ return EXIT_FAILURE;
+ }
+
char buffer[PATH_MAX];
getcwd(buffer, PATH_MAX);
fprintf(stderr, "Created %s at\n %s\n", manifest.project, buffer);
diff --git a/src/util.c b/src/util.c
@@ -1,21 +1,46 @@
#include <string.h>
#include <stdio.h>
#include <getopt.h>
+#include <stdlib.h>
#include "util.h"
#include "../include/yait.h"
-licence_t TOlicence(const char *s)
+licence_t TOlicence(char *s)
{
- if (strcmp(s, "mit"))
+ if (!strcmp(s, "mit"))
return MIT;
- if (strcmp(s, "gpl"))
+ if (!strcmp(s, "gpl"))
return GPL;
- if (strcmp(s, "bsd"))
+ if (!strcmp(s, "bsd"))
return BSD;
return UNL;
}
+style_t TOstyle(char *s)
+{
+ if (!strcmp(s, "posix"))
+ return POSIX;
+ if (!strcmp(s, "simple"))
+ return SIMPLE;
+ if (!strcmp(s, "GNU"))
+ return GNU;
+ if (!strcmp(s, "lib"))
+ return LIBRARY;
+ if (!strcmp(s, "fasm"))
+ return FASM;
+ return SIMPLE;
+}
+
+char *str_dup(char *s)
+{
+ char *new = malloc(strlen(s) + 1);
+ if (!new)
+ return NULL;
+ strcpy(new, s);
+ return new;
+}
+
static char *nextchar;
int getopt_long(int argc, char *const argv[], const char *optstring,
diff --git a/src/util.h b/src/util.h
@@ -3,11 +3,14 @@
#include "../include/yait.h"
-licence_t TOlicence(const char *s);
+licence_t TOlicence(char *s);
+style_t TOstyle(char *s);
int getopt_long(int argc, char *const argv[], const char *optstring,
const struct option *longopts, int *longindex);
+char *str_dup(char *s);
+
int mkdir_p(const char *path);
int cfprintf(const char *path, const char *format, ...);