private LinkedList<Diff> diff_compute(String text1,String text2,boolean checklines,long deadline){
  LinkedList<Diff> diffs=new LinkedList<Diff>();
  if (text1.length() == 0) {
    diffs.add(new Diff(Operation.INSERT,text2));
    return diffs;
  }
  if (text2.length() == 0) {
    diffs.add(new Diff(Operation.DELETE,text1));
    return diffs;
  }
  String longtext=text1.length() > text2.length() ? text1 : text2;
  String shorttext=text1.length() > text2.length() ? text2 : text1;
  int i=longtext.indexOf(shorttext);
  if (i != -1) {
    Operation op=(text1.length() > text2.length()) ? Operation.DELETE : Operation.INSERT;
    diffs.add(new Diff(op,longtext.substring(0,i)));
    diffs.add(new Diff(Operation.EQUAL,shorttext));
    diffs.add(new Diff(op,longtext.substring(i + shorttext.length())));
    return diffs;
  }
  if (shorttext.length() == 1) {
    diffs.add(new Diff(Operation.DELETE,text1));
    diffs.add(new Diff(Operation.INSERT,text2));
    return diffs;
  }
  String[] hm=diff_halfMatch(text1,text2);
  if (hm != null) {
    String text1_a=hm[0];
    String text1_b=hm[1];
    String text2_a=hm[2];
    String text2_b=hm[3];
    String mid_common=hm[4];
    LinkedList<Diff> diffs_a=diff_main(text1_a,text2_a,checklines,deadline);
    LinkedList<Diff> diffs_b=diff_main(text1_b,text2_b,checklines,deadline);
    diffs=diffs_a;
    diffs.add(new Diff(Operation.EQUAL,mid_common));
    diffs.addAll(diffs_b);
    return diffs;
  }
  if (checklines && text1.length() > 100 && text2.length() > 100) {
    return diff_lineMode(text1,text2,deadline);
  }
  return diff_bisect(text1,text2,deadline);
}

private LinkedList < Diff > diff_compute ( String text1 , String text2 , boolean checklines , long deadline ) { LinkedList < Diff > diffs = new LinkedList < Diff > ( ) ; if ( text1 . length ( ) == 0 ) { diffs . add ( new Diff ( Operation . INSERT , text2 ) ) ; return diffs ; } if ( text2 . length ( ) == 0 ) { diffs . add ( new Diff ( Operation . DELETE , text1 ) ) ; return diffs ; } String longtext = text1 . length ( ) > text2 . length ( ) ? text1 : text2 ; String shorttext = text1 . length ( ) > text2 . length ( ) ? text2 : text1 ; int i = longtext . indexOf ( shorttext ) ; if ( i != - 1 ) { Operation op = ( text1 . length ( ) > text2 . length ( ) ) ? Operation . DELETE : Operation . INSERT ; diffs . add ( new Diff ( op , longtext . substring ( 0 , i ) ) ) ; diffs . add ( new Diff ( Operation . EQUAL , shorttext ) ) ; diffs . add ( new Diff ( op , longtext . substring ( i + shorttext . length ( ) ) ) ) ; return diffs ; } if ( shorttext . length ( ) == 1 ) { diffs . add ( new Diff ( Operation . DELETE , text1 ) ) ; diffs . add ( new Diff ( Operation . INSERT , text2 ) ) ; return diffs ; } String [ ] hm = diff_halfMatch ( text1 , text2 ) ; if ( hm != null ) { String text1_a = hm [ 0 ] ; String text1_b = hm [ 1 ] ; String text2_a = hm [ 2 ] ; String text2_b = hm [ 3 ] ; String mid_common = hm [ 4 ] ; LinkedList < Diff > diffs_a = diff_main ( text1_a , text2_a , checklines , deadline ) ; LinkedList < Diff > diffs_b = diff_main ( text1_b , text2_b , checklines , deadline ) ; diffs = diffs_a ; diffs . add ( new Diff ( Operation . EQUAL , mid_common ) ) ; diffs . addAll ( diffs_b ) ; return diffs ; } if ( checklines && text1 . length ( ) > 100 && text2 . length ( ) > 100 ) { return diff_lineMode ( text1 , text2 , deadline ) ; } return diff_bisect ( text1 , text2 , deadline ) ; }
find the differences between two texts . assumes that the texts do not have any common prefix or suffix .
