error.c

来自「MPI stands for the Message Passing Inter」· C语言 代码 · 共 193 行

C
193
字号
/* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana *                         University Research and Technology *                         Corporation.  All rights reserved. * Copyright (c) 2004-2005 The University of Tennessee and The University *                         of Tennessee Research Foundation.  All rights *                         reserved. * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,  *                         University of Stuttgart.  All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. *                         All rights reserved. * $COPYRIGHT$ *  * Additional copyrights may follow *  * $HEADER$ */#include "opal_config.h"#ifdef HAVE_STRING_H#include <string.h>#endif#include <errno.h>#include <stdio.h>#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif#include "opal/util/error.h"#include "opal/constants.h"#define MAX_CONVERTERS 5#define MAX_CONVERTER_PROJECT_LEN 10struct converter_info_t {    int init;    char project[MAX_CONVERTER_PROJECT_LEN];    int err_base;    int err_max;    opal_err2str_fn_t converter;};typedef struct converter_info_t converter_info_t;/* all default to NULL */converter_info_t converters[MAX_CONVERTERS];static const char *opal_strerror_int(int errnum){    int i;    const char *ret = NULL;    for (i = 0 ; i < MAX_CONVERTERS ; ++i) {        if (0 != converters[i].init) {            ret = converters[i].converter(errnum);            if (NULL != ret) break;        }    }    return ret;}/* caller must free string */static char*opal_strerror_unknown(int errnum){    int i;    char *ret;    for (i = 0 ; i < MAX_CONVERTERS ; ++i) {        if (0 != converters[i].init) {            if (errnum < converters[i].err_base &&                 errnum > converters[i].err_max) {                asprintf(&ret, "Unknown error: %d (%s error %d)",                         errnum, converters[i].project,                          errnum - converters[i].err_base);                return ret;            }        }    }    asprintf(&ret, "Unknown error: %d", errnum);    return ret;}voidopal_perror(int errnum, const char *msg){    const char* errmsg = opal_strerror_int(errnum);    if (NULL != msg && errnum != OPAL_ERR_IN_ERRNO) {        fprintf(stderr, "%s: ", msg);    }    if (NULL == errmsg) {        if (errnum == OPAL_ERR_IN_ERRNO) {            perror(msg);        } else {            char *ue_msg = opal_strerror_unknown(errnum);            fprintf(stderr, "%s\n", ue_msg);            free(ue_msg);        }    } else {        fprintf(stderr, "%s\n", errmsg);    }    fflush(stderr);}/* big enough to hold long version */#define UNKNOWN_RETBUF_LEN 50static char unknown_retbuf[UNKNOWN_RETBUF_LEN];const char *opal_strerror(int errnum){    const char* errmsg = opal_strerror_int(errnum);    if (NULL == errmsg) {        if (errnum == OPAL_ERR_IN_ERRNO) {            return strerror(errno);        } else {            char *ue_msg = opal_strerror_unknown(errnum);            snprintf(unknown_retbuf, UNKNOWN_RETBUF_LEN, "%s", ue_msg);            free(ue_msg);            errno = EINVAL;            return (const char*) unknown_retbuf;        }    } else {        return errmsg;    }}intopal_strerror_r(int errnum, char *strerrbuf, size_t buflen){    const char* errmsg = opal_strerror_int(errnum);    int ret;    if (NULL == errmsg) {        if (errnum == OPAL_ERR_IN_ERRNO) {            char *tmp = strerror(errno);            strncpy(strerrbuf, tmp, buflen);            return OPAL_SUCCESS;        } else {            char *ue_msg = opal_strerror_unknown(errnum);            ret =  snprintf(strerrbuf, buflen, "%s", ue_msg);            free(ue_msg);            if (ret > (int) buflen) {                errno = ERANGE;                return OPAL_ERR_OUT_OF_RESOURCE;            } else {                errno = EINVAL;                return OPAL_SUCCESS;            }        }    } else {        ret =  snprintf(strerrbuf, buflen, "%s", errmsg);        if (ret > (int) buflen) {            errno = ERANGE;            return OPAL_ERR_OUT_OF_RESOURCE;        } else {            return OPAL_SUCCESS;        }    }}intopal_error_register(const char *project, int err_base, int err_max,                    opal_err2str_fn_t converter){    int i;    for (i = 0 ; i < MAX_CONVERTERS ; ++i) {        if (0 == converters[i].init) {            converters[i].init = 1;            strncpy(converters[i].project, project, MAX_CONVERTER_PROJECT_LEN);            converters[i].err_base = err_base;            converters[i].err_max = err_max;            converters[i].converter = converter;            return OPAL_SUCCESS;        }    }    return OPAL_ERR_OUT_OF_RESOURCE;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?