home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 Mobile
/
Chip_Mobile_2001.iso
/
palm
/
spiele
/
palmches
/
palmches.exe
/
chesscli
/
chesscli.c
next >
Wrap
C/C++ Source or Header
|
2000-11-03
|
22KB
|
943 lines
/***************************************************************************
Palm Chess Client
Copyright (C) 1999,2000 David Barr (davidbarr@iname.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
****************************************************************************/
#define BOARDTOP 0 /* where on the screen to draw the board */
#define USERFONTID 129 /* the fontid of the font used for messages */
#define FONTHEIGHT 8 /* the height of the font used for message */
/* Main code for chesscli */
#include <PalmOS.h>
#include <sys_socket.h>
#include "chesscliRsc.h"
Err errno;
WinHandle offImage=NULL;
int squaresize=12; /* the size of the bitmaps in pixels */
char currentline[256]; /* the text we just read from the server */
char currentboard[256]; /* the last currentline that began with <12> */
char initstr[256]; /* initialization commands to send to the server */
int sock = -1; /* the socket number of our connection to the server */
int MvTmWh=-1; /* last clock time that white moved */
int MvTmBl=-1; /* last clock time that black moved */
int BlToMv=-1; /* whether or not it is black's turn to move */
UInt32 MvTmLast=-1; /* last system time that either side moved */
int clientflip=0; /* whether or not the board is flipped on the client */
int serverflip=0; /* whether or not the board is flipped on the server */
/* string used to decode style 12 */
static char piecelabels[] = "-PNBRQKpnbrqk";
#define NSAVELINES 16
char savelines[NSAVELINES][81];
BitmapPtr bitmapP[7*2*2];
char ReceiveBuffer[256];
UInt16 currentFormId = -1;
void
putstr(char *s) {
int wintop, nlines, i;
RectangleType r, v;
FormPtr frm;
frm = FrmGetActiveForm();
if(frm &&
frm->formId == currentFormId &&
frm->formId == BoardForm) {
nlines = (160-squaresize*8)/FONTHEIGHT;
} else {
nlines = NSAVELINES;
}
wintop=160-FONTHEIGHT*nlines;
r.topLeft.x = 0;
r.topLeft.y = wintop;
r.extent.x = 160;
r.extent.y = nlines*FONTHEIGHT;
v.topLeft.x = 0;
v.topLeft.y = wintop+(nlines-1)*FONTHEIGHT;
v.extent.x = 160;
v.extent.y = FONTHEIGHT;
if(frm &&
frm->formId == currentFormId &&
(frm->formId == BoardForm ||
frm->formId == MessagesForm)) {
WinScrollRectangle(&r, winUp, FONTHEIGHT, &v);
WinEraseRectangle(&v, 1);
FntSetFont(USERFONTID);
WinDrawChars(s, StrLen(s), 0, wintop+(nlines-1)*FONTHEIGHT);
}
for(i=0; i<(NSAVELINES-1); i++) {
StrCopy(savelines[i], savelines[i+1]);
}
if(StrLen(s) <= 40) {
StrCopy(savelines[i], s);
} else {
StrNCopy(savelines[i], s, 40);
savelines[i][80] = '\0';
putstr(s+40);
}
}
int
CheckForNetwork( void ) {
Err err;
UInt16 ifErrs;
// Word settingSize = sizeof( DWord );
// DWord TraceNetSettings;
if ( ( err = SysLibFind( "Net.lib", &AppNetRefnum ) ) ) {
putstr("Net.lib not found");
return 1;
}
err = NetLibOpen( AppNetRefnum, &ifErrs );
if ( err == netErrAlreadyOpen ) {
return 0;
}
if ( err || ifErrs ) {
putstr("NetLibOpen failed");
NetLibClose( AppNetRefnum, false );
return 2;
}
return 0;
}
struct NetSettings_s {
char host[80];
char port[80];
char user[80];
char pass[80];
};
typedef struct NetSettings_s NetSettings_t;
NetSettings_t NetSettings;
static DmOpenRef ccDB;
static Err
OpenDatabase(void) {
UInt16 index = 0;
MemHandle RecHandle;
MemPtr RecPointer;
Err err;
/* Create database, if it doesn't exist, and save default settings status. */
if (!(ccDB = DmOpenDatabaseByTypeCreator('Data', 'CHCL', dmModeReadWrite))) {
if ((err = DmCreateDatabase(0, "ChessClientDB", 'CHCL', 'Data', false)))
return err;
ccDB = DmOpenDatabaseByTypeCreator('Data', 'CHCL', dmModeReadWrite);
RecHandle = DmNewRecord(ccDB, &index, sizeof(NetSettings_t));
DmWrite(MemHandleLock(RecHandle), 0, &NetSettings, sizeof(NetSettings_t));
MemHandleUnlock(RecHandle);
DmReleaseRecord(ccDB, index, true);
}
// Load a saved game status.
RecHandle = DmGetRecord(ccDB, 0);
RecPointer = MemHandleLock(RecHandle);
MemMove(&NetSettings, RecPointer, sizeof(NetSettings_t));
MemHandleUnlock(RecHandle);
DmReleaseRecord(ccDB, 0, true);
return 0;
}
/*
* Save game status information.
*/
static void
SaveStatus() {
MemPtr p = MemHandleLock(DmGetRecord(ccDB, 0));
//game.seconds = TimGetSeconds() - GameStartedAt;
DmWrite(p, 0, &NetSettings, sizeof(NetSettings_t));
MemPtrUnlock(p);
DmReleaseRecord(ccDB, 0, true);
}
void
handlePenDown(int x, int y) {
static int prevr=-1, prevc=-1;
int r, c;
char move[32];
int flip;
flip = clientflip ^ serverflip;
c = x/squaresize;
r = 7-(y-BOARDTOP)/squaresize;
if(flip) {
c = 7-c;
r = 7-r;
}
StrPrintF(move, "square = %c%d", "abcdefgh"[c], r+1);
//putstr(move);
if(c>=0&&c<=7&&r>=0&&r<=7) {
if(prevr != -1) {
StrPrintF(move, "%c%d-%c%d\n", "abcdefgh"[prevc], prevr+1,
"abcdefgh"[c], r+1);
write(sock, move, StrLen(move));
prevr=-1;
prevc=-1;
} else {
prevr = r;
prevc = c;
}
} else {
prevr=-1;
prevc=-1;
}
}
static FieldPtr
SetFieldTextFromHandle(FormPtr frm, UInt16 fieldID, MemHandle txtH) {
MemHandle oldTxtH;
FieldPtr fldP;
UInt16 objIdx;
objIdx = FrmGetObjectIndex(frm, fieldID);
fldP = FrmGetObjectPtr(frm, objIdx);
oldTxtH = FldGetTextHandle(fldP);
FldSetTextHandle(fldP, txtH);
FldDrawField(fldP);
if(oldTxtH) {
MemHandleFree(oldTxtH);
}
return fldP;
}
static FieldPtr
SetFieldTextFromStr(FormPtr frm, UInt16 fieldID, char *strP) {
MemHandle txtH;
FieldPtr fldP;
txtH = MemHandleNew(StrLen(strP) + 1);
if(!txtH) {
return NULL;
}
StrCopy(MemHandleLock(txtH), strP);
fldP = SetFieldTextFromHandle(frm, fieldID, txtH);
MemHandleUnlock(txtH);
return fldP;
}
static void
updateClocks() {
char TmWhSt[16], TmBlSt[16];
UInt32 CurrTm = TimGetSeconds();
int TmWh = MvTmWh, TmBl = MvTmBl;
FormPtr frm = FrmGetActiveForm();
int flip,min, sec, hr;
flip = clientflip ^ serverflip;
if(!frm ||
frm->formId != currentFormId ||
frm->formId != BoardForm) {
return;
}
if(MvTmLast == -1) {
return;
}
if(BlToMv) {
TmBl -= (CurrTm - MvTmLast);
} else {
TmWh -= (CurrTm - MvTmLast);
}
sec=TmWh%60;
min=(TmWh/60)%60;
hr =(TmWh/(60*60));
if(hr) {
StrPrintF(TmWhSt, "%d:%02d", hr, min);
} else {
StrPrintF(TmWhSt, "%d:%02d", min, sec);
}
sec=TmBl%60;
min=(TmBl/60)%60;
hr =(TmBl/(60*60));
if(hr) {
StrPrintF(TmBlSt, "%d:%02d", hr, min);
} else {
StrPrintF(TmBlSt, "%d:%02d", min, sec);
}
WinDrawChars(TmWhSt, StrLen(TmWhSt), 145, flip ? -1 : 7);
WinDrawChars(TmBlSt, StrLen(TmBlSt), 145, flip ? 7 : -1);
}
void
updateBoard(int newdata) {
char tmpstr[256];
char *fields[48], *whitename, *blackname;
int i, nfields=0, cll, j, k, labellen, row, col;
int flip;
RectangleType r;
FormPtr frm;
if(newdata) {
MvTmLast = TimGetSeconds();
StrCopy(currentboard, currentline);
}
frm = FrmGetActiveForm();
if(!frm ||
frm->formId != currentFormId ||
frm->formId != BoardForm) {
return;
}
StrCopy(tmpstr, currentline);
cll = StrLen(tmpstr);
for(i=0; i<cll; i++) {
if(tmpstr[i] == ' ') {
fields[nfields++] = &tmpstr[i+1];
tmpstr[i] = 0;
}
}
whitename = fields[16];
blackname = fields[17];
MvTmWh = atoi(fields[23]);
MvTmBl = atoi(fields[24]);
serverflip = atoi(fields[29]);
flip = clientflip ^ serverflip;
BlToMv = (fields[8][0] == 'B'); /* see who's turn it is */
/* SetFieldTextFromStr(frm, UpPlayerLbl, flip ? whitename : blackname); */
/* SetFieldTextFromStr(frm, DownPlayerLbl, flip ? blackname : whitename); */
updateClocks();
labellen = StrLen(piecelabels);
for(i=0; i<8; i++) {
row = i;
if(flip) {
row = 7-row;
}
for(j=0; j<8; j++) {
col = j;
if(flip) {
col = 7-col;
}
for(k=0; k<labellen; k++) {
if(fields[i][j] == piecelabels[k]) {
break;
}
} /* end for k */
if((i+j)%2) {
//bmpno++;
}
//saveno = (pieceside*7+piecetype)*2+background;
r.topLeft.x=0;
r.topLeft.y=0;
if(k>=7) {
r.topLeft.y += (squaresize*2);
k-=6;
}
r.topLeft.y += (((i+j+k+1)%2)*squaresize);
r.topLeft.x=k*squaresize;
r.extent.x=squaresize;
r.extent.y=squaresize;
WinCopyRectangle(offImage, WinGetActiveWindow(), &r,
col*squaresize, row*squaresize+BOARDTOP, winPaint);
//WinDrawBitmap (bitmapP[k*2+((i+j)%2)], col*SQUARESIZE,
//row*SQUARESIZE+BOARDTOP);
} /* end for j */
} /* end for i */
} /* end updateBoard */
void
loadbitmap(int size, int bmpno) {
WinHandle tmpHandle, tmpHandle2;
Err err;
MemHandle bitmapHandle;
int oldsize;
RectangleType r;
oldsize=squaresize;
squaresize=size;
if(offImage) {
WinDeleteWindow(offImage, false);
}
tmpHandle2 = WinGetDrawWindow();
offImage=WinCreateOffscreenWindow(squaresize*7, squaresize*4,
screenFormat, &err);
tmpHandle = WinSetDrawWindow(offImage);
bitmapHandle = DmGetResource('Tbmp',bmpno);
WinDrawBitmap(MemHandleLock(bitmapHandle),0,0);
MemHandleUnlock(bitmapHandle);
WinSetDrawWindow(tmpHandle2);
if(StrLen(currentboard)) {
StrCopy(currentline, currentboard);
} else {
StrCopy(currentline,
"<12> rnbqkbnr pppppppp -------- -------- -------- -------- "
"PPPPPPPP RNBQKBNR W -1 0 0 1 1 0 7 White Black 1 2 12 39 39 "
"119 122 2 null (0:06) null 0");
}
if(currentFormId == BoardForm) {
r.topLeft.x=0;
r.topLeft.y=0;
r.extent.x=oldsize*8;
r.extent.y=oldsize*8;
WinEraseRectangle(&r, 1);
}
updateBoard(0);
}
static Boolean
BoardFormHandleEvent (EventPtr e) {
Boolean handled = false;
FormPtr frm;
int wintop, i, lines;
switch (e->eType) {
case frmOpenEvent:
frm = FrmGetActiveForm();
FrmDrawForm(frm);
currentFormId=frm->formId;
if(StrLen(currentboard)) {
StrCopy(currentline, currentboard);
} else {
StrCopy(currentline,
"<12> rnbqkbnr pppppppp -------- -------- -------- -------- "
"PPPPPPPP RNBQKBNR W -1 0 0 1 1 0 7 White Black 1 2 12 39 39 "
"119 122 2 null (0:06) null 0");
}
updateBoard(0);
lines = (160-squaresize*8)/FONTHEIGHT;
wintop=160-FONTHEIGHT*lines;
FntSetFont(USERFONTID);
for(i=0; i<lines; i++) {
WinDrawChars(savelines[NSAVELINES-lines+i],
StrLen(savelines[NSAVELINES-lines+i]), 0,
wintop+i*FONTHEIGHT);
}
handled = true;
break;
case menuEvent:
MenuEraseStatus ((MenuBarPtr) MenuGetActiveMenu());
switch(e->data.menu.itemID) {
case HelpMenuAbout:
FrmPopupForm(AboutForm);
break;
case OptMenu12:
loadbitmap(12, PieceBmp12);
break;
case OptMenu16:
loadbitmap(16, PieceBmp16);
break;
case OptMenu18:
loadbitmap(18, PieceBmp18);
break;
}
handled = true;
break;
case ctlSelectEvent:
switch(e->data.ctlSelect.controlID) {
case ToMessagesBtn:
currentFormId = -1;
FrmGotoForm(MessagesForm);
break;
case ToLoginBtn:
currentFormId = -1;
FrmGotoForm(LoginForm);
break;
}
break;
case nilEvent:
break;
case penDownEvent:
handlePenDown(e->screenX, e->screenY);
break;
case penUpEvent:
break;
case penMoveEvent:
break;
case ctlEnterEvent:
break;
default:
//StrPrintF(debugstr, "main form event type = %d", e->eType);
//putstr(debugstr); /* 0 1 2 7 9 */
break;
}
return handled;
}
static struct in_addr *
atoaddr(char *address) {
struct hostent *host;
static struct in_addr saddr;
/* First try it as aaa.bbb.ccc.ddd. */
saddr.s_addr = inet_addr(address);
if (saddr.s_addr != -1) {
return &saddr;
}
host = gethostbyname(address);
if (host != NULL) {
return (struct in_addr *) *host->h_addr_list;
}
return NULL;
}
static Boolean
LoginFormHandleEvent (EventPtr e) {
Boolean handled = false;
static FormPtr frm;
char *serverPtr, *portPtr, *userPtr, *passPtr, nullStr[1];
struct sockaddr_in address;
struct in_addr *addr;
switch (e->eType) {
case frmOpenEvent:
frm = FrmGetActiveForm();
FrmDrawForm(frm);
currentFormId = frm->formId;
SetFieldTextFromStr(frm, ServerFld, NetSettings.host);
SetFieldTextFromStr(frm, PortFld, NetSettings.port);
SetFieldTextFromStr(frm, UserFld, NetSettings.user);
SetFieldTextFromStr(frm, PassFld, NetSettings.pass);
handled = true;
break;
case menuEvent:
MenuEraseStatus(NULL);
switch(e->data.menu.itemID) {
}
handled = true;
break;
case ctlSelectEvent:
switch(e->data.ctlSelect.controlID) {
case ConnectBtn:
StrCopy(nullStr, "");
serverPtr = FldGetTextPtr(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, ServerFld)));
portPtr = FldGetTextPtr(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, PortFld)));
userPtr = FldGetTextPtr(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, UserFld)));
passPtr = FldGetTextPtr(FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, PassFld)));
if(!serverPtr) { serverPtr = nullStr; }
if(!portPtr) { portPtr = nullStr; }
if(!userPtr) { userPtr = nullStr; }
if(!passPtr) { passPtr = nullStr; }
StrCopy(NetSettings.host, serverPtr);
StrCopy(NetSettings.port, portPtr);
StrCopy(NetSettings.user, userPtr);
StrCopy(NetSettings.pass, passPtr);
sock = socket(AF_INET, SOCK_STREAM, 0);
memset((char *) &address, 0, sizeof(address));
addr = atoaddr(serverPtr);
address.sin_family = AF_INET;
address.sin_port = atoi(portPtr);
address.sin_addr.s_addr = addr->s_addr;
connect(sock, (struct sockaddr *) &address, sizeof(address));
StrCopy(currentline, "");
StrPrintF(initstr, "%s\n%s\nset style 12\n", userPtr, passPtr);
currentFormId = -1;
FrmGotoForm(BoardForm);
}
break;
case nilEvent:
break;
case penDownEvent:
break;
case penUpEvent:
break;
case ctlEnterEvent:
break;
case keyDownEvent:
break;
default:
break;
}
return handled;
}
static Boolean
MessagesFormHandleEvent (EventPtr e) {
Boolean handled = false;
FormPtr frm;
int wintop, i;
switch (e->eType) {
case frmOpenEvent:
frm = FrmGetActiveForm();
FrmDrawForm(frm);
currentFormId=frm->formId;
wintop=160-FONTHEIGHT*NSAVELINES;
FntSetFont(USERFONTID);
for(i=0; i<NSAVELINES; i++) {
WinDrawChars(savelines[i], StrLen(savelines[i]), 0,
wintop+(i)*FONTHEIGHT);
}
handled = true;
break;
case menuEvent:
MenuEraseStatus(NULL);
switch(e->data.menu.itemID) {
}
handled = true;
break;
case ctlSelectEvent:
switch(e->data.ctlSelect.controlID) {
case ToBoardBtn:
currentFormId = -1;
FrmGotoForm(BoardForm);
}
break;
case nilEvent:
break;
case penDownEvent:
break;
case penUpEvent:
break;
case ctlEnterEvent:
break;
case keyDownEvent:
if (e->data.keyDown.chr == '\n') {
UInt16 focus;
FormPtr frm;
FieldPtr fld;
frm = FrmGetActiveForm ();
focus = FrmGetFocus (frm);
fld = FrmGetObjectPtr(frm, focus);
StrPrintF(currentline, "%s\n", FldGetTextPtr(fld));
write(sock, currentline, StrLen(currentline));
handled = true;
}
break;
default:
//StrPrintF(debugstr, "main form event type = %d", e->eType);
//putstr(debugstr); /* 0 1 2 7 9 */
break;
}
return handled;
}
static Boolean
AboutFormHandleEvent (EventPtr e) {
Boolean handled = false;
FormPtr frm;
// int wintop, i;
switch (e->eType) {
case frmOpenEvent:
frm = FrmGetActiveForm();
FrmDrawForm(frm);
currentFormId = frm->formId;
handled = true;
break;
case ctlSelectEvent:
if (e->data.ctlSelect.controlID == FormAboutButton) {
FrmReturnToForm(0);
handled = true;
break;
}
break;
default:
break;
}
return handled;
}
void
mydebug(int lineno) {
// do nothing
}
static Boolean
ApplicationHandleLine() {
int i;
//StrCopy(debugstr, currentline);
//mydebug(__LINE__);
for(i=0; i<5; i++) {
if("<12> "[i] != currentline[i]) {
break;
}
}
if(i==5) {
updateBoard(1);
} else {
putstr(currentline);
}
return true;
}
static Boolean
ApplicationHandleData() {
Err i;
int cll, j;
static int sentinitstr=0;
if(!sentinitstr) {
write(sock, initstr, StrLen(initstr));
sentinitstr=1;
}
//printf("trying ReceiveData...\n");
cll = StrLen(currentline);
if(cll == 255) {
StrCopy(currentline, "");
cll = 0;
}
i = read(sock, ReceiveBuffer, sizeof(ReceiveBuffer));
if(!i) {
//StrCopy(debugstr, "remote side closed connection\n");
//mydebug(__LINE__);
close(sock);
sock = -1;
} else if(i == -1) {
StrPrintF(ReceiveBuffer, "NetLibReceive error = 0x%04x", errno);
putstr(ReceiveBuffer);
i=0;
}
for(j=0; j<i; j++) {
if(ReceiveBuffer[j] == '\n' || ReceiveBuffer[j] == '\r') {
if(cll) {
ApplicationHandleLine();
StrCopy(currentline, "");
cll = 0;
}
continue;
}
currentline[cll++] = ReceiveBuffer[j];
currentline[cll] = 0;
}
return true;
}
static Boolean
ApplicationHandleEvent(EventPtr e) {
FormPtr frm;
UInt16 formId;
Boolean handled = false;
if (e->eType == frmLoadEvent) {
formId = e->data.frmLoad.formID;
frm = FrmInitForm(formId);
FrmSetActiveForm(frm);
switch(formId) {
case BoardForm:
FrmSetEventHandler(frm, BoardFormHandleEvent);
break;
case MessagesForm:
FrmSetEventHandler(frm, MessagesFormHandleEvent);
break;
case LoginForm:
FrmSetEventHandler(frm, LoginFormHandleEvent);
break;
case AboutForm:
FrmSetEventHandler(frm, AboutFormHandleEvent);
break;
}
handled = true;
//printf("all done\n");
}
return handled;
}
/* Get preferences, open (or create) app database */
static UInt16
StartApplication(void) {
MemHandle fontHandle;
FontType *fontPtr;
int i;
char tmpstr[64];
loadbitmap(12, PieceBmp12);
for(i=0; i<NSAVELINES; i++) {
savelines[i][0] = '\0';
}
putstr("trying CheckForNetwork...");
if((i=CheckForNetwork())) {
StrPrintF(tmpstr, "checkfornetwork failed (%d)", i);
putstr(tmpstr);
}
// 'Font' and 0x3000 are resource type and ID, defined by you in
// resource description
fontHandle=DmGetResource('Font',0x3000); // minico 9
fontPtr=MemHandleLock(fontHandle);
// user defined fonts start from 129
FntDefineFont(USERFONTID,fontPtr);
OpenDatabase();
currentFormId = -1;
FrmGotoForm(LoginForm);
return 0;
}
/* Save preferences, close forms, close app database */
static void
StopApplication(void) {
MemHandle fontHandle;
FrmSaveAllForms();
FrmCloseAllForms();
// unlock our font handle
fontHandle=DmGetResource('Font',0x3000);
MemHandleUnlock(fontHandle);
// unlock the piece bitmaps
if(offImage) {
WinDeleteWindow(offImage, false);
}
if(sock != -1) {
close(sock);
}
NetLibClose(AppNetRefnum, false);
SaveStatus();
}
/* The main event loop */
static void
EventLoop(void) {
UInt16 err;
EventType e;
NetFDSetType readFDs,writeFDs,exceptFDs, setsize=1;
StrCopy(currentboard, "");
for(;;) {
netFDZero(&readFDs);
setsize = 1;
netFDSet(sysFileDescStdIn, &readFDs);
setsize = sysFileDescStdIn+1;
if(sock != (UInt16)-1) {
netFDSet(sock, &readFDs);
if(sock >= setsize) {
setsize = sock+1;
}
NetLibSelect(AppNetRefnum, setsize, &readFDs, &writeFDs, &exceptFDs,
sysTicksPerSecond, &err);
if(netFDIsSet(sock, &readFDs)) {
ApplicationHandleData();
}
/* if(!netFDIsSet(sysFileDescStdIn, &readFDs)) { */
/* continue; */
/* } */
}
//EvtGetEvent(&e, evtWaitForever);
EvtGetEvent(&e, 0);
//printf("event = %d\n", e.eType);
if (SysHandleEvent (&e)) {
continue;
}
if (MenuHandleEvent (NULL, &e, &err)) {
continue;
}
if (ApplicationHandleEvent (&e)) {
continue;
}
FrmDispatchEvent (&e);
if(e.eType == appStopEvent) {
return;
}
updateClocks();
}
}
UInt32
PilotMain(UInt16 cmd, void *cmdPBP, UInt16 launchFlags) {
UInt16 err;
if (cmd == sysAppLaunchCmdNormalLaunch) {
err = StartApplication();
if (err) {
return err;
}
EventLoop();
StopApplication();
} else {
return sysErrParamErr;
}
return 0;
}