validator/httpd/cgi-bin check,1.707,1.708

Update of /sources/public/validator/httpd/cgi-bin
In directory hutz:/tmp/cvs-serv24139

Modified Files:
	check 
Log Message:
Simplify error marking code; force marked char to be within shown code excerpt.

Index: check
===================================================================
RCS file: /sources/public/validator/httpd/cgi-bin/check,v
retrieving revision 1.707
retrieving revision 1.708
diff -u -d -r1.707 -r1.708
--- check	4 Oct 2009 20:42:01 -0000	1.707
+++ check	4 Oct 2009 20:43:29 -0000	1.708
@@ -2185,66 +2185,25 @@
 # Chop the source line into 3 pieces; the character at which the error
 # was detected, and everything to the left and right of that position.
 # That way we can add markup to the relevant char without breaking &ent().
+# Expects 1-based column indexes.
 sub mark_error ($$) {
   my $line = shift;
   my $col  = shift;
+  my $linelen = length($line);
 
-  #
-  # Left side...
-  my $left;
-  {
-    my $offset = 0; # Left side always starts at 0.
-    my $length;
-
-    if ($col - 1 < 0) { # If error is at start of line...
-      $length = 0; # ...floor to 0 (no negative offset).
-    } elsif ($col == length $line) { # If error is at EOL...
-      $length = $col - 1; # ...leave last char to indicate position.
-    } else { # Otherwise grab everything up to pos of error.
-      $length = $col-1;
-    }
-    $left = substr $line, $offset, $length;
-  }
-
-  #
-  # The character where the error was detected.
-  my $char;
-  {
-    my $offset;
-    my $length = 1; # Length is always 1; the char where error was found.
-
-    if ($col == length $line) { # If err is at EOL...
-      $offset = $col - 1; # ...then grab last char on line instead.
-    } else {
-      $offset = $col-1; # Otherwise just grab the char.
-    }
-    $char = substr $line, $offset, $length;
-    $char = &ent($char);
+  # Coerce column into an index valid within the line.
+  if ($col < 1) {
+    $col = 1;
+  } elsif ($col > $linelen) {
+    $col = $linelen;
   }
+  $col--;
 
-  #
-  # The right side up to the end of the line...
-  my $right;
-  {
-    my $offset;
-    my $length;
-
-    # Offset...
-    if ($col == length $line) { # If at EOL...
-      $offset = 0; # Don't bother as there is nothing left to grab.
-    } else {
-      $offset = $col; # Otherwise get everything from char-after-error.
-    }
-
-    # Length...
-    if ($col == length $line) { # If at end of line...
-      $length = 0; # ...then don't grab anything.
-    } else {
-      $length = length($line) - ($col - 1); # Otherwise get the rest of the line.
-    }
-    $right = substr $line, $offset, $length;
-  }
+  my $left  = substr($line, 0, $col);
+  my $char  = substr($line, $col, 1);
+  my $right = substr($line, $col + 1);
 
+  $char = &ent($char);
   $char = qq(<strong title="Position where error was detected.">$char</strong>);
   $line = &ent($left) . $char . &ent($right);
 

Received on Sunday, 4 October 2009 20:43:35 UTC