int main(int argc, const char * argv[]) { struct Graph *g = NULL; g = Graph(g); Graph_addNode(g, "a"); Graph_addNode(g, "b"); Graph_addNode(g, "c"); Graph_addNode(g, "d"); Graph_addNode(g, "e"); Graph_addEdge(g, 0, 1, 1); Graph_addEdge(g, 1, 0, 1); Graph_addEdge(g, 1, 2, 1); Graph_addEdge(g, 2, 1, 1); Graph_addEdge(g, 2, 3, 1); Graph_addEdge(g, 3, 2, 1); Graph_addEdge(g, 3, 4, 1); Graph_addEdge(g, 4, 3, 1); Graph_addEdge(g, 1, 3, 3); Graph_addEdge(g, 3, 1, 3); Graph_printGraph(g); return 0; }
Graph Graph_md (Graph g, char * path) { char e[256], last[256], *p; Graph up=0, node; int i,n; if (!g || !path || !path[0]) return 0; p = path; last[0] = 0; /* used also to distinguish between x.[n] and x[n] */ while ( (p=Path_element(p,e)) ) { if (e[0] == '[') { n = atoi(e+1); if (!last[0]) { if (n < 0 || !e[1]) /* allow [0], but not [] */ return 0; /* is a syntax error, but ... */ if (g->size > n) g = g->nodes[n]; else return 0; /* not allowed: cannot create unnamed nodes */ } else { if (!up) return 0; if (e[1] == 0) /* this means [] */ return 0; /* not allowed */ else if (n>=0) { for (i=0; i<up->size; i++) { node = up->nodes[i]; if (!strncmp(node->name,last,256)) { if (!n--) { g = node; break; } } } } last[0] = 0; } } else if (e[0] == '.') last[0] = 0; else { up = g; if (! (g=Graph_getNode(g,e))) { node = Graph_new(e); Graph_addNode(g,node); g = node; } strncpy(last,e,255); } } return g; }
int Graph_set (Graph g, char * path, Graph v) { Graph node; if (!g || !path || !path[0]) return 1; node = Graph_get(g,path); if (node) { if (!node->size) Graph_addNode(node,v); else node->nodes[0] = v; /* XXX memory leak ! */ return 0; } node = Graph_md(g,path); Graph_addNode(node,v); Graph_addNode(g,node); return 0; }
Graph Graph_get (Graph g, char * path) { char e[256], last[256], *p; Graph up=0, node; int i,j,n; p = path; last[0] = 0; /* used also to distinguish between x.[n] and x[n] */ while ( (p=Path_element(p,e)) ) { if (e[0] == '[') { n = atoi(e+1); if (n < 0) return NULL; /* is a syntax error, but ... */ if (e[1]) { if (g->size > n) g = g->nodes[n]; else return NULL; } else { if (up == NULL) return NULL; if (e[1] == 0) { /* this means [] */ /* new graph and get all elements with this name */ g = Graph_new("__vector__"); for (i=0; i<up->size; i++) { node = up->nodes[i]; if (!strncmp(node->name,last,256)) for (j=0; j<node->size; j++) Graph_addNode(g,node->nodes[j]); } } else if (n>=0) { for (i=0; i<up->size; i++) { node = up->nodes[i]; if (!strncmp(node->name,last,256)) { if (!n--) { g = node; break; } } } if (n>-1) return NULL; } last[0] = 0; } } else if (e[0] == '.') last[0] = 0; else { up = g; if (! (g=Graph_getNode(g,e))) return 0; strncpy(last,e,255); } } return g; }
Graph Graph_add (Graph g, char *name) { Graph node = Graph_new(name); Graph_addNode(g,node); return node; }