+ return suite->unit_failed;
+}
+
+static void apply_selection(char *selection)
+{
+ /* for the parsing */
+ char *sel = selection;
+ char *p;
+ int done = 0;
+ char dir[1024]; /* the directive */
+ /* iterators */
+ unsigned int it_suite;
+ xbt_test_suite_t suite;
+ xbt_test_unit_t unit;
+ unsigned int it_unit;
+
+ char suitename[512];
+ char unitname[512];
+
+ if (!selection || selection[0] == '\0')
+ return;
+
+ /*printf("Test selection: %s\n", selection); */
+
+ /* First apply the selection */
+ while (!done) {
+ int enabling = 1;
+
+ p = strchr(sel, ',');
+ if (p) {
+ strncpy(dir, sel, p - sel);
+ dir[p - sel] = '\0';
+ sel = p + 1;
+ } else {
+ strcpy(dir, sel);
+ done = 1;
+ }
+
+ if (dir[0] == '-') {
+ enabling = 0;
+ memmove(dir, dir + 1, strlen(dir));
+ }
+ if (dir[0] == '+') {
+ enabling = 1;
+ memmove(dir, dir + 1, strlen(dir));
+ }
+
+ p = strchr(dir, ':');
+ if (p) {
+ strcpy(unitname, p + 1);
+ strncpy(suitename, dir, p - dir);
+ suitename[p - dir] = '\0';
+ } else {
+ strcpy(suitename, dir);
+ unitname[0] = '\0';
+ }
+ /*fprintf(stderr,"Seen %s (%s; suite=%s; unit=%s)\n",
+ dir,enabling?"enabling":"disabling", suitename, unitname); */
+
+ /* Deal with the specific case of 'all' pseudo serie */
+ if (!strcmp("all", suitename)) {
+ if (unitname[0] != '\0') {
+ fprintf(stderr,
+ "The 'all' pseudo-suite does not accept any unit specification\n");
+ exit(1);
+ }
+
+ xbt_dynar_foreach(_xbt_test_suites, it_suite, suite) {
+ xbt_dynar_foreach(suite->units, it_unit, unit) {
+ unit->enabled = enabling;
+ }
+ suite->enabled = enabling;
+ }
+ } else {
+ unsigned int it;
+ for (it = 0; it < xbt_dynar_length(_xbt_test_suites); it++) {
+ xbt_test_suite_t thissuite =
+ xbt_dynar_get_as(_xbt_test_suites, it, xbt_test_suite_t);
+ if (!strcmp(suitename, thissuite->name)) {
+ /* Do not disable the whole suite when we just want to disable a child */
+ if (enabling || (unitname[0] == '\0'))
+ thissuite->enabled = enabling;
+
+ if (unitname[0] == '\0') {
+ xbt_dynar_foreach(thissuite->units, it_unit, unit) {
+ unit->enabled = enabling;
+ }
+ } else { /* act on one child only */
+ unsigned int it2_unit;
+ /* search it, first (we won't reuse it for external loop which gets broken) */
+ for (it2_unit = 0; it2_unit < xbt_dynar_length(thissuite->units);
+ it2_unit++) {
+ xbt_test_unit_t thisunit =
+ xbt_dynar_get_as(thissuite->units, it2_unit, xbt_test_unit_t);
+ if (!strcmp(thisunit->name, unitname)) {
+ thisunit->enabled = enabling;
+ break;
+ }
+ } /* search relevant unit */
+ if (it2_unit == xbt_dynar_length(thissuite->units)) {
+ fprintf(stderr,
+ "Suite '%s' has no unit of name '%s'. Cannot apply the selection\n",
+ suitename, unitname);
+ exit(1);
+ }
+ } /* act on childs (either all or one) */
+
+ break; /* found the relevant serie. We are happy */
+ }
+ } /* search relevant series */
+ if (it == xbt_dynar_length(_xbt_test_suites)) {
+ fprintf(stderr,
+ "No suite of name '%s' found. Cannot apply the selection\n",
+ suitename);
+ exit(1);
+ }
+ }
+