Skip to content
Snippets Groups Projects
Select Git revision
  • c42ef9f1be3157f468f0ae881a855538c6fa540d
  • next default protected
  • movie-netcode-fixes
  • movie
  • next-test
  • master protected
  • softcode-info
  • acs
  • clipmidtex
  • custom-map-names
  • nogravity-trampolines
  • 2214-pre4
  • 2214-pre3
  • just-in-case
  • fix-opengl-parameter-crash
  • 2214-pre2
  • 2214-pre1
  • delfile2
  • cleanupmusic
  • gametype-refactor-1
  • extra-textures
  • SRB2_release_2.2.15
  • SRB2_release_2.2.13
  • SRB2_release_2.2.12
  • SRB2_release_2.2.11
  • SRB2_release_2.2.10
  • SRB2_release_2.2.9
  • SRB2_release_2.2.8
  • SRB2_release_2.2.7
  • SRB2_release_2.2.6
  • SRB2_release_2.2.5
  • SRB2_release_2.2.4
  • SRB2_release_2.2.3
  • SRB2_release_2.2.2
  • SRB2_release_2.2.1
  • SRB2_release_2.2.0
  • SRB2_release_2.1.25
  • SRB2_release_2.1.24
  • SRB2_release_2.1.23
  • SRB2_release_2.1.22
  • SRB2_release_2.1.21
41 results

dircomp2.c

Blame
  • Alam Ed Arias's avatar
    Alam Ed Arias authored and Alam Arias committed
    b93cb1b6
    History
    dircomp2.c 26.04 KiB
    //-----------------------------------------------------------------------------
    //
    // Copyright (C) 1998-2000 by Boris Pereira.
    //
    // This program is free software; you can redistribute it and/or
    // modify it under the terms of the GNU General Public License
    // as published by the Free Software Foundation; either version 2
    // of the License, or (at your option) any later version.
    //
    // This program is distributed in the hope that it will be useful,
    // but WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    // GNU General Public License for more details.
    //-----------------------------------------------------------------------------
    
    #include<stdlib.h>
    #include<stdio.h>
    #include<conio.h>
    #include<dir.h>
    #include<string.h>
    #include<stdarg.h>
    #include<unistd.h>
    #include<dpmi.h>
    #include<sys/stat.h>
    #include<utime.h>
    #include<time.h>
    #include<process.h>
    #include"keys.h"
    
    
    #define true    1
    #define false   0
    
    #define MAXLINE      32768
    #define MAXLENLINE    4096
    #define SCREENWIDTH     80
    
    typedef struct {
        int lines;
        char *line[MAXLINE];
    } textfile_t;
    
    char       tempfilename[255],editor[128]="c:\\program files\\ultraedit\\uedit32.exe";
    int        sameline=3,tab1=8,tab2=8;
    int        screenline=25;
    textfile_t f1,f2;
    int        nonewfile = false;
    int        compspace = false;
    
    unsigned short colornormal = (   BLACK<<4) + LIGHTGRAY;
    unsigned short colortitle  = (   BLACK<<4) +     WHITE;
    unsigned short colortext   = (   BLACK<<4) +  DARKGRAY;
    unsigned short colordiff   = (   BLACK<<4) +  LIGHTRED;
    unsigned short colorkeys   = (   BLACK<<4) + LIGHTCYAN;
    
    
    // compare directorys
    void CompareDir(char *dir1,char *dir2);
    
    // compare directorys this one check only for missing file
    void CompareDir2(char *dir1,char *dir2);
    
    // compare files
    void CompareFile(char *filename1,char *filename2);
    
    // copy a file
    void fcopy(char *filename1,char *filename2);
    
    // recursive delete a dir
    void dirunlink(char *dirname);
    
    // recursive copy a dir
    void copydir(char *dirname1,char *dirname2);
    
    void Quit(char *f,...)
    {
        va_list     argptr;
    
        // put message to stderr
        va_start (argptr,f);
        fprintf  (stderr, "Error: ");
        vfprintf (stderr,f,argptr);
        va_end   (argptr);
    
        fflush( stderr );
        exit(-1);
    }
    
    int CheckParm(int argc, char *argv[], char *param )
    {
        int i;
        for(i=1;i<argc;i++)
        {
            if(!stricmp(param,argv[i]))
            {
                return i;
            }
        }
    
        return 0;
    }
    
    int main(int argc,char *argv[])
    {
        struct ffblk dir;
        char   *tmp;
        int    i;
    
        printf("Directory Comparator 1.3 (c) Copyright Boris Pereira\n\n");
    
        if(argc<2)
           Quit("Missing parameter\n"
                "Syntax: filecomp <dirname1> <dirname2> [<options>]\n\n"
                " Options\n"
                " -------\n"
                "   -t1 n : change tab size for directory 1  (default 8)\n"
                "   -t2 n : change tab size for directory 2  (default 8)\n"
                "   -l  n : use n same line to resynchronize (default 3)\n"
                "   -e <editor> : use spesified editor\n"
                "   -nonew: don't prompt to copy/delete file\n"
                "   -w compress space and tab");
    
        if(findfirst(argv[1],&dir,FA_DIREC))
           Quit("Error can't find %s\n",argv[1]);
    
        if(findfirst(argv[2],&dir,FA_DIREC))
           Quit("Error can't find %s\n",argv[2]);
    
        if(argc>2)
        {
           i=CheckParm(argc,argv,"-t1");
           if(i) tab1=atoi(argv[i+1]);
           i=CheckParm(argc,argv,"-t2");
           if(i) tab2=atoi(argv[i+1]);
           i=CheckParm(argc,argv,"-l");
           if(i) sameline=atoi(argv[i+1]);
           i=CheckParm(argc,argv,"-e");
           if(i) strcpy(editor,argv[i+1]);
           nonewfile=CheckParm(argc,argv,"-nonew");
           compspace=CheckParm(argc,argv,"-w");
        }
    
        _set_screen_lines(50);
        screenline=50;
        // desable blink color so we can use darkcolor for background
        //outportb(0x3b8,5);
        intensevideo();
    
        tmp=getenv("temp");
        if(!tmp)
            tmp=getenv("TEMP");
        if(!tmp)
            tmp=getenv("tmp");
        if(!tmp)
            tmp=getenv("TMP");
        if(tmp)
        {
            strcpy(tempfilename,tmp);
            if(tempfilename[strlen(tempfilename)]!='\\')
                strcat(tempfilename,"\\");
        }
        else
            tempfilename[0]='\0';
        strcat(tempfilename,"dircmp$$.tmp");
    
        CompareDir(argv[1],argv[2]);
    
        if(!nonewfile)
            // just for file in the directory 2 and not in the 1
            CompareDir2(argv[1],argv[2]);
    
        return 0;
    }
    
    char *fileextension(char *filename)
    {
        static char nullextension=0;
        int i;
        i = strlen(filename)-1;
        while(i>0 && filename[i]!='.') i--;
        if( filename[i]=='.' )
            return filename+i+1;
        // else
        return &nullextension;
    }
    
    void CompareDir(char *dirname1,char *dirname2)
    {
        struct ffblk dir;
        char   filter[20]="\\*.*";
        char   tempstr[255];
        int    finish;
    
        strcpy(tempstr,dirname1);
        strcat(tempstr,filter);
    
        printf("Comparing %s and %s\n",dirname2,dirname1);
    
        // enter in directorys first
        finish=findfirst(tempstr,&dir,FA_DIREC);
        while(!finish)
        {
            char tempstr2[255],tempstr3[255];
    
            strcpy(tempstr2,dirname1);
            strcat(tempstr2,"\\");
            strcat(tempstr2,dir.ff_name);
    
            strcpy(tempstr3,dirname2);
            strcat(tempstr3,"\\");
            strcat(tempstr3,dir.ff_name);
    
    
            if(dir.ff_attrib & FA_DIREC)
            {
                if(dir.ff_name[0]!='.' && strcmp(dir.ff_name,"CVS")!=0)
                {
                    int check,choice;
                    check=access(tempstr3,F_OK);
                    if( check )
                    {
                        printf("\nDirectory missing : %s\n"
                               "Delete %s ? (Y/N)\n",tempstr3,tempstr2);
                        do {
                            choice=getch();
                        } while(choice!='y' && choice!='n'
                             && choice!='Y' && choice!='N');
    
                        if( choice=='y' || choice=='Y' )
                            dirunlink(tempstr2);
                    }
                    else
                        CompareDir(tempstr2,tempstr3);
                }
            }
            finish=findnext(&dir);
        }
    
        finish=findfirst(tempstr,&dir,0);
        while(!finish)
        {
            char tempstr2[255],tempstr3[255];
    
            strcpy(tempstr2,dirname1);
            strcat(tempstr2,"\\");
            strcat(tempstr2,dir.ff_name);
    
            strcpy(tempstr3,dirname2);
            strcat(tempstr3,"\\");
            strcat(tempstr3,dir.ff_name);
    
            if((dir.ff_attrib & FA_DIREC)==0)
            {
                int check;
                char *ext;
    
                ext = fileextension(dir.ff_name);
                if( !(stricmp(ext,"dsp")==0 ||
                      stricmp(ext,"dep")==0 ||
                      stricmp(ext,"dsw")==0 ||
                      stricmp(ext,"ncb")==0 ||
                      stricmp(ext,"bmp")==0 ||
                      stricmp(ext,"opt")==0 ||
                      stricmp(ext,"plg")==0 ||
                      stricmp(ext,"ico")==0 ||
                      stricmp(ext,"rc" )==0 ||
                      stricmp(ext,"o"  )==0 ||
                      stricmp(ext,"bat")==0 ||
                      stricmp(ext,"obj")==0    ))
                {
                    printf("Comparing %s and %s\n",tempstr2,tempstr3);
                    check=access(tempstr3,F_OK);
    
                    if(check)
                    {
                        // seconde file not found
                        int choice;
                        if(!nonewfile)
                        {
                            printf("\nFile missing : %s\n"
                                   "Delete %s ? (Y/N)\n",tempstr3,tempstr2);
                            do {
                               choice=getch();
                            } while(choice!='y' && choice!='n'
                                 && choice!='Y' && choice!='N');
    
                            if(choice=='y' || choice=='Y')
                                unlink(tempstr2);
                        }
                    }
                    else
                    {
                        struct stat fs1,fs2;
                        stat(tempstr2,&fs1);
                        stat(tempstr3,&fs2);
    
                        if(fs1.st_atime!=fs2.st_atime || fs1.st_size!=fs2.st_size)
                            CompareFile(tempstr2,tempstr3);
                    }
                    printf("\n");
                }
            }
            finish=findnext(&dir);
        }
    }
    
    // find file in dir2 but not in dir1
    void CompareDir2(char *dirname1,char *dirname2)
    {
        struct ffblk dir;
        char   filter[20]="\\*.*";
        char   tempstr[255];
        int    finish;
    
        strcpy(tempstr,dirname2);
        strcat(tempstr,filter);
    
        printf("Comparing %s and %s\n",dirname1,dirname2);
    
        finish=findfirst(tempstr,&dir,FA_DIREC);
        while(!finish)
        {
            char tempstr2[255],tempstr3[255];
    
            strcpy(tempstr2,dirname1);
            strcat(tempstr2,"\\");
            strcat(tempstr2,dir.ff_name);
    
            strcpy(tempstr3,dirname2);
            strcat(tempstr3,"\\");
            strcat(tempstr3,dir.ff_name);
    
    
            if(dir.ff_attrib & FA_DIREC)
            {
                if(dir.ff_name[0]!='.' && strcmp(dir.ff_name,"CVS")!=0)
                {
                    int check,choice;
                    check=access(tempstr3,F_OK);
                    if( check )
                    {
                        printf("\nDirectory missing : %s\n"
                               "Copy %s ? (Y/N)\n",tempstr3,tempstr2);
                        do {
                            choice=getch();
                        } while(choice!='y' && choice!='n'
                             && choice!='Y' && choice!='N');
    
                        if( choice=='y' || choice=='Y' )
                            copydir(tempstr2,tempstr3);
                    }
                    else
                        CompareDir2(tempstr2,tempstr3);
                }
            }
            finish=findnext(&dir);
        }
    
        finish=findfirst(tempstr,&dir,FA_DIREC);
        while(!finish)
        {
            char tempstr2[255],tempstr3[255];
    
            strcpy(tempstr2,dirname1);
            strcat(tempstr2,"\\");
            strcat(tempstr2,dir.ff_name);
    
            strcpy(tempstr3,dirname2);
            strcat(tempstr3,"\\");
            strcat(tempstr3,dir.ff_name);
    
            if((dir.ff_attrib & FA_DIREC)==0)
            {
                char *ext = fileextension(dir.ff_name);
                if( !(stricmp(ext,"dsp")==0 ||
                      stricmp(ext,"dep")==0 ||
                      stricmp(ext,"dsw")==0 ||
                      stricmp(ext,"ncb")==0 ||
                      stricmp(ext,"bmp")==0 ||
                      stricmp(ext,"opt")==0 ||
                      stricmp(ext,"plg")==0 ||
                      stricmp(ext,"ico")==0 ||
                      stricmp(ext,"rc" )==0 ||
                      stricmp(ext,"o"  )==0 ||
                      stricmp(ext,"bat")==0 ||
                      stricmp(ext,"obj")==0    ) &&
                // check if file exist in dir1
                      access(tempstr2,F_OK))
                {
                    int choice;
    
                    printf("File %s found in %s but not in %s\n"
                           "Copy it ? (y/n)\n",tempstr3,dirname2,dirname1);
                    do {
                       choice=getch();
                    } while(choice!='y' && choice!='n');
    
                    if(choice=='y')
                        fcopy(tempstr2,tempstr3);
    
                    return;
    
    
                }
            }
            finish=findnext(&dir);
        }
    }
    
    // convert tab to space
    char *tabconv(char *c,int tabsize)
    {
        static char buf[MAXLENLINE];
        int i=0,j=0;
    
        while(c[i])
        {
            if(c[i]=='\t')
            {
               do {
                   buf[j++]=' ';
               } while(j % tabsize);
            }
            else
               buf[j++]=c[i];
            i++;
        }
    
    /*
        if(j>maxline)
        {
            buf[maxline-1]='\n';  // trunc
            j=maxline;
        }
    */
        buf[j]=0;
    
        return buf;
    }
    
    void tabconv2(textfile_t *f,int start,int stop)
    {
        static char buf[MAXLENLINE];
        char *c;
        int i,j,k;
    
        for(k=start;k<=stop;k++)
        {
            c=f->line[k];
            i=j=0;
            while(c[i])
            {
                if(c[i]=='\t' && c[i+1]=='\t')
                {
                   buf[j++]='\t';
                }
                else
                   if(c[i]=='\t')
                       do { buf[j++]=' '; } while(j & 3);
                   else
                       buf[j++]=c[i];
                i++;
            }
            buf[j]=0;
            free(f->line[k]);
            f->line[k]=(char *)malloc(j);
            strcpy(f->line[k],buf);
        }
    }
    
    int c;
    
    void initmyfgets( FILE *stream )
    {
        c = fgetc(stream);    
    }
      
    // convert any f*** format to the good one
    char *myfgets( char *string, int n, FILE *stream )
    {
        int i=0;
        char *s=string;
        if( c==EOF )
            return NULL;
        while( i<n-1 )
        {
            if( c==EOF )
            {
                *s++='\0';
                break;
            }
            else    
            if( c==10 )
            {
                c = fgetc(stream);
                if( c==13 )
                    c = fgetc(stream);
                *s++='\n'; // hope no overflow
                *s++='\0';                            
                break;    
            }
            else
            if( c==13 )
            {
                c = fgetc(stream);
                if( c==10 )
                    c = fgetc(stream);
                *s++='\n'; // hope no overflow
                *s++='\0';
                break;    
            }       
            else
            {
                *s++=c;
                c = fgetc(stream);
            }
        }
    
        return string;
    }
    
    void LoadTextFile(char *filename,textfile_t *file,int tabsize)
    {
        int     i;
        FILE    *f;
        char    buf[MAXLENLINE];
        int     convtab=true;
        static  char *eofline="\n";
    
        if( strnicmp(filename,"makefile",8)==0 )
            convtab = false;
        f=fopen(filename,"rb");
        if(!f)
           Quit("Error : file %s don't exist",filename);
        initmyfgets(f);
        i=0;
    
        while(!feof(f))
        {
            if(i>=MAXLINE)
               Quit("File %s too big, more than %d lines\n",filename,MAXLINE);
            if(!myfgets(buf,MAXLENLINE,f))
                break;
            if( convtab )
                strcpy(buf,tabconv(buf,tabsize));
            file->line[i]=(char *)malloc(strlen(buf)+1);
            strcpy(file->line[i],buf);
            i++;
        }
        fclose(f);
    
        file->lines=i;
    
        for(;i<MAXLINE;i++)
            file->line[i]=eofline;
    }
    
    void FreeTextFile(textfile_t *file)
    {
        int i;
    
        for(i=0;i<file->lines;i++)
            free(file->line[i]);
            
        file->lines = 0;   
    }
    
    // afficher une partie de fichier en partant de startline jusqu'a stop line
    // affiche les ligne redbeg   jusqua redstop en rouge
    // decale le text vers la droite de offset caractere
    void PrintfBlock(textfile_t *f,int start,int redbeg,int redstop,int stop, int offset)
    {
        int i,l;
        char save80,save81,*p;
    
        if(start<0)
           start=0;
    
        for(i=start;i<=stop;i++)
        {
            if(i>=redbeg && i<=redstop)
                textattr(colordiff);
            else
                textattr(colortext);
            if( f->line[i] )
                l=strlen(f->line[i]);
            else
                l=0;
            if(l<=offset)
            {
                cprintf("\n\r");
                continue;
            }
            p=&(f->line[i][offset]);
            l-=offset;
            if( l>SCREENWIDTH-1)
            {
                save80=p[SCREENWIDTH-2];
                save81=p[SCREENWIDTH-1];
                if( p[SCREENWIDTH-2]!='\0')
                    p[SCREENWIDTH-2]='\n';
                p[SCREENWIDTH-1]='\0';
                cprintf("%s\r",p);
                p[SCREENWIDTH-2]=save80;
                p[SCREENWIDTH-1]=save81;
            }
            else
                cprintf("%s\r",p);
        }
    }
    
    // copy only the syntax, compress all spacing in 1 space
    char *delspace(char *s)
    {
    static char buf[MAXLENLINE];
        int i=0,j=0;
    
        if( !compspace )
        {
            // remove just trailing space
            strcpy(buf, s);
            for(i = strlen(buf)-1;(buf[i]==' ' || buf[i]=='\n' || buf[i]=='\r') && i>=0;i--)
                buf[i]='\0';
            buf[i+1]='\n';
            buf[i+2]='\0';
            return buf;
        }
    
        while(s[i]!='\n' && s[i])
        {
           if(s[i]==' ')
           {
               while(s[i]==' ' && s[i]!='\n' && s[i]) { i++; }
               if(s[i]!='\n' && s[i])
                  buf[j++]=' ';
           }
           else
               buf[j++]=s[i++];
        }
        buf[j++]='\n';
        buf[j]='\0';
    
        return buf;
    }
    
    int LineCmp(char **a1,char **a2,int linetocmp)
    {
        char buf[MAXLENLINE];
        char buf2[MAXLENLINE];
        int  i;
    
        for(i=0;i<linetocmp;i++)
        {
            strcpy(buf,delspace(a1[i]));
            strcpy(buf2,delspace(a2[i]));
            if(strcmp(buf,buf2))
                return false;
        }
        return true;
    }
    
    void Resynchronize(textfile_t *f1,int line1,
                       textfile_t *f2,int line2,
                       int *ri,int *rj,int maxlines,int sameline)
    {
        int  i,j,animcount=0;
        char anim[]="-\\|/";
        // must compare line1+i and line2+j with all i and j
        // insteed do a double for do fist the most probable
        // therefore try first :
        //  i = 0 1 0 2 1 0 3 2 1 0 4 ...
        //  j = 0 0 1 0 1 2 0 1 2 3 0 ...
        cprintf("Resynchronising %c",anim[animcount]);
        for(i=1;i<maxlines;i++)
        {
            for(j=0;j<=i;j++)
                if(LineCmp(&f1->line[line1+i-j]
                          ,&f2->line[line2+j],sameline))
                {
                    *ri=i-j;
                    *rj=j;
    
                    return;
                }
            animcount++;
            animcount&=0xF;
            // not to mush printf this slowdown a lot
            if( (animcount&3)==0 )
                cprintf("\b%c",anim[animcount>>2]);
        }
        Quit("Too mush difference between the files\n");
    }
    
    void cnprintf(char *s,int n)
    {
        int i;
        for(i=0;i<n;i++)
            cputs(s);
    }
    
    void PrintVDiff(char *filename1,textfile_t *f1,int line1,
                    char *filename2,textfile_t *f2,int line2,
                    int i,int j,int l,int offset)
    {
         int k;
    
         clrscr();
    
         textattr(colortitle);
         k=(SCREENWIDTH-strlen(filename1)-2-15)/2-1;
         cnprintf("=",k);
         cprintf(" %s ",filename1);
         cnprintf("=",k);
         textattr(colorkeys);
         cprintf(" [9]  All U[p]");
         cprintf("\n\r");
         k=((screenline-2)/2-2-i)/2;
         PrintfBlock(f1,line1-k+l,line1,line1+i-1,line1+i+k+l,offset);
    
         textattr(colortitle);
         k=(SCREENWIDTH-strlen(filename2)-2-15)/2-1;
         cnprintf("=",k);
         cprintf(" %s ",filename2);
         cnprintf("=",k);
         textattr(colorkeys);
         cprintf(" [3] All [D]own");
         cprintf("\n\r");
         k=((screenline-2)/2-2-j)/2;
         PrintfBlock(f2,line2-k+l,line2,line2+j-1,line2+j+k+l,offset);
    
         textattr(colorkeys);
         cprintf("[<Pg Up><Pg Down>%c%c] [-]%d lines[+] [u]ndo [e]dit [c]ompress space",27,26,sameline);
         fflush(stdout);
         textattr(colornormal);
    }
    
    // copy file date of source to dest
    void CopyFileDate(char *dest,char *source)
    {
        struct stat    fs1;
        struct utimbuf fs2;
    
        stat(source,&fs1);
        fs2.actime  = fs1.st_mtime;
        fs2.modtime = fs1.st_mtime;
    
        utime(dest,&fs2);
    }
    
    void CompareFile(char *filename1,char *filename2)
    {
        int  i,j,choice,k,l;
        int  line1,line2;
        FILE *outfile;
        int  maxlines,always,enterline=0,column=0;
        int  oneselected=false,twoselected=false;
    
        LoadTextFile(filename1,&f1,tab1);
        LoadTextFile(filename2,&f2,tab2);
        outfile=fopen(tempfilename,"wt");
        if( !outfile )
             Quit("Error: No way to open %s\n",tempfilename);
        line1=0;
        line2=0;
        always=0;
        maxlines=f1.lines+f2.lines+1;
    
    //    if(maxlines<f2.lines+1)
    //        maxlines=f2.lines;
    
        while(line1<maxlines && line2<maxlines)
        {
            if(!LineCmp(&f1.line[line1],&f2.line[line2],1))
            {   // different
                // resynchronisation
                int oldcompspace = compspace;
                l=0;column=0;
                Resynchronize(&f1,line1,&f2,line2,&i,&j,maxlines,sameline);
    
                if( strncmp(f1.line[line1],"// $",4)==0 &&
                    strncmp(f2.line[line2],"// $",4)==0)
                    choice = '9'; // skip stupid cvs changes
                else
                {
                    choice = 0;
                  // ask the possibility and write it to the file
                    do {
                       PrintVDiff(filename1,&f1,line1,
                                  filename2,&f2,line2,i,j,l,column);
    
                       if(always==0)
                       {
                           choice=getch();
                           if(choice==0) choice=getch()+256;
                       }
    
                       switch(choice) {
                          case KEY_PGUP   : l-=20;break;
                          case KEY_PGDN   : l+=20;break;
                          case KEY_CUP    : l--;break;
                          case KEY_CDOWN  : l++;break;
                          case KEY_CRIGHT : column++;break;
                          case KEY_CLEFT  : if( column )
                                                column--;
                                            break;
                          case KEY_HOME   : column=0;break;
                          case KEY_END    : column+=20;break;
    
                          case '+' :
                              sameline++;
                              Resynchronize(&f1,line1,&f2,line2,&i,&j,maxlines,sameline);
                              break;
                          case '-' :
                              if( sameline>1 ) {
                                  sameline--;
                                  Resynchronize(&f1,line1,&f2,line2,&i,&j,maxlines,sameline);
                              }
                              break;
                          case 'c' :
                              compspace = !compspace;
                              Resynchronize(&f1,line1,&f2,line2,&i,&j,maxlines,sameline);
                              break;
    /*
                          case 't' :
                              tabconv2(&f1,line1,line1+i-1);
                              Resynchronize(&f1,line1,&f2,line2,&i,&j,maxlines,sameline);
                              break;
    */
                          case 'p' : always=1;break;
                          case 'd' : always=2;break;
                          case 'u' :
                              fclose(outfile);
                              FreeTextFile(&f1);
                              FreeTextFile(&f2);
    
                              // remove the temp file
                              unlink(tempfilename);
    
                              CompareFile(filename1,filename2);
    
                              return;
                          case 'e' :
                          {
                              char params[256];
                              fclose(outfile);
                              FreeTextFile(&f1);
                              FreeTextFile(&f2);
    
                              // remove the temp file
                              unlink(tempfilename);
    
                              sprintf(params,"\"%s/%d\" \"%s/%d\"",filename1,line1,filename2,line2);
    
                              spawnlp(P_WAIT,editor,params,params,NULL);
                              printf("\n\nHit Enter to continue\n");
                              getchar();
    
                              CompareFile(filename1,filename2);
                              return;
                          }
                       }
    
                    } while(choice!='3' && choice!='9' && always==0);
                }
                printf("\n");
    
                if(choice=='9'|| always==1)
                {
                    int blankline;
                    for(blankline=0;blankline<enterline;blankline++)
                        fputs("\n",outfile);
                    enterline=0;
    
                    for(k=0;k<i;k++)
                        fputs(f1.line[line1+k],outfile);
    
                    oneselected=true;
                }
                else
                if(choice=='3'|| always==2)
                {
                    int blankline;
                    for(blankline=0;blankline<enterline;blankline++)
                        fputs("\n",outfile);
                    enterline=0;
    
                    for(k=0;k<j;k++)
                        fputs(f2.line[line2+k],outfile);
    
                    twoselected=true;
                }
              // resynchronize
                line1+=i;
                line2+=j;
                compspace = oldcompspace;
            }
            // skip "\n" line at the end of the file
            // it is added for more easy compare at load time
            if(strcmp(f1.line[line1],"\n")==0)
                enterline++;
            else
            {
                int i;
                for(i=0;i<enterline;i++)
                    fputs("\n",outfile);
                enterline=0;
                fputs(f1.line[line1],outfile);
            }
            line1++;
            line2++;
        }
        fclose(outfile);
        FreeTextFile(&f1);
        FreeTextFile(&f2);
    
        // now overwrite the source file
        if( !twoselected )
            // this is not necessarie but in futur version we can use trie directory
            fcopy(filename1,filename1);
        else
        if( !oneselected )
            fcopy(filename1,filename2);
        else
            // twoselected==true && oneselected==true
            fcopy(filename1,tempfilename);
    
        // remove the temp file
        unlink(tempfilename);
    }
    
    void fcopy(char *dest,char *source)
    {
        FILE *f1,*f2;
        char buf[4096];
        int  byteread;
    
        if( stricmp(dest,source)==0 )
            return;
    
        f1=fopen(dest,"wb");
        f2=fopen(source,"rb");
    
        while(!feof(f2))
        {
            byteread=fread(&buf,1,4096,f2);
            if(byteread!=fwrite(buf,1,byteread,f1))
                Quit("Copying %s to %s : Write Error (disk full ?)\n",source,dest);
        }
    
        fclose(f1);
        fclose(f2);
    
        // copy too the file date
        CopyFileDate(dest,source);
    }
    
    // recurisve remove dir
    void dirunlink(char *dirname)
    {
        struct ffblk dir;
        char   tempstr[255];
        int    finish;
    
        strcpy(tempstr,dirname);
        strcat(tempstr,"\\*.*");
    
        // remove all dirs and file inside
        finish=findfirst(tempstr,&dir,0);
        while(!finish)
        {
            char tempstr2[255];
    
            strcpy(tempstr2,dirname);
            strcat(tempstr2,"\\");
            strcat(tempstr2,dir.ff_name);
    
            if(dir.ff_attrib & FA_DIREC)
            {
                if( dir.ff_name[0]!='.' )
                    dirunlink( tempstr2 );
            }
            else
                unlink( tempstr2 );
    
            finish=findnext(&dir);
        }
    
        // remove dir (it is now empty)
        unlink( dirname );
    }
    
    void copydir(char *destdirname,char *srcdirname)
    {
        struct ffblk dir;
        char   tempstr[255];
        int    finish;
    
        mkdir(destdirname, S_IWUSR);
    
        strcpy(tempstr,srcdirname);
        strcat(tempstr,"\\*.*");
    
        // remove all dirs and file inside
        finish=findfirst(tempstr,&dir,0);
        while(!finish)
        {
            char tempstr2[255],tempstr3[255];
    
            strcpy(tempstr2,srcdirname);
            strcat(tempstr2,"\\");
            strcat(tempstr2,dir.ff_name);
    
            strcpy(tempstr3,destdirname);
            strcat(tempstr3,"\\");
            strcat(tempstr3,dir.ff_name);
    
            if(dir.ff_attrib & FA_DIREC)
            {
                if( dir.ff_name[0]!='.' )
                    copydir( tempstr3, tempstr2 );
            }
            else
                fcopy( tempstr3, tempstr2 );
    
            finish=findnext(&dir);
        }
    
    }