aboutsummaryrefslogtreecommitdiff
path: root/exam_final/rendu/brainfuck/brainfuck.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-07-26 23:17:36 +0200
committerCharles <sircharlesaze@gmail.com>2019-07-26 23:17:36 +0200
commit8ec5431354bdb582455e8c32758098c5a0fdada2 (patch)
tree480c68814f822439850029df0e0249a2cafb8177 /exam_final/rendu/brainfuck/brainfuck.c
parent475449dd4b1f3308bac6f72c34d87812216a0738 (diff)
downloadpiscine-8ec5431354bdb582455e8c32758098c5a0fdada2.tar.gz
piscine-8ec5431354bdb582455e8c32758098c5a0fdada2.tar.bz2
piscine-8ec5431354bdb582455e8c32758098c5a0fdada2.zip
exam final
Diffstat (limited to 'exam_final/rendu/brainfuck/brainfuck.c')
-rwxr-xr-xexam_final/rendu/brainfuck/brainfuck.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/exam_final/rendu/brainfuck/brainfuck.c b/exam_final/rendu/brainfuck/brainfuck.c
new file mode 100755
index 0000000..4cd619d
--- /dev/null
+++ b/exam_final/rendu/brainfuck/brainfuck.c
@@ -0,0 +1,85 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* brainfuck.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: exam <marvin@42.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2019/07/26 16:42:44 by exam #+# #+# */
+/* Updated: 2019/07/26 17:43:25 by exam ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "stack.h"
+#include <stdlib.h>
+#include <unistd.h>
+
+void go_close(char **str)
+{
+ t_stack *st;
+
+ st = create_elem(**str);
+ while (st != NULL)
+ {
+ (*str)++;
+ if (**str == '[')
+ st = push(st, '[');
+ if (**str == ']')
+ st = pop(st);
+ }
+}
+
+void go_open(char **str)
+{
+ t_stack *st;
+
+ st = create_elem(**str);
+ while (st != NULL)
+ {
+ (*str)--;
+ if (**str == ']')
+ st = push(st, ']');
+ if (**str == '[')
+ st = pop(st);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ char *ptr;
+ char *origin;
+ char *str;
+ int i;
+
+ if (argc != 2)
+ {
+ write(1, "\n", 1);
+ return (0);
+ }
+ origin = (char*)malloc(2048);
+ ptr = origin;
+ i = 0;
+ while (i < 2048)
+ ptr[i++] = 0;
+ str = argv[1];
+ while (*str)
+ {
+ if (*str == '>')
+ ptr++;
+ else if (*str == '<')
+ ptr--;
+ else if (*str == '+')
+ (*ptr)++;
+ else if (*str == '-')
+ (*ptr)--;
+ else if (*str == '.')
+ write(1, ptr, 1);
+ else if (*str == '[' && *ptr == 0)
+ go_close(&str);
+ else if (*str == ']' && *ptr != 0)
+ go_open(&str);
+ str++;
+ }
+ free(origin);
+ return (0);
+}