Difference between revisions of "NodeSpace.h"
m |
m |
||
Line 17: | Line 17: | ||
// Runtime nodes | // Runtime nodes | ||
node this; // this: the current node, like cwd | node this; // this: the current node, like cwd | ||
− | node | + | node nodeIO; |
node nodeINTERFACE; | node nodeINTERFACE; | ||
node nodeEVENTS; | node nodeEVENTS; | ||
Line 23: | Line 23: | ||
node nodeWINDOW; | node nodeWINDOW; | ||
node nodeSERVER; | node nodeSERVER; | ||
− | node | + | node nodeSTREAMS; |
node nodeSTREAM; | node nodeSTREAM; | ||
Line 126: | Line 126: | ||
int nodeInit() { | int nodeInit() { | ||
− | + | nodeIO = nodeLoopInsert(0,0); | |
− | nodeINTERFACE = nodeLoopInsert( | + | nodeINTERFACE = nodeLoopInsert(nodeIO,0); |
nodeSERVER = nodeLoopInsert(0,0); | nodeSERVER = nodeLoopInsert(0,0); | ||
− | + | nodeSTREAMS = nodeLoopInsert(nodeSERVER,0); | |
nodeSTREAM = nodeInsert(); | nodeSTREAM = nodeInsert(); | ||
Line 137: | Line 137: | ||
nodeWINDOW = nodeInsert(); | nodeWINDOW = nodeInsert(); | ||
− | nodeSetValue(0,nodeLOOP, | + | nodeSetValue(0,nodeLOOP,nodeIO); |
− | nodeSetValue( | + | nodeSetValue(nodeIO,nodeLOOP,nodeSERVER); |
nodeSetValue(nodeINTERFACE,nodeLOOP,nodeEVENTS); | nodeSetValue(nodeINTERFACE,nodeLOOP,nodeEVENTS); | ||
Revision as of 04:25, 15 August 2006
// This article and all its includes are licenced under LGPL // GPL: http://www.gnu.org/copyleft/lesser.html // SRC: http://www.organicdesign.co.nz/nodeSpace.c
typedef int node; // node: a type for referring to nodes typedef void (code)(); // code: a type for executing functions from pointer
// Reserved nodes used by nodal reduction process (tmp) // - doesn't matter that these node indexes conflict with 128 ascii nodes // because these will not currently need anything stored in them
- define nodeLOOP 1
- define nodeTRUE 1
- define nodeNEXT 2
- define nodePREV 3
- define nodeCODE 4
// Runtime nodes node this; // this: the current node, like cwd node nodeIO; node nodeINTERFACE; node nodeEVENTS; node nodeDESKTOP; node nodeWINDOW; node nodeSERVER; node nodeSTREAMS; node nodeSTREAM;
// Prototypes node nodeTraverse(node subject,node key); node nodeGetValue(node subject,node key); node nodeSetValue(node subject,node key,node value); node nodeInsertKey(node subject,node key); node nodeRemoveKey(node subject,node key); node nodeLoopInsert(node subject,node insert); node nodeLoopRemove(node subject); void **nodeGetState(node subject,node key); int nodeInit(); void nodeExit(); void nodeReduce();
// - use array-of-node path?
node nodeTraverse(node subject,node key) {
return listTraverse((item)subject,(item)key);
}
// set nodal value of node/path // - allows null key node nodeGetValue(node subject,node key) { return listGetValue(key?listTraverse((item)subject,(item)key):(item)subject); }
node nodeSetValue(node subject,node key,node value) { // todo: onChange return listSetValue(key?listTraverse((item)subject,(item)key):(item)subject, (item)value); }
// Returns a newly created node node nodeInsert() { return (node)listInsert(); }
// Returns newly created node // - this is just traverse() but with an event raised node nodeInsertKey(node subject,node key) { // todo: onInstall node i = nodeTraverse(subject,key); return i; }
// Returns the node that was removed node nodeRemoveKey(node subject,node key) { // todo: onRemove node i = nodeTraverse(subject,key); // todo: delete return i; }
// Returns the inserted node as the new loop pointer // - this allows it to act as a stack if nodeLOOP (current-loop-node) is updated with returned node // - either can be 0 on entry (for new loop and/or new node) node nodeLoopInsert(node subject,node insert) { if (insert == 0) insert = nodeInsert(); if (subject == 0) subject = insert; node next = nodeGetValue(subject,nodeNEXT); nodeSetValue(insert,nodeNEXT,next); nodeSetValue(subject,nodeNEXT,insert); nodeSetValue(insert,nodePREV,subject); return nodeSetValue(next,nodePREV,insert); }
// Returns the new loop pointer so nodeLOOP can be removed and updated node nodeLoopRemove(node subject) { node prev = nodeGetValue(subject,nodePREV); node next = nodeGetValue(subject,nodeNEXT); nodeSetValue(next,nodePREV,prev); return nodeSetValue(prev,nodeNEXT,next); }
void **nodeState(node subject,node key) { return hash(itob(key?(int)listTraverse((item)subject,(item)key):(int)subject,nssBuf)); }
// Clean up all the mess and exit void nodeExit() { logAdd("Gracefully exiting."); interfaceExit(); ioExit(); listExit(); exit(EXIT_SUCCESS); }
// Beginnings of replicating current nodal structure from a deserialised string // - these node indexes are accessible after deserialisation using trieGetValue("name/guid"); // *root // *network;interface; // *network // *server;clients; // *stream // *interface // *events;desktop; // *window
// Set up initial nodal structure // - todo: this structure should be built at runtime from deserialised string description int nodeInit() {
nodeIO = nodeLoopInsert(0,0); nodeINTERFACE = nodeLoopInsert(nodeIO,0);
nodeSERVER = nodeLoopInsert(0,0); nodeSTREAMS = nodeLoopInsert(nodeSERVER,0); nodeSTREAM = nodeInsert();
nodeEVENTS = nodeLoopInsert(0,0); nodeDESKTOP = nodeLoopInsert(nodeEVENTS,0); nodeWINDOW = nodeInsert();
nodeSetValue(0,nodeLOOP,nodeIO); nodeSetValue(nodeIO,nodeLOOP,nodeSERVER); nodeSetValue(nodeINTERFACE,nodeLOOP,nodeEVENTS);
// deserialise() // set nodeXXX constants from trieGetValue("name/guid") return EXIT_SUCCESS; }
// Moves "this" to current loop item if exists then rotates loop and executes or reduces the item // - THEN may not be needed since by default things should stay the same // ie. a function would have to set THEN to change, so why not change loop directly itself? void nodeReduce() { if (this = nodeGetValue(loop = nodeTraverse(this,nodeLOOP),0)) { // this = current loop item nodeSetValue(loop,0,nodeGetValue(this,nodeNEXT)); // Rotate loop nodeGetValue(this,nodeCODE)?((code*)*nodeState(this,0))():nodeReduce(); // Exec or reduce item } }