-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathread.c
65 lines (63 loc) · 1.48 KB
/
read.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
#include <fastdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
node_t *getNodeFromAddr(uintptr_t addr, FILE *db)
{
node_t *node = createNode();
fseek(db, addr, SEEK_SET);
int result = fread((void *)node, 1, sizeof(node_t), db);
node->children = malloc((node->cap + 5) * sizeof(uintptr_t));
if (node->ca != NULL)
{
fseek(db, node->ca, SEEK_SET);
fread((char *)(node->children), 1, node->cap * sizeof(uintptr_t), db);
}
return node;
}
uintptr_t findChildAddr(node_t *node, char *name, FILE *db)
{
if (node == NULL)
{
printf("CANNOT FIND NULL NODE ADDR");
return 1;
}
long long hash = hashName(name);
for (int i = 0; i < node->size; i++)
{
long long tempHash;
fseek(db, node->children[i], SEEK_SET);
;
int result = fread((void *)&tempHash, 1, 8, db);
if (tempHash == hash)
{
return node->children[i];
}
}
return 1;
}
node_t *getNode(node_t *parent, char *name, FILE *db)
{
return getNodeFromAddr(findChildAddr(parent, name, db), db);
}
char *readContent(node_t *node, FILE *db)
{
if (node->access != READ && node->access != READ_WRITE)
{
return NULL;
}
if( node->hasChild == true)
return -1;
char *out = malloc(node->size);
fseek(db, (uintptr_t)node->content, SEEK_SET);
int result = fread(out, 1, node->size, db);
return out;
}
uintptr_t getAddrOfChildAt(node_t *node, int at, FILE *db)
{
int addrL = at * sizeof(uintptr_t);
uintptr_t addr;
fseek(db, node->children + addrL, SEEK_SET);
fread(&addr, 1, sizeof(uintptr_t), db);
return addr;
}