int main() { int i, n; char *a = "AaAa"; char *b = "BbBb"; char *c = "CcCc"; char *p; cp_vector *v = cp_vector_create(1); for (i = 0; i < 30; i++) { char buf[0x20]; sprintf(buf, "%s %d", a, i); cp_vector_add_element(v, strdup(buf)); sprintf(buf, "%s %d", b, i); cp_vector_add_element(v, strdup(buf)); sprintf(buf, "%s %d", c, i); cp_vector_add_element(v, strdup(buf)); } n = cp_vector_size(v); for (i = 0; i < n; i++) { p = cp_vector_element_at(v, i); printf("%d: %s\n", i, p); } cp_vector_destroy_custom(v, free); return 0; }
void globals_free(globals **p) { globals *g = *p; cp_trie_destroy(g->sorts); cp_multimap_destroy(g->terms); cp_multimap_destroy(g->ops); cp_vector_destroy_custom(g->op_names, free); free(*p); *p = 0; }
void cp_avltree_destroy_node(cp_avltree *tree, cp_avlnode *node) { if (node) { if ((tree->mode & COLLECTION_MODE_DEEP)) { if (tree->key_dtr) (*tree->key_dtr)(node->key); if ((tree->mode & COLLECTION_MODE_MULTIPLE_VALUES) && node->value) cp_vector_destroy_custom(node->value, tree->value_dtr); else if (tree->value_dtr) (*tree->value_dtr)(node->value); } else if ((tree->mode & COLLECTION_MODE_MULTIPLE_VALUES) && node->value) cp_vector_destroy(node->value); free(node); } }
int cp_db_connection_execute_statement_args(cp_db_connection *connection, cp_db_statement *statement, cp_result_set **results, ...) { if (connection->data_source->act->execute_statement) { int i; int rc; va_list argp; int p_int; long p_long; #ifdef CP_HAS_LONG_LONG long long p_longlong; #else __int64 p_longlong; #endif /* CP_HAS_LONG_LONG */ double p_double; cp_timestampz p_timestamp; cp_string p_str; cp_vector *tmp = NULL; void *ptr; int *lengths = NULL; void **prm = NULL; if (statement->prm_count) { prm = calloc(statement->prm_count, sizeof(void *)); lengths = calloc(statement->prm_count, sizeof(int)); } va_start(argp, results); for (i = 0; i < statement->prm_count; i++) { tmp = cp_vector_create(statement->prm_count); switch (statement->types[i]) { case CP_FIELD_TYPE_CHAR: case CP_FIELD_TYPE_VARCHAR: prm[i] = va_arg(argp, char *); lengths[i] = strlen(prm[i]); break; case CP_FIELD_TYPE_BLOB: ptr = malloc(sizeof(int)); p_str = va_arg(argp, cp_string); memcpy(ptr, &p_str, sizeof(cp_string)); prm[i] = ptr; lengths[i] = p_str.len; break; case CP_FIELD_TYPE_BOOLEAN: case CP_FIELD_TYPE_SHORT: case CP_FIELD_TYPE_INT: ptr = malloc(sizeof(int)); p_int = va_arg(argp, int); memcpy(ptr, &p_int, sizeof(int)); cp_vector_add_element(tmp, ptr); prm[i] = ptr; lengths[i] = sizeof(int); break; case CP_FIELD_TYPE_LONG: ptr = malloc(sizeof(long)); p_long = va_arg(argp, long); memcpy(ptr, &p_long, sizeof(long)); cp_vector_add_element(tmp, ptr); prm[i] = ptr; lengths[i] = sizeof(long); break; case CP_FIELD_TYPE_LONG_LONG: #ifdef CP_HAS_LONG_LONG ptr = malloc(sizeof(long long)); p_longlong = va_arg(argp, long long); memcpy(ptr, &p_longlong, sizeof(long long)); lengths[i] = sizeof(long long); #else ptr = malloc(sizeof(__int64)); p_longlong = va_arg(argp, __int64); memcpy(ptr, &p_longlong, sizeof(__int64)); lengths[i] = sizeof(__int64); #endif /* CP_HAS_LONG_LONG */ cp_vector_add_element(tmp, ptr); prm[i] = ptr; break; case CP_FIELD_TYPE_FLOAT: case CP_FIELD_TYPE_DOUBLE: ptr = malloc(sizeof(double)); p_double = va_arg(argp, double); memcpy(ptr, &p_double, sizeof(double)); cp_vector_add_element(tmp, ptr); prm[i] = ptr; lengths[i] = sizeof(double); break; case CP_FIELD_TYPE_DATE: case CP_FIELD_TYPE_TIME: case CP_FIELD_TYPE_TIMESTAMP: ptr = malloc(sizeof(cp_timestampz)); p_timestamp = va_arg(argp, cp_timestampz); memcpy(ptr, &p_timestamp, sizeof(cp_timestampz)); cp_vector_add_element(tmp, ptr); prm[i] = ptr; break; } } rc = (*connection->data_source->act->execute_statement)(connection, statement, results, lengths, prm); va_end(argp); if (statement->prm_count) { free(prm); free(lengths); } if (prm) free(prm); if (tmp) cp_vector_destroy_custom(tmp, (cp_destructor_fn) free); return rc; }