aboutsummaryrefslogtreecommitdiff
path: root/deps.c
blob: 7eb587f036930b2037f2a960ded0e4fb122f97db (plain) (blame)
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]);
    }
}