-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAnalyse.cpp
158 lines (138 loc) · 4.43 KB
/
Analyse.cpp
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
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <windows.h>
#include <time.h>
#include <sys/types.h>
#include <psapi.h>
#include <tlhelp32.h>
#include "Analyse.h"
#include "Command.h"
#define MAX_CWD_LENS 128
#define MAX_BUFFER_SIZE 64
#define MAX_TOK_BUFSIZE 64
#define TOKEN_DELIMETERS " \t\r\n\a"
using namespace std;
/////////////////////////////////////
////////// Xử lý câu lệnh ///////////
/////////////////////////////////////
/**
* Sửa lỗi gõ cách câu lệnh
* VD: C:\Users\Admin> $ cd E:\
* ==> C:\Users\Admin> $ cd E:\
*
**/
void fixCmd(char* cmd){
/**
* Sửa lỗi gõ cách câu lệnh
* VD: C:\Users\Admin> $ cd E:\
* ==> C:\Users\Admin> $ cd E:\
*
**/
int length = strlen(cmd);
int first;
for(int i=0; i<length; i++){
if((cmd)[i] != ' '){
first = i;
break;
}
}
int real_len = length - first, i=0;
// " Ta Ton" -> "Ta Tona Ton"
while(real_len--){
(cmd)[i] = (cmd)[i+first];
i++;
}
(cmd)[length - first] = '\0'; //"Ta Tona Ton" -> "Ta Ton"
}
/**
* In ra màn hình console đường dẫn
* (VD: C:\Users\Admin\.....> $ *phần tiếp này là lệnh*)
**/
int printPrompt(char *cur_directory){
/**
* In ra màn hình console đường dẫn
* (VD: C:\Users\Admin\.....> $ *phần tiếp này là lệnh*)
**/
if(GetCurrentDirectory(MAX_CWD_LENS,cur_directory) == 0){
cout << "Reading of current working directory failed.\n";
return -1;
}
cout << cur_directory << "> $";
return 1;
}
/**
* Chia câu lệnh thành các đoạn ngăn cách bởi ký tự ngăn (" ","\t","\r","\n","\a")
*
**/
char **separate_line(char *line){
/**
* Chia câu lệnh thành các đoạn ngăn cách bởi ký tự ngăn (" ","\t","\r","\n","\a")
*
**/
int bufsize = MAX_TOK_BUFSIZE;
int position = 0;
char **tokens = (char**)malloc(bufsize*sizeof(char*));
char *token;
if(!tokens){
cout << "Allocation Failed" << endl; /* Không đủ bộ nhớ cấp phát */
exit(EXIT_FAILURE);
}
token = strtok(line, TOKEN_DELIMETERS); /*Con trỏ trỏ tới args[0] của lệnh cmd VD: cd, dir*/
while(token != NULL){
tokens[position] = token; /* Lưu các con trỏ chứa thành phần của lệnh cmd */
// cout << tokens[position] << endl;
position++;
if(position >= bufsize){ /* số thành phần args[i] trong lệnh cmd lớn hơn số bufsize dự tính*/
bufsize += MAX_TOK_BUFSIZE; /* Tăng số bufsize */
tokens = (char**)realloc(tokens, bufsize); /* Cấp phát thêm bộ nhớ cho tokens */
if(!tokens){
cout << "Allocation Failed" << endl; /* Không đủ bộ nhớ cấp phát */
exit(EXIT_FAILURE);
}
}
token = strtok(NULL,TOKEN_DELIMETERS); /* Trỏ token tới thành phần args tiếp theo trong của cmd*/
}
tokens[position] = NULL; /*Kết thúc danh sách mã*/
return tokens;
}
/**
* Chuẩn hóa đường dẫn [path], tránh trường hợp như:
* VD: cd E:\New folder\ => [path] = 'E:\New'
**/
char *combinePath(char **args, int start){
/**
* Chuẩn hóa đường dẫn [path], tránh trường hợp có dấu ngăn cách như:
* VD: cd E:\New folder\ => [path] = 'E:\New'
**/
char *path = (char *)calloc(MAX_CWD_LENS,sizeof(char)); /*Các thành phần không bị ngăn cách*/
char *pivot = (char*)" "; /* Dấu ngăn cách */
/* Kết hợp từng thành phần trong path */
path = strcat(path, args[start]);
int i = start + 1;
while(args[i] != NULL){
path = strcat(path,pivot);
path = strcat(path, args[i]);
++i;
}
return path;
}
/**
* Đổi màu chữ (Có thể có hoặc k cơ bản là cũng k có ảnh hưởng gì chỉ là trang trí )
*
**/
void setColor(char* color) {
/*
* Đổi màu lời gọi đầu
*/
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
WORD saved_attributes;
/* Lưu các thuộc tính */
// GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
// saved_attributes = consoleInfo.wAttributes;
if (strcmp(color,"green")==0) {
SetConsoleTextAttribute(hConsole,FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}
}