home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource4
/
235_01
/
ovsort.c
< prev
next >
Wrap
Text File
|
1987-06-18
|
5KB
|
183 lines
/* 012 11-Oct-86 ovsort.c
Sort routines for OVERVIEW.
Copyright (c) 1986 by Blue Sky Software. All rights reserved.
*/
#include "ov.h"
#ifndef NULL
#define NULL (0)
#endif
extern struct window cw;
extern struct file_ent files[];
static char *nullname = "";
int sortname(), sortext(), sortdate(), sortsize(), sortidx();
char *strchr();
/******************************************************************************
** S O R T **
*****************************************************************************/
sort_asc() { /* sort files in ascending order */
cw.sortopt = 'A';
sort_and_disp(NULL);
}
sort_desc() { /* sort files in descending order */
cw.sortopt = 'D';
sort_and_disp(NULL);
}
sort_none() { /* do not sort files (dos dir order) */
sort_and_disp(sortidx);
}
sort_name() { /* sort files by name */
sort_and_disp(sortname);
}
sort_ext() { /* sort files by extension */
sort_and_disp(sortext);
}
sort_date() { /* sort files by date */
sort_and_disp(sortdate);
}
sort_size() { /* sort files by size */
sort_and_disp(sortsize);
}
/*****************************************************************************
S O R T _ A N D _ D I S P
*****************************************************************************/
sort_and_disp(sortrtn) /* sort files and update window */
int (*sortrtn)();
{
char fname[MAX_NAMELEN+1];
register struct file_ent *fp;
strcpy(fname,files[cw.curidx].name); /* save current file name */
sort_files(sortrtn); /* sort files in desired order */
/* after doing a sort, curidx no longer points to the same file.
Search files[] for the old file name and move current pointer there. */
for (cw.curidx = 0, fp = files; cw.curidx < cw.nfiles; fp++, cw.curidx++)
if (strcmp(fp->name,fname) == 0)
break;
adjust_window(); /* update window display */
update_window(1);
}
/******************************************************************************
** S O R T _ F I L E S **
*****************************************************************************/
sort_files(sortrtn) /* sort the file info by the user selected method */
int (*sortrtn)();
{
if (sortrtn) /* if caller specified a sort routine, */
cw.sortfunc = sortrtn; /* make it the new default */
qsort(files,cw.nfiles,sizeof(struct file_ent),cw.sortfunc);
}
#define sortorder(x) ((cw.sortopt == 'A') ? x : -x)
sortname(f1,f2) /* support function to sort by name */
struct file_ent *f1, *f2;
{
return(sortorder(strcmp(f1->name,f2->name)));
}
static int
sortsize(f1,f2) /* support function to sort by size */
register struct file_ent *f1, *f2;
{
int rc;
if (f1->size > f2->size)
rc = 1;
else
if (f1->size < f2->size)
rc = -1;
else
rc = strcmp(f1->name,f2->name); /* sort by name if same size */
return(sortorder(rc));
}
static int
sortext(f1,f2) /* support function to sort by extension */
struct file_ent *f1, *f2;
{
int rc;
register char *ep1, *ep2;
ep1 = strchr(f1->name,'.'); /* find the extension for f1 */
if (ep1 == NULL)
ep1 = nullname;
else
ep1++;
ep2 = strchr(f2->name,'.'); /* find the extension for f2 */
if (ep2 == NULL)
ep2 = nullname;
else
ep2++;
if ((rc = strcmp(ep1,ep2)) == 0) /* sort by whole name if ext's equal */
rc = strcmp(f1->name,f2->name);
return(sortorder(rc));
}
static int
sortdate(f1,f2) /* support function to sort by date/time */
register struct file_ent *f1, *f2;
{
int rc;
if (f1->date > f2->date)
rc = 1;
else
if (f1->date < f2->date)
rc = -1;
else
if (f1->time > f2->time)
rc = 1;
else
if (f1->time < f2->time)
rc = -1;
else
rc = strcmp(f1->name,f2->name);
return(sortorder(rc));
}
static int
sortidx(f1,f2) /* sort by index # (dos order) */
struct file_ent *f1, *f2;
{
if (f1->index > f2->index)
return(1);
else
return(-1);
}