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

# User Rev Content
1 greg 2.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     }