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
|
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include "ObjFWRT.h"
#include "private.h"
static objc_enumeration_mutation_handler_t enumerationMutationHandler = NULL;
void
objc_enumerationMutation(id object)
{
if (enumerationMutationHandler != NULL)
enumerationMutationHandler(object);
else
OBJC_ERROR("Object was mutated during enumeration!");
}
void
objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t handler)
{
enumerationMutationHandler = handler;
}
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
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
|
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include "config.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include "ObjFWRT.h"
#include "private.h"
#ifdef OF_WINDOWS
# include <windows.h>
#endif
#ifdef OF_AMIGAOS
# define USE_INLINE_STDARG
# include <proto/exec.h>
# include <clib/debug_protos.h>
# define __NOLIBBASE__
# define Class IntuitionClass
# include <proto/intuition.h>
# undef Class
# undef __NOLIBBASE__
#endif
static objc_enumeration_mutation_handler_t enumerationMutationHandler = NULL;
void
objc_enumerationMutation(id object)
{
if (enumerationMutationHandler != NULL)
enumerationMutationHandler(object);
else
OBJC_ERROR("Object was mutated during enumeration!");
}
void
objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t handler)
{
enumerationMutationHandler = handler;
}
void
objc_error(const char *title, const char *format, ...)
{
#if defined(OF_WINDOWS) || defined(OF_AMIGAOS)
# define BUF_LEN 512
char message[BUF_LEN];
int status;
va_list args;
va_start(args, format);
status = vsnprintf(message, BUF_LEN, format, args);
if (status <= 0 || status >= BUF_LEN)
message[0] = '\0';
va_end(args);
# undef BUF_LEN
#endif
#if defined(OF_WINDOWS)
fprintf(stderr, "[%s] %s\n", title, message);
fflush(stderr);
MessageBoxA(NULL, message, title,
MB_OK | MB_SYSTEMMODAL | MB_ICONERROR);
exit(EXIT_FAILURE);
#elif defined(OF_AMIGAOS)
struct Library *IntuitionBase;
# ifdef OF_AMIGAOS4
struct IntuitionIFace *IIntuition;
# endif
struct EasyStruct easy;
# ifndef OF_AMIGAOS4
kprintf("[%s] %s\n", title, message);
# endif
if ((IntuitionBase = OpenLibrary("intuition.library", 0)) == NULL)
exit(EXIT_FAILURE);
# ifdef OF_AMIGAOS4
if ((IIntuition = (struct IntuitionIFace *)GetInterface(IntuitionBase,
"main", 1, NULL)) == NULL)
exit(EXIT_FAILURE);
# endif
easy.es_StructSize = sizeof(easy);
easy.es_Flags = 0;
easy.es_Title = (void *)title;
easy.es_TextFormat = (void *)"%s";
easy.es_GadgetFormat = (void *)"OK";
EasyRequest(NULL, &easy, NULL, (ULONG)message);
# ifdef OF_AMIGAOS4
DropInterface((struct Interface *)IIntuition);
# endif
CloseLibrary(IntuitionBase);
exit(EXIT_FAILURE);
#else
va_list args;
va_start(args, format);
fprintf(stderr, "[%s] ", title);
vfprintf(stderr, format, args);
fprintf(stderr, "\n");
fflush(stderr);
va_end(args);
abort();
#endif
OF_UNREACHABLE
}
|