kent@ssbell.IMD.Sterling.COM (Kent Landfield) (01/15/90)
Submitted-by: wsl.dec.com!mikey (Mike Yang) Posting-number: Volume 5, Issue 58 Archive-name: xrooms/part08 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 8 (of 14)." # Contents: ./lib/app.c ./lib/profile.c ./lib/profscan.c # Wrapped by kent@ssbell on Sun Jan 14 21:58:00 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f './lib/app.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'./lib/app.c'\" else echo shar: Extracting \"'./lib/app.c'\" \(13933 characters\) sed "s/^X//" >'./lib/app.c' <<'END_OF_FILE' X X /*\ X * $Header: app.c,v 5.0 90/01/10 06:52:53 erik Exp $ X * X * COPYRIGHT 1990 X * DIGITAL EQUIPMENT CORPORATION X * MAYNARD, MASSACHUSETTS X * ALL RIGHTS RESERVED. X * X * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND X * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. X * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE X * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED X * WARRANTY. X * X * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT X * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN X * ADDITION TO THAT SET FORTH ABOVE. X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, provided X * that the above copyright notice appear in all copies and that both that X * copyright notice and this permission notice appear in supporting X * documentation, and that the name of Digital Equipment Corporation not be X * used in advertising or publicity pertaining to distribution of the X * software without specific, written prior permission. X \*/ X X#define DEBUG_VAR appDebug X#include "utils.h" X#include "appstr.h" X#include "ashash.h" X X/***====================================================================***/ X/*** DEBUGGING FUNCTIONS ***/ X/***====================================================================***/ X Xchar * XappText(pApp) XAppPtr pApp; X{ X X if ((pApp==NullApp)||(pApp->name==NullStringToken)) return("<NullApp>"); X return(stText(pApp->name)); X} X X/***====================================================================***/ X Xvoid XappDebugPrint(pApp) XAppPtr pApp; X{ XOpaque lstate; XStringToken key; XAppStatePtr pState; X X if (pApp!=NullApp) { X uDebug("app %s (0x%x)\n",stText(pApp->name),pApp); X uDebugIndent(1); X uDebug("pRealState= %s (0x%x)\n",asText(pApp->pRealState), X pApp->pRealState); X uDebug("pDfltState= %s (0x%x)\n",asText(pApp->pDfltState), X pApp->pDfltState); X uDebug("permanent= %s\n",booleanText(pApp->permanent)); X uDebug("outputPriv= 0x%x\n",pApp->outputPriv); X uDebug("updateFunc= 0x%x\n",pApp->updateFunc); X uDebug("roomStates:\n"); X uDebugIndent(1); X lIterator(pApp->roomStates,key,pState,lstate) { X uDebug("%s: %s (0x%x)\n",stText(key),asText(pState),pState); X } X lEndIterator(pApp->roomStates,lstate); X uDebugIndent(-2); X } X else { X uDebug("<NullApp>\n"); X } X return; X} X X/***====================================================================***/ X/*** FUNCTIONS TO CREATE AND DESTROY APPS ***/ X/***====================================================================***/ X XAppPtr XappCreate(name,pRealState,pDfltState) XStringToken name; XAppStatePtr pRealState; XAppStatePtr pDfltState; X{ XAppPtr pApp; X X uENTRY3("appCreate(%s,%s,%s)\n",stText(name),asText(pRealState), X asText(pDfltState)); X X if (pRealState==NullAppState) pRealState= asDefaultReal; X if (pDfltState==NullAppState) pDfltState= asDefaultProfile; X if ((name==NullStringToken)||(!asLegalProfile(pDfltState))|| X (!asLegalReal(pRealState))) { X uRETURN(NullApp); X } X X pApp= uTypedAlloc(AppRec); X if (pApp!=NullApp) { X pApp->name= name; X pApp->pRealState= asDupFully(pRealState); X pApp->pDfltState= asDupFully(pDfltState); X pApp->roomStates= lCreate((unsigned)11, NullListSortFunc, X genIntegerKeyType, X asGenDataType); X pApp->permanent= False; X pApp->updateFunc= NULL; X pApp->outputPriv= NULL; X if ((pApp->pRealState==NullAppState)||(pApp->pDfltState==NullAppState)|| X (pApp->roomStates==NullList)) { X (void)appDestroy(pApp); X pApp= NullApp; X } X } X uRETURN(pApp); X} X X/***====================================================================***/ X Xvoid XappDestroy(pApp) XAppPtr pApp; X{ X uENTRY1("appDestroy(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X pApp->name= NullStringToken; X if (pApp->roomStates!=NullList) { X (void)lDestroy(pApp->roomStates); X pApp->roomStates= NullList; X } X if (pApp->pRealState!=NullAppState) { X (void)asDestroy(pApp->pRealState); X pApp->pRealState= NullAppState; X } X if (pApp->pDfltState!=NullAppState) { X (void)asDestroy(pApp->pDfltState); X pApp->pDfltState= NullAppState; X } X uFree((Opaque)pApp); X } X uVOIDRETURN; X} X X/***====================================================================***/ X/*** FUNCTIONS TO CHANGE OR QUERY THE DEFAULT STATE OF AN APP ***/ X/***====================================================================***/ X XAppStatePtr XappSetDefault(pApp,pNewDflt,isRealState) XAppPtr pApp; XAppStatePtr pNewDflt; XBoolean isRealState; X{ XAppStatePtr pState; X X uENTRY3("appSetDefault(%s,%s,%s)\n",appText(pApp),asText(pNewDflt), X booleanText(isRealState)); X if ((pApp==NullApp)||(isRealState&&(!asLegalReal(pNewDflt)))|| X ((!isRealState)&&(!asLegalProfile(pNewDflt)))) { X uRETURN(NullAppState); X } X pState= pApp->pDfltState; X if (isRealState) asCopyRealToProfile(pNewDflt,pState); X else asCopyFully(pNewDflt,pState); X uRETURN(pState); X} X X/***====================================================================***/ X XAppStatePtr XappGetDefault(pApp) XAppPtr pApp; X{ X uENTRY1("appGetDefault(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X uRETURN(pApp->pDfltState); X } X uRETURN(NullAppState); X} X X/***====================================================================***/ X/*** FUNCTIONS TO CHANGE OR QUERY THE CURRENT STATE OF AN APP ***/ X/***====================================================================***/ X XAppStatePtr XappSetCurrent(pApp,pNewReal,isRealState) XAppPtr pApp; XAppStatePtr pNewReal; XBoolean isRealState; X{ XAppStatePtr pState; X X uENTRY3("appSetCurrent(%s,%s,%s)\n",appText(pApp),asText(pNewReal), X booleanText(isRealState)); X if ((pApp==NullApp)||(isRealState&&(!asLegalReal(pNewReal)))|| X ((!isRealState)&&(!asLegalProfile(pNewReal)))) { X uRETURN(NullAppState); X } X pState= pApp->pRealState; X if (isRealState) { X asCopyFully(pNewReal,pState); X } X else { X asCopyProfileToReal(pNewReal,pState); X if (pApp->updateFunc) { X (*pApp->updateFunc)(pApp,pState,pApp->outputPriv); X } X } X uRETURN(pState); X} X X/***====================================================================***/ X XAppStatePtr XappGetCurrent(pApp) XAppPtr pApp; X{ X uENTRY1("appGetCurrent(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X uRETURN(pApp->pRealState); X } X uRETURN(NullAppState); X} X X/***====================================================================***/ X/*** FUNCTIONS TO MUCK WITH THE LOCAL STATE OF AN APP ***/ X/***====================================================================***/ X Xint XappNLocalStates(pApp) XAppPtr pApp; X{ Xint n= 0; X uENTRY1("appNLocalStates(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X n= lNItems(pApp->roomStates); X } X uRETURN(n); X} X X/***====================================================================***/ X XAppStatePtr XappSetRoomState(pApp,roomName,pNew,isRealState) XAppPtr pApp; XStringToken roomName; XAppStatePtr pNew; XBoolean isRealState; X{ XAppStatePtr pState; X X uENTRY4("appSetRoomState(%s,%s,%s,%s)\n",appText(pApp),stText(roomName), X asText(pNew),booleanText(isRealState)); X if ((pApp==NullApp)||(roomName==NullStringToken)|| X (isRealState&&(!asLegalReal(pNew)))|| X ((!isRealState)&&(!asLegalProfile(pNew)))) { X uRETURN(NullAppState); X } X (void)lLookup(pApp->roomStates,(GenKey)roomName,(GenData *)&pState); X if (pState==NullAppState) { X pState= asDupFully(pApp->pDfltState); X (void)lStore(pApp->roomStates,(GenKey)roomName,(GenData)pState); X } X if (pState!=NullAppState) { X if (isRealState) asCopyRealToProfile(pNew,pState); X else asCopyFully(pNew,pState); X } X uRETURN(pState); X} X X/***====================================================================***/ X XBoolean XappRemoveRoomState(pApp, roomName) XAppPtr pApp; XStringToken roomName; X{ XBoolean ok; X X uENTRY2("appGetRoomState(%s,%s)\n",appText(pApp),stText(roomName)); X if ((pApp!=NullApp)&&(roomName!=NullStringToken)) { X ok= lRemove(pApp->roomStates,(GenKey)roomName); X uRETURN(ok); X } X uRETURN(False); X} X X/***====================================================================***/ X XAppStatePtr XappGetRoomState(pApp, roomName) XAppPtr pApp; XStringToken roomName; X{ XAppStatePtr pState= NullAppState; X X uENTRY2("appGetRoomState(%s,%s)\n",appText(pApp),stText(roomName)); X if ((pApp==NullApp)||(roomName==NullStringToken)) { X uRETURN(NullAppState); X } X (void)lLookup(pApp->roomStates,(GenKey)roomName,(GenData *)&pState); X uRETURN(pState); X} X X/***====================================================================***/ X XBoolean XappRemoveAllRoomStates(pApp) XAppPtr pApp; X{ X uENTRY1("appRemoveAllRoomStates(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X lRemoveAll(pApp->roomStates); X uRETURN(True); X } X uRETURN(False); X} X X/***====================================================================***/ X/*** FUNCTIONS FOR DEALING WITH THE UPDATE FUNCTION OF AN APP ***/ X/***====================================================================***/ X Xvoid XappSetUpdateFunc(pApp, updateFunc) XAppPtr pApp; XAppUpdateFunc updateFunc; X{ X uENTRY2("appSetUpdateFunc(%s,0x%x)\n",appText(pApp),updateFunc); X if (pApp) { X pApp->updateFunc= updateFunc; X } X uVOIDRETURN; X} X X/***====================================================================***/ X XAppUpdateFunc XappGetUpdateFunc(pApp) XAppPtr pApp; X{ X uENTRY1("appGetUpdateFunc(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X uRETURN(pApp->updateFunc); X } X uRETURN((AppUpdateFunc)NULL); X} X X X/***====================================================================***/ X/*** FUNCTIONS TO GET/SET THE VARIOUS PRIVATE FIELDS ***/ X/***====================================================================***/ X X XStringToken XappName(pApp) XAppPtr pApp; X{ X uFLAG_ENTRY1(LOW_ENTRY_BIT,"appName(%s)\n",appText(pApp)); X if (pApp==NullApp) { X uFLAG_RETURN(NullStringToken); X } X uFLAG_RETURN(pApp->name); X} X X/***====================================================================***/ X XBoolean XappIsActive(pApp) XAppPtr pApp; X{ XWinState winState; X X uFLAG_ENTRY1(LOW_ENTRY_BIT,"appIsActive(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X asValues(pApp->pRealState,&winState,(int *)NULL,(int *)NULL, X (unsigned *)NULL,(unsigned *)NULL); X uFLAG_RETURN(winState!=asInactive); X } X uFLAG_RETURN(False); X} X X/***====================================================================***/ X XBoolean XappIsPermanent(pApp) XAppPtr pApp; X{ X uFLAG_ENTRY1(LOW_ENTRY_BIT,"appIsPermanent(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X uFLAG_RETURN(pApp->permanent); X } X uFLAG_RETURN(False); X} X X/***====================================================================***/ X XBoolean XappSetPermanence(pApp,permanent) XAppPtr pApp; XBoolean permanent; X{ X uFLAG_ENTRY2(LOW_ENTRY_BIT,"appSetPermanence(%s,%s)\n",appText(pApp), X booleanText(permanent)); X if (pApp!=NullApp) { X pApp->permanent= permanent; X uFLAG_RETURN(True); X } X uFLAG_RETURN(False); X} X X/***====================================================================***/ X Xvoid XappSetOutputPriv(pApp, pPriv) XAppPtr pApp; XOpaque pPriv; X{ X uFLAG_ENTRY2(LOW_ENTRY_BIT,"appSetOutputPriv(%s,0x%x)\n",appText(pApp), X pPriv); X if (pApp!=NullApp) { X pApp->outputPriv= pPriv; X } X uFLAG_VOIDRETURN; X} X X/***====================================================================***/ X XOpaque XappGetOutputPriv(pApp) XAppPtr pApp; X{ X uFLAG_ENTRY1(LOW_ENTRY_BIT,"appGetOutputPriv(%s)\n",appText(pApp)); X if (pApp!=NullApp) { X uFLAG_RETURN(pApp->outputPriv); X } X uFLAG_RETURN((Opaque)NULL); X} X X/***====================================================================***/ X Xtypedef struct _AppIterArg { X AppIterFunc pFunc; X AppPtr pApp; X Opaque arg; X} AppIterArgRec, *AppIterArgPtr; X Xstatic Boolean X_appIterator(keyIn,dataIn,argIn) XGenKey keyIn; XGenData dataIn; XOpaque argIn; X{ XStringToken key= (StringToken)keyIn; XAppStatePtr pState= (AppStatePtr)dataIn; XAppIterArgPtr pArg= (AppIterArgPtr)argIn; XBoolean ok; X X uENTRY3("_appIterator(%s,%s,0x%x)\n",stText(key),asText(pState),pArg); X ok= (*pArg->pFunc)(pArg->pApp,key,pState,pArg->arg); X uRETURN(ok); X} X Xvoid XappIterate(pApp, pFunc, arg) XAppPtr pApp; XAppIterFunc pFunc; XOpaque arg; X{ X uENTRY3("appIterate(%s,0x%x,0x%x)\n",appText(pApp), pFunc, arg); X if ((pApp!=NullApp)&&(pFunc!=NULL)) { X AppIterArgRec iarg; X iarg.pFunc= pFunc; X iarg.pApp= pApp; X iarg.arg= arg; X (void)lIterate(pApp->roomStates,_appIterator,(Opaque)&iarg); X } X uVOIDRETURN; X} X X/***====================================================================***/ X XBoolean X_appInitIter(pApp, ppIState) XAppPtr pApp; XOpaque *ppIState; X{ XBoolean ok; X X uENTRY2("_appInitIter(%s,0x%x)\n",appText(pApp), ppIState); X if (pApp!=NullApp) { X ok= _lInitIter(pApp->roomStates,ppIState); X uRETURN(ok); X } X uRETURN(False); X} X X/***====================================================================***/ X XBoolean X_appIterNext(pApp, ppIState, pRoomName, ppState) XAppPtr pApp; XOpaque *ppIState; XStringToken *pRoomName; XAppStatePtr *ppState; X{ XBoolean ok; X uENTRY4("_appIterNext(%s,0x%x,0x%x,0x%x)\n",appText(pApp),ppIState, X pRoomName,ppState); X ok= _lIterNext(pApp->roomStates,ppIState,(GenKey *)pRoomName, X (GenData *)ppState); X uRETURN(ok); X} X X/***====================================================================***/ X Xvoid XappEndIterator(pApp,pIState) XAppPtr pApp; XOpaque pIState; X{ X uENTRY2("_appEndIterator(%s,0x%x)\n",appText(pApp),pIState); X if (pApp!=NullApp) X lEndIterator(pApp->roomStates,pIState); X uVOIDRETURN; X} END_OF_FILE if test 13933 -ne `wc -c <'./lib/app.c'`; then echo shar: \"'./lib/app.c'\" unpacked with wrong size! fi # end of './lib/app.c' fi if test -f './lib/profile.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'./lib/profile.c'\" else echo shar: Extracting \"'./lib/profile.c'\" \(14649 characters\) sed "s/^X//" >'./lib/profile.c' <<'END_OF_FILE' X X /*\ X * $Header: profile.c,v 5.0 90/01/10 06:53:48 erik Exp $ X * X * COPYRIGHT 1990 X * DIGITAL EQUIPMENT CORPORATION X * MAYNARD, MASSACHUSETTS X * ALL RIGHTS RESERVED. X * X * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND X * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. X * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE X * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED X * WARRANTY. X * X * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT X * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN X * ADDITION TO THAT SET FORTH ABOVE. X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, provided X * that the above copyright notice appear in all copies and that both that X * copyright notice and this permission notice appear in supporting X * documentation, and that the name of Digital Equipment Corporation not be X * used in advertising or publicity pertaining to distribution of the X * software without specific, written prior permission. X \*/ X X#define DEBUG_VAR profileDebug X#include "utils.h" X#include "apps.h" X#include "rooms.h" X#include "profilestr.h" X#include "profscan.h" X#include "names.h" X#include "nameprof.h" X X/***====================================================================***/ X Xstatic ProfilesPtr pNameProfiles= NullProfiles; Xstatic ProfilesPtr pRoomProfiles= NullProfiles; Xstatic ProfilesPtr pAppProfiles= NullProfiles; Xstatic CommentPtr pPendingComments= NullComment; X X/***====================================================================***/ X Xstatic CommentPtr X_profileConcatComments(pFirst,pSecond) XCommentPtr pFirst,pSecond; X{ XCommentPtr pTmp; X X uENTRY2("_profileConcatComments(0x%x,0x%x)\n",pFirst,pSecond); X if (pFirst!=NullComment) { X for (pTmp=pFirst;pTmp->pNext!=NullComment;pTmp= pTmp->pNext) { X /* do nothing */ X } X pTmp->pNext= pSecond; X } X else pFirst= pSecond; X uRETURN(pFirst); X} X X/***====================================================================***/ X Xstatic void X_profileDestroyComments(pComments) XCommentPtr pComments; X{ XCommentPtr pNext; X X uENTRY1("_profileDestroyComments(0x%x)\n",pComments); X while (pComments!=NullComment) { X if (pComments->text!=NullString) X (void)uFree((Opaque)pComments->text); X pNext= pComments->pNext; X (void)uFree((Opaque)pComments); X pComments= pNext; X } X uVOIDRETURN; X} X X/***====================================================================***/ X Xstatic ProfilesPtr X_profilesCreate(initSize) Xunsigned initSize; X{ XProfilesPtr pProfs; X X uENTRY1("_profilesCreate(%d)\n",initSize); X pProfs= uTypedAlloc(ProfilesRec); X if (pProfs!=NullProfiles) { X pProfs->sizeProfiles= initSize; X pProfs->nProfiles= 0; X pProfs->pProfiles= uTypedCalloc(initSize,ProfileRec); X } X uRETURN(pProfs); X} X X/***====================================================================***/ X Xstatic void X_profilesAddName(pProfs,name) XProfilesPtr pProfs; XStringToken name; X{ Xint i; XBoolean found= False; X X uENTRY2("_profilesAddName(0x%x,%s)\n",pProfs,stText(name)); X if (pProfs!=NullProfiles) { X for (i=0;(i<pProfs->nProfiles);i++) { X found= stEqual(name,pProfs->pProfiles[i].name); X if (found) break; X } X if (!found) { X if (pProfs->nProfiles==pProfs->sizeProfiles) { X pProfs->sizeProfiles*= 2; X pProfs->pProfiles= (ProfilePtr) X uRealloc((Opaque)pProfs->pProfiles, X (unsigned)sizeof(ProfileRec)*pProfs->sizeProfiles); X } X pProfs->pProfiles[pProfs->nProfiles].name= name; X pProfs->pProfiles[pProfs->nProfiles].pComments= pPendingComments; X pProfs->nProfiles++; X pPendingComments= NullComment; X } X else { X pProfs->pProfiles[i].pComments= _profileConcatComments( X pProfs->pProfiles[i].pComments, X pPendingComments); X pPendingComments= NullComment; X } X } X uVOIDRETURN; X} X X/***====================================================================***/ X Xvoid X_profilesRemoveName(pProfs,name) XProfilesPtr pProfs; XStringToken name; X{ Xint i,j; X X uENTRY2("_profilesRemoveName(0x%x,%s)\n",pProfs,stText(name)); X if (pProfs!=NullProfiles) { X for (i=0;(i<pProfs->nProfiles);i++) { X if (stEqual(name,pProfs->pProfiles[i].name)) { X if (pProfs->pProfiles[i].pComments!=NullComment) X _profileDestroyComments(pProfs->pProfiles[i].pComments); X for (j=i;j<pProfs->nProfiles;j++) { X pProfs->pProfiles[j]= pProfs->pProfiles[j+1]; X } X pProfs->nProfiles--; X break; X } X } X } X uVOIDRETURN; X} X X/***====================================================================***/ X XBoolean XprofileForNames(funcName) XStringToken funcName; X{ X uENTRY1("profileForNames(%s)\n",stText(funcName)); X if (funcName!=NullStringToken) { X if (pNameProfiles==NullProfiles) X pNameProfiles= _profilesCreate((unsigned)5); X if (pNameProfiles!=NullProfiles) { X _profilesAddName(pNameProfiles,funcName); X uRETURN(True); X } X } X uRETURN(False); X} X X/***====================================================================***/ X XBoolean XprofileForRoom(roomName) XStringToken roomName; X{ X uENTRY1("profileForRoom(%s)\n",stText(roomName)); X if (roomName!=NullStringToken) { X if (pRoomProfiles==NullProfiles) X pRoomProfiles= _profilesCreate((unsigned)10); X if (pRoomProfiles!=NullProfiles) { X _profilesAddName(pRoomProfiles,roomName); X uRETURN(True); X } X } X uRETURN(False); X} X X/***====================================================================***/ X XBoolean XprofileForApp(appName) XStringToken appName; X{ X uENTRY1("profileForApp(%s)\n",stText(appName)); X if (appName!=NullStringToken) { X if (pAppProfiles==NullProfiles) X pAppProfiles= _profilesCreate((unsigned)30); X if (pAppProfiles!=NullProfiles) { X _profilesAddName(pAppProfiles,appName); X uRETURN(True); X } X } X uRETURN(False); X} X X/***====================================================================***/ X Xvoid XprofileForNameDestroy(funcName) XStringToken funcName; X{ X uENTRY1("profileForNameDestroy(%s)\n",stText(funcName)); X if ((funcName!=NullStringToken)&&(pNameProfiles!=NullProfiles)) { X _profilesRemoveName(pNameProfiles,funcName); X } X uVOIDRETURN; X} X X/***====================================================================***/ X Xvoid XprofileForRoomDestroy(roomName) XStringToken roomName; X{ X uENTRY1("profileForRoomDestroy(%s)\n",stText(roomName)); X if ((roomName!=NullStringToken)&&(pRoomProfiles!=NullProfiles)) { X _profilesRemoveName(pRoomProfiles,roomName); X } X uVOIDRETURN; X} X X/***====================================================================***/ X Xvoid XprofileForAppDestroy(appName) XStringToken appName; X{ X uENTRY1("profileForAppDestroy(%s)\n",stText(appName)); X if ((appName!=NullStringToken)&&(pAppProfiles!=NullProfiles)) { X _profilesRemoveName(pAppProfiles,appName); X } X uVOIDRETURN; X} X X/***====================================================================***/ X XBoolean XprofileAddComment(comment) Xchar *comment; X{ XCommentPtr pComment; X X uENTRY1("profileAddComment(%s)\n",uStringText(comment)); X if (comment!=NullString) { X pComment= uTypedAlloc(CommentRec); X if (pComment!=NullComment) { X pComment->text= comment; X pComment->pNext= NullComment; X pPendingComments= _profileConcatComments(pPendingComments,pComment); X uRETURN(True); X } X } X uRETURN(False); X} X X/***====================================================================***/ X XCommentPtr XprofileGetComments() X{ XCommentPtr pComment= pPendingComments; X X uENTRY("profileGetComments()\n"); X pPendingComments= NullComment; X uRETURN(pComment); X} X X/***====================================================================***/ X XBoolean XprofileRead(pScan) XScannablePtr pScan; X{ Xextern ScannablePtr pYYLexScan; X X uENTRY1("profileRead(0x%x)\n",pScan); X if (pScan!=NullScannable) { X pYYLexScan= pScan; X (void)yyparse(); X pYYLexScan= NullScannable; X } X uRETURN(True); X} X X/***====================================================================***/ X Xstatic void X_profileIndent(pFile,n) XFILE *pFile; Xint n; X{ X do { X putc(' ',pFile); X } while (--n>0); X} X X/***====================================================================***/ X Xstatic Boolean X_profileWriteAppState(pApp,roomName,pState,argIn) XAppPtr pApp; XStringToken roomName; XAppStatePtr pState; XOpaque argIn; X{ XFILE *pFile= (FILE *)argIn; Xchar *name; Xint len; X X uENTRY4("_profileWriteAppState(%s,%s,%s,0%x)\n",appText(pApp), X stText(roomName),asText(pState), X argIn); X name= stGetString(roomName); X if (name!=NullString) { X _profileIndent(pFile,PROFILE_NAME_COL); X fprintf(pFile,"\"%s\"",name); len= PROFILE_NAME_COL+strlen(name)+2; X _profileIndent(pFile,PROFILE_STATE_COL-len); X fprintf(pFile,"%s\n",asText(pState)); X } X uRETURN(True); X} X Xstatic Boolean X_profileWriteApp(pFile,pApp,writeStates) XFILE *pFile; XAppPtr pApp; XBoolean writeStates; X{ XAppStatePtr pState; Xint len= 0; X X uENTRY3("_profileWriteApp(0x%x,%s,%s)\n",pFile,appText(pApp), X booleanText(writeStates)); X X if (pApp!=NullApp) { X pState= appGetDefault(pApp); X X if (!appIsPermanent(pApp)) { X fprintf(pFile,"transient "); len+= strlen("transient "); X } X fprintf(pFile,"application "); len+= strlen("application "); X _profileIndent(pFile,PROFILE_NAME_COL-len); X if (PROFILE_NAME_COL>len) len+= (PROFILE_NAME_COL-len); X fprintf(pFile,"\"%s\"",appText(pApp)); len+= strlen(appText(pApp))+2; X if (pState!=NullAppState) { X _profileIndent(pFile,PROFILE_STATE_COL-len); X fprintf(pFile,"%s",asText(pState)); X } X if ((writeStates)&&(appNLocalStates(pApp)>0)) { X fprintf(pFile," {\n"); X appIterate(pApp,_profileWriteAppState,(Opaque)pFile); X fprintf(pFile,"}"); X } X fprintf(pFile,"\n"); X fflush(pFile); X } X uRETURN(True); X} X X/***====================================================================***/ X Xstruct pIterArg { X FILE *pFile; X StringToken roomName; X RoomPtr pRoom; X Boolean written; X Boolean writeTransient; X}; X X Xstatic void X_profileWriteRoomHeader(pFile,pRoom) XFILE *pFile; XRoomPtr pRoom; X{ Xunsigned vis; X X uENTRY2("_profileWriteRoomHeader(0x%x,%s)\n",pFile,roomText(pRoom)); X fprintf(pFile,"room "); X _profileIndent(pFile,PROFILE_NAME_COL-strlen("room ")); X fprintf(pFile,"\"%s\"",roomText(pRoom)); X _profileIndent(pFile,PROFILE_STATE_COL- X PROFILE_NAME_COL-strlen(roomText(pRoom))-2); X if ( (vis=roomGetVisibility(pRoom))!=roomDefaultVisibility) { X if (vis==0) fprintf(pFile,"hidden"); X else if (vis==roomVisible) fprintf(pFile,"visible"); X else { X fprintf(pFile,"visible "); X if (vis&roomAlways) fprintf(pFile,"always"); X else { X if (vis&roomWhenActive) fprintf(pFile,"whenActive "); X if (vis&roomWhenNonEmpty) fprintf(pFile,"whenNonEmpty"); X } X } X } X else { X fprintf(pFile,"default"); X } X uVOIDRETURN; X} X Xstatic Boolean X_profileWriteRoomState(argIn,pApp) XOpaque argIn; XAppPtr pApp; X{ Xstruct pIterArg *pArg= (struct pIterArg *)argIn; XAppStatePtr pState; Xchar *str; X X uENTRY2("_profileWriteRoomState(0x%x,%s)\n",argIn,appText(pApp)); X if ((!pArg->writeTransient)&&(!appIsPermanent(pApp))) { X uRETURN(True); X } X pState= appGetRoomState(pApp,pArg->roomName); X if (pState!=NullAppState) { X if (!pArg->written) { X _profileWriteRoomHeader(pArg->pFile,pArg->pRoom); X fprintf(pArg->pFile," {\n"); X pArg->written= True; X } X str= appText(pApp); X if (str!=NullString) { X int len; X _profileIndent(pArg->pFile,PROFILE_NAME_COL); X fprintf(pArg->pFile,"\"%s\"",str); X len= PROFILE_NAME_COL+strlen(str)+2; X _profileIndent(pArg->pFile,PROFILE_STATE_COL-len); X fprintf(pArg->pFile,"%s\n",asText(pState)); X } X } uRETURN(True); X} X Xstatic Boolean X_profileWriteRoom(pFile,pRoom,writeStates,writeTransient) XFILE *pFile; XRoomPtr pRoom; XBoolean writeStates; XBoolean writeTransient; X{ XStringToken name; XBoolean written= False; Xstruct pIterArg iarg; X X uENTRY4("_profileWriteRoom(0x%x,%s,%s,%s)\n",pFile,roomText(pRoom), X booleanText(writeStates), X booleanText(writeTransient)); X name= roomName(pRoom); X if ((pRoom!=NullRoom)&&(writeStates)) { X iarg.pFile= pFile; X iarg.roomName= name; X iarg.pRoom= pRoom; X iarg.writeTransient= writeTransient; X iarg.written= False; X AppsIterate(_profileWriteRoomState,(Opaque)&iarg); X written= iarg.written; X } X if (!written) { X _profileWriteRoomHeader(pFile,pRoom); X fprintf(pFile,"\n"); X } X else { X fprintf(pFile,"}\n"); X } X uRETURN(True); X} X X/***====================================================================***/ X Xstatic void X_profileWriteComment(pFile,pComment) XFILE *pFile; XCommentPtr pComment; X{ X uENTRY2("_profileWriteComment(0x%x,0x%x)\n",pFile,pComment); X while (pComment!=NullComment) { X fprintf(pFile,"#%s\n",uStringText(pComment->text)); X pComment= pComment->pNext; X } X uVOIDRETURN; X} X X/***====================================================================***/ X XBoolean XprofileWrite(pFile,writeRooms) XFILE *pFile; XBoolean writeRooms; X{ Xint i; XProfilePtr pProf; X X uENTRY2("profileWrite(0x%x,%s)\n",pFile,booleanText(writeRooms)); X if (pFile!=NULL) { X if (pNameProfiles!=NullProfiles) { X NPStatementPtr pFunc; X X pProf= pNameProfiles->pProfiles; X for (i=pNameProfiles->nProfiles;i>0;i--,pProf++) { X pFunc= nprLookupFunction(pProf->name); X if (pFunc!=NullNPStatement) { X if (pProf->pComments!=NullComment) X _profileWriteComment(pFile,pProf->pComments); X fprintf(pFile,"names \"%s\" {\n",stText(pProf->name)); X npWriteStatement(pFile,1,pFunc); X fprintf(pFile,"}\n"); X } X } X } X X if (pAppProfiles!=NullProfiles) { X AppPtr pApp; X X pProf= pAppProfiles->pProfiles; X for (i=pAppProfiles->nProfiles;i>0;i--,pProf++) { X pApp= LookupApp(pProf->name); X if ((pApp!=NullApp)&&(appIsPermanent(pApp))) { X if (pProf->pComments!=NullComment) X _profileWriteComment(pFile,pProf->pComments); X _profileWriteApp(pFile,pApp,!writeRooms); X } X } X } X if (pRoomProfiles!=NullProfiles) { X RoomPtr pRoom; X X pProf= pRoomProfiles->pProfiles; X for (i=pRoomProfiles->nProfiles;i>0;i--,pProf++) { X pRoom= LookupRoom(pProf->name); X if (pRoom!=NullRoom) { X if (pProf->pComments!=NullComment) X _profileWriteComment(pFile,pProf->pComments); X _profileWriteRoom(pFile,pRoom,writeRooms,False); X } X } X } X if (pPendingComments) X _profileWriteComment(pFile,pPendingComments); X uRETURN(True); X } X uRETURN(False); X} X X END_OF_FILE if test 14649 -ne `wc -c <'./lib/profile.c'`; then echo shar: \"'./lib/profile.c'\" unpacked with wrong size! fi # end of './lib/profile.c' fi if test -f './lib/profscan.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'./lib/profscan.c'\" else echo shar: Extracting \"'./lib/profscan.c'\" \(14546 characters\) sed "s/^X//" >'./lib/profscan.c' <<'END_OF_FILE' X X /*\ X * $Header: profscan.c,v 5.0 90/01/10 06:54:08 erik Exp $ X * X * COPYRIGHT 1990 X * DIGITAL EQUIPMENT CORPORATION X * MAYNARD, MASSACHUSETTS X * ALL RIGHTS RESERVED. X * X * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND X * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. X * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE X * FOR ANY PURPOSE. IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED X * WARRANTY. X * X * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT X * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN X * ADDITION TO THAT SET FORTH ABOVE. X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, provided X * that the above copyright notice appear in all copies and that both that X * copyright notice and this permission notice appear in supporting X * documentation, and that the name of Digital Equipment Corporation not be X * used in advertising or publicity pertaining to distribution of the X * software without specific, written prior permission. X \*/ X X#include <X11/Xlib.h> X#include <X11/Xutil.h> X#define DEBUG_VAR scanDebug X#include "utils.h" X#include "appstate.h" X#include "profile.h" X#include "scanstr.h" X#include <ctype.h> X X/***====================================================================***/ X X#define scanChar(ps,c) {\ X if ((ps)->flags&scannableEnd) (c)=EOF;\ X else if ((ps)->flags&scannableString) {\ X if (*(ps)->stream.string!='\0') {\ X (c)= *(ps)->stream.string++;\ X }\ X else (ps)->flags|= (scannableEnd);\ X }\ X else if ((ps)->flags&scannableFile) {\ X (c)= getc((ps)->stream.file);\ X if ((c)==EOF) (ps)->flags|= (scannableEnd);\ X }\ X else (c)= EOF;\ X if ((c)=='\n') (ps)->lineNum++;\ X} X X#define scanPutBackChar(ps,c) {\ X if ((!((ps)->flags&scannableEnd))&&((c)!=EOF)) {\ X if ((ps)->flags&scannableString) {\ X (ps)->stream.string--;\ X *(ps)->stream.string= (c);\ X }\ X else if ((ps)->flags&scannableFile) {\ X ungetc((c),(ps)->stream.file);\ X }\ X }\ X else (c)= EOF;\ X} X X/***====================================================================***/ X Xchar * XscannerText(token) Xunsigned token; X{ X switch (token) { X case TOK_END: return("END"); X case TOK_APPLICATION: return("APPLICATION"); X case TOK_ROOM: return("ROOM"); X case TOK_NAMES: return("NAMES"); X X case TOK_LBRACE: return("LBRACE"); X case TOK_RBRACE: return("RBRACE"); X case TOK_LBRACKET: return("LBRACKET"); X case TOK_RBRACKET: return("RBRACKET"); X case TOK_LPAREN: return("LPAREN"); X case TOK_RPAREN: return("RPAREN"); X X case TOK_BOLT: return("BOLT"); X case TOK_QUESTION: return("QUESTION"); X case TOK_EQUALS: return("EQUALS"); X case TOK_GETS: return("GETS"); X case TOK_PLUS: return("PLUS"); X case TOK_SEMI: return("SEMI"); X case TOK_COLON: return("COLON"); X X case TOK_DEFAULT: return("DEFAULT"); X case TOK_ICONIC: return("ICONIC"); X case TOK_NORMAL: return("NORMAL"); X X case TOK_IF: return("IF"); X case TOK_ELSE: return("ELSE"); X case TOK_SWITCH: return("SWITCH"); X case TOK_CASE: return("CASE"); X case TOK_USE: return("USE"); X case TOK_CLASS: return("CLASS"); X case TOK_IGNORE: return("IGNORE"); X X case TOK_VISIBLE: return("VISIBLE"); X case TOK_HIDDEN: return("HIDDEN"); X case TOK_ALWAYS: return("ALWAYS"); X case TOK_WHEN_ACTIVE: return("WHENACTIVE"); X case TOK_WHEN_NONEMPTY: return("WHENNONEMPTY"); X X case TOK_TRANSIENT: return("TRANSIENT"); X case TOK_PERMANENT: return("PERMANENT"); X X case TOK_PROPERTY: return("PROPERTY"); X case TOK_STRING: return("STRING"); X case TOK_IDENT: return("IDENT"); X case TOK_GEOMETRY: return("GEOMETRY"); X case TOK_COMMENT: return("COMMENT"); X } X return("WEIRD"); X} X X/***====================================================================***/ X Xchar * XscanUseString(pScan) XScannablePtr pScan; X{ Xchar *str= NullString; X X uENTRY1("scanUseString(0x%x)\n",pScan); X if (pScan!=NullScannable) { X str= pScan->string; X pScan->string= NullString; X } X uRETURN(str); X} X X/***====================================================================***/ X Xvoid XscanSetString(pScan,str) XScannablePtr pScan; Xchar *str; X{ X uENTRY2("scanSetString(0x%x,%s)\n",pScan,uStringText(str)); X if (pScan!=NullScannable) { X if (pScan->string!=NullString) X (void)uFree((Opaque)pScan->string); X if (str!=NullString) pScan->string= uStringDup(str); X else pScan->string= NullString; X } X uVOIDRETURN; X} X X/***====================================================================***/ X XAppStatePtr XscanUseState(pScan) XScannablePtr pScan; X{ XAppStatePtr pState= NullAppState; X X uENTRY1("scanUseState(0x%x)\n",pScan); X if (pScan!=NullScannable) { X pState= pScan->pState; X pScan->pState= NullAppState; X } X uRETURN(pState); X} X X/***====================================================================***/ X Xvoid XscanSetState(pScan,flags,x,y,w,h) XScannablePtr pScan; Xunsigned flags; Xint x,y; Xunsigned w,h; X{ X uENTRY6("scanSetGeom(0x%x,0x%x,%d,%d,%d,%d)\n",pScan,flags,x,y,w,h); X if (pScan!=NullScannable) { X if (flags!=asNoValue) { X if (pScan->pState!=NullAppState) { X asChangeAll(pScan->pState,flags,asInactive,x,y,w,h); X } X else { X pScan->pState= asCreate(flags,asInactive,x,y,w,h); X } X } X else if (pScan->pState!=NullAppState) { X asDestroy(pScan->pState); X pScan->pState= NullAppState; X } X } X uVOIDRETURN; X} X X/***====================================================================***/ X XScannablePtr XscannableOpen(type, source) Xunsigned type; XOpaque source; X{ XScannablePtr pScan; X X uENTRY2("scannableOpen(0x%x,0x%x)\n",type,source); X pScan= uTypedAlloc(ScannableRec); X if (pScan!=NullScannable) { X if (type==scannableString) { X if (source!=(Opaque)NULL) { X pScan->flags= type; X pScan->stream.string= (char *)source; X } X else goto BAILOUT; X } X else if (type==scannableFile) { X if (source!=(Opaque)NULL) { X pScan->flags= type; X pScan->stream.file= (FILE *)source; X } X else goto BAILOUT; X } X else if (type==scannableFileName) { X if (source!=(Opaque)NULL) { X pScan->flags= scannableFile|scannableFileName; X pScan->stream.file= fopen((char *)source,"r"); X if (pScan->stream.file==NULL) X goto BAILOUT; X } X else goto BAILOUT; X } X pScan->lineNum= 0; X pScan->lookingAhead= False; X pScan->token= TOK_END; X pScan->string= NullString; X pScan->pState= NullAppState; X } X uRETURN(pScan); XBAILOUT: X (void)uFree((Opaque)pScan); X uRETURN(NullScannable); X} X X/***====================================================================***/ X Xvoid XscannableClose(pScan) XScannablePtr pScan; X{ X uENTRY1("scannableClose(0x%x)\n",pScan); X if (pScan!=NullScannable) { X if (pScan->flags&scannableFileName) { X fclose(pScan->stream.file); X } X scanSetString(pScan,NullString); X scanSetState(pScan,asNoValue,0,0,(unsigned)0,(unsigned)0); X (void)uFree((Opaque)pScan); X } X uVOIDRETURN; X} X X/***====================================================================***/ X Xstatic int XscanFillComment(pScan) XScannablePtr pScan; X{ Xchar stringBuf[SCANNER_STRING_LEN]; Xint index,ch; X X uENTRY1("scanFillComment(0x%x)\n",pScan); X index= 0; X scanChar(pScan,ch); X while ((ch!=EOF)&&(ch!='\n')&&(index<SCANNER_STRING_LEN-1)) { X if (ch!=EOF) { X stringBuf[index++]= ch; X scanChar(pScan,ch) X } X } X stringBuf[index++]= '\0'; X while ((ch!='\n')&&(ch!=EOF)) { X scanChar(pScan,ch); X } X scanSetString(pScan,stringBuf); X uRETURN(TOK_COMMENT); X} X X/***====================================================================***/ X Xstatic int XscanFillString(pScan) XScannablePtr pScan; X{ Xchar stringBuf[SCANNER_STRING_LEN]; Xint index,ch; X X uENTRY1("scanFillString(0x%x)\n",pScan); X index= 0; X scanChar(pScan,ch); X while ((ch!=EOF)&&(ch!='\"')&&(index<SCANNER_STRING_LEN-1)) { X if (ch=='\\') { X scanChar(pScan,ch); X if (ch=='n') ch= '\n'; X else if (ch=='t') ch= '\t'; X else if ((ch!='\"')&&(ch!='\\')) { X scanPutBackChar(pScan,ch); X ch= '\\'; X } X } X if (ch!=EOF) { X stringBuf[index++]= ch; X scanChar(pScan,ch) X } X } X stringBuf[index++]= '\0'; X while ((ch!='\"')&&(ch!=EOF)) { X scanChar(pScan,ch); X } X scanSetString(pScan,stringBuf); X uRETURN(TOK_STRING); X} X X/***====================================================================***/ X Xstatic int XscanFillProperty(pScan) XScannablePtr pScan; X{ Xchar stringBuf[SCANNER_STRING_LEN]; Xint index,ch; X X uENTRY1("scanFillProperty(0x%x)\n",pScan); X index= 0; X do { X scanChar(pScan,ch); X } while ((ch!=EOF)&&(isspace(ch))); X while ((ch!=EOF)&&(ch!='>')&&(!isspace(ch))&&(index<SCANNER_STRING_LEN-1)) { X if (ch!=EOF) { X stringBuf[index++]= ch; X scanChar(pScan,ch) X } X } X stringBuf[index++]= '\0'; X if (ch!='>') { X static char *where; X uWarning("Missing end of property '>' on line %d\n",pScan->lineNum); X if (ch==EOF) where= "EOF"; X else if (ch=='\n') where= "end of line"; X else if (isspace(ch)) where= "whitespace"; X else where= "the 256th character"; X uAction("assuming property ends at %s\n",where); X uAction("property name will be \"%s\"\n",stringBuf); X } X while ((ch!='>')&&(ch!=EOF)) { X scanChar(pScan,ch); X } X scanSetString(pScan,stringBuf); X uRETURN(TOK_PROPERTY); X} X X/***====================================================================***/ X Xstatic int XscanFillWord(pScan,firstCh) XScannablePtr pScan; Xint firstCh; X{ Xchar wordBuf[SCANNER_STRING_LEN]; Xint index,ch; X X uENTRY2("scanFillWord(0x%x,%c)\n",pScan,firstCh); X index= 0; X ch= firstCh; X while ((ch!=EOF)&&(isalpha(ch))&&(index<SCANNER_STRING_LEN-1)) { X if (isupper(ch)) ch= tolower(ch); X wordBuf[index++]= ch; X scanChar(pScan,ch); X } X wordBuf[index++]= '\0'; X if ((ch!=EOF)&&(!isspace(ch))) { X scanPutBackChar(pScan,ch); X } X if (uStringEqual(wordBuf,"application")) { uRETURN(TOK_APPLICATION); } X if (uStringEqual(wordBuf,"room")) { uRETURN(TOK_ROOM); } X if (uStringEqual(wordBuf,"names")) { uRETURN(TOK_NAMES); } X X if (uStringEqual(wordBuf,"default")) { uRETURN(TOK_DEFAULT); } X if (uStringEqual(wordBuf,"iconic")) { uRETURN(TOK_ICONIC); } X if (uStringEqual(wordBuf,"normal")) { uRETURN(TOK_NORMAL); } X X if (uStringEqual(wordBuf,"if")) { uRETURN(TOK_IF); } X if (uStringEqual(wordBuf,"else")) { uRETURN(TOK_ELSE); } X if (uStringEqual(wordBuf,"switch")) { uRETURN(TOK_SWITCH); } X if (uStringEqual(wordBuf,"case")) { uRETURN(TOK_CASE); } X if (uStringEqual(wordBuf,"use")) { uRETURN(TOK_USE); } X if (uStringEqual(wordBuf,"class")) { uRETURN(TOK_CLASS); } X if (uStringEqual(wordBuf,"ignore")) { uRETURN(TOK_IGNORE); } X X if (uStringEqual(wordBuf,"visible")) { uRETURN(TOK_VISIBLE); } X if (uStringEqual(wordBuf,"hidden")) { uRETURN(TOK_HIDDEN); } X if (uStringEqual(wordBuf,"always")) { uRETURN(TOK_ALWAYS); } X if (uStringEqual(wordBuf,"whenactive")) { uRETURN(TOK_WHEN_ACTIVE); } X if (uStringEqual(wordBuf,"whennonempty")) { uRETURN(TOK_WHEN_NONEMPTY); } X X if (uStringEqual(wordBuf,"transient")) { uRETURN(TOK_TRANSIENT); } X if (uStringEqual(wordBuf,"permanent")) { uRETURN(TOK_PERMANENT); } X scanSetString(pScan,wordBuf); X uRETURN(TOK_IDENT); X} X X/***====================================================================***/ X Xstatic int XscanFillGeometry(pScan) XScannablePtr pScan; X{ Xchar geomBuf[SCANNER_STRING_LEN]; Xint index,ch; Xint x,y; Xunsigned width,height; Xunsigned rtrn; X X uENTRY1("scanFillGeometry(0x%x)\n",pScan); X index= 0; X scanChar(pScan,ch); X if (ch=='=') { X uRETURN(TOK_EQUALS); X } X else if (isalpha(ch)||(isspace(ch))) { X scanPutBackChar(pScan,ch); X uRETURN(TOK_GETS); X } X while ((ch!=EOF)&&(index<SCANNER_STRING_LEN-1)&& X (isdigit(ch)||(ch=='+')||(ch=='-')||(ch=='x'))) { X geomBuf[index++]= ch; X scanChar(pScan,ch); X } X geomBuf[index++]= '\0'; X if ((ch!=EOF)&&(!isspace(ch))) { X scanPutBackChar(pScan,ch); X } X X x= y= width= height= 0; X rtrn= XParseGeometry(geomBuf,&x,&y,&width,&height); X if (!(rtrn&AllValues)) { X uWarning("Illegal geometry specification \"%s\" on line %d\n", X geomBuf,pScan->lineNum); X return(TOK_END); X } X if (rtrn&asXNegative) x= -x; X if (rtrn&asYNegative) y= -y; X scanSetState(pScan,rtrn,x,y,width,height); X uRETURN(TOK_GEOMETRY); X} X X/***====================================================================***/ X Xint XscanPeek(pScan) XScannablePtr pScan; X{ Xint token= TOK_END; X X uENTRY1("scanPeek(0x%x)\n",pScan); X if (pScan!=NullScannable) { X token= scanToken(pScan); X pScan->lookingAhead= True; X } X uRETURN(token); X} X X/***====================================================================***/ X Xint XscanToken(pScan) XScannablePtr pScan; X{ Xint ch,token; X X uENTRY1("scanToken(0x%x)\n",pScan); X if ((pScan==NullScannable)||(pScan->flags&scannableEnd)) { X uRETURN(TOK_END); X } X X if (pScan->lookingAhead) { X pScan->lookingAhead= False; X uRETURN(pScan->token); X } X X do { X scanChar(pScan,ch); X } while ((ch!=EOF)&&(isspace(ch))); X if (ch==EOF) { token= TOK_END; } X else if (ch=='{') { token= TOK_LBRACE; } X else if (ch=='}') { token= TOK_RBRACE; } X else if (ch=='[') { token= TOK_LBRACKET; } X else if (ch==']') { token= TOK_RBRACKET; } X else if (ch=='(') { token= TOK_LPAREN; } X else if (ch==')') { token= TOK_RPAREN; } X else if (ch=='!') { token= TOK_BOLT; } X else if (ch=='?') { token= TOK_QUESTION; } X else if (ch=='+') { token= TOK_PLUS; } X else if (ch==';') { token= TOK_SEMI; } X else if (ch==':') { token= TOK_COLON; } X else if (ch=='<') { token= scanFillProperty(pScan); } X else if (ch=='\"') { token= scanFillString(pScan); } X else if (ch=='=') { token= scanFillGeometry(pScan); } X else if (ch=='#') { token= scanFillComment(pScan); } X else if (isalpha(ch)) { token= scanFillWord(pScan,ch); } X else { X pScan->flags|= scannableEnd; X uWarning("Unrecognized char '%c' on line %d\n",ch,pScan->lineNum); X token= TOK_END; X } X pScan->token= token; X pScan->lookingAhead= False; X uDEBUG1(DEBUG_TOKENS,"scanned: %s\n",scannerText((unsigned)token)); X uRETURN(token); X} X X/***====================================================================***/ X Xint XscanLineNum(pScan) XScannablePtr pScan; X{ X uENTRY1("scanLineNum(0x%x)\n",pScan); X if (pScan!=NullScannable) { X uRETURN(pScan->lineNum); X } X uRETURN(0); X} END_OF_FILE if test 14546 -ne `wc -c <'./lib/profscan.c'`; then echo shar: \"'./lib/profscan.c'\" unpacked with wrong size! fi # end of './lib/profscan.c' fi echo shar: End of archive 8 \(of 14\). cp /dev/null ark8isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 14 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0