<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=Compare</id>
	<title>Compare - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=Compare"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Compare&amp;action=history"/>
	<updated>2026-04-28T23:18:19Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=Compare&amp;diff=1667&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Compare&amp;diff=1667&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:54Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Back to [[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
This utility allows you to compare two records.  It has a re-synch feature to look 20 lines ahead on either record to try and get things back into line.  You can also input the line numbers to re-start from yourself if needed.&lt;br /&gt;
&lt;br /&gt;
To get the code out quickly, I decided it would prompt for the files and items to compare, rather than parsing the command line.  This makes it extremely portable, as does using TRUE = (1=1) rather than @TRUE.&lt;br /&gt;
&lt;br /&gt;
It doesn&amp;#039;t display characters below ASCII 32 or between 128 and 250 so that it should run on most terminals without creating problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
     PROGRAM COMPARE&lt;br /&gt;
* TCL - KRJ - Comparison program; should run and display on anything&lt;br /&gt;
&lt;br /&gt;
     PROMPT &amp;#039;&amp;#039;&lt;br /&gt;
     BELL = CHAR(7)&lt;br /&gt;
     TRUE = (1=1)&lt;br /&gt;
     FALSE = NOT(TRUE)&lt;br /&gt;
&lt;br /&gt;
     OFFSET = 20&lt;br /&gt;
     ASK = TRUE&lt;br /&gt;
     SHOW = TRUE&lt;br /&gt;
&lt;br /&gt;
     LL = 1&lt;br /&gt;
     BAD = &amp;#039;&amp;#039;&lt;br /&gt;
     FOR XX = 0 TO 31&lt;br /&gt;
        BAD := CHAR(XX)&lt;br /&gt;
     NEXT XX&lt;br /&gt;
     FOR XX = 128 TO 250&lt;br /&gt;
        BAD := CHAR(XX)&lt;br /&gt;
     NEXT XX&lt;br /&gt;
     GOOD = STR(&amp;#039;~&amp;#039;,LEN(BAD))&lt;br /&gt;
&lt;br /&gt;
     CRT &amp;#039;Comparison Program&amp;#039;&lt;br /&gt;
     CRT&lt;br /&gt;
&lt;br /&gt;
     LOOP&lt;br /&gt;
        CRT &amp;#039;Enter 1st file :&amp;#039;:&lt;br /&gt;
        INPUT F1&lt;br /&gt;
        IF F1 EQ &amp;#039;&amp;#039; THEN CRT; STOP&lt;br /&gt;
        GOTIT = FALSE&lt;br /&gt;
        OPEN F1 TO FH1 THEN GOTIT = TRUE ELSE&lt;br /&gt;
           CRT BELL:&amp;#039; Cannot open the file &amp;#039;:F1&lt;br /&gt;
        END&lt;br /&gt;
     UNTIL GOTIT DO&lt;br /&gt;
     REPEAT&lt;br /&gt;
&lt;br /&gt;
     LOOP&lt;br /&gt;
        CRT &amp;#039;Enter 1st item :&amp;#039;:&lt;br /&gt;
        INPUT I1&lt;br /&gt;
        IF I1 EQ &amp;#039;&amp;#039; THEN CRT; STOP&lt;br /&gt;
        GOTIT = FALSE&lt;br /&gt;
        READ R1 FROM FH1, I1 THEN GOTIT = TRUE ELSE&lt;br /&gt;
           CRT BELL:&amp;#039;  Cannot read item &amp;#039;:I1&lt;br /&gt;
        END&lt;br /&gt;
     UNTIL GOTIT DO&lt;br /&gt;
     REPEAT&lt;br /&gt;
&lt;br /&gt;
     LOOP&lt;br /&gt;
        CRT &amp;#039;Enter 2nd file : OR &amp;quot;.&amp;quot; for &amp;#039;:F1:&amp;#039;:&amp;#039;:&lt;br /&gt;
        INPUT F2&lt;br /&gt;
        IF F2 = &amp;#039;.&amp;#039; THEN F2 = F1&lt;br /&gt;
        IF F2 EQ &amp;#039;&amp;#039; THEN CRT; STOP&lt;br /&gt;
        GOTIT = FALSE&lt;br /&gt;
        OPEN F2 TO FH2 THEN GOTIT = TRUE ELSE&lt;br /&gt;
           CRT BELL:&amp;#039; Cannot open the file &amp;#039;:F2&lt;br /&gt;
        END&lt;br /&gt;
     UNTIL GOTIT DO&lt;br /&gt;
     REPEAT&lt;br /&gt;
&lt;br /&gt;
     LOOP&lt;br /&gt;
        CRT &amp;#039;Enter 2nd item : OR &amp;quot;.&amp;quot; for &amp;#039;:I1:&amp;#039;:&amp;#039;:&lt;br /&gt;
        INPUT I2&lt;br /&gt;
        IF I2 = &amp;#039;.&amp;#039; THEN I2 = I1&lt;br /&gt;
        IF I2 EQ &amp;#039;&amp;#039; THEN CRT; STOP&lt;br /&gt;
        GOTIT = FALSE&lt;br /&gt;
        READ R2 FROM FH2, I2 THEN GOTIT = TRUE ELSE&lt;br /&gt;
           CRT BELL:&amp;#039;  Cannot read item &amp;#039;:I2&lt;br /&gt;
        END&lt;br /&gt;
     UNTIL GOTIT DO&lt;br /&gt;
     REPEAT&lt;br /&gt;
&lt;br /&gt;
     IF R1 EQ R2 THEN CRT &amp;#039;SAME&amp;#039; ELSE&lt;br /&gt;
        CRT &amp;#039;DIFFERENT&amp;#039;&lt;br /&gt;
        GOSUB COMPARE.LINES&lt;br /&gt;
     END&lt;br /&gt;
     STOP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
COMPARE.LINES:&lt;br /&gt;
     WIDTH = SYSTEM(2)&lt;br /&gt;
     DEPTH = SYSTEM(3)&lt;br /&gt;
     HALF = INT(WIDTH/2)&lt;br /&gt;
     LHS = &amp;#039;L#&amp;#039;:HALF&lt;br /&gt;
     SPC = SPACE(HALF)&lt;br /&gt;
     LHL = HALF - 3&lt;br /&gt;
     FUL = WIDTH - 3&lt;br /&gt;
&lt;br /&gt;
     XXCNT = DCOUNT(R1,CHAR(254))&lt;br /&gt;
     YYCNT = DCOUNT(R2,CHAR(254))&lt;br /&gt;
     MINM = XXCNT&lt;br /&gt;
     MAXM = XXCNT&lt;br /&gt;
     IF YYCNT LT MINM THEN MINM = YYCNT&lt;br /&gt;
     IF YYCNT GT MAXM THEN MAXM = YYCNT&lt;br /&gt;
     XSIDE = TRUE&lt;br /&gt;
     XX = 0; YY = 0&lt;br /&gt;
LOOPHERE:&lt;br /&gt;
     XX += 1; YY += 1&lt;br /&gt;
     IF XX GT MAXM AND YY GT MAXM THEN&lt;br /&gt;
        IF NOT(SHOW) THEN CRT &amp;#039;Same until end of items&amp;#039;&lt;br /&gt;
STOPIT:&lt;br /&gt;
        CRT&lt;br /&gt;
        STOP&lt;br /&gt;
     END&lt;br /&gt;
     IF XX GT MAXM THEN&lt;br /&gt;
        START = YY&lt;br /&gt;
        FINISH = YYCNT&lt;br /&gt;
        DISP = R2&lt;br /&gt;
        PG = &amp;#039;i &amp;#039;:SPC&lt;br /&gt;
        GOSUB DISPZZ&lt;br /&gt;
        GO STOPIT&lt;br /&gt;
     END&lt;br /&gt;
     IF YY GT MAXM THEN&lt;br /&gt;
        START = XX&lt;br /&gt;
        FINISH = XXCNT&lt;br /&gt;
        DISP = R1&lt;br /&gt;
        PG = &amp;#039;d &amp;#039;&lt;br /&gt;
        GOSUB DISPZZ&lt;br /&gt;
        GO STOPIT&lt;br /&gt;
     END&lt;br /&gt;
     LINEX = R1&amp;lt;XX&amp;gt;&lt;br /&gt;
     LINEY = R2&amp;lt;YY&amp;gt;&lt;br /&gt;
*    TESTX = TRIM(LINEX,&amp;#039; &amp;#039;,&amp;#039;L&amp;#039;)&lt;br /&gt;
*    TESTY = TRIM(LINEY,&amp;#039; &amp;#039;,&amp;#039;L&amp;#039;)&lt;br /&gt;
     TESTX = TRIM(LINEX)&lt;br /&gt;
     TESTY = TRIM(LINEY)&lt;br /&gt;
     IF TESTY EQ TESTX THEN&lt;br /&gt;
        LCT = XX &amp;#039;R#4&amp;#039;:&amp;#039; &amp;#039;&lt;br /&gt;
        LINE = &amp;#039;  &amp;#039;:(LCT:TESTX)[1,FUL]&lt;br /&gt;
        CONVERT BAD TO GOOD IN LINE&lt;br /&gt;
        GOSUB DISP.LINE&lt;br /&gt;
        GO LOOPHERE&lt;br /&gt;
     END&lt;br /&gt;
* they&amp;#039;re different - now resolve it&lt;br /&gt;
     ASK = TRUE&lt;br /&gt;
     SHOW = TRUE&lt;br /&gt;
* first go up to OFFSET from YY - if we hit YYCNT then back up&lt;br /&gt;
     YYLIM = YY + OFFSET&lt;br /&gt;
     IF YYLIM GT YYCNT THEN YYLIM = YYCNT&lt;br /&gt;
     FOR BB = YY TO YYLIM&lt;br /&gt;
*       TESTIT = TRIM(R2&amp;lt;BB&amp;gt;,&amp;#039; &amp;#039;,&amp;#039;L&amp;#039;)&lt;br /&gt;
        TESTIT = TRIM(R2&amp;lt;BB&amp;gt;)&lt;br /&gt;
        IF TESTIT EQ TESTX THEN&lt;br /&gt;
           START = YY&lt;br /&gt;
           FINISH = BB-1&lt;br /&gt;
           DISP = R2&lt;br /&gt;
           PG = &amp;#039;i &amp;#039;:SPC&lt;br /&gt;
           GOSUB DISPZZ&lt;br /&gt;
           XX = XX-1&lt;br /&gt;
           YY = BB-1&lt;br /&gt;
           GO LOOPHERE&lt;br /&gt;
        END&lt;br /&gt;
     NEXT BB&lt;br /&gt;
* then go up to OFFSET from XX&lt;br /&gt;
     XXLIM = XX + OFFSET&lt;br /&gt;
     IF XXLIM GT XXCNT THEN XXLIM = XXCNT&lt;br /&gt;
     FOR BB = XX TO XXLIM&lt;br /&gt;
*       TESTIT = TRIM(R1&amp;lt;BB&amp;gt;,&amp;#039; &amp;#039;,&amp;#039;L&amp;#039;)&lt;br /&gt;
        TESTIT = TRIM(R1&amp;lt;BB&amp;gt;)&lt;br /&gt;
        IF TESTIT EQ TESTY THEN&lt;br /&gt;
           START = XX&lt;br /&gt;
           FINISH = BB-1&lt;br /&gt;
           DISP = R1&lt;br /&gt;
           PG = &amp;#039;d &amp;#039;&lt;br /&gt;
           GOSUB DISPZZ&lt;br /&gt;
           YY = YY-1&lt;br /&gt;
           XX = BB-1&lt;br /&gt;
           GO LOOPHERE&lt;br /&gt;
        END&lt;br /&gt;
     NEXT BB&lt;br /&gt;
     LCT = XX &amp;#039;R#4&amp;#039;:&amp;#039; &amp;#039;&lt;br /&gt;
     LINE = &amp;#039;c &amp;#039;:(LCT:TESTX)[1,LHL]&lt;br /&gt;
     LINE = LINE LHS&lt;br /&gt;
     LCT = YY &amp;#039;R#4&amp;#039;:&amp;#039; &amp;#039;&lt;br /&gt;
     LINE = LINE:&amp;#039;  &amp;#039;:(LCT:TESTY)[1,LHL]&lt;br /&gt;
     CONVERT BAD TO GOOD IN LINE&lt;br /&gt;
     GOSUB DISP.LINE&lt;br /&gt;
     GO LOOPHERE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DISPZZ:&lt;br /&gt;
     FOR ZZ = START TO FINISH&lt;br /&gt;
        LINE = DISP&amp;lt;ZZ&amp;gt;&lt;br /&gt;
        LINE = TRIM(LINE,&amp;#039; &amp;#039;,&amp;#039;L&amp;#039;)&lt;br /&gt;
        LCT = XX &amp;#039;R#4&amp;#039;:&amp;#039; &amp;#039;&lt;br /&gt;
        LINE = PG:(LCT:LINE)[1,LHL]&lt;br /&gt;
        CONVERT BAD TO GOOD IN LINE&lt;br /&gt;
        GOSUB DISP.LINE&lt;br /&gt;
     NEXT ZZ&lt;br /&gt;
     RETURN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DISP.LINE:&lt;br /&gt;
     IF SHOW THEN CRT LINE&lt;br /&gt;
     LL += 1&lt;br /&gt;
     IF ASK AND LL GE DEPTH THEN&lt;br /&gt;
        CRT XX,YY,&amp;#039;Enter &amp;lt;New line&amp;gt; to continue...&amp;#039;:&lt;br /&gt;
        LOOP&lt;br /&gt;
           HELP = FALSE&lt;br /&gt;
           INPUT NL:&lt;br /&gt;
           NL = OCONV(NL,&amp;#039;MCU&amp;#039;)&lt;br /&gt;
           BEGIN CASE&lt;br /&gt;
              CASE NL[1,1] EQ &amp;#039;Q&amp;#039;&lt;br /&gt;
                 GO STOPIT&lt;br /&gt;
              CASE NL[1,1] EQ &amp;#039;N&amp;#039;&lt;br /&gt;
                 ASK = FALSE&lt;br /&gt;
              CASE NL[1,1] EQ &amp;#039;S&amp;#039;&lt;br /&gt;
                 ASK = FALSE&lt;br /&gt;
                 SHOW = FALSE&lt;br /&gt;
              CASE NL[1,1] EQ &amp;#039;T&amp;#039;&lt;br /&gt;
                 XX = 0; YY = 0&lt;br /&gt;
              CASE NL MATCHES &amp;#039;1[[N0N]]&amp;#039;&lt;br /&gt;
                 XX = NL; YY = NL&lt;br /&gt;
              CASE NL MATCHES &amp;quot;1[[N0N]]&amp;#039;,&amp;#039;1[[N0N]]&amp;quot;&lt;br /&gt;
                 XX = FIELD(NL,&amp;#039;,&amp;#039;,1)&lt;br /&gt;
                 YY = FIELD(NL,&amp;#039;,&amp;#039;,2)&lt;br /&gt;
              CASE NL MATCHES &amp;quot;&amp;#039;-&amp;#039;1[[N0N]]&amp;quot;&lt;br /&gt;
                 NL = NL[2,LEN(NL)]&lt;br /&gt;
                 XX = XX - NL&lt;br /&gt;
                 IF XX LT 0 THEN XX = 0&lt;br /&gt;
                 YY = YY - NL&lt;br /&gt;
                 IF YY LT 0 THEN YY = 0&lt;br /&gt;
              CASE NL = &amp;#039;&amp;#039;&lt;br /&gt;
              CASE 1&lt;br /&gt;
                 HELP = TRUE&lt;br /&gt;
           END CASE&lt;br /&gt;
           CRT&lt;br /&gt;
        WHILE HELP DO&lt;br /&gt;
           GOSUB SHOW.HELP&lt;br /&gt;
        REPEAT&lt;br /&gt;
        LL = 1&lt;br /&gt;
     END&lt;br /&gt;
     RETURN&lt;br /&gt;
&lt;br /&gt;
SHOW.HELP:&lt;br /&gt;
     CRT&lt;br /&gt;
     CRT &amp;#039;Note that only the first character of a command is required&amp;#039;&lt;br /&gt;
     CRT&lt;br /&gt;
     CRT &amp;#039;  Q - Quit&amp;#039;&lt;br /&gt;
     CRT &amp;#039;  N - No prompt: display until there is a mismatch&amp;#039;&lt;br /&gt;
     CRT &amp;#039;  S - Scan until there is a mismatch&amp;#039;&lt;br /&gt;
     CRT &amp;#039;  T - Top (start again)&amp;#039;&lt;br /&gt;
     CRT&lt;br /&gt;
     CRT &amp;#039;line number commands&amp;#039;&lt;br /&gt;
     CRT&lt;br /&gt;
     CRT &amp;#039;  n - Start at line number &amp;quot;n&amp;quot;.&amp;#039;&lt;br /&gt;
     CRT &amp;#039; -n - Go up &amp;quot;n&amp;quot; lines&amp;#039;&lt;br /&gt;
     CRT &amp;#039;n,m - Start again with line &amp;quot;n&amp;quot; from &amp;#039;:F1:&amp;#039; item &amp;#039;:I1&lt;br /&gt;
     CRT &amp;#039;      and line &amp;quot;m&amp;quot; from &amp;#039;:F2:&amp;#039; item &amp;#039;:I2&lt;br /&gt;
     CRT&lt;br /&gt;
     RETURN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>