complist.c
来自「<Win2k系统编程>源码.次数为国人自编,内容丰富,还是不错的.」· C语言 代码 · 共 1,212 行 · 第 1/3 页
C
1,212 行
continue;
} else if ((state == STATE_FILERIGHTONLY) && (!dlg_right)) {
continue;
}
nFiles++;
/* output the list line */
wsprintf((LPTSTR)msg, "%s\r\n", compitem_gettext_tag(ci));
_lwrite(fh, msg, lstrlen(msg));
}
/* write tail line */
wsprintf((LPTSTR)msg, LoadRcString(IDS_FILES_LISTED), nFiles);
_lwrite(fh, msg, lstrlen(msg));
/* - close file and we are finished */
_lclose(fh);
SetCursor(hcurs);
} /* complist_savelist */
/***************************************************************************
* Function: complist_copyfiles
*
* Purpose:
*
* To copy files to a new directory newroot. if newroot is NULL, query the user
* via a dialog to get the new dir name and options.
*
* Options are either COPY_FROMLEFT or COPY_FROMRIGHT (indicating which
* tree is to be the source of the files, plus any or all of
* INCLUDE_SAME, INCLUDE_DIFFER and INCLUDE_LEFT (INCLUDE_LEFT
* and INCLUDE_RIGHT are treated the same here since the COPY_FROM* option
* indicates which side to copy from).
*
***************************************************************************/
void
complist_copyfiles(COMPLIST cl, LPSTR newroot, UINT options)
{
int nFiles = 0;
int nFails = 0;
static BOOL done_init = FALSE;
LPSTR pstr;
char buffer[64];
DIRITEM diritem;
DLGPROC lpProc;
BOOL bOK;
COMPITEM ci;
int state;
if (!done_init) {
/*
* one-time initialisation of dialog defaults
*/
dlg_options = COPY_FROMLEFT|INCLUDE_LEFTONLY|INCLUDE_DIFFER;
dlg_root[0] = '\0';
done_init = TRUE;
}
if (cl == NULL) {
return;
}
if (newroot == NULL) {
/*
* put up dialog to query rootname and options
*/
/* store the left and right rootnames so that the dlg proc
* can display them in the dialog.
*/
pstr = dir_getroot_list(cl->left);
lstrcpy(dialog_leftname, pstr);
dir_freeroot_list(cl->left, pstr);
pstr = dir_getroot_list(cl->right);
lstrcpy(dialog_rightname, pstr);
dir_freeroot_list(cl->right, pstr);
do {
lpProc = (DLGPROC)MakeProcInstance((WNDPROC)complist_dodlg_copyfiles, hInst);
windiff_UI(TRUE);
bOK = DialogBox(hInst, "CopyFiles", hwndClient, lpProc);
windiff_UI(FALSE);
FreeProcInstance(lpProc);
if (!bOK) {
/* user cancelled from dialog box */
return;
}
if (lstrlen(dlg_root) == 0) {
windiff_UI(TRUE);
MessageBox(NULL, LoadRcString(IDS_ENTER_DIR_NAME),
"Windiff", MB_ICONSTOP|MB_OK);
windiff_UI(FALSE);
}
} while (lstrlen(dlg_root) == 0);
} else {
dlg_options = options;
lstrcpy(dlg_root, newroot);
}
TickCount = GetTickCount();
if (dlg_options & COPY_FROMLEFT) {
if (!dir_startcopy(cl->left))
return;
} else {
if (!dir_startcopy(cl->right))
return;
}
/*
* traverse the list of compitems copying files as necessary
*/
List_TRAVERSE(cl->items, ci) {
if (bAbort){
break; /* fall into end_copy processing */
}
/* check if files of this type are to be copied */
state = compitem_getstate(ci);
if ((state == STATE_SAME) && !(dlg_options & INCLUDE_SAME)) {
continue;
} else if ((state == STATE_DIFFER) && !(dlg_options & INCLUDE_DIFFER)) {
continue;
} else if (state == STATE_FILELEFTONLY) {
if (dlg_options & COPY_FROMRIGHT) {
continue;
}
if ((dlg_options & (INCLUDE_LEFTONLY | INCLUDE_RIGHTONLY)) == 0) {
continue;
}
} else if (state == STATE_FILERIGHTONLY) {
if (dlg_options & COPY_FROMLEFT) {
continue;
}
if ((dlg_options & (INCLUDE_LEFTONLY | INCLUDE_RIGHTONLY)) == 0) {
continue;
}
}
if (dlg_options & COPY_FROMLEFT) {
diritem = file_getdiritem(compitem_getleftfile(ci));
} else {
diritem = file_getdiritem(compitem_getrightfile(ci));
}
/*
* copy the file to the new root directory
*/
if (dir_copy(diritem, dlg_root) == FALSE) {
nFails++;
pstr = dir_getrelname(diritem);
wsprintf((LPTSTR)buffer, LoadRcString(IDS_FAILED_TO_COPY), pstr);
dir_freerelname(diritem, pstr);
if (MessageBox(NULL, buffer, NULL, MB_OKCANCEL | MB_ICONSTOP) == IDCANCEL)
/* user pressed cancel - abort current operation*/
/* fall through to end-copy processing */
break;
} else {
nFiles++;
}
wsprintf((LPTSTR)buffer, LoadRcString(IDS_COPYING), nFiles);
SetStatus(buffer);
/*
* allow user interface to continue
*/
if (Poll()) {
/* abort requested */
TickCount = GetTickCount()-TickCount;
windiff_UI(TRUE);
MessageBox(hwndClient, LoadRcString(IDS_COPY_ABORTED),
"WinDiff", MB_OK|MB_ICONINFORMATION);
windiff_UI(FALSE);
break;
}
} /* traverse */
if (dlg_options & COPY_FROMLEFT) {
nFails = dir_endcopy(cl->left);
} else {
nFails = dir_endcopy(cl->right);
}
TickCount = GetTickCount()-TickCount;
if (nFails<0) {
wsprintf((LPTSTR)buffer, LoadRcString(IDS_COPY_FAILED), -nFails);
} else {
wsprintf((LPTSTR)buffer, LoadRcString(IDS_COPY_COMPLETE), nFails);
}
windiff_UI(TRUE);
MessageBox(hwndClient, buffer, "WinDiff", MB_OK|MB_ICONINFORMATION);
windiff_UI(FALSE);
buffer[0] = '\0';
SetStatus(buffer);
} /* complist_copyfiles */
/***************************************************************************
* Function: complist_match
*
* Purpose:
*
* Matches up two lists of filenames
*
* Commentsz:
*
* We can find out from the DIRLIST handle whether the original list
* was a file or a directory name.
* If the user typed:
* two file names - match these two item even if the names differ
*
* two dirs - match only those items whose names match
*
* one file and one dir
* - try to find a file of that name in the dir.
*
* This function returns TRUE if the complist_match was ok, or FALSE if it was
* aborted in some way.
*
***************************************************************************/
BOOL
complist_match(COMPLIST cl, VIEW view, BOOL fDeep, BOOL fExact)
{
LPSTR lname;
LPSTR rname;
DIRITEM leftitem, rightitem;
int cmpvalue;
TickCount = GetTickCount();
if (dir_isfile(cl->left) ) {
if (dir_isfile(cl->right)) {
/* two files */
/* there should be one item in each list - make
* a compitem by matching these two and append it to the
* list
*/
compitem_new(dir_firstitem(cl->left),
dir_firstitem(cl->right), cl->items, fExact);
view_newitem(view);
TickCount = GetTickCount() - TickCount;
return TRUE;
}
/* left is file, right is dir */
leftitem = dir_firstitem(cl->left);
rightitem = dir_firstitem(cl->right);
lname = dir_getrelname(leftitem);
while (rightitem != NULL) {
rname = dir_getrelname(rightitem);
cmpvalue = lstrcmpi(lname, rname);
dir_freerelname(rightitem, rname);
if (cmpvalue == 0) {
/* this is the match */
compitem_new(leftitem, rightitem, cl->items, fExact);
view_newitem(view);
dir_freerelname(leftitem, lname);
TickCount = GetTickCount() - TickCount;
return(TRUE);
}
rightitem = dir_nextitem(cl->right, rightitem, fDeep);
}
/* not found */
dir_freerelname(leftitem, lname);
compitem_new(leftitem, NULL, cl->items, fExact);
view_newitem(view);
TickCount = GetTickCount() - TickCount;
return(TRUE);
} else if (dir_isfile(cl->right)) {
/* left is dir, right is file */
/* loop through the left dir, looking for
* a file that has the same name as rightitem
*/
leftitem = dir_firstitem(cl->left);
rightitem = dir_firstitem(cl->right);
rname = dir_getrelname(rightitem);
while (leftitem != NULL) {
lname = dir_getrelname(leftitem);
cmpvalue = lstrcmpi(lname, rname);
dir_freerelname(leftitem, lname);
if (cmpvalue == 0) {
/* this is the match */
compitem_new(leftitem, rightitem, cl->items, fExact);
view_newitem(view);
dir_freerelname(rightitem, rname);
TickCount = GetTickCount() - TickCount;
return(TRUE);
}
leftitem = dir_nextitem(cl->left, leftitem, fDeep);
}
/* not found */
dir_freerelname(rightitem, rname);
compitem_new(NULL, rightitem, cl->items, fExact);
view_newitem(view);
TickCount = GetTickCount() - TickCount;
return(TRUE);
}
/* two directories */
/* traverse the two lists in parallel comparing the relative names*/
leftitem = dir_firstitem(cl->left);
rightitem = dir_firstitem(cl->right);
while ((leftitem != NULL) && (rightitem != NULL)) {
lname = dir_getrelname(leftitem);
rname = dir_getrelname(rightitem);
cmpvalue = utils_CompPath(lname, rname);
dir_freerelname(leftitem, lname);
dir_freerelname(rightitem, rname);
if (cmpvalue == 0) {
compitem_new(leftitem, rightitem, cl->items, fExact);
if (view_newitem(view)) {
TickCount = GetTickCount() - TickCount;
return(FALSE);
}
leftitem = dir_nextitem(cl->left, leftitem, fDeep);
rightitem = dir_nextitem(cl->right, rightitem, fDeep);
} else if (cmpvalue < 0) {
compitem_new(leftitem, NULL, cl->items, fExact);
if (view_newitem(view)) {
TickCount = GetTickCount() - TickCount;
return(FALSE);
}
leftitem = dir_nextitem(cl->left, leftitem, fDeep);
} else {
compitem_new(NULL, rightitem, cl->items, fExact);
if (view_newitem(view)) {
TickCount = GetTickCount() - TickCount;
return(FALSE);
}
rightitem = dir_nextitem(cl->right, rightitem, fDeep);
}
}
/* any left over are unmatched */
while (leftitem != NULL) {
compitem_new(leftitem, NULL, cl->items, fExact);
if (view_newitem(view)) {
TickCount = GetTickCount() - TickCount;
return(FALSE);
}
leftitem = dir_nextitem(cl->left, leftitem, fDeep);
}
while (rightitem != NULL) {
compitem_new(NULL, rightitem, cl->items, fExact);
if (view_newitem(view)) {
TickCount = GetTickCount() - TickCount;
return(FALSE);
}
rightitem = dir_nextitem(cl->right, rightitem, fDeep);
}
TickCount = GetTickCount() - TickCount;
return(TRUE);
} /* complist_match */
/* return time last operation took in milliseconds */
DWORD complist_querytime(void)
{ return TickCount;
}
/***************************************************************************
* Function: complist_dodlg_savelist
*
* Purpose:
*
* Dialog to query about filename and types of files. Init dlg fields from
* the dlg_* variables, and save state to the dlg_* variables on dialog
* close. return TRUE for OK, or FALSE for cancel (from the dialogbox()
* using EndDialog).
*
**************************************************************************/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?