This commit is contained in:
2025-08-29 16:26:36 -04:00
parent 266c5232e9
commit 13b15cb07f
10 changed files with 166 additions and 550 deletions

View File

@@ -1,2 +1,7 @@
CompileFlags: CompileFlags:
Add: ["--std=c2x", "-xc"] Add: [-std=c23]
Diagnostics:
ClangTidy:
Add: [clang-diagnostic-*]
Remove: []

22
TODO
View File

@@ -1,26 +1,6 @@
VX yait - TODO VX yait - TODO
Todo: Todo:
* Rework interface Vi er Ferdig!
> git (default)
> no-git
> lib
# create AS library
> both
> autotools
> cmake
> make (default)
> bare
> flat
# everything in root
> licence|l
> author
* extra
> extra-build
# extra-build=nob
> extra-tools
# extra-tools=format
# extra-tools=Cleanup
* write touprstr()
end of file TODO end of file TODO

View File

@@ -9,39 +9,30 @@
#ifndef YAIT_H #ifndef YAIT_H
#define YAIT_H #define YAIT_H
typedef struct {
bool git;
bool clang;
bool editor;
} flag_t;
typedef struct {
bool nob;
bool format;
bool cleanup;
} extras_t;
typedef struct {
bool ncurses;
bool raylib;
bool stb;
bool uthash;
bool linenoise;
} libmap_t;
typedef enum { MIT, GPL, BSD, UNL, _LICENCE_COUNT_ } licence_t; typedef enum { MIT, GPL, BSD, UNL, _LICENCE_COUNT_ } licence_t;
typedef enum { POSIX, SIMPLE, GNU, LIBRARY, FASM, _STYLE_COUNT_ } style_t;
typedef struct { typedef struct {
libmap_t libraries;
licence_t licence; licence_t licence;
flag_t flags;
extras_t extras; bool lib;
style_t style; bool exe;
bool git;
bool autotools;
bool cmake;
bool make;
bool bare;
bool flat;
bool open_editor;
struct {
bool nob;
bool clang_format;
bool Cleanup;
} extra;
char *project; char *project;
char *name; char *author;
char *editor; char *editor;
} manifest_t; } manifest_t;

View File

@@ -8,15 +8,11 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h>
#include "../include/yait.h" #include "../include/yait.h"
#include "posix_contents.h"
#include "library_contents.h"
#include "licences/licences.h" #include "licences/licences.h"
#include "util.h" #include "util.h"
@@ -33,162 +29,7 @@ int create_project(manifest_t manifest)
if (status) if (status)
return 1; return 1;
switch (manifest.style) {
case SIMPLE:
cfprintf(
"Makefile",
".POSIX:\nCC ::= gcc\nCFLAGS ::= -Wall --std=c23 -Wpedantic\n\nall: %s",
manifest.project);
cfprintf("README", "%s", manifest.project);
snprintf(buffer, BUFSIZ, "%s.c", manifest.project);
flast = true; flast = true;
cfprintf(buffer, "");
snprintf(buffer, BUFSIZ, "%s.c", manifest.project);
main_source = str_dup(buffer);
break;
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, "man/%s.1", manifest.project);
cfprintf(buffer, ".\\\" %s.1 - Manual page for %s",
manifest.project, manifest.project);
flast = true;
cfprintf("doc/WHATNEXT", what_next);
fprintf(stderr, "Changing permissions 1");
if (chmod("configure", 0755) == -1) {
fprintf(stderr, "\n");
perror("chmod");
return 1;
}
fprintf(stderr, ", done.\n");
main_source = "src/main.c";
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(\"Who's that behind you?\");\n\treturn 0;\n}");
flast = true;
cfprintf("TOOLS/build.sh",
"#!/bin/sh\n\ncc SOURCE/main.c -o %s",
manifest.project);
fprintf(stderr, "Changing permissions 1");
if (chmod("TOOLS/build.sh", 0755) == -1) {
fprintf(stderr, "\n");
perror("chmod");
return 1;
}
fprintf(stderr, ", done.\n");
main_source = "SOURCE/main.c";
break;
case GNU:
cfprintf("AUTHORS", "%s", manifest.name);
cfprintf("INSTALL",
"autoreconf -i\n./configure\nmake\nmake install");
cfprintf("COPYING", "%s", "(undefined)");
cfprintf(
"NEWS",
"%s (0.1) unstable; urgency=low\n\n * Initial release. It compiles!\n - Nothing else.\n",
manifest.project);
cfprintf(
"README",
"This is the README file for the %s distribution.\n %s does a thing.",
manifest.project, manifest.project);
cfprintf(
"configure.ac",
"AC_INIT([%s], [0.1], [you@example.com])\nAM_INIT_AUTOMAKE([-Wall -Wextra foreign])\nAC_PROG_CC\nAC_CONFIG_FILES([Makefile src/Makefile man/Makefile])\nAC_OUTPUT");
cfprintf(
"src/main.c",
"#include <stdio.h>\n\nint main(void) {\n\tputs(\"Who's that behind you?\");\n\treturn 0;\n}");
time_t t = time(NULL);
struct tm tm_info = *localtime(&t);
char date[11];
strftime(date, sizeof(date), "%Y-%m-%d", &tm_info);
snprintf(buffer, BUFSIZ, "man/%s.1", manifest.project);
flast = true;
cfprintf(
buffer,
".TH %s 1 \"%s\" \"0.1\" \"User Commands\"\n.SH NAME\n%s \\- a program that does a thing\n.SH SYNOPSIS\n.B %s\n.SH DESCRIPTION\nThis is a program that does a thing.\n.SH AUTHOR\nWritten by %s.",
manifest.project, date, manifest.project,
manifest.project, manifest.name);
main_source = "src/main.c";
break;
case LIBRARY:
snprintf(buffer, BUFSIZ, "include/%s.h", manifest.project);
char *file_name_buffer = str_dup(buffer);
snprintf(buffer, BUFSIZ, "%s", manifest.project);
for (int i = 0; buffer[i] != '\0'; ++i)
buffer[i] = toupper((unsigned char)buffer[i]);
cfprintf(file_name_buffer, "#ifndef %s\n#define %s\n#endif",
buffer, buffer);
snprintf(buffer, BUFSIZ, "src/%s.c", manifest.project);
main_source = str_dup(buffer);
cfprintf(buffer, "");
cfprintf("Makefile", makefile_lib, manifest.project,
manifest.project);
cfprintf("README", "%s", manifest.project);
break;
default:
abort();
}
if (manifest.libraries.ncurses) {
fprintf(stderr, "Pulling ncurses");
system("git submodule add --quiet https://github.com/mirror/ncurses");
fprintf(stderr, ", done.\n");
}
if (manifest.libraries.raylib) {
fprintf(stderr, "Pulling raylib");
system("git submodule add --quiet https://github.com/raysan5/raylib");
fprintf(stderr, ", done.\n");
}
if (manifest.libraries.stb) {
fprintf(stderr, "Pulling stb");
system("git submodule add --quiet https://github.com/nothings/stb");
fprintf(stderr, ", done.\n");
}
if (manifest.libraries.uthash) {
fprintf(stderr, "Pulling uthash");
system("git submodule add --quiet https://github.com/troydhanson/uthash");
fprintf(stderr, ", done.\n");
}
if (manifest.libraries.linenoise) {
fprintf(stderr, "Pulling linenoise");
system("git submodule add --quiet https://github.com/antirez/linenoise");
fprintf(stderr, ", done.\n");
}
switch (manifest.licence) { switch (manifest.licence) {
case MIT: case MIT:
cfprintf("COPYING", "%s", MIT_txt); cfprintf("COPYING", "%s", MIT_txt);
@@ -206,13 +47,13 @@ int create_project(manifest_t manifest)
abort(); abort();
} }
if (!manifest.flags.git) { if (!manifest.git) {
fprintf(stderr, "Initializing git reposity"); fprintf(stderr, "Initializing git reposity");
system("git init --quiet"); system("git init --quiet");
fprintf(stderr, ", done.\n"); fprintf(stderr, ", done.\n");
} }
if (manifest.flags.editor) { if (manifest.open_editor) {
snprintf(buffer, BUFSIZ, "nvim %s", main_source); snprintf(buffer, BUFSIZ, "nvim %s", main_source);
system(buffer); system(buffer);
} }

View File

@@ -1,40 +0,0 @@
/* Copyright (C) vx-clutch
*
* This file is part of yait
*
* This project and file is licenced under the BSD-3-Clause licecne
* <https://opensource.org/licence/bsd-3-clause>
*/
// clang-format off
#ifndef LIBRARY_CONTENTS_H
#define LIBRARY_CONTENTS_H
#define line(ln) ln "\n"
char *makefile_lib =
line ("CC = gcc")
line ("CLFAGS = -Wall -Wextra -O2 -fPIC -Iinclude")
line ("AR = ar rcs")
line ("BUILD = build")
line ("")
line ("SRC = $(wildcard src/*.c)")
line ("OBJ = $(SRC:src/%%.c=$(BUILD)/obj/%%.o)")
line ("")
line ("STATIC = $(BUILD)/%s.a")
line ("SHARED = $(BUILD)/%s.so")
line ("")
line ("all: $(STAITC) $(SHARED)")
line ("")
line ("$(STATIC): $(OBJ)\n\t$(AR) $@ $^")
line ("")
line ("$(SHARED): $(OBJ)\n\t$(CC) -shared -o $@ $^")
line ("")
line ("$(BUILD)/%%.o: src/%%.c | $(BUILD)\n\t$(CC) $(CFLAGS) -c $< -o $@")
line ("")
line ("$(BUILD):\n\tmkdir -p $(BUILD)/obj")
line ("")
line ("clean:\n\t$(RM) -r $(BUILD)");
#endif
// clang-format on

View File

@@ -16,10 +16,12 @@
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <stdarg.h>
#include "../include/yait.h" #include "../include/yait.h"
#include "standard.h" #include "standard.h"
#include "util.h" #include "util.h"
#include "../config.h"
#define print_option(option, description) \ #define print_option(option, description) \
printf(" %-20s %-20s\n", option, description) printf(" %-20s %-20s\n", option, description)
@@ -35,78 +37,120 @@ static void usage(int status)
puts("Creates a C project with opinionated defaults"); puts("Creates a C project with opinionated defaults");
puts("When only given the first argument it will detect your name\n"); puts("When only given the first argument it will detect your name\n");
puts("Mandatory arguments to long options are mandatory for short options too"); puts("Mandatory arguments to long options are mandatory for short options too");
print_option("--no-git", "Do not inititize git reposity"); print_option("--no-git", "Do not initialize git repository");
print_option("--clang", "Add clang-format files and tooling");
print_option("-L <licence>", print_option("-L <licence>",
"Set licence. This list can be found by passing 'list'"); "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 author ( default git username )");
print_option(
"--style=<style>",
"Pick from a list of built in styles. This list can be found by passing 'list'");
print_option("-E", "Open editor after project creation"); print_option("-E", "Open editor after project creation");
puts(" --help display this help text and exit\n"); puts(" --help display this help text and exit\n");
puts(" --version output version information and exit\n"); puts(" --version output version information and exit\n");
} }
void print_lines(const char *first, ...)
{
va_list args;
const char *s;
va_start(args, first);
for (s = first; s != NULL; s = va_arg(args, const char *))
printf("%s\n", s);
va_end(args);
}
static inline int parse_extras_token(manifest_t *conf, char *s)
{
if (!strcmp(s, "list")) {
print_lines("nob", "Cleanup", "format", NULL);
exit(EXIT_SUCCESS);
}
if (!strcmp(s, "nob"))
return conf->extra.nob = true, 0;
if (!strcmp(s, "Cleanup"))
return conf->extra.Cleanup = true, 0;
if (!strcmp(s, "format"))
return conf->extra.clang_format = true, 0;
fprintf(stderr, "Option '%s' is not valid. See %s --extras=list\n", s,
PROGRAM);
return 1;
}
static int parse_arguments(manifest_t *conf, int argc, char **argv) static int parse_arguments(manifest_t *conf, int argc, char **argv)
{ {
int opt; int opt, option_index;
// clang-format off // clang-format off
static struct option long_opts[] = { static struct option long_opts[] = {
{ "style", required_argument, 0, 's' }, { "git", no_argument, 0, 'g' },
{ "no-git", no_argument, 0, 'g' }, { "no-git", no_argument, 0, 'G' },
{ "clang", no_argument, 0, 'c' }, { "lib", no_argument, 0, 'L' },
{ "both", no_argument, 0, 'b' },
{ "autotools", no_argument, 0, 'a' },
{ "cmake", no_argument, 0, 'c' },
{ "make", no_argument, 0, 'm' },
{ "bare", no_argument, 0, 'B' },
{ "flat", no_argument, 0, 'f' },
{ "author", required_argument, 0, 'A' },
{ "extras", required_argument, 0, 0 },
{ 0, 0, 0, 0 } }; { 0, 0, 0, 0 } };
// clang-format on // clang-format on
while ((opt = getopt_long(argc, argv, "s:gcn:L:l:En:", long_opts, while ((opt = getopt_long(argc, argv, "gGLbacmBfAl:E", long_opts,
NULL)) != -1) { &option_index)) != -1) {
switch (opt) { if (opt == 0 &&
case 's': strcmp(long_opts[option_index].name, "extras") == 0) {
if (strcmp(optarg, "list") == 0) { int err;
puts("posix\nsimple\nGNU\nlib\nfasm\nlib"); char *arg = optarg;
exit(EXIT_SUCCESS); char *token = strtok(arg, ",");
while (token) {
err = parse_extras_token(conf, token);
if (err)
exit(err);
token = strtok(NULL, ",");
} }
conf->style = TOstyle(optarg); }
break; switch (opt) {
case 'g': case 'g':
conf->flags.git = false; conf->git = true;
break; break;
case 'c': case 'G':
conf->flags.clang = true; conf->git = false;
break;
case 'n':
conf->name = str_dup(optarg);
break; break;
case 'L': case 'L':
conf->licence = TOlicence(optarg); conf->lib = true;
break;
case 'b':
conf->lib = true;
conf->exe = true;
break;
case 'a':
conf->autotools = true;
break;
case 'c':
conf->cmake = true;
break;
case 'm':
conf->make = true;
break;
case 'B':
conf->bare = true;
break;
case 'f':
conf->flat = true;
break;
case 'A':
conf->author = optarg;
break; break;
case 'l': case 'l':
if (strcmp(optarg, "list") == 0) { if (!strcmp(optarg, "list")) {
puts("ncurses\nraylib\nstb\nuthash\nlinenoise"); print_lines("MIT", "BSD", "GPL", "UNL", NULL);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
if (strcmp(optarg, "ncurses") == 0) conf->licence = TOlicence(optarg);
conf->libraries.ncurses = true;
else if (strcmp(optarg, "raylib") == 0)
conf->libraries.raylib = true;
else if (strcmp(optarg, "stb") == 0)
conf->libraries.stb = true;
else if (strcmp(optarg, "uthash") == 0)
conf->libraries.uthash = true;
else if (strcmp(optarg, "linenoise") == 0)
conf->libraries.linenoise = true;
else
fprintf(stderr,
"warning: %s is not a support library",
optarg);
break; break;
case 'E': case 'E':
conf->flags.editor = true; conf->open_editor = true;
conf->editor = getenv("EDITOR"); conf->editor = getenv("EDITOR");
break; break;
default: default:
@@ -115,7 +159,7 @@ static int parse_arguments(manifest_t *conf, int argc, char **argv)
} }
if (optind >= argc) { if (optind >= argc) {
fputs("error: missing required positional argument\n", stderr); fputs("error: missing project name\n", stderr);
return 1; return 1;
} }
conf->project = str_dup(argv[optind]); conf->project = str_dup(argv[optind]);
@@ -162,20 +206,22 @@ int main(int argc, char **argv)
int status; int status;
manifest_t manifest = { manifest_t manifest = {
.project = "Project", .project = "Project",
.name = "author", .author = "author",
.editor = "nano", .editor = "vim",
.licence = UNL, .licence = UNL,
.style = POSIX,
.libraries.ncurses = false, .git = true,
.libraries.raylib = false, .autotools = false,
.libraries.stb = false, .cmake = false,
.libraries.uthash = false, .make = true,
.libraries.linenoise = false, .bare = false,
.flat = false,
.open_editor = false,
.flags.git = true, .extra.nob = false,
.flags.clang = false, .extra.clang_format = false,
.flags.editor = false, .extra.Cleanup = false,
}; };
status = parse_standard_options(usage, argc, argv); status = parse_standard_options(usage, argc, argv);
@@ -188,7 +234,7 @@ int main(int argc, char **argv)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
get_name(&manifest.name); get_name(&manifest.author);
status = create_project(manifest); status = create_project(manifest);
if (status) { if (status) {
@@ -196,9 +242,17 @@ int main(int argc, char **argv)
return EXIT_FAILURE; return EXIT_FAILURE;
} }
char buffer[PATH_MAX]; char *cwd;
getcwd(buffer, PATH_MAX);
fprintf(stderr, "Created %s at\n %s\n", manifest.project, buffer); cwd = getcwd(NULL, 0);
if (cwd == NULL) {
perror("getcwd");
exit(EXIT_FAILURE);
}
fprintf(stderr, "Created %s at\n %s\n", manifest.project, cwd);
free(cwd);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@@ -1,215 +0,0 @@
/* Copyright (C) vx_clutch
*
* This file is part of yait
*
* This project and file is licenced under the BSD-3-Clause licence.
* <https://opensource.org/license/bsd-3-clause>
*/
// clang-format off
#ifndef POSIX_CONTENTS_H
#define POSIX_CONTENTS_H
#define line(ln) ln "\n"
char *readme =
line ("%s ( concise description )")
line ()
line ("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor")
line ("incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis")
line ("nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.")
line ("Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu")
line ("fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in")
line ("culpa qui officia deserunt mollit anim id est laborum.");
char *configure =
line ("#!/bin/sh")
line ()
line ("usage() {")
line ("cat <<EOF")
line ("Usage: $0 [OPTION]... [VAR=VALUE]...")
line ()
line ("To assign environment variables (e.g., CC, CFLAGS...), specify them as")
line ("VAR=VALUE.")
line ()
line (" CC C compiler command [detected]")
line (" CFLAGS C compiler flags [-g, ...]")
line ()
line ("EOF")
line ("exit 0")
line ("}")
line ()
line ("echo () { printf \"%%s\\n\" \"$*\" ; }")
line ("cmdexists () { type \"$1\" >/dev/null 2>&1 ; }")
line ("trycc () { test -z \"$CC\" && cmdexists \"$1\" && CC=$1 ; }")
line ()
line ("prefix=/usr/bin/")
line ("CFLAGS=\"-Wall -Wextra -O2 --std=c23 -Wpedantic\"")
line ("LDFLAGS=")
line ("CC=")
line ()
line ("for arg ; do")
line ("case \"$arg\" in")
line ("--help|h) usage ;;")
line ("--prefix=*) prefix=${arg#*=} ;;")
line ("CFLAGS=*) CFLAGS=${arg#*=} ;;")
line ("LDFLAGS=*) LDFLAGS=${arg#*=} ;;")
line ("esac")
line ("done")
line ()
line ("printf \"checking for C compiler... \"")
line ("%%s")
line ("printf \"%%s\\n\" \"$CC\"")
line ()
line ("printf \"checking weather C compiler works... \"")
line ("status=\"fail\"")
line ("tmpc=\"$(mktemp -d)/test.c\"")
line ("echo \"typedef int x;\" > \"$tmpc\"")
line ("if output=$($CC $CFLAGS -c -o /dev/null \"$tmpc\" 2>&1) ; then")
line ("printf \"yes\\n\"")
line ("else")
line ("printf \"no; %%s\\n\" \"$output\"")
line ("exit 1")
line ("fi")
line ()
line ("printf \"creating config.mak... \"")
line ("printf \"PREFIX=%%s\\n\" \"$prefix\" > config.mak")
line ("printf \"CFLAGS=%%s\\n\" \"$CFLAGS\" >> config.mak")
line ("printf \"LDFLAGS=%%s\\n\" \"$LDFLAGS\" >> config.mak")
line ("printf \"CC=%%s\\n\" \"$CC\" >> config.mak")
line ("printf \"done\\n\"");
char *makefile =
line ("prefix = /usr/bin")
line ()
line ("%s_SRCS := $(wildcard %s/*.c)")
line ("%s_OBJS := $(patsubst ./%s/%%.c,c-out/obj/%%.o,$(%s_SRCS))")
line ()
line ("%s := c-out/bin/%s")
line ()
line ("-include config.mak")
line ()
line ("ifeq ($(wildcard config.mak),)")
line ("all:")
line ("\t@echo \"File config.mak not found, run configure\"")
line ("\t@exit 1")
line ("else")
line ()
line ("all: build $(%s)")
line ()
line ("build:")
line ("\tmkdir -p c-out/bin")
line ("\tmkdir -p c-out/obj")
line ()
line ("c-out/obj/%%.o: %s/%%.c")
line ("\t$(CC) $(CFLAGS) -c $< -o $@")
line ()
line ("$(%s): $(%s_OBJS)")
line ("\t$(CC) $(CFLAGS) -DCOMMIT=$(shell git rev-list --count --all 2>/dev/null || echo 0) $^ -o $@")
line ()
line ("endif")
line ()
line ("install:")
line ("\t@echo \"NOT IMPL\"")
line ("\texit 1")
line ()
line ("uninstall:")
line ("\t@echo \"NOT IMPL\"")
line ("\texit 1")
line ()
line ("clean:")
line ("\trm -rf c-out")
line ()
line ("dist-clean: clean")
line ("\trm -f config.mak")
line ()
line (".PHONY: all clean dist-clean install uninstall");
char *clang_format =
line ("BasedOnStyle: GNU");
char *config_h =
line ("#ifndef CONFIG_H")
line ("#define CONFIG_H")
line ()
line ("/* Program information */")
line ("#define PROGRAM \"%s\"")
line ("#define LICENSE_LINE \"%s\"")
line ("#define AUTHORS \"%s\"")
line ("#define VERSION \"pre-alpha\"")
line ("#define YEAR 2025")
line ()
line ("#define HELP_REQUESTED 2")
line ("#define ERROR_MEMORY_ALLOCATION 3")
line ("#define ERROR_DIRECTORY_CREATION 4")
line ()
line ("#endif");
char *main_c =
line ("#include <stdio.h>")
line ()
line ("int main(void) {")
line (" printf(\"%s: Hello %s!\\n\");")
line (" return 0;")
line ("}");
char *main_c_gnu =
line ("#include <stdio.h>")
line ("#include \"standard.h\"")
line ()
line ("void usage(int status) {")
line (" fprintf(stderr, \"Usage: %s [OPTION...]\\n\");")
line (" fprintf(stderr, \" --help\\tdisplay the help text and exit\\n\");")
line (" fprintf(stderr, \" --version\\toutput version information and exit\\n\");")
line ("}")
line ()
line ("int main(int argc, char **argv) {")
line (" parse_standard_options(usage, argc, argv);")
line (" printf(\"%s: Hello %s!\\n\");")
line (" return 0;")
line ("}");
char *standard_c =
line ("#include \"standard.h\"")
line ("#include \"../config.h\"")
line ("#include <stdio.h>")
line ("#include <stdlib.h>")
line ("#include <string.h>")
line ()
line ("int")
line ("parse_standard_options (void (*usage) (int), int argc, char **argv)")
line ("{")
line (" for (int i = 1; i < argc; ++i)")
line (" {")
line (" if (strcmp (argv[i], \"--help\") == 0)")
line (" {")
line (" usage (0);")
line (" exit (EXIT_SUCCESS);")
line (" }")
line (" else if (strcmp (argv[i], \"--version\") == 0)")
line (" {")
line (" printf (\"%s %s %d\\nCopyright (C) %d %s.\\n%s\\nThis is free software: you are free to change and redistribute it.\\nThere is NO WARRNTY, to the extent permitted by law.\\n\", PROGRAM, VERSION, COMMIT, YEAR, AUTHORS, LICENSE_line );")
line (" exit (EXIT_SUCCESS);")
line (" }")
line (" }")
line (" return HELP_REQUESTED;")
line ("}");
char *standard_h =
line ("#ifndef STANDARD_H")
line ("#define STANDARD_H")
line ()
line ("int parse_standard_options(void (*usage_func)(), int argc, char **argv);")
line ()
line ("#endif");
char *what_next =
line ("# What next?")
line ("")
line ("## Steps")
line (" - Write a description in the README")
line (" - Write the usage function ( write to stderr )")
line (" - Start writing your program");
#endif
// clang-format on

View File

@@ -6,43 +6,31 @@
* <https://opensource.org/licence/bsd-3-clause> * <https://opensource.org/licence/bsd-3-clause>
*/ */
#include <string.h> #include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <getopt.h> #include <getopt.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "util.h" #include "util.h"
#include "../include/yait.h" #include "../include/yait.h"
int fno = 0; int fno = 1;
bool flast = false; bool flast = false;
licence_t TOlicence(char *s) licence_t TOlicence(char *src)
{ {
if (!strcmp(s, "mit")) char *s = tostrupr(src);
if (!strcmp(s, "MIT"))
return MIT; return MIT;
if (!strcmp(s, "gpl")) if (!strcmp(s, "GPL"))
return GPL; return GPL;
if (!strcmp(s, "bsd")) if (!strcmp(s, "BSD"))
return BSD; return BSD;
free(s);
return UNL; 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 *str_dup(char *s)
{ {
char *new = malloc(strlen(s) + 1); char *new = malloc(strlen(s) + 1);
@@ -52,6 +40,17 @@ char *str_dup(char *s)
return new; return new;
} }
char *tostrupr(char *s)
{
char *new = malloc(strlen(s) + 1);
if (!new)
return NULL;
strcpy(new, s);
for (int i = 0; new[i] != '\0'; ++i)
new[i] = toupper((unsigned char)new[i]);
return new;
}
static char *nextchar; static char *nextchar;
int getopt_long(int argc, char *const argv[], const char *optstring, int getopt_long(int argc, char *const argv[], const char *optstring,

View File

@@ -12,12 +12,12 @@
#include "../include/yait.h" #include "../include/yait.h"
licence_t TOlicence(char *s); licence_t TOlicence(char *s);
style_t TOstyle(char *s);
int getopt_long(int argc, char *const argv[], const char *optstring, int getopt_long(int argc, char *const argv[], const char *optstring,
const struct option *longopts, int *longindex); const struct option *longopts, int *longindex);
char *str_dup(char *s); char *str_dup(char *s);
char *tostrupr(char *s);
extern int fno; extern int fno;
extern bool flast; extern bool flast;

View File

@@ -15,6 +15,7 @@ fi
sh ./tools/format || fatal Could not run './tools/format' sh ./tools/format || fatal Could not run './tools/format'
rm -rf .cache || fatal Could not run 'rm -rf .cache' rm -rf .cache || fatal Could not run 'rm -rf .cache'
rm -f compile_commands.json || fatal Could not run 'rm -f compile_commands.json'
make dist-clean || fatal Could not run 'make dist-clean' make dist-clean || fatal Could not run 'make dist-clean'
echo done. echo done.