diff --git a/wmake/src/wmkdepend.cpp b/wmake/src/wmkdepend.cpp
index d60d1fd4907ecccfd78a9bf56ea8eaab3f996ecf..610af3ecdc9d9c040bf4910c1d994b1da5fa7397 100644
--- a/wmake/src/wmkdepend.cpp
+++ b/wmake/src/wmkdepend.cpp
@@ -73,6 +73,9 @@ Note
 #include <unordered_set>
 #include <vector>
 
+// Ragel switches may have several implicit fallthroughs
+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
+
 // Length of the input read buffer
 #define INBUFLEN 16384
 
@@ -309,7 +312,7 @@ namespace Files
 // Can use 'variable p xxx;' etc to change these names
 
 
-#line 334 "wmkdepend.rl"
+#line 341 "wmkdepend.rl"
 
 
 
@@ -318,22 +321,38 @@ namespace Files
 //
 
 
-#line 322 "wmkdepend.cpp"
+#line 325 "wmkdepend.cpp"
 static const int wmkdep_start = 21;
 static const int wmkdep_error = 0;
 
 static const int wmkdep_en_main = 21;
 
 
-#line 342 "wmkdepend.rl"
+#line 349 "wmkdepend.rl"
 
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
+void processFile(std::string fileName);
+
+//
+// Open a file and process.
+// The file name is given by the [first,last) range
+//
+void processFile(const char* first, const char* last)
+{
+    // Extra safety
+    if (first && last && last > first)
+    {
+        processFile(std::string(first, last));
+    }
+}
+
+
 //
 // Open a file and process
 //
-void processFile(const std::string& fileName)
+void processFile(std::string fileName)
 {
     FILE* infile = Files::open(fileName);
     if (optVerbose)
@@ -348,7 +367,7 @@ void processFile(const std::string& fileName)
     int act, cs;
 
     
-#line 352 "wmkdepend.cpp"
+#line 371 "wmkdepend.cpp"
 	{
 	cs = wmkdep_start;
 	ts = 0;
@@ -356,7 +375,7 @@ void processFile(const std::string& fileName)
 	act = 0;
 	}
 
-#line 363 "wmkdepend.rl"
+#line 386 "wmkdepend.rl"
    /* ^^^ FSM initialization here ^^^ */;
 
     // Local token start
@@ -401,7 +420,7 @@ void processFile(const std::string& fileName)
         }
 
         
-#line 405 "wmkdepend.cpp"
+#line 424 "wmkdepend.cpp"
 	{
 	if ( p == pe )
 		goto _test_eof;
@@ -420,35 +439,35 @@ tr0:
 	}
 	goto st21;
 tr2:
-#line 332 "wmkdepend.rl"
+#line 339 "wmkdepend.rl"
 	{te = p+1;}
 	goto st21;
 tr17:
-#line 332 "wmkdepend.rl"
+#line 339 "wmkdepend.rl"
 	{{p = ((te))-1;}}
 	goto st21;
 tr21:
-#line 327 "wmkdepend.rl"
+#line 334 "wmkdepend.rl"
 	{te = p+1;}
 	goto st21;
 tr29:
-#line 330 "wmkdepend.rl"
+#line 337 "wmkdepend.rl"
 	{te = p+1;}
 	goto st21;
 tr31:
-#line 329 "wmkdepend.rl"
+#line 336 "wmkdepend.rl"
 	{te = p+1;}
 	goto st21;
 tr36:
-#line 324 "wmkdepend.rl"
+#line 331 "wmkdepend.rl"
 	{te = p;p--;}
 	goto st21;
 tr37:
-#line 332 "wmkdepend.rl"
+#line 339 "wmkdepend.rl"
 	{te = p;p--;}
 	goto st21;
 tr38:
-#line 330 "wmkdepend.rl"
+#line 337 "wmkdepend.rl"
 	{te = p;p--;}
 	goto st21;
 st21:
@@ -461,7 +480,7 @@ st21:
 case 21:
 #line 1 "NONE"
 	{ts = p;}
-#line 465 "wmkdepend.cpp"
+#line 484 "wmkdepend.cpp"
 	switch( (*p) ) {
 		case 10: goto st23;
 		case 11: goto tr34;
@@ -482,14 +501,14 @@ case 1:
 tr32:
 #line 1 "NONE"
 	{te = p+1;}
-#line 324 "wmkdepend.rl"
+#line 331 "wmkdepend.rl"
 	{act = 1;}
 	goto st22;
 st22:
 	if ( ++p == pe )
 		goto _test_eof22;
 case 22:
-#line 493 "wmkdepend.cpp"
+#line 512 "wmkdepend.cpp"
 	switch( (*p) ) {
 		case 10: goto st23;
 		case 11: goto tr34;
@@ -511,14 +530,14 @@ case 23:
 tr34:
 #line 1 "NONE"
 	{te = p+1;}
-#line 324 "wmkdepend.rl"
+#line 331 "wmkdepend.rl"
 	{act = 1;}
 	goto st24;
 st24:
 	if ( ++p == pe )
 		goto _test_eof24;
 case 24:
-#line 522 "wmkdepend.cpp"
+#line 541 "wmkdepend.cpp"
 	switch( (*p) ) {
 		case 10: goto st23;
 		case 32: goto tr34;
@@ -616,14 +635,14 @@ case 10:
 	}
 	goto tr12;
 tr12:
-#line 312 "wmkdepend.rl"
-	{ tok = p; /* Local token start */ }
+#line 315 "wmkdepend.rl"
+	{ tok = p;  /* Local token start */ }
 	goto st11;
 st11:
 	if ( ++p == pe )
 		goto _test_eof11;
 case 11:
-#line 627 "wmkdepend.cpp"
+#line 646 "wmkdepend.cpp"
 	switch( (*p) ) {
 		case 10: goto tr15;
 		case 34: goto tr16;
@@ -632,8 +651,8 @@ case 11:
 tr13:
 #line 1 "NONE"
 	{te = p+1;}
-#line 312 "wmkdepend.rl"
-	{ tok = p; /* Local token start */ }
+#line 315 "wmkdepend.rl"
+	{ tok = p;  /* Local token start */ }
 	goto st25;
 tr15:
 #line 1 "NONE"
@@ -643,7 +662,7 @@ st25:
 	if ( ++p == pe )
 		goto _test_eof25;
 case 25:
-#line 647 "wmkdepend.cpp"
+#line 666 "wmkdepend.cpp"
 	if ( (*p) == 34 )
 		goto tr19;
 	goto st12;
@@ -655,26 +674,32 @@ case 12:
 		goto tr19;
 	goto st12;
 tr19:
-#line 313 "wmkdepend.rl"
-	{ processFile(std::string(tok, (p - tok))); }
+#line 317 "wmkdepend.rl"
+	{
+        processFile(tok, p);
+        tok = nullptr;          /* Done with buffer */
+    }
 	goto st13;
 st13:
 	if ( ++p == pe )
 		goto _test_eof13;
 case 13:
-#line 666 "wmkdepend.cpp"
+#line 688 "wmkdepend.cpp"
 	if ( (*p) == 10 )
 		goto tr21;
 	goto st13;
 tr16:
-#line 313 "wmkdepend.rl"
-	{ processFile(std::string(tok, (p - tok))); }
+#line 317 "wmkdepend.rl"
+	{
+        processFile(tok, p);
+        tok = nullptr;          /* Done with buffer */
+    }
 	goto st14;
 st14:
 	if ( ++p == pe )
 		goto _test_eof14;
 case 14:
-#line 678 "wmkdepend.cpp"
+#line 703 "wmkdepend.cpp"
 	if ( (*p) == 10 )
 		goto tr21;
 	goto st14;
@@ -705,7 +730,7 @@ st26:
 	if ( ++p == pe )
 		goto _test_eof26;
 case 26:
-#line 709 "wmkdepend.cpp"
+#line 734 "wmkdepend.cpp"
 	if ( (*p) == 42 )
 		goto st18;
 	goto st17;
@@ -738,14 +763,14 @@ case 19:
 tr30:
 #line 1 "NONE"
 	{te = p+1;}
-#line 330 "wmkdepend.rl"
+#line 337 "wmkdepend.rl"
 	{act = 4;}
 	goto st27;
 st27:
 	if ( ++p == pe )
 		goto _test_eof27;
 case 27:
-#line 749 "wmkdepend.cpp"
+#line 774 "wmkdepend.cpp"
 	if ( (*p) == 10 )
 		goto tr2;
 	goto st1;
@@ -820,7 +845,7 @@ cs = 0;
 	_out: {}
 	}
 
-#line 406 "wmkdepend.rl"
+#line 429 "wmkdepend.rl"
        /* ^^^ FSM execution here ^^^ */;
 
         if (0 == cs)
@@ -834,11 +859,23 @@ cs = 0;
 
         if (ts)
         {
-            // Preserve incomplete token
+            // Preserve incomplete token.
+            // We have the normal ragel range (ts, te) but potentially
+            // our own local buffer start as 'tok'
+
+            if (tok && tok >= ts)
+            {
+                tok = inbuf + (tok - ts);
+            }
+            else
+            {
+                tok = nullptr;          // safety
+            }
+
             pending = pe - ts;
             memmove(inbuf, ts, pending);
-            te = inbuf + (te - ts);   // token end (after memmove)
-            ts = inbuf;               // token start
+            te = inbuf + (te - ts);     // token end (after memmove)
+            ts = inbuf;                 // token start
         }
         else
         {
diff --git a/wmake/src/wmkdepend.rl b/wmake/src/wmkdepend.rl
index a811f519132d4a32bfc03f1192caa8a75f6da35e..3683bd0577b68a413f35c99104b064289dafe1f9 100644
--- a/wmake/src/wmkdepend.rl
+++ b/wmake/src/wmkdepend.rl
@@ -71,6 +71,9 @@ Note
 #include <unordered_set>
 #include <vector>
 
+// Ragel switches may have several implicit fallthroughs
+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
+
 // Length of the input read buffer
 #define INBUFLEN 16384
 
@@ -309,8 +312,12 @@ namespace Files
 %%{
     machine wmkdep;
 
-    action  buffer  { tok = p; /* Local token start */ }
-    action  process { processFile(std::string(tok, (p - tok))); }
+    action  buffer  { tok = p;  /* Local token start */ }
+    action  process
+    {
+        processFile(tok, p);
+        tok = nullptr;          /* Done with buffer */
+    }
 
     white   = [ \t\f\r];        # Horizontal whitespace
     nl      = white* '\n';      # Newline (allow trailing whitespace)
@@ -343,10 +350,26 @@ namespace Files
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
+void processFile(std::string fileName);
+
+//
+// Open a file and process.
+// The file name is given by the [first,last) range
+//
+void processFile(const char* first, const char* last)
+{
+    // Extra safety
+    if (first && last && last > first)
+    {
+        processFile(std::string(first, last));
+    }
+}
+
+
 //
 // Open a file and process
 //
-void processFile(const std::string& fileName)
+void processFile(std::string fileName)
 {
     FILE* infile = Files::open(fileName);
     if (optVerbose)
@@ -416,11 +439,23 @@ void processFile(const std::string& fileName)
 
         if (ts)
         {
-            // Preserve incomplete token
+            // Preserve incomplete token.
+            // We have the normal ragel range (ts, te) but potentially
+            // our own local buffer start as 'tok'
+
+            if (tok && tok >= ts)
+            {
+                tok = inbuf + (tok - ts);
+            }
+            else
+            {
+                tok = nullptr;          // safety
+            }
+
             pending = pe - ts;
             memmove(inbuf, ts, pending);
-            te = inbuf + (te - ts);   // token end (after memmove)
-            ts = inbuf;               // token start
+            te = inbuf + (te - ts);     // token end (after memmove)
+            ts = inbuf;                 // token start
         }
         else
         {