home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1988 Bellcore
- ** All Rights Reserved
- ** Permission is granted to copy or use this program, EXCEPT that it
- ** may not be sold for profit, the copyright notice must be reproduced
- ** on copies, and credit should be given to Bellcore where it is due.
- ** BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
- */
-
-
- #ifndef lint
- static char rcsid[]= "$Header: miller.c,v 1.1 88/09/15 11:33:56 daniel Rel $";
- #endif
-
- #include "misc.h"
- #include "token.h"
- #include "edit.h"
-
- #define MAXT K_MAXTOKENS
- #define ORIGIN (max_obj/2)
-
- #define MILLER_CHATTER 100
-
- /*
- ** totally opaque miller/myers code
- ** hacked from a version provided by the author
- */
-
-
- E_edit
- G_do_miller(m,n,max_d,comflags)
- int m;
- int n;
- int max_d;
- int comflags;
- {
- int max_obj = m + n;
- int
- lower,
- upper,
- d,
- k,
- row,
- col;
- E_edit new;
-
- #ifdef STATIC_MEM
- static E_edit script[MAXT+1];
- static int last_d[MAXT+1];
- #else
- E_edit *script;
- int *last_d;
- /*
- ** make space for the two big arrays
- ** these could probably be smaller if I
- ** understood this algorithm at all
- ** as is, i just shoe horned it into my program.
- ** be sure to allocate max_obj + 1 objects as was done
- ** in original miller/myers code
- */
- script = Z_ALLOC(max_obj+1,E_edit);
- last_d = Z_ALLOC(max_obj+1,int);
-
- #endif
- for (row=0;row < m && row < n && X_com(row,row,comflags) == 0; ++row)
- ;
- last_d[ORIGIN] = row;
- script[ORIGIN] = E_NULL;
- lower = (row == m) ? ORIGIN+1 : ORIGIN - 1;
- upper = (row == n) ? ORIGIN-1 : ORIGIN + 1;
- if (lower > upper)
- {
- /*
- ** the files are identical
- */
- return(E_NULL);
- }
- for (d = 1; d <= max_d; ++d) {
- for (k = lower; k<= upper; k+= 2) {
- new = E_edit_alloc();
-
- if (k == ORIGIN-d || k!= ORIGIN+d && last_d[k+1] >= last_d[k-1]) {
- row = last_d[k+1]+1;
- E_setnext(new,script[k+1]);
- E_setop(new,E_DELETE);
- } else {
- row = last_d[k-1];
- E_setnext(new,script[k-1]);
- E_setop(new,E_INSERT);
- }
-
- E_setl1(new,row);
- col = row + k - ORIGIN;
- E_setl2(new,col);
- script[k] = new;
-
- while (row < m && col < n && X_com(row,col,comflags) == 0) {
- ++row;
- ++col;
- }
- last_d[k] = row;
- if (row == m && col == n) {
- return(script[k]);
- }
- if (row == m)
- lower = k+2;
- if (col == n)
- upper = k-2;
- }
- --lower;
- ++upper;
- #ifndef NOCHATTER
- if ((d > 0) && (0 == (d % MILLER_CHATTER)))
- {
- (void) sprintf(Z_err_buf,
- "found %d differences\n",
- d);
- Z_chatter(Z_err_buf);
- }
- #endif
- }
- Z_exceed(max_d);
- /*
- ** dummy lines to shut up lint
- */
- Z_fatal("fell off end of do_miller\n");
- return(E_NULL);
- }
-