<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title>The Random Books, Software, and Thoughts</title>
	<subtitle>of Michael R Sweet</subtitle>
	<link href="https://www.msweet.org/msweet.xml" rel="self" />
	<link href="https://www.msweet.org/" />
	<id>urn:uuid:ef1d5fc0-f993-4845-879c-cf587eb10e4f</id>
	<icon>https://www.msweet.org/apple-touch-icon.png</icon>
	<updated>2024-02-12T01:37:42+00:00</updated>
        
	<entry>
		<title type="html">HTMLDOC 1.9.18</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2024-02-11-htmldoc-1.9.18.html" />
		<id>https://www.msweet.org/blog/2024-02-11-htmldoc-1.9.18.html</id>
		<updated>2024-02-11T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.18</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.18 is a bug fix release.  Changes include:</p>

<ul>
  <li>Fixed table rendering when there are missing <code class="language-plaintext highlighter-rouge">&lt;/tr&gt;</code> (Issue #494)</li>
  <li>Fixed support for links of the form “filename.html#anchor” in PDF output
(Issue #514)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">--header1</code> support for web page output (Issue #515)</li>
  <li>Fixed markdown emphasized, strong, and struck-through text (Issue 517)</li>
</ul>

<p>Binaries are available from Github for Windows and macOS, and through the Snapcraft store for Linux.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.18">Download HTMLDOC 1.9.18</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.18 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.4.6</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2024-02-09-pappl-1.4.6.html" />
		<id>https://www.msweet.org/blog/2024-02-09-pappl-1.4.6.html</id>
		<updated>2024-02-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.4.6</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.4.6 is now available for download and is a bug fix release.  Changes include:</p>

<ul>
  <li>Fixed reporting of “printer-strings-languages-supported” attribute (Issue #328)</li>
  <li>Fixed saving of “print-darkness-default” and “print-speed-default” values (Issue #330 and #337)</li>
  <li>Fixed incoming “raw” print socket support (Issue #331 and #338)</li>
  <li>Fixed web interface support for “printer-darkness” (Issue #333)</li>
  <li>Fixed some issues discovered by OpenScanHub (Issue #335)</li>
  <li>Fixed localization of command-line (main loop) interface.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.4.6">Download PAPPL v1.4.6</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">LPrint v1.3.1</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2024-02-09-lprint-1.3.1.html" />
		<id>https://www.msweet.org/blog/2024-02-09-lprint-1.3.1.html</id>
		<updated>2024-02-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>LPrint v1.3.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>LPrint v1.3.1 is a bug fix release.  Changes include:</p>

<ul>
  <li>Updated “print-speed” support in TSPL driver (Issue #120 and #121)</li>
  <li>Fixed lprint-modify man page (Issue #122 and #126)</li>
  <li>Fixed snap documentation for connecting LPrint to Avahi.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint/releases/tag/v1.3.1">Download LPrint 1.3.1</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HP Printer Application v1.3.0</title>
		<category term="hp-printer-app" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2024-02-09-hp-printer-app-1.3.0.html" />
		<id>https://www.msweet.org/blog/2024-02-09-hp-printer-app-1.3.0.html</id>
		<updated>2024-02-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HP Printer Application v1.3.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HP Printer Application v1.3.0 is now available for download as an “officially
supported” printer application for older PCL laser and inkjet printers.  Changes
in 1.3.0 include:</p>

<ul>
  <li>Switched to using a configure script.</li>
  <li>Updated documentation for current PAPPL.</li>
  <li>Added support for snap server configuration settings (Issue #21)</li>
  <li>Updated macOS and Linux binaries to use PAPPL 1.4.x.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/hp-printer-app/releases/tag/v1.3.0">Download PAPPL v1.3.0</a>
<a class="btn btn-default" href="/hp-printer-app/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">LPrint v1.3.0</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2024-01-31-lprint-1.3.0.html" />
		<id>https://www.msweet.org/blog/2024-01-31-lprint-1.3.0.html</id>
		<updated>2024-01-31T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>LPrint v1.3.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>LPrint v1.3.0 adds a new dithering algorithm, support for new printers, support
for configuration files, and fixes a number of bugs.  Changes include:</p>

<ul>
  <li>Added new dithering algorithm to better support barcode printing with shaded
content.</li>
  <li>Added experimental Brother printer support (Issue #15)</li>
  <li>Added basic TSPL printer support (Issue #54)</li>
  <li>Added basic SEIKO printer support (Issue #58)</li>
  <li>Added experimental Zebra CPCL printer support.</li>
  <li>Added support for configuration files in “/etc”, “/usr/local/etc”, or
“/Library/Application Support” (macOS).</li>
  <li>Updated ZPL driver to report ‘media-needed’ reason when out of labels during a
job.</li>
  <li>Fixed copies support for ZPL printers (Issue #100)</li>
  <li>Fixed darkness calculations for EPL and ZPL printers (Issue #104)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint/releases/tag/v1.3.0">Download LPrint 1.3.0</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.4.5</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2024-01-26-pappl-1.4.5.html" />
		<id>https://www.msweet.org/blog/2024-01-26-pappl-1.4.5.html</id>
		<updated>2024-01-26T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.4.5</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.4.5 is now available for download and is a bug fix release.  Changes include:</p>

<ul>
  <li>Fixed <code class="language-plaintext highlighter-rouge">--disable-libpam</code> configure option.</li>
  <li>Fixed support for “finishings”, “output-bin”, and “sides” options.</li>
  <li>Fixed IEEE-1284 device ID generation code.</li>
  <li>Fixed crash in retrofit printer application (Issue #322)</li>
  <li>Fixed some Coverity-detected threading issues.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.4.5">Download PAPPL v1.4.5</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.2.0</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2024-01-24-pdfio-1.2.0.html" />
		<id>https://www.msweet.org/blog/2024-01-24-pdfio-1.2.0.html</id>
		<updated>2024-01-24T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.2.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.2.0 is a feature release. Changes include:</p>

<ul>
  <li>Now use autoconf to configure the PDFio sources (Issue #54)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">pdfioFileCreateNumberObj</code> and <code class="language-plaintext highlighter-rouge">pdfioFileCreateStringObj</code> functions
(Issue #14)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">pdfioContentTextMeasure</code> function (Issue #17)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">pdfioContentTextNewLineShow</code> and <code class="language-plaintext highlighter-rouge">pdfioContentTextNewLineShowf</code>
functions (Issue #24)</li>
  <li>Renamed <code class="language-plaintext highlighter-rouge">pdfioContentTextNextLine</code> to <code class="language-plaintext highlighter-rouge">pdfioContentTextNewLine</code>.</li>
  <li>Updated the maximum number of object streams in a single file from 4096 to
8192 (Issue #58)</li>
  <li>Updated the token reading code to protect against some obvious abuses of the
PDF format.</li>
  <li>Updated the xref reading code to protect against loops.</li>
  <li>Updated the object handling code to use a binary insertion algorithm -
provides a significant (~800x) improvement in open times.</li>
  <li>Fixed handling of encrypted PDFs with per-object file IDs (Issue #42)</li>
  <li>Fixed handling of of trailer dictionaries that started immediately after the
“trailer” keyword (Issue #58)</li>
  <li>Fixed handling of invalid, but common, PDF files with a generation number of
65536 in the xref table (Issue #59)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.2.0">Download PDFio v1.2.0</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Destination Linux Podcast Interview</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-12-23-destination-linux.html" />
		<id>https://www.msweet.org/blog/2023-12-23-destination-linux.html</id>
		<updated>2023-12-23T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Destination Linux Podcast Interview</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>I had the privilege of being a guest with Till Kamppeter on this month’s <a href="https://tuxdigital.com/podcasts/destination-linux/dl-351/">Destination Linux podcast</a> to talk about printing on Linux and the history of OpenPrinting, driverless printing, Apple, and AirPrint.</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.4.4</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-12-21-pappl-1.4.4.html" />
		<id>https://www.msweet.org/blog/2023-12-21-pappl-1.4.4.html</id>
		<updated>2023-12-21T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.4.4</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.4.4 is now available for download and is a bug fix release.  Changes include:</p>

<ul>
  <li>Fixed “printer-settable-attributes-supported” value (Issue #311)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">-n</code> support for setting number of copies (Issue #312)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">papplPrinterSetDriverDefaults</code> didn’t set the
“orientation-requested-default” value (Issue #313)</li>
  <li>Fixed job file preservation logic.</li>
  <li>Fixed builds against current libcups3.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.4.4">Download PAPPL v1.4.4</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.1.4</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-12-03-pdfio-1.1.4.html" />
		<id>https://www.msweet.org/blog/2023-12-03-pdfio-1.1.4.html</id>
		<updated>2023-12-03T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.1.4</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.1.4 is a bug fix release. Changes include:</p>

<ul>
  <li>Fixed detection of encrypted strings that are too short (Issue #52)</li>
  <li>Fixed a TrueType CMAP decoding bug.</li>
  <li>Fixed a text rendering issue for Asian text.</li>
  <li>Added a ToUnicode map for Unicode text to support text copying.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.1.4">Download PDFio v1.1.4</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.1.3</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-11-15-pdfio-1.1.3.html" />
		<id>https://www.msweet.org/blog/2023-11-15-pdfio-1.1.3.html</id>
		<updated>2023-11-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.1.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.1.3 is a bug fix release. Changes include:</p>

<ul>
  <li>Fixed Unicode font support (Issue #16)</li>
  <li>Fixed missing initializer for 40-bit RC4 encryption (Issue #51)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.1.3">Download PDFio v1.1.3</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.4.3</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-11-15-pappl-1.4.3.html" />
		<id>https://www.msweet.org/blog/2023-11-15-pappl-1.4.3.html</id>
		<updated>2023-11-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.4.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.4.3 is now available for download and is a bug fix release.  Changes include:</p>

<ul>
  <li>Added “smi55357-device-uri” and “smi55357-driver” Printer Status attributes
to Get-Printer-Attributes responses.</li>
  <li>Fixed missing mutex unlock in DNS-SD code (Issue #299)</li>
  <li>Fixed “printer-id” value for new printers (Issue #301)</li>
  <li>Fixed DNS-SD device list crash (Issue #302)</li>
  <li>Fixed Set-Printer-Attributes for “output-bin-default” and “sides-default”
(Issue #305)</li>
  <li>Fixed default “copies” value with <code class="language-plaintext highlighter-rouge">papplJobCreateWithFile</code>.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.4.3">Download PAPPL v1.4.3</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.4.2</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-10-16-pappl-1.4.2.html" />
		<id>https://www.msweet.org/blog/2023-10-16-pappl-1.4.2.html</id>
		<updated>2023-10-16T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.4.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.4.2 is now available for download and is a bug fix release.  Changes include:</p>

<ul>
  <li>Fixed potential crash while listing devices (Issue #296)</li>
  <li>Fixed potential deadlock issue (Issue #297)</li>
  <li>Fixed loading of previous state (Issue #298)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.4.2">Download PAPPL v1.4.2</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.1.2</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-10-10-pdfio-1.1.2.html" />
		<id>https://www.msweet.org/blog/2023-10-10-pdfio-1.1.2.html</id>
		<updated>2023-10-10T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.1.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.1.2 fixes a number of PDF reading issues as well as a build issue. Changes include:</p>

<ul>
  <li>Updated <code class="language-plaintext highlighter-rouge">pdfioContentSetDashPattern</code> to support setting a solid (0 length)
dash pattern (Issue #41)</li>
  <li>Fixed an issue with broken PDF files containing extra CR and/or LF separators
after the object stream token (Issue #40)</li>
  <li>Fixed an issue with PDF files produced by Crystal Reports (Issue #45)</li>
  <li>Fixed an issue with PDF files produced by Microsoft Reporting Services
(Issue #46)</li>
  <li>Fixed support for compound filters where the filter array consists of a
single named filter (Issue #47)</li>
  <li>Fixed builds on Windows - needed windows.h header for temporary files
(Issue #48)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.1.2">Download PDFio v1.1.2</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.4.1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-10-10-pappl-1.4.1.html" />
		<id>https://www.msweet.org/blog/2023-10-10-pappl-1.4.1.html</id>
		<updated>2023-10-10T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.4.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.4.1 is now available for download and is a bug fix release.  Changes include:</p>

<ul>
  <li>Fixed typos in the names of the <code class="language-plaintext highlighter-rouge">papplJobResume</code> and <code class="language-plaintext highlighter-rouge">papplJobSuspend</code>
functions (Issue #295)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.4.1">Download PAPPL v1.4.1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.4.0</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-09-28-pappl-1.4.0.html" />
		<id>https://www.msweet.org/blog/2023-09-28-pappl-1.4.0.html</id>
		<updated>2023-09-28T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.4.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.4.0 is now available for download and is a feature release.  Changes in 1.4.0 include:</p>

<ul>
  <li>Added support for “job-retain-until” (Issue #14)</li>
  <li>Added new PAPPL-Create-Printers operation, and the PAPPL mainloop API now
auto-adds local printers the first time a server is run (Issue #245)</li>
  <li>Added new <code class="language-plaintext highlighter-rouge">papplDeviceRemoveScheme</code> and <code class="language-plaintext highlighter-rouge">papplDeviceRemoveTypes</code> APIs to
disable unwanted device types (Issue #259)</li>
  <li>Added support for suspending and resuming jobs at copy boundaries (Issue #266)</li>
  <li>Added support for server configuration files (Issue #279)</li>
  <li>Now preserve the paused state of printers (Issue #286)</li>
  <li>Fixed reporting of “xxx-k-octet-supported” attributes.</li>
  <li>Fixed printing of 1/2/4-bit grayscale PNG images (Issue #267)</li>
  <li>Fixed USB serial number for DYMO printers (Issue #271)</li>
  <li>Fixed a potential buffer overflow in the logging code (Issue #272)</li>
  <li>Fixed DNS-SD advertisements when the server name is set to “localhost”
(Issue #274)</li>
  <li>Fixed hostname change detection when using mDNSResponder (Issue #282)</li>
  <li>Fixed authentication cookie comparisons for simple password mode.</li>
  <li>Fixed a potential time-of-use issue with PAPPL-created directories.</li>
  <li>Fixed handling of trailing ‘%’ in log format strings.</li>
  <li>Updated the <code class="language-plaintext highlighter-rouge">options</code> sub-command to list vendor options and values
(Issue #255)</li>
  <li>Updated web interface to show the age of jobs (Issue #256)</li>
  <li>Updated “devices” sub-command to have the PAPPL server find the devices
instead of doing it directly (Issue #262)</li>
  <li>Updated default logging to be less chatty (Issue #270)</li>
  <li>Updated the Wi-Fi configuration page to support hidden networks.</li>
  <li>Updated the Wi-Fi configuration page reload time to 30 seconds.</li>
  <li>Updated TLS certificate generation to support more types of certificates and
to use modern OpenSSL/GNU TLS APIs.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.4.0">Download PAPPL v1.4.0</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.17</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-09-17-htmldoc-1.9.17.html" />
		<id>https://www.msweet.org/blog/2023-09-17-htmldoc-1.9.17.html</id>
		<updated>2023-09-17T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.17</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.17 is a bug fix release.  Changes include:</p>

<ul>
  <li>Added new <code class="language-plaintext highlighter-rouge">--pre-indent</code> option to control indentation of pre-formatted text (Issue #505)</li>
  <li>Now link to CUPS library instead of embedding its HTTP code.</li>
  <li>Updated PostScript and PDF date/time information to use UTC (Issue #490)</li>
  <li>Fixed multiple conversions of UTF-8 HTML files from the GUI (Issue #496)</li>
  <li>Fixed a compile bug on Solaris (Issue #498)</li>
  <li>Fixed a markdown parsing bug (Issue #503)</li>
  <li>Fixed a relative URL handling bug (Issue #507)</li>
  <li>Fixed a crash bug with bad title images (Issue #510)</li>
  <li>Fixed some minor CodeQL warnings.</li>
</ul>

<p>Binaries are available from Github for Windows and macOS, and through the Snapcraft store for Linux.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.17">Download HTMLDOC 1.9.17</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.17 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mantohtml v2.0.1 Now Available</title>
		<category term="mantohtml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-09-13-mantohtml-2.0.1.html" />
		<id>https://www.msweet.org/blog/2023-09-13-mantohtml-2.0.1.html</id>
		<updated>2023-09-13T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mantohtml v2.0.1 Now Available</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>mantohtml v2.0.1 is a general bug fix release.  Changes include:</p>

<ul>
  <li>Fixed a buffer overrun bug (Issue #1)</li>
  <li>Fixed the default page title to be <code class="language-plaintext highlighter-rouge">NAME(SECTION)</code>.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mantohtml/releases/tag/v2.0.1">Download mantohtml</a>
<a class="btn btn-default" href="https://snapcraft.io/mantohtml">Install mantohtml Snap</a>
<a class="btn btn-default" href="/mantohtml/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.3.4 (Replaces v1.3.3)</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-09-07-pappl-1.3.4.html" />
		<id>https://www.msweet.org/blog/2023-09-07-pappl-1.3.4.html</id>
		<updated>2023-09-07T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.3.4 (Replaces v1.3.3)</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.3.4 is now available for download and is a general bug fix release.
Changes in 1.3.4 include:</p>

<ul>
  <li>Fixed builds with GNU TLS (Issue #292)</li>
  <li>Fixed a HTML error on the network configuration page.</li>
</ul>

<p>Changes in 1.3.3 include:</p>

<ul>
  <li>Fixed USB serial number for DYMO printers (Issue #271)</li>
  <li>Fixed DNS-SD advertisements when the server name is set to “localhost”
(Issue #274)</li>
  <li>Fixed hostname change detection when using mDNSResponder (Issue #282)</li>
  <li>Fixed authentication cookie comparisons for simple password mode.</li>
  <li>Fixed a potential time-of-use issue with PAPPL-created directories.</li>
  <li>Fixed handling of trailing ‘%’ in log format strings.</li>
  <li>Updated TLS certificate generation to support more types of certificates and
to use modern OpenSSL/GNU TLS APIs.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.3.4">Download PAPPL v1.3.4</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.3.2</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-05-06-pappl-1.3.2.html" />
		<id>https://www.msweet.org/blog/2023-05-06-pappl-1.3.2.html</id>
		<updated>2023-05-06T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.3.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.3.2 is now available for download and is a general bug fix release.
Changes in 1.3.2 include:</p>

<ul>
  <li>Fixed PWG ImageBox values in raster page header</li>
  <li>Fixed a bug in the “ipp-attribute-fidelity” support</li>
  <li>Fixed printing of 1/2/4-bit grayscale PNG images (Issue #267)</li>
  <li>Fixed a potential buffer overflow in the logging code (Issue #272)</li>
  <li>Fixed reporting of “xxx-k-octet-supported” attributes.</li>
  <li>Updated the Wi-Fi configuration page to support hidden networks.</li>
  <li>Updated the Wi-Fi configuration page reload time to 30 seconds.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.3.2">Download PAPPL v1.3.2</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.1.1</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-03-20-pdfio-1.1.1.html" />
		<id>https://www.msweet.org/blog/2023-03-20-pdfio-1.1.1.html</id>
		<updated>2023-03-20T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.1.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.1.1 fixes a potential denial of service issue and fixes some build issues. Changes include:</p>

<ul>
  <li>CVE-2023-28428: Fixed a potential denial-of-service with corrupt PDF files.</li>
  <li>Fixed a few build issues.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.1.1">Download PDFio v1.1.1</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.1.0</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-02-06-pdfio-1.1.0.html" />
		<id>https://www.msweet.org/blog/2023-02-06-pdfio-1.1.0.html</id>
		<updated>2023-02-06T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.1.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.1.0 fixes a potential denial of service issue, fixes a few general bugs, and adds a few new APIs. Changes include:</p>

<ul>
  <li>CVE-2023-24808: Fixed a potential denial-of-service with corrupt PDF files.</li>
  <li>Added <code class="language-plaintext highlighter-rouge">pdfioFileCreateTemporary</code> function (Issue #29)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">pdfioDictIterateKeys</code> function (Issue #31)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">pdfioContentPathEnd</code> function.</li>
  <li>Added protection against opening multiple streams in the same file at the same time.</li>
  <li>Documentation updates (Issue #37)</li>
  <li>Fixed “install-shared” target (Issue #32)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">pdfioFileGet...</code> metadata APIs (Issue #33)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">pdfioContentMatrixRotate</code> function.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.1.0">Download PDFio v1.1.0</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">RasterView 1.9.0</title>
		<category term="rasterview" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-01-16-rasterview-1.9.0.html" />
		<id>https://www.msweet.org/blog/2023-01-16-rasterview-1.9.0.html</id>
		<updated>2023-01-16T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>RasterView 1.9.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>RasterView 1.9.0 includes some minor improvements and bug fixes and adds support
for Windows.  Changes include:</p>

<ul>
  <li>Fixed macOS ‘Close’ and ‘Re-Open’ menu items (Issue #20)</li>
  <li>Fixed color picking (Issue #21)</li>
  <li>Updated the maximum zoom to 20x</li>
  <li>Added Visual Studio project files for Windows release</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.9.0">Download RasterView 1.9.0</a>
<a class="btn btn-default" href="https://snapcraft.io/rasterview">Install RasterView 1.9.0 Snap</a>
<a class="btn btn-default" href="/rasterview/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Improving Code Quality, Part 2</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2023-01-15-code-quality-part-2.html" />
		<id>https://www.msweet.org/blog/2023-01-15-code-quality-part-2.html</id>
		<updated>2023-01-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Improving Code Quality, Part 2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This is a follow-up to <a href="/blog/2020-12-31-how-i-improve-my-c-code-quality.html">my first post on code quality</a> with updates to
various tools and some thoughts on POSIX threading.</p>

<!--more-->

<h1 id="tool-updates">Tool Updates</h1>

<h2 id="dynamic-code-analysis">Dynamic Code Analysis</h2>

<p>In addition to <a href="https://github.com/google/sanitizers/wiki/AddressSanitizer">Address Sanitizer</a>, GCC and Clang also both support
<a href="https://github.com/google/sanitizers/wiki/MemorySanitizer">Memory Sanitizer</a> and <a href="https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual">Thread Sanitizer</a> to detect uninitialized
memory accesses and threading issues.  Compile with the <code class="language-plaintext highlighter-rouge">-fsanitize=memory</code> or
<code class="language-plaintext highlighter-rouge">-fsanitize=thread</code> options to enable them, respectively.</p>

<p>The Thread Sanitizer is still very much a beta tool, and while it has helped
with some of my recent threaded code it needs better support for locks -
<a href="#threaded-software-debugging">see below</a>.</p>

<h2 id="static-code-analysis">Static Code Analysis</h2>

<p>The <a href="https://lgtm.com">LGTM</a> service is shutting down, with everything moving over to the
<a href="https://semmle.com/codeql">CodeQL</a> tools.  <a href="https://github.com">Github</a> offers built-in support for running
CodeQL as an “action” (continuous integration), and if you were using LGTM they
will create a pull request for any of your repositories to migrate to the new
tools.  Github also offers integration with <a href="https://www.codacy.com">Codacy</a> but I haven’t been
as happy with their tools.</p>

<h2 id="continuous-integration-unit-tests-and-test-suites">Continuous Integration, Unit Tests, and Test Suites</h2>

<p><a href="https://www.travis-ci.com">Travis CI</a> decided to go non-free, so I’ve moved all of my CI to
<a href="https://docs.github.com/en/actions">Github Actions</a>.</p>

<h1 id="threaded-software-debugging">Threaded Software Debugging</h1>

<p>Over the last year I have needed to debug <a href="https://www.msweet.org/pappl">PAPPL</a> threading issues,
mainly around its use of reader/writer locks (<code class="language-plaintext highlighter-rouge">pthread_rwlock_t</code>) to control
access to the various objects.  <a href="https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual">Thread Sanitizer</a> was of limited use, so
I ended up developing simple logging macros along with an analysis program to
find deadlock, recursive locking, and locked-at-free issues.  For example:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pthread_rwlock_rdlock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">obj</span><span class="o">-&gt;</span><span class="n">rwlock</span><span class="p">);</span>
<span class="p">...</span> <span class="n">access</span> <span class="n">object</span> <span class="n">values</span>
<span class="nf">pthread_rwlock_unlock</span><span class="p">(</span><span class="o">&amp;</span><span class="n">obj</span><span class="o">-&gt;</span><span class="n">rwlock</span><span class="p">);</span>
</code></pre></div></div>

<p>becomes:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">_papplRWLockRead</span><span class="p">(</span><span class="n">obj</span><span class="p">);</span>
<span class="p">...</span> <span class="n">access</span> <span class="n">object</span> <span class="n">values</span>
<span class="nf">_papplRWUnlock</span><span class="p">(</span><span class="n">obj</span><span class="p">);</span>
</code></pre></div></div>

<p>The macros log the thread, function, object address, and action (rdlock, wrlock,
or unlock) to <code class="language-plaintext highlighter-rouge">stderr</code> and then call the corresponding <code class="language-plaintext highlighter-rouge">pthread_rwlock_xxx</code>
function.  When the test program is done running, the <code class="language-plaintext highlighter-rouge">parse-lock-log</code> program
then analyses the log and reports on any issues that are found.</p>

<p>I have been looking at re-implementing this as a shared library that can be
loaded at runtime without re-compilation so it can be used more generally and
also provide live reporting in addition to post execution analysis.  I’ll post
more if I make any headway on this…</p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">LPrint v1.2.0</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-12-31-lprint-1.2.0.html" />
		<id>https://www.msweet.org/blog/2022-12-31-lprint-1.2.0.html</id>
		<updated>2022-12-31T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>LPrint v1.2.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>LPrint v1.2.0 adds support for snap configuration and EPL/ZPL auto-typing
support, and fixes a number of bugs.  Changes include:</p>

<ul>
  <li>Documentation corrections (Issue #53, Issue #76)</li>
  <li>Added snap server configuration.</li>
  <li>Added <code class="language-plaintext highlighter-rouge">--with-systemd</code> configure option and install to
 <code class="language-plaintext highlighter-rouge">$prefix/lib/systemd/system</code> by default (Issue #50)</li>
  <li>Added EPL2 and ZPL auto-typing support (Issue #64)</li>
  <li>Changed the default log level for systemd to info (Issue #82)</li>
  <li>Fixed macOS installer to start LPrint server (Issue #48)</li>
  <li>Fixed configure script not using warning/preprocessor options in build
(Issue #60)</li>
  <li>Fixed printer renaming algorithm to not truncate the name (Issue #60)</li>
  <li>Fixed missing “print-color-mode=bi-level” for bar code printing (Issue #76)</li>
  <li>Fixed label mode support in EPL and ZPL drivers (Issue #79)</li>
  <li>Fixed driver names for EPL printers (Issue #52)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint/releases/tag/v1.2.0">Download LPrint 1.2.0</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.3.1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-12-30-pappl-1.3.1.html" />
		<id>https://www.msweet.org/blog/2022-12-30-pappl-1.3.1.html</id>
		<updated>2022-12-30T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.3.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.3.1 is now available for download and is a general bug fix release.
Changes in 1.3.1 include:</p>

<ul>
  <li>Fixed auto-add of USB printers</li>
  <li>Updated “ipp-attribute-fidelity” support</li>
  <li>Reduced sleep interval for USB gadget initialization</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.3.1">Download PAPPL v1.3.1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.3.0</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-12-02-pappl-1.3.0.html" />
		<id>https://www.msweet.org/blog/2022-12-02-pappl-1.3.0.html</id>
		<updated>2022-12-02T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.3.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.3.0 is now available for download and adds new job management, image
printing, localization, and configuration features.  Changes in 1.3.0 include:</p>

<ul>
  <li>Added debug logging for device management.</li>
  <li>Added support for job hold and release (Issue #15)</li>
  <li>Added support for PNG image scaling using embedded resolution information
(Issue #65)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">papplLocGetDefaultMediaSizeName</code> function to get the default media size
for the current country (Issue #167)</li>
  <li>Added support for localized banners at the top of printer and system web pages
(Issue #183)</li>
  <li>Added timer APIs to manage periodic tasks (Issue #208)</li>
  <li>Added support for network configuration via callbacks (Issue #217)</li>
  <li>Added APIs to limit the maximum size of JPEG/PNG images (Issue #224)</li>
  <li>Added support for the Clang/GCC ThreadSanitizer with the <code class="language-plaintext highlighter-rouge">--enable-tsanitizer</code>
configure option.</li>
  <li>Added Norwegian Bokmål, Polish, and Turkish localizations.</li>
  <li>Added a password visibility button to the Wi-Fi password field.</li>
  <li>Changed names of PAPPL-specific attributes to use “smi55357” prefix.</li>
  <li>Updated USB device code to generate a 1284 device ID and use the manufacturer
and product strings when necessary (Issue #234)</li>
  <li>Updated the USB gadget code to handle disconnections.</li>
  <li>Updated PAPPL to conform to the new prototype PWG 5100.13 specification
(Issue #216)</li>
  <li>Fixed a device race condition with job processing.</li>
  <li>Fixed a initialization timing issue with USB gadgets on newer Linux kernels.</li>
  <li>Fixed a potential memory underflow with USB device IDs.</li>
  <li>Fixed web interface support for vendor text options (Issue #142)</li>
  <li>Fixed a potential value overflow when reading SNMP OIDs (Issue #210)</li>
  <li>Fixed more CUPS 2.2.x compatibility issues (Issue #212)</li>
  <li>Fixed a 100% CPU usage bug when cleaning the job history (Issue #218)</li>
  <li>Fixed the default values of <code class="language-plaintext highlighter-rouge">--with-papplstatedir</code> and <code class="language-plaintext highlighter-rouge">--with-papplsockdir</code>
to use the <code class="language-plaintext highlighter-rouge">localstatedir</code> value (Issue #219)</li>
  <li>Fixed storage of label offsets for printers that implement them.</li>
  <li>Fixed some thread access issues on ARM.</li>
  <li>Fixed when the kernel USB printer driver is unloaded on Linux (Issue #233)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">papplDevicePrintf</code> to allow the “%c” character to be 0.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.3.0">Download PAPPL v1.3.0</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mantohtml v2.0 Now Available</title>
		<category term="mantohtml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-10-09-mantohtml-2.0.html" />
		<id>https://www.msweet.org/blog/2022-10-09-mantohtml-2.0.html</id>
		<updated>2022-10-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mantohtml v2.0 Now Available</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>mantohtml is a man page to HTML conversion program.  It supports all of the
common man/roff macros and can combine multiple man pages in a single HTML
output file.</p>

<p>mantohtml v2.0 is an all-new implementation of my original utility, now
available as a separate project.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mantohtml/releases/tag/v2.0">Download mantohtml</a>
<a class="btn btn-default" href="https://snapcraft.io/mantohtml">Install mantohtml Snap</a>
<a class="btn btn-default" href="/mantohtml/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.2.3</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-10-08-pappl-1.2.3.html" />
		<id>https://www.msweet.org/blog/2022-10-08-pappl-1.2.3.html</id>
		<updated>2022-10-08T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.2.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.2.3 is now available for download and is a general bug fix release.
Changes in 1.2.3 include:</p>

<ul>
  <li>Fixed a bug in the TLS upgrade logic.</li>
  <li>Fixed a potential memory underflow with USB device IDs.</li>
  <li>Fixed web interface support for vendor text options (Issue #142)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.2.3">Download PAPPL v1.2.3</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.2.2</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-09-21-pappl-1.2.2.html" />
		<id>https://www.msweet.org/blog/2022-09-21-pappl-1.2.2.html</id>
		<updated>2022-09-21T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.2.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.2.2 is now available for download and is a general bug fix release.
Changes in 1.2.2 include:</p>

<ul>
  <li>Added debug logging for device management.</li>
  <li>Fixed a device race condition with job processing.</li>
  <li>Fixed a potential value overflow when reading SNMP OIDs (Issue #210)</li>
  <li>Fixed more CUPS 2.2.x compatibility issues (Issue #212)</li>
  <li>Fixed a 100% CPU usage bug when cleaning the job history (Issue #218)</li>
  <li>Fixed the default values of <code class="language-plaintext highlighter-rouge">--with-papplstatedir</code> and <code class="language-plaintext highlighter-rouge">--with-papplsockdir</code>
to use the <code class="language-plaintext highlighter-rouge">localstatedir</code> value (Issue #219)</li>
  <li>Fixed a initialization timing issue with USB gadgets on newer Linux kernels.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.2.2">Download PAPPL v1.2.2</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 3.3.1</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-07-25-mxml-3.3.1.html" />
		<id>https://www.msweet.org/blog/2022-07-25-mxml-3.3.1.html</id>
		<updated>2022-07-25T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 3.3.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 3.3.1 fixes a POSIX thread cleanup bug.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v3.3.1">Download Mini-XML 3.3.1</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.2.1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-05-26-pappl-1.2.1.html" />
		<id>https://www.msweet.org/blog/2022-05-26-pappl-1.2.1.html</id>
		<updated>2022-05-26T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.2.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.2.1 is now available for download and fixes some key issues with
localization, client limits, and compiling against older versions of CUPS.
Changes in 1.2.1 include:</p>

<ul>
  <li>Fixed a bug in the max-clients support code (Issue #205)</li>
  <li>Fixed compiler warnings (Issue #206, Issue #207)</li>
  <li>Fixed corruption in the English localization file.</li>
  <li>PAPPL didn’t compile against CUPS 2.2.6 and earlier.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.2.1">Download PAPPL v1.2.1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.16</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-05-19-htmldoc-1.9.16.html" />
		<id>https://www.msweet.org/blog/2022-05-19-htmldoc-1.9.16.html</id>
		<updated>2022-05-19T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.16</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.16 adds new time and date support and fixes bugs.  Changes include:</p>

<ul>
  <li>Added support for <code class="language-plaintext highlighter-rouge">$DATE(format)</code> and <code class="language-plaintext highlighter-rouge">$TIME(format)</code> header/footer strings
(Issue #472)</li>
  <li>Fixed a potential image overflow bug with JPEG and PNG images (Issue #471)</li>
  <li>Fixed potential heap overflow bugs with pages (Issue #477, Issue #478,
Issue #480, Issue #482, Issue #483)</li>
  <li>Fixed potential use-after-free in blocks (Issue #484)</li>
  <li>Updated the GNU TLS HTTPS support code to use a faster connection shutdown
mode (Issue #487)</li>
  <li>Fixed some minor Coverity warnings.</li>
  <li>Updated the GUI interface for current display fonts.</li>
</ul>

<p>Binaries are available from Github for Windows and macOS, and through the
Snapcraft store for Linux.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.16">Download HTMLDOC 1.9.16</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.16 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.2.0</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-05-15-pappl-1.2.0.html" />
		<id>https://www.msweet.org/blog/2022-05-15-pappl-1.2.0.html</id>
		<updated>2022-05-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.2.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.2.0 is now available for download.  PAPPL v1.2 adds full localization, support for additional IPP features, and some other improvements.  Changes in 1.2.0 include:</p>

<ul>
  <li>Added <code class="language-plaintext highlighter-rouge">papplMainloopShutdown</code> API to trigger a shutdown of the system that
was started by <code class="language-plaintext highlighter-rouge">papplMainloop</code>.</li>
  <li>Fixed mapping of MIME media types to IEEE-1284 Command Set values.</li>
  <li>Fixed a crash bug when no printers are added.</li>
  <li>Fixed compatibility issues with libcups3.</li>
  <li>The macOS menu extra did not update the list of available printers.</li>
  <li>No longer try to show the macOS menu extra when running from a root launchd
service (Issue #201)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.2.0">Download PAPPL v1.2.0</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HP Printer Application v1.2.0</title>
		<category term="hp-printer-app" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-05-15-hp-printer-app-1.2.0.html" />
		<id>https://www.msweet.org/blog/2022-05-15-hp-printer-app-1.2.0.html</id>
		<updated>2022-05-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HP Printer Application v1.2.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HP Printer Application v1.2.0 is now available for download as an “officially
supported” printer application for older PCL laser and inkjet printers.  Changes
in 1.2.0 include:</p>

<ul>
  <li>Fixed default listen address when running as a server (Issue #7)</li>
  <li>Fixed the media size list which prevented A4 from showing up (Issue #8)</li>
  <li>Fixed dropped connections in the web browser when switching to HTTPS
(Issue #9)</li>
  <li>Now offer more appropriate printer icons (Issue #10)</li>
  <li>Fixed a bug in the HP DeskJet driver (Issue #11)</li>
  <li>Fixed draft output (Issue #12)</li>
  <li>Fixed a crash bug when there was no default printer (Issue #14)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/hp-printer-app/releases/tag/v1.2.0">Download PAPPL v1.2.0</a>
<a class="btn btn-default" href="/hp-printer-app/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.2rc1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-05-03-pappl-1.2rc1.html" />
		<id>https://www.msweet.org/blog/2022-05-03-pappl-1.2rc1.html</id>
		<updated>2022-05-03T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.2rc1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.2rc1 is now available for download.  PAPPL v1.2 adds full localization, support for additional IPP features, and some other improvements.  Changes in 1.2rc1 include:</p>

<ul>
  <li>Added explicit support for running macOS printer applications as a server.</li>
  <li>Added unit test support for the new SNMP-based supply level and status monitoring code.</li>
  <li>Updated USB gadget code to not enable gadget until system is started or USB options are set.</li>
  <li>Updated default spool directory to use a persistent, per-user location.</li>
  <li>Fixed DNS-SD advertising when adding a printer from the web interface.</li>
  <li>Fixed double “Supplies” buttons in the web interface.</li>
  <li>Fixed human-readable location fields in web interfaces.</li>
  <li>Fixed an issue with the default system callback for <code class="language-plaintext highlighter-rouge">papplMainloop</code>.</li>
  <li>Fixed an issue with <code class="language-plaintext highlighter-rouge">papplDeviceList</code> and DNS-SD discovery when there was no active system.</li>
  <li>Fixed printer compatibility issues with the new <code class="language-plaintext highlighter-rouge">papplDeviceGetSupplies</code> API.</li>
  <li>Fixed some locking issues with the macOS menubar icon.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.2rc1">Download PAPPL v1.2rc1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.2b1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-04-23-pappl-1.2b1.html" />
		<id>https://www.msweet.org/blog/2022-04-23-pappl-1.2b1.html</id>
		<updated>2022-04-23T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.2b1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.2b1 is now available for download.  PAPPL v1.2 adds full localization, support for additional IPP features, and some other improvements.  Changes include:</p>

<ul>
  <li>Added macOS menubar icon/menu (Issue #27)</li>
  <li>Added support for localization, with base localizations for English, French, German, Italian, Japanese, and Spanish (Issue #58)</li>
  <li>Added interpolation when printing JPEG images or when using the <code class="language-plaintext highlighter-rouge">papplJobFilterImage</code> function with smoothing enabled (Issue #64)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">papplDeviceGetSupplies</code> API to query supply levels via SNMP (Issue #83)</li>
  <li>Added support for custom media sizes in millimeters (Issue #118)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">papplPrinterGet/SetMaxPreservedJobs</code> API and reprint web interface (Issue #189)</li>
  <li>Added IPP notifications support with <code class="language-plaintext highlighter-rouge">papplSystemAddEvent</code> and <code class="language-plaintext highlighter-rouge">papplSubscriptionXxx</code> functions (Issue #191)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">papplPrinterDisable</code> and <code class="language-plaintext highlighter-rouge">papplPrinterEnable</code> functions and proper support for the IPP “printer-is-accepting-jobs” attribute.</li>
  <li>Added OpenSSL/LibreSSL support (Issue #195)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">papplSystemGet/SetMaxClients</code> API (Issue #198)</li>
  <li>Updated <code class="language-plaintext highlighter-rouge">papplPrinterSetReadyMedia</code> to support up to <code class="language-plaintext highlighter-rouge">PAPPL_MAX_SOURCE</code> media entries, regardless of the number of sources.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.2b1">Download PAPPL v1.2b1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">StringsUtil v1.0</title>
		<category term="stringsutil" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-04-16-stringsutil-1.0.html" />
		<id>https://www.msweet.org/blog/2022-04-16-stringsutil-1.0.html</id>
		<updated>2022-04-16T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>StringsUtil v1.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>StringsUtil v1.0 is now available for download.  StringsUtil provides a library
for using Apple “.strings” localization files and a utility for managing those
files.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/stringsutil/releases/tag/v1.0">Download StringsUtil v1.0</a>
<a class="btn btn-primary" href="/stringsutil/index.html">Home Page</a>
<a class="btn btn-default" href="https://github.com/michaelrsweet/stringsutil">Github Project</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Announcing StringsUtil, a Strings File Library and Utility</title>
		<category term="stringsutil" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-04-14-introducing-stringsutil.html" />
		<id>https://www.msweet.org/blog/2022-04-14-introducing-stringsutil.html</id>
		<updated>2022-04-14T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Announcing StringsUtil, a Strings File Library and Utility</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>StringsUtil provides a library for using Apple “.strings” localization files and
a utility for managing those files.  It is intended as a free, smaller,
embeddable, and more flexible alternative to GNU gettext.  Key features include:</p>

<ul>
  <li>Support for localizing using both Apple “.strings” and GNU gettext “.po”
files.</li>
  <li>Simple C/C++ library with support for embedding localization data in an
executable and/or loading localizations from external files.</li>
  <li>Tools for exporting, importing, and merging localization files.</li>
  <li>Tool for reporting on the quality of a localization.</li>
  <li>Tool for scanning C/C++ source files for localization strings.</li>
  <li><em>Coming Soon</em>: Tool for doing a first pass machine translation.</li>
</ul>

<p>I’m providing StringsUtil under the Apache License Version 2.0 with an
(optional) exception to allow linking against GPL2/LGPL2 software.</p>

<p><a class="btn btn-primary" href="/stringsutil/index.html">Home Page</a>
<a class="btn btn-default" href="https://github.com/michaelrsweet/stringsutil">Github Project</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.0.1</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-03-02-pdfio-1.0.1.html" />
		<id>https://www.msweet.org/blog/2022-03-02-pdfio-1.0.1.html</id>
		<updated>2022-03-02T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.0.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.0.1 is a bug fix release. Changes include:</p>

<ul>
  <li>Added missing <code class="language-plaintext highlighter-rouge">pdfioPageGetNumStreams</code> and <code class="language-plaintext highlighter-rouge">pdfioPageOpenStream</code> functions.</li>
  <li>Added demo pdfiototext utility.</li>
  <li>Fixed bug in <code class="language-plaintext highlighter-rouge">pdfioStreamGetToken</code>.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.0.1">Download PDFio v1.0.1</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.9</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-03-01-mmd-1.9.html" />
		<id>https://www.msweet.org/blog/2022-03-01-mmd-1.9.html</id>
		<updated>2022-03-01T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.9</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> adds support for task lists as well as resolving a few
minor issues reported by the Clang static code analysis tool.  Changes include:</p>

<ul>
  <li>Added support for the Github-flavored markdown task list extension (check
boxes in lists)</li>
  <li>Addressed some issues found by the Clang static analyzer.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.9">Download mmd 1.9</a>
<a class="btn btn-default" href="https://snapcraft.io/mmdutil">Install mmdutil 1.9 Snap</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC Now Available on Flathub</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-02-09-htmldoc-flathub.html" />
		<id>https://www.msweet.org/blog/2022-02-09-htmldoc-flathub.html</id>
		<updated>2022-02-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC Now Available on Flathub</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC is now available on Flathub, another Linux app store.</p>

<p>Enjoy!</p>

<p><a class="btn btn-default" href="https://flathub.org/apps/details/org.msweet.htmldoc">Install HTMLDOC 1.9.15 from Flathub</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.15</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2022-02-05-htmldoc-1.9.15.html" />
		<id>https://www.msweet.org/blog/2022-02-05-htmldoc-1.9.15.html</id>
		<updated>2022-02-05T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.15</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.15 is a bug fix release.  Changes include:</p>

<ul>
  <li>Fixed a potential heap overflow bug with GIF images (Issue #461)</li>
  <li>Fixed a potential double-free bug with PNG images (Issue #462)</li>
  <li>Fixed a potential stack overflow bug with GIF images (Issue #463)</li>
  <li>Fixed a potential heap underflow bug with empty attributes (Issue #464)</li>
  <li>Fixed a potential stack overflow bug with BMP images (Issue #466)</li>
  <li>Fixed a potential heap overflow bug with the table-of-contents (Issue #467)</li>
  <li>Fixed a potential heap overflow bug with headings (Issue #468)</li>
  <li>Fixed a potential stack overflow bug with GIF images (Issue #470)</li>
</ul>

<p>Binaries are available from Github for Windows and macOS, and through the
Snapcraft store for Linux.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.15">Download HTMLDOC 1.9.15</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.15 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">LPrint v1.1.0</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-12-23-lprint-1.1.0.html" />
		<id>https://www.msweet.org/blog/2021-12-23-lprint-1.1.0.html</id>
		<updated>2021-12-23T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>LPrint v1.1.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>LPrint v1.1.0 adds support for EPL and 600dpi ZPL label printers, adds status reporting and automatic label configuration for ZPL label printers, adds auto-setup and test labels for printers, adds system service files for macOS and Linux, and fixes all known bugs in the previous release.  Changes include:</p>

<ul>
  <li>Switched to PAPPL (Issue #20, #35)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">lprint default</code> and <code class="language-plaintext highlighter-rouge">lprint delete</code> not working (Issue #17, Issue #40)</li>
  <li>Fixed server crashes on <code class="language-plaintext highlighter-rouge">SIGINT</code> (Issue #18)</li>
  <li>Fixed the reported date and time information when no printers were added (Issue #26)</li>
  <li>Fixed a startup bug on macOS (Issue #34)</li>
  <li>Now support auto-detection of printer drivers and auto-add USB printers the first time LPrint is run.</li>
  <li>Added the missing macOS binary package (Issue #33)</li>
  <li>Added launchd and systemd service files for running lprint as a service.</li>
  <li>Added support for Zebra/Eltron EPL2 printers (Issue #38)</li>
  <li>Added support for 600dpi ZPL thermal transfer printers.</li>
  <li>Added support for ZPL status/ready media updates.</li>
  <li>Added support for test pages.</li>
  <li>Temporarily removed support for DYMO LabelWriter Wireless printer (Issue #23)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint/releases/tag/v1.1.0">Download LPrint 1.1.0</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.14</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-12-22-htmldoc-1.9.14.html" />
		<id>https://www.msweet.org/blog/2021-12-22-htmldoc-1.9.14.html</id>
		<updated>2021-12-22T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.14</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.14 is a bug fix release.  Changes include:</p>

<ul>
  <li>BMP image support is now deprecated and will be removed in a future
release of HTMLDOC.</li>
  <li>Fixed a potential stack overflow bug with GIF images.</li>
  <li>Fixed the PDF creation date (Issue #455)</li>
  <li>Fixed a potential stack overflow bug with BMP images (Issue #456)</li>
  <li>Fixed a compile issue when libpng was not available (Issue #458)</li>
</ul>

<p>Binaries are available from Github for Windows and macOS, and through the
Snapcraft store for Linux.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.14">Download HTMLDOC 1.9.14</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.14 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.1.0</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-12-15-pappl-1.1.0.html" />
		<id>https://www.msweet.org/blog/2021-12-15-pappl-1.1.0.html</id>
		<updated>2021-12-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.1.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.1.0 is now available for download.  PAPPL v1.1 adds support for Wi-Fi
configuration, IPP-USB, printer driver lookup and auto-add functionality,
improves management of multiple printers, and adds support for Microsoft®
Windows® 10 and higher.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.1.0">Download PAPPL v1.1.0</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.0.0</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-12-14-pdfio-1.0.0.html" />
		<id>https://www.msweet.org/blog/2021-12-14-pdfio-1.0.0.html</id>
		<updated>2021-12-14T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.0.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The first stable release of PDFio is now available!  PDFio is a simple C library
for reading and writing PDF files.  The primary goals of PDFio are:</p>

<ul>
  <li>Read and write any version of PDF file</li>
  <li>Provide access to pages, objects, and streams within a PDF file</li>
  <li>Support reading and writing of encrypted PDF files</li>
  <li>Extract or embed useful metadata (author, creator, page information, etc.)</li>
  <li>“Filter” PDF files, for example to extract a range of pages or to embed fonts
that are missing from a PDF</li>
  <li>Provide access to objects used for each page</li>
</ul>

<p>PDFio is <em>not</em> concerned with rendering or viewing a PDF file, although a PDF
RIP or viewer could be written using it.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.0.0">Download PDFio v1.0.0</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.0rc1</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-11-30-pdfio-1.0rc1.html" />
		<id>https://www.msweet.org/blog/2021-11-30-pdfio-1.0rc1.html</id>
		<updated>2021-11-30T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.0rc1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.0rc1 is the first candidate release of PDFio. Changes include:</p>

<ul>
  <li>Fixed a few stack/buffer overflow bugs discovered via fuzzing.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.0rc1">Download PDFio v1.0rc1</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.1rc1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-11-22-pappl-1.1rc1.html" />
		<id>https://www.msweet.org/blog/2021-11-22-pappl-1.1rc1.html</id>
		<updated>2021-11-22T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.1rc1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The release candidate for PAPPL v1.1 is now available for download.  PAPPL v1.1
adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-
add functionality, improves management of multiple printers, and adds support
for Microsoft® Windows® 10 and higher.</p>

<p>Changes in 1.1rc1 include:</p>

<ul>
  <li>Fixed a bug in the printer configuration web page.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.1rc1">Download PAPPL v1.1rc1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.0b2</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-11-07-pdfio-1.0b2.html" />
		<id>https://www.msweet.org/blog/2021-11-07-pdfio-1.0b2.html</id>
		<updated>2021-11-07T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.0b2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.0b2 is the second beta release of PDFio. Changes include:</p>

<ul>
  <li>Added <code class="language-plaintext highlighter-rouge">pdfioFileCreateOutput</code> API to support streaming output of PDF (Issue #21)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">all-shared</code> target (Issue #22)</li>
  <li>Fixed memory leaks (Issue #23)</li>
  <li>Updated <code class="language-plaintext highlighter-rouge">pdfioContentSetDashPattern</code> to accept <code class="language-plaintext highlighter-rouge">double</code> values (Issue #25)</li>
  <li>Added support for reading and writing encrypted PDFs (Issue #26)</li>
  <li>Fixed some issues identified by a Coverity scan.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.0b2">Download PDFio v1.0b2</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 3.3</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-11-06-mxml-3.3.html" />
		<id>https://www.msweet.org/blog/2021-11-06-mxml-3.3.html</id>
		<updated>2021-11-06T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 3.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 3.3 is a bug fix release. Changes include:</p>

<ul>
  <li>Cleaned up usage of <code class="language-plaintext highlighter-rouge">free</code> throughout the library (Issue #276)</li>
  <li>Added more error handling to the library (Issue #277)</li>
  <li>Fixed potential memory leak in <code class="language-plaintext highlighter-rouge">mxmlLoad*</code> functions (Issue #278, Issue #279)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">mxmlSaveString</code> with a buffer size of 0 (Issue #284)</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">MXML_MINOR_VERSION</code> value in “mxml.h” (Issue #285)</li>
  <li>Fixed POSIX threading support for MingW (Issue #287)</li>
  <li>Fixed some minor memory leaks found by Coverity.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v3.3">Download Mini-XML 3.3</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.13</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-11-05-htmldoc-1.9.13.html" />
		<id>https://www.msweet.org/blog/2021-11-05-htmldoc-1.9.13.html</id>
		<updated>2021-11-05T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.13</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.13 is a bug fix release.  Changes include:</p>

<ul>
  <li>Now install a 32x32 icon for Linux (Issue #432)</li>
  <li>Fixed an issue with large values for roman numerals and letters in headings
(Issue #433)</li>
  <li>Fixed a crash bug when a HTML comment contains an invalid nul character
(Issue #439)</li>
  <li>Fixed a crash bug with bogus BMP images (Issue #444)</li>
  <li>Fixed a potential heap overflow bug with bogus GIF images (Issue #451)</li>
  <li>Fixed a potential stack overflow bug with bogus BMP images (Issue #453)</li>
</ul>

<p>Binaries are available from Github for Windows and macOS, and through the
Snapcraft store for Linux.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.13">Download HTMLDOC 1.9.13</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.13 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.1b3</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-11-04-pappl-1.1b3.html" />
		<id>https://www.msweet.org/blog/2021-11-04-pappl-1.1b3.html</id>
		<updated>2021-11-04T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.1b3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The third beta release of PAPPL v1.1 is now available for download.  PAPPL v1.1
adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-
add functionality, improves management of multiple printers, and adds support
for Microsoft® Windows® 10 and higher.</p>

<p>Changes in 1.1b3 include:</p>

<ul>
  <li>Added a new <code class="language-plaintext highlighter-rouge">papplSystemSetAuthCallback</code> API to support alternate authentication
mechanisms (Issue #185)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">papplCreateTempFile</code> and <code class="language-plaintext highlighter-rouge">papplPrinterOpenFile</code> file creation functions
(Issue #186)</li>
  <li>Added support for a <code class="language-plaintext highlighter-rouge">server-options</code> option for the <code class="language-plaintext highlighter-rouge">server</code> sub-command (Issue #187)</li>
  <li>Added an optional callback for processing USB gadget print data.</li>
  <li>Added <code class="language-plaintext highlighter-rouge">papplCopyString</code>, <code class="language-plaintext highlighter-rouge">papplGetRand</code>, and <code class="language-plaintext highlighter-rouge">papplGetTempDir</code> utility
functions.</li>
  <li>Calling <code class="language-plaintext highlighter-rouge">papplSystemSetHostName</code> did not also update the default TLS common
name.</li>
  <li>Now map <code class="language-plaintext highlighter-rouge">file:///dev/null</code> to <code class="language-plaintext highlighter-rouge">NUL:</code> on Windows.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.1b3">Download PAPPL v1.1b3</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.1b2</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-09-24-pappl-1.1b2.html" />
		<id>https://www.msweet.org/blog/2021-09-24-pappl-1.1b2.html</id>
		<updated>2021-09-24T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.1b2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The second beta release of PAPPL v1.1 is now available for download.  PAPPL v1.1
adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-
add functionality, improves management of multiple printers, and adds support
for Microsoft® Windows® 10 and higher.</p>

<p>Changes in 1.1b2 include:</p>

<ul>
  <li>Added support for <code class="language-plaintext highlighter-rouge">papplDeviceGetID</code> with network devices (Issue #95)</li>
  <li>Added support for the “compression” option.</li>
  <li>Added English names for Tabloid and A3 media sizes in the web interface.</li>
  <li>Added “server-hostname” and “listen-hostname” server options to the default
mainloop system callback.</li>
  <li>Fixed support for default printers, added indicator in web interface
(Issue #182)</li>
  <li>Fixed support for printers with spaces in their names.</li>
  <li>Fixed the “jobs” subcommand.</li>
  <li>Fixed support for page-ranges.</li>
  <li>Fixed support for printers that do PDF beyond converting it to raster.</li>
  <li>Fixed support for mainloop subcommands on Windows.</li>
  <li>Fixed error message when Bonjour for Windows is not installed.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.1b2">Download PAPPL v1.1b2</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">OpenPrinting at the Linux Plumber's Conference</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-09-21-openprinting-lpc.html" />
		<id>https://www.msweet.org/blog/2021-09-21-openprinting-lpc.html</id>
		<updated>2021-09-21T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>OpenPrinting at the Linux Plumber's Conference</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The OpenPrinting group of the Linux Foundation had a session at the 2021
(virtual) Linux Plumber’s Conference yesterday. I led a discussion about the
upcoming CUPS 2.4 release, next year’s planned CUPS 2.5 release, and 2023’s
planned CUPS 3.0 release which will (finally) eliminate printer drivers on
Linux. Till presented developments in printer management and packaging on Linux,
print dialogs, and printer applications. And Bhavna talked about her Google
Summer of Code work to extend PAPPL with scanning support.</p>

<iframe class="video" src="https://www.youtube.com/embed/5KogjLb1Hb4" title="YouTube video player" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Version Numbering</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-09-01-version-numbers.html" />
		<id>https://www.msweet.org/blog/2021-09-01-version-numbers.html</id>
		<updated>2021-09-01T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Version Numbering</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>I recently got some push-back on my latest beta releases, specifically on the
format of my version numbers (1.0b1 for PDFio, and 1.1b1 for PAPPL).  I’ve been
using this scheme for many years now, and it is hardly unique. What follows is
a short summary of the history, standards, and best practices for version
numbers…</p>

<!--more-->

<h2 id="some-history">Some History</h2>

<p>Version numbering has long been a source of pain in software.  Early programs
either lacked version numbers or used integers (“version 1”, “version 2”, etc.)
to identify some release.  Bug fixes often turned these integers into real
numbers (1.01, 1.02, etc.) where a newer version was numerically greater than
the older version (1.01 is older than 1.1, etc.)</p>

<p>A modified version of this scheme gradually replaced real number versioning
where two or more integers separated by periods represented a version number,
for example 1.0 was the first release of (major) version 1, 1.1 was the second
release, and so forth. Bug fixes (patches) yielded a third number - 1.0.1,
1.0.2, etc.  The notion of alpha-, beta-, and pre-release software became a
thing with all sorts of formats - 1.0b1, 1.0-pre1, etc.  Then developers got
<em>serious</em> and declared <em>release candidates</em> and <em>golden masters</em>!</p>

<p>Large companies started tracking <em>build numbers</em> in addition to public version
numbers. For example, Apple uses a numbering scheme that can be roughly
translated as “majorMINORbuildPATCH”, where “major” is an integer representing
the internal major release number, “MINOR” is an uppercase letter (A=0, B=1,
C=2, …) representing a minor update to that major release, “build” is an
integer representing the number of times that “build train” (branch) has been
built, and “PATCH” is a lowercase letter (omitted for the first build)
representing the number of times a build had to be patched (components rolled
back and the combined build re-tested) to yield a functional build.  Thus, the
current macOS® 12.0 Beta 6 has a version number of “21A5294g” - major version
21, minor version 0, build number 5294, patch 7.</p>

<p>This last wrinkle demonstrates an important distinction - there are version
numbers that are used for human consumption (“macOS 12”) and version numbers
that are used for computers (“21A5294g”).  Some packaging schemes define rules
for comparing version number strings, while others provide explicit ways to
assign sequences or values for comparison.</p>

<h2 id="standards">Standards</h2>

<p>Of course, eventually people got together to define
<a href="https://xkcd.com/927/">standards</a>.  In the open source community, the
<a href="https://semver.org">Semantic Versioning</a> standard is quite popular, although
most Linux packaging systems don’t exactly conform (more below).</p>

<p>The <a href="https://en.wikipedia.org/wiki/Trusted_Network_Connect">Trusted Network Connect</a>
standard defines version numbers as a set of four 16-bit unsigned integers that
can effectively be compared as a single 64-bit value or treated as four
separated integers, e.g. <code class="language-plaintext highlighter-rouge">MAJOR.MINOR.PATCH+BUILD</code> for display/interoperability
purposes.  This has trickled down to IPP and other standards.</p>

<p><a href="https://snapcraft.io">Snapcraft</a> packages can have any version number string
they like.  Snaps are tracked by their build numbers which are (manually)
assigned to stable, candidate, beta, and edge (as in “bleeding edge”) releases
that users can install.</p>

<h2 id="where-it-all-falls-apart">Where It All Falls Apart</h2>

<p>Most of the version numbering standards focus on identifying <em>production</em>
code.  As I mentioned at the top of this article, I’ve been using more-or-less
standard suffixes to identify beta (<code class="language-plaintext highlighter-rouge">MAJOR.MINORbNUMBER</code>) and release candidate
(<code class="language-plaintext highlighter-rouge">MAJOR.MINORrcNUMBER</code>) source archives that allow developers to try my new
software out and report any issues they encounter, but I don’t expect this
software to be released to the general public as it is <em>not yet</em> production
code.  But if a developer does choose to package it up, most of the traditional
Linux packaging formats (RPM, Debian, Slackware, etc.) will treat <code class="language-plaintext highlighter-rouge">1.0b1</code> as
older than <code class="language-plaintext highlighter-rouge">1.0.0</code> so the right thing will happen when I release 1.0.0 and the
developer packages <em>that</em> code.</p>

<p>The Semantic Versioning specification gives lip-service to supporting
so-called “pre-release” suffixes (<code class="language-plaintext highlighter-rouge">1.0.0-alpha1</code>, <code class="language-plaintext highlighter-rouge">1.0.0-beta.2</code>, etc.) but it
is up to you (i.e., not standardized) to define the meaning of the names.
Common suffixes are “alpha”, “beta”, “pre”, and “rc” - it is just important to
keep the names you use in lexical sort order so that the version number
comparisons work as expected.  Alas, none of the Linux package formats actually
support Semantic Versioning suffixes, so that <code class="language-plaintext highlighter-rouge">1.0.0-beta.1</code> to <code class="language-plaintext highlighter-rouge">1.0.0</code> upgrade
won’t actually happen…</p>

<p>The TNC-style four number version tuple is even less flexible - there is
literally no way to express a beta release.  More than likely you’ll end up
using the last number as a build number and (internally) decide when you have
a final build for a particular MAJOR.MINOR.PATCH version.</p>

<h2 id="recommendations">Recommendations</h2>

<p>With 30+ years of software development experience I can make the following
recommendations:</p>

<ol>
  <li>
    <p>Define a version numbering scheme that works for your project, and use it
consistently.  This scheme naturally may depend on where you plan to release
your software.</p>
  </li>
  <li>
    <p>If you distribute binaries, build numbers are an important part of your
software version number.  Automate the build number whenever possible, for
example <code class="language-plaintext highlighter-rouge">git rev-list --all --count</code> will give you the number of commits
pushed to the Git repository used by your build system.</p>
  </li>
  <li>
    <p>If you distribute APIs, don’t remove APIs in minor or patch releases.  If
you have to remove an API, it is time for a major version number change.</p>
  </li>
</ol>

<p>Version numbering is an important part of your software development plan.
You should have a software development plan whether you are developing software
by yourself or as part of a large team.  It can even be written down on the back
of a napkin during lunch…</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.1b1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-08-31-pappl-1.1b1.html" />
		<id>https://www.msweet.org/blog/2021-08-31-pappl-1.1b1.html</id>
		<updated>2021-08-31T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.1b1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The first beta release of PAPPL v1.1 is now available for download.  PAPPL v1.1
adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-
add functionality, improves management of multiple printers, and adds support
for Microsoft® Windows® 10 and higher.</p>

<p>Changes in 1.1b1 include:</p>

<ul>
  <li>Added support for Windows 10 and higher.</li>
  <li>Added <code class="language-plaintext highlighter-rouge">PAPPL_SOPTIONS_NO_TLS</code> option to disable TLS support.</li>
  <li>Added Wi-Fi callbacks to support configuration over IPP-USB (Issue #45)</li>
  <li>Added buttons and sub-commands to pause and resume printers (Issue #124)</li>
  <li><code class="language-plaintext highlighter-rouge">papplMainLoop</code> now uses a persistent location for state and spool files by
default (Issue #128)</li>
  <li><code class="language-plaintext highlighter-rouge">papplMainLoop</code> now supports clients talking to a system-wide server running
as root (Issue #148)</li>
  <li>Added a “set default” button to the web interface (Issue #150)</li>
  <li>The <code class="language-plaintext highlighter-rouge">drivers</code> sub-command now reports the IEEE-1284 device ID for a given
driver (Issue #157)</li>
  <li>Jobs can now be canceled and printers deleted when a processing job is trying
to connect to a printer (Issue #163)</li>
  <li>The default media is now updated if the ready media for a given tray is
updated (Issue #164)</li>
  <li>Fixed an issue with the “drivers” sub-command not working if you don’t have a
system callback.</li>
  <li>Fixed a deadlock issue on macOS.</li>
  <li>Added a new <code class="language-plaintext highlighter-rouge">papplJobCreateWithFile</code> API to allow printer applications to
submit print jobs internally.</li>
  <li>Refactored the <code class="language-plaintext highlighter-rouge">papplSystem</code> hostname/port APIs to be consistent with the
naming used for the <code class="language-plaintext highlighter-rouge">papplClient</code> APIs.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.1b1">Download PAPPL v1.1b1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PDFio 1.0b1</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-08-30-pdfio-1.0b1.html" />
		<id>https://www.msweet.org/blog/2021-08-30-pdfio-1.0b1.html</id>
		<updated>2021-08-30T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PDFio 1.0b1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio 1.0b1 is the first beta release of PDFio.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pdfio/releases/tag/v1.0b1">Download PDFio v1.0b1</a>
<a class="btn btn-primary" href="/pdfio/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Ubuntu Desktop Team Indaba</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-08-27-indaba4.html" />
		<id>https://www.msweet.org/blog/2021-08-27-indaba4.html</id>
		<updated>2021-08-27T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Ubuntu Desktop Team Indaba</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>I had the privilege of being a guest with Till Kamppeter on this month’s <a href="https://www.youtube.com/watch?v=P22DOu_ahBo">Ubuntu Desktop Team Indaba</a> to talk about open source printing - the early history, where we are today, and where we are headed. Be sure to check out the video and the <a href="https://openprinting.github.io">OpenPrinting</a> web sites for more information and links to all of the projects that are being worked on.</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">RasterView 1.8</title>
		<category term="rasterview" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-07-17-rasterview-1.8.html" />
		<id>https://www.msweet.org/blog/2021-07-17-rasterview-1.8.html</id>
		<updated>2021-07-17T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>RasterView 1.8</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>RasterView 1.8 includes some minor improvements and bug fixes.  Changes include:</p>

<ul>
  <li>Fixed HiDPI support on Linux (Issue #11)</li>
  <li>Fixed macOS 11 (Big Sur) issues (Issue #15)</li>
  <li>Can now view page bitmaps up to 2GB in size (Issue #16)</li>
  <li>Color picker mode now copies the hex RGB color to the clipboard.</li>
  <li>Zoom gestures are now supported on macOS.</li>
  <li>Addressed a few warnings from LGTM.</li>
  <li>Fixed macOS bundle information and now provide fat binaries for Intel and
Apple Silicon.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.8">Download RasterView 1.8</a>
<a class="btn btn-default" href="https://snapcraft.io/rasterview">Install RasterView 1.8 Snap</a>
<a class="btn btn-default" href="/rasterview/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Announcing PDFio, a Simple PDF Read/Write Library</title>
		<category term="pdfio" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-05-30-introducing-pdfio.html" />
		<id>https://www.msweet.org/blog/2021-05-30-introducing-pdfio.html</id>
		<updated>2021-05-30T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Announcing PDFio, a Simple PDF Read/Write Library</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PDFio is a simple C library for reading and writing PDF files. I’ve been working on it sporadically for the last few weeks to prototype some new printing features and support a future version of HTMLDOC. The primary goals of PDFio are:</p>

<ul>
  <li>Read and write any version of PDF file</li>
  <li>Provide access to pages, objects, and streams within a PDF file</li>
  <li>Support reading encrypted PDF files</li>
  <li>Support writing PDF files with digital signatures</li>
  <li>Extract or embed useful metadata (author, creator, page information, etc.)</li>
  <li>“Filter” PDF files, for example to extract a range of pages or to embed fonts
that are missing from a PDF</li>
  <li>Provide access to objects used for each page</li>
</ul>

<p>PDFio is <em>not</em> concerned with rendering or viewing a PDF file, although a PDF RIP or viewer could be written using it. And while it is far from complete, the current code is sufficient to manipulate PDF files and create page content.</p>

<p>I’m providing PDFio under the Apache License Version 2.0 with an (optional) exception to allow linking against GPL2/LGPL2 software.</p>

<p><a class="btn btn-primary" href="/pdfio/index.html">Home Page</a>
<a class="btn btn-default" href="https://github.com/michaelrsweet/pdfio">Github Project</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.12</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-05-17-htmldoc-1.9.12.html" />
		<id>https://www.msweet.org/blog/2021-05-17-htmldoc-1.9.12.html</id>
		<updated>2021-05-17T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.12</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.12 is a bug fix release.  Changes include:</p>

<ul>
  <li>Fixed a crash bug with “data:” URIs and EPUB output (Issue #410)</li>
  <li>Fixed crash bugs for books (Issue #412, Issue #414)</li>
  <li>Fixed a number-up crash bug (Issue #413)</li>
  <li>Fixed JPEG error handling (Issue #415)</li>
  <li>Fixed crash bugs with bogus table attributes (Issue #416, Issue #417)</li>
  <li>Fixed a crash bug with malformed URIs (Issue #418)</li>
  <li>Fixed a crash bug with malformed GIF files (Issue #423)</li>
  <li>Fixed a crash bug with empty titles (Issue #425)</li>
  <li>Fixed crash bugs with bogus text (Issue #426, Issue #429, Issue #430,
Issue #431)</li>
  <li>Fixed some issues reported by Coverity.</li>
  <li>Removed the bundled libjpeg, libpng, and zlib.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.12">Download HTMLDOC 1.9.12</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.12 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.0.3</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-04-21-pappl-1.0.3.html" />
		<id>https://www.msweet.org/blog/2021-04-21-pappl-1.0.3.html</id>
		<updated>2021-04-21T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.0.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.0.3 is a general bug fix release and is now available for download.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.0.3">Download PAPPL v1.0.3</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

<!--more-->

<p>Changes in 1.0.3 include:</p>

<ul>
  <li>The Set-Printer-Attributes operation did not save changes to
“printer-contact-col”.</li>
  <li>Fixed using the “auto” driver without an IEEE-1284 device ID string
(Issue #154)</li>
  <li>Fixed some more threading issues (Issue #155, Issue #162)</li>
  <li>Fixed bogus USB error reporting (Issue #156)</li>
  <li>Fixed testpappl on systems without Avahi running (Issue #159)</li>
  <li>Adding a printer now works for names with special characters (Issue #161)</li>
</ul>

<p>Enjoy!</p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.0.2</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-02-20-pappl-1.0.2.html" />
		<id>https://www.msweet.org/blog/2021-02-20-pappl-1.0.2.html</id>
		<updated>2021-02-20T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.0.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.0.2 is a general bug fix release and is now available for download.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.0.2">Download PAPPL v1.0.2</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

<!--more-->

<p>Changes in 1.0.2 include:</p>

<ul>
  <li>Documentation updates (Issue #140)</li>
  <li>The Set-Printer-Attributes operation now properly validates the values of
“xxx-default” attributes (Issue #93)</li>
  <li>Changes to ready (loaded) media are now validated (Issue #94)</li>
  <li>The <code class="language-plaintext highlighter-rouge">papplSystemSetVersions</code> function now allows changes while the system is
running (Issue #123)</li>
  <li>The printing defaults page no longer shows a media chooser when there is a
single source (Issue #125)</li>
  <li>The DNS-SD support functions did not handle when the Avahi daemon is not
running (Issue #129)</li>
  <li>The printing defaults web page now reports whether the media is borderless
(Issue #138)</li>
  <li>The <code class="language-plaintext highlighter-rouge">papplClientGetForm</code> function did not support files larger than 64k
(Issue #139)</li>
  <li>Deleting and adding a printer with the same name will cause a crash
(Issue #141)</li>
  <li>Fixed a deadlock issue when calling the <code class="language-plaintext highlighter-rouge">papplPrinterSet...</code> functions from
an iterator callback (Issue #143)</li>
  <li>The “Printing Defaults” web page did not show an error message if the
defaults could not be validated (Issue #146)</li>
  <li>The <code class="language-plaintext highlighter-rouge">server</code> sub-command now enables TCP/IP connections using the default
hostname; auto-started servers still disable TCP/IP connections by default
(Issue #147)</li>
  <li>The <code class="language-plaintext highlighter-rouge">papplPrinterSetDriverDefaults</code> function did not validate the defaults
against the actual driver data.</li>
  <li>The IPP interface no longer allows the Create-Printer operation for single
queue applications.</li>
  <li>Stopping a printer application with <code class="language-plaintext highlighter-rouge">SIGTERM</code> now behaves the same as sending
a Shutdown-System request.</li>
  <li>Added more unit tests to testpappl.</li>
  <li>Added better management of the USB and raw printing threads for each printer.</li>
  <li>Added better error reporting for USB printers.</li>
  <li><code class="language-plaintext highlighter-rouge">papplDeviceOpen</code> did not copy the device ID callback.</li>
  <li><code class="language-plaintext highlighter-rouge">papplDeviceList</code> and <code class="language-plaintext highlighter-rouge">papplDeviceOpen</code> did not send errors to stderr when a
<code class="language-plaintext highlighter-rouge">NULL</code> error callback was specified.</li>
</ul>

<p>Enjoy!</p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.0.1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-01-12-pappl-1.0.1.html" />
		<id>https://www.msweet.org/blog/2021-01-12-pappl-1.0.1.html</id>
		<updated>2021-01-12T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.0.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL v1.0.1 is a general bug fix release and is now available for download.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.0.1">Download PAPPL v1.0.1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

<!--more-->

<p>Changes in 1.0.1 include:</p>

<ul>
  <li>Documentation updates (Issue #105)</li>
  <li>The <code class="language-plaintext highlighter-rouge">papplSystemLoadState</code> function did not load vendor attribute defaults
correctly (Issue #103)</li>
  <li>Vendor options without “xxx-supported” attributes are no longer shown on the
printing defaults page (Issue #104)</li>
  <li>Added support for Windows 10/Mopria clients that incorrectly convert the
printer resource path to lowercase (Issue #106)</li>
  <li>The <code class="language-plaintext highlighter-rouge">papplSystemLoadState</code> function now calls the printer driver’s status
callback after loading the printer’s attributes (Issue #107)</li>
  <li>Added additional error handling for memory allocations throughout the library
(Issue #113)</li>
  <li>Fixed an issue with validation of custom media sizes (Issue #120)</li>
  <li>Partially-discovered SNMP printers would cause a crash (Issue #121)</li>
  <li>The “copies-supported” attribute was not report correctly.</li>
  <li>Job operations that targeted a non-existent job yielded the wrong status code.</li>
  <li>Printing a test page from the web interface did not trigger a reload to update
the printer and job state.</li>
  <li>The TLS web page was hardcoded to use “/etc/cups” for the CUPS server root.</li>
  <li>Fixed file output when the job name contains a ‘/’.</li>
  <li>Updated 1-bit driver output to support “photo” dither array for high print
quality.</li>
  <li>PAPPL now (re)creates the spool directory as needed.</li>
  <li>Coverity: Added missing NULL checks.</li>
  <li>Coverity: Fixed file descriptor leaks.</li>
  <li>Coverity: Fixed some locking issues.</li>
  <li>Coverity: Fixed printer-darkness-configured bug in <code class="language-plaintext highlighter-rouge">papplSystemSaveState</code>.</li>
  <li>Coverity: Fixed an error handling bug in the file printing code for the PWG
test driver.</li>
  <li>Coverity: Removed dead code.</li>
</ul>

<p>Enjoy!</p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">zipc v1.3</title>
		<category term="zipc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-01-09-zipc-1.3.html" />
		<id>https://www.msweet.org/blog/2021-01-09-zipc-1.3.html</id>
		<updated>2021-01-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>zipc v1.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p><code class="language-plaintext highlighter-rouge">zipc</code> v1.3 is a bug fix release. Changes include:</p>

<ul>
  <li>Fixed some issues when building using Visual Studio.</li>
  <li>Switched to using <code class="language-plaintext highlighter-rouge">localtime_r/s</code> to avoid potential thread safety issues.</li>
  <li>Fixed some issues reported by Coverity.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/zipc/releases/tag/v1.3">Download zipc v1.3</a>
<a class="btn btn-default" href="/zipc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.8</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2021-01-04-mmd-1.8.html" />
		<id>https://www.msweet.org/blog/2021-01-04-mmd-1.8.html</id>
		<updated>2021-01-04T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.8</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> fixes a link parsing bug as well as resolving several
minor issues reported by various static code analysis tools.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.8">Download mmd 1.8</a>
<a class="btn btn-default" href="https://snapcraft.io/mmdutil">Install mmdutil 1.8 Snap</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Markdown of the form <code class="language-plaintext highlighter-rouge">([title](link))</code> did not parse correctly.</li>
  <li>Addressed an issue identified by the LGTM code scanner.</li>
  <li>Addressed some issues identified by the Cppcheck code scanner.</li>
  <li>Addressed some issues identified by the Coverity code scanner.</li>
  <li>Changed the makefile to only run the unit test program when using the “test”
target.</li>
  <li>Added a Cppcheck target (“cppcheck”) to use this code scanning program against
the <code class="language-plaintext highlighter-rouge">mmd</code> sources.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">How I Improve My (C) Code Quality</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-12-31-how-i-improve-my-c-code-quality.html" />
		<id>https://www.msweet.org/blog/2020-12-31-how-i-improve-my-c-code-quality.html</id>
		<updated>2020-12-31T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>How I Improve My (C) Code Quality</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>I periodically get bug reports and pull requests concerning the quality or
patterns in my code.  While some of my projects provide some documentation on
the coding standards and tools I use, I’ve never bothered to write this up
before.  So here is a snapshot of my strategy for producing quality C code that
I have honed over the last 35 years (!) of writing C.</p>

<!--more-->

<h1 id="documentation-and-style">Documentation and Style</h1>

<p>I know plenty of programmers who think that documentation is not their job, that
“comments are for wusses”, that hard-to-read code is job security, or that “I
don’t have enough time to write documentation”. I personally think those
attitudes are the number one problem with most coding today.</p>

<p>Consider the following two code examples - the first provides no clue about the
purpose of the function, arguments, or variables and would be difficult to
maintain while the second makes everything obvious from the naming. The names of
functions, structures, etc. should be obvious so that other code that calls them
is easier to follow as well. Imagine looking at another function in your program
that calls <code class="language-plaintext highlighter-rouge">a(1,10);</code> and wondering what the heck <em>that</em> does!</p>

<p>There are also differences in formatting between the two examples that help with
the readability and maintenance of the code. I’m not going to advocate for a
particular coding style, and the second example isn’t even the one <em>I</em> use. The important thing is to choose a style that works for you and be consistent!
Remember, even if <em>you</em> are the only person that will be maintaining the code,
you will still need to remember what the heck you were doing in one, two, or
ten years!</p>

<p><em>“Bad” Code Example:</em></p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">a</span><span class="p">(</span><span class="kt">int</span> <span class="n">b</span><span class="p">,</span> <span class="kt">int</span> <span class="n">c</span><span class="p">){</span>
<span class="kt">int</span> <span class="n">q</span><span class="p">;</span> <span class="kt">char</span> <span class="n">qq</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="n">q</span><span class="o">=</span><span class="n">b</span><span class="p">;</span><span class="n">q</span><span class="o">&lt;=</span><span class="n">c</span><span class="p">;</span><span class="n">q</span><span class="o">++</span><span class="p">){</span><span class="n">snprintf</span><span class="p">(</span><span class="n">qq</span><span class="p">,</span><span class="k">sizeof</span><span class="p">(</span><span class="n">qq</span><span class="p">),</span><span class="s">"%d"</span><span class="p">,</span><span class="n">q</span><span class="p">);</span><span class="n">puts</span><span class="p">(</span><span class="n">qq</span><span class="p">);}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><em>“Good” Code Example:</em></p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Print a list of numbers from "first" to "last"</span>
<span class="kt">void</span>
<span class="nf">print_numbers</span><span class="p">(</span>
    <span class="kt">int</span> <span class="n">first</span><span class="p">,</span>       <span class="c1">// First number</span>
    <span class="kt">int</span> <span class="n">last</span><span class="p">)</span>        <span class="c1">// Last number</span>
<span class="p">{</span>
    <span class="kt">int</span> <span class="n">number</span><span class="p">;</span>      <span class="c1">// Current number</span>
    <span class="kt">char</span> <span class="n">text</span><span class="p">[</span><span class="mi">100</span><span class="p">];</span>  <span class="c1">// Number as a string</span>

    <span class="c1">// Loop through the number</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">number</span> <span class="o">=</span> <span class="n">first</span><span class="p">;</span> <span class="n">number</span> <span class="o">&lt;=</span> <span class="n">last</span><span class="p">;</span> <span class="n">number</span> <span class="o">++</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// Format and print the number on a line</span>
        <span class="n">snprintf</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">text</span><span class="p">),</span> <span class="s">"%d"</span><span class="p">,</span> <span class="n">number</span><span class="p">);</span>
        <span class="n">puts</span><span class="p">(</span><span class="n">text</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h1 id="code-quality-tools">Code Quality Tools</h1>

<p>There are a lot of tools available that help you write better code.  The
following is far from a definitive list but represents what I have incorporated
into my own projects.</p>

<h2 id="compiler-features">Compiler Features</h2>

<p>Most compilers provide helpful warnings about problems in your code.
<a href="https://clang.llvm.org/docs">Clang</a> and <a href="https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc">GCC</a> both support <code class="language-plaintext highlighter-rouge">-Wall</code> to enable a lot of common
warnings, <code class="language-plaintext highlighter-rouge">-Wextra</code> to enable less common warnings, <code class="language-plaintext highlighter-rouge">-Wxxx</code> to enable warning
“xxx”, and <code class="language-plaintext highlighter-rouge">-Wno-xxx</code> to disable a warning that isn’t useful in your code. I usually stick to <code class="language-plaintext highlighter-rouge">-Wall -Wunused</code> (all common plus unused function arguments)
and sometimes add <code class="language-plaintext highlighter-rouge">-Wno-format-truncation</code> (GCC only) which warns about the
<code class="language-plaintext highlighter-rouge">snprintf</code> output buffer not being large enough for a corresponding “%s” in the
format string.  The <code class="language-plaintext highlighter-rouge">-Werror</code> option can be used to turn warnings into errors,
but I only add it in “maintainer” mode so that random new warnings or system
header variations don’t derail people using my code.</p>

<p>For normal development I use the <code class="language-plaintext highlighter-rouge">-Os</code> option to include optimizations that do
not affect debugging or size and <code class="language-plaintext highlighter-rouge">-g</code> to include debugging symbols.  You can use
<code class="language-plaintext highlighter-rouge">-O0</code> to disable optimizations, but in my experience that can hide issues that
only show up when the code optimizer is enabled or create issues that the
optimizer fixes for you.</p>

<p>For release builds, I find <code class="language-plaintext highlighter-rouge">-Os</code> is still usually the best. Some code benefits
from the additional optimizations provided by <code class="language-plaintext highlighter-rouge">-O2</code> (mainly expansion of inline
functions) or <code class="language-plaintext highlighter-rouge">-O3</code> which does more execution modeling, loop unrolling, and code
cloning to reduce branching delays.</p>

<blockquote>
  <p>If you are using <a href="https://docs.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category?view=msvc-160">MS Visual C</a>, it uses <code class="language-plaintext highlighter-rouge">/Wall</code> to enable all its
warnings and <code class="language-plaintext highlighter-rouge">/wd xxx</code> to disable specific ones. <code class="language-plaintext highlighter-rouge">/WX</code> turns warnings into
errors. <code class="language-plaintext highlighter-rouge">/Os</code> is the equivalent of GCC’s <code class="language-plaintext highlighter-rouge">-Os</code> while <code class="language-plaintext highlighter-rouge">/Ot</code> roughly corresponds
to <code class="language-plaintext highlighter-rouge">-O2</code>. Debugging is enabled with <code class="language-plaintext highlighter-rouge">/Zi</code>.  Most often I’m just letting the
Visual Studio defaults for the Debug and Release targets get used since these
options have changed over the years…</p>
</blockquote>

<h2 id="dynamic-code-analysis">Dynamic Code Analysis</h2>

<p>Dynamic code analysis tools work on your running programs and typically involve
a steep processing and/or memory penalty.  I’ve been using dynamic code analysis
tools for much of my career.  First was a product called Rational Purify that
helped you find memory access issues, but alas Rational was eventually bought up
by IBM and Purify appears to have been discontinued.</p>

<p><a href="https://www.valgrind.org">Valgrind</a> replaced Purify for me. Valgrind basically simulates the
host processor to run your code, tracks all memory usage, and validates all
arguments passed to system calls and library functions. Valgrind just runs your
compiled program (nothing needs to change for your compiler or linker options),
and uses debug symbols to provide backtraces when an error occurs.</p>

<p>I used Valgrind extensively when developing and testing CUPS and HTMLDOC, and
still run it from time to time on my other software when a hard-to-time problem
gets reported.  That said, you can expect a 10x performance hit (or more) and
increased memory usage, and I’ve brought my development machine to its knees
more than once when doing a big test!</p>

<blockquote>
  <p>While I worked at Apple, I did some contributions to Valgrind to keep the
macOS support up-to-date. Unfortunately, starting with macOS 10.13 Apple
added system integrity features (mandatory code signing, library validation,
and secure runtime checks) that make it impossible to run Valgrind on current
macOS releases. Since most of my code is cross-platform, I still use it from
time to time on Linux, but it is no longer part of my macOS test suites.</p>
</blockquote>

<p>A more recent, lighter-weight tool called <a href="https://clang.llvm.org/docs/AddressSanitizer.html">Address Sanitizer</a> is supported
by recent versions of both GCC and Clang on macOS and Linux. The address
sanitizer checks for memory errors and leaks. Unlike Valgrind, you can’t use
Address Sanitizer with an existing executable.  Instead, you add the
<code class="language-plaintext highlighter-rouge">-fsanitize=address</code> option to your compiler and linker options to build
Address Sanitizer into your program, and every run of the program is a run of
the Address Sanitizer.</p>

<p>The <code class="language-plaintext highlighter-rouge">ASAN_OPTIONS</code> environment variable can be used to specify testing options.
I always set it to <code class="language-plaintext highlighter-rouge">leak_check_at_exit=false</code> to suppress the inevitable “you
didn’t free everything before exiting” error, since unconditionally freeing
everything you’ve allocated doesn’t usually make sense.</p>

<h2 id="static-code-analysis">Static Code Analysis</h2>

<p>Static code analysis tools work on your source code and have no impact on your
code’s execution speed or memory usage. Each tool has its strengths and
weaknesses, and a common complaint is that they are not always smart enough to
see logical connections. For example, the following (convoluted) example will
trip up most source code analyzers with an error about “copy” not being
initialized in the calls to <code class="language-plaintext highlighter-rouge">puts</code> and <code class="language-plaintext highlighter-rouge">free</code>:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Print a string in a convoluted way</span>
<span class="kt">void</span>
<span class="nf">print_string</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">s</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// String</span>
    <span class="n">bool</span> <span class="n">ok</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>    <span class="c1">// Did we have a string to copy?</span>
    <span class="kt">char</span> <span class="o">*</span><span class="n">copy</span><span class="p">;</span>         <span class="c1">// Copy of string</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">s</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// Have a string, make a copy</span>
        <span class="n">copy</span> <span class="o">=</span> <span class="n">strdup</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
        <span class="n">ok</span>   <span class="o">=</span> <span class="n">copy</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">;</span>
    <span class="p">}</span>
  
    <span class="k">if</span> <span class="p">(</span><span class="n">ok</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">puts</span><span class="p">(</span><span class="n">copy</span><span class="p">);</span>
        <span class="n">free</span><span class="p">(</span><span class="n">copy</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That said, there are a few tools that I use extensively in my projects, and
most of them are open source or free to use for open source projects:</p>

<ul>
  <li>
    <p>The <a href="https://clang-analyzer.llvm.org">Clang Static Analyzer</a> is probably the fastest of the
current static analysis tools and is part of the Clang compiler and Apple’s
Xcode IDE (<code class="language-plaintext highlighter-rouge">CMD+SHIFT+B</code>). I also enable the “shallow” analysis mode for
regular macOS builds to catch coding errors that the normal warnings miss.</p>
  </li>
  <li>
    <p><a href="http://cppcheck.sourceforge.net">Cppcheck</a> is an open source analyzer that offers “add-ons” that
scan for a variety of things including common CERT vulnerabilities and
<a href="https://en.wikipedia.org/wiki/MISRA_C">MISRA C</a> conformance. I find the MISRA C code “standard” to be a
joke (among other things it says you can’t do pointer arithmetic or have a
loop with multiple variables) but the CERT checks are top-notch.</p>
  </li>
  <li>
    <p><a href="https://lgtm.com">LGTM</a> is an open source code scanning service that is integrated with
many of the source code hosting companies. Some of its checks yield a lot of
false positives, but all of my C projects are setup to use it and you can
exclude certain checks as needed. One weakness is that LGTM does not support
forks of projects, and while I generally agree with their rationale that most
forks are mirrors of the parent repository, there should be a way to specify
that your fork is different (e.g. OpenPrinting’s CUPS repository…)</p>
  </li>
</ul>

<p><a href="https://semmle.com/codeql">CodeQL</a> is another open source scanning service (from the same people
that do LGTM) that brings in additional third-party scanning tools like
Cppcheck. I’ve tried using it since it offers Github integration, however the
documentation is poor and there does not seem to be a way to suppress things
like Cppcheck’s MISRA conformance add-on, quickly yielding thousands of issues
in the Github dashboard with no way to resolve them. I’m hoping this will change
in 2021, but we’ll see…</p>

<p><a href="https://scan.coverity.com">Coverity</a> is a closed-source scanning tool that offers free code
scanning for open source projects. I’ve used it for CUPS in the past, and they
provide a convenient web dashboard for reviewing reports and excluding false
positives in each of your projects.</p>

<p>I’ve recently started looking at a more advanced tool called <a href="https://frama-c.com">Frama-C</a>.
It looks like it will be able to do even more in depth scanning and logical
analysis, once I figure out how to use it. :)</p>

<h2 id="continuous-integration-unit-tests-and-test-suites">Continuous Integration, Unit Tests, and Test Suites</h2>

<p>Many of the static analysis tools in the previous section are actually part of
a continuous integration service integrated with Github.  Continuous integration
refers to automated builds of every commit and pull request to your code
repository. The most basic solutions provide you with the answer to “will it
build” for the platform(s) they support. Most also allow you to run unit tests
and test suites after the build, providing a powerful way to sanity-check your
software on a regular basis.  I regularly use <a href="https://www.travis-ci.com">Travis CI</a> for Linux
and macOS testing and <a href="https://www.appveyor.com">AppVeyor</a> for Windows testing (it also now
supports Linux and macOS, but I’m not using that functionality).</p>

<p>To go beyond “will it compile” you need to write unit tests and/or test suites
to verify your code. There are a lot of unit test frameworks to choose from, but
you can also roll your own (which is what I generally do) if those frameworks
don’t align with your needs. Some frameworks can help you track your code
coverage, while others just automate the reporting of test results. The key is
to ensure that you are testing as many of the features or APIs in your software
as you can, and to report failures as clearly as possible so you can more easily
fix problems that crop up.</p>

<p>To integrate your unit tests into a continuous integration service, add a target
to your project that builds and runs them. The “standard” for makefile-based
projects is to support a “test” target, which Travis CI (at least) will use to
run the tests in a Docker container after a successful build.</p>

<h1 id="setting-priorities">Setting Priorities</h1>

<p>When developing open source software, I have met contributors with wildly
different priorities than my own. Mostly these differences concern new features
or changes in behavior, but sometimes I meet people concerned with coding
practices, optimization, and/or standards conformance.</p>

<h2 id="avoid-over-optimization">Avoid Over Optimization</h2>

<p>I’m a strong believer in focusing my optimization efforts on the 10% of code
that yields 90% of the performance improvement. If one function is responsible
for a significant amount of execution time or memory use, and if there is an
obvious way to noticeably improve performance or memory use, then absolutely do
that optimization. Eeking another 1% improvement is usually not necessary or
useful, and often yields harder-to-maintain code.</p>

<h2 id="avoid-new-language-features">Avoid “New” Language Features</h2>

<p>Most open source software is not built using the latest compilers or libraries.
In particular, Linux-based systems often provide a wide range of options, with
server-focused distributions shipping with (in some cases) decades-old tools.</p>

<p>My CUPS software <em>still</em> follows the C89 standard in order to compile on old
commercial UNIX platforms, and I avoid C11 APIs like <code class="language-plaintext highlighter-rouge">fopen_s</code> and <code class="language-plaintext highlighter-rouge">thrd_create</code>
since they are not widely supported even today. But C99 seems to be well
supported and that is what my new software follows.</p>

<blockquote>
  <p>I’m not going to make any C++ recommendations.  I stopped doing new C++
development years ago because STL and name mangling changes have made it
incredibly difficult to ship binaries of C++ software.</p>
</blockquote>

<h2 id="avoid-freeing-allocated-memory-on-exit">Avoid Freeing Allocated Memory on Exit</h2>

<p>Some tools and standards advocate freeing all memory you allocate before you
exit your program. In the days before virtual memory, preemptive multitasking,
and modern operating systems, this advice was sound - if you didn’t free
everything then eventually your system would run out of free memory and you’d
either crash or be forced to reboot. Even today, if you are using a barebones
embedded OS then you absolutely need to tightly manage your memory.</p>

<p>But for any development for a modern OS, freeing/deleting objects for the sake
of returning memory to the operating system is 100% totally unnecessary. As
soon as your process is “reaped”, all the memory that was allocated to the
process goes right back to the OS and is available for use again. All that
freeing memory will do is consume processor time and delay the exit of your
process.</p>

<h2 id="ignoring-return-values">Ignoring Return Values</h2>

<p>Some tools and standards complain when you ignore the return values of
functions. In my experience, these warnings are appropriate less than half the
time. For example, the <code class="language-plaintext highlighter-rouge">unlink</code> system call returns the usual <code class="language-plaintext highlighter-rouge">0</code> on success
and <code class="language-plaintext highlighter-rouge">-1</code> on failure, with the possible <code class="language-plaintext highlighter-rouge">errno</code> values indicating why the file
could not be removed. If I am writing a program whose sole purpose is to
delete files and it is important for me to know and/or report any failures, then
my code will absolutely check the return value. But if I am just removing a
temporary file my program created and that fails (perhaps because the file has
already been deleted), it is less important that I check the return value -
especially when there is nothing I can do to correct the problem.</p>

<p>When the return value is important and there is something I can do about it, I
check the return value. If it is not important or I can’t do anything about it,
I ignore it.</p>

<h2 id="using-goto">Using “goto”</h2>

<p>Some language purists insist that <code class="language-plaintext highlighter-rouge">goto</code> should be removed from the C language.
While I generally avoid using <code class="language-plaintext highlighter-rouge">goto</code>, there is one scenario where its use is
justified: function exit points. By consolidating the clean up code in
one place you make the code smaller, more readable, and more maintainable.</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">codedoc v3.6</title>
		<category term="codedoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-12-31-codedoc-3.6.html" />
		<id>https://www.msweet.org/blog/2020-12-31-codedoc-3.6.html</id>
		<updated>2020-12-31T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>codedoc v3.6</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of codedoc adds syntax highlighting, literal link, image
dimensions, and block quote in comments support as well as fixing a number of
bugs. Changes include:</p>

<ul>
  <li>Added support for syntax highlighting of C and C++ code.</li>
  <li>Added support for literal links (functions, types, etc.) using the “@@”
target.</li>
  <li>Added support for <code class="language-plaintext highlighter-rouge">::WIDTHxHEIGHT</code> in image (ALT) text.</li>
  <li>Added support for markdown-style block quotes in comments.</li>
  <li>Fixed support for embedded images in EPUB output.</li>
  <li>Fixed some parsing issues for the public typedef - private struct design
pattern, resulting in undocumented typedefs.</li>
  <li>Fixed a few Cppcheck and LGTM-detected bugs.</li>
  <li>No longer output unnecessary whitespace in HTML/EPUB output, for a modest
savings in file size.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/codedoc/releases/tag/v3.6">Download codedoc 3.6</a>
<a class="btn btn-default" href="https://snapcraft.io/codedoc">Install codedoc 3.6 Snap</a>
<a class="btn btn-default" href="/codedoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.11</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-12-24-htmldoc-1.9.11.html" />
		<id>https://www.msweet.org/blog/2020-12-24-htmldoc-1.9.11.html</id>
		<updated>2020-12-24T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.11</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.11 fixes some bugs and adds high-resolution desktop icons for Linux.
Changes include:</p>

<ul>
  <li>Added high-resolution desktop icons for Linux.</li>
  <li>Updated the internal HTTP library to fix truncation of redirection URLs
(Issue #396)</li>
  <li>Fixed a regression in the handling of character entities for UTF-8 input
(Issue #401)</li>
  <li>The <code class="language-plaintext highlighter-rouge">--numbered</code> option did not work when the table-of-contents was disabled
(Issue #405)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.11">Download HTMLDOC 1.9.11</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.11 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.0.0</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-12-11-pappl-1.0.0.html" />
		<id>https://www.msweet.org/blog/2020-12-11-pappl-1.0.0.html</id>
		<updated>2020-12-11T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.0.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The first stable release of PAPPL is now available for download.  PAPPL
is a simple C-based framework/library for developing CUPS Printer Applications,
which are the recommended replacement for printer drivers.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.0.0">Download PAPPL v1.0.0</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

<!--more-->

<p>Changes in 1.0.0 include:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">papplSystemLoadState</code> would not load printers whose device IDs contained the
<code class="language-plaintext highlighter-rouge">#</code> character (Issue #92)</li>
  <li>Passing “auto” for the driver name would cause a crash if there was no auto-
add callback.</li>
  <li>Added <code class="language-plaintext highlighter-rouge">papplPrinterGetPath</code> API to get the path for a printer web page
(Issue #97)</li>
  <li>The <code class="language-plaintext highlighter-rouge">papplPrinterAddLink</code> and <code class="language-plaintext highlighter-rouge">papplSystemAddLink</code> functions now accept an
“options” argument instead of the “secure” boolean in order to allow links to
be added to multiple places on the web interface in addition to requesting a
secure (HTTPS) link (Issue #98)</li>
</ul>

<p>Enjoy!</p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Code Signing and Notarization on macOS</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-12-10-macos-notarization.html" />
		<id>https://www.msweet.org/blog/2020-12-10-macos-notarization.html</id>
		<updated>2020-12-10T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Code Signing and Notarization on macOS</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Over the past several years, Apple has been increasing the security requirements
of macOS applications.  Besides the macOS binaries I’ve been building of my
software, I also have been helping other open source projects get their macOS
binaries to be acceptable on users’ systems while still allowing the build
process to be as automated as possible…</p>

<!--more-->

<h1 id="code-signing-basics">Code Signing Basics</h1>

<p><em>Code signing</em> calculates a cryptographic hash (a complex checksum) of your
software files and a certificate you get from Apple that both identifies who you
are and that Apple trusts you.  The hash can then be verified when the software
is installed and run so that macOS knows that the software can be trusted and
that it hasn’t been changed.  If not, you’ll get the dreaded “this software
can’t be trusted” dialog.</p>

<p>You install a code signing certificate by running the Xcode application, opening
the Preferences window (<code class="language-plaintext highlighter-rouge">CMD+,</code>), and going under the Accounts tab.  Click on
“Manage Certificates…” to add a Developer ID Application certificate for
signing a command-line tool or application bundle and/or a Developer ID
Installer certificate for signing a macOS package.</p>

<p>Each developer account has an associated team ID that consists of 10 uppercase
letters and/or numbers, e.g. “AB3456789Z”.  This team ID is listed in the
certificate common name, e.g. “Developer ID Application: Bob’s Software (AB3456789Z)”.</p>

<blockquote>
  <p>Note: The Developer ID certificates require a paid Apple developer program
account.  If you are a member of a development team, you might have to ask
your team administrator to generate the certificates for you.</p>
</blockquote>

<p>Two other kinds of certificates are also used on macOS:</p>

<ul>
  <li>The “ad-hoc” certificate (“-“) which is for running and testing code on your
local machine only.</li>
  <li>The “Apple Development” certificate which is for signing software you submit
to the Mac AppStore.</li>
</ul>

<p>Unless you re-sign with a Developer ID certificate, executables signed with the
ad-hoc or Apple Development certificates will not run on your other systems.</p>

<h2 id="notarization">Notarization</h2>

<p>Starting with macOS 10.15, software must also be <em>notarized</em>.  Notarization is
a kind of two-factor authentication for code signing - after you sign your
software, you send a copy of it to Apple along with your Apple ID credentials
(more on that in a moment) so that Apple can match everything up and produce
a cryptographic seal-of-approval for your software.  The results of notarization
should be attached to the software that you provide to your users to avoid
issues when the user isn’t online.</p>

<h2 id="runtime-restrictions">Runtime Restrictions</h2>

<p>Another feature of code signing on macOS is that the signature can specify
additional restrictions for the runtime environment for the program.  Some of
these restrictions are required for notarization to work, and one of them
(the “runtime” restriction) prevents you from inserting dynamic libraries or
debugging the executables.</p>

<h1 id="command-line-tools">Command-Line Tools</h1>

<p>Xcode includes three command-line tools, accessed by putting <code class="language-plaintext highlighter-rouge">xcrun</code> in front of
the names, that are used for code signing and notarization.  The <code class="language-plaintext highlighter-rouge">codesign</code>
utility does the actual code signing and accepts several arguments:</p>

<ul>
  <li>
    <p><code class="language-plaintext highlighter-rouge">-s IDENTITY</code>: Specifies the code signing identity such as “-“ for ad-hoc,
“Developer ID Application” to use any Developer ID application certificate
you have, or “TEAMID” to use the Developer ID certificate associated with the
specified team.</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">-o OPTIONS</code>: Specifies code signing options separated by commas.  All
notarized applications (and those shipped through the Mac AppStore) must use
the “runtime” option.</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">--timestamp</code>: Includes an authenticated date/time stamp in the signature,
which is required for notarization.</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">-i BUNDLE-ID</code> or <code class="language-plaintext highlighter-rouge">--prefix BUNDLE-PREFIX</code>: Specifies a unique identifier for
a command-line program, e.g. “com.bobsoft.program” for the identifier or
“com.bobsoft” for the prefix.  In the case of <code class="language-plaintext highlighter-rouge">--prefix</code>, the program name is
added to the prefix.  The BUNDLE-ID must be unique across all software you
sign.</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">-f</code>: Forces the code signature to be replaced, if one already exists.</p>
  </li>
</ul>

<p>The <code class="language-plaintext highlighter-rouge">altool</code> is used to notarize a package or ZIP file containing an application
bundle or one or more programs:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">--notarize-app</code>: Notarizes the given file.</li>
  <li><code class="language-plaintext highlighter-rouge">--notarization-info UUID</code>: Queries the status of a notarization request.</li>
  <li><code class="language-plaintext highlighter-rouge">-f FILENAME</code>: Specifies a ZIP file or package (.pkg) file.</li>
  <li><code class="language-plaintext highlighter-rouge">--primary-bundle-id BUNDLE-ID-OR-PREFIX</code>: Specifies the application bundle ID
or the prefix that was used for command-line programs.</li>
  <li><code class="language-plaintext highlighter-rouge">--username APPLEID</code>: Specifies the developer account’s Apple ID (email
address).</li>
  <li><code class="language-plaintext highlighter-rouge">--password @keychain:AC_TEAMID</code>: Specifies the keychain entry to use for the
password (token) string.</li>
  <li><code class="language-plaintext highlighter-rouge">--asc-provider TEAMID</code>: Specifies the developer team that is producing the
software.</li>
</ul>

<p>Finally, the <code class="language-plaintext highlighter-rouge">stapler</code> command is used to attach a copy of the notarization to
your software.  This command currently only works for application bundles and
packages.</p>

<h1 id="creating-an-oss-friendly-code-signing-workflow">Creating an OSS-Friendly Code Signing Workflow</h1>

<p>Any <a href="https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow#3087720">code signing workflow</a> for open source projects should be flexible about
the use of Apple identifiers.  I typically use the “APPLEID” and “TEAMID”
environment variables to provide the Apple ID and team ID values for a given
project.</p>

<p>The notarization (<code class="language-plaintext highlighter-rouge">altool</code>) command needs an <a href="https://support.apple.com/en-us/HT204397">app-specific password string</a>.
While the Apple examples store this in a keychain item named “AC_PASSWORD”, I
recommend using “AC_$TEAMID” to allow for working on multiple development
teams.  For example, if your team ID is “AB3456789Z”, your Apple ID is
“bob@bobsoft.com”, and your app-specific password string is “abcdef123456789”,
run:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>xcrun altool --store-password-in-keychain-item "AC_AB3456789Z" \
    -u "bob@bobsoft.com" -p abcdef123456789
</code></pre></div></div>

<p>Once you have these basics setup, you can use the <a href="/tools/sign-and-notarize.sh.txt">following script</a> to sign
and notarize an application, a package, or a list of commands:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#!/bin/sh
#
# macOS code signing and notarization script.
#
# Copyright © 2020 by Michael R Sweet
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
#    list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY MICHAEL R SWEERT "AS IS" AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL MICHAEL R SWEET BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Usage:
#
#   sign-and-notarize [--prefix BUNDLE-PREFIX] FILE [ ... FILE ]
#


if test "x$APPLEID" = x; then
  echo Please set the APPLEID environment variable.
  exit 1
fi

if test "x$TEAMID" = x; then
  echo Please set the TEAMID environment variable.
  exit 1
fi

primary=""
prefix=""
files=""
zipfile="$TMPDIR/notarize$$.zip"
alfile="$TMPDIR/notarize$$.txt"

# Collect files and do code signing...
while test $# -gt 0; do
  arg="$1"
  shift

  case "$arg" in
    --help)
      echo "Usage: sign-and-notarize [--prefix BUNDLE-PREFIX] FILE [ ... FILE]"
      exit 0
      ;;

    --prefix)
      prefix="$1"
      shift
      ;;

    -*)
      echo "Unknown option '$arg'."
      exit 1
      ;;

    *.app | *.pkg)
      files="$files $arg"

      # Get the primary bundle ID...
      if test -f $arg/Contents/Info.plist; then
        primary=`plutil -p $arg/Contents/Info.plist | grep CFBundleIdentifier | awk -F\" '{print $4}'`
      fi

      echo "xcrun codesign -f -s $TEAMID -o runtime --timestamp $arg"
      xcrun codesign -f -s $TEAMID -o runtime --timestamp $arg
      ;;

    *)
      if test "x$prefix" = x; then
        echo "Missing --prefix option."
        exit 1
      fi

      files="$files $arg"
      echo "xcrun codesign -f -s $TEAMID --prefix $prefix -o runtime --timestamp $arg"
      xcrun codesign -f -s $TEAMID --prefix $prefix -o runtime --timestamp $arg
      ;;
  esac
done

if test "x$files" = x; then
  echo "Usage: sign-and-notarize [--prefix BUNDLE-PREFIX] FILE [ ... FILE]"
  exit 1
fi

# Notarize...
echo "zip -rv ... $files"
zip -rv $zipfile $files

if test "x$primary" = x; then
  # When signing multiple command-line tools, use the prefix as the primary
  if (echo $files | grep -q ' '); then
    primary="$prefix"
  else
    primary="$prefix.`echo $files`"
  fi
fi

echo "xcrun altool --notarize-app -f ... --primary-bundle-id $primary ..."
xcrun altool --notarize-app -f $zipfile --primary-bundle-id $primary --username $APPLEID --password @keychain:AC_$TEAMID --asc-provider $TEAMID &gt; $alfile || exit 1

uuid=`grep RequestUUID $alfile | awk '{print $3}'`
status="in progress"

while test "$status" = "in progress"; do
  echo "    $uuid: $status"
  sleep 10
  echo "xcrun altool --notarization-info ..."
  xcrun altool --notarization-info $uuid --username $APPLEID --password @keychain:AC_$TEAMID --asc-provider $TEAMID &gt; $alfile || exit 1
  status="`grep Status: $alfile | cut -b14-`"
done

echo "    $uuid: $status"
rm -f $alfile $zipfile

# Staple the notarization...
for file in $files; do
  case "$file" in
    *.app | *.pkg)
      echo "xcrun stapler staple $file"
      xcrun stapler staple $file
      ;;
  esac
done
</code></pre></div></div>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Sponsoring Me Through Liberapay</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-12-04-liberapay.html" />
		<id>https://www.msweet.org/blog/2020-12-04-liberapay.html</id>
		<updated>2020-12-04T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Sponsoring Me Through Liberapay</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>By popular request, I’ve created a second way to financially support my open
source development through <a href="https://liberapay.com/michaelrsweet/donate">Liberapay</a>.
Thank you for any assistance you choose to provide, whether it is financial or
in the form of a bug report, pull request, or other feedback that helps make my
software better!</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.0rc1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-11-30-pappl-1.0rc1.html" />
		<id>https://www.msweet.org/blog/2020-11-30-pappl-1.0rc1.html</id>
		<updated>2020-11-30T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.0rc1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The first release candidate of PAPPL 1.0 is now available for download.  PAPPL
is a simple C-based framework/library for developing CUPS Printer Applications,
which are the recommended replacement for printer drivers.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.0rc1">Download PAPPL v1.0rc1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>

<!--more-->

<p>Changes in 1.0rc1 include:</p>

<ul>
  <li>Added IEEE-1284 device ID to argument list for printer driver callbacks
(Issue #70)</li>
  <li>Documentation updated (Issue #71)</li>
  <li>Printers discovered via DNS-SD now report their IEEE-1284 device ID string
(Issue #73)</li>
  <li>The “auto-add” callback is now part of the system’s printer driver interface,
allowing IPP, web, and command-line clients to access it (Issue #74)</li>
  <li>Now save state after deleting a printer (Issue #75)</li>
  <li>Now check whether a named printer already exists (Issue #76)</li>
  <li>Support for “output-bin-default” was missing from the web interface
(Issue #77)</li>
  <li>Fixed support for vendor options at the command-line (Issue #79)</li>
  <li>The main loop now shows an error message if an option is provided after “-o”
without a space (Issue #80)</li>
  <li>Fixed test page and identify buttons (Issue #81)</li>
  <li>Code cleanup (Issue #82)</li>
  <li>Boolean vendor options are now shown as checkboxes (Issue #85)</li>
  <li>Made several improvements to the web interface for adding printers (Issue #86)</li>
  <li><code class="language-plaintext highlighter-rouge">papplSystemLoadState</code> no longer crashes when it cannot create a printer
(Issue #87)</li>
  <li>Fixed a crash bug in the “autoadd” command provided by <code class="language-plaintext highlighter-rouge">papplMainloop</code>
(Issue #89)</li>
  <li>Added a printer creation callback to <code class="language-plaintext highlighter-rouge">papplSystemSetPrinterDrivers</code> that is
run after a printer is created (Issue #90)</li>
  <li>Added the “path” value for the DNS-SD printer web page, and added a
registration for the system web page in multi-queue mode.</li>
  <li><code class="language-plaintext highlighter-rouge">papplDeviceRead</code> now has a 100ms timeout for USB and network connections.</li>
  <li>Implemented back-channel and status updates for the USB printer gadget.</li>
  <li>Finished implementation of test suite for major code paths/job processing
functionality.</li>
  <li>Fixed a bug in the log rotation code.</li>
  <li>Fixed some threading bugs with the various object lists managed by the
system.</li>
</ul>

<p>Enjoy!</p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">EPM v5.0.0</title>
		<category term="epm" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-11-20-epm-5.0.0.html" />
		<id>https://www.msweet.org/blog/2020-11-20-epm-5.0.0.html</id>
		<updated>2020-11-20T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>EPM v5.0.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>In case you blinked, here is EPM v5.0.0 from
<a href="https://github.com/jimjag">Jim Jagielski</a>.  With my blessing, the license is
now Apache 2.0 (like many of my other projects) and Jim has brought support for
the platforms I dropped in v4.5 back as well!</p>

<p><a class="btn btn-primary" href="https://github.com/jimjag/epm/archive/v5.0.0.tar.gz">Download EPM 5.0.0</a>
<a class="btn btn-default" href="https://jimjag.github.io/epm/">(New) Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">EPM v4.5.1 and a New Maintainer!</title>
		<category term="epm" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-11-18-epm-4.5.1.html" />
		<id>https://www.msweet.org/blog/2020-11-18-epm-4.5.1.html</id>
		<updated>2020-11-18T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>EPM v4.5.1 and a New Maintainer!</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Today brings two changes for EPM.  First a quick (final) bug fix release
(v4.5.1) from me with the following changes:</p>

<ul>
  <li>Fixed Debian dependencies for min/max version (Issue #64)</li>
  <li>Fixed a typo in the epm.list file (Issue #78)</li>
  <li>Fixed macro usage in the setup.types man page (Issue #81)</li>
  <li>Fixed @INSTALL@ macro in makefile (Issue #84)</li>
  <li>Fixed Debian init script support (Issue #85)</li>
</ul>

<p>Second, I am pleased to announce that <a href="https://github.com/jimjag">Jim Jagielski</a>
has volunteered to take over development of EPM.  Among other things, Jim is an
Apache OpenOffice developer who has been using EPM to create the community
builds of AOO.  He has also been maintaining a fork of EPM with his own changes
and fixes that would benefit all developers and that I, quite frankly, haven’t
had the time to look at or integrate.  In short, I think Jim will do a great job
moving EPM forward and giving the project the “love” it deserves!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/epm/releases/tag/v4.5.1">Download EPM 4.5.1</a>
<a class="btn btn-default" href="https://jimjag.github.io/epm/">(New) Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">PAPPL v1.0b1</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-11-11-pappl-1.0b1.html" />
		<id>https://www.msweet.org/blog/2020-11-11-pappl-1.0b1.html</id>
		<updated>2020-11-11T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>PAPPL v1.0b1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>The first beta release of PAPPL 1.0 is now available for download.  PAPPL is a
simple C-based framework/library for developing CUPS Printer Applications, which
are the recommended replacement for printer drivers.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/pappl/releases/tag/v1.0b1">Download PAPPL v1.0b1</a>
<a class="btn btn-default" href="/pappl/index.html">Home Page</a></p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 3.2</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-10-09-mxml-3.2.html" />
		<id>https://www.msweet.org/blog/2020-10-09-mxml-3.2.html</id>
		<updated>2020-10-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 3.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 3.2 adds support for the Haiku operating system and fixes bugs.
Changes include:</p>

<ul>
  <li>Added support for shared libraries on Haiku (Issue #262)</li>
  <li>Fixed handling of unquoted attribute values that start with a Unicode
character (Issue #264)</li>
  <li>Fixed handling of elements that start with a Unicode character (Issue #267)</li>
  <li>Fixed some minor issues identified by the LGTM security scanner.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v3.2">Download Mini-XML 3.2</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">codedoc v3.5</title>
		<category term="codedoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-10-09-codedoc-3.5.html" />
		<id>https://www.msweet.org/blog/2020-10-09-codedoc-3.5.html</id>
		<updated>2020-10-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>codedoc v3.5</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of codedoc adds C++ block comment support and fixes a number of
bugs. Changes include:</p>

<ul>
  <li>Added support for C++ block comments.</li>
  <li>Fixed support for function types.</li>
  <li>Fixed support for private typedef struct/class/union constructions.</li>
  <li>Fixed support for markdown bullet lists.</li>
  <li>Fixed output of Unicode text.</li>
  <li>Now use the “title” class for the cover image in HTML and EPUB output.</li>
  <li>Now place the table of contents along the side for HTML output.</li>
  <li>No longer strip quoted text (‘text’) in comments unless the text ends with
‘()’.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/codedoc/releases/tag/v3.5">Download codedoc 3.5</a>
<a class="btn btn-default" href="https://snapcraft.io/codedoc">Install codedoc 3.5 Snap</a>
<a class="btn btn-default" href="/codedoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.10</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-09-05-htmldoc-1.9.10.html" />
		<id>https://www.msweet.org/blog/2020-09-05-htmldoc-1.9.10.html</id>
		<updated>2020-09-05T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.10</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.10 fixes packaging and crash bugs. Changes include:</p>

<ul>
  <li>Updated local zlib to v1.2.11.</li>
  <li>Updated local libpng to v1.6.37.</li>
  <li>Fixed packaging issues on macOS and Windows (Issue #377, Issue #386)</li>
  <li>Now ignore sRGB profile errors in PNG files (Issue #390)</li>
  <li>The GUI would crash when saving (Issue #391)</li>
  <li>Page comments are now allowed in <code class="language-plaintext highlighter-rouge">pre</code> text (Issue #394)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.10">Download HTMLDOC 1.9.10</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.10 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Getting a Raspberry Pi to Pass BCT</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-06-17-raspberry-pi-bct.html" />
		<id>https://www.msweet.org/blog/2020-06-17-raspberry-pi-bct.html</id>
		<updated>2020-06-17T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Getting a Raspberry Pi to Pass BCT</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Over the past few weeks I have been working with
<a href="https://www.yoctoproject.org">Yocto</a>, specifically to put together a layer
containing <a href="https://www.msweet.org/pappl">PAPPL</a> and other necessary bits to
build headless Raspberry Pi-based print servers.  And since I’m a standards guy
I want this setup to more-or-less pass all of the network certification tests,
including Apple’s Bonjour Conformance Tests.  Unfortunately, this has taken a
bit longer than I’d hoped…</p>

<!--more-->

<h2 id="hardware">Hardware</h2>

<p>I’ve been using a <a href="https://www.raspberrypi.org/products/raspberry-pi-zero-w/">Raspberry Pi Zero W</a>
and a <a href="https://www.raspberrypi.org/products/raspberry-pi-3-model-b/">Rasberry Pi 3 Model B</a>
for my testing. These use the same wireless chip (a Broadcom BCM43438) but the
‘Pi 3 also offers 100baseT Ethernet for the wired network tests.</p>

<p>My iMac Pro serves as the build machine (running Parallels with
an Ubuntu 18.04 VM), and my 16” MacBook Pro serves as the BCT test machine.
Both the MacBook Pro and the Raspberry Pi under test are connected to a 4th
generation Apple TimeCapsule (802.11a/b/g/n) base station for the tests.</p>

<h2 id="software">Software</h2>

<p>I’m using Yocto to create custom Linux images for the Raspberry Pi’s.  For those
not familiar with it, Yocto is an embedded Linux development environment that
can be configured to support a wide variety of embedded processing boards
and/or virtual machine environments like <a href="https://www.qemu.org">QEMU</a>.</p>

<p>Yocto is organized into “images” which are the final OS images you put on your
board, “layers” which are logical pieces of the OS such as core, networking,
multimedia, Board Support Packages (“BSPs”), etc.,  and “recipes” which
represent individual packages or components for the OS.  You can customize all
of these things, and everything gets compiled from source code or (if you are
very lucky) can be found in an official pre-compiled repository hosted by the
Yocto project.  Building a Yocto image for the first time takes several hours,
even on my iMac Pro…</p>

<p>I’ve been working with the “Zeus” branch (which until recently was the newest)
and the official <a href="https://meta-raspberrypi.readthedocs.io/en/latest/layer-contents.html#images">meta-raspberrypi</a>
BSP layer.  To that I’ve updated the <a href="https://www.avahi.org">Avahi</a>,
<a href="https://www.cups.org">CUPS</a>, and <a href="https://roy.marples.name/projects/dhcpcd/">dhcpcd</a>
“recipes” to pull in the current versions of each.</p>

<h2 id="certification-tests">Certification Tests</h2>

<p>The two public certification tests I’ve been focusing on have been the PWG’s
<a href="https://www.pwg.org/ippeveselfcert">IPP Everywhere™ Printer Self-Certification Tools</a>
and Apple’s <a href="https://developer.apple.com/bonjour">Bonjour Conformance Test (“BCT”)</a>.
PAPPL easily passes the IPP Everywhere tests, but getting the BCT to pass has
been a major challenge thanks to some interesting bugs/features in the wireless
drivers and firmware used for the Raspberry Pi.</p>

<h2 id="raspberry-pi-wireless-drivers">Raspberry Pi Wireless Drivers</h2>

<p>The Wi-Fi chipset used in Raspberry Pi boards is a “FullMAC” implementation -
the chipset handles all of the low-level Wi-Fi communications, power management,
reading/writing of packets, etc. and just passes on the (processed) information
to the kernel driver.  So this means the Wi-Fi chip firmware needs to know how
to handle low-level networking details and whether a given network packet that
is received over Wi-Fi needs to be passed on to the kernel.  This is where the
problems begin.</p>

<p>The first part of the BCT is a test of IPv4 link-local address handling.  With
IPv4, link-local addresses (169.254.0.0/16) are typically only used when you
don’t have any working Internet infrastructure (more specifically, when there
isn’t a working DHCP server).  Each network device will try a series of
semi-random addresses when it first comes on the network to find an available
address.  The underlying protocol is defined in
<a href="https://tools.ietf.org/html/rfc3927">RFC 3927</a> and uses Address Resolution
Protocol (“ARP”) packets - a device asks whether any other device on the network
is using a particular IP address, and if nothing answers after three attempts it
then claims the address by announcing it a few times.</p>

<p>This query process is where things break with the default wireless settings and
the Raspberry Pi wireless firmware.  ARP packets are not addressed to a
particular network device and they really need to be passed on to the kernel
for processing.  The current firmware for the Raspberry Pi Wi-Fi chipset does
not do this, however, preventing the link-local queries from working.  In
addition, the power saving mode puts the Wi-Fi chipset to sleep in the middle of
the BCT tests which run for several hours!</p>

<h2 id="getting-bct-to-pass">Getting BCT to Pass</h2>

<p>After much research and experimentation, I ended up writing a small script to
disable power management and put the Wi-Fi interface in “promiscuous” mode so
that the Wi-Fi firmware sends all packets to the kernel and not just the ones
with its local addresses:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"set-wireless-options.sh"

#!/bin/sh
iw dev wlan0 set power_save off
ifconfig wlan0 promisc
</code></pre></div></div>

<p>I call this script from the <code class="language-plaintext highlighter-rouge">/etc/network/interfaces</code> configuration file:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"/etc/network/interfaces" (snippet)

# Wireless interface
auto wlan0
iface wlan0 inet dhcp
    wireless_mode managed
    wireless_essid any
    wpa-driver nl80211
    wpa-conf /etc/wpa_supplicant.conf
    # Replace "/PATH/TO" with the actual path to the script...
    pre-up /PATH/TO/set-wireless-options.sh
</code></pre></div></div>

<p>With those changes I can get the Raspberry Pi Zero W to pass BCT.</p>

<h2 id="future-developments">Future Developments</h2>

<p>At some point I will be making my Yocto layer public on Github, complete with
the necessary recipes for PAPPL and other key components needed for a headless
print server.  I’m also hoping that I’ll be able to get some firmware and/or
kernel driver bug fixes to make it unnecessary to use promiscuous mode or turn
the power-saver features off - we’ll see…</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.9</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-06-11-htmldoc-1.9.9.html" />
		<id>https://www.msweet.org/blog/2020-06-11-htmldoc-1.9.9.html</id>
		<updated>2020-06-11T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.9</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.9 fixes some URL and formatting bugs, as well as fixing the macOS
and Windows packages. Changes include:</p>

<ul>
  <li>Fixed a redirection issue - some sites (incorrectly) provide an incomplete
Location: URL in the HTTP response.</li>
  <li>Fixed https: support on newer versions of Windows (Issue #378)</li>
  <li>Fixed a problem with remote URLs containing spaces (Issue #379)</li>
  <li>Fixed a UTF-8 processing bug for Markdown files (Issue #383)</li>
  <li>Added support for <code class="language-plaintext highlighter-rouge">&lt;FONT FACE="monospace"&gt;</code> (Issue #385)</li>
</ul>

<p>Enjoy!</p>

<p><em>(June 17, 2020 Update: I re-posted the Windows binaries with a fix for the
problems some people reported on Windows…)</em></p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.9">Download HTMLDOC 1.9.9</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.9 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Announcing PAPPL, A Printer Application Framework</title>
		<category term="pappl" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-03-23-announcing-pappl.html" />
		<id>https://www.msweet.org/blog/2020-03-23-announcing-pappl.html</id>
		<updated>2020-03-23T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Announcing PAPPL, A Printer Application Framework</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>PAPPL is a C-based Printer Application framework/library.  I am developing it to
support future features in  <a href="https://github.com/michaelrsweet/lprint">LPrint</a> as well as making a Printer Application
for <a href="http://gutenprint.sf.net/">Gutenprint</a>.  My hope is that it will accelerate the adoption of
<a href="https://www.pwg.org/ipp/everywhere.html">IPP Everywhere™</a> and make it easier for people to support other IPP-based
licensing programs like <a href="https://support.apple.com/en-us/HT201311">AirPrint™</a> and <a href="https://mopria.org/">Mopria®</a>.</p>

<p>PAPPL is licensed under the Apache License Version 2.0 with an exception
to allow linking against GPL2/LGPL2 software (like older versions of CUPS),
so it can be used freely in any project you’d like.  If you want to support
the development of this framework financially, please consider
<a href="https://github.com/sponsors/michaelrsweet">sponsoring me through Github</a>.  I am also available to do consulting and/or
development through my company
<a href="https://www.lakesiderobotics.ca">Lakeside Robotics</a>.</p>

<p><a class="btn btn-primary" href="/pappl/index.html">Home Page</a>
<a class="btn btn-default" href="https://github.com/michaelrsweet/pappl">Github Project</a></p>

<!--more-->

<p>PAPPL supports JPEG, PNG, PWG Raster, Apple Raster, and “raw” printing to
printers connected via USB and network (AppSocket/JetDirect) connections.
PAPPL provides access to the printer via its embedded <a href="https://www.pwg.org/ipp/everywhere.html">IPP Everywhere™</a>
service, either local to the computer or on your whole network, which can then
be discovered and used by any application.</p>

<p>PAPPL will include a tutorial showing how to migrate the <code class="language-plaintext highlighter-rouge">rastertopcl</code> driver
from CUPS to a Printer Application, which can be used as a recipe for migrating
any CUPS driver.</p>

<p>PAPPL embeds a multi-threaded IPP server and provides callbacks for a
variety of events that allows a GUI or command-line application to interact
with both the local user that is running the Printer Application and any
network clients that are submitting print jobs, querying printer status and
capabilities, and so forth.</p>

<p>PAPPL requires a POSIX-compliant host operating system such as Linux®, macOS®,
QNX®, or VxWorks®.  It also requires the following support libraries:</p>

<ul>
  <li>CUPS 2.2 or later for the CUPS libraries (libcups2/libcupsimage2)</li>
  <li>GNU TLS 2.8 or later (except on macOS) for TLS support</li>
  <li>JPEGLIB 9 or later for JPEG image support</li>
  <li>LIBPNG 1.6 or later for PNG image support</li>
  <li>ZLIB 1.1 or later for compression support</li>
</ul>

<p>Most development happens on a Mac, with testing on various Linux distributions
and a <a href="https://www.raspberrypi.org/products/raspberry-pi-zero-w/">Raspberry Pi Zero W</a> to ensure that memory and CPU requirements
remain low.</p>

<h2 id="ipp-server">IPP Server</h2>

<p>PAPPL fully implements the <a href="https://ftp.pwg.org/pub/pwg/candidates/cs-ippeve10-20130128-5100.14.pdf">IPP Everywhere™ specification</a> and passes the
<a href="https://ftp.pwg.org/pub/pwg/candidates/cs-ippeveselfcert10-20160219-5100.20.pdf">IPP Everywhere™ Printer Self-Certification Manual</a> tests.  PAPPL also
implements several IPP extensions used for IPP-based licensing programs to
simplify certification, including the CUPS “marker-xxx” attributes, the
Get-Printer-Attributes operation using the resource path “/”, and the
CUPS-Get-Printers operation.</p>

<p>When configured to support multiple printers, PAPPL implements a subset of the
<a href="https://ftp.pwg.org/pub/pwg/candidates/cs-ippsystem10-20191122-5100.22.pdf">IPP System Service v1.0 specification</a> to allow creation, deletion, and
enumeration of printers.</p>

<h2 id="dns-sd-discovery">DNS-SD Discovery</h2>

<p>PAPPL takes care of registration of DNS-SD (Bonjour) services for each printer,
including the required sub-types, “flagship” LPD registrations, and recommended
naming and renaming behavior.</p>

<h2 id="file-formats">File Formats</h2>

<p>PAPPL supports JPEG, PNG, PWG Raster, and Apple Raster documents in all of the
standard color spaces and bit depths.  JPEG images are scaled to the destination
media size and print resolution using bilinear interpolation, while PNG images
are scaled using a nearest-neighbor algorithm to preserve edge detail in bar
codes and other non-photographic content.  PWG Raster and Apple Raster documents
are not scaled as they are normally sent at the proper resolution and size by
the print client.</p>

<p>PAPPL also allows drivers to advertise support for other “raw” formats that are
directly supported by the printer.</p>

<blockquote>
  <p>I am investigating options for PDF printing support in a future version of
PAPPL.  This work is being tracked the Github project.</p>
</blockquote>

<h2 id="driver-interface">Driver Interface</h2>

<p>PAPPL provides a simple driver interface for raster printing, and developers of
CUPS Raster drivers will readily adapt to it.  Drivers provide configuration
and capability information to PAPPL, and PAPPL then calls the driver to start
a job, start a page, output lines of graphics, end a page, and finally end a
job during the processing of a print job.</p>

<p>The driver interface supports 1-bit grayscale (clustered- or dispersed-dot)
and 1-bit bi-level (threshold) dithering using a 16x16 matrix, which is
sufficient to support most B&amp;W printing needs.  Continuous tone printing is
supported using 8-bit and 16-bit per component sGray, sRGB, AdobeRGB, or
DeviceN (K, RGB, CMYK, etc.) raster data.</p>

<p>Drivers can also specify “raw” formats that the printer accepts directly - this
is most useful for printers that support industry standard formats such as FGL,
PCL, or ZPL which are produced directly by common shipping and billing
automation applications.  “Raw” files are submitted to the driver using a
separate “print file” interface, allowing the driver to add any printer-specific
commands that are needed to successfully print them.</p>

<p>Aside from printing functionality, drivers can also provide up-to-date status
and configuration information by querying the printer when requested by the
embedded server.  This is an improvement over the CUPS command file interface
and allows a PAPPL-based driver to provide details such as updated media
information.</p>

<p>Drivers can also support printer identification, usually a sound or a light on
the printer, which is a requirement for IPP Everywhere™ and is used to visually
or audibly isolate a particular printer for the user.</p>

<h2 id="embedded-web-interface">Embedded Web Interface</h2>

<p>The embedded server can also provide a web interface to the Printer Application,
and PAPPL includes a standard web interface that can be customized and/or
overridden.  Aside from the usual status monitoring functionality, the web
interface can be configured to allow remote users (with proper authentication)
to:</p>

<ul>
  <li>Create and delete printers,</li>
  <li>Set the printer location and DNS-SD name,</li>
  <li>Configure the loaded media,</li>
  <li>Configure remote access accounts,</li>
  <li>Configure networking settings such as hostname and IP address,</li>
  <li>Update the TLS certificates used by the server, and/or</li>
  <li>Request software/firmware updates.</li>
</ul>

<p>You can also add custom pages and content using callbacks, static data, or
external files or directories.</p>

<blockquote>
  <p>Note: An embedded web interface is required for IPP Everywhere™ conformance.
The optional features allow a Printer Application to easily support the
functionality required for other IPP-based licensing programs.</p>
</blockquote>

<h2 id="legal-stuff">Legal Stuff</h2>

<p>PAPPL is Copyright © 2019-2020 by Michael R Sweet.</p>

<p>This software is licensed under the Apache License Version 2.0 with an exception
to allow linking against GPL2/LGPL2 software (like older versions of CUPS).  See
the files “LICENSE” and “NOTICE” for more information.</p>

<p>This software is based loosely on the “ippeveprinter.c” code from <a href="https://www.cups.org/">CUPS</a>.</p>

<h2 id="going-forward">Going Forward</h2>

<p>I’m planning on starting a series of beta releases soon, along with
corresponding changes in the LPrint and Gutenprint repositories to use PAPPL.
Once I have all three projects working as desired I’ll do a 1.0 release of
PAPPL.</p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">EPM v4.5</title>
		<category term="epm" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-03-13-epm-4.5.html" />
		<id>https://www.msweet.org/blog/2020-03-13-epm-4.5.html</id>
		<updated>2020-03-13T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>EPM v4.5</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>EPM v4.5 is a bug fix release and also removes support for some old platforms
that I can no longer support.  Changes include:</p>

<ul>
  <li>Dropped support for AIX, AT&amp;T (Solaris), Tru64, HP-UX, IRIX, LSB, and
Slackware packages.</li>
  <li>“make install” failed due to the README filename changing (Issue #59)</li>
  <li>The <code class="language-plaintext highlighter-rouge">mkepmlist</code> utility did not correctly handle filenames containing the
<code class="language-plaintext highlighter-rouge">$</code> character (Issue #62)</li>
  <li>The configure script incorrectly substituted “NONE” for the installation
prefix (Issue #67)</li>
  <li>Fixed some over-zealous permissions on temporary build directories (Issue #71)</li>
  <li>Fixed the mantohtml helper program - was depending on private CUPS headers for
some reason (Issue #72)</li>
  <li>Fixed some build system issues (Issue #75, Issue #76)</li>
  <li>Documentation updates (Issue #74, Issue #77)</li>
  <li>Cleaned up old sprintf and strcpy usage in many places.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/epm/releases/tag/v4.5">Download EPM 4.5</a>
<a class="btn btn-default" href="/epm/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Some Parody Logos for Your Entertainment</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-03-07-parody-logos.html" />
		<id>https://www.msweet.org/blog/2020-03-07-parody-logos.html</id>
		<updated>2020-03-07T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Some Parody Logos for Your Entertainment</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>I’m no graphic designer, but I’ve spent enough time fiddling with icons and
other graphical elements to at least know how to use the software to produce
passable images.  I’ve recently made a few parody logos for use in some
<a href="https://www.pwg.org">PWG</a> documentation, which I thought I’d share for your
amusement…</p>

<!--more-->

<p>All of these images are provided under the <a href="https://creativecommons.org/licenses/by-nc/4.0/">CC BY-NC 4.0</a> license, in case you’d like to use them.</p>

<p>Vendor Logo:</p>

<p><img class="bg-light rounded p-1" src="/images/pear.png" width="54" height="80" alt="Vendor: Pear" /></p>

<p>Operating System Logos:</p>

<p><img class="bg-light rounded" src="/images/doors.png" width="200" height="100" alt="Operating System: Doors" />
<img class="bg-light rounded" src="/images/humanoid.png" width="300" height="84" alt="Operating System: humanoid" /></p>

<p>Technology Logos:</p>

<p><img class="bg-light rounded" src="/images/cup-and-string.png" width="200" height="144" alt="Technology: CUPS and String" />
<img class="bg-light rounded" src="/images/goldtooth.png" width="300" height="75" alt="Technology: Goldtooth" /></p>

<p>Licensing Logo:</p>

<p><img class="bg-light rounded" src="/images/made-for-pearos.png" width="200" height="107" alt="Licensing: Made for pearOS" /></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Sponsoring Me Through Github</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-02-29-github-sponsors.html" />
		<id>https://www.msweet.org/blog/2020-02-29-github-sponsors.html</id>
		<updated>2020-02-29T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Sponsoring Me Through Github</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Over the years, many people have asked whether they can financially support the
development of LPrint, HTMLDOC, and other projects I make available freely on
Github.  Until recently there hasn’t been a simple way for me to do this, but
Github now has a “sponsors” program that allows you to provide monthly donations
to developers and projects, and will even match your donations for the first
year!</p>

<p>I’ve created a <a href="https://github.com/sponsors/michaelrsweet">Github sponsor profile</a>
to allow you to contribute financially to any of my open source projects and
help set the direction and priority of future bug fixes, features, and supported
hardware.  Thank you for any assistance you choose to provide, whether it is
financial or in the form of a bug report, pull request, or other feedback that
helps make my software better!</p>

<p><a class="btn btn-primary" href="https://github.com/sponsors/michaelrsweet" target="_blank">Become a Sponsor</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">LPrint v1.0</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-02-17-lprint-1.0.html" />
		<id>https://www.msweet.org/blog/2020-02-17-lprint-1.0.html</id>
		<updated>2020-02-17T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>LPrint v1.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>LPrint version 1.0 is now available.  LPrint is a Label Printer Application
for macOS® and Linux®.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint/releases/tag/v1.0">Download LPrint 1.0</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.8</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-02-15-htmldoc-1.9.8.html" />
		<id>https://www.msweet.org/blog/2020-02-15-htmldoc-1.9.8.html</id>
		<updated>2020-02-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.8</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.8 adds a CGI file naming feature, adds support for letterhead
images, and fixes some formatting bugs. Changes include:</p>

<ul>
  <li>Added support for a <code class="language-plaintext highlighter-rouge">HTMLDOC.filename</code> META keyword that controls the filename
reported in CGI mode; the default remains “htmldoc.pdf” (Issue #367)</li>
  <li>Fixed a paragraph formatting issue with large inline images (Issue #369)</li>
  <li>Fixed a buffer underflow issue (Issue #370)</li>
  <li>Fixed PDF page numbers (Issue #371)</li>
  <li>Added support for a new <code class="language-plaintext highlighter-rouge">L</code> header/footer format (<code class="language-plaintext highlighter-rouge">$LETTERHEAD</code>), which
inserts a letterhead image at its full size (Issue #372, Issue #373,
Issue #375)</li>
  <li>Updated the build documentation (Issue #374)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.8">Download HTMLDOC 1.9.8</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.8 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">LPrint v1.0rc1</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-02-10-lprint-1.0rc1.html" />
		<id>https://www.msweet.org/blog/2020-02-10-lprint-1.0rc1.html</id>
		<updated>2020-02-10T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>LPrint v1.0rc1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This is the first candidate release of LPrint 1.0, a Label Printer Application
for macOS® and Linux®. Changes include:</p>

<ul>
  <li>Updated media documentation (Issue #13)</li>
  <li>The <code class="language-plaintext highlighter-rouge">lprint options</code> command now reports both English and metric dimensions
for all supported sizes (Issue #14)</li>
  <li>Now support setting the default media source, top offset, tracking, and type
values.</li>
  <li>Now save and load next job-id value for each printer, along with the
printer-config-change-[date-]time and printer-impressions-completed values.</li>
  <li>Fixed some small memory leaks.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint/releases/tag/v1.0rc1">Download LPrint 1.0rc1</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">LPrint v1.0b2</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-01-26-lprint-1.0b2.html" />
		<id>https://www.msweet.org/blog/2020-01-26-lprint-1.0b2.html</id>
		<updated>2020-01-26T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>LPrint v1.0b2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This is the second beta release of LPrint, a Label Printer Application for macOS® and Linux®. Changes include:</p>

<ul>
  <li>Added support for authentication of remote administrative requests (Issue #1)</li>
  <li>Added support for managing printers via web browser (Issue #1)</li>
  <li>The <code class="language-plaintext highlighter-rouge">add</code>, <code class="language-plaintext highlighter-rouge">default</code>, <code class="language-plaintext highlighter-rouge">delete</code>, and <code class="language-plaintext highlighter-rouge">modify</code> sub-commands now support the “-u”
option (Issue #1)</li>
  <li>Fixed an ASLR issue with some Linux compilers (Issue #5)</li>
  <li>Added code to detach the Linux usblp kernel driver since apparently there are
still Linux distributions shipping the old (and broken) usblp kernel driver
(Issue #7)</li>
  <li>Device errors are now logged to stderr (for <code class="language-plaintext highlighter-rouge">lprint devices</code>) or the server
log (for <code class="language-plaintext highlighter-rouge">lprint server</code>) so that it is possible to see permission and other
access errors (Issue #8)</li>
  <li>Job attributes are now validated properly against the driver attributes
(Issue #9)</li>
  <li>Fixed an issue in server mode - a failed IPv6 listener would prevent the
server from starting (Issue #12)</li>
  <li>Added a “spool-directory” option for the <code class="language-plaintext highlighter-rouge">server</code> sub-command.</li>
  <li>Added a spec file for building RPMs.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint/releases/tag/v1.0b2">Download LPrint 1.0b2</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">LPrint v1.0b1</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-01-15-lprint-1.0b1.html" />
		<id>https://www.msweet.org/blog/2020-01-15-lprint-1.0b1.html</id>
		<updated>2020-01-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>LPrint v1.0b1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This is the first beta release of LPrint, a Label Printer Application for macOS® and Linux®.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint/releases/tag/v1.0b1">Download LPrint 1.0b1</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Announcing LPrint, a Label Printer Application</title>
		<category term="lprint" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2020-01-13-announcing-lprint.html" />
		<id>https://www.msweet.org/blog/2020-01-13-announcing-lprint.html</id>
		<updated>2020-01-13T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Announcing LPrint, a Label Printer Application</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>LPrint is a label printer application for macOS® and Linux®.  I wrote it in
response to criticism that coming changes in CUPS will leave users of label
printers in the cold…</p>

<!--more-->

<p>Basically, LPrint is a print spooler optimized for label printing.  It accepts
“raw” print data as well as PNG images (like those used for shipping labels by
most shippers’ current web APIs) and has built-in “drivers” to send the print
data to USB and network-connected label printers.  The spooler also tries to
keep the labels moving by merging jobs over a single connection to the printer
rather than starting and stopping like CUPS does to support a wider variety of
printers.</p>

<p>LPrint supports the full range of options and features supported by the
embedded drivers - currently all Dymo and Zebra ZPL label printers.  Whenever
possible, LPrint will auto-detect the make and model of your printer and its
installed capabilities.  And you can configure the default values of all
options as well as manually configure the media that is loaded in each printer.</p>

<p>LPrint also offers a simple network server mode that makes any label printers
appear as IPP Everywhere™/AirPrint™ printers on your network.  Thus, any macOS,
iOS®, or Linux client can use any label printer supported by LPrint.  And you
can, of course, send jobs from LPrint to an LPrint server on the network.</p>

<p>Finally, LPrint offers command-line and web-based monitoring of printer and
job status.</p>

<p>I plan on doing a 1.0 beta release very soon.  Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/lprint">Download LPrint</a>
<a class="btn btn-default" href="https://snapcraft.io/lprint">Install lprint Snap</a>
<a class="btn btn-default" href="/lprint/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">codedoc v3.4</title>
		<category term="codedoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-12-28-codedoc-3.4.html" />
		<id>https://www.msweet.org/blog/2019-12-28-codedoc-3.4.html</id>
		<updated>2019-12-28T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>codedoc v3.4</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of codedoc adds C++ namespace support. Changes include:</p>

<ul>
  <li>Added support for C++ namespaces (Issue #7)</li>
  <li>Silenced some warnings from the LGTM security scanner.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/codedoc/releases/tag/v3.4">Download codedoc 3.4</a>
<a class="btn btn-default" href="https://snapcraft.io/codedoc">Install codedoc 3.4 Snap</a>
<a class="btn btn-default" href="/codedoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Thoughts on Leaving Apple...</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-12-20-left-apple.html" />
		<id>https://www.msweet.org/blog/2019-12-20-left-apple.html</id>
		<updated>2019-12-20T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Thoughts on Leaving Apple...</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>So today was my last day at Apple. Apple has been a great company to work for and I’m grateful for my time there. I accomplished most of the things I’d hoped for, particularly getting solid Internet Printing Protocol support in almost all network and USB printers sold over the last 10 years. I chaired the Printer Working Group for about half of my time at Apple, met and worked with a lot of really talented and considerate people, and mentored a few young engineers that have either excelled within Apple or moved on to their next challenges.</p>

<p>Going forward I’ll be taking a little time to reboot and start a new company with my amazing wife. I’ve missed working with her every day these last 13 years and I’m really excited to see where our new journey will take us.</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">codedoc v3.3</title>
		<category term="codedoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-11-17-codedoc-3.3.html" />
		<id>https://www.msweet.org/blog/2019-11-17-codedoc-3.3.html</id>
		<updated>2019-11-17T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>codedoc v3.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of codedoc adds basic markdown support in comments and some other
minor improvements.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/codedoc/releases/tag/v3.3">Download codedoc 3.3</a>
<a class="btn btn-default" href="https://snapcraft.io/codedoc">Install codedoc 3.3 Snap</a>
<a class="btn btn-default" href="/codedoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Added basic markdown support in comments (Issue #6)</li>
  <li>Added a <code class="language-plaintext highlighter-rouge">--language</code> option to override the default documentation language
“en-US”.</li>
  <li>EPUB and HTML output now set the “generator” META content.</li>
  <li>Did some minor code reorganization/cleanup.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">ABNF to REGEX v2019.10</title>
		<category term="abnf" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-10-10-abnf.html" />
		<id>https://www.msweet.org/blog/2019-10-10-abnf.html</id>
		<updated>2019-10-10T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>ABNF to REGEX v2019.10</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>I’ve updated the ABNF to REGEX web page with a number of bug fixes and
improvements.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v2019.10">Download ABNF to REGEX</a>
<a class="btn btn-default" href="https://abnf.msweet.org">Online Form</a>
<a class="btn btn-default" href="/abnf/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Fixed PHP bug in example web page (Issue #3)</li>
  <li>Fixed over-optimization of ABNF (Issue #6)</li>
  <li>Fixed HEXDIG core rule (Issue #7)</li>
  <li>Optimized repetition counts and WSP content (Issue #8)</li>
  <li>Added unit test script and test ABNF file.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.7</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-10-09-htmldoc-1.9.7.html" />
		<id>https://www.msweet.org/blog/2019-10-09-htmldoc-1.9.7.html</id>
		<updated>2019-10-09T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.7</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.7 is primarily a bug fix release with added support for PDF links
with targets.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.7">Download HTMLDOC 1.9.7</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.7 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Refactored the PRE rendering code to work around compiler optimization bugs
(Issue #349)</li>
  <li>Added support for PDF links with targets (Issue #351)</li>
  <li>Fixed a table rowspan + valign bug (Issue #360)</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.6</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-09-25-htmldoc-1.9.6.html" />
		<id>https://www.msweet.org/blog/2019-09-25-htmldoc-1.9.6.html</id>
		<updated>2019-09-25T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.6</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.6 adds support for wrapping with <code class="language-plaintext highlighter-rouge">&amp;shy;</code>, improves markdown support,
fixes some issues, and optimizes font and PDF handling.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.6">Download HTMLDOC 1.9.6</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.6 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Added support for data URIs (Issue #340)</li>
  <li>HTMLDOC no longer includes a PDF table of contents when converting a single
web page (Issue #344)</li>
  <li>Updated the markdown support with external links, additional inline markup,
and hard line breaks.</li>
  <li>Links in markdown text no longer render with a leading space as part of the
link (Issue #346)</li>
  <li>Fixed a buffer underflow bug discovered by AddressSanitizer.</li>
  <li>Fixed a bug in UTF-8 support (Issue #348)</li>
  <li>PDF output now includes the base language of the input document(s)
(Issue #350)</li>
  <li>Optimized the loading of font widths (Issue #354)</li>
  <li>Optimized PDF page resources (Issue #356)</li>
  <li>Optimized the base memory used for font widths (Issue #357)</li>
  <li>Added proper <code class="language-plaintext highlighter-rouge">&amp;shy;</code> support (Issue #361)</li>
  <li>Title files can now be markdown.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 3.1</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-08-28-mxml-3.1.html" />
		<id>https://www.msweet.org/blog/2019-08-28-mxml-3.1.html</id>
		<updated>2019-08-28T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 3.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 3.1 fixes some installation issues and adds better error reporting.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v3.1">Download Mini-XML 3.1</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>The <code class="language-plaintext highlighter-rouge">mxmlLoad*</code> functions now print an error when the XML does not start with
<code class="language-plaintext highlighter-rouge">&lt;</code> and no parent node is supplied (Issue #256, Issue #259)</li>
  <li>Fixed an issue with “make install” trying to install old files (Issue #257)</li>
  <li>Fixed some DSO installation issues on Linux.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.7</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-08-28-mmd-1.7.html" />
		<id>https://www.msweet.org/blog/2019-08-28-mmd-1.7.html</id>
		<updated>2019-08-28T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.7</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> fixes some regressions in the markdown parser.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.7">Download mmd 1.7</a>
<a class="btn btn-default" href="https://snapcraft.io/mmdutil">Install mmdutil 1.7 Snap</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Fixed table parsing (Issue #11)</li>
  <li>Fixed block-quoted Setext heading parsing.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">codedoc v3.2</title>
		<category term="codedoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-08-28-codedoc-3.2.html" />
		<id>https://www.msweet.org/blog/2019-08-28-codedoc-3.2.html</id>
		<updated>2019-08-28T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>codedoc v3.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of codedoc fixes some buffer overflow issues and improves HTML and markdown support.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/codedoc/releases/tag/v3.2">Download codedoc 3.2</a>
<a class="btn btn-default" href="https://snapcraft.io/codedoc">Install codedoc 3.2 Snap</a>
<a class="btn btn-default" href="/codedoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>The default HTML stylesheet no longer puts an outline box around monospaced
text (Issue #2)</li>
  <li>Fixed signed character issues with fuzzer-generated “code” (Issue #3,
Issue #4)</li>
  <li>Fixed a buffer overflow issue with fuzzer-generated “code” (Issue #5)</li>
  <li>Now use the base name of the cover image filename in HTML output.</li>
  <li>Fixed some markdown parsing issues.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.6</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-08-18-mmd-1.6.html" />
		<id>https://www.msweet.org/blog/2019-08-18-mmd-1.6.html</id>
		<updated>2019-08-18T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.6</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> adds support for link titles and code languages, adds
functions for controlling which markdown extensions are supported, and fixes
a number of parsing bugs.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.6">Download mmd 1.6</a>
<a class="btn btn-default" href="https://snapcraft.io/mmdutil">Install mmdutil 1.6 Snap</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Fixed some parsing bugs (Issue #7)</li>
  <li>Fixed a crash bug in mmdutil (Issue #8)</li>
  <li>Code fences using “~~~” are now supported.</li>
  <li>Auto-links now properly handle preceding text (Issue #8)</li>
  <li>Inline styles can now span multiple lines (Issue #8)</li>
  <li>Links can now span multiple lines (Issue #8)</li>
  <li>Shortcut links (<code class="language-plaintext highlighter-rouge">[reference]</code>) didn’t work (Issue #8)</li>
  <li>Fixed some issues with inline styles being incorrectly applied for things
like “* *”.</li>
  <li>The <code class="language-plaintext highlighter-rouge">testmmd</code> program now supports running tests from the CommonMark
specification and/or from the CommonMark test suite (Issue #9)</li>
  <li>More CommonMark features (code languages, link titles, space-filled thematic
breaks) and edge cases are now supported (Issue #10)</li>
  <li>Added new <code class="language-plaintext highlighter-rouge">mmdGetOptions</code> and <code class="language-plaintext highlighter-rouge">mmdSetOptions</code> functions to control which
extensions are supported.</li>
  <li>Added new <code class="language-plaintext highlighter-rouge">mmdGetExtra</code> function to get the link title or code language
string associated with certain nodes.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 3.0</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-03-02-mxml-3.0.html" />
		<id>https://www.msweet.org/blog/2019-03-02-mxml-3.0.html</id>
		<updated>2019-03-02T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 3.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 3.0 is a major release that changes the license to Apache 2.0 with
exceptions for linking to GPL2-only code, hides the definition of the internal
<code class="language-plaintext highlighter-rouge">mxml_node_t</code> structure, removes the “mxmldoc” utility (which is now maintained
in the separate “codedoc” project), and fixes several bugs.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v3.0">Download Mini-XML 3.0</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Changed the license to Apache 2.0 with exceptions (Issue #239)</li>
  <li>All of the internal node structures are now moved out of the public header
(Issue #240)</li>
  <li>Fixed a potential buffer overflow when writing floating point data
(Issue #233)</li>
  <li>Moved <code class="language-plaintext highlighter-rouge">mxmldoc</code> to a new <code class="language-plaintext highlighter-rouge">codedoc</code> project whose focus is on generating
code documentation (Issue #235, Issue #236, Issue #237)</li>
  <li>Error messages now include the line number of the error (Issue #230)</li>
  <li>The <code class="language-plaintext highlighter-rouge">mxmlSetCDATA</code>, <code class="language-plaintext highlighter-rouge">mxmlSetElement</code>, <code class="language-plaintext highlighter-rouge">mxmlSetOpaque</code>, <code class="language-plaintext highlighter-rouge">mxmlSetOpaquef</code>,
<code class="language-plaintext highlighter-rouge">mxmlSetText</code>, and <code class="language-plaintext highlighter-rouge">mxmlSetTextf</code> functions caused a use-after-free bug if
the value came from the same node (Issue #241)</li>
  <li>The <code class="language-plaintext highlighter-rouge">mxmlSetOpaquef</code> and <code class="language-plaintext highlighter-rouge">mxmlSetTextf</code> functions did not work (Issue #244)</li>
  <li>The <code class="language-plaintext highlighter-rouge">_mxml_strdupf</code> function did not work on Windows (Issue #245)</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">codedoc v3.1</title>
		<category term="codedoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-02-19-codedoc-3.1.html" />
		<id>https://www.msweet.org/blog/2019-02-19-codedoc-3.1.html</id>
		<updated>2019-02-19T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>codedoc v3.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of codedoc improves markdown and HTML support.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/codedoc/releases/tag/v3.1">Download codedoc 3.1</a>
<a class="btn btn-default" href="https://snapcraft.io/codedoc">Install codedoc 3.1 Snap</a>
<a class="btn btn-default" href="/codedoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Fixed compile problems with Mini-XML v3.0.</li>
  <li>Greatly improved scanning of HTML content when generating the table of
contents.</li>
  <li>Updated the markdown support with external links, additional inline markup,
and hard line breaks.</li>
  <li>Copyright, trademark, and registered trademark symbols are now correctly
mapped from their ASCII and UTF-8 representations to the output format’s
preferred encoding (Issue #1)</li>
  <li>Added documentation on EPUB and HTML stylesheets.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.5</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-02-17-mmd-1.5.html" />
		<id>https://www.msweet.org/blog/2019-02-17-mmd-1.5.html</id>
		<updated>2019-02-17T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.5</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> adds support for referenced links, additional inline text
markup, and hard line breaks.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.5">Download mmd 1.5</a>
<a class="btn btn-default" href="https://snapcraft.io/mmdutil">Install mmdutil 1.5 Snap</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Added support for referenced links (Issue #1)</li>
  <li>Added support for <code class="language-plaintext highlighter-rouge">__bold__</code>, <code class="language-plaintext highlighter-rouge">_italic_</code>, <code class="language-plaintext highlighter-rouge">~~strikethrough~~</code>, and hard
line breaks (Issue #4)</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.5</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-01-23-htmldoc-1.9.5.html" />
		<id>https://www.msweet.org/blog/2019-01-23-htmldoc-1.9.5.html</id>
		<updated>2019-01-23T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.5</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.5 fixes some GUI, markdown, and EPUB issues.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.5">Download HTMLDOC 1.9.5</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.5 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>The GUI did not support EPUB output.</li>
  <li>Empty markdown table cells were not rendered in PDF or PostScript output.</li>
  <li>The automatically-generated title page now supports both “docnumber” and
“version” metadata.</li>
  <li>Added support for dc:subject and dc:language metadata in EPUB output from the
HTML keywords and lang values.</li>
  <li>Added support for the subject and language metadata in markdown input.</li>
  <li>Fixed a buffer underflow bug (Issue #338)</li>
  <li><code class="language-plaintext highlighter-rouge">htmldoc --help</code> now reports whether HTTPS URLs are supported (Issue #339)</li>
  <li>Fixed an issue with HTML title pages and EPUB output.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mOAuth v1.1</title>
		<category term="moauth" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-01-19-moauth-1.1.html" />
		<id>https://www.msweet.org/blog/2019-01-19-moauth-1.1.html</id>
		<updated>2019-01-19T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mOAuth v1.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>mOAuth 1.1 adds support for dynamic client registration and PAM-based
authentication backends.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/moauth/releases/tag/v1.1">Download mOAuth 1.1</a>
<a class="btn btn-default" href="https://snapcraft.io/moauth">Install mOAuth 1.1 Snap</a>
<a class="btn btn-default" href="/moauth/index.html">Home Page</a></p>

<!--more-->

<p>Changes in v1.1:</p>

<ul>
  <li>Now support dynamic client registration (Issue #8)</li>
  <li>Now support PAM-based authentication backends (Issue #9)</li>
  <li>Now install libmoauth, the <code class="language-plaintext highlighter-rouge">&lt;moauth.h&gt;</code> header, and a man page for the
library.</li>
  <li>Updated <code class="language-plaintext highlighter-rouge">moauthd</code> to look for “/etc/moauthd.conf” and
“/usr/local/etc/moauthd.conf” as the default configuration file, and install
a “moauthd.conf.default” file as a template (Issue #10)</li>
</ul>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mOAuth v1.0</title>
		<category term="moauth" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-01-15-moauth-1.0.html" />
		<id>https://www.msweet.org/blog/2019-01-15-moauth-1.0.html</id>
		<updated>2019-01-15T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mOAuth v1.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This is the first stable release of mOAuth, a basic OAuth 2.0 client/server
implementation for testing and development of OAuth-based services.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/moauth/releases/tag/v1.0">Download mOAuth 1.0</a>
<a class="btn btn-default" href="https://snapcraft.io/moauth">Install mOAuth 1.0 Snap</a>
<a class="btn btn-default" href="/moauth/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.4</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-01-04-mmd-1.4.html" />
		<id>https://www.msweet.org/blog/2019-01-04-mmd-1.4.html</id>
		<updated>2019-01-04T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.4</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> fixes some problems found with Clang static analyzer and
with the <code class="language-plaintext highlighter-rouge">mmdutil</code> program.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.4">Download mmd 1.4</a>
<a class="btn btn-default" href="https://snapcraft.io/mmdutil">Install mmdutil 1.4 Snap</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Fixed a table parsing bug where trailing pipes would add empty cells on the
right side.</li>
  <li>Tweaked the <code class="language-plaintext highlighter-rouge">mmdutil</code> program’s default HTML stylesheet.</li>
  <li>Fixed <code class="language-plaintext highlighter-rouge">mmdutil</code> error messages that incorrectly called the program <code class="language-plaintext highlighter-rouge">mmdbook</code>.</li>
  <li>Fixed some Clang static analyzer warnings in <code class="language-plaintext highlighter-rouge">mmd.c</code>.</li>
  <li>Fixed a build issue with Visual Studio.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">codedoc v3.0</title>
		<category term="codedoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2019-01-04-codedoc-3.0.html" />
		<id>https://www.msweet.org/blog/2019-01-04-codedoc-3.0.html</id>
		<updated>2019-01-04T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>codedoc v3.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This is the first release of codedoc, a replacement for the mxmldoc utility that
was provided with Mini-XML with several enhancements and bug fixes.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/codedoc/releases/tag/v3.0">Download codedoc 3.0</a>
<a class="btn btn-default" href="https://snapcraft.io/codedoc">Install codedoc 3.0 Snap</a>
<a class="btn btn-default" href="/codedoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Fixed potential crash bugs in mxmldoc found by fuzzing.</li>
  <li>The <code class="language-plaintext highlighter-rouge">--header</code> and <code class="language-plaintext highlighter-rouge">--footer</code> options now support markdown.</li>
  <li>The <code class="language-plaintext highlighter-rouge">mxmldoc</code> program now sets the EPUB subject (“Programming”).</li>
  <li>Improved EPUB error reporting and output.</li>
  <li>Man page output now uses the ISO date format (yyyy-mm-dd)</li>
  <li>Dropped support for <code class="language-plaintext highlighter-rouge">--framed basename</code> since frame sets are deprecated in
HTML 5.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 2.12</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-10-02-mxml-2.12.html" />
		<id>https://www.msweet.org/blog/2018-10-02-mxml-2.12.html</id>
		<updated>2018-10-02T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 2.12</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 2.12 fixes several bugs, updates the build system on macOS and Windows,
and updates the markdown and EPUB support.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v2.12">Download Mini-XML 2.12</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Added yet more documentation about using <code class="language-plaintext highlighter-rouge">MXML_OPAQUE_CALLBACK</code> when you want
to get full strings for inline text instead of separated words (Issue #190)</li>
  <li>No longer build documentation sets on macOS since Xcode no longer supports
them (Issue #198)</li>
  <li>Updated the <code class="language-plaintext highlighter-rouge">va_copy</code> macro for use with BCC (Issue #211)</li>
  <li>The <code class="language-plaintext highlighter-rouge">mxmlNewCDATA</code> and <code class="language-plaintext highlighter-rouge">mxmlSetCDATA</code> functions incorrectly added the XML
trailer “]]” to the string (Issue #216)</li>
  <li>Cross-compiling failed on install (Issue #218)</li>
  <li>Fixed a crash bug in the <code class="language-plaintext highlighter-rouge">mxmlWrite</code> functions (Issue #228)</li>
  <li>The <code class="language-plaintext highlighter-rouge">mxmlWrite</code> functions no longer write the siblings of the passed node
(Issue #228)</li>
  <li>Updated the markdown and ZIP container libraries used for mxmldoc.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.4</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-08-31-htmldoc-1.9.4.html" />
		<id>https://www.msweet.org/blog/2018-08-31-htmldoc-1.9.4.html</id>
		<updated>2018-08-31T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.4</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.4 fixes a font sizing bug and reduces startup time.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.4">Download HTMLDOC 1.9.4</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.4 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Inline fixed-width text is no longer reduced in size automatically
(Issue #309)</li>
  <li>Optimized initialization of font width data (Issue #334)</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Updates for macOS Binaries</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-07-04-macos-updates.html" />
		<id>https://www.msweet.org/blog/2018-07-04-macos-updates.html</id>
		<updated>2018-07-04T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Updates for macOS Binaries</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>I’ve posted updated HTMLDOC and RasterView binaries for macOS to Github that
fix a library dependency issue reported by some users.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.3">Download HTMLDOC 1.9.3</a>
<a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.7.1">Download RasterView 1.7.1</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">RasterView 1.7.1</title>
		<category term="rasterview" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-07-02-rasterview-1.7.1.html" />
		<id>https://www.msweet.org/blog/2018-07-02-rasterview-1.7.1.html</id>
		<updated>2018-07-02T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>RasterView 1.7.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>RasterView 1.7.1 fixes a crash bug on macOS.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.7.1">Download RasterView 1.7.1</a>
<a class="btn btn-default" href="https://snapcraft.io/rasterview">Install RasterView 1.7.1 Snap</a>
<a class="btn btn-default" href="/rasterview/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">RasterView 1.7</title>
		<category term="rasterview" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-06-05-rasterview-1.7.html" />
		<id>https://www.msweet.org/blog/2018-06-05-rasterview-1.7.html</id>
		<updated>2018-06-05T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>RasterView 1.7</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>RasterView 1.7 updates the page controls to allow navigation to any page and
adds mode buttons for zoom, pan, and color (to show the current mode).</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.7">Download RasterView 1.7</a>
<a class="btn btn-default" href="https://snapcraft.io/rasterview">Install RasterView 1.7 Snap</a>
<a class="btn btn-default" href="/rasterview/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">RasterView 1.6</title>
		<category term="rasterview" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-05-04-rasterview-1.6.html" />
		<id>https://www.msweet.org/blog/2018-05-04-rasterview-1.6.html</id>
		<updated>2018-05-04T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>RasterView 1.6</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>RasterView 1.6 fixes support for 16-bit per color files, adds support for gzip’d files,
and changes the license to the Apache License Version 2.0.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.6">Download RasterView 1.6</a>
<a class="btn btn-default" href="https://snapcraft.io/rasterview">Install RasterView 1.6 Snap</a>
<a class="btn btn-default" href="/rasterview/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.3</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-04-10-htmldoc-1.9.3.html" />
		<id>https://www.msweet.org/blog/2018-04-10-htmldoc-1.9.3.html</id>
		<updated>2018-04-10T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.3 fixes some formatting, markdown, and build issues on specific
platforms.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.3">Download HTMLDOC 1.9.3</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.3 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Fixed formatting bugs with aligned images (Issue #322, Issue #324)</li>
  <li>Fixed support for three digit “#RGB” color values (Issue #323)</li>
  <li>Fixed character set support for markdown metadata.</li>
  <li>Updated libpng to v1.6.34 (Issue #326)</li>
  <li>The makefiles did not use the CPPFLAGS value (Issue #328)</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.3</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-03-10-mmd-1.3.html" />
		<id>https://www.msweet.org/blog/2018-03-10-mmd-1.3.html</id>
		<updated>2018-03-10T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> adds the <code class="language-plaintext highlighter-rouge">mmdCopyAllText</code> function and a new conversion
utility called <code class="language-plaintext highlighter-rouge">mmdutil</code>.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.3">Download mmd 1.3</a>
<a class="btn btn-default" href="https://snapcraft.io/mmdutil">Install mmdutil 1.3 Snap</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Added <code class="language-plaintext highlighter-rouge">mmdCopyAllText</code> function that returns all of the text under the given
node.</li>
  <li>Added <code class="language-plaintext highlighter-rouge">mmdutil</code> program for converting markdown to HTML and man files.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.2</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-02-03-htmldoc-1.9.2.html" />
		<id>https://www.msweet.org/blog/2018-02-03-htmldoc-1.9.2.html</id>
		<updated>2018-02-03T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.2 fixes parsing of HTML 4.0 tables and adds support for markdown
tables.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.2">Download HTMLDOC 1.9.2</a>
<a class="btn btn-default" href="https://snapcraft.io/htmldoc">Install HTMLDOC 1.9.2 Snap</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Added Markdown table support.</li>
  <li>Fixed parsing of TBODY, TFOOT, and THEAD elements in HTML files.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.2</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-02-02-mmd-1.2.html" />
		<id>https://www.msweet.org/blog/2018-02-02-mmd-1.2.html</id>
		<updated>2018-02-02T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> adds support for the common table extension to Markdown
and is provided under the terms of the Apache License Version 2.0.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.2">Download mmd 1.2</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Changed license to Apache License Version 2.0</li>
  <li>Added support for markdown tables (Issue #3)</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Building Snaps for GUI Applications</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-01-23-snaps-and-gui-apps.html" />
		<id>https://www.msweet.org/blog/2018-01-23-snaps-and-gui-apps.html</id>
		<updated>2018-01-23T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Building Snaps for GUI Applications</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p><a href="https://snapcraft.io/">Snaps</a> are a convenient way to build binaries for Linux
on multiple architectures and for multiple distributions.  However, the current
documentation for creating snaps is a bit obtuse, making it hard to get a
working snap that can be distributed.</p>

<!--more-->

<h2 id="overview">Overview</h2>

<p>Distribution of Linux applications in binary form has long been a challenge.
Thousands of distributions, versions, and architectures make delivering a
“universal” application pretty much impossible.  The Linux Standard Base was one
attempt at solving this by providing a common base set of libraries and
interfaces that applications could depend on, however the LSB never truly
achieved widespread support.  Many vendors have historically chosen to support
a small subset of popular Linux distributions, typically only on Intel
architecture platforms.</p>

<p><a href="https://snapcraft.io/">Snapcraft</a> is one of several newer application packaging
and distribution mechanisms that are available on Linux that attempt to solve
this problem.  Snaps generally contain all of the libraries and other
prerequisites needed to support the application, solving the library dependency
problem, and are isolated from other applications and operating system
components making it relatively easy (and safe) to install, update, and remove
them.</p>

<p>In addition, Snapcraft provides an
<a href="https://build.snapcraft.io">automated build system</a> that allows you to build
and deploy software built from a Github repository on Intel and ARM architecture
platforms.</p>

<h2 id="preparing-a-gui-application-snap">Preparing a GUI Application Snap</h2>

<p>The documentation for <a href="https://docs.snapcraft.io/build-snaps/">creating your first snap</a>
is a bit incomplete, so what follows are the steps I used to finally create a
working snap for HTMLDOC.  I plan to create snaps for my other projects as time
permits.</p>

<p>Start by creating a directory called <code class="language-plaintext highlighter-rouge">snap</code> in the top directory of your
project.  Next, create a new text file called <code class="language-plaintext highlighter-rouge">snapcraft.yaml</code> in the <code class="language-plaintext highlighter-rouge">snap</code>
directory.  The first line should contain the name of the snap as
<a href="https://dashboard.snapcraft.io">registered</a> on the Snapcraft dashboard:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>name: htmldoc
</code></pre></div></div>

<p>After the name you provide the current version of the snap along with a short
summary and longer description of what the snap does:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>version: 1.9.1
summary: HTML and Markdown conversion utility
description: |
  HTMLDOC is a program that reads HTML and Markdown source files or web pages
  and generates corresponding EPUB, HTML, PostScript, or PDF files with an
  optional table of contents.
</code></pre></div></div>

<p>If you have an icon (most applications do), list it using an <code class="language-plaintext highlighter-rouge">icon</code> line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>icon: desktop/htmldoc-128.png
</code></pre></div></div>

<p>Next the <code class="language-plaintext highlighter-rouge">grade</code> and <code class="language-plaintext highlighter-rouge">confinement</code> lines tell Snapcraft how to treat your snap.
A stable application will have the following lines:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>grade: stable
confinement: strict
</code></pre></div></div>

<p>An application under active development should report “devel” and “devmode”
instead:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>grade: devel
confinement: devmode
</code></pre></div></div>

<p>The application itself is specified in a section called <code class="language-plaintext highlighter-rouge">apps</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apps:
    htmldoc:
        command: desktop-launch $SNAP/bin/htmldoc
        desktop: share/applications/htmldoc.desktop
        plugs: [home, network, x11]
</code></pre></div></div>

<p>Here we define a single application called “htmldoc” that is started using the
<code class="language-plaintext highlighter-rouge">desktop-launch</code> program.  All GUI applications need to use <code class="language-plaintext highlighter-rouge">desktop-launch</code> so
that the application is granted the necessary access to the desktop.  The
<code class="language-plaintext highlighter-rouge">$SNAP</code> variable specifies the snap directory, in which the <code class="language-plaintext highlighter-rouge">htmldoc</code> executable
can be found under the <code class="language-plaintext highlighter-rouge">bin</code> subdirectory.  The application is registered with
a desktop file so it can be run from the application launcher provided by the
desktop environment you are using, e.g., GNOME.  The <code class="language-plaintext highlighter-rouge">plugs</code> value lists a
named set of things (interfaces) your application needs to use - in this case
“home” for the user’s home directory, “network” for network access, and “x11”
for desktop access. <a href="https://docs.snapcraft.io/core/interfaces">Other plugs values</a>
are incompletely documented, so use the <code class="language-plaintext highlighter-rouge">snapcraft interfaces</code> command to list
the currently available values.</p>

<p>Finally, we need to define how to build the application from source.  Since
HTMLDOC is a typical autoconf-based project we can use the “autotools” plugin
with a single build part called “main”:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>parts:
    main:
        plugin: autotools
        source: .
        after: [desktop-gtk3]

build-packages: [libfltk1.3-dev]
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">after</code> line specifies that HTMLDOC is a desktop application with specific
requirements.  A FLTK application should use the GTK+ 3.x rules
(“desktop-gtk3”), while Qt and GNOME applications should use the corresponding
strings (“desktop-qt4”, “desktop-qt5”, or “desktop-gnome-platform”,
respectively).  I found the
<a href="https://wiki.ubuntu.com/snapcraft/parts">Snapcraft parts wiki</a> particularly
useful for getting this part right - search for “desktop-“ for details.</p>

<p>The <code class="language-plaintext highlighter-rouge">build-packages</code> line lists the additional packages required by your
application, in this case “libfltk1.3-dev” (the Fast Light Toolkit) used for
HTMLDOC’s GUI.</p>

<h2 id="accessing-files-from-the-snap">Accessing Files from the Snap</h2>

<p>Most applications have additional data files they need to run.  The <code class="language-plaintext highlighter-rouge">SNAP</code>
environment is set to the installed snap path when your application is run.
For example, HTMLDOC calls a function on startup that checks for the SNAP
environment variable to override the default PREFIX/share/htmldoc directory
that is compiled in:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>const char *snap;
static char datadir[1024];

if ((snap = getenv("SNAP")) != NULL)
{
  snprintf(datadir, sizeof(datadir), "%s/share/htmldoc", snap);
  _htmlData = datadir;
}
</code></pre></div></div>

<h2 id="building-and-testing-the-snap">Building and Testing the Snap</h2>

<p>After you have <a href="https://docs.snapcraft.io/core/install">installed Snapcraft</a> and
the <code class="language-plaintext highlighter-rouge">snapcraft</code> tool (<code class="language-plaintext highlighter-rouge">sudo snap install snapcraft --classic</code>), you can build
your snap from the current directory by running the <code class="language-plaintext highlighter-rouge">snapcraft</code> tool, e.g.:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>snapcraft
</code></pre></div></div>

<p>If successful, you can install the snap locally with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo snap install NAME_VERSION.snap --devmode --dangerous
</code></pre></div></div>

<p>where <code class="language-plaintext highlighter-rouge">NAME</code> is the name of your snap and <code class="language-plaintext highlighter-rouge">VERSION</code> is the build version.  Once
installed you can run the application to test that everything is working.</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC Now Available as a Snap</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2018-01-22-htmldoc-snap.html" />
		<id>https://www.msweet.org/blog/2018-01-22-htmldoc-snap.html</id>
		<updated>2018-01-22T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC Now Available as a Snap</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>After a bunch of experimentation I have finally resolved the GUI bug in the
HTMLDOC snap, so you can now get HTMLDOC on Linux as a
<a href="https://snapcraft.io/store/">snap package</a>! Run <code class="language-plaintext highlighter-rouge">snap install htmldoc</code> to
install the official binaries on Linux.</p>

<p>Enjoy!</p>

<p><a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.1</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-10-30-mmd-1.1.html" />
		<id>https://www.msweet.org/blog/2017-10-30-mmd-1.1.html</id>
		<updated>2017-10-30T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>This release of <code class="language-plaintext highlighter-rouge">mmd</code> fixes a number of bugs, adds C++ support, and adds a
<code class="language-plaintext highlighter-rouge">mmdLoadFile</code> function that loads Markdown content from the <code class="language-plaintext highlighter-rouge">FILE</code> pointer.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.1">Download mmd 1.1</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>The <code class="language-plaintext highlighter-rouge">mmd.h</code> header now includes the C++ <code class="language-plaintext highlighter-rouge">extern "C"</code> wrapper around the C
function prototypes.</li>
  <li>Added a <code class="language-plaintext highlighter-rouge">mmdLoadFile</code> function that loads a markdown document from a <code class="language-plaintext highlighter-rouge">FILE</code>
pointer.</li>
  <li>Fixed a parsing bug for emphasized, bold, and code text containing whitespace.</li>
  <li>Fixed a parsing bug for escaped characters followed by unescaped formatting
sequences.</li>
  <li>Fixed a parsing bug for headings that follow a list.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9.1</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-10-29-htmldoc-1.9.1.html" />
		<id>https://www.msweet.org/blog/2017-10-29-htmldoc-1.9.1.html</id>
		<updated>2017-10-29T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9.1 is primarily a bug fix release that also adds limited support for
UTF-8.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9.1">Download HTMLDOC 1.9.1</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>Fixed monospace font size issue (Issue #309)</li>
  <li>Added support for reproducible builds (Issue #310)</li>
  <li>Added limited support for the HTML 4.0 SPAN element (Issue #311)</li>
  <li>Added (extremely limited) UTF-8 support for input files (Issue #314)</li>
  <li>Fixed buffer underflow for (invalid) short HTML comments (Issue #316)</li>
  <li>Now indent PRE text, by popular request.</li>
  <li>EPUB output now makes sure that <code class="language-plaintext highlighter-rouge">&lt;element property&gt;</code> is written as
<code class="language-plaintext highlighter-rouge">&lt;element property="property"&gt;</code>.</li>
  <li>Now support both NAME and ID for table-of-contents targets.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 2.11</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-10-28-mxml-2.11.html" />
		<id>https://www.msweet.org/blog/2017-10-28-mxml-2.11.html</id>
		<updated>2017-10-28T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 2.11</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 2.11 fixes a number of bugs, adds support for reproducible builds, cross-compilation, and enumeration of element attributes, and adds support for generating EPUB documentation using mxmldoc.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v2.11">Download Mini-XML 2.11</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

<!--more-->

<p>Changes include:</p>

<ul>
  <li>CDATA nodes now omit the trailing “]]” for convenience (Issue #170)</li>
  <li>Fixed a memory leak in mxmlDelete (Issue #183)</li>
  <li><code class="language-plaintext highlighter-rouge">mxmlElementSetAttrf</code> did not work with some versions of Visual Studio
(Issue #184)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">mxmlElementGetAttrByIndex</code> and <code class="language-plaintext highlighter-rouge">mxmlELementGetAttrCount</code> functions
(Issue #185)</li>
  <li>The configure script now properly supports cross-compilation (Issue #188)</li>
  <li>The mxmldoc utility now supports generation of EPUB files (Issue #189)</li>
  <li>The mxmldoc utility now supports the <code class="language-plaintext highlighter-rouge">SOURCE_DATE_EPOCH</code> environment
variable for reproducible builds (Issue #193)</li>
  <li>The mxmldoc utility now supports Markdown (Issue #194)</li>
  <li>Fixed writing of custom data values (Issue #201)</li>
  <li>Added <code class="language-plaintext highlighter-rouge">mxmlNewOpaquef</code> and <code class="language-plaintext highlighter-rouge">mxmlSetOpaquef</code> functions to add and set formatted
opaque string values.</li>
  <li>The mxmldoc utility scanned and loaded descriptive text differently, causing
the detailed descriptions (“discussion”) to be lost in generated
documentation.</li>
  <li>The mxmldoc utility now supports <code class="language-plaintext highlighter-rouge">@exclude format@</code> comments to exclude
documentation based on the output format.  The format string can be <code class="language-plaintext highlighter-rouge">all</code> to
exclude documentation for all formats or a comma-delimited list such as
<code class="language-plaintext highlighter-rouge">@exclude man,html@</code>.</li>
</ul>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">zipc v1.2</title>
		<category term="zipc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-10-26-zipc-1.2.html" />
		<id>https://www.msweet.org/blog/2017-10-26-zipc-1.2.html</id>
		<updated>2017-10-26T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>zipc v1.2</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p><code class="language-plaintext highlighter-rouge">zipc</code> v1.2 adds ZIP read support using the <code class="language-plaintext highlighter-rouge">zipcOpenFile</code>, <code class="language-plaintext highlighter-rouge">zipcFileGets</code>, <code class="language-plaintext highlighter-rouge">zipcFileRead</code>, <code class="language-plaintext highlighter-rouge">zipcFileXMLGets</code>, and <code class="language-plaintext highlighter-rouge">zipcXMLGetAttribute</code> functions. It also fixes use from C++ code, fixes Visual C++ support, and adds support for the <code class="language-plaintext highlighter-rouge">%f</code> format in the <code class="language-plaintext highlighter-rouge">zipcFileXMLPrintf</code> function.</p>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/zipc/releases/tag/v1.2">Download zipc v1.2</a>
<a class="btn btn-default" href="/zipc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">EPM 4.4</title>
		<category term="epm" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-10-11-epm-4.4.html" />
		<id>https://www.msweet.org/blog/2017-10-11-epm-4.4.html</id>
		<updated>2017-10-11T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>EPM 4.4</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>EPM 4.4 is a maintenance release that fixes RPM packaging and several build
issues.</p>

<!--more-->
<p>Changes include:</p>

<ul>
  <li>The default prefix is now the usual <code class="language-plaintext highlighter-rouge">/usr/local</code> (Issue #45)</li>
  <li>Really fix 64-bit Intel packages on Debian-based OS’s (Issue #48)</li>
  <li>Fixed a build issue on Solaris 11 (Issue #50)</li>
  <li>Fixed a bug in temporary file cleanup when symlinks are used (Issue #51)</li>
  <li>Added DESTDIR support to makefiles (Issue #55)</li>
  <li>Fixed RPM support on AIX (Issue #56)</li>
  <li>Reverted the hard links optimization from EPM 4.2 since it is causing
problems with the latest version of RPM (Issue #57)</li>
  <li>Packages on macOS now use “macos” as the operating system name for
consistency.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/epm/releases/tag/v4.4">Download EPM 4.4</a>
<a class="btn btn-default" href="/epm/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.9</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-07-04-htmldoc-1.9.html" />
		<id>https://www.msweet.org/blog/2017-07-04-htmldoc-1.9.html</id>
		<updated>2017-07-04T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.9</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.9 is a limited feature release that adds support for Markdown input
and EPUB output.</p>

<!--more-->
<p>Changes include:</p>

<ul>
  <li>Added support for repeating a single header row for tables that span multiple pages (Issue #16)</li>
  <li>Added support for embedding the current filename/URL in the header or footer (Issue #50)</li>
  <li>Added EPUB support (Issue #301)</li>
  <li>Added Markdown support (Issue #302)</li>
  <li>Fixed a regression in header/footer image scaling (Issue #303)</li>
  <li>Documentation updates (Issue #305)</li>
  <li>Compiler fixes (Issue #304, Issue #306)</li>
  <li>Fixed a bug when running HTMLDOC as a macOS application.</li>
  <li>Updated the bundled libpng to v1.6.29.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.9">Download HTMLDOC 1.9</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">zipc v1.1</title>
		<category term="zipc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-04-23-zipc-1.1.html" />
		<id>https://www.msweet.org/blog/2017-04-23-zipc-1.1.html</id>
		<updated>2017-04-23T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>zipc v1.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p><code class="language-plaintext highlighter-rouge">zipc</code> v1.1 adds a <code class="language-plaintext highlighter-rouge">zipcCopyFile</code> function to efficiently copy files into ZIP
containers and fixes an issue with some EPUB and OPC applications.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/zipc/releases/tag/v1.1">Download zipc v1.1</a>
<a class="btn btn-default" href="/zipc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">mmd v1.0</title>
		<category term="mmd" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-04-23-mmd-1.0.html" />
		<id>https://www.msweet.org/blog/2017-04-23-mmd-1.0.html</id>
		<updated>2017-04-23T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>mmd v1.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p><code class="language-plaintext highlighter-rouge">mmd</code> v1.0 is a miniature markdown parsing “library” consisting of a single C
source file and accompanying header file.  <code class="language-plaintext highlighter-rouge">mmd</code> v1.0 mostly conforms to the
CommonMark version of markdown syntax and supports a couple (otherwise
undocumented) CommonMark extensions.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mmd/releases/tag/v1.0">Download mmd v1.0</a>
<a class="btn btn-default" href="/mmd/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">zipc v1.0</title>
		<category term="zipc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-04-05-zipc-1.0.html" />
		<id>https://www.msweet.org/blog/2017-04-05-zipc-1.0.html</id>
		<updated>2017-04-05T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>zipc v1.0</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p><code class="language-plaintext highlighter-rouge">zipc</code> is a simple ZIP container “library” consisting of a C source file and accompanying header file.  Version 1.0 implements writing of ZIP containers with files smaller than 4GB. Files can be stored as-is or compressed with deflate (gzip) compression.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/zipc/releases/tag/v1.0">Download zipc v1.0</a>
<a class="btn btn-default" href="/zipc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.8.30</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-03-24-htmldoc-1.8.30.html" />
		<id>https://www.msweet.org/blog/2017-03-24-htmldoc-1.8.30.html</id>
		<updated>2017-03-24T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.8.30</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.8.30 fixes some known build and formatting issues. Changes include:</p>

<ul>
  <li>Updated documentation to reflect new project page on Github.</li>
  <li>Dropped old CDE and IRIX desktop integration files.</li>
  <li>Cleaned up the GUI and adopted new default text editors for Linux and macOS.</li>
  <li>PAGE BREAK comments at the end of a file in web page mode would lose the first page (Issue #251)</li>
  <li>Fixed the scaling of header/footer images to limit them to the height of the header or footer (Issue #273)</li>
  <li>Fixed an issue with the top-level makefile not exiting with an error as needed (Issue #282)</li>
  <li>Fixed a URL referencing bug when the same hostname but a different port was used (Issue #290)</li>
  <li>Fixed build issue on macOS (Issue #291)</li>
  <li>Fixed handling of indexed+alpha PNG images (Issue #295)</li>
</ul>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.8.30">Download HTMLDOC 1.8.30</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">RasterView 1.5</title>
		<category term="rasterview" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-03-22-rasterview-1.5.html" />
		<id>https://www.msweet.org/blog/2017-03-22-rasterview-1.5.html</id>
		<updated>2017-03-22T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>RasterView 1.5</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>RasterView 1.5 adds support for Apple raster files.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.5">Download RasterView 1.5</a>
<a class="btn btn-default" href="/rasterview/index.html">Home Page</a></p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Bug Migration Complete</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-03-03-bug-migration-complete.html" />
		<id>https://www.msweet.org/blog/2017-03-03-bug-migration-complete.html</id>
		<updated>2017-03-03T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Bug Migration Complete</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>All of the bug reports from the old server have been migrated to the Github
issue tracker.</p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Moved the Site to Github</title>
		<category term="website" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2017-02-27-moved-to-github.html" />
		<id>https://www.msweet.org/blog/2017-02-27-moved-to-github.html</id>
		<updated>2017-02-27T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Moved the Site to Github</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>I have moved the main msweet.org web site and projects to Github in order to
spend less time maintaining servers and more time programming. All of the
recent releases are already available in the corresponding Github projects, and
I will be migrating the bug reports to the Github issue tracker over the next
couple days.</p>

<p>In lieu of mailing lists, please use the Github issue tracker to ask questions
or report problems with the new web site.</p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 2.10</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2016-06-13-minixml-2.10.html" />
		<id>https://www.msweet.org/blog/2016-06-13-minixml-2.10.html</id>
		<updated>2016-06-13T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 2.10</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 2.10 is now available for download from:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://github.com/michaelrsweet/mxml/releases
</code></pre></div></div>

<p>Mini-XML 2.10 fixes some stack overflow, XML, and API issues.</p>

<!--more-->
<p>Changes include:</p>

<ul>
  <li>The version number in mxml.h was wrong (Bug #532)</li>
  <li>The mxml.spec file was out of date (Bug #521)</li>
  <li>Mini-XML no longer allows malformed element names (Bug #509)</li>
  <li>mxmlLoad* and mxmlSAXLoad* did not properly create text nodes when MXML_TEXT_CALLBACK was specified (Bug #531)</li>
  <li>mxmlDelete used a recursive algorithm which could require large amounts of stack space depending on the file (Bug #549, CVE-2016-4570)</li>
  <li>mxmlWrite* used a recursive algorithm which could require large amounts of stack space depending on the file (Bug #549, CVE-2016-4571)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v2.10">Download Mini-XML v2.10</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>


				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.8.29</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2016-01-03-htmldoc-1.8.29.html" />
		<id>https://www.msweet.org/blog/2016-01-03-htmldoc-1.8.29.html</id>
		<updated>2016-01-03T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.8.29</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.8.29 is now available for download from:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://github.com/michaelrsweet/htmldoc/releases
</code></pre></div></div>

<p>HTMLDOC 1.8.29 fixes some known build and formatting issues, updates support libraries, and drops support for OpenSSL.</p>

<!--more-->
<p>Changes include:</p>

<ul>
  <li>Updated local PNG library to version 1.6.20.</li>
  <li>Updated local JPEG library to version 9b.</li>
  <li>Dropped support for OpenSSL.</li>
  <li>Added configure script support for libjpeg-turbo.</li>
  <li>Updated HTTP code to latest CUPS/ippsample sources.</li>
  <li>Duplex PDF output incorrectly forced an even number of pages (Bug #525)</li>
  <li>The table of contents showed the wrong page numbers after headings containing the _HD_OMIT_TOC attribute.</li>
  <li>Fixed reported build issues (Bug #500, Bug #507, Bug #510, Bug #533)</li>
  <li>The configure script’s –enable-local* options did not work.</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.8.29">Download HTMLDOC v1.8.29</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">EPM 4.3</title>
		<category term="epm" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2015-09-01-epm-4.3.html" />
		<id>https://www.msweet.org/blog/2015-09-01-epm-4.3.html</id>
		<updated>2015-09-01T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>EPM 4.3</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>EPM 4.3 is now available for download from:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://www.msweet.org/downloads.php/epm
</code></pre></div></div>

<p>The new release fixes several issues on Linux and OS X and adds support for signed packages.</p>

<!--more-->
<p>Changes include:</p>

<ul>
  <li>Now use pkgbuild on newer versions of OS X, and added support for signed packages (Bug #497)</li>
  <li>Fixed some file handling issues when creating RPM packages (Bug #523)</li>
  <li>EPM now maps the x86_64 architecture to amd64 when creating Debian packages (Bug #295)</li>
  <li>%format stopped working in EPM 4.2 (Bug #296)</li>
  <li>%literal(spec) did not insert the literal content in the correct location (Bug #302)</li>
  <li>Fixed some incorrect string handling (Bug #290)</li>
  <li>Fixed a compatibility issue with RPM 4.8 (Bug #292)</li>
  <li>Fixed a build dependency problem (Bug #291)</li>
  <li>The EPM makefile now uses CPPFLAGS from the configure script (Bug #300)</li>
  <li>Updated the standard path used by portable package scripts to include /usr/gnu/bin for Solaris (Bug #301)</li>
  <li>Added support for %literal(control) in Debian packages (Bug #297)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/epm/releases/tag/v4.3">Download EPM v4.3</a>
<a class="btn btn-default" href="/epm/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">RasterView 1.4.1</title>
		<category term="rasterview" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2015-08-27-rasterview-1.4.1.html" />
		<id>https://www.msweet.org/blog/2015-08-27-rasterview-1.4.1.html</id>
		<updated>2015-08-27T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>RasterView 1.4.1</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>RasterView 1.4.1 fixes builds on Linux and includes binaries for OS X and Linux.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.4.1">Download RasterView v1.4.1</a>
<a class="btn btn-default" href="/rasterview/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">RasterView 1.4</title>
		<category term="rasterview" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2015-08-26-rasterview-1.4-now-available.html" />
		<id>https://www.msweet.org/blog/2015-08-26-rasterview-1.4-now-available.html</id>
		<updated>2015-08-26T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>RasterView 1.4</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>RasterView 1.4 adds support for viewing Device-N files and improves the display of PWG Raster page attributes.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/rasterview/releases/tag/v1.4">Download RasterView v1.4</a>
<a class="btn btn-default" href="/rasterview/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 2.9</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2014-10-19-minixml-2.9-now-available.html" />
		<id>https://www.msweet.org/blog/2014-10-19-minixml-2.9-now-available.html</id>
		<updated>2014-10-19T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 2.9</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 2.9 is now available for download from:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://github.com/michaelrsweet/mxml/releases
</code></pre></div></div>

<p>Mini-XML 2.9 fixes a bug in the mxmlLoad* functions when using the default (MXML_NO_CALLBACK or MXML_TEXT_CALLBACK) callback.</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v2.9">Download Mini-XML v2.9</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">HTMLDOC 1.8.28</title>
		<category term="htmldoc" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2014-01-06-htmldoc-1.8.28.html" />
		<id>https://www.msweet.org/blog/2014-01-06-htmldoc-1.8.28.html</id>
		<updated>2014-01-06T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>HTMLDOC 1.8.28</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>HTMLDOC 1.8.28 is now available for download from:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://github.com/michaelrsweet/htmldoc/releases
</code></pre></div></div>

<p>HTMLDOC 1.8.28 fixes some known security issues and formatting bugs.</p>

<!--more-->
<p>Changes include:</p>

<ul>
  <li>Updated local zlib to version 1.2.8.</li>
  <li>Updated local PNG library to version 1.6.8.</li>
  <li>Updated local JPEG library to version 9.</li>
  <li>Updated default PDF version to 1.4.</li>
  <li>SECURITY: Fixed three buffer overflow issues when reading AFM files and parsing page sizes.</li>
  <li>Fixed incompatibility with Fortify’s version of strcpy, which does not work properly with variable-length arrays (STR #235)</li>
  <li>Fixed compilation against PNG library 1.5 or later (STR #243)</li>
  <li>Fixed documentation errors (PR #6593, PR #6595)</li>
  <li>Marked Zapf-Dingbats as a standard font (STR #198)</li>
  <li>Fixed GPL license text in GUI (STR #222)</li>
  <li>Fixed a table formatting problem when a column has multiple colspan values (PR #6709)</li>
  <li>Fixed parsing of HTML comments (STR #181)</li>
  <li>Fixed potential out-of-bounds read in table-of-contents rendering code (STR #183)</li>
  <li>Fixed handling of image URLs with ampersands in them (STR #186)</li>
  <li>Fixed top/bottom margins for logo and header/footer images (STR #174)</li>
  <li>Fixed image alignment bug (Bug #231)</li>
  <li>Fixed X11 build problem (Bug #243)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/htmldoc/releases/tag/v1.8.28">Download HTMLDOC v1.8.28</a>
<a class="btn btn-default" href="/htmldoc/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
	<entry>
		<title type="html">Mini-XML 2.8</title>
		<category term="mxml" />
		<link rel="alternate" type="text/html" href="https://www.msweet.org/blog/2014-01-05-minixml-2.8.html" />
		<id>https://www.msweet.org/blog/2014-01-05-minixml-2.8.html</id>
		<updated>2014-01-05T00:00:00+00:00</updated>
		<content type="html" base="https://www.msweet.org">
			<html>
				<head>
					<title>Mini-XML 2.8</title>
					<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous" />
					<link rel="stylesheet" type="text/css" href="/css/michaelrsweet.css" />
				</head>
				<body>
					<p>Mini-XML 2.8 is now available for download from:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://github.com/michaelrsweet/mxml/releases
</code></pre></div></div>

<p>Mini-XML 2.8 fixes some minor platform and XML issues.</p>

<!--more-->
<p>Changes include:</p>

<ul>
  <li>Now call docsetutil using xcrun on OS X (Bug #458)</li>
  <li>mxmldoc did not escape special HTML characters inside @code foo@ comments.</li>
  <li>Fixed a memory leak in mxmlElementDeleteAttr (Bug #452)</li>
  <li>Added MXML_MAJOR/MINOR_VERSION definitions to mxml.h (Bug #461)</li>
  <li>Fixed a bug reading UTF-16 characters from a file (Bug #454)</li>
</ul>

<p>Enjoy!</p>

<p><a class="btn btn-primary" href="https://github.com/michaelrsweet/mxml/releases/tag/v2.8">Download Mini-XML v2.8</a>
<a class="btn btn-default" href="/mxml/index.html">Home Page</a></p>

				</body>
			</html>
		</content>
		<author>
			<name>Michael R Sweet</name>
			<email>webmaster@msweet.org</email>
		</author>
	</entry>
        
</feed>
