If we have a program, and modify it, we can use diff to see the changes made. For example, adding "0b..." as a binary constant to the CS 429 assembler can be:

354a355,356
>         case 2:
>             if (('0' <= c) && (c <= '1')) return(TRUE);
369a372,373
>         case 2:
>             if (('0' <= c) && (c <= '1')) return(c-'0');
407a412,417
>                 }
>             else if (input_buffer[token_index] == 'b')
>                 {
>                     /* 0b...  -- binary */
>                     token_index += 1;
>                     base = 2;
If we use "diff -DBINARY", we can merge the two, controlled by "#define BINARY":
        case 8:
            if (('0' <= c) && (c <= '7')) return(TRUE);
#ifdef BINARY
        case 2:
            if (('0' <= c) && (c <= '1')) return(TRUE);
#endif /* BINARY */
        }
Trying to see the context for the changes makes the diff a bit less fragile to other changes (diff -C3):
***************
*** 352,357 ****
--- 352,359 ----
              if (('8' <= c) && (c <= '9')) return(TRUE);
          case 8:
              if (('0' <= c) && (c <= '7')) return(TRUE);
+         case 2:
+             if (('0' <= c) && (c <= '1')) return(TRUE);
          }
      return(FALSE);
  }
***************
*** 367,372 ****
--- 369,376 ----
              if (('8' <= c) && (c <= '9')) return(c-'0');
          case 8:
              if (('0' <= c) && (c <= '7')) return(c-'0');
+         case 2:
+             if (('0' <= c) && (c <= '1')) return(c-'0');
          }
      return(-1);
  }
***************
*** 406,411 ****
--- 410,421 ----
                      token_index += 1;
                      base = 16;
                  }
+             else if (input_buffer[token_index] == 'b')
+                 {
+                     /* 0b...  -- binary */
+                     token_index += 1;
+                     base = 2;
+                 }
          }
  
      /* read number (in the defined base) */