+/* --- @destroy@ --- */
+
+static void avscan_destroy(scansrc *ss)
+{
+ avscan *as = (avscan *)ss;
+ DESTROY(as);
+}
+
+/* --- Argv scanner operations --- */
+
+static scansrc_ops avscan_ops = { avscan_scan, avscan_destroy };
+
+/* --- @scan_argv@ --- *
+ *
+ * Arguments: @char **av@ = pointer to argument array (null terminated)
+ *
+ * Returns: A scanner source.
+ *
+ * Use: Creates a new scanner source for reading from an @argv@
+ * array.
+ */
+
+scansrc *scan_argv(char **av)
+{
+ avscan *as = CREATE(avscan);
+ as->ss.ops = &avscan_ops;
+ as->ss.src = "<argv>";
+ as->ss.line = 1;
+ as->p = *av++;
+ as->av = av;
+ return (&as->ss);
+}
+
+/*----- End-of-file sentinel block ----------------------------------------*/
+
+/* --- @scan@ --- */
+
+static int eof_scan(scansrc *ss)
+{
+ return (EOF);
+}
+
+/* --- @destroy@ --- */
+
+static void eof_destroy(scansrc *ss)
+{
+ ;
+}
+
+/* --- Eof scanner operations --- */
+
+static scansrc_ops eof_ops = { eof_scan, eof_destroy };
+
+/* --- The end of file marker --- */
+
+static scansrc scan_eof = { &scan_eof, &eof_ops, "<eof>", 0, EOF };
+
+/*----- General scanner handling ------------------------------------------*/
+
+/* --- @scan@ --- *
+ *
+ * Arguments: @scanner *sc@ = pointer to main scanner context
+ *
+ * Returns: Character read, or end-of-file.
+ *
+ * Use: Scans a character from a source of characters.
+ */
+
+int scan(scanner *sc)