#include <stdio.h>
#include <stdlib.h>
-void or_free(struct searchNode *thenode);
-void *or_exe(struct searchNode *thenode, int type, void *theinput);
+void or_free(searchCtx *ctx, struct searchNode *thenode);
+void *or_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
struct or_localdata {
int count;
searchNode **nodes;
};
-struct searchNode *or_parse(int type, int argc, char **argv) {
+struct searchNode *or_parse(searchCtx *ctx, int argc, char **argv) {
searchNode *thenode, *subnode;
struct or_localdata *localdata;
int i;
/* Set up our local data - a list of nodes to OR together */
- localdata=(struct or_localdata *)malloc(sizeof(struct or_localdata));
- localdata->nodes=(searchNode **)malloc(argc * sizeof(searchNode *));
+ if (!(localdata=(struct or_localdata *)malloc(sizeof(struct or_localdata)))) {
+ parseError = "malloc: could not allocate memory for this search.";
+ return NULL;
+ }
+ if (!(localdata->nodes=(searchNode **)malloc(argc * sizeof(searchNode *)))) {
+ /* couldn't malloc() memory for localdata->nodes, so free localdata to avoid leakage */
+ parseError = "malloc: could not allocate memory for this search.";
+ free(localdata);
+ return NULL;
+ }
localdata->count=0;
/* Allocate our actual node */
- thenode=(searchNode *)malloc(sizeof(searchNode));
+ if (!(thenode=(searchNode *)malloc(sizeof(searchNode)))) {
+ /* couldn't malloc() memory for thenode, so free localdata->nodes and localdata to avoid leakage */
+ parseError = "malloc: could not allocate memory for this search.";
+ free(localdata->nodes);
+ free(localdata);
+ return NULL;
+ }
thenode->returntype = RETURNTYPE_BOOL;
thenode->localdata = localdata;
thenode->free = or_free;
for (i=0;i<argc;i++) {
- subnode=search_parse(type, argv[i]); /* Propogate the search type */
+ subnode=ctx->parser(ctx, argv[i]); /* Propogate the search type */
+ subnode=coerceNode(ctx, subnode, RETURNTYPE_BOOL); /* BOOL please */
if (subnode) {
localdata->nodes[localdata->count++] = subnode;
} else {
- or_free(thenode);
+ or_free(ctx, thenode);
return NULL;
}
}
return thenode;
}
-void or_free(struct searchNode *thenode) {
+void or_free(searchCtx *ctx, struct searchNode *thenode) {
struct or_localdata *localdata;
int i;
localdata=thenode->localdata;
for (i=0;i<localdata->count;i++) {
- (localdata->nodes[i]->free)(localdata->nodes[i]);
+ (localdata->nodes[i]->free)(ctx, localdata->nodes[i]);
}
free(localdata->nodes);
free(thenode);
}
-void *or_exe(struct searchNode *thenode, int type, void *theinput) {
+void *or_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput) {
int i;
- void *ret;
struct or_localdata *localdata;
localdata=thenode->localdata;
for (i=0;i<localdata->count;i++) {
- ret = (localdata->nodes[i]->exe)(localdata->nodes[i], RETURNTYPE_BOOL, theinput);
- if (ret) {
- switch (type) {
- case RETURNTYPE_STRING:
- return "1";
-
- case RETURNTYPE_INT:
- case RETURNTYPE_BOOL:
- default:
- return (void *)1;
- }
- }
+ if ((localdata->nodes[i]->exe)(ctx, localdata->nodes[i], theinput))
+ return (void *)1;
}
- switch(type) {
- case RETURNTYPE_STRING:
- return "";
-
- case RETURNTYPE_INT:
- case RETURNTYPE_BOOL:
- default:
- return NULL;
- }
+ return NULL;
}