# [PATCH 2/2] bugfix: make ss-diff correctly handle tab expansion

Jason A. Donenfeld Jason at zx2c4.com
Tue Oct 30 17:56:33 CET 2012

```I haven't reviewed this carefully yet, but off hand, it seems like a
tab is always between 1 and 8 spaces long.

Let the first column be column 1, and any column be column C. Then,

if C % 8 == 1, spaces := 8
if C % 8 == 2, spaces := 7
if C % 8 == 3, spaces := 6
if C % 8 == 4, spaces := 5
if C % 8 == 5, spaces := 4
if C % 8 == 6, spaces := 3
if C % 8 == 7, spaces := 2
if C % 8 == 0, spaces := 1

This is the intuitive approach visually confirmed by mucking around
inside of VIM. Now let's play with it for 0 indexed columns. We can
just rotate:

if C % 8 == 0, spaces := 8
if C % 8 == 1, spaces := 7
if C % 8 == 2, spaces := 6
if C % 8 == 3, spaces := 5
if C % 8 == 4, spaces := 4
if C % 8 == 5, spaces := 3
if C % 8 == 6, spaces := 2
if C % 8 == 7, spaces := 1

The formula is then just:

8 - ( C % 8 )

Which should be a pretty simple way of calculating it, since "the
0-based column we're at" is just the current length.

Doing it this way, you don't have to hard code the initial space,
since m % n < n.

```