From be782af7a30456990e7bcc58e40be3ac11e1ce17 Mon Sep 17 00:00:00 2001
From: Manlio Perillo <manlio.perillo@gmail.com>
Date: Mon, 10 Apr 2023 18:14:58 +0200
Subject: [PATCH] build: restore compatibility support

Commit 0d56ba3 (build: restore the exercise chain) broke the
compatibility support for old compilers, due to the use of the
multi-object for loop syntax.

Use the normal for loop syntax; the change still keep the code readable.

Use the variable `n`, instead of `i`, when referring to the exercise
number; this will improve the readability.

Closes #227
---
 build.zig | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/build.zig b/build.zig
index 32ce74a..39096fe 100644
--- a/build.zig
+++ b/build.zig
@@ -559,13 +559,13 @@ pub fn build(b: *Build) !void {
 
     const header_step = PrintStep.create(b, logo, std.io.getStdErr());
 
-    if (exno) |i| {
-        if (i == 0 or i > exercises.len - 1) {
-            print("unknown exercise number: {}\n", .{i});
+    if (exno) |n| {
+        if (n == 0 or n > exercises.len - 1) {
+            print("unknown exercise number: {}\n", .{n});
             std.os.exit(1);
         }
 
-        const ex = exercises[i - 1];
+        const ex = exercises[n - 1];
         const base_name = ex.baseName();
         const file_path = std.fs.path.join(b.allocator, &[_][]const u8{
             if (use_healed) "patches/healed" else "exercises", ex.main_file,
@@ -603,8 +603,8 @@ pub fn build(b: *Build) !void {
 
         var prev_step = verify_step;
         for (exercises) |exn| {
-            const n = exn.number();
-            if (n > i) {
+            const nth = exn.number();
+            if (nth > n) {
                 const verify_stepn = ZiglingStep.create(b, exn, use_healed);
                 verify_stepn.step.dependOn(&prev_step.step);
 
@@ -646,8 +646,11 @@ pub fn build(b: *Build) !void {
     ziglings_step.dependOn(&header_step.step);
     b.default_step = ziglings_step;
 
+    // Don't use the "multi-object for loop" syntax, in order to avoid a syntax
+    // error with old Zig compilers.
     var prev_step: *Step = undefined;
-    for (exercises, 0..) |ex, i| {
+    for (exercises) |ex| {
+        const n = ex.number();
         const base_name = ex.baseName();
         const file_path = std.fs.path.join(b.allocator, &[_][]const u8{
             "exercises", ex.main_file,
@@ -657,7 +660,7 @@ pub fn build(b: *Build) !void {
         build_step.install();
 
         const verify_stepn = ZiglingStep.create(b, ex, use_healed);
-        if (i == 0) {
+        if (n == 1) {
             prev_step = &verify_stepn.step;
         } else {
             verify_stepn.step.dependOn(prev_step);