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
|
//
// Created by jhunk on 12/16/19.
//
#include "spm.h"
int exists(const char *filename) {
return access(filename, F_OK);
}
int dep_seen(Dependencies **deps, const char *name) {
if (!deps) {
return -1;
}
for (int i = 0; i != (*deps)->records; i++) {
if (strstr((*deps)->list[i], name) != NULL) {
return 1;
}
}
return 0;
}
int dep_init(Dependencies **deps) {
(*deps) = (Dependencies *)calloc(1, sizeof(Dependencies));
(*deps)->__size = 2;
(*deps)->records = 0;
(*deps)->list = (char **)calloc((*deps)->__size, sizeof(char *));
if (!(*deps)->list) {
return -1;
}
return 0;
}
void dep_free(Dependencies **deps) {
if ((*deps) != NULL) {
return;
}
for (int i = 0; i < (*deps)->__size; i++) {
if ((*deps)->list[i] != NULL) {
free((*deps)->list[i]);
}
}
free((*deps));
}
int dep_append(Dependencies **deps, char *name) {
if (!(*deps)) {
return -1;
}
(*deps)->__size++;
(*deps)->list = (char **)realloc((*deps)->list, sizeof(char *) * (*deps)->__size);
if (!(*deps)->list) {
return -1;
}
(*deps)->list[(*deps)->records] = (char *)calloc(strlen(name) + 1, sizeof(char));
if (!(*deps)->list[(*deps)->records]) {
return -1;
}
strcpy((*deps)->list[(*deps)->records], name);//, strlen(name));
(*deps)->records++;
return 0;
}
int dep_solve(Dependencies **deps, const char *filename) {
if (!(*deps)) {
return -1;
}
if (exists(filename) != 0) {
return -1;
}
FILE *fp = fopen(filename, "r");
if (!fp) {
perror(filename);
return -1;
}
char data[BUFSIZ];
memset(data, '\0', sizeof(data));
char *line = data;
int line_count = 0;
while (fgets(line, BUFSIZ, fp) != NULL) {
size_t line_length = strlen(line);
if (line_length > 1 && strstr(line, "\r\n")) {
line[line_length - 2] = '\0';
}
if (line_length > 1 && line[line_length - 1] == '\n') {
line[line_length - 1] = '\0';
}
if (strcmp(line, "") == 0) {
continue;
}
line_count++;
if (dep_seen(deps, line) > 0) {
// Already seen this dependency. Skip it.
continue;
}
else {
// Have not seen this dependency before
if (dep_append(deps, line) == 0) {
dep_solve(deps, line);
}
}
}
fclose(fp);
return line_count;
}
void dep_show(Dependencies **deps) {
if ((*deps) == NULL) {
return;
}
for (int i = 0; i < (*deps)->records; i++) {
printf("%d: %s\n", i, (*deps)->list[i]);
}
}
|