aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/.clang-format59
-rw-r--r--utils/Makefile30
-rw-r--r--utils/math.c63
-rw-r--r--utils/math.h29
4 files changed, 181 insertions, 0 deletions
diff --git a/utils/.clang-format b/utils/.clang-format
new file mode 100644
index 0000000..0be45fa
--- /dev/null
+++ b/utils/.clang-format
@@ -0,0 +1,59 @@
+Language: Cpp
+
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: true
+AlignConsecutiveBitFields: true
+AlignConsecutiveDeclarations: false
+AlignConsecutiveMacros: true
+AlignEscapedNewlines: Right
+AlignOperands: Align
+AlignTrailingComments: true
+AllowAllArgumentsOnNextLine: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: Empty
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortEnumsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: Empty
+AllowShortIfStatementsOnASingleLine: Never
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+BinPackArguments: true
+BinPackParameters: true
+BreakBeforeBinaryOperators: NonAssignment
+BreakBeforeBraces: WebKit
+BreakBeforeTernaryOperators: true
+BreakStringLiterals: true
+ColumnLimit: 80
+ContinuationIndentWidth: 4
+DeriveLineEnding: false
+DerivePointerAlignment: false
+DisableFormat: false
+IncludeBlocks: Preserve
+IndentCaseBlocks: false
+IndentCaseLabels: false
+IndentExternBlock: Indent
+IndentGotoLabels: false
+IndentPPDirectives: AfterHash
+IndentWidth: 4
+IndentWrappedFunctionNames: false
+KeepEmptyLinesAtTheStartOfBlocks: false
+MaxEmptyLinesToKeep: 2
+PointerAlignment: Right
+ReflowComments: true
+SortIncludes: true
+SpaceAfterCStyleCast: true
+SpaceAfterLogicalNot: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceBeforeSquareBrackets: false
+SpaceInEmptyBlock: false
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInCStyleCastParentheses: false
+SpacesInConditionalStatement: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+TabWidth: 4
+UseCRLF: false
+UseTab: Never
diff --git a/utils/Makefile b/utils/Makefile
new file mode 100644
index 0000000..bfd55de
--- /dev/null
+++ b/utils/Makefile
@@ -0,0 +1,30 @@
+target := math
+objs := math.o
+
+CC := gcc
+CFLAGS := -O3 -std=c99 -pedantic -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wno-unused-result
+
+all: $(target)
+
+###
+# Automatic dependency tracking
+#
+deps := $(patsubst %.o,%.d,$(objs))
+-include $(deps)
+DEPFLAGS = -MMD -MF $(@:.o=.d)
+
+###
+# Compile the program
+#
+$(target): $(objs)
+ $(CC) $(CFLAGS) -o $@ $^
+
+%.o: src/%.c
+ $(CC) $(CFLAGS) -c $< $(DEPFLAGS)
+
+###
+# Phony targets
+#
+.PHONY: clean
+clean:
+ rm -f $(target) $(objs) $(deps)
diff --git a/utils/math.c b/utils/math.c
new file mode 100644
index 0000000..25ae645
--- /dev/null
+++ b/utils/math.c
@@ -0,0 +1,63 @@
+/*
+ * This is a simple program that calls BC and terminates it if it takes longer
+ * than five seconds to complete. There is no real reason for this to be done
+ * in C instead of Python, however there are some key advantages:
+ *
+ * - Mango gets to play with C making him happy
+ * - C is compiled instead of interpreted so this is technically more efficient
+ * - Ok mayyyybe is slower because it uses a seperate process?
+ * - It makes us look smarter?
+ */
+#define _POSIX_SOURCE
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "math.h"
+
+bool timeout = false, child_done = false;
+
+void timeout_hander(int UNUSED(sig))
+{
+ timeout = true;
+}
+
+void child_handler(int UNUSED(sig))
+{
+ child_done = true;
+}
+
+int main(void)
+{
+ pid_t pid = fork();
+ switch (pid) {
+ case 0:
+ execl("/bin/bc", "", "-q", "bc_funcs/lib.bc", "bc_funcs/init.bc",
+ FILE_NAME, "bc_funcs/exit.bc", NULL);
+ fallthrough;
+ case -1:
+ perror("calc");
+ return EXIT_FAILURE;
+ default:
+ /* Setup signal handlers after fork so the child doesnt inherit them */
+ signal(SIGALRM, timeout_hander);
+ signal(SIGCHLD, child_handler);
+ alarm(TIMEOUT);
+ pause();
+
+ /*
+ * Wait for either the child process to terminate, or for 5 seconds to
+ * have passed
+ */
+ if (timeout) {
+ puts("Error: 5 second timeout reached");
+ kill(pid, 9);
+ }
+
+ break;
+ }
+
+ return EXIT_SUCCESS;
+} \ No newline at end of file
diff --git a/utils/math.h b/utils/math.h
new file mode 100644
index 0000000..edfb9ee
--- /dev/null
+++ b/utils/math.h
@@ -0,0 +1,29 @@
+#ifndef __MATH_H_
+#define __MATH_H_
+
+/* Suppress unused parameter warnings */
+#ifdef __GNUC__
+# define UNUSED(x) UNUSED_##x __attribute__((__unused__))
+#else
+# define UNUSED(x) UNUSED_##x
+#endif
+
+/* Fallthrough pseudo-keyword macro */
+#if __has_attribute(__fallthrough__)
+# define fallthrough __attribute__((__fallthrough__))
+#else
+# define fallthrough \
+ do { \
+ } while (0) /* fallthrough */
+#endif
+
+#define EXIT_FAILURE 1
+#define EXIT_SUCCESS 0
+#define FILE_NAME "bc_input.bc"
+#define TIMEOUT 5
+
+/* Signal handlers */
+void timeout_hander(int sig);
+void child_handler(int sig);
+
+#endif \ No newline at end of file