text: /* ************************************************************************** */
  /*                                                                            */
  /*                                                        :::      ::::::::   */
  /*   brackets.c                                         :+:      :+:    :+:   */
  /*                                                    +:+ +:+         +:+     */
  /*   By: exam <RTFM@42.fr>                          +#+  +:+       +#+        */
  /*                                                +#+#+#+#+#+   +#+           */
  /*   Created: 2020/02/14 12:33:14 by evgenkarlson      #+#    #+#             */
  /*   Updated: 2020/02/15 10:51:23 by evgenkarlson     ###   ########.fr       */
  /*                                                                            */
  /* ************************************************************************** */
  
  
  
  /* ************************************************************************** */
  /* ************************************************************************** */
  /* ************************************************************************** 
  
  
  Assignment name  : brackets
  Expected files   : *.c *.h
  Allowed functions: write
  --------------------------------------------------------------------------------
  
  Напишите программу, которая принимает неопределенное количество строк в
  аргументах. Для каждого аргумента программа выводит на стандартный вывод «OK»,
  за которым следует символ новой строки, если выражение правильно заключено в
  скобки, в противном случае выводится «Ошибка», за которым следует символ новой строки.
  
  Символы, рассматриваемые как «квадратные скобки», представляют собой квадратные
  скобки «(» и «)», квадратные скобки «[» и «]» и фигурные скобки «{» и «}». Все
  остальные символы просто игнорируются.
  
  Открывающая скоба всегда должна быть закрыта хорошей закрывающей скобкой в
  ​​правильном порядке. Строка, которая не содержит скобок, считается строкой в
  ​​правильных скобках.
  
  Если аргументов нет, программа должна вывести только новую строку.
  
  Примеры :
  
  
  $> ./brackets '(johndoe)' | cat -e
  OK$
  $> ./brackets '([)]' | cat -e
  Error$
  $> ./brackets '' '{[(0 + 0)(1 + 1)](3*(-1)){()}}' | cat -e
  OK$
  OK$
  $> ./brackets | cat -e
  $
  $>
  
  
  /* ************************************************************************** */
  /* ************************************************************************** */
  /* ************************************************************************** */
  
  
  #include <unistd.h>
  #define BUFF_SIZE (4096)
  
  static int	match_brackets(char a, char b)
  {
  	return ((a == '[' && b == ']') || (a == '{' && b == '}') \
  				|| (a == '(' && b == ')'));
  }
  
  static int	check_brackets(char *str)
  {
  	int		i;
  	int		top;
  	int		stack[BUFF_SIZE];
  
  	i = 0;
  	top = 0;
  	while (str[i])
  	{
  		if (str[i] == '(' || str[i] == '{' || str[i] == '[')
  			stack[++top] = str[i];
  		if (str[i] == ')' || str[i] == '}' || str[i] == ']')
  			if (!match_brackets(stack[top--], str[i]))
  				return (0);
  		i += 1;
  	}
  	return (!top);
  }
  
  int			main(int argc, char *argv[])
  {
  	int		i;
  
  	i = 0;
  	if (argc == 1)
  		write(1, "\n", 1);
  	while (--argc)
  	{
  		if (check_brackets(argv[++i]))
  			write(1, "OK\n", 3);
  		else
  			write(1, "Error\n", 6);
  	}
  	return (0);
  }
  