diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/.clang-format | 59 | ||||
-rw-r--r-- | utils/Makefile | 30 | ||||
-rw-r--r-- | utils/math.c | 63 | ||||
-rw-r--r-- | utils/math.h | 29 |
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 |