This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/WATCOM/samples/win/edit/efile.c

262 lines
6.6 KiB
C

#define INCLUDE_COMMDLG_H 1
#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 "win1632.h"
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, BOOL save, char *fname )
{
static char filterList[] = "File (*.*)" \
"\0" \
"*.*" \
"\0\0";
OPENFILENAME of;
int rc;
fname[ 0 ] = 0;
memset( &of, 0, sizeof( OPENFILENAME ) );
of.lStructSize = sizeof( OPENFILENAME );
of.hwndOwner = ed->hwnd;
of.lpstrFilter = (LPSTR) filterList;
of.lpstrDefExt = "";
of.nFilterIndex = 1L;
of.lpstrFile = fname;
of.nMaxFile = _MAX_PATH;
of.lpstrTitle = NULL;
of.Flags = OFN_HIDEREADONLY;
if( save ) {
rc = GetSaveFileName( &of );
} else {
rc = GetOpenFileName( &of );
}
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;
char str[128];
LOCALHANDLE hbuff;
char FAR *buffptr;
int len;
unsigned written;
int rc;
if( !ed->needs_saving && !saveas ) return( TRUE );
/*
* get filename to save
*/
if( ed->filename == NULL || saveas ) {
if( !GetFileName( ed, TRUE, fname ) ) return( FALSE );
NewFileName( ed, fname );
}
/*
* try to open the file
*/
h = open( fname, O_CREAT | O_TRUNC | O_WRONLY | O_TEXT,
S_IRWXU | S_IRWXG | S_IRWXO );
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
*/
#ifdef __NT__
// there seems to be a bug in the win32s support for EM_GETHANDLE
// so avoid using it in the win32 version
tmp = tmp;
hbuff = hbuff;
buffptr = buffptr;
len = GetWindowTextLength( ed->editwnd );
tmp = MemAlloc( len + 1 );
GetWindowText( ed->editwnd, tmp, len + 1 );
#else
hbuff = (HANDLE)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 );
#endif
/*
* save file, and check results
*/
rc = _dos_write( h, tmp, len, &written );
MemFree( tmp );
close( h );
if( len != written ) {
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, FALSE, 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 );
}
hbuff_new = NULL;
if( len < 0xFFFFL ) {
hbuff_new = LocalAlloc( LMEM_MOVEABLE | LMEM_ZEROINIT, len + 1 );
}
if( hbuff_new == 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;
}
#ifdef __NT__
memcpy( MK_LOCAL32( LocalLock( hbuff_new ) ), buff, (size_t)len );
#else
_fmemcpy( MK_LOCAL32( LocalLock( hbuff_new ) ), buff, (size_t)len );
#endif
LocalUnlock( hbuff_new );
MemFree( buff );
}
/*
* clear out old buffer, and set new one
*/
#ifdef __NT__
// there seems to be a bug in the Win32s support for the EM_SETHANDLE
// message
hbuff_old = hbuff_old;
SetWindowText( ed->editwnd, LocalLock( hbuff_new ) );
LocalUnlock( hbuff_new );
LocalFree( hbuff_new );
#else
hbuff_old = (HANDLE)SendMessage( ed->editwnd, EM_GETHANDLE, 0, 0L );
SendMessage( ed->editwnd, EM_SETHANDLE, (UINT)hbuff_new, 0L );
LocalFree( hbuff_old );
#endif
NewFileName( ed, fname );
ed->needs_saving = FALSE;
} /* FileEdit */