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 &amp; SHOW_UTIL_TRACE)
2.69      frystyk   129: #define APP_TRACE      (WWWTRACE &amp; SHOW_APP_TRACE)
                    130: #define CACHE_TRACE    (WWWTRACE &amp; SHOW_CACHE_TRACE)
                    131: #define SGML_TRACE     (WWWTRACE &amp; SHOW_SGML_TRACE)
                    132: #define BIND_TRACE     (WWWTRACE &amp; SHOW_BIND_TRACE)
                    133: #define THD_TRACE      (WWWTRACE &amp; SHOW_THREAD_TRACE)
                    134: #define STREAM_TRACE   (WWWTRACE &amp; SHOW_STREAM_TRACE)
                    135: #define PROT_TRACE     (WWWTRACE &amp; SHOW_PROTOCOL_TRACE)
                    136: #define MEM_TRACE      (WWWTRACE &amp; SHOW_MEM_TRACE)
                    137: #define URI_TRACE      (WWWTRACE &amp; SHOW_URI_TRACE)
                    138: #define AUTH_TRACE     (WWWTRACE &amp; SHOW_AUTH_TRACE)
                    139: #define ANCH_TRACE     (WWWTRACE &amp; SHOW_ANCHOR_TRACE)
                    140: #define PICS_TRACE     (WWWTRACE &amp; SHOW_PICS_TRACE)
                    141: #define CORE_TRACE     (WWWTRACE &amp; SHOW_CORE_TRACE)
2.76      frystyk   142: #define MUX_TRACE      (WWWTRACE &amp; SHOW_MUX_TRACE)
2.84      frystyk   143: #define SQL_TRACE      (WWWTRACE &amp; SHOW_SQL_TRACE)
2.90      frystyk   144: #define XML_TRACE      (WWWTRACE &amp; SHOW_XML_TRACE)
2.94    ! kirschpi  145: #define ALL_TRACE      (WWWTRACE &amp; 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) &lt;= (b) ? (a) : (b))
2.69      frystyk   238: #define HTMAX(a,b) ((a) &gt;= (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) &lt; 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 (&gt;=0) and failure are (&lt;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