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