Annotation of libwww/Library/src/HTUtils.html, revision 2.94
2.94 ! kirschpi 1: <HTML>
! 2: <HEAD>
! 3: <TITLE>W3C Sample Code Library libwww Debug Information and General Purpose
! 4: Macros</TITLE>
! 5: </HEAD>
! 6: <BODY>
! 7: <H1>
! 8: Debug Information and General Purpose Macros
! 9: </H1>
! 10: <PRE>
! 11: /*
2.31 frystyk 12: ** (c) COPYRIGHT MIT 1995.
2.24 frystyk 13: ** Please first read the full copyright statement in the file COPYRIGH.
2.94 ! kirschpi 14: */
! 15: </PRE>
! 16: <P>
! 17: This module is a part of the <A HREF="http://www.w3.org/Library/"> W3C Sample
! 18: Code Library</A>. See also the system dependent file
! 19: <A HREF="wwwsys.html">sysdep module</A> for system specific information.
! 20: <PRE>
! 21: #ifndef HTUTILS_H
! 22: #define HTUTILS_H
! 23: </PRE>
! 24: <H2>
! 25: Destination for User Print Messages
! 26: </H2>
! 27: <P>
! 28: You can send print messages to the user to various destinations
! 29: depending on the type of your application. By default, on Unix the
! 30: messages are sent to <CODE>stdout</CODE> using
! 31: <CODE>fprintf</CODE>. If we are on MSWindows and have a windows
! 32: applications then register a <CODE>HTPrintCallback</CODE>
! 33: function. This is done with <CODE>HTPrint_setCallback</CODE>. It tells
! 34: <CODE>HTPrint</CODE> to call a <CODE>HTPrintCallback</CODE>. If
! 35: <CODE>HTDEBUG</CODE>
! 36: is not defined then don't do any of the above.
! 37: <PRE>
! 38: typedef int HTPrintCallback(const char * fmt, va_list pArgs);
2.90 frystyk 39: extern void HTPrint_setCallback(HTPrintCallback * pCall);
40: extern HTPrintCallback * HTPrint_getCallback(void);
41:
2.94 ! kirschpi 42: extern int HTPrint(const char * fmt, ...);
! 43: </PRE>
! 44: <H2>
! 45: <A NAME="Debug">Debug Message Control</A>
! 46: </H2>
! 47: <P>
! 48: This is the global flag for setting the <CODE><EM>WWWTRACE</EM></CODE> options.
! 49: The verbose mode is no longer a simple boolean but a bit field so that it
! 50: is possible to see parts of the output messages.
! 51: <PRE>
! 52: #if defined(NODEBUG) || defined(NDEBUG) || defined(_NDEBUG)
2.90 frystyk 53: #undef HTDEBUG
54: #else
55: #ifndef HTDEBUG
56: #define HTDEBUG 1
57: #endif /* HTDEBUG */
2.94 ! kirschpi 58: #endif
! 59: </PRE>
! 60: <H3>
! 61: C Preprocessor defines
! 62: </H3>
! 63: <P>
! 64: Make sure that the following macros are defined
! 65: <PRE>
! 66: #ifndef __FILE__
2.90 frystyk 67: #define __FILE__ ""
68: #endif
2.81 frystyk 69:
2.90 frystyk 70: #ifndef __LINE__
71: #define __LINE__ 0L
2.94 ! kirschpi 72: #endif
! 73: </PRE>
! 74: <H3>
! 75: Definition of the Global Trace Flag
! 76: </H3>
! 77: <P>
! 78: The global trace flag variable is available everywhere.
! 79: <PRE>
! 80: #ifdef HTDEBUG
2.44 frystyk 81: #ifdef WWW_WIN_DLL
2.56 frystyk 82: extern int * WWW_TraceFlag; /* In DLLs, we need the indirection */
83: #define WWWTRACE (*WWW_TraceFlag)
2.44 frystyk 84: #else
2.85 frystyk 85: extern unsigned int WWW_TraceFlag; /* Global flag for all W3 trace */
2.56 frystyk 86: #define WWWTRACE (WWW_TraceFlag)
87: #endif /* WWW_WIN_DLL */
88: #else
89: #define WWWTRACE 0
2.94 ! kirschpi 90: #endif /* HTDEBUG */
! 91: </PRE>
! 92: <H3>
! 93: Select which Trace Messages to show
! 94: </H3>
! 95: <P>
! 96: Libwww has a huge set of trace messages and it is therefor a good idea to
! 97: be able to select which ones to see for any particular trace. An easy way
! 98: to set this is using the funtion
! 99: <A HREF="HTHome.html#Trace">HTSetTraceMessageMask</A>. The <EM>WWWTRACE</EM>
2.90 frystyk 100: define outputs messages if verbose mode is active according to the following
2.94 ! kirschpi 101: rules:
! 102: <PRE>
! 103: typedef enum _HTTraceFlags {
2.76 frystyk 104: SHOW_UTIL_TRACE = 0x1,
105: SHOW_APP_TRACE = 0x2,
106: SHOW_CACHE_TRACE = 0x4,
107: SHOW_SGML_TRACE = 0x8,
108: SHOW_BIND_TRACE = 0x10,
109: SHOW_THREAD_TRACE = 0x20,
110: SHOW_STREAM_TRACE = 0x40,
111: SHOW_PROTOCOL_TRACE = 0x80,
112: SHOW_MEM_TRACE = 0x100,
113: SHOW_URI_TRACE = 0x200,
114: SHOW_AUTH_TRACE = 0x400,
115: SHOW_ANCHOR_TRACE = 0x800,
116: SHOW_PICS_TRACE = 0x1000,
117: SHOW_CORE_TRACE = 0x2000,
118: SHOW_MUX_TRACE = 0x4000,
2.84 frystyk 119: SHOW_SQL_TRACE = 0x8000,
2.90 frystyk 120: SHOW_XML_TRACE = 0x10000,
2.92 kahan 121: SHOW_ALL_TRACE = (int) 0xFFFFFFFF
2.94 ! kirschpi 122: } HTTraceFlags;
! 123: </PRE>
! 124: <P>
! 125: The flags are made so that they can serve as a group flag for correlated
! 126: trace messages, e.g. showing messages for SGML and HTML at the same time.
! 127: <PRE>
! 128: #define UTIL_TRACE (WWWTRACE & SHOW_UTIL_TRACE)
2.69 frystyk 129: #define APP_TRACE (WWWTRACE & SHOW_APP_TRACE)
130: #define CACHE_TRACE (WWWTRACE & SHOW_CACHE_TRACE)
131: #define SGML_TRACE (WWWTRACE & SHOW_SGML_TRACE)
132: #define BIND_TRACE (WWWTRACE & SHOW_BIND_TRACE)
133: #define THD_TRACE (WWWTRACE & SHOW_THREAD_TRACE)
134: #define STREAM_TRACE (WWWTRACE & SHOW_STREAM_TRACE)
135: #define PROT_TRACE (WWWTRACE & SHOW_PROTOCOL_TRACE)
136: #define MEM_TRACE (WWWTRACE & SHOW_MEM_TRACE)
137: #define URI_TRACE (WWWTRACE & SHOW_URI_TRACE)
138: #define AUTH_TRACE (WWWTRACE & SHOW_AUTH_TRACE)
139: #define ANCH_TRACE (WWWTRACE & SHOW_ANCHOR_TRACE)
140: #define PICS_TRACE (WWWTRACE & SHOW_PICS_TRACE)
141: #define CORE_TRACE (WWWTRACE & SHOW_CORE_TRACE)
2.76 frystyk 142: #define MUX_TRACE (WWWTRACE & SHOW_MUX_TRACE)
2.84 frystyk 143: #define SQL_TRACE (WWWTRACE & SHOW_SQL_TRACE)
2.90 frystyk 144: #define XML_TRACE (WWWTRACE & SHOW_XML_TRACE)
2.94 ! kirschpi 145: #define ALL_TRACE (WWWTRACE & SHOW_ALL_TRACE)
! 146: </PRE>
! 147: <H3>
! 148: Destination for Trace Messages
! 149: </H3>
! 150: <P>
! 151: You can send trace messages to various destinations depending on the type
2.90 frystyk 152: of your application. By default, on Unix the messages are sent to
2.94 ! kirschpi 153: <CODE>stderr</CODE> using <CODE>fprintf</CODE>. If we are on MSWindows and
! 154: have a windows applications then register a <CODE>HTTraceCallback</CODE>
! 155: function. This is done with <CODE>HTTrace_setCallback</CODE>. It tells
! 156: <CODE>HTTrace</CODE> to call a <CODE>HTTraceCallback</CODE>. If
! 157: <CODE>HTDEBUG</CODE> is not defined then don't do any of the above.
! 158: <PRE>
! 159: typedef int HTTraceCallback(const char * fmt, va_list pArgs);
2.59 frystyk 160: extern void HTTrace_setCallback(HTTraceCallback * pCall);
2.94 ! kirschpi 161: extern HTTraceCallback * HTTrace_getCallback(void);
! 162: </PRE>
! 163: <P>
! 164: The <CODE>HTTRACE</CODE> macro uses "<CODE>_</CODE>" as parameter separater
! 165: instead of "<CODE>,</CODE>". This enables us to use a single macro instead
! 166: of a macro for each number of arguments which we consider a more elegant
! 167: and flexible solution. The implication is, however, that we can't have variables
! 168: that start or end with an "<CODE>_</CODE>" if they are to be used in a trace
! 169: message.
! 170: <PRE>
! 171: #ifdef HTDEBUG
2.91 frystyk 172: #undef _
2.90 frystyk 173: #define _ ,
174: #define HTTRACE(TYPE, FMT) \
175: do { if (TYPE) HTTrace(FMT); } while (0);
2.62 frystyk 176: extern int HTTrace(const char * fmt, ...);
2.90 frystyk 177: #else
178: #define HTTRACE(TYPE, FMT) /* empty */
2.94 ! kirschpi 179: #endif /* HTDEBUG */
! 180: </PRE>
! 181: <H3>
! 182: Data Trace Logging
! 183: </H3>
! 184: <P>
! 185: A similar mechanism exists for logging data, except that is adds a data and
! 186: length argument to the trace call. Again, you can register your own callbacks
! 187: if need be.
! 188: <PRE>
! 189: typedef int HTTraceDataCallback(char * data, size_t len, char * fmt, va_list pArgs);
2.76 frystyk 190: extern void HTTraceData_setCallback(HTTraceDataCallback * pCall);
2.94 ! kirschpi 191: extern HTTraceDataCallback * HTTraceData_getCallback(void);
! 192: </PRE>
! 193: <P>
! 194: Again we use the same macro expansion mechanism as for <CODE>HTTrace</CODE>
! 195: <PRE>
! 196: #ifdef HTDEBUG
2.90 frystyk 197: #define HTTRACEDATA(DATA, LEN, FMT) HTTraceData((DATA), (LEN), FMT)
2.77 eric 198: extern int HTTraceData(char * data, size_t len, char * fmt, ...);
2.90 frystyk 199: #else
200: #define HTTRACEDATA(DATA, LEN, FMT) /* empty */
2.94 ! kirschpi 201: #endif /* HTDEBUG */
! 202: </PRE>
! 203: <H3>
! 204: Debug Breaks
! 205: </H3>
! 206: <P>
! 207: Call this function and the program halts. We use the same macro expansion
! 208: mechanism as for <CODE>HTTrace</CODE>
! 209: <PRE>
! 210: extern void HTDebugBreak(char * file, unsigned long line, const char * fmt, ...);
2.90 frystyk 211:
212: #ifdef HTDEBUG
213: #define HTDEBUGBREAK(FMT) HTDebugBreak(__FILE__, __LINE__, FMT)
214: #else
215: #define HTDEBUGBREAK(FMT) /* empty */
2.94 ! kirschpi 216: #endif /* HTDEBUG */
! 217: </PRE>
! 218: <H2>
! 219: Macros for Function Declarations
! 220: </H2>
! 221: <P>
! 222: These function prefixes are used by scripts and other tools and helps figuring
! 223: out which functions are exported and which are not. See also the
! 224: <A HREF="../User/Style/Macros.html">libwww style guide</A>.
! 225: <PRE>
! 226: #define PUBLIC /* Accessible outside this module */
! 227: #define PRIVATE static /* Accessible only within this module */
! 228: </PRE>
! 229: <H2>
! 230: Often used Interger Macros
! 231: </H2>
! 232: <H3>
! 233: Min and Max functions
! 234: </H3>
! 235: <PRE>
! 236: #ifndef HTMIN
2.11 timbl 237: #define HTMIN(a,b) ((a) <= (b) ? (a) : (b))
2.69 frystyk 238: #define HTMAX(a,b) ((a) >= (b) ? (a) : (b))
2.94 ! kirschpi 239: #endif
! 240: </PRE>
! 241: <H3>
! 242: Double abs function
! 243: </H3>
! 244: <PRE>
! 245: #ifndef HTDABS
2.56 frystyk 246: #define HTDABS(a) ((a) < 0.0 ? (-(a)) : (a))
2.94 ! kirschpi 247: #endif
! 248: </PRE>
! 249: <P>
! 250: <A NAME="ReturnCodes"></A>
! 251: <H2>
! 252: <A NAME="return">Return Codes for Protocol Modules and Streams</A>
! 253: </H2>
! 254: <P>
! 255: Theese are the codes returned from the protocol modules, and the stream modules.
! 256: Success are (>=0) and failure are (<0)
! 257: <PRE>
! 258: #define HT_OK 0 /* Generic success */
2.37 frystyk 259: #define HT_ALL 1 /* Used by Net Manager */
260:
2.75 frystyk 261: #define HT_CONTINUE 100 /* Continue an operation */
262: #define HT_UPGRADE 101 /* Switching protocols */
263:
264: #define HT_LOADED 200 /* Everything's OK */
265: #define HT_CREATED 201 /* New object is created */
266: #define HT_ACCEPTED 202 /* Accepted */
267: #define HT_NO_DATA 204 /* OK but no data was loaded */
268: #define HT_RESET_CONTENT 205 /* Reset content */
269: #define HT_PARTIAL_CONTENT 206 /* Partial Content */
270:
271: #define HT_MULTIPLE_CHOICES 300 /* Multiple choices */
272: #define HT_PERM_REDIRECT 301 /* Permanent redirection */
2.79 frystyk 273: #define HT_FOUND 302 /* Found */
2.75 frystyk 274: #define HT_SEE_OTHER 303 /* See other */
275: #define HT_NOT_MODIFIED 304 /* Not Modified */
276: #define HT_USE_PROXY 305 /* Use Proxy */
2.79 frystyk 277: #define HT_PROXY_REDIRECT 306 /* Proxy Redirect */
278: #define HT_TEMP_REDIRECT 307 /* Temporary redirect */
2.75 frystyk 279:
280: #define HT_IGNORE 900 /* Ignore this in the Net manager */
281: #define HT_CLOSED 901 /* The socket was closed */
282: #define HT_PENDING 902 /* Wait for connection */
283: #define HT_RELOAD 903 /* If we must reload the document */
2.23 frystyk 284:
285: #define HT_ERROR -1 /* Generic failure */
2.53 frystyk 286:
2.75 frystyk 287: #define HT_NO_ACCESS -401 /* Unauthorized */
288: #define HT_FORBIDDEN -403 /* Access forbidden */
2.87 frystyk 289: #define HT_NOT_FOUND -404 /* Not found */
2.75 frystyk 290: #define HT_NOT_ACCEPTABLE -406 /* Not Acceptable */
291: #define HT_NO_PROXY_ACCESS -407 /* Proxy Authentication Failed */
292: #define HT_CONFLICT -409 /* Conflict */
293: #define HT_LENGTH_REQUIRED -411 /* Length required */
2.79 frystyk 294: #define HT_PRECONDITION_FAILED -412 /* Precondition failed */
295: #define HT_TOO_BIG -413 /* Request entity too large */
296: #define HT_URI_TOO_BIG -414 /* Request-URI too long */
297: #define HT_UNSUPPORTED -415 /* Unsupported */
298: #define HT_BAD_RANGE -416 /* Request Range not satisfiable */
299: #define HT_EXPECTATION_FAILED -417 /* Expectation Failed */
300: #define HT_REAUTH -418 /* Reauthentication required */
301: #define HT_PROXY_REAUTH -419 /* Proxy Reauthentication required */
2.75 frystyk 302:
303: #define HT_RETRY -503 /* If service isn't available */
304: #define HT_BAD_VERSION -505 /* Bad protocol version */
305:
2.93 kirschpi 306: #ifdef HT_DAV /* WebDAV Status codes */
2.94 ! kirschpi 307: #define HT_PROCESSING 102 /* Processing */
! 308: #define HT_MULTI_STATUS 207 /* Multi-Status */
! 309: #define HT_UNPROCESSABLE -422 /* Unprocessable Entity */
! 310: #define HT_LOCKED -423 /* Locked */
! 311: #define HT_FAILED_DEPENDENCY -424 /* Failed Dependency */
! 312: #define HT_INSUFFICIENT_STORAGE -507 /* Insufficient Storage */
2.93 kirschpi 313: #endif
314:
2.75 frystyk 315: #define HT_INTERNAL -900 /* Weird -- should never happen. */
316: #define HT_WOULD_BLOCK -901 /* If we are in a select */
317: #define HT_INTERRUPTED -902 /* Note the negative value! */
318: #define HT_PAUSE -903 /* If we want to pause a stream */
319: #define HT_RECOVER_PIPE -904 /* Recover pipe line */
2.86 frystyk 320: #define HT_TIMEOUT -905 /* Connection timeout */
2.94 ! kirschpi 321: #define HT_NO_HOST -906 /* Can't locate host */
! 322: </PRE>
! 323: <H2>
! 324: Upper- and Lowercase macros
! 325: </H2>
! 326: <P>
! 327: The problem here is that toupper(x) is not defined officially unless isupper(x)
! 328: is. These macros are CERTAINLY needed on #if defined(pyr) || define(mips)
! 329: or BDSI platforms. For safefy, we make them mandatory.
! 330: <PRE>
! 331: #ifndef TOLOWER
2.89 frystyk 332: #define TOLOWER(c) tolower((int) (c))
333: #define TOUPPER(c) toupper((int) (c))
2.94 ! kirschpi 334: #endif
! 335: </PRE>
! 336: <H2>
! 337: Max and Min values for Integers and Floating Point
! 338: </H2>
! 339: <PRE>
! 340: #ifdef FLT_EPSILON /* The ANSI C way define */
2.29 frystyk 341: #define HT_EPSILON FLT_EPSILON
342: #else
343: #define HT_EPSILON 0.00000001
2.94 ! kirschpi 344: #endif
! 345: </PRE>
! 346: <H2>
! 347: The local equivalents of CR and LF
! 348: </H2>
! 349: <P>
! 350: We can check for these after net ascii text has been converted to the local
! 351: representation. Similarly, we include them in strings to be sent as net ascii
! 352: after translation.
! 353: <PRE>
! 354: #define LF FROMASCII('\012') /* ASCII line feed LOCAL EQUIVALENT */
! 355: #define CR FROMASCII('\015') /* Will be converted to ^M for transmission */
! 356: </PRE>
! 357: <H2>
! 358: Library Dynamic Memory Magement
! 359: </H2>
! 360: <P>
! 361: The Library has it's own dynamic memory API which is declared in
! 362: <A HREF="HTMemory.html">memory management module</A>.
! 363: <PRE>
! 364: #include "HTMemory.h"
! 365: </PRE>
! 366: <PRE>
! 367: #endif /* HT_UTILS.h */
! 368: </PRE>
! 369: <P>
! 370: <HR>
! 371: <ADDRESS>
2.93 kirschpi 372: @(#) $Id: HTUtils.html,v 2.92 2000/01/06 10:48:50 kahan Exp $
2.94 ! kirschpi 373: </ADDRESS>
! 374: </BODY></HTML>
Webmaster