#include "X.h" #include "Xmd.h" #include "os.h" #include "osstruct.h" #include "misc.h" #include "font.h" #define NEED←EVENTS #include "Xproto.h" #include "inputstr.h" #include "opaque.h" #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <strings.h> extern char *GetHeap(); long MaxClients = 128; Bool clientsDoomed = FALSE; mesa void XConnectionMgr←CreateWellKnownSockets(); mesa void XConnectionMgr←CloseDownConnection(); mesa void XConnectionMgr←ReallyMarkConnectionClosed(); mesa void XConnectionMgr←OnlyListenToOneClient(); mesa void XConnectionMgr←ListenToAllClients(); mesa FID XFileIO←FiOpenForRead(); mesa int XFileIO←FiRead(); mesa void XFileIO←FiClose(); mesa void XFileIO←SetDefaultFontPath(); mesa void XFileIO←SetFontPath(); mesa int XFileIO←ExpandFontName(); mesa FontPathPtr XFileIO←ExpandFontNamePattern(); mesa int * XConnectionMgr←ReadRequestFromClient(); mesa int XConnectionMgr←WriteToClient(); mesa void XConnectionMgr←WaitForSomething(); mesa void Runtime←Interrupt(); mesa long XMKDriver←getTimeInMillis(); char *index(); static FontPathRec fontSearchList; extern char *defaultFontPath; void CreateWellKnownSockets() { XConnectionMgr←CreateWellKnownSockets(); } Bool CloseDownConnection(client) ClientPtr client; { XConnectionMgr←CloseDownConnection(client); } void ReallyMarkConnectionClosed(client) ClientPtr client; { XConnectionMgr←ReallyMarkConnectionClosed(client); } void OnlyListenToOneClient(client) ClientPtr client; { XConnectionMgr←OnlyListenToOneClient(client); } void ListenToAllClients() { XConnectionMgr←ListenToAllClients(); } FID FiOpenForRead(lenn, name) int lenn; char *name; { char *newname; FID fid; newname = name; if (name[lenn-1] != '\0') { newname = (char *)Xalloc(lenn+1); strncpy(newname,name,lenn); newname[lenn] = '\0'; } fid = XFileIO←FiOpenForRead(name); if(name != newname) Xfree(newname); return(fid); } int FiRead(buf, itemsize, nitems, fid) char *buf; unsigned itemsize; unsigned nitems; FID fid; { if ( (long)buf & 0x80000000L ) return(XFileIO←FiRead((int *)buf, itemsize, nitems, fid)); else return(XFileIO←FiRead(buf, itemsize, nitems, fid)); } int FiClose(fid) FID fid; { XFileIO←FiClose(fid); return(0); } void SetDefaultFontPath(name) char *name; { int len = strlen( name); XFileIO←SetDefaultFontPath(name); fontSearchList.npaths = 1; fontSearchList.length = (int *)Xalloc(sizeof(int)); fontSearchList.length[0] = len; fontSearchList.paths = (char **)Xalloc(sizeof(char *)); fontSearchList.paths[0] = (char *)Xalloc(len + 1); bcopy(name, fontSearchList.paths[0], len); fontSearchList.paths[0][len] = '\0'; } void FreeFontRecord(pFP) FontPathPtr pFP; { int i; for(i=0;i<pFP->npaths;i++) Xfree(pFP->paths[i]); Xfree(pFP->paths); Xfree(pFP->length); } /* * pnames is a pointer to counted strings, each string long word * aligned */ void SetFontPath( npaths, totalLength, countedStrings) int npaths; int totalLength; char * countedStrings; { int i; char * bufPtr = countedStrings; char n; FreeFontRecord(&fontSearchList); if (npaths == 0) { SetDefaultFontPath(defaultFontPath); } else { fontSearchList.length = (int *)Xalloc(npaths * sizeof(int)); fontSearchList.paths = (char **)Xalloc(npaths * sizeof(char *)); for (i=0; i<npaths; i++) { n = *bufPtr++; fontSearchList.length[i] = n; fontSearchList.paths[i] = (char *) Xalloc(n + 1); bcopy(bufPtr, fontSearchList.paths[i], n); fontSearchList.paths[i][n] = '\0'; bufPtr += n; } fontSearchList.npaths = npaths; XFileIO←SetFontPath(&fontSearchList); } } /* * return value is length in bytes */ FontPathPtr GetFontPath() { return( & fontSearchList); } /* * used by OpenFont * * returns length of ppathname. * may set *ppPathname to fname; */ int ExpandFontName( ppPathname, lenfname, fname) char **ppPathname; int lenfname; char *fname; { int in; char *fullname = NULL; char *lowername; char *pch; int len; lowername = (char *) Xalloc(lenfname + 5); bzero(lowername, lenfname + 5); strncpy(lowername, fname, lenfname); /* if the name doesn't end in .snf, append that to the name */ if((pch = index(lowername, '.')) == (char *)NULL || *(pch + 1) != 's' || *(pch + 2) != 'n' || *(pch + 3) != 'f' || pch + 4 - lowername != lenfname) { strcat(lowername, ".snf"); lenfname += 4; } /* * reduce to lower case only */ for ( in=0; in<lenfname; in++) if ( isupper( lowername[in])) lowername[in] = tolower( lowername[in]); else if (lowername[in] == '/') lowername[in] = '>'; if (lowername[0] == '>') lowername[0] = '<'; len = XFileIO←ExpandFontName(lowername, ppPathname, GetHeap()); Xfree(lowername); return(len); } /******************************************************************* * ExpandFontPathPattern * * Returns a FontPathPtr with at most max-names, of names of fonts matching * the pattern. The pattern should use the ASCII encoding, and * upper/lower case does not matter. In the pattern, the '?' character * (octal value 77) will match any single character, and the character '*' * (octal value 52) will match any number of characters. The return * names are in lower case. * * Used only by protocol request ListFonts *******************************************************************/ FontPathPtr ExpandFontNamePattern(lenpat, countedPattern, maxNames) int lenpat; char *countedPattern; int maxNames; { char *pattern; int i; FontPathPtr fpr; /* * make a pattern which is guaranteed NULL-terminated */ pattern = (char *) ALLOCATE←LOCAL( lenpat+1); strncpy( pattern, countedPattern, lenpat); pattern[lenpat] = '\0'; if(pattern[0] == '/') pattern[0] = '<'; for ( i = 0; i<lenpat; i++ ) if ( pattern[i] == '/' ) pattern[i] = '>'; else if ( pattern[i] == '?' ) pattern[i] = '#'; fpr = XFileIO←ExpandFontNamePattern(pattern, maxNames, GetHeap()); DEALLOCATE←LOCAL(pattern); return(fpr); } char * ReadRequestFromClient(who, status, oldbuf) ClientPtr who; int *status; char *oldbuf; { if( (long)oldbuf & 0x80000000L ) return((char *)XConnectionMgr←ReadRequestFromClient((long)who->index, status, (int *)oldbuf)); else return((char *)XConnectionMgr←ReadRequestFromClient((long)who->index, status, oldbuf)); } int WriteToClient(who, remaining, buf) ClientPtr who; int remaining; char *buf; { if ( (long)buf & 0x80000000L ) return(XConnectionMgr←WriteToClient((long)who->index, remaining, (int *)buf)); else return(XConnectionMgr←WriteToClient((long)who->index, remaining, buf)); } int WaitForSomething(pClientsReady, nready, pNewClients, nnew) ClientPtr pClientsReady; int *nready; ClientPtr pNewClients; int *nnew; { XConnectionMgr←WaitForSomething(pClientsReady, nready, pNewClients, nnew); } int OsLookupColor(screen, name, len, pred, pgreen, pblue) int screen; char *name; int len; unsigned short *pred, *pgreen, *pblue; { return(0); } void OsInit() { } HangUp() { Runtime←Interrupt(); } Notice() { } ProcessCommandLine(argc, argv) int argc; char *argv[]; { } bcopy(src, dst, length) char *src, *dst; int length; { register int i; if(!((long)src & 0x80000000L)) src = (char *)((((long)src)<<1)|0x80000000L); if(!((long)dst & 0x80000000L)) dst = (char *)((((long)dst)<<1)|0x80000000L); for(i=0; i<length; i++) { *dst = *src; dst++; src++; } } bzero(b, length) char *b; int length; { int i; if(!((long)b & 0x80000000L)) b = (char *)((((long)b)<<1)|0x80000000L); for(i=0; i<length; i++) *b++ = (char)0; } char * index(s, c) char *s, c; { while( (*s) && (*s != c ) ) s++ ; return(*s ? s : (char *)NULL ); } int ffs(i) long i; { int count = 1; do { if(i&1L) return(count); i = i>>1; } while(count++ < 32); return(0); } long GetTimeInMillis() { return(XMKDriver←getTimeInMillis()); } long random() { return( GetTimeInMillis()); } /* void ErrorF(s1,x1,x2,x3,x4,x5) char *s1; long x1, x2, x3, x4, x5; { Runtime←Interrupt(); printf(s1,x1,x2,x3,x4,x5); } */ insque(elem, pred) QdEventPtr elem, pred; { elem->forw = pred->forw; elem->back = pred; pred->forw = elem; if( elem->forw != NULL ) elem->forw->back = elem; } remque(elem) QdEventPtr elem; { if( elem->back != NULL ) elem->back->forw = elem->forw; if( elem->forw != NULL ) elem->forw->back = elem->back; } ResetHosts() { return(0); } AddHost() { return(0); } RemoveHost() { return(0); } GetHosts() { return(0); } ChangeAccessControl() { return(0); } pointer Xrealloc(ptr, amount) char *ptr; int amount; { char *ret; int *tmp; if(ptr == NULL) return(malloc(amount)); else { ret = realloc(ptr, amount); if( (long)ret & 0x80000000L ) return(ret); else { tmp = (int *)((long)ret); return((char *)(tmp)); } } } Xfree(ptr) char *ptr; { if(ptr!=NULL) free(ptr); } pointer Xalloc(size) int size; { return(malloc(size)); }