/** * Initialize vector. * * @param options combination of initialization options. * * @return qvector_t container pointer. * @retval errno will be set in error condition. * - ENOMEM : Memory allocation failure. * * @code * // allocate memory * qvector_t *vector = qvector(QVECTOR_THREADSAFE); * vector->free(vector); * @endcode * * @note * Available options: * - QVECTOR_THREADSAFE - make it thread-safe. */ qvector_t *qvector(int options) { qvector_t *vector = (qvector_t *) calloc(1, sizeof(qvector_t)); if (vector == NULL) { errno = ENOMEM; return NULL; } vector->list = qlist(options); if (vector->list == NULL) { free(vector); errno = ENOMEM; return NULL; } // methods vector->add = add; vector->addstr = addstr; vector->addstrf = addstrf; vector->toarray = toarray; vector->tostring = tostring; vector->size = size; vector->datasize = datasize; vector->clear = clear; vector->debug = debug; vector->free = free_; return vector; }
/** * String Tokenizer * * @param str source string * @param delimiters string that specifies a set of delimiters that may * surround the token being extracted * * @return qlist container pointer otherwise returns NULL. * * @code * qlist_t *tokens = qstr_tokenizer("a:b:c", ":"); * char *str; * while((str = tokens->popFirst(tokens, NULL)) != NULL) { * printf("%s\n", str); * } * tokens->free(tokens); * @endcode */ qlist_t *qstrtokenizer(const char *str, const char *delimiters) { qlist_t *list = qlist(); if (list == NULL) return NULL; int i; char *dupstr = strdup(str); char *token; int offset = 0; for (i = 1, token = qstrtok(dupstr, delimiters, NULL, &offset); token != NULL; token = qstrtok(dupstr, delimiters, NULL, &offset), i++) { list->addlast(list, token, strlen(token) + 1); } free(dupstr); return list; }
/** * Create a new stack container * * @param options combination of initialization options. * * @return a pointer of malloced qstack_t container, otherwise returns NULL. * @retval errno will be set in error condition. * - ENOMEM : Memory allocation failure. * * @code * qstack_t *stack = qstack(QSTACK_THREADSAFE); * @endcode * * @note * Available options: * - QSTACK_THREADSAFE - make it thread-safe. */ qstack_t *qstack(int options) { qstack_t *stack = (qstack_t *) malloc(sizeof(qstack_t)); if (stack == NULL) { errno = ENOMEM; return NULL; } memset((void *) stack, 0, sizeof(qstack_t)); stack->list = qlist(options); if (stack->list == NULL) { free(stack); return NULL; } // methods stack->setsize = qstack_setsize; stack->push = qstack_push; stack->pushstr = qstack_pushstr; stack->pushint = qstack_pushint; stack->pop = qstack_pop; stack->popstr = qstack_popstr; stack->popint = qstack_popint; stack->popat = qstack_popat; stack->get = qstack_get; stack->getstr = qstack_getstr; stack->getint = qstack_getint; stack->getat = qstack_getat; stack->size = qstack_size; stack->clear = qstack_clear; stack->debug = qstack_debug; stack->free = qstack_free; return stack; }
/** * Create a server object. */ ad_server_t *ad_server_new(void) { if (initialized) { initialized = true; //evthread_use_pthreads(); } ad_server_t *server = NEW_OBJECT(ad_server_t); if (server == NULL) { return NULL; } // Initialize instance. server->options = qhashtbl(0, 0); server->stats = qhashtbl(100, QHASHTBL_THREADSAFE); server->hooks = qlist(0); if (server->options == NULL || server->stats == NULL || server->hooks == NULL) { ad_server_free(server); return NULL; } DEBUG("Created a server object."); return server; }