#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;

char* skipSpaces(char* str) {
    while (*str != '\0' && *str == ' ') ++str;
    return str;
}
 
char* isNextSymb(char* str, const char symb) {
    str = skipSpaces(str);
    if(*str == symb)
        return str;
    return NULL;
}
 
char* getNameParam(char* str, char*& out_str) {
    char* s = isNextSymb(str, '\'');
 
    if (s != NULL) {
        ++s;
        char* temp = strchr(s, '\'');
        if (temp == NULL) return NULL;
        out_str = (char*)malloc(temp - s + 1);
        char* n = out_str;
        while (*s != '\0' && *s != '\'') {
            *n = *s;
            ++n;
            ++s;
        }
 
        if (*s == '\0')
            s = NULL;
 
        *n = '\0';
    }
 
    return s;
}
 
char* isNumber(char* str) {
    str = skipSpaces(str);
    if (*str == '-') ++str;
    str = skipSpaces(str);
    while (*str != '\0' && *str >= '0' && *str <= '9') ++str;
    if (*str == '\0') return NULL;
    return str;
}
 
char* getDataParam(char* str, int& a, int& b) {
    char* s = isNextSymb(str, '[');
    if (s != NULL) {
        a = atoi(s + 1);
        s = isNumber(s + 1);
        if (s != NULL) {
            s = isNextSymb(s, '&');
            if (s != NULL) {
                b = atoi(s + 1);
                s = isNumber(s + 1);
                if (s != NULL)
                    return (s = isNextSymb(s, ']'));
            }
        }
    }
    return NULL;
}
 
struct Param {
    char* name;
    int a1;
    int b1;
    int a2;
    int b2;
};
 
char* getParam(char* str, Param& par) {
    char* s = isNextSymb(str, '{');
    if (s != NULL) {
        s = getNameParam(str + 1, par.name);
        if (s != NULL) {
            s = isNextSymb(s + 1, ';');
            if (s != NULL) {
                s = getDataParam(s + 1, par.a1, par.b1);
                if (s != NULL) {
                    s = isNextSymb(s + 1, ';');
                    if (s != NULL) {
                        s = getDataParam(s + 1, par.a2, par.b2);
                        if (s != NULL)
                            return (s = isNextSymb(s + 1, '}'));
                    }
                }
            }
        }
    }
    return NULL;
}
 
int main() {
 
    char* str = (char*)" { 'Parametr1 2000' ; [ 5 & 2 ] ; [ 3 & 2 ] }{ 'ParametrLoooooooong 2021';[10&5];[ 6 &4]}";
    Param params[10];
    int count = 0;
    char* s = str;
 
    do{
        s = strchr(s, '{');
        if (s == NULL) break;
 
        char* temp = getParam(s, params[count]);
 
        if (temp != NULL) {
            cout << "str " << count + 1 << " " << params[count].name << " " << params[count].a1 << 
            " " << params[count].b1 << " " << params[count].a2 << " " << params[count].b2 << endl;
            ++count;
        }
        else
            cout << "Error str\n";
        ++s;
    } while (s != NULL);
 
    return 0;
}