From 13f7e3b8eeac0a4a083d2d09ef7fc942e28a44c9 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Wed, 16 Nov 2022 11:26:51 +0100 Subject: [PATCH] initial commit --- getcomments.pl | 85 +++++++++++++++++++++++++++++++++++ makefile | 120 +++++++++++++++++++++++++++++++++++++++++++++++++ skel.c | 66 +++++++++++++++++++++++++++ 3 files changed, 271 insertions(+) create mode 100644 getcomments.pl create mode 100644 makefile create mode 100644 skel.c diff --git a/getcomments.pl b/getcomments.pl new file mode 100644 index 0000000..47edf67 --- /dev/null +++ b/getcomments.pl @@ -0,0 +1,85 @@ +#!/usr/bin/perl + +use strict; + +# default value +my $format = "%"; +my $pattern = ""; + +# help message +sub usage() { + + print <) { + my $cmt; + + # process c++ comments + ($cmt, $_) = m{//\s*(.*?)\s*$()} if (m{//} && !m{/\*.*//}); + + # process standard c comments + ($cmt, $_) = m{^.*?/\*\s*(.*?)\s*\*/(.*)}s if (m{/\*.*\*/}s); + + push(@comments, $cmt) if ($cmt); + + # empty buffer if no comment is present + undef($_) if (!m{/[/*]}); + } + + # close file + close (IN); + + # display comment blocks + foreach my $block (@comments) { + if (($block) = ($block =~ /$pattern(.*)/s)) { + ($_ = $format) =~ s/%/$block/gs; + print "$_\n"; + } + } +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..dcc7a58 --- /dev/null +++ b/makefile @@ -0,0 +1,120 @@ +# Default flags + +CC = gcc + +INCLUDES = -I../debug -D__MEMORY_ALLOCATION__ +#OFLAGS = -O4 -ffast-math -finline-functions +OFLAGS = -O4 -finline-functions +#OFLAGS += -mtune=pentium3 -mmmx -msse -msse2 -m3dnow +OFLAGS += -minline-all-stringops -fsingle-precision-constant +OFLAGS += -malign-double +CFLAGS += -Wall -Wextra -g +CFLAGS += -std=c99 -D_XOPEN_SOURCE=500 +CFLAGS += $(OFLAGS) $(INCLUDES) +LDFLAGS += -g + +# Targets + +ALLEXE = + +ALLEXE += skel + +SHELL = bash + +MAKE = mingw32-make +MAKEFLAGS += -s + +# Functions + +TITLE = echo -en "\033[0;1m$(strip $(1))\033[0;0m:\t" +PASS = echo -e "\033[1;32m$(strip $(1))\033[0;0m" +WARN = echo -e "\033[1;33m$(strip $(1))\033[0;0m" +FAIL = echo -e "\033[1;31m$(strip $(1))\033[0;0m" + +MKDIR = mkdir -p $(1) && chmod a+rx,go-w $(1) + +INSTALL = test -d `dirname $(2)` || $(call MKDIR, `dirname $(2)`) && cp -pa $(1) $(2) && chmod a+rX,go-w $(2) + +VALID = $(call TITLE, $(1)) && $(2) && $(call PASS, SUCCESS) || { $(call FAIL, FAILED); test; } + +## Generic rules + +all: depends + $(MAKE) $(ALLEXE:%=%.exe) + +alltests: all + $(MAKE) $(addprefix test_,$(ALLEXE:%.exe=%)) + +depends: $(patsubst %.c, %.d, $(wildcard *.c)) + +count: + wc $(wildcard *.c *.h) $(MAKEFILE_LIST) + +clean: + $(call TITLE, "Cleaning") + touch clean + rm -f clean $(wildcard *.d *.log *.o *.test *~ .exec_*) + $(call PASS, SUCCESS) + +purge: clean + $(call TITLE, "Purging") + touch purge + rm -f purge $(ALLEXE) $(shell [ -f .targets ] && { cat .targets | sort | uniq; echo .targets; }) + $(call PASS, SUCCESS) + +## Main rules + +include $(wildcard *.d) + +%.test: %.c + $(call TITLE, "Building $@") +# awk '/\/\* *test:.*\*\// { sub(/^.*\/\* *test: */, ""); sub(/ *\*\/.*$$/, ""); print }' $< > $@ + ./getcomments.pl -p='test:\s' -f='%' $< > $@ + $(call PASS, SUCCESS) + +test_%: %.test %.exe + PATH=$$PATH:.; \ + IFS=$$'\n'; \ + LOGFILE=${<:.test=.log}; \ + rm -f $$LOGFILE; \ + RC=0; \ + for test in `cat $<`; do \ + echo "=== $$test ===" | tee -a $$LOGFILE; \ + ( eval $(VALGRIND) $$test ) 2>&1 | tee -a $$LOGFILE; \ + [ $$? -eq 0 ] && echo -e "\033[1;32mSUCCESS\033[0;0m" \ + || { echo -e "\033[1;31mFAILED\033[0;0m"; RC=1; }; \ + done; \ + test "$$RC" -ne 1 + +valgrind_%: % + VALGRIND="valgrind -v --leak-check=full --show-reachable=yes --log-fd=2"; \ + export VALGRIND; \ + $(MAKE) test_$< + +%.d: %.c + $(call TITLE, "Building $@") + $(CC) $(INCLUDES) -MM $< -o $@~ + echo ${<:.c=.o}: $(shell ./getcomments.pl -p='depend:\s' -f='%' $<) >> $@~ + mv $@~ $@ + $(call PASS, SUCCESS) + +%.o: %.c + $(call TITLE, "Building $@") + $(CC) $(CFLAGS) $(INCLUDES) $(shell ./getcomments.pl -p='cflags:\s' -f='%' $<) -c $< -o $@ + $(call PASS, SUCCESS) + + +%.exe: %.o %.d + $(call TITLE, "Building $@") + $(CC) $(LDFLAGS) $(shell ./getcomments.pl -p='linker:\s' -f='%' ${<:.o=.c}) $< -o ${<:.o=} + echo ${<:.o=} >> .targets + #ln -sf ${<:.o=} $@ + $(call PASS, SUCCESS) + +## Phony + +.PHONY: clean count purge + +## Precious + +.PRECIOUS: %.d %.o diff --git a/skel.c b/skel.c new file mode 100644 index 0000000..c517dc5 --- /dev/null +++ b/skel.c @@ -0,0 +1,66 @@ +/* depend: */ +/* cflags: */ +/* linker: */ + +#include +#include +#include +#include +#include + +/* macros */ + +#define CEIL(x, y) (((x) + (y) - 1) / (y)) +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) +#define VERBOSE(level, statement...) do { if (level <= verbose) { statement; } } while(0) + +/* gobal variables */ + +char *progname = NULL; +int verbose = 0; + +/* help function */ + +void usage (int ret) +{ + FILE *fd = ret ? stderr : stdout; + fprintf (fd, "usage: %s\n", progname); + fprintf (fd, " -h : help message\n"); + fprintf (fd, " -v : verbose level (%d)\n", verbose); + + exit (ret); +} + +/* main function */ + +int main (int argc, char *argv[]) +{ + + progname = argv[0]; + + int c; + while ((c = getopt(argc, argv, "hv:")) != EOF) { + switch (c) { + case 'v': + verbose = atoi (optarg); + break; + case 'h': + default: + usage (c != 'h'); + } + } + if (argc - optind != 0) { + fprintf (stderr, "%s: invalid option -- %s\n", progname, argv[optind]); + usage (1); + } + + printf ("work in progress...\n"); + + return 0; +} + +// test: skel.exe -h +// test: skel.exe -h | awk '/usage:/ { rc=1 } END { exit (1-rc) }' +// test: skel.exe -_ 2> /dev/null | awk 'END { if (NR == 0) { exit(0) } else exit (1) }' +// test: skel.exe -_ 2>&1 | awk '/usage:/ { rc=1 } END { exit (1-rc) }' -- 2.30.2