From 1f4cc71b96b68da2a6d5075e0cb162ee0f627a46 Mon Sep 17 00:00:00 2001 From: Gabe Venberg Date: Fri, 1 Sep 2023 17:24:28 -0500 Subject: [PATCH] Hello world and puzzle program. --- .gitignore | 2 + combinations/Makefile | 65 +++++++++++++++++++++++++++++++++ combinations/src/combinations.c | 30 +++++++++++++++ hello_world/Makefile | 61 +++++++++++++++++++++++++++++++ hello_world/SimpleMakefile | 12 ++++++ hello_world/src/helloworld.c | 8 ++++ 6 files changed, 178 insertions(+) create mode 100644 combinations/Makefile create mode 100644 combinations/src/combinations.c create mode 100644 hello_world/Makefile create mode 100644 hello_world/SimpleMakefile create mode 100644 hello_world/src/helloworld.c diff --git a/.gitignore b/.gitignore index cd531cf..7830955 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,5 @@ Module.symvers Mkfile.old dkms.conf +#build directories +build/ diff --git a/combinations/Makefile b/combinations/Makefile new file mode 100644 index 0000000..4158cf9 --- /dev/null +++ b/combinations/Makefile @@ -0,0 +1,65 @@ +CC := gcc +CXX := g++ +OPTIMIZATION := -O3 +CFLAGS = ${OPTIMIZATION} -Werror -Wextra -Wall -Wpedantic +# all: helloworld +# +# #automatically built from implicit rules. +# helloworld: helloworld.c +# +# clean: +# rm -f helloworld +# +TARGET_EXEC := combinations + +BUILD_DIR := ./build +SRC_DIRS := ./src + +# Find all the C and C++ files we want to compile +# Note the single quotes around the * expressions. The shell will incorrectly expand these otherwise, but we want to send the * directly to the find command. +SRCS := $(shell find $(SRC_DIRS) -name '*.cpp' -or -name '*.c' -or -name '*.s') + +# Prepends BUILD_DIR and appends .o to every src file +# As an example, ./your_dir/hello.cpp turns into ./build/./your_dir/hello.cpp.o +OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) + +# String substitution (suffix version without %). +# As an example, ./build/hello.cpp.o turns into ./build/hello.cpp.d +DEPS := $(OBJS:.o=.d) + +# Every folder in ./src will need to be passed to GCC so that it can find header files +INC_DIRS := $(shell find $(SRC_DIRS) -type d) +# Add a prefix to INC_DIRS. So moduleA would become -ImoduleA. GCC understands this -I flag +INC_FLAGS := $(addprefix -I,$(INC_DIRS)) + +# The -MMD and -MP flags together generate Makefiles for us! +# These files will have .d instead of .o as the output. +DEPFLAGS := $(INC_FLAGS) -MMD -MP + +# The final build step. +$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS) + $(CXX) $(OBJS) -o $@ $(LDFLAGS) + +# Build step for C source +$(BUILD_DIR)/%.c.o: %.c + mkdir -p $(dir $@) + $(CC) $(DEPFLAGS) $(CFLAGS) -c $< -o $@ + +# Build step for C++ source +$(BUILD_DIR)/%.cpp.o: %.cpp + mkdir -p $(dir $@) + $(CXX) $(DEPFLAGS) $(CXXFLAGS) -c $< -o $@ + + +.PHONY: clean +clean: + rm -r $(BUILD_DIR) + +.PHONY: run +run: $(BUILD_DIR)/$(TARGET_EXEC) + $(BUILD_DIR)/$(TARGET_EXEC) + +# Include the .d makefiles. The - at the front suppresses the errors of missing +# Makefiles. Initially, all the .d files will be missing, and we don't want those +# errors to show up. +-include $(DEPS) diff --git a/combinations/src/combinations.c b/combinations/src/combinations.c new file mode 100644 index 0000000..90b3455 --- /dev/null +++ b/combinations/src/combinations.c @@ -0,0 +1,30 @@ +/* calculates all subsets of the string comb by assigning eatch letter a position in a binary number and counting up. */ +#include +#include + +// #define DEBUG + +int main() { + char* comb = "ABCD"; + int count = strlen(comb); + // that bitshifting is the same is squaring count + int permutations = (1 << count); + + printf("string is %s\nthere are %d permutations", comb, permutations); + + for (unsigned char i = 0; i < permutations; i++) { + for (unsigned char j = 0; j < 4; j++) { + // when j=0, will result in 0b0001, when j=1, 0b0010, j=2 0b0100. + unsigned char mask = 1 << j; +#ifdef DEBUG + printf(" j=%x mask=%x, postmask=%x, i=%x", j, mask, (i & mask), i); +#endif /* ifdef DEBUG */ + if ((i & mask) != 0) { + printf(" %c", comb[j]); + } + } + printf("\n"); + } + + return 0; +} diff --git a/hello_world/Makefile b/hello_world/Makefile new file mode 100644 index 0000000..0b954b6 --- /dev/null +++ b/hello_world/Makefile @@ -0,0 +1,61 @@ +CC := gcc +CXX := g++ +OPTIMIZATION := -O3 +CFLAGS = ${OPTIMIZATION} -Werror -Wextra -Wall -Wpedantic +# all: helloworld +# +# #automatically built from implicit rules. +# helloworld: helloworld.c +# +# clean: +# rm -f helloworld +# +TARGET_EXEC := helloworld + +BUILD_DIR := ./build +SRC_DIRS := ./src + +# Find all the C and C++ files we want to compile +# Note the single quotes around the * expressions. The shell will incorrectly expand these otherwise, but we want to send the * directly to the find command. +SRCS := $(shell find $(SRC_DIRS) -name '*.cpp' -or -name '*.c' -or -name '*.s') + +# Prepends BUILD_DIR and appends .o to every src file +# As an example, ./your_dir/hello.cpp turns into ./build/./your_dir/hello.cpp.o +OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) + +# String substitution (suffix version without %). +# As an example, ./build/hello.cpp.o turns into ./build/hello.cpp.d +DEPS := $(OBJS:.o=.d) + +# Every folder in ./src will need to be passed to GCC so that it can find header files +INC_DIRS := $(shell find $(SRC_DIRS) -type d) +# Add a prefix to INC_DIRS. So moduleA would become -ImoduleA. GCC understands this -I flag +INC_FLAGS := $(addprefix -I,$(INC_DIRS)) + +# The -MMD and -MP flags together generate Makefiles for us! +# These files will have .d instead of .o as the output. +DEPFLAGS := $(INC_FLAGS) -MMD -MP + +# The final build step. +$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS) + $(CXX) $(OBJS) -o $@ $(LDFLAGS) + +# Build step for C source +$(BUILD_DIR)/%.c.o: %.c + mkdir -p $(dir $@) + $(CC) $(DEPFLAGS) $(CFLAGS) -c $< -o $@ + +# Build step for C++ source +$(BUILD_DIR)/%.cpp.o: %.cpp + mkdir -p $(dir $@) + $(CXX) $(DEPFLAGS) $(CXXFLAGS) -c $< -o $@ + + +.PHONY: clean +clean: + rm -r $(BUILD_DIR) + +# Include the .d makefiles. The - at the front suppresses the errors of missing +# Makefiles. Initially, all the .d files will be missing, and we don't want those +# errors to show up. +-include $(DEPS) diff --git a/hello_world/SimpleMakefile b/hello_world/SimpleMakefile new file mode 100644 index 0000000..bea8648 --- /dev/null +++ b/hello_world/SimpleMakefile @@ -0,0 +1,12 @@ +CC := gcc +OPTIMIZATION := -O3 +CFLAGS = $(OPTIMIZATION) -Werror -Wextra -Wall -Wpedantic +all: helloworld + +#could be automatically built from implicit rules. +helloworld: src/helloworld.c + mkdir -p build + $(CC) $(CFLAGS) -o build/$@ $^ + +clean: + rm -rf build diff --git a/hello_world/src/helloworld.c b/hello_world/src/helloworld.c new file mode 100644 index 0000000..f25a259 --- /dev/null +++ b/hello_world/src/helloworld.c @@ -0,0 +1,8 @@ +#include +#include + +int main() +{ + printf("Hello World\n"); + return EXIT_SUCCESS; +}