/** @brief Strip whitespace (or other characters) from the end and the begining of a string. * * Strips the whitespaces from both the beginning and the end of s. * By default (when char_list=NULL), these characters get stripped: * * - " " (ASCII 32 (0x20)) space. * - "\t" (ASCII 9 (0x09)) tab. * - "\n" (ASCII 10 (0x0A)) line feed. * - "\r" (ASCII 13 (0x0D)) carriage return. * - "\0" (ASCII 0 (0x00)) NULL. * - "\x0B" (ASCII 11 (0x0B)) vertical tab. * * @param s The string to strip. * @param char_list A string which contains the characters you want to strip. */ void xbt_str_trim(char *s, const char *char_list) { if (!s) return; xbt_str_rtrim(s, char_list); xbt_str_ltrim(s, char_list); }
/** @brief shows an exception content and the associated stack if available */ void xbt_ex_display(xbt_ex_t * e) { char *thrower = NULL; if (e->pid != xbt_getpid()) thrower = bprintf(" on process %d",e->pid); fprintf(stderr, "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n" "** %s\n" "** Thrown by %s()%s\n", xbt_binary_name, xbt_getpid(), xbt_ex_catname(e->category), e->value, e->msg, e->procname, thrower ? thrower : " in this process"); XBT_CRITICAL("%s", e->msg); xbt_free(thrower); if (xbt_initialized==0 || smx_cleaned) { fprintf(stderr, "Ouch. SimGrid is not initialized yet, or already closing. No backtrace available.\n"); return; /* Not started yet or already closing. Trying to generate a backtrace would probably fail */ } if (!e->bt_strings) xbt_ex_setup_backtrace(e); #ifdef HAVE_BACKTRACE if (e->used && e->bt_strings) { /* We have everything to build neat backtraces */ int i; int cutpath = 0; TRY { // We don't want to have an exception while checking how to deal with the one we already have, do we? cutpath = sg_cfg_get_boolean("exception/cutpath"); } CATCH_ANONYMOUS { } fprintf(stderr, "\n"); for (i = 0; i < e->used; i++) { if (cutpath) { char* p = e->bt_strings[i]; xbt_str_rtrim(p, ":0123456789"); char* filename = strrchr(p, '/')+1; char* end_of_message = strrchr(p, ' '); int length = strlen(p)-strlen(end_of_message); char* dest = malloc(length); memcpy(dest, &p[0], length); dest[length] = 0; fprintf(stderr, "%s %s\n", dest, filename); free(dest); } else { fprintf(stderr, "%s\n", e->bt_strings[i]); } } } else
/** @brief shows an exception content and the associated stack if available */ void xbt_ex_display(xbt_ex_t * e) { char *thrower = NULL; if (e->pid != xbt_getpid()) thrower = bprintf(" on process %d",e->pid); fprintf(stderr, "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n" "** %s\n" "** Thrown by %s()%s\n", xbt_binary_name, xbt_getpid(), xbt_ex_catname(e->category), e->value, e->msg, e->procname, thrower ? thrower : " in this process"); XBT_CRITICAL("%s", e->msg); xbt_free(thrower); if (!e->bt_strings) xbt_ex_setup_backtrace(e); #ifdef HAVE_BACKTRACE if (e->used && e->bt_strings) { /* We have everything to build neat backtraces */ int i; fprintf(stderr, "\n"); for (i = 0; i < e->used; i++) { if (sg_cfg_get_boolean("exception/cutpath")) { char* p = e->bt_strings[i]; xbt_str_rtrim(p, ":0123456789"); char* filename = strrchr(p, '/')+1; char* end_of_message = strrchr(p, ' '); int length = strlen(p)-strlen(end_of_message); char* dest = malloc(length); memcpy(dest, &p[0], length); dest[length] = 0; fprintf(stderr, "%s %s\n", dest, filename); free(dest); } else { fprintf(stderr, "%s\n", e->bt_strings[i]); } } } else #endif { fprintf(stderr, "\n" "** In %s() at %s:%d\n" "** (no backtrace available)\n", e->func, e->file, e->line); } }