-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtext_editor.cpp
More file actions
245 lines (229 loc) · 6.3 KB
/
text_editor.cpp
File metadata and controls
245 lines (229 loc) · 6.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#include <iostream>
// main text editor comand
const char* PRINT_CMD = "PRINT";
const char* SELECT_CMD = "SELECT";
const char* COPY_CMD = "COPY";
const char* PASTE_CMD = "PASTE";
const char* MOVE_CMD = "MOVE";
const char* CUT_CMD = "CUT";
const char* SHOW_CMD = "SHOW";
const char* HELP_CMD = "HELP";
// promt when user select help command
const char* HELP_PROMT = R"(There are 8 commands available including this command:
print: 'some_text';
select: '[start position end position] in current buffer';
copy: copying selected text;
paste: pasting copied text into current buffer;
move: 'direction[left/right] length';
cut: cutting selected text;
show: displays your buffer.
But remember, if you want to use copy or cut, you need to select some range of text!
Have a nice experience in using text editor!)";
const uint32_t SIZE_FOR_ARRAYS = 300;
enum EnumTest{
PRINT = 1,
SELECT,
COPY,
PASTE,
MOVE,
CUT,
SHOW,
HELP,
UNDEFINED
};
size_t arr_len (const char* temp) {
size_t count = 0;
if (temp != nullptr) {
while (*temp++) {
++count;
}
}
return count;
}
int strcmp (const char* str1, const char* str2) {
if (str1 != nullptr && str2 != nullptr) {
while (*str1 && *str1 == *str2) {
++str1;
++str2;
}
}
return (*str1 - *str2);
}
EnumTest check (const char *str ) {
if (str != nullptr) {
if (strcmp(str, PRINT_CMD) == 0) {
return PRINT;
} else if (strcmp(str, SELECT_CMD) == 0) {
return SELECT;
} else if (strcmp(str, COPY_CMD) == 0) {
return COPY;
} else if (strcmp(str, PASTE_CMD) == 0) {
return PASTE;
} else if (strcmp(str, MOVE_CMD) == 0) {
return MOVE;
} else if (strcmp(str, CUT_CMD) == 0) {
return CUT;
} else if (strcmp(str, SHOW_CMD) == 0) {
return SHOW;
} else if (strcmp(str, HELP_CMD) == 0) {
return HELP;
}
}
return UNDEFINED;
}
char* copy(char* dst, char* src, const char* const end_of_src) {
if ((dst != nullptr && src != nullptr && end_of_src != nullptr)) {
while (src != end_of_src) {
*dst++ = *src++;
}
}
return dst;
}
char* print (char *start, const char * const end) {
if (start != nullptr && end != nullptr && start != end) {
char arr[SIZE_FOR_ARRAYS] {};
std::cin >> arr;
char *begin_arr = arr;
const char * const end_arr = arr + arr_len(begin_arr);
if (*begin_arr != '\0' && *start == '\0') {
while (begin_arr != end_arr) {
*start++ = *begin_arr++;
}
}
if (*begin_arr != '\0' && *start != '\0') {
char temp_print_arr [SIZE_FOR_ARRAYS] {};
char *first_of_temp = temp_print_arr;
const char * const last_of_temp = temp_print_arr + arr_len(start);
copy(first_of_temp, start, end);
while (begin_arr != end_arr) {
*start++ = *begin_arr++;
}
copy(start, first_of_temp, last_of_temp);
}
}
return start;
}
char *move (char *start, const char * const end, const char * const start_of_buff) {
if (start != nullptr && end != nullptr) {
char way[SIZE_FOR_ARRAYS] {};
uint32_t num;
std::cin >> way >> num;
if ((start - num) < start_of_buff && strcmp(way, "left") == 0) {
std::cout << "Out of range!" << std::endl;
return start;
} else if ((start + num) > end && strcmp(way, "right") == 0) {
std::cout << "Out of range!" << std::endl;
return start;
}
if (strcmp(way, "left") == 0) {
start -= num;
} else if (strcmp(way, "right") == 0) {
start += num;
}
}
return start;
}
char* cut (char *start, char * const end) {
if (start != nullptr && end != nullptr) {
char *end_for_cut = end;
const char * const new_end = start + arr_len(start);
while (start != new_end) {
*start++ = *end_for_cut++;
}
return (end - 1);
}
return start;
}
void clear (char *start) {
if (start != nullptr) {
while (*start != '\0') {
*start++ = '\0';
}
}
}
void to_upper (char *start) {
const char TO_UPPER = 'A' - 'a';
const char * const end = start + arr_len(start);
while (start != end && *start != '\0') {
char& ch = *start++;
if (ch >= 'a' && ch <= 'z') {
ch += TO_UPPER;
}
}
}
int main () {
char user_arr[SIZE_FOR_ARRAYS] {};
char *begin = user_arr;
const char * const end = user_arr + SIZE_FOR_ARRAYS;
char temp_arr [SIZE_FOR_ARRAYS] {};
uint32_t start_position;
uint32_t end_position;
std::cout << "Hello, it's text editor, here you "
"can do different operations with text, for more info enter 'help'\n";
while (true) {
std::cout << "Enter you command and text: ";
char command[SIZE_FOR_ARRAYS] {};
std::cin >> command;
to_upper(command);
size_t type = check(command);
switch (type) {
case PRINT: {
start_position = 0;
end_position = 0;
begin = print(begin, end);
break;
}
case SELECT: {
std::cin >> start_position >> end_position;
if (start_position >= SIZE_FOR_ARRAYS || end_position >= SIZE_FOR_ARRAYS) {
std::cout << "Your position is out of range!\n";
start_position = 0;
end_position = 0;
}
break;
}
case COPY: {
if (end_position != 0 && *(user_arr + start_position) != '\0') {
copy(temp_arr, user_arr + start_position, user_arr + start_position + end_position);
} else {
std::cout << "You didn`t select any word!" << std::endl;
}
break;
}
case PASTE: {
if (arr_len(temp_arr) != 0) {
start_position = 0;
end_position = 0;
copy(begin, temp_arr, temp_arr + arr_len(temp_arr));
begin += arr_len(begin);
} else {
std::cout << "You didn`t copy any word, unable to paste." << std::endl;
}
clear(temp_arr);
break;
}
case MOVE: {
start_position = 0;
end_position = 0;
begin = move(begin, end, user_arr);
break;
}
case CUT: {
begin = cut(user_arr + start_position, user_arr + start_position + end_position);
break;
}
case SHOW: {
std::cout << user_arr << std::endl;
break;
}
case HELP: {
std::cout << HELP_PROMT << std::endl;
break;
}
default: {
std::cout << "You entered wrong command";
return 0;
}
}
}
}