Initial Commit

Signed-off-by: Daniel Henry <iamdanhenry@gmail.com>
This commit is contained in:
2025-09-19 15:57:42 -05:00
commit 26ac959046
2 changed files with 144 additions and 0 deletions

50
Makefile Normal file
View File

@@ -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

94
src/main.c Normal file
View File

@@ -0,0 +1,94 @@
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_WIDTH 64
// clang-format off
const char *emoji_map[256] = {
"😀","😁","😂","🤣","😃","😄","😅","😆",
"😉","😊","😋","😎","😍","😘","🥰","😗",
"😙","😚","🙂","🤗","🤩","🤔","🫡","🤨",
"😐","😑","😶","🙄","😏","😣","😥","😮",
"🤐","😯","😪","😫","🥱","😴","😌","😛",
"😜","😝","🤤","😒","😓","😔","😕","🙃",
"🫠","🤑","😲","","🙁","😖","😞","😟",
"😤","😢","😭","😦","😧","🥺","😨","😩",
"🤯","😬","😰","😱","🥵","🥶","😳","🤪",
"😵","🥴","😠","😡","🤬","😷","🤒","🤕",
"🤢","🤮","🤧","😇","🥳","🥸","😈","👿",
"👹","👺","💀","","👻","👽","👾","🤖",
"💩","😺","😸","😹","😻","😼","😽","🙀",
"😿","😾","🙈","🙉","🙊","🐵","🐒","🦍",
"🦧","🐶","🐕","🦮","🐕","🐩","🐺","🦊",
"🦝","🐱","🐈","🐈","🦁","🐯","🐅","🐆",
"🐴","🐎","🦄","🦓","🦌","🦬","🐮","🐂",
"🐃","🐄","🐷","🐖","🐗","🐽","🐏","🐑",
"🐐","🐪","🐫","🦙","🦒","🐘","🦣","🦏",
"🦛","🐭","🐁","🐀","🐹","🐰","🐇","🐿",
"🦫","🦔","🦇","🐻","🐻","🐨","🐼","🦥",
"🦦","🦨","🦘","🦡","🐾","🦃","🐔","🐓",
"🐣","🐤","🐥","🐦","🐧","🕊","🦅","🦆",
"🦢","🦉","🦤","🪶","🦩","🦚","🦜","🐸",
"🐊","🐢","🦎","🐍","🐲","🐉","🦕","🦖",
"🐳","🐋","🐬","🦭","🐟","🐠","🐡","🦈",
"🐙","🪼","🦑","🦐","🦞","🦀","🐚","🪸",
"🌌","🦋","🐛","🐜","🐝","🪲","🐞","🦗",
"🪳","🕷","🕸","🦂","🦟","🪰","🪱","🦠",
"💐","🌸","💮","🏵","🌹","🥀","🌺","🌻",
"🌼","🌷","🪷","🌱","🪴","🌲","🌳","🌴",
"🌵","🌾","🌿","","🍀","🍁","🍂","🍃"
};
// clang-format on
static void usage() {
fprintf(stderr, "Usage: binvis <filename> [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;
}