-
Notifications
You must be signed in to change notification settings - Fork 1
/
warnings.c
143 lines (98 loc) · 2.67 KB
/
warnings.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
Copyright (C) 2001-2009, Parrot Foundation.
$Id$
=head1 NAME
src/warnings.c - Warning and error reporting
=head1 DESCRIPTION
Parrot C<STRING> and C string versions of a function to print warning/error
messages.
=over 4
=cut
*/
#include "parrot/parrot.h"
#include <stdarg.h>
/* HEADERIZER HFILE: include/parrot/warnings.h */
/* HEADERIZER BEGIN: static */
/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
static INTVAL print_warning(PARROT_INTERP, ARGIN_NULLOK(STRING *msg))
__attribute__nonnull__(1);
#define ASSERT_ARGS_print_warning __attribute__unused__ int _ASSERT_ARGS_CHECK = \
PARROT_ASSERT_ARG(interp)
/* Don't modify between HEADERIZER BEGIN / HEADERIZER END. Your changes will be lost. */
/* HEADERIZER END: static */
/*
=item C<void print_pbc_location(PARROT_INTERP)>
Prints the bytecode location of the warning or error to C<Parrot_io_STDERR>.
=cut
*/
PARROT_EXPORT
void
print_pbc_location(PARROT_INTERP)
{
ASSERT_ARGS(print_pbc_location)
Interp * const tracer = (interp->pdb && interp->pdb->debugger) ?
interp->pdb->debugger :
interp;
Parrot_io_eprintf(tracer, "%Ss\n",
Parrot_Context_infostr(interp,
CONTEXT(interp)));
}
/*
=item C<static INTVAL print_warning(PARROT_INTERP, STRING *msg)>
Prints the warning message and the bytecode location.
=cut
*/
static INTVAL
print_warning(PARROT_INTERP, ARGIN_NULLOK(STRING *msg))
{
ASSERT_ARGS(print_warning)
if (!msg)
Parrot_io_puts(interp, Parrot_io_STDERR(interp), "Unknown warning\n");
else {
Parrot_io_putps(interp, Parrot_io_STDERR(interp), msg);
if (string_ord(interp, msg, -1) != '\n')
Parrot_io_eprintf(interp, "%c", '\n');
}
print_pbc_location(interp);
return 1;
}
/*
=back
=head2 Parrot Warnings Interface
=over 4
=item C<INTVAL Parrot_warn(PARROT_INTERP, INTVAL warnclass, const char *message,
...)>
The Parrot C string warning/error reporter.
Returns 2 on error, 1 on success.
C<message, ..> can be a C<Parrot_vsprintf_c()> format with arguments.
=cut
*/
PARROT_EXPORT
INTVAL
Parrot_warn(PARROT_INTERP, INTVAL warnclass,
ARGIN(const char *message), ...)
{
ASSERT_ARGS(Parrot_warn)
if (!PARROT_WARNINGS_test(interp, warnclass))
return 2;
else {
STRING *targ;
va_list args;
va_start(args, message);
targ = Parrot_vsprintf_c(interp, message, args);
va_end(args);
return print_warning(interp, targ);
}
}
/*
=back
=head1 SEE ALSO
F<include/parrot/warnings.h>.
=cut
*/
/*
* Local variables:
* c-file-style: "parrot"
* End:
* vim: expandtab shiftwidth=4:
*/