diff --git a/ex01/Makefile b/ex01/Makefile new file mode 100644 index 0000000..d6db729 --- /dev/null +++ b/ex01/Makefile @@ -0,0 +1,60 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: adjoly +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/25 16:09:27 by adjoly #+# #+# # +# Updated: 2025/06/03 11:58:38 by adjoly ### ########.fr # +# # +# **************************************************************************** # + +SHELL = bash + +NAME = RPN + +CC = clang++ + +OBJSDIR = obj/ + +SRCS = $(shell find . -name '*.cpp') + +OBJS = $(addprefix $(OBJSDIR), $(SRCS:.cpp=.o)) + +FLAGS = -Wall -Werror -Wextra -std=c++98 -MMD -MP + +RED = \033[0;31m +GREEN = \033[0;32m +YELLOW = \033[1;33m +PURPLE = \e[0;35m +NC = \033[0m +DELETE = \x1B[2K\r + +ifeq ($(VERBOSE),true) + FLAGS += -D VERBOSE +endif + +all: $(NAME) + +$(NAME): $(OBJS) + @$(CC) $(FLAGS) -I . $(OBJS) -o $(NAME) + @printf "$(YELLOW)「✨」($(NAME)) Program compiled\n" + +$(OBJSDIR)%.o: %.cpp + @mkdir -p $(@D) + @$(CC) $(FLAGS) -I . -c $< -o $@ + @printf "$(DELETE)$(GREEN)「🔨」($<) Object compiled\n" + +clean: + @rm -f $(OBJS) + @printf "$(DELETE)$(RED)「🗑️」($(OBJS)) Object deleted\n" + +fclean: clean + @rm -f $(NAME) + @rm -Rf $(OBJSDIR) + @printf "$(RED)「🗑️」($(NAME)) Program deleted\n" + +re: fclean all + +.PHONY: clean fclean all re diff --git a/ex01/RPN b/ex01/RPN new file mode 100755 index 0000000..1dbfd7c Binary files /dev/null and b/ex01/RPN differ diff --git a/ex01/RPN.cpp b/ex01/RPN.cpp new file mode 100644 index 0000000..93851c0 --- /dev/null +++ b/ex01/RPN.cpp @@ -0,0 +1,77 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* RPN.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/03 12:07:59 by adjoly #+# #+# */ +/* Updated: 2025/06/03 15:56:22 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include +#include +#include +#include + +int add(int first, int second) { return first + second; } +int subst(int first, int second) { return first + second; } +int mult(int first, int second) { return first * second; } +int div(int first, int second) { + if (second == 0) + throw std::invalid_argument("can't divide by 0 sorry D:"); + return first / second; +} + +void calc(int calc(int, int), std::string::const_iterator , + std::stack &stack) { + int first, second; + + if (stack.size() != 2) + throw std::range_error("need 2 at least two number"); + second = stack.top(); + stack.pop(); + first = stack.top(); + stack.pop(); + if (stack.size() != 0) + throw std::range_error("too much number"); + stack.push(calc(first, second)); + // if (*(c + 1) != ' ' || *(c + 1) != '\0') + // throw std::invalid_argument(""); +} + +void handle(std::string::const_iterator c, std::stack &stack) { + if (*c == ' ') + return; + else if (std::isdigit(*c)) + stack.push(*c - '0'); + else if (*c == '+') + calc(add, c, stack); + else if (*c == '-') + calc(subst, c, stack); + else if (*c == '*') + calc(mult, c, stack); + else if (*c == '/') + calc(div, c, stack); + else + throw std::invalid_argument("invalid caracter detected"); +} + +void rpn(char *av) { + std::string str(av); + std::stack stack; + + for (auto it = range(str)) { + try { + handle(it, stack); + } catch (std::exception &e) { + std::stringstream str; + str << "Error: " << e.what() << " : " << *it; + throw std::runtime_error(str.str()); + } + } + std::cout << stack.top() << std::endl; +} diff --git a/ex01/RPN.hpp b/ex01/RPN.hpp new file mode 100644 index 0000000..139a539 --- /dev/null +++ b/ex01/RPN.hpp @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* RPN.hpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/03 12:00:35 by adjoly #+# #+# */ +/* Updated: 2025/06/03 12:09:55 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#pragma once + +#include +#include +#include + +#define range(x) \ + x.begin(); \ + it != x.end(); \ + it++ + +#define auto __auto_type + +typedef unsigned int uint32_t; +typedef unsigned short uint16_t; + + +void rpn(char *); diff --git a/ex01/main.cpp b/ex01/main.cpp new file mode 100644 index 0000000..a9386dc --- /dev/null +++ b/ex01/main.cpp @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: adjoly +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/06/03 11:58:43 by adjoly #+# #+# */ +/* Updated: 2025/06/03 15:54:55 by adjoly ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int main(int ac, char **av) { + if (ac > 1 && ac < 3) { + try { + rpn(av[1]); + } catch(std::exception &e) { + std::cerr << e.what() << std::endl; + } + } else { + std::cerr << "Error" << std::endl; + } +}