1/* Copyright 2009, UCAR/Unidata and OPeNDAP, Inc.
2   See the COPYRIGHT file for more information. */
3
4#ifndef OCOCDBG_H
5#define OCOCDBG_H
6
7#ifndef OCDEBUG
8#undef OCDEBUG
9#endif
10
11#include "config.h"
12
13#ifdef HAVE_STDARG_H
14#include <stdarg.h>
15#endif
16
17#include <curl/curl.h>
18
19#include "oc.h"
20#include "ocinternal.h"
21
22
23/* OCCATCHERROR is used to detect errors as close
24   to their point of origin as possible. When
25   enabled, one can set a breakpoint in ocbreakpoint()
26   to catch the failure. Turing it on incurs a significant
27   performance penalty, so it is off by default.*/
28
29#define OCCATCHERROR
30
31#define OCPANIC(msg) assert(ocpanic(msg))
32#define OCPANIC1(msg,arg) assert(ocpanic(msg,arg))
33#define OCPANIC2(msg,arg1,arg2) assert(ocpanic(msg,arg1,arg2))
34
35/* Make it possible to catch assertion failures by breakpointing ocpanic*/
36#define OCASSERT(expr) if(!(expr)) {OCPANIC((#expr));} else {}
37
38/* Need some syntactic trickery to make these macros work*/
39#ifdef OCDEBUG
40#define OCDBG(msg) {oclog(OCLOGDBG,msg);}
41#define OCDBG1(msg,arg) {oclog(OCLOGDBG,msg,arg);}
42#define OCDBG2(msg,arg1,arg2) {oclog(OCLOGDBG,msg,arg1,arg2);}
43#define OCDBGTEXT(text) {oclogtext(OCLOGNOTE,text);} else {}
44#define OCDBGCODE(code) {code;}
45
46#else
47#define OCDBG(msg)
48#define OCDBG1(msg,arg)
49#define OCDBG2(msg,arg1,arg2)
50#define OCDBGTEXT(text)
51#define OCDBGCODE(code)
52#endif
53
54
55/*
56OCPROGRESS attempts to provide some info
57about how IO is getting along.
58*/
59#undef OCPROGRESS
60
61extern int ocdebug;
62extern int cedebug;
63
64/*extern char* dent2(int n);*/
65/*/extern char* dent(int n);*/
66extern int ocpanic(const char* fmt, ...);
67
68extern int xdrerror(void);
69
70/*
71Provide wrapped versions of calloc and malloc.
72The wrapped version panics if memory
73is exhausted.  It also guarantees that the
74memory has been zero'd.
75*/
76
77extern void* occalloc(size_t size, size_t nelems);
78extern void* ocmalloc(size_t size);
79extern void  ocfree(void*);
80
81#define MEMCHECK(var,throw) {if((var)==NULL) return (throw);}
82#define MEMFAIL(varMEMCHECK(var,OCCATCH(OC_ENOMEM))
83#define MEMGOTO(var,stat,label) {if((var)==NULL) {stat=OC_ENOMEM;goto label;}}
84
85#ifdef OCCATCHERROR
86extern OCerror ocbreakpoint(OCerror err);
87extern OCerror occatch(OCerror err);
88extern CURLcode ocreportcurlerror(struct OCstatestateCURLcode cstat);
89/* Place breakpoint on ocbreakpoint to catch errors close to where they occur*/
90#define OCCATCH(eoccatch(e)
91#define OCCATCHCHK(e) (void)occatch(e)
92#define OCGOTO(label) {ocbreakpoint(-1); goto label;}
93#define OCCURLERR(s,eocreportcurlerror(s,e)
94#define CURLERR(eocreportcurlerror(NULL,e)
95#else
96#define OCCATCH(e) (e)
97#define OCCATCHCHK(e)
98#define OCGOTO(label) goto label
99#define CURLERR(s,e) (e)
100#define OCCURLERR(s,e) (e)
101#define CURLERR(e) (e)
102#endif
103#define OCTHROW(eOCCATCH(e)
104#define OCTHROWCHK(eOCCATCHCHK(e)
105
106#endif /*OCOCDBG_H*/
107


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed