home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Interactive Guide
/
c-cplusplus-interactive-guide.iso
/
c_ref
/
csource5
/
331_01
/
ged1.c
< prev
next >
Wrap
Text File
|
1990-06-14
|
11KB
|
424 lines
/*
HEADER: CUG999.02;
TITLE: GED (nee QED) screen editor -- part 1;
DATE: 05/19/87;
DESCRIPTION: "Disc directory and option selection for SE.";
SYSTEM: MS-DOS;
FILENAME: GED1.C;
AUTHORS: G. Nigel Gilbert, James W. Haefner, Mel Tearle, G. Osborn;
COMPILERS: DeSmet C;
*/
/*
e/qed/ged screen editor
(C) G. Nigel Gilbert, MICROLOGY, 1981
August-December 1981
Modified: Aug-Dec 1984: BDS-C 'e'(vers 4.6a) to 'qed' (J.W.Haefner)
March 1985: BDS-C 'qed' to DeSmet-C 'qed' (J.W.Haefner)
May 1986: converted to ged - Mel Tearle
FILE: qed1.c
FUNCTIONS: dirmsk, printdirectory, envir, files, putonoff,
getnumb, getlow
PURPOSE: environment; change files.
*/
#include <stdio.h>
#include "ged.h"
#define EXTENT 12
#define RECORDS 15
#define EXTSIZ 128
/* in MSDOS 2.x just pass the string to showdir
* maintain dirmsk call for other functions
*/
dirmsk()
{
char *pattp;
pattp = patt;
if ( scans( patt, FILELEN ) == ESCKEY )
return YES;
if ( !*pattp )
pattp = "*.*";
showdir( pattp );
}
/* show msdos directory from ambiguous mask
* assumes vers.2.x, allows path names
*/
showdir(msk)
char *msk;
{
unsigned char getkey();
char dtabuf[43], *dirsp, curdir[64], *curdirp;
char *bufp, first, driven, drivel, entriesonline, a, c;
long fsize, *sizep, used, free;
int x, y, i;
/* init display */
cleareop(0);
/* has a drive been specified?
*/
for ( i = 0; ( (c = msk[i++] ) && ( c != ':' ) ); );
if ( c ) {
drivel = toupper( msk[(i-=2)] );
{
if ( ( ( driven = drivel-'A' ) < 0 ) || ( driven > 15 ) ) {
driven = curdsk;
drivel = driven+'A';
}
}
}
else {
driven = curdsk;
drivel = driven+'A';
}
curdirp = curdir;
*curdirp = 0;
gotoxy( 0, 6 );
if ( getpath( curdirp, ( driven+1 ) ) == FAIL )
return NO;
putstr( "Directory of " );
dispch( drivel );
putstr( ":\\" );
putstr( curdirp );
if ( curdsk != ( driven ) && seldisk( driven ) != FAIL ) {
putstr( " (default drive is " );
putch( curdsk+'A' );
putstr( ":)" );
}
/* get disk free space
*/
rax = ( 0x36 << 8 );
rds = -1;
rdx = driven + 1;
rcx = 0x00;
syscall();
if ( rax == 0xffff ) {
error( " Bad drive " );
return( rax );
}
free = (long) rax * rbx * rcx;
cleareol( ( x = 2 ), ( y = 8 ) );
dirsp = "=dir";
entriesonline = 0;
used = 0;
for ( i = 0; i < 43; i++ )
dtabuf[i] = 0;
/* set disk dma transfer address. small data model */
rdx = (unsigned int) dtabuf;
rax = 0x1A << 8;
syscall();
first = TRUE;
do {
rax = ( (first) ? ( 0x4e << 8 ) : ( 0x4f << 8 ) ); /* find first & next */
rdx = (unsigned int) msk; /* point to path */
rds = -1; /* use current ds */
rcx = 0x30; /* show normal, dir and archived files */
syscall();
if ( rax == 2 ) { /* bad path */
error(" Bad path ");
return NO;
}
if ( ( rax != 18 ) ) { /* name is found */
color1();
first = FALSE;
sizep = (long *) &dtabuf[0x1a];
fsize = *sizep;
used += fsize;
bufp = &dtabuf[0x1e];
putstr( bufp );
if ( dtabuf[0x15] == 0x10 ) putstr( dirsp ); /* entry is directory */
/* put code to show if archive bit set, here
*/
if ( ( ++entriesonline < 5 ) )
gotoxy( ( x += 15 ), y );
else {
cleareol( ( x = 2 ), ++y );
if ( y == SHEIGHT ) {
putstr( "[|<cr>| for MORE...]" );
a = getkey();
if ( ( a == ESCKEY ) || ( a == F9KEY ) ) return ESCKEY;
color1();
cleareop( ( y = 8 ) );
gotoxy( ( x = 2 ), y );
}
entriesonline = 0;
}
}
}
while ( ( rax != 18 ) );
gotoxy( 0, SHEIGHT );
putstr( "Total Bytes Free = " );
uspr( 0, free, ATTR0);
putstr( " Used = " );
uspr( 0, used, ATTR0 );
if ( curdsk != driven ) seldisk( curdsk );
color1();
gotoxy( 0, 0 );
return ( rax );
}
envir()
{
char c;
long jj;
char buf[81];
puttext();
do {
cleareop(0);
putstatusline(cline);
gotoxy(0,2);
putstr("Program options:\n\n");
putstr(" enter |F| for files\n\n");
putstr("|A|uto indent: ");
putonoff(autoin);
putstr("|B|ack up original ");
putonoff(backup);
putstr("|C|trl codes OK ");
putonoff(ctrl);
sprintf(buf,"temp. |D|isc drive %c:\n",pagingfile[0]);
putstr(buf);
putstr("|H|orizontal scroll all lines ");
putonoff(blockscroll);
putstr("|P|arity=0. (import wordstar). ");
putonoff(charmask == 0x7F);
sprintf(buf,"|M|em use allowed %d kb\n",fullmem);
putstr(buf);
sprintf(buf,"|T|ab setting %d\n",tabwidth);
putstr(buf);
putstr("|S|trip trailing blanks,tabs ");
putonoff(!trail);
putstr("^|Z| at end of output file ");
putonoff(eofchar);
jj = (long) (slotsinmem-2)*(PAGESIZE/(sizeof(*tp)));
if (jj > 16383L)
jj = 16383L; /* really a little more */
sprintf(buf,"\nMemory allows %ld lines of text\n",jj);
putstr(buf);
putstr("Use -A -M99 etc. to set options at load time\n");
agn:
gotoxy(0,19);
putstr("Enter capital letter to change, |<esc>| to return: ");
switch( (c = getlow()) ) {
case 'a':
autoin = !autoin;
break;
case 'b':
backup = !backup;
break;
case 'c':
ctrl = !ctrl;
break;
case 'h':
blockscroll = !blockscroll;
break;
case 't':
putstr( "\n\nEnter new |tab width|: " );
if ( !( tabwidth = getnumb()) )
tabwidth = 1;
break;
case 's':
trail = !trail;
break;
case 'f':
if ( files() )
goto escape;
break;
case 'z':
eofchar = !eofchar;
break;
case 'p':
case 'm':
case 'd':
putstr("Must be specified at load time.");
goto agn;
break;
case ESCKEY:
goto escape;
}
}
while (YES);
escape:
cleareop(0);
topline = 1; /* help off if on */
calp();
putpage();
putstatusline( cline );
}
getpath(curdirp,drvnum)
char *curdirp;
int drvnum;
{
rax = ( 0x47 << 8 ); /* get directory */
rsi = (unsigned int) curdirp;
rdx = drvnum;
syscall();
if ( ( carryf ) && ( rax == 0x15 ) ) {
error( "Bad drive" );
return FAIL;
}
return YES;
}
files()
{
char oldname[15], newname[15], dc, c;
char curdir[64], *curdirp, *tp1;
int dir;
do {
cleareop(0);
putstatusline( cline );
newcomm:
dir = curdsk;
gotoxy( 0, 1 );
putstr( "Enter |Q| to return to Edit context |D| to delete a file\n" );
putstr( " |R| to rename a file |P| to change/show path |>| to view directory \n" );
cleareol( 0, 3 );
putstr( " |C| to change