mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-02-07 11:01:57 +08:00
171 lines
4.2 KiB
C
171 lines
4.2 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IMPORTANT NOTICE
|
|
//
|
|
// The following open source license statement does not apply to any
|
|
// entity in the Exception List published by FMSoft.
|
|
//
|
|
// For more information, please visit:
|
|
//
|
|
// https://www.fmsoft.cn/exception-list
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*
|
|
* This file is part of MiniGUI, a mature cross-platform windowing
|
|
* and Graphics User Interface (GUI) support system for embedded systems
|
|
* and smart IoT devices.
|
|
*
|
|
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
|
* Copyright (C) 1998~2002, WEI Yongming
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Or,
|
|
*
|
|
* As this program is a library, any link to this program must follow
|
|
* GNU General Public License version 3 (GPLv3). If you cannot accept
|
|
* GPLv3, you need to be licensed from FMSoft.
|
|
*
|
|
* If you have got a commercial license of this program, please use it
|
|
* under the terms and conditions of the commercial license.
|
|
*
|
|
* For more information about the commercial license, please refer to
|
|
* <http://www.minigui.com/blog/minigui-licensing-policy/>.
|
|
*/
|
|
/*
|
|
** error.c: error handling functions
|
|
**
|
|
** Some code come from APUE by Richard Stevens.
|
|
**
|
|
** Current maintainer: Wei Yongming.
|
|
**
|
|
** Create date: 2000/12/31
|
|
*/
|
|
|
|
#include <errno.h> /* for definition of errno */
|
|
#include <stdarg.h> /* ANSI C header file */
|
|
|
|
#include "common.h"
|
|
|
|
#ifdef _MGRM_PROCESSES
|
|
|
|
#include "ourhdr.h"
|
|
|
|
static void err_doit(int, const char *, va_list);
|
|
|
|
/* Nonfatal error related to a system call.
|
|
* Print a message and return. */
|
|
|
|
void
|
|
err_ret(const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
err_doit(1, fmt, ap);
|
|
va_end(ap);
|
|
return;
|
|
}
|
|
|
|
/* Fatal error related to a system call.
|
|
* Print a message and terminate. */
|
|
|
|
void
|
|
err_sys(const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
err_doit(1, fmt, ap);
|
|
va_end(ap);
|
|
exit(1);
|
|
}
|
|
|
|
/* Fatal error related to a system call.
|
|
* Print a message, dump core, and terminate. */
|
|
|
|
void
|
|
err_dump(const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
err_doit(1, fmt, ap);
|
|
va_end(ap);
|
|
abort(); /* dump core and terminate */
|
|
exit(1); /* shouldn't get here */
|
|
}
|
|
|
|
/* Nonfatal error unrelated to a system call.
|
|
* Print a message and return. */
|
|
|
|
void
|
|
err_msg(const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
err_doit(0, fmt, ap);
|
|
va_end(ap);
|
|
return;
|
|
}
|
|
|
|
/* Fatal error unrelated to a system call.
|
|
* Print a message and terminate. */
|
|
|
|
void
|
|
err_quit(const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
err_doit(0, fmt, ap);
|
|
va_end(ap);
|
|
exit(1);
|
|
}
|
|
|
|
/* Print a message and return to caller.
|
|
* Caller specifies "errnoflag". */
|
|
|
|
static void
|
|
err_doit(int errnoflag, const char *fmt, va_list ap)
|
|
{
|
|
int errno_save;
|
|
char buf[MAXLINE];
|
|
|
|
errno_save = errno; /* value caller might want printed */
|
|
vsnprintf(buf, MAXLINE, fmt, ap);
|
|
|
|
#if 0
|
|
if (errnoflag)
|
|
sprintf(buf+strlen(buf), ": %s", strerror(errno_save));
|
|
|
|
strcat(buf, "\n");
|
|
fflush(stdout); /* in case stdout and stderr are the same */
|
|
fputs(buf, stderr);
|
|
fflush(NULL); /* flushes all stdio output streams */
|
|
#else
|
|
fflush(stdout); /* in case stdout and stderr are the same */
|
|
if (errnoflag)
|
|
_ERR_PRINTF("%s: %s\n", buf, strerror(errno_save));
|
|
else
|
|
_ERR_PRINTF("%s\n", buf);
|
|
fflush(stdout); /* in case stdout and stderr are the same */
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
#endif
|
|
|