+#include "fwd.h"
+
+/*----- File scanner source -----------------------------------------------*/
+
+/* --- File scanner block --- */
+
+typedef struct fscan {
+ scansrc ss;
+ FILE *fp;
+ unsigned f;
+} fscan;
+
+/* --- @scan@ --- */
+
+static int fscan_scan(scansrc *ss)
+{
+ fscan *fs = (fscan *)ss;
+ int ch = getc(fs->fp);
+ if (ch == '\n')
+ fs->ss.line++;
+ return (ch);
+}
+
+/* --- @destroy@ --- */
+
+static void fscan_destroy(scansrc *ss)
+{
+ fscan *fs = (fscan *)ss;
+ if (!(fs->f & SCF_NOCLOSE))
+ fclose(fs->fp);
+ xfree(fs->ss.src);
+ DESTROY(fs);
+}
+
+/* --- File scanner operations --- */
+
+static scansrc_ops fscan_ops = { fscan_scan, fscan_destroy };
+
+/* --- @scan_file@ --- *
+ *
+ * Arguments: @FILE *fp@ = pointer to file descriptor
+ * @const char *name@ = pointer to source file name
+ * @unsigned f@ = flags