commit fc3d0a2e69cdc5c84d86637e98151f040589c84c
parent 47e0690f4a738a67a92e5b9a3a10620e93d28ea8
Author: vx-clutch <[email protected]>
Date: Wed, 14 Jan 2026 20:39:14 -0500
Merge pull request 'rewrite complete' (#1) from rewrite into main
Reviewed-on: https://git.vxserver.dev/fSD/yait/pulls/1
Diffstat:
| M | .gitignore | | | 5 | +++-- |
| D | COPYING | | | 39 | --------------------------------------- |
| A | LICENSE | | | 15 | +++++++++++++++ |
| M | Makefile | | | 53 | +++++++++-------------------------------------------- |
| D | README | | | 51 | --------------------------------------------------- |
| A | README.md | | | 35 | +++++++++++++++++++++++++++++++++++ |
| A | bin/yait | | | 463 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| D | edef.h | | | 18 | ------------------ |
| D | estruct.h | | | 18 | ------------------ |
| D | file.c | | | 77 | ----------------------------------------------------------------------------- |
| D | file.h | | | 8 | -------- |
| D | full.c | | | 79 | ------------------------------------------------------------------------------- |
| D | full.h | | | 6 | ------ |
| D | git.c | | | 17 | ----------------- |
| D | git.h | | | 6 | ------ |
| D | globals.c | | | 6 | ------ |
| D | input.c | | | 70 | ---------------------------------------------------------------------- |
| D | input.h | | | 9 | --------- |
| D | main.c | | | 83 | ------------------------------------------------------------------------------- |
| D | proj.c | | | 264 | ------------------------------------------------------------------------------- |
| D | proj.h | | | 6 | ------ |
| A | scripts/git-hooks/pre-commit | | | 24 | ++++++++++++++++++++++++ |
| D | shell.c | | | 77 | ----------------------------------------------------------------------------- |
| D | shell.h | | | 6 | ------ |
| D | single.c | | | 20 | -------------------- |
| D | single.h | | | 6 | ------ |
| D | usage.c | | | 22 | ---------------------- |
| D | usage.h | | | 6 | ------ |
| D | util.c | | | 10 | ---------- |
| D | util.h | | | 6 | ------ |
| D | version.c | | | 7 | ------- |
| D | version.h | | | 12 | ------------ |
| D | wrapper.c | | | 13 | ------------- |
| D | wrapper.h | | | 8 | -------- |
| A | yait.1 | | | 41 | +++++++++++++++++++++++++++++++++++++++++ |
35 files changed, 590 insertions(+), 996 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -1,2 +1,2 @@
-yait
-*.o
+/stuff/
+*.tar.gz
+\ No newline at end of file
diff --git a/COPYING b/COPYING
@@ -1,39 +0,0 @@
-Copyright (c) 2025-2026 fSD version 1
-
- This document is intended "as is", without modifications.
-
-The binary and source code that this file is associated with and distributed
-with is licensed under the following terms and conditions.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Maintainers Note:
- This section is reserved for any deviations of the prior notice. Given that
- you are reading this, that means this document is assumed unmodified. Any
- modifications in this section most follow this format:
-
- o the note.
-
- If a note is provided here the header the at top of the document must be
- changed to reflect that as such: "This document is intended "as is",
- without modifications." must become "This is a modified version of the
- fSD general license. See Maintainers Note.".
diff --git a/LICENSE b/LICENSE
@@ -0,0 +1,15 @@
+ISC License
+
+Copyright (c) 2025-2026 fSD
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/Makefile b/Makefile
@@ -1,46 +1,11 @@
-# Makefile for yait
+all:
+ @echo "nothing to do"
-# Make the build silent by default
-V =
+install:
+ cp bin/yait /usr/local/bin
+ cp yait.1 /usr/local/share/man/man1/yait.1
+ chmod 644 /usr/local/share/man/man1/yait.1
-ifeq ($(strip $(V)),)
- E = @echo
- Q = @
-else
- E = @\#
- Q =
-endif
-export E Q
-
-PROGRAM = yait
-TARBALL = $(PROGRAM).tar
-SRC = $(wildcard *.c)
-OBJ = $(SRC:.c=.o)
-HDR = $(wildcard *.h)
-
-CC = gcc
-WARNINGS = -Wall -Wstrict-prototypes
-CFLAGS = -O2 $(WARNINGS) -g
-DEFINES =
-LIBS =
-LDFLAGS =
-BINDIR = /usr/bin
-LIBDIR = /usr/lib
-
-$(PROGRAM): $(OBJ) $(HDR)
- $(E) " LINK " $@
- $(Q) $(CC) $(LDFLAGS) $(DEFINES) -o $@ $(OBJ) $(LIBS)
-
-clean:
- $(E) " CLEAN"
- $(Q) rm -f $(PROGRAM) $(OBJ)
-
-install: $(PROGRAM)
- cp $(PROGRAM) ${BINDIR}
-
-release: $(PROGRAM)
- tar cvf $(TARBALL) $(SRC) $(HDR) Makefile README
-
-.c.o:
- $(E) " CC " $@
- $(Q) $(CC) $(CFLAGS) $(DEFINES) -c $< -o $@
+uninstall:
+ $(RM) /usr/local/bin/yait
+ $(RM) /usr/local/share/man/man1/yait.1
diff --git a/README b/README
@@ -1,51 +0,0 @@
-+--------------+
-| yait/fSD 1.0 |
-+--------------+
-
- Highly opinionated C and SH project generator
-
- yait was written by vx-clutch
-
- Copyright Notices:
-
- yait 1.0 (c) Copyright 2025-2026 fSD.
-
- Reference the COPYING file for detailed information
-
-
-WHAT IS yait/fSD?
-
-yait/fSD 1.0 is an optionated C and SH project generator. For C project
-generation is produces a similar layout to the source of this project. On
-SH it generates a shell script with useful scaffolding for a script. For
-more detailed useage compile the program for your system and run with the
-`--help` option.
-
-
-WHAT IS NEW
-
-Features:
-
-o This is the first version, EVERYTHING is new!
-
-Bug fixes - not very interesting:
-
-o None
-
-Something is gone:
-
-o None
-
-HOW TO INSTALL yait/fSD?
-
-o UNIX: Look at estruct.h, do a 'make', test the program, 'make install'.
-
-
-ACKNOWLEDGEMENTS AND STATUS
-
-This project's file strucutre, file format, and certain contents are
-derived from uEmacs/PK 4.0 specifically from the Linux Torvalds
-distribution on GitHub. The README on from uEmacs/PK 4.0 has greater and
-more accurate attributions, if you desire.
-
-November 12, 2025
diff --git a/README.md b/README.md
@@ -0,0 +1,35 @@
+# yait
+
+https://fsd.vxserver.dev/releases/yait
+
+Get your project started:
+
+- A full C or SH project template
+- Extensible file templating
+ * via ~/.local/share/yait/templates
+
+## Install
+
+#### Dependencies
+
+- `git` - source control tool
+- `shellcheck` - lint shell scripts **development dependency**
+
+**Note**: `shellcheck` is used as a pre-commit git hook to for quality
+assurance purposes. This does not invalidate our COPYING policy. This software
+still should be used at your own risk without an warranty
+
+```bash
+git clone https://git.vxserver.dev/fSD/yait
+cd yait
+sudo make install
+```
+
+## Usage
+
+This tool runs via the command `yait`.
+
+- `yait -x c` -- Create a C project.
+- `yait -x sh` -- Create a SH project.
+- `yait -S ...` -- Create a single/small project.
+- `yait -f` -- Overwrite existing files.
diff --git a/bin/yait b/bin/yait
@@ -0,0 +1,463 @@
+#! /bin/sh
+# Highly opinionated C and SH project generator
+
+scriptversion="0.2.1"
+
+#
+# Copyright (C) 2025-2026 fSD THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+me=$(basename "$0")
+version="$me/fSD v$scriptversion
+
+Copyright (C) 2025-2026 fSD.
+This is free software; you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law."
+
+usage="\
+Usage: $me [OPTION]... <version> <dir>
+Highly opinionated C and SH project generator
+
+Options:
+ --help print this help and exit
+ --version output version information
+
+ -x <language> set project type
+ -d <description> set a description
+ -S small project creation
+ -f overwrite existing files
+ -a <author> set project author
+ -r initialize Git repository for the project
+ -q surpress output"
+
+x=c # language
+d="Does a thing" # package description
+S= # small project creation (bool)
+f= # force (bool)
+a=$(git config user.name) # author
+r= # initialize repository (bool)
+q= # surpress output
+
+say() {
+ if [ -z "$q" ]; then
+ echo "$me: $*"
+ fi
+}
+
+lsay() {
+ if [ -z "$q" ]; then
+ echo " => $*"
+ fi
+}
+
+create_project() {
+ name=$1
+
+ if ! echo "$name" | grep -qE '^[A-Za-z0-9_-]+$'; then
+ say "invalid name '$name'"
+ exit 1
+ fi
+
+ shell() {
+ outfile="$name"
+
+ if [ -z "$S" ]; then
+ if [ -d "$name" ]; then
+ if ! [ -z "$f" ]; then
+ rm -rf "$name"
+ fi
+ fi
+
+ mkdir "$name" || exit 1
+ cd "$name" || exit 1
+
+ cat <<EOF > LICENSE
+ISC License
+
+Copyright (c) $(date "+%Y") $a
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+EOF
+ cat <<EOF > Makefile
+all:
+ @echo "nothing to do"
+
+install:
+ cp bin/$name /usr/local/bin
+ cp $name.1 /usr/local/share/man/man1/$name.1
+ chmod 644 /usr/local/share/man/man1/$name.1
+
+uninstall:
+ \$(RM) /usr/local/bin/$name
+ \$(RM) /usr/local/share/man/man1/$name.1
+EOF
+ cat <<EOF > README.md
+# $name
+
+YOUR_WEBSITE
+
+$d:
+
+- Feature 1
+- Feature 2
+ * feature 2a
+
+## Install
+
+#### Dependencies
+
+- \`fzf\` - terminal fuzzy finder
+
+**Note**: \`fzf\` is used as an example dependency
+
+\`\`\`bash
+git clone YOUR_REPO_URL
+cd $name
+sudo make install
+\`\`\`
+
+## Usage
+
+This tool runs via the command \`$name\`.
+
+- \`$name -k\` -- Does option k
+EOF
+
+ mkdir bin || exit 1
+ outfile="bin/$outfile"
+ fi
+ cat <<EOF > "$outfile"
+#! /bin/sh
+# $d
+
+scriptversion="1"
+
+#
+#
+# Copyright (C) $(date "+%Y") $a
+# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+me=\$0
+version="\$me/$a v\$scriptversion
+
+Copyright (C) $(date "+%Y") $a.
+This is free software; you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law."
+
+usage="\
+Usage: \$me [OPTION]... <arg1> <arg2>
+$d
+
+Options:
+ --help print this help and exit
+ --version output version information"
+
+say() {
+ if [ -z "\$q" ]; then
+ echo "\$me: \$*"
+ fi
+}
+
+lsay() {
+ if [ -z "\$q" ]; then
+ echo " => \$*"
+ fi
+}
+
+if ! [ \$# -gt 0 ]; then
+ echo "\$usage"
+ exit 0
+fi
+
+while [ \$# -gt 0 ]; do
+ case \$1 in
+ --help) echo "\$usage"; exit 0 ;;
+ --version) echo "\$version"; exit 0 ;;
+ -*) echo "\$me: Unknown option '\$1'." >&2; exit 1 ;;
+ esac
+done
+
+say hello world
+EOF
+ chmod +x "$outfile"
+ }
+
+ c() {
+ if [ -d "$name" ]; then
+ if ! [ -z "$f" ]; then
+ rm -rf "$name"
+ fi
+ fi
+ mkdir "$name" || exit 1
+ cd "$name" || exit 1
+ cat <<EOF > README
+$name
+$(echo "$name" | sed 's/./=/g')
+$d
+
+
+Requirements
+------------
+In order to build $name you need the LIBRARY header files.
+
+
+Instillation
+------------
+Edit config.mk to match your local setup ($name is installed into
+the /usr/local namesapce by default).
+
+Afterwards enter the following command to build and install $name (if
+necessary as root):
+
+ make clean install
+
+Running $name
+$(echo "Running $name" | sed 's/./=/g')
+To run $name use the following command:
+
+ ./$name
+
+Configuration
+-------------
+The configuration of $name is done by creating a custom config.h
+and (re)compiling the source code.
+EOF
+ cat <<EOF > LICENSE
+ISC License
+
+Copyright (c) $(date "+%Y") $a
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+EOF
+ cat <<EOF > Makefile
+# $name
+# See LICENSE file for copyright and license details.
+
+include config.mk
+
+SRC = $name.c
+OBJ = \${SRC:.c=.o}
+
+all: $name
+
+.c.o:
+ \${CC} -c \${CFLAGS} \$<
+
+\${OBJ}: config.h config.mk
+
+config.h:
+ cp config.def.h \$@
+
+dwm: \${OBJ}
+ \${CC} -o \$@ \${OBJ} \${LDFLAGS}
+
+clean:
+ rm -f $name \${OBJ} $name-\${VERSION}.tar.gz
+
+dist: clean
+ mkdir -p $name-\${VERSION}
+ cp -R LICENSE Makefile README config.def.h config.mk\
+ $name.1 \${SRC} $name-\${VERSION}
+ tar -cf $name-\${VERSION}.tar $name-\${VERSION}
+ gzip $name-\${VERSION}.tar
+ rm -rf $name-\${VERSION}
+
+install: all
+ mkdir -p \${DESTDIR}\${PREFIX}/bin
+ cp -f $name \${DESTDIR}\${PREFIX}/bin
+ chmod 755 \${DESTDIR}\${PREFIX}/bin/$name
+ mkdir -p \${DESTDIR}\${MANPREFIX}/man1
+ sed "s/VERSION/\${VERSION}/g" < $name.1 > \${DESTDIR}\${MANPREFIX}/man1/$name.1
+ chmod 644 \${DESTDIR}\${MANPREFIX}/man1/$name.1
+
+uninstall:
+ rm -f \${DESTDIR}\${PREFIX}/bin/$name\
+ \${DESTDIR}\${MANPREFIX}/man1/$name.1
+
+.PHONY: all clean dist install uninstall
+EOF
+ cat <<EOF > config.def.h
+/* See LICENSE file for copyright and license details. */
+EOF
+ cat <<EOF > config.mk
+# $name version
+VERSION = 0.1
+
+# Customize below to fit your system
+
+# paths
+PREFIX = /usr/local
+MANPREFIX = \${PREFIX}/share/man
+
+# includes and libs
+INCS =
+LIBS =
+
+# flags
+CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"\${VERSION}\"
+CFLAGS = -g -std=c99 -pedantic -Wall -O0 \${INCS} \${CPPFLAGS}
+CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os \${INCS} \${CPPFLAGS}
+LDFLAGS = \${LIBS}
+
+# compiler and linker
+CC = cc
+EOF
+ cat <<EOF > arg.h
+/*
+ * Copy me if you can.
+ * by 20h
+ */
+
+#ifndef ARG_H__
+#define ARG_H__
+
+extern char *argv0;
+
+/* use main(int argc, char *argv[]) */
+#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
+ argv[0] && argv[0][1]\\
+ && argv[0][0] == '-';\\
+ argc--, argv++) {\\
+ char argc_;\\
+ char **argv_;\\
+ int brk_;\\
+ if (argv[0][1] == '-' && argv[0][2] == '\\0') {\\
+ argv++;\\
+ argc--;\\
+ break;\\
+ }\\
+ for (brk_ = 0, argv[0]++, argv_ = argv;\\
+ argv[0][0] && !brk_;\\
+ argv[0]++) {\\
+ if (argv_ != argv)\\
+ break;\\
+ argc_ = argv[0][0];\\
+ switch (argc_)
+
+/* Handles obsolete -NUM syntax */
+#define ARGNUM case '0':\\
+ case '1':\\
+ case '2':\\
+ case '3':\\
+ case '4':\\
+ case '5':\\
+ case '6':\\
+ case '7':\\
+ case '8':\\
+ case '9'
+
+#define ARGEND }\\
+ }
+
+#define ARGC() argc_
+
+#define ARGNUMF(base) (brk_ = 1, estrtol(argv[0], (base)))
+
+#define EARGF(x) ((argv[0][1] == '\\0' && argv[1] == NULL)?\\
+ ((x), abort(), (char *)0) :\\
+ (brk_ = 1, (argv[0][1] != '\\0')?\\
+ (&argv[0][1]) :\\
+ (argc--, argv++, argv[0])))
+
+#define ARGF() ((argv[0][1] == '\\0' && argv[1] == NULL)?\\
+ (char *)0 :\\
+ (brk_ = 1, (argv[0][1] != '\\0')?\\
+ (&argv[0][1]) :\\
+ (argc--, argv++, argv[0])))
+
+#endif
+EOF
+ cat <<EOF > "$name.c"
+/* See LICENSE file for license details. */
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "arg.h"
+#include "config.h"
+
+char *argv0;
+
+static void
+usage(void) {
+ fprintf(stderr, "%s: usage: $name [-v]\\n", argv0);
+ exit(1);
+}
+
+int
+main(int argc, char *argv[]) {
+
+ ARGBEGIN {
+ case 'v':
+ printf("$name/$a version %s\\n", VERSION);
+ exit(0);
+ default:
+ usage();
+ } ARGEND;
+
+ puts("Hello, World!");
+
+ return 0;
+}
+EOF
+ }
+
+ case $x in
+ sh) shell ;;
+ *) c ;;
+ esac
+
+ if ! [ -z "$r" ]; then
+ git init -q || echo "$me: error: could not initilzie git repository" >&2
+ fi
+
+ say "made $name at $(realpath "$name")"
+ cd ..
+}
+
+if ! [ $# -gt 0 ]; then
+ echo "$usage"
+ exit 0
+fi
+
+while [ $# -gt 0 ]; do
+ case $1 in
+ --help) echo "$usage"; exit 0 ;;
+ --version) echo "$version"; exit 0 ;;
+ -x) shift; x="$1"; shift ;;
+ -d) shift; d="$1"; shift ;;
+ -S) S=true; shift ;;
+ -f) f=true; shift ;;
+ -a) shift; a="$1"; shift ;;
+ -r) r=true; shift ;;
+ -q) q=true; shift ;;
+ -*) echo "$me: Unknown option '$1'." >&2; exit 1 ;;
+ *) create_project "$1"; shift ;;
+ esac
+done
diff --git a/edef.h b/edef.h
@@ -1,18 +0,0 @@
-/* edef.h
- *
- * Global variable definition
- *
- * written by vx-clutch
- */
-
-#ifndef EDEF_H_
-#define EDEF_H_
-
-/* Initialized global external declarations. */
-
-extern int git;
-
-/* Other constants declarations */
-enum { SINGLE, FULL };
-
-#endif /* EDEF_H_ */
diff --git a/estruct.h b/estruct.h
@@ -1,18 +0,0 @@
-#ifndef ESTRUCT_H_
-#define ESTRUCT_H_
-
-/* Configuration options */
-
-#define QLICENSE 0 /* Force use the default license option */
-#define LICENSE "BSD-3-Clause" /* Default SPDX-License-Identifier */
-
-#define QAUTHOR 0 /* Force use the default author option */
-#define AUTHOR "fSD" /* Default author */
-
-#define DEFAULT_GIT 0 /* Default git state */
-
-/* Internal constants */
-
-#define NPAT 128
-
-#endif /* ESTRUCT_H_ */
diff --git a/file.c b/file.c
@@ -1,77 +0,0 @@
-/* file.c
- *
- * The routines in this file handle the reading, writing
- * and lookup of disk files.
- *
- * written by vx-clutch
- */
-
-#include <errno.h>
-#include <libgen.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "file.h"
-#include "estruct.h"
-
-int ffwrite(char *path, char *fmt, ...) {
- FILE *f;
- va_list ap;
- int r;
-
- f = fopen(path, "w");
- if (!f)
- return -1;
-
- va_start(ap, fmt);
- r = vfprintf(f, fmt, ap);
- va_end(ap);
-
- fclose(f);
- return r < 0 ? -1 : 0;
-}
-
-int fmkdir(char *fmt, ...)
-{
- va_list ap;
- char path[NPAT];
- char tmp[NPAT];
- char *p;
-
- va_start(ap, fmt);
- vsnprintf(path, sizeof(path), fmt, ap);
- va_end(ap);
-
- strncpy(tmp, path, sizeof(tmp) - 1);
- tmp[sizeof(tmp) - 1] = '\0';
-
- for (p = tmp + 1; *p; p++) {
- if (*p == '/') {
- *p = '\0';
- if (mkdir(tmp, 0755) < 0 && errno != EEXIST)
- return -1;
- *p = '/';
- }
- }
-
- if (mkdir(tmp, 0755) < 0 && errno != EEXIST)
- return -1;
-
- return 0;
-}
-
-int ffexist(char *fmt, ...) {
- char path[NPAT];
- va_list ap;
- struct stat st;
-
- va_start(ap, fmt);
- vsnprintf(path, sizeof(path), fmt, ap);
- va_end(ap);
-
- return stat(path, &st) == 0;
-}
diff --git a/file.h b/file.h
@@ -1,8 +0,0 @@
-#ifndef FILE_H_
-#define FILE_H_
-
-int ffwrite(char *path, char *fmt, ...);
-int fmkdir(char *path, ...);
-int ffexist(char *fmt, ...);
-
-#endif /* FILE_H_ */
diff --git a/full.c b/full.c
@@ -1,79 +0,0 @@
-/* full.c
- *
- * Init to be called before project creation.
- *
- * written by vx-clutch
- */
-
-#include <unistd.h>
-
-#include "file.h"
-#include "full.h"
-#include "usage.h"
-#include "git.h"
-
-int full_project_init_and_cd(char *src)
-{
- if (ffexist(src))
- die("%s already exists", src);
-
- fmkdir(src);
- if (chdir(src))
- die("could not cd into %s", src);
-
- // TODO(vx-clutch): Take in interactive arguments all at once
- ffwrite("README", "\
-+--------------------+\n\
-| package/Author 1.0 |\n\
-+--------------------+\n\
-\n\
- A project that does a thing 'well'.\n\
-\n\
- %s was written by ME!!!\n\
-\n\
- Copyright Notices:\n\
-\n\
- %s 1.0 (c) Copyright 2026 Author. \n\
- Reference the COPYING file for detailed information\n\
-\n\
-\n\
-WHAT IS package/Author?\n\
-\n\
-package/Author 1.0 is an optionated C and SH project generator. For C project\n\
-generation is produces a similar layout to the source of this project. On\n\
-SH it generates a shell script with useful useful scaffolding for a\n\
-script.\n\
-\n\
-\n\
-WHAT IS NEW\n\
-\n\
-Features:\n\
-\n\
-o This is the inital commit, EVERYTHING is new!\n\
-\n\
-Bug fixes - not very interesting:\n\
-\n\
-o None\n\
-\n\
-Something is gone:\n\
-\n\
-o None\n\
-\n\
-HOW TO INSTALL package/Author?\n\
-\n\
-o UNIX: Look at estruct.h, do a 'make', test the program, 'make install'.\n\
-\n\
-\n\
-ACKNOWLEDGEMENTS AND STATUS\n\
-\n\
-This project's file strucutre, file format, and certain contents are\n\
-derived from uEmacs/PK 4.0 specifically from the Linux Torvalds\n\
-distribution on GitHub. The README on from uEmacs/PK 4.0 has greater and\n\
-more accurate attributions, if you desire.\n\
-\n\
-LATE MODIFIED DATE", src, src);
-
- ginit(); /* initialize a git repository */
-
- return 0;
-}
diff --git a/full.h b/full.h
@@ -1,6 +0,0 @@
-#ifndef FULL_H_
-#define FULL_H_
-
-int full_project_init_and_cd(char *src);
-
-#endif /* FULL_H_ */
diff --git a/git.c b/git.c
@@ -1,17 +0,0 @@
-/* git.c
- *
- * Routines for initilizing a git repository
- *
- * written by vx-clutch
- */
-
-#include "git.h"
-#include "edef.h"
-#include <stdlib.h>
-
-int ginit()
-{
- if (git) return 0;
- system("git init --quiet");
- return 0;
-}
diff --git a/git.h b/git.h
@@ -1,6 +0,0 @@
-#ifndef GIT_H_
-#define GIT_H_
-
-int ginit();
-
-#endif /* GIT_H_ */
diff --git a/globals.c b/globals.c
@@ -1,6 +0,0 @@
-#include "estruct.h"
-#include "edef.h"
-
-/* initialized global definitions */
-
-int git = DEFAULT_GIT;
diff --git a/input.c b/input.c
@@ -1,70 +0,0 @@
-/* input.c
- *
- * Various input routines
- *
- * written by vx-clutch
- */
-
-#include <ctype.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "input.h"
-
-char *getstring(char *fmt, ...) {
- va_list args;
- va_start(args, fmt);
-
- printf("? ");
- vprintf(fmt, args);
- putc(' ', stdout);
-
- va_end(args);
- fflush(stdout);
-
- char *buf = NULL;
- size_t size = 0;
- ssize_t len = getline(&buf, &size, stdin);
-
- if (len < 0) {
- free(buf);
- return NULL;
- }
-
- if (len > 0 && buf[len - 1] == '\n')
- buf[len - 1] = '\0';
-
- return buf;
-}
-
-int yesno(char *fmt, ...) {
- char prompt[256];
-
- va_list ap;
- va_start(ap, fmt);
- vsnprintf(prompt, sizeof prompt, fmt, ap);
- va_end(ap);
-
- char buf[64];
- for (;;) {
- fprintf(stderr, "? %s", prompt);
- fputs(" (y/n) ", stdout);
- fflush(stdout);
-
- if (!fgets(buf, sizeof buf, stdin))
- return 0;
-
- size_t i = 0;
- while (buf[i] && isspace((unsigned char)buf[i]))
- i++;
- if (!buf[i])
- continue;
-
- char c = tolower((unsigned char)buf[i]);
- if (c == 'y')
- return 1;
- if (c == 'n')
- return 0;
- }
-}
diff --git a/input.h b/input.h
@@ -1,9 +0,0 @@
-#ifndef INPUT_H_
-#define INPUT_H_
-
-enum { TRUE, FALSE, GUARANTEE };
-
-char *getstring(char *fmt, ...);
-int yesno(char *fmt, ...);
-
-#endif /* INPUT_H_ */
diff --git a/main.c b/main.c
@@ -1,83 +0,0 @@
-/*
- * main.c
- *
- * yait/fSD 1.0
- *
- * Copying policy:
- *
- * yait 1.0 can be copied and distributed freely for any
- * non-commercial purposes. yait 1.0 can only be incorporated
- * into commercial software with the permission of the current author.
- *
- * This file contains the main driving routine, and some handling
- * for C/SH distinction.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-#include "edef.h"
-#include "proj.h"
-#include "shell.h"
-#include "usage.h"
-#include "version.h"
-
-void usage(int status) {
- printf("Usage: %s filename\n", PROGRAM_NAME);
- printf(" or: %s [options]\n\n", PROGRAM_NAME);
- fputs(" -s enable shell creation mode\n", stdout);
- fputs(" -S enable shell creation mode as a full project\n", stdout);
- fputs(" --git initialize a git repository\n", stdout);
- fputs(" --help display this help and exit\n", stdout);
- fputs(" --version output version information and exit\n", stdout);
-
- exit(status);
-}
-
-int main(int argc, char **argv) {
- int shell_mode = 0;
- char *package = NULL;
- int carg;
-
- if (argc < 2)
- die("not enough arguments");
-
- if (argc == 2) {
- if (strcmp(argv[1], "--help") == 0)
- usage(EXIT_SUCCESS);
- else if (strcmp(argv[1], "--version") == 0) {
- version();
- exit(EXIT_SUCCESS);
- }
- }
-
- for (carg = 1; carg < argc; ++carg) {
- if (argv[carg][0] == '-') {
- if (argv[carg][1] == 's')
- shell_mode = SINGLE;
- else if (argv[carg][1] == 'S')
- shell_mode = FULL;
- else if (strcmp(argv[carg], "--git"))
- git = 1;
- else
- die("unknown option");
- } else
- package = argv[carg];
- }
-
- if (!package)
- die("no package name provided");
-
- if (shell_mode)
- makeshell(package, shell_mode);
- else
- makeproj(package);
-
- return 0;
-}
diff --git a/proj.c b/proj.c
@@ -1,264 +0,0 @@
-/* proj.c
- *
- * The routines in this file generater an
- * opinionated C project.
- *
- * written by vx-clutch
- */
-
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "estruct.h"
-#include "wrapper.h"
-#include "file.h"
-#include "input.h"
-#include "proj.h"
-#include "usage.h"
-#include "util.h"
-#include "version.h"
-
-int makeproj(char *src) {
- if (ffexist(src))
- die("%s already exists", src);
-
- fmkdir(src);
- if (chdir(src))
- die("could not cd into %s", src);
-
- int year = getyear();
- char *author = getstring("Author");
- char *description = getstring("Description");
-
- ffwrite("main.c", "\
-/*\n\
- * main.c\n\
- *\n\
- * %s/%s 1.0\n\
- *\n\
- * Copying policy\n\
- *\n\
- * %s 1.0 can be copied and distributed freely for any\n\
- * non-commercial purposes. %s 1.0 can only be incorporated\n\
- * into commercial software with the permission of the current author.\n\
- *\n\
- * This file contains the main driving routine.\n\
- *\n\
- */\n\
-\n\
-#include <stdio.h>\n\
-#include <stdlib.h>\n\
-#include <string.h>\n\
-\n\
-#include \"version.h\"\n\
-#include \"estruct.h\"\n\
-\n\
-void usage(int status)\n\
-{\n\
- printf(\"Usage: %%s REQUIRED POSITIONAL ARGUMENT\\n\", PROGRAM_NAME);\n\
- printf(\" or: %%s [options]\\n\\n\", PROGRAM_NAME);\n\
- fputs(\" --help display this help and exit\\n\", stdout);\n\
- fputs(\" --version output version information and exit\\n\", stdout);\n\
-\n\
- exit(status);\n\
-}\n\
-\n\
-int main(int argc, char **argv)\n\
-{\n\
- int carg;\n\
-\n\
- if (argc == 2) {\n\
- if (strcmp(argv[1], \"--help\") == 0) {\n\
- usage(EXIT_FAILURE);\n\
- }\n\
- if (strcmp(argv[1], \"--version\") == 0) {\n\
- version();\n\
- exit(EXIT_SUCCESS);\n\
- }\n\
- }\n\
-\n\
- puts(MESSAGE);\n\
-\n\
- return 0;\n\
-}", src, author, src, src);
-
- size_t len = strlen(src) + 1 + strlen(author) + 6; /* account for " 1.0 " */
- char *pad = xmalloc(len + 1);
- memset(pad, '-', len);
- pad[len] = '\0';
- ffwrite("README", "\
-+%s+\n\
-| %s/%s 1.0 |\n\
-+%s+\n\
-\n\
- %s\n\
-\n\
- %s was written by %s\n\
-\n\
- Copyright Notices:\n\
-\n\
- %s 1.0 (c) Copyright %d %s\n\
-\n\
- Reference the COPYING file for detailed information\n\
-\n\
-\n\
-WHAT IS %s/%s?\n\
-\n\
-%s/%s 1.0 %s\n\
-\n\
-\n\
-WHAT IS NEW\n\
-\n\
-Features:\n\
-\n\
-o This is the first version, EVERYTHING is new!\n\
-\n\
-Bug fixes - not very interesting:\n\
-\n\
-o None\n\
-\n\
-Something is gone:\n\
-\n\
-o None\n\
-\n\
-HOW TO INSTALL %s/%s?\n\
-\n\
-o UNIX: Look at estruct.h, do a 'make', test the program, 'make install'.\n\
-\n\
-\n\
-ACKNOWLEDGEMENTS AND STATUS\n\
-\n\
-This project's file strucutre, file format, and certain contents are\n\
-derived from uEmacs/PK 4.0 specifically from the Linux Torvalds\n\
-distribution on GitHub. The README on from uEmacs/PK 4.0 has greater and\n\
-more accurate attributions, if you desire.\n\
-\n\
-%s was generated using %s %s\n\
-\n\
-LAST MODIFED DATE\
-",
- pad,
- src, author,
- pad,
- description,
- src, author,
- src, year, author,
- src, author,
- src, author, description,
- src, author,
- src, PROGRAM_NAME_LONG, VERSION);
-
- ffwrite("version.h", "\
-#ifndef VERSION_H_\n\
-#define VERSION_H_\n\
-\n\
-#define PROGRAM_NAME \"%s\"\n\
-#define PROGRAM_NAME_LONG \"%s/%s\"\n\
-\n\
-#define VERSION \"1.0.0\"\n\
-\n\
-/* Print the version string. */\n\
-void version(void);\n\
-\n\
-#endif /* VERSION_H_ */", src, src, author);
- ffwrite("version.c", "\
-#include <stdio.h>\n\
-#include \"version.h\"\n\
-\n\
-void version(void)\n\
-{\n\
- printf(\"%%s version %%s\\n\", PROGRAM_NAME_LONG, VERSION);\n\
-}");
-
- ffwrite("Makefile", "\
-# Makefile for %s\n\
-\n\
-# Make the build silent by default\n\
-V =\n\
-\n\
-ifeq ($(strip $(V)),)\n\
- E = @echo\n\
- Q = @\n\
-else\n\
- E = @\\#\n\
- Q =\n\
-endif\n\
-export E Q\n\
-\n\
-PROGRAM = %s\n\
-TARBALL = $(PROGRAM).tar\n\
-SRC = $(wildcard *.c)\n\
-OBJ = $(SRC:.c=.o)\n\
-HDR = $(wildcard *.h)\n\
-\n\
-CC = gcc\n\
-WARNINGS = -Wall -Wstrict-prototypes\n\
-CFLAGS = -O2 $(WARNINGS) -g\n\
-DEFINES =\n\
-LIBS =\n\
-LDFLAGS =\n\
-BINDIR = /usr/bin\n\
-LIBDIR = /usr/lib\n\
-\n\
-$(PROGRAM): $(OBJ) $(HDR)\n\
- $(E) \" LINK \" $@\n\
- $(Q) $(CC) $(LDFLAGS) $(DEFINES) -o $@ $(OBJ) $(LIBS)\n\
-\n\
-clean:\n\
- $(E) \" CLEAN\"\n\
- $(Q) rm -f $(PROGRAM) $(OBJ)\n\
-\n\
-install: $(PROGRAM)\n\
- cp $(PROGRAM) ${BINDIR}\n\
-\n\
-release: $(PROGRAM)\n\
- tar cvf $(TARBALL) $(SRC) $(HDR) Makefile README\n\
-\n\
-.c.o:\n\
- $(E) \" CC \" $@\n\
- $(Q) $(CC) $(CFLAGS) $(DEFINES) -c $< -o $@", src, src);
-
- ffwrite("usage.h", "\
-#ifndef USAGE_H_\n\
-#define USAGE_H_\n\
-\n\
-void die(const char* err, ...);\n\
-\n\
-#endif /* USAGE_H_ */");
- ffwrite("usage.c", "\
-#include \"usage.h\"\n\
-\n\
-#include <stdarg.h>\n\
-#include <stdio.h>\n\
-#include <stdlib.h>\n\
-\n\
-static void report(const char* prefix, const char *err, va_list params)\n\
-{\n\
- char msg[4096];\n\
- vsnprintf(msg, sizeof(msg), err, params);\n\
- fprintf(stderr, \"%%s%%s\\n\", prefix, msg);\n\
-}\n\
-\n\
-void die(const char* err, ...)\n\
-{\n\
- va_list params;\n\
-\n\
- va_start(params, err);\n\
- report(\"fatal: \", err, params);\n\
- va_end(params);\n\
- exit(128);\n\
-}");
-
- ffwrite("estruct.h", "\
-#ifndef ESTRUCT_H_\n\
-#define ESTRUCT_H_\n\
-\n\
-/* Configuration options */\n\
-\n\
-#define MESSAGE \"Hello, World!\" /* Default greeting */\n\
-\n\
-#endif /* ESTRUCT_H_ */");
-
- return 0;
-}
diff --git a/proj.h b/proj.h
@@ -1,6 +0,0 @@
-#ifndef PROJ_H_
-#define PROJ_H_
-
-int makeproj(char *src);
-
-#endif /* PROJ_H_ */
diff --git a/scripts/git-hooks/pre-commit b/scripts/git-hooks/pre-commit
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Run pre-commit checks on bin/yait. Requires `shellcheck` and a POSIX
+# shell (duh).
+
+me=$(basename "$0")
+
+fmt() {
+ echo "${me}[$$]: $*"
+}
+
+script_path="./bin/yait"
+
+if git diff --cached --name-only | grep -q "$script_path"; then
+ if shellcheck --enable=all --shell=sh "$script_path"; then
+ fmt "All tests passed."
+ exit 0
+ else
+ fmt "Syntax errors found in $script_path. Commit aborted."
+ exit 1
+ fi
+fi
+
+exit 0
diff --git a/shell.c b/shell.c
@@ -1,77 +0,0 @@
-/* shell.c
- *
- * The routines in this file generater an
- * opiionated shell script.
- *
- * written by vx-clutch
- */
-
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include "estruct.h"
-#include "file.h"
-#include "full.h"
-#include "edef.h"
-#include "input.h"
-#include "shell.h"
-#include "single.h"
-#include "usage.h"
-
-int makeshell(char *src, int complexity) {
- char *license = LICENSE;
-
- if (complexity == SINGLE)
- single_init(src);
- else if (complexity == FULL) {
- full_project_init_and_cd(src);
- }
- else
- die("invalid state! shell.c:%d", __LINE__);
-
- if (!QLICENSE)
- license = getstring("License");
- char *description = getstring("Description");
-
- ffwrite(src, "\
-#!/bin/sh\n\
-# SPDX-License-Identifier: %s\n\
-#\n\
-# %s\n\
-\n\
-me=$0\n\
-scriptversion=\"1.0.0\"\n\
-\n\
-version=\"$me $scriptversion\n\
-\n\
-Copyright (C) %d %s.\n\
-This is free software; you are free to change and redistribute it.\n\
-There is NO WARRANTY, to the extent permitted by law.\"\n\
-\n\
-usage=\"\\\n\
-Usage: $me [OPTION]...\n\
-%s\n\
-\n\
-Options:\n\
- --help print this help and exit\n\
- --version output version information\n\"\n\
-\n\
-while [ $# -gt 0 ]; do\n\
- case $1 in\n\
- --help) echo \"$usage\"; exit 0 ;;\n\
- --version) echo \"$version\"; exit 0 ;;\n\
- -*)\n\
- echo \"$0: Unknown option '$1'.\" >&2\n\
- echo \"$0: Try '--help' for more information.\" >&2\n\
- exit 1 ;;\n\
- esac\n\
- shift\n\
-done",
- license, description, 2026, "fSD", description);
-
- struct stat st;
- if (stat(src, &st) == 0)
- chmod(src, st.st_mode | S_IXUSR | S_IXGRP | S_IXOTH);
-
- return 0;
-}
diff --git a/shell.h b/shell.h
@@ -1,6 +0,0 @@
-#ifndef SHELL_H_
-#define SHELL_H_
-
-int makeshell(char *src, int complexity);
-
-#endif /* SHELL_H_ */
diff --git a/single.c b/single.c
@@ -1,20 +0,0 @@
-/* single.c
- *
- * Init to be called before single file
- * creation as a final product.
- *
- * written by vx-clutch
- */
-
-#include <unistd.h>
-
-#include "file.h"
-#include "single.h"
-#include "usage.h"
-
-int single_init(char *src)
-{
- if (ffexist(src))
- die("%s already exists", src);
- return 0;
-}
diff --git a/single.h b/single.h
@@ -1,6 +0,0 @@
-#ifndef SINGLE_H_
-#define SINGLE_H_
-
-int single_init(char *src);
-
-#endif /* SINGLE_H_ */
diff --git a/usage.c b/usage.c
@@ -1,22 +0,0 @@
-#include "usage.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static void report(const char* prefix, const char *err, va_list params)
-{
- char msg[4096];
- vsnprintf(msg, sizeof(msg), err, params);
- fprintf(stderr, "%s%s\n", prefix, msg);
-}
-
-void die(const char* err, ...)
-{
- va_list params;
-
- va_start(params, err);
- report("fatal: ", err, params);
- va_end(params);
- exit(128);
-}
diff --git a/usage.h b/usage.h
@@ -1,6 +0,0 @@
-#ifndef USAGE_H_
-#define USAGE_H_
-
-void die(const char* err, ...);
-
-#endif /* USAGE_H_ */
diff --git a/util.c b/util.c
@@ -1,10 +0,0 @@
-#include "util.h"
-#include <time.h>
-
-int getyear()
-{
- time_t now = time(NULL);
- struct tm *t = localtime(&now);
-
- return t->tm_year + 1900;
-}
diff --git a/util.h b/util.h
@@ -1,6 +0,0 @@
-#ifndef UTIL_H_
-#define UTIL_H_
-
-int getyear();
-
-#endif
diff --git a/version.c b/version.c
@@ -1,7 +0,0 @@
-#include <stdio.h>
-#include "version.h"
-
-void version(void)
-{
- printf("%s version %s\n", PROGRAM_NAME_LONG, VERSION);
-}
diff --git a/version.h b/version.h
@@ -1,12 +0,0 @@
-#ifndef VERSION_H_
-#define VERSION_H_
-
-#define PROGRAM_NAME "yait"
-#define PROGRAM_NAME_LONG "yait/fSD"
-
-#define VERSION "1.0.0"
-
-/* Print the version string. */
-void version(void);
-
-#endif /* VERSION_H_ */
diff --git a/wrapper.c b/wrapper.c
@@ -1,13 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "wrapper.h"
-#include "usage.h"
-
-void *xmalloc(size_t size)
-{
- void *ret = malloc(size);
- if (!ret)
- die("memory exhausted");
- return ret;
-}
diff --git a/wrapper.h b/wrapper.h
@@ -1,8 +0,0 @@
-#ifndef WRAPPER_H_
-#define WRAPPER_H_
-
-#include <stdio.h>
-
-void *xmalloc(size_t size);
-
-#endif
diff --git a/yait.1 b/yait.1
@@ -0,0 +1,41 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.3.
+.TH FSD "1" "January 2026" "fSD v0.2.1" "User Commands"
+.SH NAME
+fSD \- manual page for fSD v0.2.1
+.SH SYNOPSIS
+.B yait
+[\fI\,OPTION\/\fR]... \fI\,<version> <dir>\/\fR
+.SH DESCRIPTION
+Highly opinionated C and SH project generator
+.SH OPTIONS
+.TP
+\fB\-\-help\fR
+print this help and exit
+.TP
+\fB\-\-version\fR
+output version information
+.TP
+\fB\-x\fR <language>
+set project type
+.HP
+\fB\-d\fR <description> set a description
+.TP
+\fB\-S\fR
+small project creation
+.TP
+\fB\-f\fR
+overwrite existing files
+.TP
+\fB\-a\fR <author>
+set project author
+.TP
+\fB\-r\fR
+initialize Git repository for the project
+.TP
+\fB\-q\fR
+surpress output
+.SH COPYRIGHT
+Copyright \(co 2025\-2026 fSD.
+.br
+This is free software; you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.