+ { // Sorting output got
+ xbt_dynar_t a = xbt_str_split(rctx->output_got->data, "\n");
+ xbt_dynar_t b = xbt_dynar_new(sizeof(char *), NULL);
+ unsigned cpt;
+ char *str;
+ xbt_dynar_foreach(a, cpt, str) {
+ if (strncmp(str, "TESH_ERROR ", (sizeof "TESH_ERROR ") - 1) == 0) {
+ XBT_CRITICAL("%s", str);
+ errcode = 1;
+ } else if (coverage &&
+ strncmp(str, "profiling:", (sizeof "profiling:") - 1) == 0) {
+ XBT_DEBUG("Remove line [%u]: '%s'", cpt, str);
+ } else {
+ xbt_dynar_push_as(b, char *, str);
+ }
+ }
+
+ if (rctx->output_sort) {
+ stable_sort(b);
+ /* If empty lines moved in first position, remove them */
+ while (!xbt_dynar_is_empty(b) && *xbt_dynar_getfirst_as(b, char*) == '\0')
+ xbt_dynar_shift(b, NULL);
+ }
+
+ if (rctx->output_sort || xbt_dynar_length(b) != xbt_dynar_length(a)) {
+ char *newbuf = xbt_str_join(b, "\n");
+ strcpy(rctx->output_got->data, newbuf);
+ rctx->output_got->used = strlen(newbuf);
+ xbt_free(newbuf);
+ }
+
+ xbt_dynar_free(&b);
+ xbt_dynar_free(&a);
+ }
+
+ if (rctx->output_sort) { // Sorting output wanted
+ char *newbuf;
+ xbt_dynar_t a = xbt_str_split(rctx->output_wanted->data, "\n");
+
+ stable_sort(a);
+ /* If empty lines moved in first position, remove them */
+ while (!xbt_dynar_is_empty(a) && *xbt_dynar_getfirst_as(a, char*) == '\0')
+ xbt_dynar_shift(a, NULL);
+
+ newbuf = xbt_str_join(a, "\n");
+ strcpy(rctx->output_wanted->data, newbuf);
+ rctx->output_wanted->used = strlen(newbuf);
+ xbt_free(newbuf);
+
+ xbt_dynar_free(&a);
+ }