/* Copyright 2001-2005 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef MODPERL_ERROR_H
#define MODPERL_ERROR_H

/*** mod_perl custom errors come here ***/

/* to check whether $@ is set by ModPerl::Util::exit */
#define MODPERL_RC_EXIT        APR_OS_START_USERERR + 0
/* indicate the filter error problem */
#define MODPERL_FILTER_ERROR   APR_OS_START_USERERR + 1

/**
 * return the string representation of the error code 
 * @param rc   error code
 * @return     the error string
 *
 * The return value must be immediately copied unless used only in a
 * limited visible scope where it's clear that Perl_form() is not
 * called again (which could happen indirectly). If unsure, copy.
 */
char *modperl_error_strerror(pTHX_ apr_status_t rc);
        
void modperl_croak(pTHX_ apr_status_t rc, const char* func);

#define MP_RUN_CROAK(rc_run, func) STMT_START                \
    {                                                        \
        apr_status_t rc = rc_run;                            \
        if (rc != APR_SUCCESS) {                             \
            modperl_croak(aTHX_ rc, func);                   \
        }                                                    \
    } STMT_END

#endif /* MODPERL_ERROR_H */
