This file: README for XmHTML. ------------------------------------------------------------------------------- | Please read the file LICENSE, | ------------------------------------------------------------------------------- The file DEBUGGING describes how to use and add debugging output to XmHTML. The file BUGS describes a few of the bugs that we know of. The file FIXES contains a list of fixes made so far. The file CHANGES describes the day-to-day development of the widget. The file examples/test-pages/README contains a description of the test documents. Table Of Contents ----------------- 1. Compiling XmHTML using Imake 2. Compiling XmHTML using the provided Makefiles 3. Selecting supported image types 4. Compiling a stand-alone version of the raw HTML parser 5. GIF images and the Unisys LZW patent 5.1 GIF and GZF and XmHTML 6. Things missing in this version 7. LessTif compatibility 8. Adding Warning and Error messages 9. Points To Ponder 10. How to contact us 1. Compiling XmHTML using Imake ------------------------------- Before typing xmkmf (or imake or mxmkmf), you might wish to adjust the imake configuration file XmHTML.cf Things that require your attention are: - Image stuff XmHTML *requires* that you have libXpm and the xpm.h header file installed. If you are using anything below Motif 2.0 (which also includes LessTif), you *must* set XPMINC to the path to the xpm.h include file, and XPMLIB to the path & library for libXpm (pre-Motif 2.0 imake does not include -lXpm automatically). JPEG support If you want it, set JPEGINC to the location of the jpeg include files, and set JPEGLIB to the location of libjpeg. If you don't want it, set IHaveJPEG to NO. PNG support If you want it, set PNGINC to the location of the png include files, and set PNGLIB to the location of libpng. If you don't want it, set IHavePNG to NO. ZLIB support If you want it, set ZLIBINC to the location of the libz include files, and set ZLIBLIB to the location of libz. If you don't want it, set IHaveZLIB to NO. Note: PNG support *requires* zlib support. If you have choosen support for PNG but disabled zlib support, PNG *will* be disabled. You can however disable PNG but enable ZLIB to support the GZF image type (this is an alternate gif format. It's compacter and faster and doesn't require a costly license from Unisys). See also XmHTML.cf - Library targets By default, a normal (static) library is build using the default compiler flags and defines as configured for your system. A shared library is build by default for all systems that support shared libraries. Please notice that building shared libraries is currently *not* supported for SGI Irix (pre 6.2) and Linux a.out, as these require specification files. If you want to build a debug version of the library, you need to set DebugLibXmHTML to YES. If you do this, the examples will be build using this library. - build targets By default, the examples and tools are build when you type make (or make all). You can change this by changing the line that reads SUBDIRS in the toplevel Imakefile. Each target can also be made seperatly: make lib builds libXmHTML; make examples builds everything in the examples directory. Will build libXmHTML first if not already done; make book builds everything in the book directory. Will build libXmHTML first if not already done; make tools builds everything in the tools directory. Doesn't require libXmHTML. - dmalloc If you want to use dmalloc (see the following section), you can uncomment the line with IHaveDmalloc. If dmalloc is not installed in the default compiler/linker search paths, specify the path for dmalloc.h in DMALLOCINC and add the path for libdmalloc.a to DMALLOCLIB - Install directories The imakefiles also allow installation of the library. By default, typing make install will install any libraries in USRLIBDIR (most likely to be something like /usr/X11R6/lib) The XmHTML header files get installed in INCROOT/Xm (which most likely will be something like /usr/X11R6/include/Xm). You can specify other locations by changing the XmHTMLLibDir and XmHTMLIncDir defines. Please note that you need to have root privileges if you use the default locations. Also note that if you are installing the shared library, you will have to reconfigure your dynamic linker. On linux you do that using ldconfig. After you have adjusted XmHTML.cf to your likings, typing xmkmf will produce the toplevel Makefile. Then type make Makefiles followed by make depend. Once this step is completed, typing make will build the library (or libraries) and everything in the selected subdirectories. If you want to install the library and header files, type make install. If you have not modified the default install directories, you probably will have to have root privileges. If you have build the shared library and installed it, please remember that you need to re-configure your dynamic loader, even if you use the default install directories. The command for this under Linux is ldconfig (and possibly editing of /etc/ld.so.conf). (Anyone knows what the requirements are on other systems supporting shared libs?) If you do not have root priviliges and you want to use the shared XmHTML library, you need to adjust the path your dynamic linker searches. On Linux you can do this by setting an appropriate value for the LD_LIBRARY_PATH environment variable: csh, tcsh: setenv LD_LIBRARY_PATH <shared lib installation path> sh, bash: export LD_LIBRARY_PATH="<shared lib installation path>" The name of this environment variable may differ on other systems (see the manual pages for ld and/or ld.so or something like that). Note: you need to do this when the examples have been linked against a newly build XmHTML shared library or they won't run. 2. Compiling XmHTML using the provided Makefiles ------------------------------------------------ If you do not have imake, or imake is configured poorly on your system, you can compile the library and examples by using the provided makefiles. You might want to check the make directory, it contains some toplevel makefiles for different systems. The provided makefiles do *not* support building shared libraries. Unless you are using Linux, you probably have to adjust the toplevel makefile. Things that require your attention are: - CFLAGS Flags required for you compiler. An ansi C compiler is required. The list below gives the flags required to put some compilers into ansi mode (not sure of these except for gcc and HPUX): gcc: -ansi DEC OSF1/AXP/Ultrix: -std1 USL SV4: -Xa HPUX: -Ae [Note: this is the same as -Aa -D_POSIX_SOURCE] AIX: -qlanglvl=ansi SGI: -xansi - IMAGEDEFINES These control what type of image XmHTML will support. See section 3 for more info. - LIBDIR This must point to the directories where your X11 and Xm libraries can be found. - INCLUDES This must point to the directories where your X11 and Xm include files can be found; - CPPFLAGS This is probably the most cumbersome. A number of things can be undefined if you do not add the proper defines. If you are using the GNU libc, you will have to add -D_BSD_SOURCE or strcasecmp and strdup will not be prototyped. HPUX might need -D_HPUX_SOURCE SunOs also probably needs -D_POSIX_SOURCE If your system does not have the str[n]casecmp routines, you will want to add -DNEED_STRCASECMP (Unixware). Debugging output is only enabled if -DDEBUG is defined. A number of routines (especially the event handlers) have debug output enabled only if either the -dfull command line option is used or when the XmNdebugEnableFullOutput is set to True (this will cause a *huge* amount of output). See the file DEBUGGING for more info. - LIBS This also can be annoying. On linux with X11R6.1, the complete X library package is required: -lXm -lXpm -lXmu -lXt -lXext -lX11 -lSM -lICE Just use the libs you normally use when linking Motif/X11 apps. Note: Motif 2.0.X *requires* libXpm. Note: LIBDIR and LIBS are only used when building the examples - Image stuff XmHTML *requires* that you have libXpm and the xpm.h header file installed. JPEG and PNG are compilation options. - dmalloc I am using the dmalloc package (by Gray Watson) to trace memory leaks and thelike. It is disabled by default. If you want to use dmalloc, you need to add -DDMALLOC to CPPFLAGS and -ldmalloc to LIBS and update INCLUDES and LIBDIR. The homepage of dmalloc can be found at http://www.letters.com/dmalloc You can ftp it from there or directly from ftp.letters.com, directory /src/dmalloc. One known problem here: when using dmalloc, the SetValues method seems to behave erratic. dmalloc sometimes keeps hanging in it's own heap checking. Don't know if it's due to a bug in XmHTML or a conflict between dmalloc and X. You can get around this by using a large enough heap check interval, 100 or so will do nicely. Once you have made your adjustments, typing make should give you a library called libXmHTML.a BTW: there is a backup copy of each Makefile called Makefile.org There is no test suite (try modifying Mosaic to use XmHTML ;-), but there are a few examples in the examples directory. These are built by default, so if you do not want to build the examples, remove the examples directory from the SUBDIRS line in the toplevel makefile. Likewise for the tools directory. You can find the full widget description in the html directory. 3. Selecting supported image types ---------------------------------- Support for JPEG, PNG and GZF images are selectable compilation options. -DHAVE_JPEG enables JPEG support. This requires libjpeg by the Independent JPEG Group. Version 6 or above; -DHAVE_PNG enables PNG support. This requires libpng, version 0.96 or above and zlib, version 1.0.4 or above. -DHAVE_ZLIB enables GZF support. When you have already selected PNG support you do not have to set this. Set ZLIBINC to the path of the zlib include files and ZLIBLIB to the path of the zlib library. Requires zlib, version 1.0.4 or above. 4. Compiling a stand-alone version of the raw HTML parser --------------------------------------------------------- From XmHTML version 1.0.20 this is automatically done if you have selected the tools directory. The raw HTML parser can also be compiled as a stand-alone program, which can be used to verify HTML documents and look at the repair capabilities of the parser. To compile this standalone version, enter the src directory and type: make -f Makefile.org HTMLparse -or- cc -o HTMLparse -DPEDANTIC -DVERIFY parse.c Both commands will produce an executable called HTMLparse. The -DPEDANTIC flag will enable warning messages. If you don't want them, remove it from the compiler command line. As output, two files are produced. One with parser details (all elements with line numbers) and one HTML document suitable for loading into a browser. The latter file is the output from the parser itself, and is not a copy from the document fed to the parser. The standalone parser has the following command line options: -debug Displays the states the parser is switching through when parsing a document. -notext only output the HTML tags and ignore the text between them; -nowarn Don't display warnings when parsing a file; -nowrite Don't generate output files. 5. GIF images and the Unisys LZW patent --------------------------------------- Nearly all HTML documents contain GIF images in which the raster data has been compressed with the LZW compression algorithm. Unfortunately, LZW is covered by a software patent which is owned by Unisys Corporation. In the past, Unisys has allowed the use of this patent for decoding GIF images without the need of a license, but this attitude has changed considerably. Unisys now requires one to obtain a license for this patent for GIF-decoding in software such as XmHTML which is released for free and which may be freely redistributed. As a workaround, XmHTML converts the GIF-format LZW data to compress-format LZW data. (The standard UNIX compress utility also uses LZW, but with a slightly different file format.) This conversion does *not* decompress the data; it simply converts it to a different file format. XmHTML then calls uncompress to actually decompress the data. I have been told by several notable people that the LZW patent covers compression only, and does not cover decompression. The original patent however covers both compression *and* decompression in 186 claims, and since all 186 claims have been granted by the US patent office back in 1986, I'm going to stick with my workaround. At least for now. Software patents in general are a bad idea. Consider supporting the League for Programming Freedom <http://www.lpf.org/>. For Unisys's slant on things (mostly regarding GIF), see <http://www.unisys.com/LeadStory/lzwterms.html> and <http://www.unisys.com/LeadStory/lzwfaq.html>. These pages mention an email address for feedback (these links may be out of data). <http://www.xmission.com:80/~mgm/gif/> has pointers to other interesting information. A very interesting article about this Gif controversy can be found at: <http://www.omnipresence.com/Amiga/News/AR/ar311_Sections/feature5.HTML> If you have or want to obtain a license which allows you to use the LZW algorithm, the file docs/README.gifs describes how you can add your own LZW decoder to XmHTML. 5.1 GIF and GZF and XmHTML -------------------------- XmHTML offers some sort of alternative to the GIF format: GZF. This is a rather compatible with GIF. It only differs in the way the compressed raster data is stored: instead of using LZW, it uses the deflate format. The deflate format is in the public domain (see RFC 1950 and 1951) and as such is not and can't be challenged by coorporate patent hunters. There are multiple advantages to the deflate format: it's smaller than LZW (an average of 20% with extremes to more than 50%) and the compress/decompress routines are freely available in the form of zlib. XmHTML comes with a gif to gzf translator (to be found in the tools directory) which translates *all* types of GIF images to GZF images using the workaround mentioned above. libXmHTML contains a convenience function which does the same. The purpose of the GZF format in combination with XmHTML is to offer some sort of speedup: when you need to display a GIF image, it can be costly to use the workaround every time the document is displayed. What you can do instead is to translate the GIF image to a GZF image and use that image whenever the GIF image is requested. This way you can still support GIF images without a costly LZW license and without a delay by using the workaround. The file docs/README.gzf describes how to use LZWStream for your own purposes. 6. Things missing in this version --------------------------------- - server-side imagemaps - no tables or applets - getting formatted text from the widget in plain or PostScript format Form support is limited at this time. The Submit button doesn't trigger the XmNformCallback resource yet. Scrolling large forms can go haywire. 7. LessTif compatibility ------------------------ XmHTML has received limited testing under LessTif 0.80. It runs fine, scrolling is actually smoothier than under Motif 2.0.1. There is a small screen-update problem: the first time XmHTML is up and text is scrolled up, XmHTML does not clean the bottom part of the display area properly. This goes away by resizing the widget a bit. 8. Adding Warning and Error messages ------------------------------------ If you are modifying the XmHTML source and want to add a warning or error message, you can use the following functions: - _XmHTMLWarning(__WFUNC__(Widget w, String routine), String fmt, ...) Displays a warning message on stderr. - _XmHTMLError(__WFUNC__(Widget w, String routine), String fmt, ...) Displays an error message on stderr and exits. - _XmHTMLAllocError(Widget w, char *module, char *routine, char *func, int size) Displays an error message on stderr and exits. In these functions, routine is the name of the routine that is calling the function. In the first two, these are only displayed when DEBUG was defined during compilation. The latter function always displays them. They may _never_ be NULL since they aren't checked. __WFUNC__ is a define that includes file & line number information when DEBUG was defined during compilation, and when DEBUG is not defined it only uses the Widget arg (the reason behind this is that the actual warning & error routines have different args for production and distribution builds). When the _XmHTMLError function is called, XmHTML will append a message saying to contact the XmHTML author. You can change this message by altering the string ``authors'' in src/error.c The first two functions allow you to print out any message you want: fmt is a printf format string and ... are arguments to fmt. One big WARNING: the total size of fmt and arguments may not exceed 1024 bytes. If you want to use warning message that large, think of a smaller one or use multiple warning messages. The last function is only used when a check on an allocation fails: func is the name of the memory allocation function that failed (malloc, calloc, ...) and size is the size of the memory that was requested. It is hardly used by XmHTML itself; production builds use either asserted versions of the memory allocation routines or dmalloc, while distribution builds use the Xt versions. All of them will exit XmHTML when allocation fails (the first two will dump core). 9. Points To Ponder ------------------- - dithering: there are two algorithms available that allow XmHTML to construct a default palette if none has been specified (the XmNimageMapToPalette resource is set but no palette has been given with the XmNimagePalette resource). The default algorithm constructs an evenly distributed palette in RGB space but is not always able to match the requested number of colors and requires a minumum of 8 colors. The alternative always creates a palette with the requested number of colors but does not always succeed in creating an evenly distributed palette. You can choose the latter by defining DITHER_SIMPLE_COLORMAP. - If you are getting wierd results when scrolling, try recompiling with NO_XLIB_ILLEGAL_ACCESS defined. This will make XmHTML use the official intrinsics XtGetValues method instead of accessing the instance structures of the scrollbars directly. - XmHTML is a subclass of Manager, but utilizes a number of resources from other widgets, noticably DrawingArea and ScrollBar. Some of XmHTML's resources are enumeration types, which are converted to an internal representation type by the XmRepType functions. Because XmHTML uses resources from the named widgets (and others), it needs to get access to the internal resource translation tables (resource file string -> enum). It does does by calling the XmRepTypeGetId function with the name of the resource converters it has to use. When a converter is not found, XmHTML will issue a warning message: "Warning: Representation type resource convertor <some name> not found Please contact ripley@xs4all.nl" The <some name> is the name of the offending convertor. Chances are that this *can* happen on some early versions of Motif 1.2 and/or 1.1 If you whish to solve this by yourself, a little program is distributed along with XmHTML: tools/GetRepTypes.c If you compile and run this program you will get a list of all resource converters that are installed by Motif on *your* system. - All files have a tabstop of 4, so if your editor has a different one, it will look ugly. 10. How to contact us -------------------- You can reach us by email at ripley@xs4all.nl The XmHTML homepage is located at http://www.xs4all.nl/~ripley/eXode/XmHTML.html If you have any comments, encounter problems, suggestions or just want to tell us how great XmHTML is ;-) feel free to contact us. Koen D'Hondt & Niels Hilbrink Ripley Software Development.