1 #include <CtrlLib/CtrlLib.h>
2 #include <plugin/pcre/Pcre.h>
3 
4 using namespace Upp;
5 
6 #define LAYOUTFILE <RegExp2/RegExpExtDemoLayout.lay>
7 #include <CtrlCore/lay.h>
8 
9 class mainwindowDlg : public Withmainwindow<TopWindow> {
10 	typedef mainwindowDlg CLASSNAME;
11 
12 public:
13 	mainwindowDlg();
14 	void RunRegExp();
clear_output()15 	void clear_output(){t4.Clear();}
d1_callback()16 	void d1_callback(){ Set_Examples((int)d1.GetData()); }
17 	void Set_Examples(int i);
18 
match_callback_fun(Vector<String> & v)19 	void match_callback_fun(Vector<String>& v){
20 		for(int i=0, i1=v.GetCount(); i<i1; i++)
21 			v[i]=Format("Match%d",i+1);
22 	}
23 };
24 
mainwindowDlg()25 mainwindowDlg::mainwindowDlg()
26 {
27 	CtrlLayout(*this, "RegExp Extension Demo");
28 	Sizeable().Zoomable();
29 	HCenterPos(800).VCenterPosZ(400);
30 
31 
32 	for(int i=1; i<6; i++)
33 		d1.Add(i, Format("TEST-%d",i));
34 
35 	d2.Add(1, "Disable Resolving Back-Reference")
36 	  .Add(2, "Enable Resolving Back-Reference")
37 	  .Add(3, "Use Callback Function");
38 
39 
40 	d1<<=THISBACK(d1_callback);
41 	b1<<=THISBACK(RunRegExp);
42 	b2<<=THISBACK(clear_output);
43 
44 	d1.SetData(4);
45 	d1_callback();
46 
47 }
48 
RunRegExp()49 void mainwindowDlg::RunRegExp()
50 {
51 	RegExp regx;
52 	RegExp reg("\\((.*?)\\)");
53 
54 	String t(t1.GetData());
55 
56 	int n=-101;
57 
58 
59 	switch((int)d2.GetData()){
60 
61 		case 1:	// no backref resolved
62 
63 			regx.SetPattern(t2.GetData());
64 
65 			if((int)o1.GetData() == 0)
66 				 n=regx.Replace(t, (String)t3.GetData());
67 			else n=regx.ReplaceGlobal(t, (String)t3.GetData());
68 
69 		break;
70 
71 		case 2:	// backref resolved
72 
73 			regx.SetPattern(t2.GetData());
74 
75 			if((int)o1.GetData() == 0)
76 				 n=regx.Replace(t, (String)t3.GetData(), true);
77 			else n=regx.ReplaceGlobal(t, (String)t3.GetData(), true);
78 
79 		break;
80 
81 		case 3: // using callback funtion
82 
83 			regx.SetPattern(t2.GetData());
84 
85 			if((int)o1.GetData() == 0)
86 				 n=regx.Replace(t, THISBACK(match_callback_fun));
87 			else n=regx.ReplaceGlobal(t, THISBACK(match_callback_fun));
88 
89 		break;
90 	};
91 
92 
93 
94 	String output(t4.Get());
95 
96 	output
97 	      <<"Regular Expression:["<<t2.GetData()
98 	      <<"]\nReplacement Count="<<n
99 	      <<"\nInput: "<<t1.GetData()
100 	      <<"\nOutput: "<<t<<"\n\n\n";
101 
102 	t4.Set(output);
103 	t4.ScrollEnd();
104 }
105 
106 
Set_Examples(int i)107 void mainwindowDlg::Set_Examples(int i)
108 {
109 	switch(i){
110 
111 		case 1:
112 			t1.SetData("A QUICK BROWN FOX JUMPS OVER THE LAZY DOG")	;
113 			t2.SetData("(\\w)");
114 			t3.SetData("(#)");
115 			d2.SetData(1);
116 		break;
117 
118 		case 2:
119 			t1.SetData("31-1-2000 13-2-2010 1-12-2012");
120 			t2.SetData("(\\d+)-(\\d+)-(\\d+)");
121 			t3.SetData("(\\2)(\\1)(\\3)");
122 			d2.SetData(2);
123 			o1.SetData(true);
124 		break;
125 
126 		case 3:
127 			t1.SetData("A QUICK BROWN FOX JUMPS OVER THE LAZY DOG");
128 			t2.SetData("(QUICK)");
129 			t3.SetData("(SLOW)");
130 			d2.SetData(1);
131 		break;
132 
133 		case 4:
134 			t1.SetData("A QUICK BROWN FOX JUMPS OVER THE LAZY DOG");
135 			t2.SetData("(QUICK)\\s+(BROWN)");
136 			t3.SetData("(\\2ISH)(\\1)");
137 			d2.SetData(2);
138 		break;
139 
140 
141 		case 5:
142 			t1.SetData("A QUICK BROWN FOX JUMPS OVER THE LAZY DOG");
143 			t2.SetData("(\\w+)");
144 			t3.SetData("THIS IS EXAMPLE OF THE USE OF CALLBACK FUNCTION");
145 			d2.SetData(3);
146 		break;
147 	}
148 
149 }
150 
151 
152 
153 GUI_APP_MAIN
154 {
155 	mainwindowDlg w;
156 
157 	w.Run();
158 
159 }
160