1/* Error reporting facilities.
2
3   Copyright (C) 1986-2023 Free Software Foundation, Inc.
4
5   This file is part of GDB.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20#include "common-defs.h"
21#include "errors.h"
22#if defined (USE_WIN32API) || defined(__CYGWIN__)
23#include <windows.h>
24#endif /* USE_WIN32API */
25
26/* See gdbsupport/errors.h.  */
27
28void
29warning (const char *fmt, ...)
30{
31  va_list ap;
32
33  va_start (ap, fmt);
34  vwarning (fmt, ap);
35  va_end (ap);
36}
37
38/* See gdbsupport/errors.h.  */
39
40void
41error (const char *fmt, ...)
42{
43  va_list ap;
44
45  va_start (ap, fmt);
46  verror (fmt, ap);
47  va_end (ap);
48}
49
50/* See gdbsupport/errors.h.  */
51
52void
53internal_error_loc (const char *file, int line, const char *fmt, ...)
54{
55  va_list ap;
56
57  va_start (ap, fmt);
58  internal_verror (file, line, fmt, ap);
59  va_end (ap);
60}
61
62/* See gdbsupport/errors.h.  */
63
64void
65internal_warning_loc (const char *file, int line, const char *fmt, ...)
66{
67  va_list ap;
68
69  va_start (ap, fmt);
70  internal_vwarning (file, line, fmt, ap);
71  va_end (ap);
72}
73
74#if defined (USE_WIN32API) || defined(__CYGWIN__)
75
76/* See errors.h.  */
77
78const char *
79strwinerror (ULONGEST error)
80{
81  static char buf[1024];
82  TCHAR *msgbuf;
83  DWORD lasterr = GetLastError ();
84  DWORD chars = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
85			       | FORMAT_MESSAGE_ALLOCATE_BUFFER,
86			       NULL,
87			       error,
88			       0, /* Default language */
89			       (LPTSTR) &msgbuf,
90			       0,
91			       NULL);
92  if (chars != 0)
93    {
94      /* If there is an \r\n appended, zap it.  */
95      if (chars >= 2
96	  && msgbuf[chars - 2] == '\r'
97	  && msgbuf[chars - 1] == '\n')
98	{
99	  chars -= 2;
100	  msgbuf[chars] = 0;
101	}
102
103      if (chars > ARRAY_SIZE (buf) - 1)
104	{
105	  chars = ARRAY_SIZE (buf) - 1;
106	  msgbuf [chars] = 0;
107	}
108
109#ifdef UNICODE
110      wcstombs (buf, msgbuf, chars + 1);
111#else
112      strncpy (buf, msgbuf, chars + 1);
113#endif
114      LocalFree (msgbuf);
115    }
116  else
117    sprintf (buf, "unknown win32 error (%u)", (unsigned) error);
118
119  SetLastError (lasterr);
120  return buf;
121}
122
123#endif /* USE_WIN32API */
124