home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
prgramer
/
avbrowse
/
browse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-07
|
6KB
|
271 lines
/*
browse.c -- AVIO File Browsing Utility
Created by Microsoft Corporation, 1989
*/
#define INCL_WINTRACKRECT
#define INCL_WINWINDOWMGR
#define INCL_WINPOINTERS
#define INCL_WINFRAMEMGR
#include <os2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "avio.h"
#include "browse.h"
#include <opendlg.h>
/*
Constants
*/
#define MAXLINELEN 120
#define AVIO_PS_ROWS 25
#define AVIO_PS_COLS 80
/*
Global Variables
*/
FILE *pfInput;
PFNWP pfnOldClient;
char *aszLines[NUM_DATA_LINES];
SHORT sTopLine = 0;
DLF dlfInput;
HFILE hfInput;
USHORT usAction;
LBINFO lbiData;
HPOINTER hptrWait;
HPOINTER hptrArrow;
HWND hWndClient;
HWND hWndFrame;
BOOL fLargeFont = FALSE;
SHORT sMaxLine;
/*
Open the input file
*/
int cdecl main(int argc, char *argv[]) {
static CHAR szClientClass[] = "Browse";
static CHAR szCaption[] = "";
HAB hAB;
HMQ hmq;
QMSG qmsg;
ULONG flFrameFlags = FCF_STANDARD | FCF_HORZSCROLL | FCF_VERTSCROLL;
ULONG flFrameStyle = WS_VISIBLE | FS_SCREENALIGN;
char *szInFile;
hAB = WinInitialize(0);
hmq = WinCreateMsgQueue(hAB, 0);
WinRegisterClass(hAB, szClientClass, BrowseWndProc, CS_SYNCPAINT, 0);
hWndFrame = WinCreateStdWindow(HWND_DESKTOP, flFrameStyle,
&flFrameFlags, szClientClass, szCaption,
0L, NULL, ID_RESOURCE, &hWndClient);
/*
Get the hourglass and arrow pointers
*/
hptrWait = WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE);
hptrArrow = WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE);
if (argc == 1) pfInput = stdin;
else {
if (!(pfInput = fopen(argv[1], "r"))) {
fprintf(stderr, "***Error: Could not open %s", szInFile);
return(-1);
}
}
ReadFile();
/*
Setup AVIO PS and force a paint
Note: This subclasses the client and frame windows
*/
lbiData.sPSrows = AVIO_PS_ROWS;
lbiData.sPScols = AVIO_PS_COLS;
lbiData.sRows = sTopLine;
lbiData.sCols = sMaxLine;
lbiData.pfnQL = (PFNQL) RetrieveLine;
lbiData.fLargeFont = FALSE;
AvioInit(&lbiData);
/*
Process messages
*/
while (WinGetMsg(hAB, &qmsg, NULL, 0, 0)) WinDispatchMsg(hAB, &qmsg);
/* Blast the AVIO PS */
AvioClose();
WinDestroyWindow(hWndFrame);
WinDestroyMsgQueue(hmq);
WinTerminate(hAB);
return 0;
}
void ReadFile(void) {
/*
Reads in a file using <stdio.h> fgets() calls.
It might be wise to put better word wrap facilities here
*/
char szLine[MAXLINELEN];
/* Put up the hourglass */
WinSetPointer(HWND_DESKTOP, hptrWait);
/* Reinitialize buffer, MaxLineLength */
for (; sTopLine > 0; ) free(aszLines[--sTopLine]);
sMaxLine = 0;
/* Read in the file */
while (fgets(szLine, MAXLINELEN, pfInput)) {
/* Convert LF (\n) into NULL (\0) */
if (szLine[strlen(szLine) - 1] == '\n') {
szLine[strlen(szLine) - 1] = 0;
} else szLine[MAXLINELEN - 1] = 0;
if (StoreLine(szLine)) {
fprintf(stderr,"***Error: Line buffer full\n");
return;
}
}
fclose(pfInput);
/* Reset the mouse pointer */
WinSetPointer(HWND_DESKTOP, hptrArrow);
return;
}
SHORT StoreLine(char *szLine) {
/*
Put a line into the line buffer; line numbers are free
For > 64K data, add code here and in RetrieveLine
*/
int i, cLinePos;
BOOL fDone;
/*
Check if top line exceeded, or malloc() fails
*/
if (sTopLine == NUM_DATA_LINES) return -1;
/*
Compute line length with tabs expanded
*/
cLinePos = 0;
for (i = 0; i < MAXLINELEN; i++) {
switch(szLine[i]) {
case '\0':
cLinePos++; i = MAXLINELEN;
break;
case '\t':
do {
cLinePos++;
} while (cLinePos % 8);
break;
default:
cLinePos++;
}
}
if (cLinePos > sMaxLine) sMaxLine = cLinePos;
if (!(aszLines[sTopLine] = malloc(cLinePos))) return -1;
/*
Copy szLine into the line buffer. Expand tabs here.
*/
i = cLinePos = 0; fDone = FALSE;
while ((i <= MAXLINELEN) && (!fDone)) {
switch(szLine[i]) {
case '\t':
do {
aszLines[sTopLine][cLinePos++] = ' ';
} while (cLinePos % 8);
break;
default:
aszLines[sTopLine][cLinePos++] = szLine[i];
fDone = !szLine[i];
break;
}
i++;
}
sTopLine++;
return 0;
}
char * _loadds RetrieveLine(USHORT usLineNum) {
/*
Return line numbered usLineNum
*/
if (usLineNum >= sTopLine) { /* Out of range */
return NULL;
}
return aszLines[usLineNum];
}
MRESULT CALLBACK BrowseWndProc(hWnd, msg, mp1, mp2)
HWND hWnd;
USHORT msg;
MPARAM mp1;
MPARAM mp2;
{
/*
Handle the About... and Open... messages
*/
switch(msg) {
case WM_COMMAND:
switch (COMMANDMSG(&msg)->cmd) {
case IDM_ABOUT:
WinDlgBox(HWND_DESKTOP, hWnd, AboutDlgProc,
NULL, IDD_ABOUT, NULL);
return 0;
case IDM_OPEN:
/*
Open the file, using the file dialog
then reopen it with stdio calls
*/
SetupDLF(&dlfInput, DLG_OPENDLG, hfInput, "\\*.*", NULL);
DlgFile(hWnd, &dlfInput);
pfInput = fopen(dlfInput.szOpenFile, "r");
ReadFile();
/*
Close the opened handle
*/
DosClose(hfInput);
/* Fix up the screen display */
lbiData.sRows = sTopLine;
lbiData.sCols = sMaxLine;
lbiData.fLargeFont = fLargeFont;
AvioInit(&lbiData);
return 0;
case IDM_FONT:
AvioLargeFont(fLargeFont = !fLargeFont);
return 0;
default: return 0;
}
break;
default: return WinDefWindowProc(hWnd, msg, mp1, mp2);
}
return 0L;
}
MRESULT CALLBACK AboutDlgProc(hDlg, msg, mp1, mp2)
/*
About... dialog procedure
*/
HWND hDlg;
USHORT msg;
MPARAM mp1;
MPARAM mp2;
{
switch(msg) {
case WM_COMMAND:
switch(COMMANDMSG(&msg)->cmd) {
case DID_OK: WinDismissDlg(hDlg, TRUE); break;
default: break;
}
default: return WinDefDlgProc(hDlg, msg, mp1, mp2);
}
return FALSE;
}