Annotation of libwww/Library/src/HTUtils.html, revision 2.91.2.1

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

Webmaster