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
|
/*<html><pre> -<a href="qh-user_r.htm"
>-------------------------------</a><a name="TOP">-</a>
userprintf_r.c
user redefinable function -- qh_fprintf
see README.txt see COPYING.txt for copyright information.
If you recompile and load this file, then userprintf_r.o will not be loaded
from qhull_r.a or qhull_r.lib
See libqhull_r.h for data structures, macros, and user-callable functions.
See user_r.c for qhull-related, redefinable functions
see user_r.h for user-definable constants
See usermem_r.c for qh_exit(), qh_free(), and qh_malloc()
see Qhull.cpp and RboxPoints.cpp for examples.
qh_printf is a good location for debugging traps, checked on each log line
Please report any errors that you fix to qhull@qhull.org
*/
#include "libqhull_r.h"
#include "poly_r.h" /* for qh.tracefacet */
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
/*-<a href="qh-user_r.htm#TOC"
>-------------------------------</a><a name="qh_fprintf">-</a>
qh_fprintf(qh, fp, msgcode, format, list of args )
print arguments to *fp according to format
Use qh_fprintf_rbox() for rboxlib_r.c
notes:
sets qh.last_errcode if msgcode is error 6000..6999
same as fprintf()
fgets() is not trapped like fprintf()
exit qh_fprintf via qh_errexit()
may be called for errors in qh_initstatistics and qh_meminit
*/
void qh_fprintf(qhT *qh, FILE *fp, int msgcode, const char *fmt, ... ) {
va_list args;
facetT *neighbor, **neighborp;
if (!fp) {
if(!qh){
qh_fprintf_stderr(6241, "qhull internal error (userprintf_r.c): fp and qh not defined for qh_fprintf '%s'\n", fmt);
qh->last_errcode= 6241;
qh_exit(qh_ERRqhull); /* can not use qh_errexit() */
}
/* could use qh->qhmem.ferr, but probably better to be cautious */
qh_fprintf_stderr(6028, "qhull internal error (userprintf_r.c): fp is 0. Wrong qh_fprintf was called.\n");
qh->last_errcode= 6028;
qh_errexit(qh, qh_ERRqhull, NULL, NULL);
}
if ((qh && qh->ANNOTATEoutput) || msgcode < MSG_TRACE4) {
fprintf(fp, "[QH%.4d]", msgcode);
}else if (msgcode >= MSG_ERROR && msgcode < MSG_STDERR ) {
fprintf(fp, "QH%.4d ", msgcode);
}
va_start(args, fmt);
vfprintf(fp, fmt, args);
va_end(args);
if (qh) {
if (msgcode >= MSG_ERROR && msgcode < MSG_WARNING)
qh->last_errcode= msgcode;
/* Place debugging traps here. Use with trace option 'Tn'
Set qh.tracefacet_id, qh.traceridge_id, and/or qh.tracevertex_id in global_r.c
*/
if (False) { /* in production skip test for debugging traps */
if (qh->tracefacet && qh->tracefacet->tested) {
if (qh_setsize(qh, qh->tracefacet->neighbors) < qh->hull_dim)
qh_errexit(qh, qh_ERRdebug, qh->tracefacet, qh->traceridge);
FOREACHneighbor_(qh->tracefacet) {
if (neighbor != qh_DUPLICATEridge && neighbor != qh_MERGEridge && neighbor->visible)
qh_errexit2(qh, qh_ERRdebug, qh->tracefacet, neighbor);
}
}
if (qh->traceridge && qh->traceridge->top->id == 234342223) {
qh_errexit(qh, qh_ERRdebug, qh->tracefacet, qh->traceridge);
}
if (qh->tracevertex && qh_setsize(qh, qh->tracevertex->neighbors)>3434334) {
qh_errexit(qh, qh_ERRdebug, qh->tracefacet, qh->traceridge);
}
}
if (qh->FLUSHprint)
fflush(fp);
}
} /* qh_fprintf */
|