efile.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 252 行
C
252 行
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <dos.h>
#include <string.h>
#include "edit.h"
#include "filedll.h"
static char _ext[] = "*.*";
static char _savemsg[] = "Save current changes";
#ifdef __WINDOWS_386__
static char _fmt[] = "%s: %s";
#else
static char _fmt[] = "%s: %Fs";
#endif
/*
* CheckFileSave - check if file needs to be saved; if so,
* ask the user if it should be or not
*/
BOOL CheckFileSave( LPEDATA ed )
{
char str[128];
int rc;
if( ed->needs_saving ) {
if( ed->filename == NULL ) {
strcpy( str, _savemsg );
} else {
sprintf( str, _fmt, _savemsg, ed->filename );
}
rc = MessageBox( ed->hwnd, str, EditTitle, MB_YESNOCANCEL );
if( rc == IDYES ) {
if( FileSave( ed, FALSE ) ) return( TRUE );
} else if( rc == IDNO ) {
return( TRUE );
}
return( FALSE );
}
return( TRUE );
} /* CheckFileSave */
/*
* GetFileName - get a file name using common dialog stuff
*/
static BOOL GetFileName( LPEDATA ed, int type, char *fname )
{
FILEOPEN of;
HANDLE dll;
#if defined(__WINDOWS_386__)
HINDIR h;
#else
BOOL (PASCAL FAR *gsn)( LPFILEOPEN );
#endif
FARPROC farp;
DWORD a1,a2;
BOOL rc;
dll = LoadLibrary( "filedll.dll" );
if( dll < 32 ) {
MessageBox( NULL, "Could not find filedll.dll!", EditTitle, MB_OK );
return( FALSE );
}
farp = (FARPROC) GetProcAddress( dll,"GetFileName" );
#if defined(__WINDOWS_386__)
h = GetIndirectFunctionHandle( farp, INDIR_PTR, INDIR_ENDLIST );
#else
gsn = (void FAR *) farp;
#endif
fname[ 0 ] = 0;
of.hwnd = ed->hwnd;
a1 = AllocAlias16( _ext );
of.ext = (LPSTR) a1;
a2 = AllocAlias16( fname );
of.name = (LPSTR) a2;
of.namelen = _MAX_PATH;
of.title = (LPSTR) NULL;
of.type = type;
#if defined(__WINDOWS_386__)
rc = InvokeIndirectFunction( h, &of );
#else
rc = gsn( &of );
#endif
FreeAlias16( a1 );
FreeAlias16( a2 );
FreeLibrary( dll );
return( rc );
} /* GetFileName */
/*
* NewFileName - set a new file name
*/
static void NewFileName( LPEDATA ed, char *fname )
{
char str[256];
int len;
MemFree( ed->filename );
len = strlen( fname );
if( len != 0 ) {
ed->filename = MemAlloc( len + 1 );
_memcpy( ed->filename, fname, len + 1 );
sprintf( str,"%s - %s", EditTitle, fname );
} else {
ed->filename = NULL;
strcpy( str, EditTitle );
}
SetWindowText( ed->hwnd, str );
} /* NewFileName */
/*
* FileSave - save a file
*/
BOOL FileSave( LPEDATA ed, BOOL saveas )
{
char fname[_MAX_PATH];
char _FAR *tmp;
int h;
OFSTRUCT ofs;
char str[128];
LOCALHANDLE hbuff;
char FAR *buffptr;
int len;
int rc;
unsigned bytes;
if( !ed->needs_saving && !saveas ) return( TRUE );
/*
* get filename to save
*/
if( ed->filename == NULL || saveas ) {
if( !GetFileName( ed, FILE_SAVE, fname ) ) return( FALSE );
NewFileName( ed, fname );
}
/*
* try to open the file
*/
h = OpenFile( ed->filename, &ofs, OF_PROMPT | OF_CANCEL | OF_CREATE );
if( h < 0 ) {
sprintf(str, "Cannot save %s", ed->filename );
MessageBox( ed->hwnd, str, NULL, MB_OK );
return( FALSE );
}
/*
* get buffer, and make a copy into near memory, so that
* we can write it
*/
hbuff = SendMessage( ed->editwnd, EM_GETHANDLE, 0, 0L );
buffptr = (char FAR *) MK_LOCAL32( LocalLock( hbuff ) );
len = _fstrlen( buffptr );
tmp = MemAlloc( len+1 );
_fmemcpy( tmp, buffptr, len );
LocalUnlock( hbuff );
/*
* save file, and check results
*/
rc = _dos_write( h, tmp, len, &bytes );
MemFree( tmp );
close( h );
if( rc || bytes != len ) {
sprintf( str, "Error writing to %s", ed->filename );
MessageBox( ed->hwnd, str, EditTitle, MB_OK );
return( FALSE );
} else {
ed->needs_saving = FALSE;
return( TRUE );
}
} /* FileSave */
/*
* FileEdit - edit a new file
*/
void FileEdit( LPEDATA ed, BOOL openfile )
{
LOCALHANDLE hbuff_new,hbuff_old;
char fname[_MAX_PATH];
char str[128];
long int len=0;
char _FAR *buff;
int rc;
int h;
unsigned bytes;
if( !CheckFileSave( ed ) ) return;
if( openfile ) {
if( !GetFileName( ed, FILE_OPEN, fname ) ) return;
} else {
fname[0] = 0;
}
/*
* get file size, and get a buffer
*/
if( fname[0] != 0 ) {
h = open( fname, O_RDONLY | O_BINARY );
if( h < 0 ) {
sprintf( str,"Could not open file %s", fname );
MessageBox( ed->hwnd, str, EditTitle, MB_OK );
return;
}
len = filelength( h );
}
if( len >= 0xFFFFL || (hbuff_new = LocalAlloc( LMEM_MOVEABLE |
LMEM_ZEROINIT, (WORD) len+1 ) ) == NULL ) {
sprintf( str, "File %s is too big (%ld bytes)", fname, len+1 );
MessageBox( ed->hwnd, str, EditTitle, MB_OK );
return;
}
/*
* read into temp. buffer, then copy to edit area
*/
if( fname[0] != 0 ) {
buff = MemAlloc( len + 1 );
rc = _dos_read( h, buff, len, &bytes );
close( h );
if( rc || bytes != len ) {
sprintf( str,"Could not read file %s", fname );
MessageBox( ed->hwnd, str, EditTitle, MB_OK );
LocalFree( hbuff_new );
MemFree( buff );
return;
}
_fmemcpy( MK_LOCAL32( LocalLock( hbuff_new ) ), buff, len );
LocalUnlock( hbuff_new );
MemFree( buff );
}
/*
* clear out old buffer, and set new one
*/
hbuff_old = SendMessage( ed->editwnd, EM_GETHANDLE, 0, 0L );
LocalFree( hbuff_old );
SendMessage( ed->editwnd, EM_SETHANDLE, hbuff_new, 0L );
NewFileName( ed, fname );
ed->needs_saving = FALSE;
} /* FileEdit */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?