save
This commit is contained in:
7
.clangd
7
.clangd
@@ -1,2 +1,7 @@
|
|||||||
CompileFlags:
|
CompileFlags:
|
||||||
Add: ["--std=c2x", "-xc"]
|
Add: [-std=c23]
|
||||||
|
|
||||||
|
Diagnostics:
|
||||||
|
ClangTidy:
|
||||||
|
Add: [clang-diagnostic-*]
|
||||||
|
Remove: []
|
||||||
|
|||||||
22
TODO
22
TODO
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
flast = true;
|
||||||
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;
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
178
src/main.c
178
src/main.c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
41
src/util.c
41
src/util.c
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user