Initial commit
This commit is contained in:
commit
f053b6cc5a
|
@ -0,0 +1,97 @@
|
|||
# Created by https://www.toptal.com/developers/gitignore/api/vim,c,linux
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=vim,c,linux
|
||||
|
||||
### C ###
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
*.o
|
||||
*.ko
|
||||
*.obj
|
||||
*.elf
|
||||
|
||||
# Linker output
|
||||
*.ilk
|
||||
*.map
|
||||
*.exp
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Libraries
|
||||
*.lib
|
||||
*.a
|
||||
*.la
|
||||
*.lo
|
||||
|
||||
# Shared objects (inc. Windows DLLs)
|
||||
*.dll
|
||||
*.so
|
||||
*.so.*
|
||||
*.dylib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
*.i*86
|
||||
*.x86_64
|
||||
*.hex
|
||||
|
||||
# Debug files
|
||||
*.dSYM/
|
||||
*.su
|
||||
*.idb
|
||||
*.pdb
|
||||
|
||||
# Kernel Module Compile Results
|
||||
*.mod*
|
||||
*.cmd
|
||||
.tmp_versions/
|
||||
modules.order
|
||||
Module.symvers
|
||||
Mkfile.old
|
||||
dkms.conf
|
||||
|
||||
### Linux ###
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
.fuse_hidden*
|
||||
|
||||
# KDE directory preferences
|
||||
.directory
|
||||
|
||||
# Linux trash folder which might appear on any partition or disk
|
||||
.Trash-*
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
|
||||
### Vim ###
|
||||
# Swap
|
||||
[._]*.s[a-v][a-z]
|
||||
!*.svg # comment out if you don't need vector files
|
||||
[._]*.sw[a-p]
|
||||
[._]s[a-rt-v][a-z]
|
||||
[._]ss[a-gi-z]
|
||||
[._]sw[a-p]
|
||||
|
||||
# Session
|
||||
Session.vim
|
||||
Sessionx.vim
|
||||
|
||||
# Temporary
|
||||
.netrwhist
|
||||
# Auto-generated tag files
|
||||
tags
|
||||
# Persistent undo
|
||||
[._]*.un~
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/vim,c,linux
|
||||
|
||||
main
|
||||
build/
|
||||
assets2/
|
|
@ -0,0 +1,15 @@
|
|||
##
|
||||
# Nodesystem
|
||||
#
|
||||
# @file
|
||||
# @version 0.1
|
||||
|
||||
CC="tcc"
|
||||
|
||||
main: src/main.c src/node.c
|
||||
tcc -o $@ -I src $^
|
||||
|
||||
clean:
|
||||
rm -rf main
|
||||
|
||||
# end
|
|
@ -0,0 +1,37 @@
|
|||
#include<stdio.h>
|
||||
|
||||
#include "node.h"
|
||||
|
||||
int main(int argc, char** argv){
|
||||
NOD_Node* node = NOD_CreateNode("test node");
|
||||
NOD_Node* testchild = NOD_CreateNode("I'm just a child");
|
||||
NOD_Node* otherchild = NOD_CreateNode("Another child");
|
||||
NOD_Node* justtotest = NOD_CreateNode("This one is a test");
|
||||
|
||||
NOD_NodeAddChild(node, testchild);
|
||||
NOD_NodeAddChild(node, otherchild);
|
||||
NOD_NodeAddChild(node, justtotest);
|
||||
NOD_NodeAddChild(node, justtotest);
|
||||
NOD_NodeAddChild(node, justtotest);
|
||||
NOD_NodeAddChild(node, node);
|
||||
NOD_NodeAddChild(testchild, node);
|
||||
|
||||
printf("\nThe name of the node is \"%s\"\n", node->name);
|
||||
for(int i = 0; i < node->childc; i++){
|
||||
printf("Childnode: \"%s\"\n", node->childv[i]->name);
|
||||
}
|
||||
|
||||
printf("\nThe name of the node is \"%s\"\n", node->name);
|
||||
for(int i = 0; i < node->childc; i++){
|
||||
printf("Childnode: \"%s\"\n", node->childv[i]->name);
|
||||
}
|
||||
|
||||
printf("\nThe amount of children is %d, the real size is %d\n",
|
||||
node->childc,
|
||||
(int)sizeof(testchild)
|
||||
);
|
||||
|
||||
NOD_DestroyNode(node);
|
||||
NOD_DestroyNode(testchild);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
#include "node.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
NOD_Node* NOD_CreateNode(char* name){
|
||||
NOD_Node* node = malloc(sizeof(NOD_Node));
|
||||
|
||||
if(node != NULL){
|
||||
node->name = name;
|
||||
|
||||
node->parent = NULL;
|
||||
node->childv = NULL;
|
||||
node->childc = 0;
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
void NOD_DestroyNode(NOD_Node* node){
|
||||
if(node != NULL){
|
||||
free(node);
|
||||
}
|
||||
}
|
||||
|
||||
void NOD_NodeAddChild(NOD_Node* parent, NOD_Node* child){
|
||||
if(parent != NULL && child != NULL){
|
||||
/** Prevent recursion */
|
||||
if(parent == child){
|
||||
fprintf(stderr, "NOD_Warning: A node cannot be added to itself.\n");
|
||||
return;
|
||||
}
|
||||
NOD_Node* tmp_parent = parent->parent;
|
||||
while(tmp_parent != NULL){
|
||||
if(tmp_parent == child){
|
||||
fprintf(stderr, "NOD_Warning: Can't add a parent of a node as its child.\n");
|
||||
return;
|
||||
}
|
||||
tmp_parent = tmp_parent->parent;
|
||||
}
|
||||
/** Check if child already in vector */
|
||||
for(int i = 0; i < parent->childc; i++){
|
||||
if(parent->childv[i] == child){
|
||||
fprintf(stderr, "NOD_Warning: Tried to add a child already in the vector.\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/** Create child vector if it hasn't been used */
|
||||
if(parent->childc == 0 || parent->childv == NULL){
|
||||
parent->childv = malloc(sizeof(child));
|
||||
|
||||
if(parent->childv != NULL){
|
||||
parent->childv[0] = child;
|
||||
parent->childc = 1;
|
||||
|
||||
child->parent = parent;
|
||||
}
|
||||
else{
|
||||
fprintf(stderr,
|
||||
"NOD_Error: Failed to allocate space for child vector \"%s\"\n",
|
||||
parent->name);
|
||||
}
|
||||
}
|
||||
|
||||
/** Realloc if it already exists */
|
||||
|
||||
/** I don't test if chilv is null because it
|
||||
has already been tested */
|
||||
else if(parent->childc > 0){
|
||||
parent->childv = realloc(parent->childv,
|
||||
sizeof(child) * (parent->childc+1));
|
||||
|
||||
if(parent->childv != NULL){
|
||||
parent->childv[parent->childc] = child;
|
||||
parent->childc++;
|
||||
|
||||
child->parent = parent;
|
||||
}
|
||||
else{
|
||||
fprintf(stderr,
|
||||
"NOD_Error: Failed to reallocate space for child vector \"%s\"\n",
|
||||
parent->name);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void NOD_NodeRemoveChild(NOD_Node* parent, NOD_Node* child){
|
||||
if(parent != NULL && child != NULL){
|
||||
if(parent->childc < 1 || parent->childv == NULL){
|
||||
fprintf(stderr,
|
||||
"NOD_Error: Cannot remove child \"%s\". Node \"%s\" has no children.\n",
|
||||
child->name,
|
||||
parent->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void NOD_PrintNodeTree(NOD_Node* node){
|
||||
if(node != NULL){
|
||||
printf("%s", node->name);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
#ifndef __NODE_H_
|
||||
#define __NODE_H_
|
||||
|
||||
typedef struct node{
|
||||
char* name;
|
||||
|
||||
int childc;
|
||||
struct node** childv;
|
||||
struct node* parent;
|
||||
|
||||
} NOD_Node;
|
||||
|
||||
NOD_Node* NOD_CreateNode(char* name);
|
||||
void NOD_DestroyNode(NOD_Node* node);
|
||||
|
||||
void NOD_NodeAddChild(NOD_Node* parent, NOD_Node* child);
|
||||
void NOD_NodeRemoveChild(NOD_Node* parent, NOD_Node* child);
|
||||
|
||||
#endif // __NODE_H_
|
Loading…
Reference in New Issue