File:  [Public] / libwww / Library / src / HTUtils.html
Revision 2.51.2.1: download - view: text, annotated - select for diffs
Tue Jan 23 20:07:59 1996 UTC (28 years, 4 months ago) by frystyk
Branches: v4/0B
CVS tags: v4/0C
4.0C

<HTML>
<HEAD>
<TITLE>Utility macros</TITLE>
<!-- Changed by: Henrik Frystyk Nielsen, 20-Jan-1996 -->
</HEAD>
<BODY>

<H1>Macros for general use</H1>

<PRE>
/*
**	(c) COPYRIGHT MIT 1995.
**	Please first read the full copyright statement in the file COPYRIGH.
*/
</PRE>

This module is a part of the <A
HREF="http://www.w3.org/pub/WWW/Library/"> W3C Reference Library</A>.

See also the system dependent file <A HREF="tcp.html">tcp module</A>
for system specific information. <P>

<PRE>
#ifndef HTUTILS_H
#define HTUTILS_H

#if defined(__STDC__) || defined(__cplusplus) || defined(WWW_MSWINDOWS)
#define _STANDARD_CODE_
#endif
</PRE>

<A NAME="debug"><H2>Debug message control</H2></A>

This is the global flag for setting the WWWTRACE options.

<PRE>
#ifndef DEBUG
#define DEBUG	/* No one ever turns this off as trace is too important */
#endif		/* Keep option for really small memory applications too */

#ifdef WWW_WIN_DLL
extern int * WWW_TraceFlag;		     /* Global flag for all W3 trace */
#else
extern int WWW_TraceFlag;		     /* Global flag for all W3 trace */
#endif

</PRE>

The verbose mode is no longer a simple boolean but a bit field so that
it is possible to see parts of the output messages. The
<EM>WWWTRACE</EM> define still outputs all messages if verbose mode is
active, but in addition the following WWWTRACE defines have been made:

<PRE>
#define WWWTRACE_FILE	1
#define WWWTRACE_STDERR	2
#define WWWTRACE_TTY	3

#ifndef WWWTRACE_MODE
#ifdef WWW_WIN_WINDOW
#define WWWTRACE_MODE WWWTRACE_TTY
#else
#define WWWTRACE_MODE WWWTRACE_STDERR
#endif
#endif

#if WWWTRACE_MODE == WWWTRACE_FILE
extern FILE *WWWTrace;
#ifndef HT_TRACE_FILE
#define HT_TRACE_FILE	"WWWTRACE.TXT"
#endif
#define TTYPrint fprintf
#define TDEST	 WWWTrace
#endif

#if WWWTRACE_MODE == WWWTRACE_STDERR
#define TTYPrint fprintf
#define TDEST	 stderr
#endif

#if WWWTRACE_MODE == WWWTRACE_TTY
#ifdef WWW_WIN_WINDOW
/* standard windows 3.x and non-console WIN32 programs */
#define TDEST    0
#ifdef WWW_WIN_DLL
typedef int TTYPrint_t(unsigned int target, const char* fmt, ...);
extern TTYPrint_t** PTTYPrint;
#define TTYPrint (**PTTYPrint)
#else
int TTYPrint(unsigned int target, const char* fmt, ...);
#endif
#else
/* if there is a real console, us it */
#define TDEST    stderr
int TTYPrint(FILE* target, const char* fmt, ...);
#endif
#endif

typedef enum _HTTraceFlags {
    SHOW_UTIL_TRACE	= 0x1,				/* 	           1 */
    SHOW_APP_TRACE	= 0x2,				/* 	          10 */
    SHOW_CACHE_TRACE	= 0x4,				/*		 100 */
    SHOW_SGML_TRACE	= 0x8,				/*		1000 */
    SHOW_BIND_TRACE	= 0x10,				/* 	      1.0000 */
    SHOW_THREAD_TRACE	= 0x20,				/* 	     10.0000 */
    SHOW_STREAM_TRACE	= 0x40,				/* 	    100.0000 */
    SHOW_PROTOCOL_TRACE = 0x80,				/* 	   1000.0000 */
    SHOW_URI_TRACE	= 0x200,			/* 	10.0000.0000 */
    SHOW_ANCHOR_TRACE	= 0x800,			/*   10.00.0000.0000 */
    SHOW_ALL_TRACE	= 0xFFF				/*   11.11.1111.1111 */
} HTTraceFlags;
</PRE>

The flags are made so that they can serve as a group flag for correlated
trace messages, e.g. showing messages for SGML and HTML at the same time. 

<PRE>
#ifdef DEBUG
#ifdef WWW_WIN_DLL
#define WWWTRACE	(*WWW_TraceFlag)
#define UTIL_TRACE	(*WWW_TraceFlag & SHOW_UTIL_TRACE)
#define APP_TRACE	(*WWW_TraceFlag & SHOW_APP_TRACE)
#define CACHE_TRACE	(*WWW_TraceFlag & SHOW_CACHE_TRACE)
#define SGML_TRACE	(*WWW_TraceFlag & SHOW_SGML_TRACE)
#define BIND_TRACE	(*WWW_TraceFlag & SHOW_BIND_TRACE)
#define THD_TRACE	(*WWW_TraceFlag & SHOW_THREAD_TRACE)
#define STREAM_TRACE	(*WWW_TraceFlag & SHOW_STREAM_TRACE)
#define PROT_TRACE	(*WWW_TraceFlag & SHOW_PROTOCOL_TRACE)
#define URI_TRACE	(*WWW_TraceFlag & SHOW_URI_TRACE)
#define ANCH_TRACE	(*WWW_TraceFlag & SHOW_ANCHOR_TRACE)
#else
#define WWWTRACE	(WWW_TraceFlag)
#define UTIL_TRACE	(WWW_TraceFlag & SHOW_UTIL_TRACE)
#define APP_TRACE	(WWW_TraceFlag & SHOW_APP_TRACE)
#define CACHE_TRACE	(WWW_TraceFlag & SHOW_CACHE_TRACE)
#define SGML_TRACE	(WWW_TraceFlag & SHOW_SGML_TRACE)
#define BIND_TRACE	(WWW_TraceFlag & SHOW_BIND_TRACE)
#define THD_TRACE	(WWW_TraceFlag & SHOW_THREAD_TRACE)
#define STREAM_TRACE	(WWW_TraceFlag & SHOW_STREAM_TRACE)
#define PROT_TRACE	(WWW_TraceFlag & SHOW_PROTOCOL_TRACE)
#define URI_TRACE	(WWW_TraceFlag & SHOW_URI_TRACE)
#define ANCH_TRACE	(WWW_TraceFlag & SHOW_ANCHOR_TRACE)
#endif
#else
#define WWWTRACE	0
#define UTIL_TRACE	0
#define APP_TRACE	0
#define CACHE_TRACE	0
#define SGML_TRACE	0
#define BIND_TRACE	0
#define THD_TRACE	0
#define STREAM_TRACE	0
#define PROT_TRACE	0
#define URI_TRACE	0
#define ANCH_TRACE	0
#endif
</PRE>

<H2>Standard C library for malloc() etc</H2>

Replace memory allocation and free C RTL functions with VAXC$xxx_OPT
altrenatives for VAXC (but not DECC) on VMS. This makes a big
performance difference. (Foteos Macrides).

<PRE>
#ifdef vax
#ifdef unix
#define ultrix	/* Assume vax+unix=ultrix */
#endif
#endif

#ifndef VMS
#ifndef ultrix
#ifdef NeXT
#include &lt;libc.h&gt;	/* NeXT */
#endif

#ifndef Mips
#ifndef MACH /* Vincent.Cate@furmint.nectar.cs.cmu.edu */
#include &lt;stdlib.h&gt;	/* ANSI */
#endif
#endif

#else /* ultrix */
#include &lt;malloc.h&gt;
#include &lt;memory.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;   /* ANSI */   /* BSN */
#endif

#else	/* VMS */
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unixlib.h&gt;
#include &lt;ctype.h&gt;
#if defined(VAXC) && !defined(__DECC)
#define malloc	VAXC$MALLOC_OPT
#define calloc	VAXC$CALLOC_OPT
#define free	VAXC$FREE_OPT
#define cfree	VAXC$CFREE_OPT
#define realloc	VAXC$REALLOC_OPT
#endif /* VAXC but not DECC */
#define unlink remove
#define gmtime localtime
#include &lt;stat.h&gt;
#define S_ISDIR(m)      (((m)&S_IFMT) == S_IFDIR)
#define S_ISREG(m)      (((m)&S_IFMT) == S_IFREG)
#define putenv HTVMS_putenv
#endif
</PRE>

<H3>Safe Cleaning Memory</H3>

<PRE>
#define FREE(x)	if (x) {free(x); x=NULL;}
</PRE>

<A NAME="declaration"><H2>Macros for declarations</H2></A>

<PRE>
#define PUBLIC			/* Accessible outside this module     */
#define PRIVATE static		/* Accessible only within this module */

#ifdef _STANDARD_CODE_

#if defined(sco) && !defined(_SCO_DS)
#define CONST		  /* The pre SCO 5.0 CC compiler does not know const */
#else
#define CONST const			      /* "const" only exists in STDC */
#endif

#else

#define CONST

#endif /* _STANDARD_CODE_ (ANSI) */

#ifndef NULL
#define NULL ((void *)0)
#endif
</PRE>

<H2>Booleans</H2>

<PRE>
#ifndef BOOLEAN_DEFINED
typedef char	BOOLEAN;				    /* Logical value */
#endif

#ifndef CURSES
#ifndef TRUE
#define TRUE	(BOOLEAN)1
#define	FALSE	(BOOLEAN)0
#endif
#endif	 /*  CURSES  */

#ifndef BOOL
#define BOOL BOOLEAN
#endif
#ifndef YES
#define YES             (BOOL)1
#define NO              (BOOL)0
#endif

#ifndef HTMIN 
#define HTMIN(a,b) ((a) &lt;= (b) ? (a) : (b))
#define HTMAX(a,b) ((a) >= (b) ? (a) : (b))
#endif
</PRE>

<A NAME="ReturnCodes"><H2>Return Codes for Protocol Modules and Streams</H2></A>

Theese are the codes returned from the protocol modules, and the
stream modules. Success are (&gt;=0) and failure are (&lt;0)

<PRE>
#define HT_OK			0	/* Generic success */
#define HT_ALL			1	/* Used by Net Manager */

#define HT_PERSISTENT		29993	/* Wait for persistent connection */
#define HT_IGNORE		29994	/* Ignore this in the Net manager */
#define HT_NO_DATA		29995	/* OK but no data was loaded */
#define HT_PERM_REDIRECT	29997	/* Redo the retrieve with a new URL */
#define HT_TEMP_REDIRECT	29998	/* Redo the retrieve with a new URL */
#define HT_LOADED		29999	/* Instead of a socket */

#define HT_ERROR		-1	/* Generic failure */
#define HT_NO_ACCESS		-10	/* Access not available */
#define HT_FORBIDDEN		-11	/* Access forbidden */
#define HT_INTERNAL		-12	/* Weird -- should never happen. */

#define HT_RETRY		-29996	/* If service isn't available */
#define HT_WOULD_BLOCK		-29997  /* If we are in a select */
#define HT_INTERRUPTED 		-29998	/* Note the negative value! */
</PRE>

The following codes are positive values that will be parsed back
through streams. This can be used to introduce stream specific return
values

<PRE>
#define HT_RELOAD		29996	/* If we must reload the document */
</PRE>

<H2>Other stuff</H2>

<PRE>
#ifdef _STANDARD_CODE_
#include &lt;stdarg.h&gt;
#else
#include &lt;varargs.h&gt;
#endif
</PRE>

<H2>Out Of Memory checking for malloc() return:</H2>

<PRE>
#ifndef __FILE__
#define __FILE__ ""
#define __LINE__ ""
#endif

#define outofmem(file, func) \
 { fprintf(TDEST, "%s %s: out of memory.\nProgram aborted.\n", file, func); \
  exit(1);}

</PRE>

<H2>Upper- and Lowercase macros</H2>

The problem here is that toupper(x) is not defined officially unless
isupper(x) is.  These macros are CERTAINLY needed on #if defined(pyr)
|| define(mips) or BDSI platforms. For safefy, we make them mandatory.

<PRE>
#include &lt;ctype.h&gt;

#ifndef TOLOWER
#define TOLOWER(c) tolower(c)
#define TOUPPER(c) toupper(c)
#endif
</PRE>

<H2>Max and Min values for Integers and Floating Point</H2>

<PRE>
#ifdef FLT_EPSILON				    /* The ANSI C way define */
#define HT_EPSILON FLT_EPSILON
#else
#define HT_EPSILON 0.00000001
#endif
</PRE>

<H2>White Characters</H2>

Is character <B>c</B> white space?

<PRE>
#ifdef OLD_CODE
#define WHITE(c) (((unsigned char)(TOASCII(c))) &lt;= 32)
#else
#define WHITE(c) isspace(c)
#endif
</PRE>

<H2>The local equivalents of CR and LF</H2>

We can check for these after net ascii text has been converted to the
local representation. Similarly, we include them in strings to be sent
as net ascii after translation.

<PRE>
#define LF   FROMASCII('\012')  /* ASCII line feed LOCAL EQUIVALENT */
#define CR   FROMASCII('\015')  /* Will be converted to ^M for transmission */

#endif /* HTUTILS_H */
</PRE>

end of utilities
</BODY>
</HTML>

Webmaster