ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/dmessage.c
Revision: 2.1
Committed: Wed Aug 14 20:05:23 2024 UTC (8 months, 2 weeks ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Log Message:
feat(rxpict): Added new C++ picture rendering tool with multi-processing and spectral output

File Contents

# Content
1 /*
2 * dmessage.c
3 * panlib
4 *
5 * Debug message reporting routines.
6 *
7 * Created by gward on Thu May 10 2001.
8 * Copyright (c) 2001 Anyhere Software. All rights reserved.
9 *
10 */
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <errno.h>
16 #include "dmessage.h"
17
18 #define DM_NCLASSES DMCnerr /* number of message classes */
19 #define DM_MOSTFLAGS (DMFrecord|DMFlog|DMFstderr|DMFalert)
20
21 char dmessage_buf[DM_BUF_LEN];
22 const char * dmessage_class_name[DM_NCLASSES+1] = {
23 "assert",
24 "memory",
25 "system",
26 "parameter",
27 "resource",
28 "data",
29 "input",
30 "warning",
31 "info",
32 "trace",
33 "none"
34 };
35 int dmessage_class_flags[DM_NCLASSES+1] = {
36 DM_MOSTFLAGS|DMFabort,
37 DM_MOSTFLAGS|DMFexit,
38 DM_MOSTFLAGS,
39 DM_MOSTFLAGS,
40 DM_MOSTFLAGS,
41 DM_MOSTFLAGS,
42 DM_MOSTFLAGS,
43 DMFrecord|DMFlog|DMFstderr,
44 DMFrecord|DMFlog,
45 DMFrecord,
46 0
47 };
48 int dmessage_class_done[DM_NCLASSES];
49 const char * dmessage_file[DM_NCLASSES];
50 int dmessage_line[DM_NCLASSES];
51 const char * dmessage_record[DM_NCLASSES+1];
52 DMsgClass dmessage_last_class = DMCnerr;
53 FILE * dmessage_logfp = NULL;
54 int (*dmessage_call)(DMsgClass cls, const char *msg,
55 const char *file, int line) = NULL;
56 int (*dmessage_alert)(const char *msg) = NULL;
57 void (*dmessage_exit)(int status) = exit;
58 void (*dmessage_abort)() = abort;
59
60 #define DM_MAX_RECORD 128
61
62 static char dmessage_mine[DM_NCLASSES][DM_MAX_RECORD];
63
64 /* Report/record message, aborting program if cls is DMCassert */
65 int
66 dmessage(DMsgClass cls, const char *msg, const char *file, int line)
67 {
68 int todo;
69 const char *cp;
70 if ((cls < 0) | (cls >= DMCnerr))
71 return 0;
72 todo = dmessage_class_flags[cls];
73 if (msg == NULL || !*msg)
74 msg = "(missing message)";
75 if (file != NULL && ((cp = strrchr(file, '/')) != NULL ||
76 (cp = strrchr(file, '\\')) != NULL))
77 file = cp+1; /* use tail */
78 dmessage_file[cls] = file; /* remember call */
79 dmessage_line[cls] = line;
80 dmessage_class_done[cls] = todo;
81 if (cls < dmessage_last_class) /* mark class */
82 dmessage_last_class = cls;
83 if (dmessage_call != NULL) /* notify callback */
84 todo &= ~(*dmessage_call)(cls, msg, file, line);
85 if (todo & DMFrecord) { /* save message */
86 if (msg != dmessage_buf && strlen(msg) >= DM_MAX_RECORD) {
87 dmessage_record[cls] = msg;
88 } else {
89 strncpy(dmessage_mine[cls], msg, DM_MAX_RECORD-1);
90 dmessage_record[cls] = dmessage_mine[cls];
91 }
92 todo &= ~DMFrecord;
93 }
94 if (todo & DMFstderr) { /* send to stderr */
95 if (file != NULL)
96 fprintf(stderr, "%s@%d>%s: %s", file, line,
97 dmessage_class_name[cls], msg);
98 else
99 fprintf(stderr, "%s: %s",
100 dmessage_class_name[cls], msg);
101 if ((cls == DMCsystem) | (cls == DMCresource) && errno) {
102 fputs(": ", stderr);
103 perror(NULL);
104 } else
105 fputc('\n', stderr);
106 if (fflush(stderr) != EOF) {
107 todo &= ~DMFstderr;
108 if (dmessage_logfp == stderr)
109 todo &= ~DMFlog;
110 }
111 }
112 if (todo & DMFlog && dmessage_logfp != NULL) { /* log to file */
113 if (file != NULL)
114 fprintf(dmessage_logfp, "%s@%d>%s: %s\n", file, line,
115 dmessage_class_name[cls], msg);
116 else
117 fprintf(dmessage_logfp, "%s: %s\n",
118 dmessage_class_name[cls], msg);
119 if (fflush(dmessage_logfp) != EOF)
120 todo &= ~DMFlog;
121 }
122 if (todo & DMFalert && dmessage_alert != NULL) /* alert user */
123 if ((*dmessage_alert)(msg))
124 todo &= ~DMFalert;
125
126 if (todo & DMFabort && dmessage_abort != NULL) {/* abort */
127 (*dmessage_abort)();
128 todo &= ~DMFabort;
129 }
130 if (todo & DMFexit && dmessage_exit != NULL) { /* exit */
131 (*dmessage_exit)(1);
132 todo &= ~DMFexit;
133 }
134 /* say what was done */
135 return dmessage_class_done[cls] = (dmessage_class_flags[cls] & ~todo);
136 }