From 26ac959046305acb808e7c13086cd5866c0fcf4f Mon Sep 17 00:00:00 2001 From: Daniel Henry Date: Fri, 19 Sep 2025 15:57:42 -0500 Subject: [PATCH] Initial Commit Signed-off-by: Daniel Henry --- Makefile | 50 +++++++++++++++++++++++++++++ src/main.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 Makefile create mode 100644 src/main.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..12c469f --- /dev/null +++ b/Makefile @@ -0,0 +1,50 @@ +# Compiler and flags +CC := clang +CFLAGS := -Wall -Wextra -g -xc -std=c99 -I./include +LDFLAGS := + +EXEC_NAME := $(notdir $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))) + +# Directories +SRC_DIR := src +OBJ_DIR := obj +BIN_DIR := bin + +# Find all source files recursively +SRCS := $(shell find $(SRC_DIR) -name '*.c') +# Generate object file paths by replacing src/ with obj/ and .c with .o +OBJS := $(SRCS:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) +# Final executable name +EXEC := $(BIN_DIR)/$(EXEC_NAME) + +# First rule is the default rule +.PHONY: all +all: $(EXEC) + +# Rule to create directories if they don't exist +$(BIN_DIR) $(OBJ_DIR): + mkdir -p $@ + +# Rule to create object files +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR) + @mkdir -p $(dir $@) + $(CC) $(CFLAGS) -c $< -o $@ + +# Rule to create the executable +$(EXEC): $(OBJS) | $(BIN_DIR) + $(CC) $(OBJS) $(LDFLAGS) -o $@ + +# Clean rule to remove generated files +.PHONY: clean +clean: + rm -rf $(OBJ_DIR) $(BIN_DIR) + +# Debug rule to print variables +.PHONY: debug +debug: + @echo "Source files:" $(SRCS) + @echo "Object files:" $(OBJS) + +.PHONY: compiledb +bear: clean + bear -- make diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..9f67fe3 --- /dev/null +++ b/src/main.c @@ -0,0 +1,94 @@ +#include +#include +#include + +#define DEFAULT_WIDTH 64 + +// clang-format off + + +const char *emoji_map[256] = { + "๐Ÿ˜€","๐Ÿ˜","๐Ÿ˜‚","๐Ÿคฃ","๐Ÿ˜ƒ","๐Ÿ˜„","๐Ÿ˜…","๐Ÿ˜†", + "๐Ÿ˜‰","๐Ÿ˜Š","๐Ÿ˜‹","๐Ÿ˜Ž","๐Ÿ˜","๐Ÿ˜˜","๐Ÿฅฐ","๐Ÿ˜—", + "๐Ÿ˜™","๐Ÿ˜š","๐Ÿ™‚","๐Ÿค—","๐Ÿคฉ","๐Ÿค”","๐Ÿซก","๐Ÿคจ", + "๐Ÿ˜","๐Ÿ˜‘","๐Ÿ˜ถ","๐Ÿ™„","๐Ÿ˜","๐Ÿ˜ฃ","๐Ÿ˜ฅ","๐Ÿ˜ฎ", + "๐Ÿค","๐Ÿ˜ฏ","๐Ÿ˜ช","๐Ÿ˜ซ","๐Ÿฅฑ","๐Ÿ˜ด","๐Ÿ˜Œ","๐Ÿ˜›", + "๐Ÿ˜œ","๐Ÿ˜","๐Ÿคค","๐Ÿ˜’","๐Ÿ˜“","๐Ÿ˜”","๐Ÿ˜•","๐Ÿ™ƒ", + "๐Ÿซ ","๐Ÿค‘","๐Ÿ˜ฒ","โ˜น","๐Ÿ™","๐Ÿ˜–","๐Ÿ˜ž","๐Ÿ˜Ÿ", + "๐Ÿ˜ค","๐Ÿ˜ข","๐Ÿ˜ญ","๐Ÿ˜ฆ","๐Ÿ˜ง","๐Ÿฅบ","๐Ÿ˜จ","๐Ÿ˜ฉ", + "๐Ÿคฏ","๐Ÿ˜ฌ","๐Ÿ˜ฐ","๐Ÿ˜ฑ","๐Ÿฅต","๐Ÿฅถ","๐Ÿ˜ณ","๐Ÿคช", + "๐Ÿ˜ต","๐Ÿฅด","๐Ÿ˜ ","๐Ÿ˜ก","๐Ÿคฌ","๐Ÿ˜ท","๐Ÿค’","๐Ÿค•", + "๐Ÿคข","๐Ÿคฎ","๐Ÿคง","๐Ÿ˜‡","๐Ÿฅณ","๐Ÿฅธ","๐Ÿ˜ˆ","๐Ÿ‘ฟ", + "๐Ÿ‘น","๐Ÿ‘บ","๐Ÿ’€","โ˜ ","๐Ÿ‘ป","๐Ÿ‘ฝ","๐Ÿ‘พ","๐Ÿค–", + "๐Ÿ’ฉ","๐Ÿ˜บ","๐Ÿ˜ธ","๐Ÿ˜น","๐Ÿ˜ป","๐Ÿ˜ผ","๐Ÿ˜ฝ","๐Ÿ™€", + "๐Ÿ˜ฟ","๐Ÿ˜พ","๐Ÿ™ˆ","๐Ÿ™‰","๐Ÿ™Š","๐Ÿต","๐Ÿ’","๐Ÿฆ", + "๐Ÿฆง","๐Ÿถ","๐Ÿ•","๐Ÿฆฎ","๐Ÿ•","๐Ÿฉ","๐Ÿบ","๐ŸฆŠ", + "๐Ÿฆ","๐Ÿฑ","๐Ÿˆ","๐Ÿˆ","๐Ÿฆ","๐Ÿฏ","๐Ÿ…","๐Ÿ†", + "๐Ÿด","๐ŸŽ","๐Ÿฆ„","๐Ÿฆ“","๐ŸฆŒ","๐Ÿฆฌ","๐Ÿฎ","๐Ÿ‚", + "๐Ÿƒ","๐Ÿ„","๐Ÿท","๐Ÿ–","๐Ÿ—","๐Ÿฝ","๐Ÿ","๐Ÿ‘", + "๐Ÿ","๐Ÿช","๐Ÿซ","๐Ÿฆ™","๐Ÿฆ’","๐Ÿ˜","๐Ÿฆฃ","๐Ÿฆ", + "๐Ÿฆ›","๐Ÿญ","๐Ÿ","๐Ÿ€","๐Ÿน","๐Ÿฐ","๐Ÿ‡","๐Ÿฟ", + "๐Ÿฆซ","๐Ÿฆ”","๐Ÿฆ‡","๐Ÿป","๐Ÿป","๐Ÿจ","๐Ÿผ","๐Ÿฆฅ", + "๐Ÿฆฆ","๐Ÿฆจ","๐Ÿฆ˜","๐Ÿฆก","๐Ÿพ","๐Ÿฆƒ","๐Ÿ”","๐Ÿ“", + "๐Ÿฃ","๐Ÿค","๐Ÿฅ","๐Ÿฆ","๐Ÿง","๐Ÿ•Š","๐Ÿฆ…","๐Ÿฆ†", + "๐Ÿฆข","๐Ÿฆ‰","๐Ÿฆค","๐Ÿชถ","๐Ÿฆฉ","๐Ÿฆš","๐Ÿฆœ","๐Ÿธ", + "๐ŸŠ","๐Ÿข","๐ŸฆŽ","๐Ÿ","๐Ÿฒ","๐Ÿ‰","๐Ÿฆ•","๐Ÿฆ–", + "๐Ÿณ","๐Ÿ‹","๐Ÿฌ","๐Ÿฆญ","๐ŸŸ","๐Ÿ ","๐Ÿก","๐Ÿฆˆ", + "๐Ÿ™","๐Ÿชผ","๐Ÿฆ‘","๐Ÿฆ","๐Ÿฆž","๐Ÿฆ€","๐Ÿš","๐Ÿชธ", + "๐ŸŒŒ","๐Ÿฆ‹","๐Ÿ›","๐Ÿœ","๐Ÿ","๐Ÿชฒ","๐Ÿž","๐Ÿฆ—", + "๐Ÿชณ","๐Ÿ•ท","๐Ÿ•ธ","๐Ÿฆ‚","๐ŸฆŸ","๐Ÿชฐ","๐Ÿชฑ","๐Ÿฆ ", + "๐Ÿ’","๐ŸŒธ","๐Ÿ’ฎ","๐Ÿต","๐ŸŒน","๐Ÿฅ€","๐ŸŒบ","๐ŸŒป", + "๐ŸŒผ","๐ŸŒท","๐Ÿชท","๐ŸŒฑ","๐Ÿชด","๐ŸŒฒ","๐ŸŒณ","๐ŸŒด", + "๐ŸŒต","๐ŸŒพ","๐ŸŒฟ","โ˜˜","๐Ÿ€","๐Ÿ","๐Ÿ‚","๐Ÿƒ" +}; +// clang-format on + +static void usage() { + fprintf(stderr, "Usage: binvis [width]\n"); +} + +int main(int argc, char *argv[]) { + if (argc < 2) { + usage(); + return -1; + } + + const char *path = argv[1]; + int width = -1; + + if (argc >= 3) { + width = atoi(argv[2]); + if (width < 0 || width % 8 != 0) { + fprintf(stderr, + "Width MUST be a positive number that is divisible by 8. " + "Provided width was: %d\n", + width); + return -1; + } + } else { + width = DEFAULT_WIDTH; + } + + FILE *file = fopen(path, "rb"); + if (!file) { + perror("fopen"); + return -1; + } + + int c, count = 0; + while ((c = fgetc(file)) != EOF) { + uint8_t uc = (uint8_t)c; + if (uc != 0) { + printf("%s", emoji_map[uc]); + count++; + if (count % width == 0) { + printf("\n"); + } + } + } + putchar('\n'); + + fclose(file); + + return 0; +}