5 /* $Id: warn.c,v 2.3 1994/06/24 10:49:39 ceriel Exp $ */
16 extern FILE *mess_fp; /* from io.c */
17 extern char *trap2text(); /* from trap.c */
19 /******** The warnings ********/
26 #define WMASK 0x5555 /* powers of 4 */
28 PRIVATE struct warn_msg warn_msg[] = {
29 #include "warn_msg" /* generated from $(EM)/doc/int */
33 PRIVATE char *warn_text[WMSG+1];
38 register struct warn_msg *wmsg;
40 for (i = 0; i <= WMSG; i++) {
41 warn_text[i] = "*** Unknown warning (internal error) ***";
44 for (wmsg = &warn_msg[0]; wmsg->wm_nr; wmsg++) {
45 warn_text[wmsg->wm_nr] = wmsg->wm_text;
49 /******** The warning counters ********/
52 struct warn_cnt *next;
53 ptr wc_fil; /* file name pointer */
54 long wc_lin; /* line number */
55 long wc_cnt; /* the counter */
58 PRIVATE struct warn_cnt *warn_cnt[WMSG];
59 PRIVATE char warnmask[WMSG];
61 PRIVATE long count_wrn(nr)
63 { /* returns the occurrence counter for the warning with number
64 nr; keeps track of the warnings, sorted by warning number,
65 file name and line number.
67 register struct warn_cnt **warn_hook = &warn_cnt[nr];
68 register struct warn_cnt *wrn;
70 while (wrn = *warn_hook) {
71 if (wrn->wc_fil == FIL && wrn->wc_lin == LIN) {
74 warn_hook = &wrn->next;
77 wrn = (struct warn_cnt *)
78 Malloc((size) sizeof (struct warn_cnt), (char *)0);
91 /******** The handling ********/
93 #define wmask_on(i) (warnmask[i])
95 PRIVATE int latest_warning_printed; /* set if ... */
103 latest_warning_printed = 0;
106 register long wrn_cnt = count_wrn(nr);
107 register char *wmsgtxt = warn_text[nr];
109 LOG(("@w1 warning: %s [%s: %d]", wmsgtxt, F, L));
110 if ( /* wrn_cnt is a power of two */
111 !((wrn_cnt-1) & wrn_cnt)
112 && /* and it is the right power of two */
116 "(Warning %d, #%ld): %s at %s\n",
117 nr, wrn_cnt, wmsgtxt, position());
118 latest_warning_printed = 1;
123 /* actually a trap number */
126 fprintf(mess_fp, "(Warning): Trap occurred - %s at %s\n",
127 trap2text(nr), position());
136 /* continued warning */
137 if (latest_warning_printed) {
139 register char *wmsgtxt = warn_text[nr];
141 LOG(("@w1 warning cont.: %s", wmsgtxt));
143 "(Warning %d, cont.): %s at %s\n",
144 nr, wmsgtxt, position());