v05i058: Xrooms -- A Rooms implementation for X, Part08/14
Kent Landfield
kent at ssbell.IMD.Sterling.COM
Mon Jan 15 17:17:04 AEST 1990
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 at 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
More information about the Comp.sources.x
mailing list