mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	patch 9.1.1459: xxd: coloring output is inefficient
Problem:  xxd prints color escape sequences for every octet
          even if the color doesn't change
Solution: use separate arrays for colors and text and only
          print escape sequences when the color changes
          (Emanuel Krollmann)
fixes: #15122
closes: #17535
Signed-off-by: Emanuel Krollmann <E.Krollmann@protonmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							f5aa269f2d
						
					
				
				
					commit
					6897f18ee6
				
			| @@ -444,7 +444,7 @@ func Test_xxd_buffer_overflow() | |||||||
|   endif |   endif | ||||||
|   new |   new | ||||||
|   let input = repeat('A', 256) |   let input = repeat('A', 256) | ||||||
|   call writefile(['-9223372036854775808: ' . repeat("\e[1;32m41\e[0m ", 256) . ' ' . repeat("\e[1;32mA\e[0m", 256)], 'Xxdexpected', 'D') |   call writefile(['-9223372036854775808: ' . repeat("\e[1;32m41\e[0m ", 256) . ' ' . "\e[1;32m" . repeat('A', 256) . "\e[0m"], 'Xxdexpected', 'D') | ||||||
|   exe 'r! printf ' . input . '| ' . s:xxd_cmd . ' -Ralways -g1 -c256 -d -o 9223372036854775808 > Xxdout' |   exe 'r! printf ' . input . '| ' . s:xxd_cmd . ' -Ralways -g1 -c256 -d -o 9223372036854775808 > Xxdout' | ||||||
|   call assert_equalfile('Xxdexpected', 'Xxdout') |   call assert_equalfile('Xxdexpected', 'Xxdout') | ||||||
|   call delete('Xxdout') |   call delete('Xxdout') | ||||||
| @@ -560,70 +560,70 @@ call writefile(data,'Xinput') | |||||||
|   exe '0r! ' . s:xxd_cmd . ' -R always -c 4 ' . ' XXDfile' |   exe '0r! ' . s:xxd_cmd . ' -R always -c 4 ' . ' XXDfile' | ||||||
|   $d |   $d | ||||||
|   let expected = [ |   let expected = [ | ||||||
|       \ "00000000: \e[1;37m00\e[0m\e[1;31m01\e[0m \e[1;31m02\e[0m\e[1;31m03\e[0m  \e[1;37m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000000: \e[1;37m00\e[0m\e[1;31m01\e[0m \e[1;31m0203\e[0m  \e[1;37m.\e[0m\e[1;31m...\e[0m", | ||||||
|       \ "00000004: \e[1;31m04\e[0m\e[1;31m05\e[0m \e[1;31m06\e[0m\e[1;31m07\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000004: \e[1;31m0405\e[0m \e[1;31m0607\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000008: \e[1;31m08\e[0m\e[1;33m09\e[0m \e[1;33m0a\e[0m\e[1;31m0b\e[0m  \e[1;31m.\e[0m\e[1;33m.\e[0m\e[1;33m.\e[0m\e[1;31m.\e[0m", |       \ "00000008: \e[1;31m08\e[0m\e[1;33m09\e[0m \e[1;33m0a\e[0m\e[1;31m0b\e[0m  \e[1;31m.\e[0m\e[1;33m..\e[0m\e[1;31m.\e[0m", | ||||||
|       \ "0000000c: \e[1;31m0c\e[0m\e[1;33m0d\e[0m \e[1;31m0e\e[0m\e[1;31m0f\e[0m  \e[1;31m.\e[0m\e[1;33m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "0000000c: \e[1;31m0c\e[0m\e[1;33m0d\e[0m \e[1;31m0e0f\e[0m  \e[1;31m.\e[0m\e[1;33m.\e[0m\e[1;31m..\e[0m", | ||||||
|       \ "00000010: \e[1;31m10\e[0m\e[1;31m11\e[0m \e[1;31m12\e[0m\e[1;31m13\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000010: \e[1;31m1011\e[0m \e[1;31m1213\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000014: \e[1;31m14\e[0m\e[1;31m15\e[0m \e[1;31m16\e[0m\e[1;31m17\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000014: \e[1;31m1415\e[0m \e[1;31m1617\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000018: \e[1;31m18\e[0m\e[1;31m19\e[0m \e[1;31m1a\e[0m\e[1;31m1b\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000018: \e[1;31m1819\e[0m \e[1;31m1a1b\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "0000001c: \e[1;31m1c\e[0m\e[1;31m1d\e[0m \e[1;31m1e\e[0m\e[1;31m1f\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "0000001c: \e[1;31m1c1d\e[0m \e[1;31m1e1f\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000020: \e[1;32m20\e[0m\e[1;32m21\e[0m \e[1;32m22\e[0m\e[1;32m23\e[0m  \e[1;32m \e[0m\e[1;32m!\e[0m\e[1;32m\"\e[0m\e[1;32m#\e[0m", |       \ "00000020: \e[1;32m2021\e[0m \e[1;32m2223\e[0m  \e[1;32m !\"#\e[0m", | ||||||
|       \ "00000024: \e[1;32m24\e[0m\e[1;32m25\e[0m \e[1;32m26\e[0m\e[1;37m00\e[0m  \e[1;32m$\e[0m\e[1;32m%\e[0m\e[1;32m&\e[0m\e[1;37m.\e[0m", |       \ "00000024: \e[1;32m2425\e[0m \e[1;32m26\e[0m\e[1;37m00\e[0m  \e[1;32m$%&\e[0m\e[1;37m.\e[0m", | ||||||
|       \ "00000028: \e[1;32m28\e[0m\e[1;32m29\e[0m \e[1;32m2a\e[0m\e[1;32m2b\e[0m  \e[1;32m(\e[0m\e[1;32m)\e[0m\e[1;32m*\e[0m\e[1;32m+\e[0m", |       \ "00000028: \e[1;32m2829\e[0m \e[1;32m2a2b\e[0m  \e[1;32m()*+\e[0m", | ||||||
|       \ "0000002c: \e[1;32m2c\e[0m\e[1;32m2d\e[0m \e[1;32m2e\e[0m\e[1;32m2f\e[0m  \e[1;32m,\e[0m\e[1;32m-\e[0m\e[1;32m.\e[0m\e[1;32m/\e[0m", |       \ "0000002c: \e[1;32m2c2d\e[0m \e[1;32m2e2f\e[0m  \e[1;32m,-./\e[0m", | ||||||
|       \ "00000030: \e[1;32m30\e[0m\e[1;32m31\e[0m \e[1;32m32\e[0m\e[1;32m33\e[0m  \e[1;32m0\e[0m\e[1;32m1\e[0m\e[1;32m2\e[0m\e[1;32m3\e[0m", |       \ "00000030: \e[1;32m3031\e[0m \e[1;32m3233\e[0m  \e[1;32m0123\e[0m", | ||||||
|       \ "00000034: \e[1;32m34\e[0m\e[1;32m35\e[0m \e[1;32m36\e[0m\e[1;32m37\e[0m  \e[1;32m4\e[0m\e[1;32m5\e[0m\e[1;32m6\e[0m\e[1;32m7\e[0m", |       \ "00000034: \e[1;32m3435\e[0m \e[1;32m3637\e[0m  \e[1;32m4567\e[0m", | ||||||
|       \ "00000038: \e[1;32m38\e[0m\e[1;32m39\e[0m \e[1;32m3a\e[0m\e[1;32m3b\e[0m  \e[1;32m8\e[0m\e[1;32m9\e[0m\e[1;32m:\e[0m\e[1;32m;\e[0m", |       \ "00000038: \e[1;32m3839\e[0m \e[1;32m3a3b\e[0m  \e[1;32m89:;\e[0m", | ||||||
|       \ "0000003c: \e[1;32m3c\e[0m\e[1;32m3d\e[0m \e[1;32m3e\e[0m\e[1;32m3f\e[0m  \e[1;32m<\e[0m\e[1;32m=\e[0m\e[1;32m>\e[0m\e[1;32m?\e[0m", |       \ "0000003c: \e[1;32m3c3d\e[0m \e[1;32m3e3f\e[0m  \e[1;32m<=>?\e[0m", | ||||||
|       \ "00000040: \e[1;32m40\e[0m\e[1;32m41\e[0m \e[1;32m42\e[0m\e[1;32m43\e[0m  \e[1;32m@\e[0m\e[1;32mA\e[0m\e[1;32mB\e[0m\e[1;32mC\e[0m", |       \ "00000040: \e[1;32m4041\e[0m \e[1;32m4243\e[0m  \e[1;32m@ABC\e[0m", | ||||||
|       \ "00000044: \e[1;32m44\e[0m\e[1;32m45\e[0m \e[1;32m46\e[0m\e[1;32m47\e[0m  \e[1;32mD\e[0m\e[1;32mE\e[0m\e[1;32mF\e[0m\e[1;32mG\e[0m", |       \ "00000044: \e[1;32m4445\e[0m \e[1;32m4647\e[0m  \e[1;32mDEFG\e[0m", | ||||||
|       \ "00000048: \e[1;32m48\e[0m\e[1;32m49\e[0m \e[1;32m4a\e[0m\e[1;32m4b\e[0m  \e[1;32mH\e[0m\e[1;32mI\e[0m\e[1;32mJ\e[0m\e[1;32mK\e[0m", |       \ "00000048: \e[1;32m4849\e[0m \e[1;32m4a4b\e[0m  \e[1;32mHIJK\e[0m", | ||||||
|       \ "0000004c: \e[1;32m4c\e[0m\e[1;32m4d\e[0m \e[1;32m4e\e[0m\e[1;32m4f\e[0m  \e[1;32mL\e[0m\e[1;32mM\e[0m\e[1;32mN\e[0m\e[1;32mO\e[0m", |       \ "0000004c: \e[1;32m4c4d\e[0m \e[1;32m4e4f\e[0m  \e[1;32mLMNO\e[0m", | ||||||
|       \ "00000050: \e[1;32m50\e[0m\e[1;32m51\e[0m \e[1;32m52\e[0m\e[1;32m53\e[0m  \e[1;32mP\e[0m\e[1;32mQ\e[0m\e[1;32mR\e[0m\e[1;32mS\e[0m", |       \ "00000050: \e[1;32m5051\e[0m \e[1;32m5253\e[0m  \e[1;32mPQRS\e[0m", | ||||||
|       \ "00000054: \e[1;32m54\e[0m\e[1;32m55\e[0m \e[1;32m56\e[0m\e[1;32m57\e[0m  \e[1;32mT\e[0m\e[1;32mU\e[0m\e[1;32mV\e[0m\e[1;32mW\e[0m", |       \ "00000054: \e[1;32m5455\e[0m \e[1;32m5657\e[0m  \e[1;32mTUVW\e[0m", | ||||||
|       \ "00000058: \e[1;32m58\e[0m\e[1;32m59\e[0m \e[1;32m5a\e[0m\e[1;32m5b\e[0m  \e[1;32mX\e[0m\e[1;32mY\e[0m\e[1;32mZ\e[0m\e[1;32m[\e[0m", |       \ "00000058: \e[1;32m5859\e[0m \e[1;32m5a5b\e[0m  \e[1;32mXYZ[\e[0m", | ||||||
|       \ "0000005c: \e[1;37m00\e[0m\e[1;32m5d\e[0m \e[1;32m5e\e[0m\e[1;32m5f\e[0m  \e[1;37m.\e[0m\e[1;32m]\e[0m\e[1;32m^\e[0m\e[1;32m_\e[0m", |       \ "0000005c: \e[1;37m00\e[0m\e[1;32m5d\e[0m \e[1;32m5e5f\e[0m  \e[1;37m.\e[0m\e[1;32m]^_\e[0m", | ||||||
|       \ "00000060: \e[1;32m60\e[0m\e[1;32m61\e[0m \e[1;32m62\e[0m\e[1;32m63\e[0m  \e[1;32m`\e[0m\e[1;32ma\e[0m\e[1;32mb\e[0m\e[1;32mc\e[0m", |       \ "00000060: \e[1;32m6061\e[0m \e[1;32m6263\e[0m  \e[1;32m`abc\e[0m", | ||||||
|       \ "00000064: \e[1;32m64\e[0m\e[1;32m65\e[0m \e[1;32m66\e[0m\e[1;32m67\e[0m  \e[1;32md\e[0m\e[1;32me\e[0m\e[1;32mf\e[0m\e[1;32mg\e[0m", |       \ "00000064: \e[1;32m6465\e[0m \e[1;32m6667\e[0m  \e[1;32mdefg\e[0m", | ||||||
|       \ "00000068: \e[1;32m68\e[0m\e[1;32m69\e[0m \e[1;32m6a\e[0m\e[1;32m6b\e[0m  \e[1;32mh\e[0m\e[1;32mi\e[0m\e[1;32mj\e[0m\e[1;32mk\e[0m", |       \ "00000068: \e[1;32m6869\e[0m \e[1;32m6a6b\e[0m  \e[1;32mhijk\e[0m", | ||||||
|       \ "0000006c: \e[1;32m6c\e[0m\e[1;32m6d\e[0m \e[1;32m6e\e[0m\e[1;32m6f\e[0m  \e[1;32ml\e[0m\e[1;32mm\e[0m\e[1;32mn\e[0m\e[1;32mo\e[0m", |       \ "0000006c: \e[1;32m6c6d\e[0m \e[1;32m6e6f\e[0m  \e[1;32mlmno\e[0m", | ||||||
|       \ "00000070: \e[1;32m70\e[0m\e[1;32m71\e[0m \e[1;32m72\e[0m\e[1;32m73\e[0m  \e[1;32mp\e[0m\e[1;32mq\e[0m\e[1;32mr\e[0m\e[1;32ms\e[0m", |       \ "00000070: \e[1;32m7071\e[0m \e[1;32m7273\e[0m  \e[1;32mpqrs\e[0m", | ||||||
|       \ "00000074: \e[1;32m74\e[0m\e[1;32m75\e[0m \e[1;32m76\e[0m\e[1;32m77\e[0m  \e[1;32mt\e[0m\e[1;32mu\e[0m\e[1;32mv\e[0m\e[1;32mw\e[0m", |       \ "00000074: \e[1;32m7475\e[0m \e[1;32m7677\e[0m  \e[1;32mtuvw\e[0m", | ||||||
|       \ "00000078: \e[1;32m78\e[0m\e[1;32m79\e[0m \e[1;32m7a\e[0m\e[1;32m7b\e[0m  \e[1;32mx\e[0m\e[1;32my\e[0m\e[1;32mz\e[0m\e[1;32m{\e[0m", |       \ "00000078: \e[1;32m7879\e[0m \e[1;32m7a7b\e[0m  \e[1;32mxyz{\e[0m", | ||||||
|       \ "0000007c: \e[1;32m7c\e[0m\e[1;32m7d\e[0m \e[1;32m7e\e[0m\e[1;31m7f\e[0m  \e[1;32m|\e[0m\e[1;32m}\e[0m\e[1;32m~\e[0m\e[1;31m.\e[0m", |       \ "0000007c: \e[1;32m7c7d\e[0m \e[1;32m7e\e[0m\e[1;31m7f\e[0m  \e[1;32m|}~\e[0m\e[1;31m.\e[0m", | ||||||
|       \ "00000080: \e[1;31m80\e[0m\e[1;31m81\e[0m \e[1;31m82\e[0m\e[1;31m83\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000080: \e[1;31m8081\e[0m \e[1;31m8283\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000084: \e[1;31m84\e[0m\e[1;31m85\e[0m \e[1;31m86\e[0m\e[1;31m87\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000084: \e[1;31m8485\e[0m \e[1;31m8687\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000088: \e[1;31m88\e[0m\e[1;31m89\e[0m \e[1;31m8a\e[0m\e[1;31m8b\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000088: \e[1;31m8889\e[0m \e[1;31m8a8b\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "0000008c: \e[1;31m8c\e[0m\e[1;31m8d\e[0m \e[1;31m8e\e[0m\e[1;31m8f\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "0000008c: \e[1;31m8c8d\e[0m \e[1;31m8e8f\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000090: \e[1;31m90\e[0m\e[1;31m91\e[0m \e[1;31m92\e[0m\e[1;31m93\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000090: \e[1;31m9091\e[0m \e[1;31m9293\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000094: \e[1;31m94\e[0m\e[1;31m95\e[0m \e[1;31m96\e[0m\e[1;31m97\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000094: \e[1;31m9495\e[0m \e[1;31m9697\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "00000098: \e[1;31m98\e[0m\e[1;31m99\e[0m \e[1;31m9a\e[0m\e[1;31m9b\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "00000098: \e[1;31m9899\e[0m \e[1;31m9a9b\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "0000009c: \e[1;31m9c\e[0m\e[1;31m9d\e[0m \e[1;31m9e\e[0m\e[1;31m9f\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "0000009c: \e[1;31m9c9d\e[0m \e[1;31m9e9f\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000a0: \e[1;31ma0\e[0m\e[1;31ma1\e[0m \e[1;31ma2\e[0m\e[1;31ma3\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000a0: \e[1;31ma0a1\e[0m \e[1;31ma2a3\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000a4: \e[1;31ma4\e[0m\e[1;31ma5\e[0m \e[1;31ma6\e[0m\e[1;31ma7\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000a4: \e[1;31ma4a5\e[0m \e[1;31ma6a7\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000a8: \e[1;31ma8\e[0m\e[1;31ma9\e[0m \e[1;31maa\e[0m\e[1;31mab\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000a8: \e[1;31ma8a9\e[0m \e[1;31maaab\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000ac: \e[1;31mac\e[0m\e[1;31mad\e[0m \e[1;31mae\e[0m\e[1;31maf\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000ac: \e[1;31macad\e[0m \e[1;31maeaf\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000b0: \e[1;31mb0\e[0m\e[1;31mb1\e[0m \e[1;31mb2\e[0m\e[1;31mb3\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000b0: \e[1;31mb0b1\e[0m \e[1;31mb2b3\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000b4: \e[1;31mb4\e[0m\e[1;31mb5\e[0m \e[1;31mb6\e[0m\e[1;31mb7\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000b4: \e[1;31mb4b5\e[0m \e[1;31mb6b7\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000b8: \e[1;31mb8\e[0m\e[1;31mb9\e[0m \e[1;31mba\e[0m\e[1;31mbb\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000b8: \e[1;31mb8b9\e[0m \e[1;31mbabb\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000bc: \e[1;31mbc\e[0m\e[1;31mbd\e[0m \e[1;31mbe\e[0m\e[1;31mbf\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000bc: \e[1;31mbcbd\e[0m \e[1;31mbebf\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000c0: \e[1;31mc0\e[0m\e[1;31mc1\e[0m \e[1;31mc2\e[0m\e[1;31mc3\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000c0: \e[1;31mc0c1\e[0m \e[1;31mc2c3\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000c4: \e[1;31mc4\e[0m\e[1;31mc5\e[0m \e[1;31mc6\e[0m\e[1;31mc7\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000c4: \e[1;31mc4c5\e[0m \e[1;31mc6c7\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000c8: \e[1;31mc8\e[0m\e[1;31mc9\e[0m \e[1;31mca\e[0m\e[1;31mcb\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000c8: \e[1;31mc8c9\e[0m \e[1;31mcacb\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000cc: \e[1;31mcc\e[0m\e[1;31mcd\e[0m \e[1;31mce\e[0m\e[1;31mcf\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000cc: \e[1;31mcccd\e[0m \e[1;31mcecf\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000d0: \e[1;31md0\e[0m\e[1;31md1\e[0m \e[1;31md2\e[0m\e[1;31md3\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000d0: \e[1;31md0d1\e[0m \e[1;31md2d3\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000d4: \e[1;31md4\e[0m\e[1;31md5\e[0m \e[1;31md6\e[0m\e[1;31md7\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000d4: \e[1;31md4d5\e[0m \e[1;31md6d7\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000d8: \e[1;31md8\e[0m\e[1;31md9\e[0m \e[1;31mda\e[0m\e[1;31mdb\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000d8: \e[1;31md8d9\e[0m \e[1;31mdadb\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000dc: \e[1;31mdc\e[0m\e[1;31mdd\e[0m \e[1;31mde\e[0m\e[1;31mdf\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000dc: \e[1;31mdcdd\e[0m \e[1;31mdedf\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000e0: \e[1;31me0\e[0m\e[1;31me1\e[0m \e[1;31me2\e[0m\e[1;31me3\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000e0: \e[1;31me0e1\e[0m \e[1;31me2e3\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000e4: \e[1;31me4\e[0m\e[1;31me5\e[0m \e[1;31me6\e[0m\e[1;31me7\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000e4: \e[1;31me4e5\e[0m \e[1;31me6e7\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000e8: \e[1;31me8\e[0m\e[1;31me9\e[0m \e[1;31mea\e[0m\e[1;31meb\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000e8: \e[1;31me8e9\e[0m \e[1;31meaeb\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000ec: \e[1;31mec\e[0m\e[1;31med\e[0m \e[1;31mee\e[0m\e[1;31mef\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000ec: \e[1;31meced\e[0m \e[1;31meeef\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000f0: \e[1;31mf0\e[0m\e[1;31mf1\e[0m \e[1;31mf2\e[0m\e[1;31mf3\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000f0: \e[1;31mf0f1\e[0m \e[1;31mf2f3\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000f4: \e[1;31mf4\e[0m\e[1;31mf5\e[0m \e[1;31mf6\e[0m\e[1;31mf7\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000f4: \e[1;31mf4f5\e[0m \e[1;31mf6f7\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000f8: \e[1;31mf8\e[0m\e[1;31mf9\e[0m \e[1;31mfa\e[0m\e[1;31mfb\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m", |       \ "000000f8: \e[1;31mf8f9\e[0m \e[1;31mfafb\e[0m  \e[1;31m....\e[0m", | ||||||
|       \ "000000fc: \e[1;31mfc\e[0m\e[1;31mfd\e[0m \e[1;31mfe\e[0m\e[1;34mff\e[0m  \e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;31m.\e[0m\e[1;34m.\e[0m"] |       \ "000000fc: \e[1;31mfcfd\e[0m \e[1;31mfe\e[0m\e[1;34mff\e[0m  \e[1;31m...\e[0m\e[1;34m.\e[0m"] | ||||||
|   call assert_equal(expected, getline(1,'$'), s:Mess(s:test)) |   call assert_equal(expected, getline(1,'$'), s:Mess(s:test)) | ||||||
|  |  | ||||||
|   call delete('Xinput') |   call delete('Xinput') | ||||||
|   | |||||||
| @@ -709,6 +709,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     1459, | ||||||
| /**/ | /**/ | ||||||
|     1458, |     1458, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
							
								
								
									
										237
									
								
								src/xxd/xxd.c
									
									
									
									
									
								
							
							
						
						
									
										237
									
								
								src/xxd/xxd.c
									
									
									
									
									
								
							| @@ -67,6 +67,7 @@ | |||||||
|  * 19.10.2024  -e did add an extra space #15899 |  * 19.10.2024  -e did add an extra space #15899 | ||||||
|  * 11.11.2024  improve end-of-options argument parser #9285 |  * 11.11.2024  improve end-of-options argument parser #9285 | ||||||
|  * 07.12.2024  fix overflow with xxd --autoskip and large sparse files #16175 |  * 07.12.2024  fix overflow with xxd --autoskip and large sparse files #16175 | ||||||
|  |  * 15.06.2025  improve color code logic | ||||||
|  * |  * | ||||||
|  * (c) 1990-1998 by Juergen Weigert (jnweiger@gmail.com) |  * (c) 1990-1998 by Juergen Weigert (jnweiger@gmail.com) | ||||||
|  * |  * | ||||||
| @@ -147,7 +148,7 @@ extern void perror __P((char *)); | |||||||
| # endif | # endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| char version[] = "xxd 2024-12-07 by Juergen Weigert et al."; | char version[] = "xxd 2025-06-15 by Juergen Weigert et al."; | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
| char osver[] = " (Win32)"; | char osver[] = " (Win32)"; | ||||||
| #else | #else | ||||||
| @@ -221,6 +222,18 @@ char osver[] = ""; | |||||||
|     + 12 * COLS    /* ASCII dump with colors */ \ |     + 12 * COLS    /* ASCII dump with colors */ \ | ||||||
|     + 2)           /* "\n\0" */ |     + 2)           /* "\n\0" */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * LLEN_NO_COLOR is the maximum length of a line excluding the colors. | ||||||
|  |  */ | ||||||
|  | #define LLEN_NO_COLOR \ | ||||||
|  |     (39            /* addr: ⌈log10(ULONG_MAX)⌉ if "-d" flag given. We assume ULONG_MAX = 2**128 */ \ | ||||||
|  |     + 2            /* ": " */ \ | ||||||
|  |     + 2 * COLS    /* hex dump */ \ | ||||||
|  |     + (COLS - 1)   /* whitespace between groups if "-g1" option given and "-c" maxed out */ \ | ||||||
|  |     + 2            /* whitespace */ \ | ||||||
|  |     + COLS    /* ASCII dump */ \ | ||||||
|  |     + 2)           /* "\n\0" */ | ||||||
|  |  | ||||||
| char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa; | char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa; | ||||||
|  |  | ||||||
| /* the different hextypes known by this program: */ | /* the different hextypes known by this program: */ | ||||||
| @@ -232,18 +245,20 @@ char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa; | |||||||
|  |  | ||||||
| #define CONDITIONAL_CAPITALIZE(c) (capitalize ? toupper((unsigned char)(c)) : (c)) | #define CONDITIONAL_CAPITALIZE(c) (capitalize ? toupper((unsigned char)(c)) : (c)) | ||||||
|  |  | ||||||
| #define COLOR_PROLOGUE \ | #define COLOR_PROLOGUE(color) \ | ||||||
| l[c++] = '\033'; \ | l_colored[c++] = '\033'; \ | ||||||
| l[c++] = '['; \ | l_colored[c++] = '['; \ | ||||||
| l[c++] = '1'; \ | l_colored[c++] = '1'; \ | ||||||
| l[c++] = ';'; \ | l_colored[c++] = ';'; \ | ||||||
| l[c++] = '3'; | l_colored[c++] = '3'; \ | ||||||
|  | l_colored[c++] = (color); \ | ||||||
|  | l_colored[c++] = 'm'; | ||||||
|  |  | ||||||
| #define COLOR_EPILOGUE \ | #define COLOR_EPILOGUE \ | ||||||
| l[c++] = '\033'; \ | l_colored[c++] = '\033'; \ | ||||||
| l[c++] = '['; \ | l_colored[c++] = '['; \ | ||||||
| l[c++] = '0'; \ | l_colored[c++] = '0'; \ | ||||||
| l[c++] = 'm'; | l_colored[c++] = 'm'; | ||||||
| #define COLOR_RED '1' | #define COLOR_RED '1' | ||||||
| #define COLOR_GREEN '2' | #define COLOR_GREEN '2' | ||||||
| #define COLOR_YELLOW '3' | #define COLOR_YELLOW '3' | ||||||
| @@ -515,8 +530,54 @@ huntype( | |||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Print line l. If nz is false, xxdline regards the line as a line of |  * Print line l with given colors. | ||||||
|  |  */ | ||||||
|  |   static void | ||||||
|  | print_colored_line(FILE *fp, char *l, char *colors) | ||||||
|  | { | ||||||
|  |   static char l_colored[LLEN+1]; | ||||||
|  |  | ||||||
|  |   if (colors) | ||||||
|  |     { | ||||||
|  |       int c = 0; | ||||||
|  |       if (colors[0]) | ||||||
|  | 	{ | ||||||
|  | 	  COLOR_PROLOGUE(colors[0]) | ||||||
|  | 	} | ||||||
|  |       l_colored[c++] = l[0]; | ||||||
|  |       int i; | ||||||
|  |       for (i = 1; l[i]; i++) | ||||||
|  | 	{ | ||||||
|  | 	  if (colors[i] != colors[i-1]) | ||||||
|  | 	    { | ||||||
|  | 	      if (colors[i-1]) | ||||||
|  | 		{ | ||||||
|  | 		  COLOR_EPILOGUE | ||||||
|  | 		} | ||||||
|  | 	      if (colors[i]) | ||||||
|  | 		{ | ||||||
|  | 		  COLOR_PROLOGUE(colors[i]) | ||||||
|  | 		} | ||||||
|  | 	    } | ||||||
|  | 	  l_colored[c++] = l[i]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |       if (colors[i]) | ||||||
|  | 	{ | ||||||
|  | 	  COLOR_EPILOGUE | ||||||
|  | 	} | ||||||
|  |       l_colored[c++] = '\0'; | ||||||
|  |  | ||||||
|  |       fputs_or_die(l_colored, fp); | ||||||
|  |     } | ||||||
|  |   else | ||||||
|  |     fputs_or_die(l, fp); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Print line l with given colors. If nz is false, xxdline regards the line as a line of | ||||||
|  * zeroes. If there are three or more consecutive lines of zeroes, |  * zeroes. If there are three or more consecutive lines of zeroes, | ||||||
|  * they are replaced by a single '*' character. |  * they are replaced by a single '*' character. | ||||||
|  * |  * | ||||||
| @@ -528,13 +589,17 @@ huntype( | |||||||
|  * If nz is always positive, lines are never suppressed. |  * If nz is always positive, lines are never suppressed. | ||||||
|  */ |  */ | ||||||
|   static void |   static void | ||||||
| xxdline(FILE *fp, char *l, int nz) | xxdline(FILE *fp, char *l, char *colors, int nz) | ||||||
| { | { | ||||||
|   static char z[LLEN+1]; |   static char z[LLEN_NO_COLOR+1]; | ||||||
|  |   static char z_colors[LLEN_NO_COLOR+1]; | ||||||
|   static signed char zero_seen = 0; |   static signed char zero_seen = 0; | ||||||
|  |  | ||||||
|   if (!nz && zero_seen == 1) |   if (!nz && zero_seen == 1) | ||||||
|     strcpy(z, l); |     { | ||||||
|  |       strcpy(z, l); | ||||||
|  |       memcpy(z_colors, colors, strlen(z)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|   if (nz || !zero_seen++) |   if (nz || !zero_seen++) | ||||||
|     { |     { | ||||||
| @@ -543,12 +608,13 @@ xxdline(FILE *fp, char *l, int nz) | |||||||
| 	  if (nz < 0) | 	  if (nz < 0) | ||||||
| 	    zero_seen--; | 	    zero_seen--; | ||||||
| 	  if (zero_seen == 2) | 	  if (zero_seen == 2) | ||||||
| 	    fputs_or_die(z, fp); | 	    print_colored_line(fp, z, z_colors); | ||||||
| 	  if (zero_seen > 2) | 	  if (zero_seen > 2) | ||||||
| 	    fputs_or_die("*\n", fp); | 	    fputs_or_die("*\n", fp); | ||||||
| 	} | 	} | ||||||
|       if (nz >= 0 || zero_seen > 0) |       if (nz >= 0 || zero_seen > 0) | ||||||
| 	fputs_or_die(l, fp); | 	print_colored_line(fp, l, colors); | ||||||
|  |  | ||||||
|       if (nz) |       if (nz) | ||||||
| 	zero_seen = 0; | 	zero_seen = 0; | ||||||
|     } |     } | ||||||
| @@ -589,8 +655,8 @@ static unsigned char etoa64[] = | |||||||
|     0070,0071,0372,0373,0374,0375,0376,0377 |     0070,0071,0372,0373,0374,0375,0376,0377 | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   static void |   static char | ||||||
| begin_coloring_char (char *l, int *c, int e, int ebcdic) | get_color_char (int e, int ebcdic) | ||||||
| { | { | ||||||
|   if (ebcdic) |   if (ebcdic) | ||||||
|     { |     { | ||||||
| @@ -601,37 +667,37 @@ begin_coloring_char (char *l, int *c, int e, int ebcdic) | |||||||
| 	  (e >= 208 && e <= 217) || (e >= 226 && e <= 233) || | 	  (e >= 208 && e <= 217) || (e >= 226 && e <= 233) || | ||||||
| 	  (e >= 240 && e <= 249) || (e == 189) || (e == 64) || | 	  (e >= 240 && e <= 249) || (e == 189) || (e == 64) || | ||||||
| 	  (e == 173) || (e == 224) ) | 	  (e == 173) || (e == 224) ) | ||||||
| 	l[(*c)++] = COLOR_GREEN; | 	return COLOR_GREEN; | ||||||
|  |  | ||||||
|       else if (e == 37 || e == 13 || e == 5) |       else if (e == 37 || e == 13 || e == 5) | ||||||
| 	l[(*c)++] = COLOR_YELLOW; | 	return COLOR_YELLOW; | ||||||
|       else if (e == 0) |       else if (e == 0) | ||||||
| 	l[(*c)++] = COLOR_WHITE; | 	return COLOR_WHITE; | ||||||
|       else if (e == 255) |       else if (e == 255) | ||||||
| 	l[(*c)++] = COLOR_BLUE; | 	return COLOR_BLUE; | ||||||
|       else |       else | ||||||
| 	l[(*c)++] = COLOR_RED; | 	return COLOR_RED; | ||||||
|     } |     } | ||||||
|   else  /* ASCII */ |   else  /* ASCII */ | ||||||
|     { |     { | ||||||
|       #if defined(__MVS__) && __CHARSET_LIB == 0 |       #if defined(__MVS__) && __CHARSET_LIB == 0 | ||||||
|       if (e >= 64) |       if (e >= 64) | ||||||
| 	l[(*c)++] = COLOR_GREEN; | 	return COLOR_GREEN; | ||||||
|       #else |       #else | ||||||
|       if (e > 31 && e < 127) |       if (e > 31 && e < 127) | ||||||
| 	l[(*c)++] = COLOR_GREEN; | 	return COLOR_GREEN; | ||||||
|       #endif |       #endif | ||||||
|  |  | ||||||
|       else if (e == 9 || e == 10 || e == 13) |       else if (e == 9 || e == 10 || e == 13) | ||||||
| 	l[(*c)++] = COLOR_YELLOW; | 	return COLOR_YELLOW; | ||||||
|       else if (e == 0) |       else if (e == 0) | ||||||
| 	l[(*c)++] = COLOR_WHITE; | 	return COLOR_WHITE; | ||||||
|       else if (e == 255) |       else if (e == 255) | ||||||
| 	l[(*c)++] = COLOR_BLUE; | 	return COLOR_BLUE; | ||||||
|       else |       else | ||||||
| 	l[(*c)++] = COLOR_RED; | 	return COLOR_RED; | ||||||
|     } |     } | ||||||
|   l[(*c)++] = 'm'; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   static int |   static int | ||||||
| @@ -664,15 +730,17 @@ main(int argc, char *argv[]) | |||||||
|   int capitalize = 0, decimal_offset = 0; |   int capitalize = 0, decimal_offset = 0; | ||||||
|   int ebcdic = 0; |   int ebcdic = 0; | ||||||
|   int octspergrp = -1;	/* number of octets grouped in output */ |   int octspergrp = -1;	/* number of octets grouped in output */ | ||||||
|   int grplen;		/* total chars per octet group */ |   int grplen;		/* total chars per octet group excluding colors */ | ||||||
|   long length = -1, n = 0, seekoff = 0; |   long length = -1, n = 0, seekoff = 0; | ||||||
|   unsigned long displayoff = 0; |   unsigned long displayoff = 0; | ||||||
|   static char l[LLEN+1];  /* static because it may be too big for stack */ |   static char l[LLEN_NO_COLOR+1];  /* static because it may be too big for stack */ | ||||||
|  |   static char colors[LLEN_NO_COLOR+1]; /* color array */ | ||||||
|   char *pp; |   char *pp; | ||||||
|   char *varname = NULL; |   char *varname = NULL; | ||||||
|   int addrlen = 9; |   int addrlen = 9; | ||||||
|   int color = 0; |   int color = 0; | ||||||
|   char *no_color; |   char *no_color; | ||||||
|  |   char cur_color = 0; | ||||||
|  |  | ||||||
|   no_color = getenv("NO_COLOR"); |   no_color = getenv("NO_COLOR"); | ||||||
|   if (no_color == NULL || no_color[0] == '\0') |   if (no_color == NULL || no_color[0] == '\0') | ||||||
| @@ -1064,8 +1132,6 @@ main(int argc, char *argv[]) | |||||||
|   if (hextype != HEX_BITS) |   if (hextype != HEX_BITS) | ||||||
|     { |     { | ||||||
|       grplen = octspergrp + octspergrp + 1;	/* chars per octet group */ |       grplen = octspergrp + octspergrp + 1;	/* chars per octet group */ | ||||||
|       if (color) |  | ||||||
| 	grplen += 11 * octspergrp;  /* color-code needs 11 extra characters */ |  | ||||||
|     } |     } | ||||||
|   else	/* hextype == HEX_BITS */ |   else	/* hextype == HEX_BITS */ | ||||||
|     grplen = 8 * octspergrp + 1; |     grplen = 8 * octspergrp + 1; | ||||||
| @@ -1076,7 +1142,7 @@ main(int argc, char *argv[]) | |||||||
| 	{ | 	{ | ||||||
| 	  addrlen = sprintf(l, decimal_offset ? "%08ld:" : "%08lx:", | 	  addrlen = sprintf(l, decimal_offset ? "%08ld:" : "%08lx:", | ||||||
| 				  ((unsigned long)(n + seekoff + displayoff))); | 				  ((unsigned long)(n + seekoff + displayoff))); | ||||||
| 	  for (c = addrlen; c < LLEN; l[c++] = ' ') | 	  for (c = addrlen; c < LLEN_NO_COLOR; l[c++] = ' ') | ||||||
| 	    ; | 	    ; | ||||||
| 	} | 	} | ||||||
|       x = hextype == HEX_LITTLEENDIAN ? p ^ (octspergrp-1) : p; |       x = hextype == HEX_LITTLEENDIAN ? p ^ (octspergrp-1) : p; | ||||||
| @@ -1085,17 +1151,13 @@ main(int argc, char *argv[]) | |||||||
| 	{ | 	{ | ||||||
| 	  if (color) | 	  if (color) | ||||||
| 	    { | 	    { | ||||||
| 	      COLOR_PROLOGUE | 	      cur_color = get_color_char(e, ebcdic); | ||||||
| 	      begin_coloring_char(l,&c,e,ebcdic); | 	      colors[c] = cur_color; | ||||||
| 	      l[c++] = hexx[(e >> 4) & 0xf]; | 	      colors[c+1] = cur_color; | ||||||
| 	      l[c++] = hexx[e & 0xf]; |  | ||||||
| 	      COLOR_EPILOGUE |  | ||||||
| 	    } |  | ||||||
| 	  else /*No colors*/ |  | ||||||
| 	    { |  | ||||||
| 	      l[c]   = hexx[(e >> 4) & 0xf]; |  | ||||||
| 	      l[++c] = hexx[e & 0xf]; |  | ||||||
| 	    } | 	    } | ||||||
|  |  | ||||||
|  | 	  l[c]   = hexx[(e >> 4) & 0xf]; | ||||||
|  | 	  l[++c] = hexx[e & 0xf]; | ||||||
| 	} | 	} | ||||||
|       else /* hextype == HEX_BITS */ |       else /* hextype == HEX_BITS */ | ||||||
| 	{ | 	{ | ||||||
| @@ -1104,60 +1166,43 @@ main(int argc, char *argv[]) | |||||||
| 	} | 	} | ||||||
|       if (e) |       if (e) | ||||||
| 	nonzero++; | 	nonzero++; | ||||||
|       /* When changing this update definition of LLEN above. */ |       /* When changing this update definition of LLEN and LLEN_NO_COLOR above. */ | ||||||
|       if (hextype == HEX_LITTLEENDIAN) |       if (hextype == HEX_LITTLEENDIAN) | ||||||
| 	/* last group will be fully used, round up */ | 	/* last group will be fully used, round up */ | ||||||
| 	c = grplen * ((cols + octspergrp - 1) / octspergrp); | 	c = grplen * ((cols + octspergrp - 1) / octspergrp); | ||||||
|       else |       else | ||||||
| 	c = (grplen * cols - 1) / octspergrp; | 	c = (grplen * cols - 1) / octspergrp; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |       if (ebcdic) | ||||||
|  | 	e = (e < 64) ? '.' : etoa64[e-64]; | ||||||
|  |  | ||||||
|  |       if (hextype == HEX_LITTLEENDIAN) | ||||||
|  | 	c -= 1; | ||||||
|  |  | ||||||
|  |       c += addrlen + 3 + p; | ||||||
|       if (color) |       if (color) | ||||||
| 	{ | 	{ | ||||||
| 	  if (hextype == HEX_BITS) | 	  colors[c] = cur_color; | ||||||
| 	    c += addrlen + 3 + p*12; |  | ||||||
| 	  else |  | ||||||
| 	    c = addrlen + 3 + (grplen * cols - 1)/octspergrp + p*12; |  | ||||||
|  |  | ||||||
| 	  COLOR_PROLOGUE |  | ||||||
| 	  begin_coloring_char(l,&c,e,ebcdic); |  | ||||||
| #if defined(__MVS__) && __CHARSET_LIB == 0 |  | ||||||
| 	  if (e >= 64) |  | ||||||
| 	    l[c++] = e; |  | ||||||
| 	  else |  | ||||||
| 	    l[c++] = '.'; |  | ||||||
| #else |  | ||||||
| 	  if (ebcdic) |  | ||||||
| 	    e = (e < 64) ? '.' : etoa64[e-64]; |  | ||||||
| 	  l[c++] = (e > 31 && e < 127) ? e : '.'; |  | ||||||
| #endif |  | ||||||
| 	  COLOR_EPILOGUE |  | ||||||
| 	} | 	} | ||||||
|       else /*no colors*/ |       l[c++] = | ||||||
|  | #if defined(__MVS__) && __CHARSET_LIB == 0 | ||||||
|  | 	  (e >= 64) | ||||||
|  | #else | ||||||
|  | 	  (e > 31 && e < 127) | ||||||
|  | #endif | ||||||
|  | 	  ? e : '.'; | ||||||
|  |       n++; | ||||||
|  |       if (++p == cols) | ||||||
| 	{ | 	{ | ||||||
| 	  if (ebcdic) | 	  l[c++] = '\n'; | ||||||
| 	    e = (e < 64) ? '.' : etoa64[e-64]; | 	  l[c] = '\0'; | ||||||
|  |  | ||||||
| 	  if (hextype == HEX_LITTLEENDIAN) | 	  xxdline(fpo, l, color ? colors : NULL, autoskip ? nonzero : 1); | ||||||
| 	    c -= 1; | 	  memset(colors, 0, c); | ||||||
|  | 	  nonzero = 0; | ||||||
| 	  c += addrlen + 3 + p; | 	  p = 0; | ||||||
| 	  l[c++] = |  | ||||||
| #if defined(__MVS__) && __CHARSET_LIB == 0 |  | ||||||
| 	      (e >= 64) |  | ||||||
| #else |  | ||||||
| 	      (e > 31 && e < 127) |  | ||||||
| #endif |  | ||||||
| 	      ? e : '.'; |  | ||||||
| 	} | 	} | ||||||
| 	n++; |  | ||||||
| 	if (++p == cols) |  | ||||||
| 	  { |  | ||||||
| 	    l[c++] = '\n'; |  | ||||||
| 	    l[c] = '\0'; |  | ||||||
| 	    xxdline(fpo, l, autoskip ? nonzero : 1); |  | ||||||
| 	    nonzero = 0; |  | ||||||
| 	    p = 0; |  | ||||||
| 	  } |  | ||||||
|     } |     } | ||||||
|   if (p) |   if (p) | ||||||
|     { |     { | ||||||
| @@ -1175,11 +1220,8 @@ main(int argc, char *argv[]) | |||||||
|  |  | ||||||
| 	      for (i = 0; i < fill;i++) | 	      for (i = 0; i < fill;i++) | ||||||
| 		{ | 		{ | ||||||
| 		  COLOR_PROLOGUE | 		  colors[c] = COLOR_RED; | ||||||
| 		  l[c++] = COLOR_RED; |  | ||||||
| 		  l[c++] = 'm'; |  | ||||||
| 		  l[c++] = ' '; /* empty space */ | 		  l[c++] = ' '; /* empty space */ | ||||||
| 		  COLOR_EPILOGUE |  | ||||||
| 		  x++; | 		  x++; | ||||||
| 		  p++; | 		  p++; | ||||||
| 		} | 		} | ||||||
| @@ -1193,18 +1235,17 @@ main(int argc, char *argv[]) | |||||||
|  |  | ||||||
| 	      for (i = cols - p; i > 0;i--) | 	      for (i = cols - p; i > 0;i--) | ||||||
| 		{ | 		{ | ||||||
| 		  COLOR_PROLOGUE | 		  colors[c] = COLOR_RED; | ||||||
| 		  l[c++] = COLOR_RED; |  | ||||||
| 		  l[c++] = 'm'; |  | ||||||
| 		  l[c++] = ' '; /* empty space */ | 		  l[c++] = ' '; /* empty space */ | ||||||
| 		  COLOR_EPILOGUE |  | ||||||
| 		} | 		} | ||||||
| 	    } | 	    } | ||||||
|  | 	  xxdline(fpo, l, colors, 1); | ||||||
| 	} | 	} | ||||||
|       xxdline(fpo, l, 1); |       else | ||||||
|  | 	xxdline(fpo, l, NULL, 1); | ||||||
|     } |     } | ||||||
|   else if (autoskip) |   else if (autoskip) | ||||||
|     xxdline(fpo, l, -1);	/* last chance to flush out suppressed lines */ |     xxdline(fpo, l, color ? colors : NULL, -1);	/* last chance to flush out suppressed lines */ | ||||||
|  |  | ||||||
|   fclose_or_die(fp, fpo); |   fclose_or_die(fp, fpo); | ||||||
|   return 0; |   return 0; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user