-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdirectories.c
92 lines (87 loc) · 2.01 KB
/
directories.c
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
#include "header.h"
extern int path_length;
extern char *shell_path;
extern char *prev_dir;
char* PWD()
{
char *cur_path = (char *) malloc(sizeof(char) * path_length);
if (getcwd(cur_path, path_length) == NULL)
perror("error in pwd");
return cur_path;
}
char* Relative_path(char *abs_path)
{
int shell_path_length = strlen(shell_path);
int abs_path_length = strlen(abs_path);
if(abs_path_length < shell_path_length)
return abs_path;
int matched = 0;
while(abs_path[matched] == \
shell_path[matched])
matched += 1;
if(matched <\
shell_path_length)
return abs_path;
char *new_path = (char *) \
malloc(sizeof(char) *\
(path_length));
new_path[0] = '~';
int index = 1;
for (int i = shell_path_length;\
i < abs_path_length; i += 1)
new_path[index++] = abs_path[i];
new_path[index++] = '\0';
return new_path;
}
void change_dir(char *parsed_input[])
{
if(parsed_input[1] == NULL)
{
fprintf(stderr, "Directory not mentioned\n");
return ;
}
if(strcmp(parsed_input[1], "-") == 0)
{
char *temp = prev_dir;
prev_dir = PWD();
if(chdir(temp) != 0) perror("Change directory");
return;
}
if(strcmp(parsed_input[1], ".") == 0)
return ;
if(parsed_input[1][0] == '/')
{
free(prev_dir);
prev_dir = PWD();
if(chdir(parsed_input[1]) != 0)
{
perror("Change directory");
}
return ;
}
char *cur_path = PWD();
char *change_to = (char *) malloc(sizeof(char) * path_length);
if(parsed_input[1][0] == '~')
{
strcpy(change_to, shell_path);
int pos = strlen(change_to);
int i;
for (i = 1; parsed_input[1][i] != '\0'; i++)
change_to[i + pos - 1] = parsed_input[1][i];
change_to[i + pos - 1] = '\0';
free(prev_dir); prev_dir = PWD();
if(chdir(change_to) != 0)
perror("Change directory");
return;
}
char *temp = prev_dir;
prev_dir = PWD();
if(chdir(parsed_input[1]) != 0)
{
perror("Change directory");
prev_dir = temp;
return ;
}
free(cur_path); cur_path= NULL;
free(change_to); change_to = NULL;
}