better Makefile

This commit is contained in:
2025-06-04 09:15:36 +02:00
parent 2a85d8d0e1
commit 7adfcc7b23
2 changed files with 84 additions and 35 deletions
+17 -6
View File
@@ -1,13 +1,24 @@
TARGET=mg TARGET ?= margen
INSTALL_DIR ?= $(HOME)/.local/bin
TEST_ARGS ?= -w=100 -h=100
SHELL := /bin/bash
.PHONY: build .PHONY: build
clean: clean:
rm -rf build @rm -rf build
build: build:
mkdir -p build @mkdir -p build
gcc -Wall src/*.c src/*.h -o build/$(TARGET) gcc -Wall src/*.c src/*.h -o build/$(TARGET)
.PHONY: leak-test .PHONY: install
leak-test: clean build install: build
valgrind --leak-check=full -s ./build/$(TARGET) cp -f build/$(TARGET) $(INSTALL_DIR)/$(TARGET)
.PHONY: time
time: build
time ./build/$(TARGET) $(TEST_ARGS)
.PHONY: valgrind
valgrind: build
valgrind --leak-check=full -s ./build/$(TARGET) $(TEST_ARGS)
+67 -29
View File
@@ -3,8 +3,9 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
void print_help(int status_code) { void print_help(int status_code)
puts("usage: mg " {
puts("usage: margen "
"[--help] " "[--help] "
"[-q] " "[-q] "
"[-w=WIDTH] " "[-w=WIDTH] "
@@ -29,15 +30,20 @@ void print_help(int status_code) {
exit(status_code); exit(status_code);
} }
void invalid_arg(char *arg) { void invalid_arg(char *arg)
{
fprintf(stderr, "invalid argument: '%s'\n\n", arg); fprintf(stderr, "invalid argument: '%s'\n\n", arg);
print_help(1); print_help(1);
} }
void invalid_value(char *arg, char *subarg, char *value) { void invalid_value(char *arg, char *subarg, char *value)
if (subarg == NULL) { {
if (subarg == NULL)
{
fprintf(stderr, "invalid value for argument '%s': '%s'\n\n", arg, value); fprintf(stderr, "invalid value for argument '%s': '%s'\n\n", arg, value);
} else { }
else
{
fprintf(stderr, "invalid value for argument '%s' %s: '%s'\n\n", arg, subarg, fprintf(stderr, "invalid value for argument '%s' %s: '%s'\n\n", arg, subarg,
value); value);
} }
@@ -46,54 +52,66 @@ void invalid_value(char *arg, char *subarg, char *value) {
bool is_arg(char *arg, char *ref) { return strcoll(arg, ref) == 0; } bool is_arg(char *arg, char *ref) { return strcoll(arg, ref) == 0; }
char *split_arg_value(char *arg) { char *split_arg_value(char *arg)
{
strtok(arg, "="); strtok(arg, "=");
return strtok(NULL, "="); return strtok(NULL, "=");
} }
bool is_digit(char c) { return c >= '0' && c <= '9'; } bool is_digit(char c) { return c >= '0' && c <= '9'; }
bool is_number(char *value) { bool is_number(char *value)
if (value == NULL) { {
if (value == NULL)
{
return false; return false;
} }
unsigned long value_len = strlen(value); unsigned long value_len = strlen(value);
int i; int i;
for (i = 0; i < value_len; i++) { for (i = 0; i < value_len; i++)
if (!is_digit(value[i])) { {
if (!is_digit(value[i]))
{
return false; return false;
} }
} }
return value; return value;
} }
long parse_number(char *arg, char *value) { long parse_number(char *arg, char *value)
if (!is_number(value)) { {
if (!is_number(value))
{
invalid_value(arg, NULL, value); invalid_value(arg, NULL, value);
} }
return atol(value); return atol(value);
} }
void parse_color(char *arg, char *value, unsigned char color[3]) { void parse_color(char *arg, char *value, unsigned char color[3])
{
char *tmp; char *tmp;
tmp = strtok(value, ","); tmp = strtok(value, ",");
if (!is_number(tmp)) { if (!is_number(tmp))
{
invalid_value(arg, "(R)", tmp); invalid_value(arg, "(R)", tmp);
} }
color[0] = (unsigned char)atoi(tmp); color[0] = (unsigned char)atoi(tmp);
tmp = strtok(NULL, ","); tmp = strtok(NULL, ",");
if (!is_number(tmp)) { if (!is_number(tmp))
{
invalid_value(arg, "(G)", tmp); invalid_value(arg, "(G)", tmp);
} }
color[1] = (unsigned char)atoi(tmp); color[1] = (unsigned char)atoi(tmp);
tmp = strtok(NULL, ","); tmp = strtok(NULL, ",");
if (!is_number(tmp)) { if (!is_number(tmp))
{
invalid_value(arg, "(B)", tmp); invalid_value(arg, "(B)", tmp);
} }
color[2] = (unsigned char)atoi(tmp); color[2] = (unsigned char)atoi(tmp);
} }
parameters parse_args(int argc, char **argv) { parameters parse_args(int argc, char **argv)
{
parameters params; parameters params;
params.quiet = false; params.quiet = false;
@@ -112,28 +130,48 @@ parameters parse_args(int argc, char **argv) {
int i; int i;
char *arg; char *arg;
char *value; char *value;
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++)
{
arg = argv[i]; arg = argv[i];
value = split_arg_value(arg); value = split_arg_value(arg);
if (is_arg(arg, "--help")) { if (is_arg(arg, "--help"))
{
print_help(0); print_help(0);
} else if (is_arg(arg, "-q") || is_arg(arg, "--quiet")) { }
else if (is_arg(arg, "-q") || is_arg(arg, "--quiet"))
{
params.quiet = true; params.quiet = true;
} else if (is_arg(arg, "-w") || is_arg(arg, "--width")) { }
else if (is_arg(arg, "-w") || is_arg(arg, "--width"))
{
params.width = (unsigned long)parse_number(arg, value); params.width = (unsigned long)parse_number(arg, value);
} else if (is_arg(arg, "-h") || is_arg(arg, "--height")) { }
else if (is_arg(arg, "-h") || is_arg(arg, "--height"))
{
params.height = (unsigned long)parse_number(arg, value); params.height = (unsigned long)parse_number(arg, value);
} else if (is_arg(arg, "-o") || is_arg(arg, "--output")) { }
else if (is_arg(arg, "-o") || is_arg(arg, "--output"))
{
params.file_path = value; params.file_path = value;
} else if (is_arg(arg, "-p") || is_arg(arg, "--pixel")) { }
else if (is_arg(arg, "-p") || is_arg(arg, "--pixel"))
{
params.size = (unsigned char)parse_number(arg, value); params.size = (unsigned char)parse_number(arg, value);
} else if (is_arg(arg, "-s") || is_arg(arg, "--slope")) { }
else if (is_arg(arg, "-s") || is_arg(arg, "--slope"))
{
params.size = (unsigned char)parse_number(arg, value); params.size = (unsigned char)parse_number(arg, value);
} else if (is_arg(arg, "-c") || is_arg(arg, "--color")) { }
else if (is_arg(arg, "-c") || is_arg(arg, "--color"))
{
parse_color(arg, value, params.start); parse_color(arg, value, params.start);
} else if (is_arg(arg, "-v") || is_arg(arg, "--variation")) { }
else if (is_arg(arg, "-v") || is_arg(arg, "--variation"))
{
parse_color(arg, value, params.start); parse_color(arg, value, params.start);
} else { }
else
{
invalid_arg(arg); invalid_arg(arg);
} }
} }