﻿//********************************************
// Get Numbers From Text by Regex
// LABPP 2023
//********************************************

#include "items.h"
// 
string sProcName = "Get Numbers From Text by Regex";

int main()
{
	cout << sProcName << "\n";

	int iarg1; double darg2; string sarg3;
	run_cpp("get_args",iarg1, darg2, sarg3);

	if (sarg3 == "Get PCG item name")
	{
		var_extern_set("PCG item name", sProcName);
		return 0;
	}


	if (sarg3 == "Help")
	{
		tsalert(-3, "Information", "",
			"");
		return 0;
	}

	string str = "размер полотна(BxH) : 1400x2100 мм;";

	string usSubstrRes, usPrefix, usSuffix;
	string separators_between_numbers="xХ";
	string dotorcom = ",.";
	string smustekranir = "\"()[]:";
	string strres;
	int inumofnumbers=2; // заданное требуемое количество чисел
	string svarprefix = "_myvar"; // заданное требуемое доименование переменных результатов

	int res = ac_request("editstringdialog", "Enter text fragment", str);
	if (res == 1)
	{
		str = ac_getstrvalue();
	}
	res = ac_request("editintdialog", "Enter numbers count", inumofnumbers);
	if (res == 1)
	{
		inumofnumbers = ac_getnumvalue();
	}

	res = ac_request("editstringdialog", "Enter numbers separator", separators_between_numbers);
	if (res == 1)
	{
		separators_between_numbers = ac_getstrvalue();
	}

	res = ac_request("editstringdialog", "Enter decimal separator", dotorcom);
	if (res == 1)
	{
		dotorcom = ac_getstrvalue();
	}

	res = ac_request("editstringdialog", "Enter var prefix", svarprefix);
	if (res == 1)
	{
		svarprefix = ac_getstrvalue();
	}

	// 1. строка перед серией чисел - префикс первого поиска числа
	bool b = str_regex_substr(str, "\\d{1,}[,.]{0,1}\\d{0,}", usSubstrRes, usPrefix, usSuffix);

	str = usPrefix;
	int len = strlen(usPrefix);
	int i;
	string schar;
	for (i = 0; i < len; i++)
	{
		schar = substr(str, i, 1);
		if (strcontains(smustekranir,schar)) {
			strres += "\\\\";
		}
		strres += schar;
	}
	// 2.
	string svars = "double ";
	for (i = 0; i < inumofnumbers; i++)
	{
		if (i != 0) { strres += "\\\\s{0,}["+separators_between_numbers+"]\\\\s{0,}"; svars += ", "; }
		strres += "\\\\d{1,}["+dotorcom+"]{0,1}\\\\d{0,}";
		svars += "dvar" +svarprefix+ "_"+ itoa(i + 1);
	}

	string sProcName;
	string prg_code_gen;

	prg_code_gen = "// " + sProcName + " -------------------------------->\n\
\n\
int main()\n\
{\n\
	string s;\n\
	"+svars+";\n\
	int i;\n\
	string usSubstrRes, usPrefix, usSuffix;\n\
	bool b = str_regex_substr(s, \"" + strres + "\", usSubstrRes, usPrefix, usSuffix);\n\
	if (b)\n\
	{\n\
		b = str_regex_substr(usSubstrRes, \"\\\\d{1,}["+dotorcom+"]{0,1}\\\\d{0,}["+separators_between_numbers+"]\", usSubstrRes, usPrefix, usSuffix);\n\
		if (b)\n\
		{\n\
			dvar"+svarprefix+"_1 = atof(usSubstrRes);\n\
			for (i = 2; i <= "+itoa(inumofnumbers)+"; i++)\n\
			{\n\
				b = str_regex_substr(usSuffix, \"\\\\d{1,}["+dotorcom+"]{0,1}\\\\d{0,}\", usSubstrRes, usPrefix, usSuffix);\n\
				var_by_txt(\"set\", \"dvar"+svarprefix+"_\"+itoa(i), atof(usSubstrRes));\n\
			}\n\
		}\n\
	}\n\
}";


	var_extern_set("PCG item result", prg_code_gen);

}

//<--------
