void edit_deinit(const char *history_file, int (*filter_cb)(void *ctx, const char *cmd)) { rl_callback_handler_remove(); readline_free_completions(); eloop_unregister_read_sock(STDIN_FILENO); if (history_file) { /* Save command history, excluding lines that may contain * passwords. */ HIST_ENTRY *h; history_set_pos(0); while ((h = current_history())) { char *p = h->line; while (*p == ' ' || *p == '\t') p++; if (filter_cb && filter_cb(edit_cb_ctx, p)) { h = remove_history(where_history()); if (h) { os_free(h->line); free(h->data); os_free(h); } else next_history(); } else next_history(); } write_history(history_file); } }
/** * pk_package_sack_filter: * @sack: a valid #PkPackageSack instance * @filter_cb: (scope call): a #PkPackageSackFilterFunc, which returns %TRUE for the #PkPackage's to add * @user_data: user data to pass to @filter_cb * * Returns a new package sack which only matches packages that return %TRUE * from the filter function. * * Return value: (transfer full): a new #PkPackageSack, free with g_object_unref() * * Since: 0.6.3 **/ PkPackageSack * pk_package_sack_filter (PkPackageSack *sack, PkPackageSackFilterFunc filter_cb, gpointer user_data) { PkPackageSack *results; PkPackage *package; guint i; PkPackageSackPrivate *priv = sack->priv; g_return_val_if_fail (PK_IS_PACKAGE_SACK (sack), NULL); g_return_val_if_fail (filter_cb != NULL, NULL); /* create new sack */ results = pk_package_sack_new (); /* add each that matches the info enum */ for (i = 0; i < priv->array->len; i++) { package = g_ptr_array_index (priv->array, i); if (filter_cb (package, user_data)) pk_package_sack_add_package (results, package); } return results; }
int main(UNUSED int argc, UNUSED char *argv[]) { rbtree_t *t; int i, j, thresh; int n, nextseed, rep; int vals[MAXSIZE]; struct timeval now; gettimeofday(&now, NULL); /* TODO: make starting seed and repetitions a CLI option */ nextseed = now.tv_usec; rep = REPS; again: if (!--rep) return 0; srand(nextseed); thresh = rand(); mask = 0xff >> (rand() & 7); thresh &= mask; n = (rand() % MAXSIZE) + 1; while (n < 0 || n > MAXSIZE) n >>= 1; fprintf(stderr, "seed = %i filter = %x mask = %x n= %i\n", nextseed, thresh, mask, n); nextseed = rand(); t = rbtree_create(NULL, comp, free, RBTREE_FLAG_LOCK); /* Find out the value of the NIL node */ NIL = t->root->left; for (i = 0; i < n; i++) { int *p; p = malloc(sizeof(int)); *p = rand(); vals[i] = *p; rbtree_insert(t, p); } i = rbcount(t); fprintf(stderr,"After insert rbcount is %i.\n", i); if (i < 0) { return i; } qsort(vals, n, sizeof(int), comp); /* * For testing deletebydata instead for (i = 0; i < n; i++) { if (filter_cb(&vals[i], &thresh) == 2) { rbtree_deletebydata(t, &vals[i]); } } * */ rbtree_walk(t, RBTREE_DELETE_ORDER, filter_cb, &thresh); i = rbcount(t); fprintf(stderr,"After delete rbcount is %i.\n", i); if (i < 0) { return i; } r = 0; rbtree_walk(t, RBTREE_IN_ORDER, &store_cb, NULL); for (j = i = 0; i < n; i++) { if (i && vals[i-1] == vals[i]) continue; if (!filter_cb(&thresh, &vals[i])) { if (vals[i] != rvals[j]) goto bad; j++; } } fprintf(stderr,"matched OK\n"); rbtree_free(t); goto again; bad: for (j = i = 0; i < n; i++) { if (i && vals[i-1] == vals[i]) continue; if (!filter_cb(&thresh, &vals[i])) { fprintf(stderr, "%i: %x %x\n", j, vals[i], rvals[j]); j++; } else { fprintf(stderr, "skipped %x\n", vals[i]); } } return -1; }