home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
vol_200
/
235_02
/
ovwin.c
< prev
next >
Wrap
Text File
|
1987-06-17
|
34KB
|
952 lines
/* 034 14-Feb-87 ovwin.c
Copyright (c) 1987 by Blue Sky Software. All rights reserved.
*/
#include <setjmp.h>
#include <dos.h>
#include "ov.h"
#ifndef NULL
#define NULL (0)
#endif
#define V_bar (0xba)
#define H_bar (0xcd)
int diridx = 0; /* # dir names when showall */
char **dirlst = NULL; /* ptr to dir name ptrs when showall */
static int win_update; /* NZ if refresh_screen update */
static unsigned char inwin = 0; /* # active info windows */
static unsigned char numwin = 1; /* # active windows */
static WINDOW *curwin = NULL, *winlis = NULL, *winp;
static char *tdir; /* target dir */
static char *tname; /* target name */
static FILE_ENT holdf; /* save file_ent */
static char *nomem = "Insufficient memory for another window, no window created!";
static char *noaccess = "Unable to access specified directory: ";
extern WINDOW cw;
extern int winupdate;
extern FILE_ENT files[];
extern unsigned dataseg;
extern jmp_buf back_to_main;
extern unsigned char anyshowall;
char far *malloc_f();
int ALTCALL scanwindows(), ALTCALL win_switch();
int addfile_ent(), delfile_ent(), refresh_window();
char *strrchr(), *strchr(), *parsepath(), *findir();
int ALTCALL wincpy(WINDOW *, WINDOW *), ALTCALL disp_empty_msg(int);
int ALTCALL savefiles(char far *, int), ALTCALL restorefiles(char far *, int);
/******************************************************************************
** W I N _ O P E N **
*****************************************************************************/
win_open() { /* open another file name display window */
register WINDOW *wp;
/* make sure the current window is large enough to split */
if (cw.wrows < 6)
show_error(0,10,1,"Current window is too small to open another");
/* allocate memory for the new window structure */
if ((wp = (WINDOW *) malloc(sizeof(WINDOW))) == NULL)
show_error(0,11,1,nomem);
wincpy(wp,&cw); /* initialize new window via current window */
/* allocate memory to store files[] data */
if ((wp->save_files = malloc_f(MAX_FILES * sizeof(FILE_ENT))) == NULL) {
free((char *)wp);
show_error(0,12,1,nomem);
}
/* if there is only one window open so far, create the window structure
and files[] save area to store the current window stuff */
if (numwin == 1) {
curwin = (WINDOW *) malloc(sizeof(WINDOW));
cw.save_files = malloc_f(MAX_FILES * sizeof(FILE_ENT));
if (curwin == NULL || cw.save_files == NULL) {
free((char *)wp);
if (curwin) {
free((char *)curwin);
curwin = NULL;
}
show_error(0,13,1,nomem);
}
cw.prev = cw.next = winlis = curwin;
}
savefiles(cw.save_files,cw.nfiles); /* save current window's files[] data */
/* link the new window just after the current window */
wincpy(curwin,&cw);
wp->next = curwin->next;
wp->prev = curwin;
wp->prev->next = wp;
wp->next->prev = wp;
wincpy(&cw,curwin);
/* adjust the current window and new window display sizes */
wp->wrows = cw.wrows / 2; /* new is at most 1/2 of current */
cw.wrows = cw.wrows - wp->wrows; /* current keeps whats left */
wp->fwrow = cw.fwrow + cw.wrows; /* new start at end of current */
cw.ndrows -= wp->wrows; /* all new rows came from name disp */
wp->fnrow = wp->fwrow + 1; /* one overhead row for dir name */
wp->ndrows = wp->wrows - 1;
/* adjust the top window if it was the only one and it didn't already
have a header line */
if (numwin == 1 && !cw.showall) {
cw.fnrow++; /* need a line to display window */
cw.ndrows--; /* directory line */
insert_line(cw.fwrow+1,cw.wrows-1); /* scroll file info down a line */
disp_dirname(); /* disp the dir name */
}
/* adjust old window if current item is no longer visible and turn off
the file pointer in the old window */
if (!on_screen(cw.curidx)) { /* adjust/redisplay window */
adjust_window(); /* if current item no longer */
update_window(0); /* displayed */
} else /* not redisplaying window, turn off highlighted ptr */
if (cw.nfiles) /* turn off file ptr in old window */
fp_off(cw.curidx);
else /* or de-highlight empty dir msg */
disp_empty_msg(0);
/* make the new window the current one */
wincpy(curwin,&cw); /* save the old current one */
wincpy(&cw,wp); /* new one becomes current */
curwin = wp; /* remember who it is */
numwin++; /* one more window than there was */
if (cw.info_display) /* if info display is active, there */
infocnt(1); /* is now 1 more info window active */
/* only one window can be in showall mode */
if (cw.showall) { /* did the old window have showall? */
cw.showall = 0; /* yes, turn off on this one */
getfiles(); /* reread current dir only */
update_header(); /* display current dir header info */
}
/* display the file data in the new window */
adjust_window();
update_window(1);
}
/******************************************************************************
W I N _ C L O S E
*****************************************************************************/
win_close() { /* close the current window */
int fwrowadj;
register WINDOW *wp;
if (numwin == 1) /* nothing to do if only one window */
return;
/* determine the window adjustment fudge factor, 1 extra line is available
if only one window will remain and that window is not showall */
fwrowadj = (numwin == 2 && (!anyshowall || cw.showall)) ? 0 : 1;
/* adjust the next or prior window to take up the closing windows space
on the screen. Always pick the next window unless current is the
last one displyed */
if ((wp = cw.next) != winlis) { /* next = winlis if last */
wp->fwrow = cw.fwrow; /* adj nxt to take over */
} else /* closing last window on screen */
wp = cw.prev; /* prev is current to be */
wp->wrows += cw.wrows; /* it has this many more rows */
wp->fnrow = wp->fwrow + fwrowadj; /* name display rows */
wp->ndrows = wp->wrows - fwrowadj;
cw.next->prev = cw.prev; /* delink the current (closing) */
cw.prev->next = cw.next; /* windows block from window list */
if (curwin == winlis) /* keep track of new top window if */
winlis = wp; /* old top is being closed */
if (cw.showall) /* turn off showall mode if this */
showoff(); /* window had it on */
if (cw.info_display) /* one less info window if this wind */
infocnt(-1); /* had info display active */
free_f(cw.save_files); /* free the cur win's files[] area */
free((char *)curwin); /* free the cur/old win's block */
/* make the next (or prior) window current, restore its files */
wincpy(&cw,curwin = wp);
restorefiles(cw.save_files,cw.nfiles);
numwin--; /* one less window now */
/* when there is only one window, don't keep the block and files[]
save area overhead */
if (numwin == 1) {
free((char *)curwin);
free_f(cw.save_files);
curwin = winlis = NULL;
cw.save_files = (char far *) NULL;
}
update_header(); /* make volume, dir, file, tag info correct */
adjust_window(); /* adjust the display */
update_window(1);
/* switch to the window's directory */
if (change_dir(cw.dirbuf) != 0)
show_error(1,0,1,noaccess);
}
/******************************************************************************
W I N _ E X P A N D
*****************************************************************************/
win_expand() { /* expand current window to full screen */
int i;
register WINDOW *wp, *np;
if (numwin == 1) /* nothing to do if only one window */
return;
/* there will only be one window left, free up all memory blocks */
for (i == numwin, wp = winlis; i; i--) {
np = wp->next;
free_f(wp->save_files);
free((char *)wp);
wp = np;
}
numwin = 1; /* set counters/pointer to 1 window status */
curwin = winlis = NULL;
if (anyshowall && !cw.showall) /* turn off showall mode if it was */
showoff(); /* active in another window */
infocnt(cw.info_display ? -(inwin-1) : -inwin); /* at most 1 info win left */
/* adjust to full screen */
cw.fwrow = cw.fnrow = FIRST_NROW + cw.info_display;
cw.wrows = cw.ndrows = NAME_ROWS - cw.info_display;
if (cw.showall) { /* showall always has a header */
cw.fnrow++;
cw.ndrows--;
}
adjust_window(); /* redisplay the window with new size */
update_window(1);
}
/******************************************************************************
** W I N _ N E X T **
*****************************************************************************/
win_next() { /* switch to the next window */
if (numwin == 1) /* nothing to do if only one window */
return;
win_switch(curwin->next); /* switch to next window */
}
/******************************************************************************
W I N _ P R E V
*****************************************************************************/
win_prev() { /* switch to the previous window */
if (numwin == 1) /* nothing to do if only one window */
return;
win_switch(curwin->prev); /* switch to previous window */
}
/******************************************************************************
W I N _ S W I T C H
*****************************************************************************/
static int ALTCALL
win_switch(newp) /* switch to a new window */
register WINDOW *newp;
{
savefiles(cw.save_files,cw.nfiles); /* save current window's files[] data */
if (cw.nfiles) /* deselect current item in widow */
fp_off(cw.curidx);
else /* or de-highlight empty dir msg */
disp_empty_msg(0);
wincpy(curwin,&cw); /* switch to new window */
wincpy(&cw,curwin = newp);
restorefiles(cw.save_files,cw.nfiles); /* get new windows files[] entries */
if (cw.nfiles) /* select current item in new window */
fp_on(cw.curidx);
else /* or highlight empty dir msg */
disp_empty_msg(1);
if (change_dir(cw.dirbuf) != 0) /* switch to the window's directory */
show_error(1,0,1,noaccess);
update_header(); /* make volume, dir, file, tag info correct */
}
/*****************************************************************************
A D D 2 W I N D O W S
*****************************************************************************/
add2windows(todir,tofn,fp) /* add file to any windows showing dest dir */
FILE_ENT *fp;
char *todir, *tofn;
{
tdir = Strdup(todir); /* save dir and fn in var's for addfile_ent */
tname = Strdup(tofn);
holdf = *fp; /* save file_ent 'cause files[] is changed */
holdf.flags &= ~TAGGED; /* we don't want the tagged flag */
scanwindows(addfile_ent); /* add the file_ent to all matching windows */
free(tdir); /* local strings alloc'd because callers tend */
free(tname); /* to use strings in files[] which is swapped */
}
/*****************************************************************************
D E L F R O M W I N S
*****************************************************************************/
delfromwins(fromdir,fromfn) /* delete file from all windows showing dest dir */
char *fromdir, *fromfn;
{
tdir = Strdup(fromdir); /* save target dir and name in var's */
tname = Strdup(fromfn); /* for delfile_ent */
scanwindows(delfile_ent); /* delete the file_ent from all windows */
free(tdir); /* local strings alloc'd because callers tend */
free(tname); /* to use strings in files[] which is swapped */
}
/****************************************************************************
A D D F I L E _ E N T
****************************************************************************/
static int
addfile_ent() { /* add a FILE_ENT to target windows */
register int i;
register FILE_ENT *tfp;
/* if the current window displays the target dir or the target drive
in showall mode, add the file ent to it */
if (stricmp(cw.dirbuf,tdir) == 0 || (cw.showall && *cw.dirbuf == *tdir)) {
/* don't add the file if it doesn't match the selection criteria */
if ((cw.selatrs & holdf.flags) != holdf.flags ||
(*cw.mask && (cw.maskcmp != match_name(holdf.name,cw.mask))))
return;
if (numwin > 1) /* make sure files[] is ok */
restorefiles(cw.save_files,cw.nfiles);
/* see if there is an existing file by that name in the target dir */
for (i = cw.nfiles, tfp = files; i; i--, tfp++)
if (stricmp(tname,tfp->name) == 0 && stricmp(tdir,tfp->dirp) == 0)
break;
if (i) { /* back out info for an existing */
delent(tfp); /* file by the same name */
packfiles(); /* pack files[] now, not later */
}
/* modify holding file entry to its final form */
strncpy(holdf.name,tname,sizeof(holdf.name)); /* file name */
holdf.dirp = cw.showall ? findir(tdir) : cw.dirbuf; /* file's dir */
holdf.index = cw.nfiles+1; /* a guess */
/* add file to files[] if there is room */
if (cw.nfiles < MAX_FILES) {
/* since the files may be sorted by something other than name (say
date for example) we need to scan files[] again to find where to
insert the new entry - I used to just sort files[] again but qsort
is way to slow when files[] is already almost sorted */
for (i = cw.nfiles, tfp = files; i; i--, tfp++)
if ((*cw.sortfunc)(&holdf,tfp) < 0)
break;
/* i > 0 if entry needs to be inserted, i = 0 if at end */
if (i)
memcpy((char *)(tfp+1),(char *)tfp,i*sizeof(FILE_ENT));
*tfp = holdf; /* finally, add entry */
cw.nfiles++; /* there is one more file now */
cw.num_files++;
cw.files_size += tfp->size; /* taking this much more space */
cw.updated = W_DISP; /* win needs redisplay (not packing) */
winupdate++; /* some window needs redisplay */
if (numwin > 1)
savefiles(cw.save_files,cw.nfiles);
}
}
}
/****************************************************************************
D E L F I L E _ E N T
****************************************************************************/
static int
delfile_ent() { /* delete a FILE_ENT from target windows */
register int i;
register FILE_ENT *tfp;
/* if the current window displays the target dir or the target drive
in showall mode, delete the file ent */
if (stricmp(cw.dirbuf,tdir) == 0 || (cw.showall && *cw.dirbuf == *tdir)) {
if (numwin > 1) /* make sure files[] is ok */
restorefiles(cw.save_files,cw.nfiles);
/* see if there is an existing file by that name in the target dir */
for (i = cw.nfiles, tfp = files; i; i--, tfp++)
if (stricmp(tname,tfp->name) == 0 && stricmp(tdir,tfp->dirp) == 0)
break;
if (i) { /* back out info for an existing */
delent(tfp); /* file by the same name */
winupdate++; /* window needs redisplay */
cw.updated |= W_PACK; /* files[] needs to be packed */
if (numwin > 1)
savefiles(cw.save_files,cw.nfiles);
}
}
}
/*****************************************************************************
D E L E N T
*****************************************************************************/
delent(fp) /* remove an entry from files[] */
register FILE_ENT *fp;
{
/* Note: this routine changes cw.num_files, but it doesn't change
cw.nfiles - this is because the routine packfiles which should
be called shortly needs the old value of cw.nfiles */
cw.num_files--; /* one fewer file */
cw.files_size -= fp->size; /* that much space not used */
if (fp->flags & TAGGED) { /* was file tagged? */
cw.num_tagged--; /* one less tagged file */
cw.tag_size -= fp->size; /* this space not tagged now */
}
*fp->name = '\0'; /* mark this entry as deleted */
}
/****************************************************************************
S C A N W I N D O W S
****************************************************************************/
static int ALTCALL
scanwindows(func) /* scan windows, call func for each one */
int (*func)();
{
int i;
register WINDOW *wp;
/* if there is a list of windows, start with the 1st; switch if not there */
if (numwin > 1) {
wincpy(curwin,&cw); /* save current window if > 1 */
savefiles(cw.save_files,cw.nfiles);
if (curwin != winlis) { /* temp switch to top window */
wincpy(&cw,winlis);
}
}
/* Note: only the files for the original window are saved and restored,
callers func should restore/savefiles if it needs to */
for (i = numwin, wp = winlis; i; i--) { /* check each file window */
winp = wp; /* let func know which window it is */
(*func)(); /* invoke callers func with this window */
if (numwin > 1) { /* advance to next window if there is one */
wincpy(wp,&cw);
wincpy(&cw,wp = cw.next);
}
}
if (numwin > 1) { /* restore the current window if > 1 */
wincpy(&cw,curwin);
restorefiles(cw.save_files,cw.nfiles);
}
}
/******************************************************************************
** R E N E W **
*****************************************************************************/
renew() { /* renew the file display */
getcwd(cw.dirbuf,MAX_PATHLEN); /* reinit drive/dir info incase */
initdrive(*cw.dirbuf); /* it changed somehow */
getfiles(); /* reread the directory */
setup_file_scr(); /* display the static screen image */
update_header(); /* update header info */
refresh_screen(0); /* redisplay all file data */
}
/******************************************************************************
R E N E W _ W I N D O W
*****************************************************************************/
renew_window() { /* renew the current window display */
getfiles(); /* reload the files[] structure */
adjust_window(); /* resize window data */
update_header(); /* update the header */
update_window(1); /* and the window data */
}
/******************************************************************************
R E F R E S H _ S C R E E N
*****************************************************************************/
refresh_screen(wup) /* (re)initialize the total file data display */
int wup;
{
win_update = wup; /* save wup in static for refresh_window */
if (inwin && wup == 0) /* display the info header if needed */
infohead();
scanwindows(refresh_window); /* redisplay each window */
}
/*****************************************************************************
R E F R E S H _ W I N D O W
*****************************************************************************/
static int
refresh_window() { /* refresh one window - called by scanwindows */
if (numwin > 1)
restorefiles(cw.save_files,cw.nfiles);
if (win_update && cw.updated) { /* is this a window update call? */
if (cw.updated & W_PACK)
packfiles();
if (numwin > 1)
savefiles(cw.save_files,cw.nfiles);
}
/* redisplay this window if not a win_update call or win_update call and
this window has been modified */
if (!win_update || cw.updated) {
adjust_window(); /* calculate display parameters */
update_window(winp == curwin); /* update display window */
cw.updated = 0; /* doesn't need to be updated again */
}
}
/******************************************************************************
U P D A T E _ V O L _ S T A T S
******************************************************************************/
update_vol_stats() { /* get and display volume statistics */
getvolsiz(*cw.dirbuf,&cw.drivep->vol_size,&cw.drivep->vol_free,
&cw.drivep->clustersiz);
disp_vol_stats();
}
/******************************************************************************
U P D A T E _ H E A D E R
******************************************************************************/
update_header() { /* update display header */
gotorc(VOL_ROW,1); /* make sure volume, directory, */
out_str(cw.drivep->volbuf,11,' '); /* file, tagged info is correct */
if (!cw.showall) { /* display the current dir name */
gotorc(VOL_ROW,PATH_COL+1); /* but if showall is in effect */
out_str(cw.dirbuf,65,' '); /* its done somewhere else */
}
disp_vol_stats();
disp_file_stats();
gotorc(MASK_ROW,MASK_COL-1); /* display the selection mask */
disp_char(cw.maskcmp ? ' ' : '~');
out_str(cw.mask,MASK_LEN,' ');
gotorc(MASK_ROW+1,MASK_COL-1); /* display the selection attributes */
disp_attrib(cw.selatrs);
disp_str(cw.selatrs & DIR ? " D" : " .");
}
/******************************************************************************
U P D A T E _ W I N D O W
*****************************************************************************/
int ALTCALL
update_window(fptr) /* display a window full of file info */
int fptr;
{
int col;
register int i, m;
if (numwin > 1 || cw.showall) /* display window header if > 1 */
disp_dirname(); /* window or showall mode */
/* display a window of file names */
for (i = 0; i + cw.fnrow < cw.fnrow + cw.ndrows; i++) {
gotorc(i+cw.fnrow,0);
if (i < cw.nrows) {
for (col = 0, m = cw.nbase + i; m < cw.nfiles; col++, m += cw.nrows)
disp_file(&files[m],(m == cw.curidx && fptr));
if (col < cw.ncols) /* try to only clear on rows where less */
clr_eol(); /* than ncols are displayed */
} else
clr_eol();
}
/* display files dir path if showall mode */
if (fptr && cw.showall && cw.curidx < cw.nfiles)
disp_path(cw.curidx);
if (cw.nfiles == 0) /* display a msg if no files in dir */
disp_empty_msg(fptr);
}
/******************************************************************************
A D J U S T _ W I N D O W
*****************************************************************************/
int ALTCALL
adjust_window() {
/* for MS DOS, assume the max length file name is 13. 8 for the primary
name, 1 for '.', 3 for the extension, and 1 for '\' if its a directory */
cw.maxlen = MAX_NAMELEN + 1;
/* everything depends on # files in directory */
if (cw.nfiles == 0) /* unusual, but dir may be empty */
cw.nrows = cw.ncols = 1;
else { /* are files, calc logical rows, cols */
cw.ncols = (cw.info_display) ? 1 : 5;
cw.nrows = (cw.nfiles+(cw.ncols-1)) / cw.ncols;
}
cw.colsiz = SCREEN_COLS / cw.ncols; /* width of each column */
/* update current logical idx */
if (cw.curidx >= cw.nfiles)
cw.curidx = cw.nfiles ? cw.nfiles - 1 : 0;
/* make sure nbase is setup such that the current file is displayed */
if (cw.nfiles <= cw.ndrows * cw.ncols) /* if file entries will fit on */
cw.nbase = 0; /* 1 screen, start at 1st */
else {
cw.nbase = idx2lr(cw.curidx) - cw.ndrows / 2; /* try to center curidx */
if (cw.nbase > 0 && cw.nbase + cw.ndrows > cw.nrows) /* no blank rows */
cw.nbase = cw.nrows - cw.ndrows; /* if possible */
if (cw.nbase < 0) /* might overshoot */
cw.nbase = 0;
}
}
/******************************************************************************
I N F O C N T
*****************************************************************************/
infocnt(chg) /* display/remove info header when required */
int chg;
{
int cur_isnt_top;
inwin += chg; /* more or less info windows */
cur_isnt_top = (numwin > 1 && curwin != winlis);
/* if the count of info windows just went to 0, or it just went from 0 to 1,
we need to add or remove the info display header. The top display
window losses or gains a row when this happens */
if ((inwin == 0 && chg) || (inwin == 1 && chg > 0)) {
/* do a temp switch to the top window if not already there */
if (cur_isnt_top) {
wincpy(curwin,&cw);
savefiles(cw.save_files,cw.nfiles);
wincpy(&cw,winlis);
restorefiles(cw.save_files,cw.nfiles);
}
/* now add or remove a row from the window */
if (inwin) { /* remove a line, display header */
cw.fwrow++; cw.fnrow++;
cw.wrows--; cw.ndrows--;
infohead();
} else { /* add a line, remove header */
cw.fwrow--; cw.fnrow--;
cw.wrows++; cw.ndrows++;
}
/* now update the top window display, but don't bother if the current
window is the top window - it will be updated by caller */
if (cur_isnt_top) {
adjust_window(); /* calculate #rows, columns, etc to display */
update_window(0);
}
/* restore windows if we did a temp switch above */
if (cur_isnt_top) {
wincpy(winlis,&cw);
savefiles(cw.save_files,cw.nfiles);
wincpy(&cw,curwin);
restorefiles(cw.save_files,cw.nfiles);
}
}
}
/*****************************************************************************
D I S P _ E M P T Y _ M S G
*****************************************************************************/
static int ALTCALL
disp_empty_msg(on) /* display empty dir msg w/wo highlighting */
int on;
{
if (on)
setvattrib(DIS_HIGH);
disp_str_at("No files!",cw.fnrow+1,SCREEN_COLS/2-5);
if (on)
setvattrib(DIS_NORM);
}
/*****************************************************************************
D I S P _ D I R N A M E
*****************************************************************************/
disp_dirname() { /* display the dir name header */
char allmsg[20];
if (cw.showall) { /* special header if showall mode */
strcpy(allmsg,"FILES ON DRIVE ");
strncat(allmsg,cw.dirbuf,2);
center_text(cw.fwrow,allmsg);
} else
center_text(cw.fwrow,cw.dirbuf); /* disp the dir name */
}
/*****************************************************************************
I N F O H E A D
*****************************************************************************/
infohead() { /* display the info header */
setvattrib(DIS_HEAD);
disp_str_at(" NAME USED ALLOCATED DATE TIME R H S A DIR",
FIRST_NROW,0);
clr_eol();
setvattrib(DIS_NORM);
}
/*****************************************************************************
S H O W _ A L L
*****************************************************************************/
show_all() {
if (anyshowall && !cw.showall) /* only one window can do showall */
show_error(0,17,1,"Only one window can show all files!");
if (cw.showall ^= 1) { /* toggle showall mode */
/* showall mode is being turned on, allocate space for dir name ptrs */
if ((dirlst = (char **) calloc(MAX_DIR,sizeof(char *))) == NULL) {
cw.showall = 0;
show_error(0,16,1,"Out of memory! Show All is not active!");
}
if (numwin == 1) { /* make row for showall header if not already */
cw.fnrow++;
cw.ndrows--;
}
anyshowall = TRUE; /* yes, a window has showall turned on */
} else /* showall is being turned off */
showoff();
renew_window(); /* redo window with/without showall mode */
}
/*****************************************************************************
S H O W O F F
*****************************************************************************/
showoff() { /* turn off show all mode */
register int i;
register char **cp;
for (i = 0, cp = dirlst; i < diridx; i++, cp++) /* release dir name */
free(*cp); /* memory */
free((char *)dirlst); /* now release pointer memory */
diridx = 0; /* reset for next time */
dirlst = NULL;
cw.showall = anyshowall = FALSE; /* no window has showall now */
if (numwin == 1) { /* release showall header line if not needed */
cw.fnrow--;
cw.ndrows++;
}
}
/******************************************************************************
W I N C P Y
******************************************************************************/
static int ALTCALL
wincpy(to,from) /* copy window structures - I made this a separate */
WINDOW *to, *from; /* routine cause MSC generates a bunch of code for */
{ /* each structure asignment - in reality, it just a */
/* little more than the code required to call this */
/* function, but... */
*to = *from; /* not much to look at */
}
/******************************************************************************
** S A V E / R E S T O R E F I L E S **
******************************************************************************/
static int ALTCALL
savefiles(fp,nf) /* copy files[] to save area */
char far *fp;
int nf;
{
movedata(dataseg,(unsigned int) files,FP_SEG(fp),FP_OFF(fp),
nf * sizeof(FILE_ENT));
}
static int ALTCALL
restorefiles(fp,nf) /* copy files[] from save area */
char far *fp;
int nf;
{
movedata(FP_SEG(fp),FP_OFF(fp),dataseg,(unsigned int) files,
nf * sizeof(FILE_ENT));
}