commit wza changes before merge
This commit is contained in:
parent
051a04ea75
commit
1c22210209
@ -5,20 +5,6 @@ typedef struct fileNode {
|
|||||||
char *Symbolink;
|
char *Symbolink;
|
||||||
struct treeNode *subdirectory;
|
struct treeNode *subdirectory;
|
||||||
struct fileNode *next;
|
struct fileNode *next;
|
||||||
void serialize(char* buffer) {
|
|
||||||
u_int64_t t = inode_number;
|
|
||||||
for (int j = 0; j < 8; j++){
|
|
||||||
buffer[j] = t & (((u_int64_t)1<<(8))-1);
|
|
||||||
t >>= 8;
|
|
||||||
}
|
|
||||||
strcpy(buffer+8, name);
|
|
||||||
}
|
|
||||||
void deserialize(char* buffer) {
|
|
||||||
inode_number = 0;
|
|
||||||
for (int j = 0; j < 8; j++)
|
|
||||||
inode_number = inode_number | (((u_int64_t)(unsigned char)buffer[j])<<(8*j));
|
|
||||||
strcpy(name, buffer+8);
|
|
||||||
}
|
|
||||||
} FileNode;
|
} FileNode;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -35,6 +21,7 @@ typedef struct treeNode {
|
|||||||
|
|
||||||
/*root directory have its own initialization, so parent wont be NULL*/
|
/*root directory have its own initialization, so parent wont be NULL*/
|
||||||
int fischl_add_entry(TreeNode *parent, int new_inode_number, const char *fileName, INode *new_inode);
|
int fischl_add_entry(TreeNode *parent, int new_inode_number, const char *fileName, INode *new_inode);
|
||||||
|
int fischl_rm_entry(TreeNode *parent, const char *fileName);
|
||||||
/*if want to use dir mode use the subdirectory treeNode pointer */
|
/*if want to use dir mode use the subdirectory treeNode pointer */
|
||||||
//e.g. FileNode *Dirnode = fischl_find_entry(); can see file inside with Dirnode->subdirectory
|
//e.g. FileNode *Dirnode = fischl_find_entry(); can see file inside with Dirnode->subdirectory
|
||||||
//e.g. go to the current Dirnode parent directory, use TreeNode *get_Dir_parent = Dirnode->subdirectory->parent;
|
//e.g. go to the current Dirnode parent directory, use TreeNode *get_Dir_parent = Dirnode->subdirectory->parent;
|
||||||
|
@ -43,6 +43,29 @@ FileNode *lookupHash(HashTable *h, char *key) {
|
|||||||
return NULL; // Not found
|
return NULL; // Not found
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool removeHash(HashTable *h, char *key) {
|
||||||
|
unsigned int hashval = hash(h, key);
|
||||||
|
FileNode *node = h->table[hashval];
|
||||||
|
if (node == NULL) return false;
|
||||||
|
if (strcmp(node->name, key) == 0) {
|
||||||
|
h->table[hashval] = node->next;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
FileNode *prev = NULL;
|
||||||
|
bool foundit = false;
|
||||||
|
while (node != NULL) {
|
||||||
|
if (strcmp(node->name, key) == 0) break;
|
||||||
|
prev = node;
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
if (node == NULL) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
prev->next = node->next;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TreeNode *createDirectory(const char *dirName, TreeNode *parent, int hashSize) {
|
TreeNode *createDirectory(const char *dirName, TreeNode *parent, int hashSize) {
|
||||||
TreeNode *newDir = (TreeNode *)malloc(sizeof(TreeNode));
|
TreeNode *newDir = (TreeNode *)malloc(sizeof(TreeNode));
|
||||||
newDir->dirName = strdup(dirName);
|
newDir->dirName = strdup(dirName);
|
||||||
@ -148,6 +171,20 @@ int fischl_add_entry(TreeNode *parent, int new_inode_number, const char *fileNam
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fischl_rm_entry(TreeNode *parent, const char *fileName) {
|
||||||
|
char *fileName_dup = strdup(fileName);
|
||||||
|
if (parent->contents == NULL) return -1;
|
||||||
|
FileNode *file = NULL;
|
||||||
|
file = lookupHash(parent->contents, fileName_dup);
|
||||||
|
if (file == NULL) return -1;
|
||||||
|
if (file->subdirectory != NULL) freeTree(file->subdirectory);
|
||||||
|
removeHash(parent->contents, fileName_dup);
|
||||||
|
free(file->name);
|
||||||
|
free(file);
|
||||||
|
delete fileName_dup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
FileNode *fischl_find_entry(TreeNode *root, const char *path){
|
FileNode *fischl_find_entry(TreeNode *root, const char *path){
|
||||||
//support . and .. function
|
//support . and .. function
|
||||||
char *pathCopy = strdup(path);
|
char *pathCopy = strdup(path);
|
||||||
|
@ -14,6 +14,7 @@ add_executable(${TARGET_LAYER1_API}
|
|||||||
layer1_API.cpp
|
layer1_API.cpp
|
||||||
)
|
)
|
||||||
add_executable(${TARGET_LAYER2_API}
|
add_executable(${TARGET_LAYER2_API}
|
||||||
|
../lib/direntry.cpp
|
||||||
../lib/files.cpp
|
../lib/files.cpp
|
||||||
layer2_API.cpp
|
layer2_API.cpp
|
||||||
)
|
)
|
||||||
|
@ -84,6 +84,16 @@ int main() {
|
|||||||
}else{
|
}else{
|
||||||
printf(" %s under %s\n",get_file3->name,get_dir1_tree->dirName);
|
printf(" %s under %s\n",get_file3->name,get_dir1_tree->dirName);
|
||||||
}
|
}
|
||||||
|
// pressure test
|
||||||
|
INode inode_fileN;
|
||||||
|
for(int i=6;i<100;i++) {
|
||||||
|
fischl_add_entry(get_dir1_tree, i, (std::string("file")+std::to_string(i)).c_str(), &inode_fileN);
|
||||||
|
}
|
||||||
|
for(int i=6;i<100;i++){
|
||||||
|
FileNode *get_fileN = fischl_find_entry(get_dir1_tree, (std::string("file")+std::to_string(i)).c_str());
|
||||||
|
assert(get_fileN != NULL);
|
||||||
|
assert(get_fileN->inode_number == i);
|
||||||
|
}
|
||||||
// Cleanup
|
// Cleanup
|
||||||
freeTree(root);
|
freeTree(root);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user