/* ast parser, the way we pass context around is very very hacky... */ searchNode *search_astparse(searchCtx *ctx, char *loc) { searchASTCache *cache = ctx->arg; searchASTExpr *expr = cachesearch(cache, (exprunion *)&loc); searchNode *node; char **v; int i; if(!expr) { parseError = "WARNING: AST parsing failed"; return NULL; } switch(expr->type) { case AST_NODE_LITERAL: if (!(node=(searchNode *)malloc(sizeof(searchNode)))) { parseError = "malloc: could not allocate memory for this search."; return NULL; } node->localdata = getsstring(expr->u.literal,512); node->returntype = RETURNTYPE_CONST | RETURNTYPE_STRING; node->exe = literal_exe; node->free = literal_free; return node; case AST_NODE_CHILD: v = (char **)malloc(expr->u.child.argc * sizeof(char *)); if(!v) { parseError = "malloc: could not allocate memory for this search."; return NULL; } for(i=0;i<expr->u.child.argc;i++) { searchASTExpr *child = &expr->u.child.argv[i]; cachepush(cache, child); switch(child->type) { case AST_NODE_LITERAL: v[i] = child->u.literal; break; case AST_NODE_CHILD: v[i] = (char *)child; break; default: parseError = "static_parse: bad child node type"; free(v); return NULL; } } node = expr->u.child.fn(ctx, expr->u.child.argc, v); free(v); return node; default: parseError = "static_parse: bad node type"; return NULL; } }
/** * TODO */ inline bool pop(void ** data) { if (!data) return false; if (head->next) { Node * n = (Node *)head; *data = (head->next)->data; head = head->next; if (!cachepush(n)) free(n); return true; } return false; }
/** * TODO */ dynqueue(int cachesize=DEFAULT_CACHE_SIZE, bool fillcache=false):cachesize(cachesize) { Node * n = (Node *)::malloc(sizeof(Node)); n->data = NULL; n->next = NULL; head=tail=n; cache=(void**)getAlignedMemory(longxCacheLine*sizeof(long),cachesize*sizeof(void*)); if (!cache) abort(); if (fillcache) { for(int i=0;i<cachesize;++i) { n = (Node *)::malloc(sizeof(Node)); if (n) cachepush(n); } } }