Category : Windows 3.X Files
Archive   : SNDHACK.ZIP
Filename : FILE.C

 
Output of file : FILE.C contained in archive : SNDHACK.ZIP
#include
#include
#include
#include
#include
#include
#include "app.h"

/*
* Module: file.c
*
* Contains: File related functions. File oriented fuctions
* show go here. This includes file related callback functions
* for such dialog boxes as Open, Save, SaveAs.
*
*/


/*********************************************************************/
/* Local Function Prototypes */
/*********************************************************************/

int FAR PASCAL SaveAsDlg(HWND, unsigned, WORD, LONG);
HANDLE FAR PASCAL OpenDlg(HWND, unsigned, WORD, LONG);

void UpdateListBox(HWND hDlg);

void FileSetDefExt(PSTR Ext, PSTR Name);
void FileSeparateName(LPSTR DestPath, LPSTR DestFile, LPSTR Src);
void FileAddExt(PSTR Name, PSTR Ext);
BOOL FileCheckName(HWND hDlg, PSTR Dest, PSTR Src);
BOOL FileSaveBuffer(HWND Hdlg);
void FileSetNewBuffer(HANDLE hNewBuffer, PSTR Title);

/*********************************************************************/
/* Local data and structures */
/*********************************************************************/

static char FileName[128] = ""; /* the name of the current file */
static char PathName[128] = ""; /* file pathname */
static char OpenName[128] = ""; /* name of a file to try and open */
static char DefPath[128] = ""; /* current path */
static char DefSpec[13] = "*.wsn"; /* current file specification */
static char DefExt[] = ".wsn"; /* current default extension */
static char str[255] = ""; /* work string */

static HANDLE hEditBuffer; /* edit buffer */
static HANDLE hOldBuffer; /* old buffer handle */
static HANDLE hHourGlass; /* handle to hourglass cursor */
static HANDLE hSaveCursor; /* current cursor handle */
static int hFile; /* file handle */
static int count; /* number of chars read or written*/
static PSTR pBuffer; /* address of read/write buffer */
static OFSTRUCT OfStruct; /* information from OpenFile() */
static struct stat FileStatus; /* information from fstat() */
static BOOL bSaveEnabled = FALSE; /* TRUE if text in the edit buffer*/
static PSTR pEditBuffer; /* address of the edit buffer */
static RECT Rect; /* dimension of the client window */
static HWND hwnd; /* handle to main window */

/*********************************************************************/
/* Global functions */
/*********************************************************************/

/*-------------------------------------------------------------------*/
/* Set current file to NEW. */
/*-------------------------------------------------------------------*/

void FileNew(hWnd)
HWND hWnd;
{
if (!FileQuerySave(hWnd))
return;

FileName[0] = 0;

/* Update the edit buffer */
wsprintf(str, "%s %s", (LPSTR) WindowName,(LPSTR)" - Untitled");
FileSetNewBuffer(NULL, str);
}

/*-------------------------------------------------------------------*/
/* Invoke a dialog box to open a file, check to save the current file*/
/*-------------------------------------------------------------------*/

void FileOpen(hWnd)
HWND hWnd;
{
int numbytes;

if (!FileQuerySave(hWnd))
return;

/* Open the file and get its handle */
hFile = GoDialogBox(hInst, "Open", hWnd, (FARPROC)OpenDlg);
if (hFile <= 0)
return;

/* Allocate edit buffer to the size of the file + 1 */
hEditBuffer = LocalAlloc(LMEM_MOVEABLE | LMEM_ZEROINIT, (WORD)(FileStatus.st_size+1));

if (!hEditBuffer) {
MessageBox(hWnd, "Not enough memory.", NULL, MB_OK | MB_ICONHAND);
return;
}
hSaveCursor = SetCursor(hHourGlass);
pEditBuffer = LocalLock(hEditBuffer);

numbytes = _lread(hFile, (LPSTR)pEditBuffer, (WORD)FileStatus.st_size);
close(hFile);

/* # bytes read must equal file size */
if (numbytes != FileStatus.st_size) {
wsprintf(str, "Error reading %s.", (LPSTR)FileName);
SetCursor(hSaveCursor); /* Remove the hourglass */
MessageBox(hWnd, str, NULL, MB_OK | MB_ICONEXCLAMATION);
}

LocalUnlock(hEditBuffer);
/* Set up a new buffer and window title */
wsprintf(str, (LPSTR)"%s - %s", (LPSTR)WindowName, (LPSTR)FileName);
FileSetNewBuffer(hEditBuffer, str);
SetCursor(hSaveCursor);
}

/*-------------------------------------------------------------------*/
/* Save the current file */
/*-------------------------------------------------------------------*/

void FileSave(hWnd)
HWND hWnd;
{
if (!FileName[0])
FileSaveAs(hWnd);
FileSaveBuffer(hWnd);
}

/*-------------------------------------------------------------------*/
/* Save the current file prompting for a filename */
/*-------------------------------------------------------------------*/

void FileSaveAs(hWnd)
HWND hWnd;
{
int Success;

/* Call the SaveAsDlg() function to get the new filename */
Success = GoDialogBox(hInst, "SaveAs", hWnd, (FARPROC)SaveAsDlg);

/* If successful, update the window title, save the file */
if (Success == IDOK) {
wsprintf(str, (LPSTR)"%s - %s", (LPSTR)WindowName,(LPSTR)FileName);
SetWindowText(hWnd, str);
FileSaveBuffer(hWnd);
}
}


/*-------------------------------------------------------------------*/
/* SaveAs dialog box callback function. */
/*-------------------------------------------------------------------*/

int FAR PASCAL SaveAsDlg(hDlg, message, wParam, lParam)
HWND hDlg;
unsigned message;
WORD wParam;
LONG lParam;
{
char TempName[128];

switch (message) {
case WM_INITDIALOG:
/* If no filename is entered, don't allow the user to save to it */
if (!FileName[0])
bSaveEnabled = FALSE;
else {
bSaveEnabled = TRUE;

/* Process the path to fit within the IDC_PATH field */
DlgDirList(hDlg, DefPath, NULL, IDC_PATH, 0x4010);

/* Send the current filename to the edit control */
SetDlgItemText(hDlg, IDC_EDIT, FileName);

/* Accept all characters in the edit control */
SendDlgItemMessage(hDlg, IDC_EDIT, EM_SETSEL, 0, MAKELONG(0, 0x7fff));
}

/* Enable or disable the save control depending on whether the
* filename exists.
*/
EnableWindow(GetDlgItem(hDlg, IDOK), bSaveEnabled);

/* Set the focus to the edit control within the dialog box */
SetFocus(GetDlgItem(hDlg, IDC_EDIT));
return(FALSE); /* FALSE since Focus was changed */

case WM_COMMAND:
switch (wParam) {
case IDC_EDIT:
/* If there was previously no filename in the edit
* control, then the save control must be enabled as soon as
* a character is entered.
*/
if (HIWORD(lParam) == EN_CHANGE && !bSaveEnabled)
EnableWindow(GetDlgItem(hDlg, IDOK), bSaveEnabled = TRUE);
return (TRUE);

case IDOK:
/* Get the filename from the edit control */
GetDlgItemText(hDlg, IDC_EDIT, TempName, 128);

/* If there are no wildcards, then separate the name into
* path and name. If a path was specified, replace the
* default path with the new path.
*/
if (FileCheckName(hDlg, FileName, TempName)) {
FileSeparateName((LPSTR) str, (LPSTR) DefSpec, (LPSTR) FileName);
if (str[0])
strcpy(DefPath, str);

/* Tell the caller a filename was selected */
EndDialog(hDlg, IDOK);
}
return (TRUE);

case IDCANCEL:
/* Tell the caller the user canceled the SaveAs function */
EndDialog(hDlg, IDCANCEL);
return (TRUE);
}
break;
}
return (FALSE);
}

/*-------------------------------------------------------------------*/
/* Open dialog box callback function. */
/*-------------------------------------------------------------------*/

HANDLE FAR PASCAL OpenDlg(hDlg, message, wParam, lParam)
HWND hDlg;
unsigned message;
WORD wParam;
LONG lParam;
{
WORD index;
PSTR pTptr;
HANDLE hFile;

switch (message) {
case WM_COMMAND:
switch (wParam) {
case IDC_LISTBOX:
if (HIWORD(lParam) == LBN_SELCHANGE) {
/* If item is a directory name, append "*.*" */
if (DlgDirSelect(hDlg, str, IDC_LISTBOX))
strcat(str, DefSpec);

SetDlgItemText(hDlg, IDC_EDIT, str);
SendDlgItemMessage(hDlg, IDC_EDIT, EM_SETSEL, NULL, MAKELONG(0, 0x7fff));
break;
}
else if (HIWORD(lParam) == LBN_DBLCLK)
;
else
return(TRUE);

case IDOK:
GetDlgItemText(hDlg, IDC_EDIT, OpenName, 128);
if (strchr(OpenName, '*') || strchr(OpenName, '?')) {
FileSeparateName((LPSTR) str, (LPSTR) DefSpec, (LPSTR) OpenName);
if (str[0])
strcpy(DefPath, str);
FileSetDefExt(DefExt, DefSpec);
UpdateListBox(hDlg);
return (TRUE);
}

if (!OpenName[0]) {
MessageBox(hDlg, "No filename specified.", NULL, MB_OK | MB_ICONHAND);
return (TRUE);
}

FileAddExt(OpenName, DefExt);

/* Open the file */
if ((int)(hFile = OpenFile(OpenName, (LPOFSTRUCT)&OfStruct, OF_READ)) == -1) {
wsprintf(str, "Error %d opening %s.", OfStruct.nErrCode, (LPSTR)OpenName);
MessageBox(hDlg, str, NULL, MB_OK | MB_ICONHAND);
}
else {
/* Make sure there's enough room for the file */
fstat(hFile, &FileStatus);
if (FileStatus.st_size > MAXFILESIZE) {
wsprintf(str,
"Not enough memory to load %s.\n%s exceeds %ld bytes.",
(LPSTR)OpenName,
(LPSTR)OpenName,
MAXFILESIZE);
MessageBox(hDlg, str, NULL, MB_OK | MB_ICONHAND);
return (TRUE);
}

/* File is opened and there is enough room so return
* the handle to the caller.
*/

strcpy(FileName, OpenName);
EndDialog(hDlg, hFile);
return (TRUE);
}
return (TRUE);

case IDCANCEL:
EndDialog(hDlg, NULL);
return (TRUE);
}
break;

case WM_INITDIALOG: /* message: initialize */
UpdateListBox(hDlg);
SetDlgItemText(hDlg, IDC_EDIT, DefSpec);
SendDlgItemMessage(hDlg, /* dialog handle */
IDC_EDIT, /* where to send message */
EM_SETSEL, /* select characters */
NULL, /* additional information */
MAKELONG(0, 0x7fff)); /* entire contents */
SetFocus(GetDlgItem(hDlg, IDC_EDIT));
return (FALSE); /* Indicates the focus is set to a control */
}
return FALSE;
}

/*-------------------------------------------------------------------*/
/* Update the list box of OpenDlg. */
/*-------------------------------------------------------------------*/

void UpdateListBox(hDlg)
HWND hDlg;
{
strcpy(str, DefPath);
strcat(str, DefSpec);
DlgDirList(hDlg, str, IDC_LISTBOX, IDC_PATH, 0x4010);

/* To ensure that the listing is made for a subdir. of
* current drive dir...
*/
if (!strchr (DefPath, ':'))
DlgDirList(hDlg, DefSpec, IDC_LISTBOX, IDC_PATH, 0x4010);

/* Remove the '..' character from path if it exists, since this
* will make DlgDirList move us up an additional level in the tree
* when UpdateListBox() is called again.
*/
if (strstr (DefPath, ".."))
DefPath[0] = '\0';

SetDlgItemText(hDlg, IDC_EDIT, DefSpec);
}

/*-------------------------------------------------------------------*/
/* Change the default extension. */
/*-------------------------------------------------------------------*/

void FileSetDefExt(Ext, Name)
PSTR Ext, Name;
{
PSTR pTptr;

pTptr = Name;
while (*pTptr && *pTptr != '.')
pTptr++;
if (*pTptr)
if (!strchr(pTptr, '*') && !strchr(pTptr, '?'))
strcpy(Ext, pTptr);
}

/*-------------------------------------------------------------------*/
/* Separate the filename and the path. */
/*-------------------------------------------------------------------*/

void FileSeparateName(lpDestPath, lpDestFileName, lpSrcFileName)
LPSTR lpDestPath, lpDestFileName, lpSrcFileName;
{
LPSTR lpTmp;
char cTmp;

lpTmp = lpSrcFileName + (long) lstrlen(lpSrcFileName);
while (*lpTmp != ':' && *lpTmp != '\\' && lpTmp > lpSrcFileName)
lpTmp = AnsiPrev(lpSrcFileName, lpTmp);
if (*lpTmp != ':' && *lpTmp != '\\') {
lstrcpy(lpDestFileName, lpSrcFileName);
lpDestPath[0] = 0;
return;
}
lstrcpy(lpDestFileName, lpTmp + 1);
cTmp = *(lpTmp + 1);
lstrcpy(lpDestPath, lpSrcFileName);
*(lpTmp + 1) = cTmp;
lpDestPath[(lpTmp - lpSrcFileName) + 1] = 0;
}

/*-------------------------------------------------------------------*/
/* Add the default extension to a file name. */
/*-------------------------------------------------------------------*/

void FileAddExt(Name, Ext)
PSTR Name, Ext;
{
PSTR pTptr;

pTptr = Name;
while (*pTptr && *pTptr != '.')
pTptr++;
if (*pTptr != '.')
strcat(Name, Ext);
}

/*-------------------------------------------------------------------*/
/* Check the filename for wildcards and extension when saving a file.*/
/*-------------------------------------------------------------------*/

BOOL FileCheckName(hDlg,pDest, pSrc)
HWND hDlg;
PSTR pDest, pSrc;
{
PSTR pTmp;

if (!pSrc[0])
return (FALSE); /* Indicates no filename was specified */

pTmp = pSrc;
while (*pTmp) { /* Searches the string for wildcards */
switch (*pTmp++) {
case '*':
case '?':
MessageBox(hDlg, "Wildcards not allowed.", NULL, MB_OK | MB_ICONEXCLAMATION);
return (FALSE);
}
}

FileAddExt(pSrc, DefExt);

if (OpenFile(pSrc, (LPOFSTRUCT) &OfStruct, OF_EXIST) >= 0) {
wsprintf(str, "Replace existing %s?", (LPSTR)pSrc);
if (MessageBox(hDlg, str, WindowName, MB_OKCANCEL | MB_ICONHAND) == IDCANCEL)
return (FALSE);
}
strcpy(pDest, pSrc);
return (TRUE);
}

/*-------------------------------------------------------------------*/
/* Save the contents of the edit buffer to a file. */
/*-------------------------------------------------------------------*/

BOOL FileSaveBuffer(hDlg)
HWND hDlg;
{
BOOL bSuccess;
int numbytes;

if ((hFile = OpenFile(FileName, &OfStruct, OF_PROMPT|OF_CANCEL|OF_CREATE)) < 0) {
wsprintf(str, "Cannot write to %s.", (LPSTR)FileName);
MessageBox(hDlg, str, NULL, MB_OK | MB_ICONEXCLAMATION);
return (FALSE);
}

hEditBuffer = SendMessage(hEditWindow, EM_GETHANDLE, 0, 0L);
pEditBuffer = LocalLock(hEditBuffer);

hSaveCursor = SetCursor(hHourGlass);
numbytes = _lwrite(hFile, (LPSTR)pEditBuffer, (WORD)strlen(pEditBuffer));
close(hFile);
SetCursor(hSaveCursor);
if (numbytes != strlen(pEditBuffer)) {
wsprintf(str, "Error writing to %s.", (LPSTR)FileName);
MessageBox(hDlg, str, NULL, MB_OK | MB_ICONHAND);
bSuccess = FALSE;
}
else {
bSuccess = TRUE; /* Indicates the file was saved */
}
LocalUnlock(hEditBuffer);
SendMessage(hEditWindow, EM_SETMODIFY, 0, 0L);
return (bSuccess);
}

/*-------------------------------------------------------------------*/
/* Ask if the current contents of the edit buffer should be saved. */
/*-------------------------------------------------------------------*/

BOOL FileQuerySave(hWnd)
HWND hWnd;
{
int Response;

if (SendMessage(hEditWindow, EM_GETMODIFY, 0, 0L) != 0) {
wsprintf(str, "Save current changes: %s", (LPSTR)FileName);
Response = MessageBox(hWnd, str, WindowName, MB_YESNOCANCEL | MB_ICONEXCLAMATION);
if (Response == IDYES) {
while (!FileName[0]) {
Response = GoDialogBox(hInst, "SaveAs", hWnd, (FARPROC)SaveAsDlg);
if (Response == IDOK)
continue;
else
return (FALSE);
}
FileSaveBuffer(hWnd);
}
else if (Response == IDCANCEL)
return(FALSE);
}
return(TRUE);
}

/*-------------------------------------------------------------------*/
/* Reset the edit window file buffer to a new one. */
/*-------------------------------------------------------------------*/

void FileSetNewBuffer(hNewBuffer, Title)
HANDLE hNewBuffer;
PSTR Title;
{
HANDLE hOldBuffer;

hOldBuffer = SendMessage(hEditWindow, EM_GETHANDLE, 0, 0L);
LocalFree(hOldBuffer);
if (!hNewBuffer)
hNewBuffer = LocalAlloc(LMEM_MOVEABLE | LMEM_ZEROINIT, 1);

/* Updates the buffer and displays new buffer */
SendMessage(hEditWindow, EM_SETHANDLE, hNewBuffer, 0L);
SendMessage(hEditWindow, EM_SETMODIFY, 0, 0L);

SetWindowText(hWindow, Title);
SetFocus(hEditWindow);
}



  3 Responses to “Category : Windows 3.X Files
Archive   : SNDHACK.ZIP
Filename : FILE.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/