Difference between revisions of "Serialise.c"

From Organic Design wiki
(fixed bug in path calculation, but still not working)
(bugs with loop processing)
Line 30: Line 30:
 
// free(links[0]); // free the separate string items
 
// free(links[0]); // free the separate string items
 
// free(links);    // and the pointers to them
 
// free(links);    // and the pointers to them
 +
printf("%s => %d\n",link,subject);
 
return subject;
 
return subject;
 
}
 
}
Line 81: Line 82:
 
printf("INFORMATION EXTRACTED:\n--------------------------------------------\n");
 
printf("INFORMATION EXTRACTED:\n--------------------------------------------\n");
 
item subject = 0;
 
item subject = 0;
int key, val, i, j = 0, linkStart;
+
int key, val, i, j = 1, linkStart;
 
char *link1 = malloc(100), *link2 = link1+50;
 
char *link1 = malloc(100), *link2 = link1+50;
 
for (i = 0; i < strlen(text); i++) {
 
for (i = 0; i < strlen(text); i++) {
Line 92: Line 93:
 
case 2: // processing first link
 
case 2: // processing first link
 
if (strncmp(s,"]]",2) == 0) {
 
if (strncmp(s,"]]",2) == 0) {
if (strncmp(s,"]];",3) == 0) j=4;  // done link 1 of n (loop)
+
if (strncmp(s,"]];",3) == 0) {
if (strncmp(s,"]]:[[",5) == 0) j=3; // done link 1 of 2 (assoc)
+
j = 4; // processing loop
else {                             // done link 1 of 1 (context)
+
i--;  // go back one so that case 4 gets the ]]; again
strncpy(link1, text+linkStart, i-linkStart);
+
}
 +
else if (strncmp(s,"]]:[[",5) == 0) j = 3; // done link 1 of 2 (assoc)
 +
else {
 +
// done link 1 of 1 (context)
 +
strncpy(link1,text+linkStart,i-linkStart);
 
link1[i-linkStart] = '\0';
 
link1[i-linkStart] = '\0';
 
subject = processNodeNames(link1);
 
subject = processNodeNames(link1);
printf("%d...\n", subject);
+
printf("%d...\n",subject);
 
j = 0; // wait for new line
 
j = 0; // wait for new line
 
}
 
}
Line 104: Line 109:
 
break;
 
break;
 
case 3: // processing link 2 of an association statement
 
case 3: // processing link 2 of an association statement
if (strncmp(s, "]]", 2) == 0) {
+
if (strncmp(s,"]]",2) == 0) {
strncpy(link1, text+linkStart, i-linkStart);
+
strncpy(link1,text+linkStart,i-linkStart);
link2 = strchr(link1, '[')+2;
+
link2 = strchr(link1,'[')+2;
 
link1[i-linkStart] = '\0';
 
link1[i-linkStart] = '\0';
 
link1[i-linkStart-strlen(link2)-5] = '\0';
 
link1[i-linkStart-strlen(link2)-5] = '\0';
Line 117: Line 122:
 
break;
 
break;
 
case 4: // processing link n of a loop statement
 
case 4: // processing link n of a loop statement
if (strncmp(s, "[[", 2) == 0) linkStart = i+2;
+
if (strncmp(s,"[[",2) == 0) linkStart = i+2;
if (strncmp(s, "]]", 2) == 0) {
+
if (strncmp(s,"]]",2) == 0) {
strncpy(link1, text+linkStart, i-linkStart);
+
strncpy(link1,text+linkStart,i-linkStart);
 
link1[i-linkStart] = '\0';
 
link1[i-linkStart] = '\0';
nodeLoopInsert(subject,processNodeNames(link1));
+
nodeLoopInsert(subject,key = processNodeNames(link1));
if (strncmp(s, "]];[[", 5) != 0) { printf("\n"); j = 0; }
+
printf("%d ; ",key);
printf("\t%d ; ", subject);
+
if (strncmp(s,"]];[[",5)) { printf("\n"); j = 0; }
 
}
 
}
 
break;
 
break;

Revision as of 23:21, 14 September 2006

// [[[[1]]]] - nodal p2p wiki daemon // This article and all its includes are licenced under LGPL // GPL: [[[[2]]]] // SRC: [[[[3]]]] // included in [[[[4]]]][[[[5]]]] // - used for storing and communicating nodal structure as plain text // - rather than XML we've used a simple wiki-link format for easy human editing

item processNodeNames(char*); char *serialise(node); void deserialise(char*);


// ----------------------------------------------------------------------------------------- // // serialise.c

// Process passed string of pipe-separated names (ext GUID's are just alias's) // - returns index of a newly created internal node to which the passed names map // - returns index as item not node because nodal storage functions are active // - later: if its a number, convert to a binary-coded-string of \x00's and \x01's item processNodeNames(char *link) { node subject = (node)listInsert(); char **links = split('|',link); int i = 0; while (links[i]) { trieSetValue(links[i++],subject); // need to store name as nodal attribute of node too } // these are crashing... // free(links[0]); // free the separate string items // free(links); // and the pointers to them printf("%s => %d\n",link,subject); return subject; }

// Recursive-sub-function // - for each position, check 0,1 for more assocs, 2 for assoc-found-here void keySearch(int *keys, item subject,int path,int level) { logAdd(" search(ptr,%d,%d,%d)",subject,path,level); item i,s=subject+(subject<<1);

// If the current path continues on (has 0 and/or 1 links) then search those too if (i=space[s++]) keySearch(keys,i,path,level+1); if (i=space[s++]) keySearch(keys,i,path|(1<<level),level+1);

// If the current location has a value or a state, then this path is a complete key if (space[s] || *nodeState(subject,0)) { *keys++; path = (path|(2<<level))-2; insertPointer(&path); logAdd("  %d:%d",subject,path); } }

// Convert a node to text for storage or transport // - needs to do a binary traversal into the passed node to build association list char *serialise(node subject) {

logAdd(" INTERFACE: %d",nodeINTERFACE); logAdd(" STREAMS: %d",nodeSTREAMS); logAdd(" EVENTS: %d",nodeEVENTS); logAdd(" IO: %d",nodeIO); logAdd(" SERVER: %d",nodeSERVER); logAdd(" DESKTOP: %d",nodeDESKTOP); logAdd(" STREAM: %d",nodeSTREAM); logAdd(" WINDOW: %d",nodeWINDOW);

// create list of keys contained within subject node int keys = 0; keySearch(&keys,subject,0,0);

char *text; while (keys--) { // add returned key info as text } return text; }

// Convert textual represntation of one or more nodes and associations to nodal change void deserialise(char *text) { printf("\nPARSING THE FOLLOWING TEXT:\n--------------------------------------------\n%s\n--------------------------------------------\n\n", text); printf("INFORMATION EXTRACTED:\n--------------------------------------------\n"); item subject = 0; int key, val, i, j = 1, linkStart; char *link1 = malloc(100), *link2 = link1+50; for (i = 0; i < strlen(text); i++) { char *s = text+i; if (*s < 32) j = 1; else switch (j) { case 1: // starting new line - if not starting with *[[ then wait for next line if (strncmp(s,"*[[",3) == 0) { j = 2; linkStart = i+3; } else j = 0; break; case 2: // processing first link if (strncmp(s,"]]",2) == 0) { if (strncmp(s,"]];",3) == 0) { j = 4; // processing loop i--; // go back one so that case 4 gets the ]]; again } else if (strncmp(s,"]]:[[",5) == 0) j = 3; // done link 1 of 2 (assoc) else { // done link 1 of 1 (context) strncpy(link1,text+linkStart,i-linkStart); link1[i-linkStart] = '\0'; subject = processNodeNames(link1); printf("%d...\n",subject); j = 0; // wait for new line } } break; case 3: // processing link 2 of an association statement if (strncmp(s,"]]",2) == 0) { strncpy(link1,text+linkStart,i-linkStart); link2 = strchr(link1,'[')+2; link1[i-linkStart] = '\0'; link1[i-linkStart-strlen(link2)-5] = '\0'; key = processNodeNames(link1); val = processNodeNames(link2); listSetValue(listTraverse(subject,key),val); printf("\t%d : %d\n", key, val); j = 0; } break; case 4: // processing link n of a loop statement if (strncmp(s,"[[",2) == 0) linkStart = i+2; if (strncmp(s,"]]",2) == 0) { strncpy(link1,text+linkStart,i-linkStart); link1[i-linkStart] = '\0'; nodeLoopInsert(subject,key = processNodeNames(link1)); printf("%d ; ",key); if (strncmp(s,"]];[[",5)) { printf("\n"); j = 0; } } break; } } free(link1); printf("--------------------------------------------\n"); }