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