Annotation of researchv9/X11/src/X.V11R1/server/os/v9/filenames.c, revision 1.1

1.1     ! root        1: /***********************************************************
        !             2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
        !             3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
        !             4: 
        !             5:                         All Rights Reserved
        !             6: 
        !             7: Permission to use, copy, modify, and distribute this software and its 
        !             8: documentation for any purpose and without fee is hereby granted, 
        !             9: provided that the above copyright notice appear in all copies and that
        !            10: both that copyright notice and this permission notice appear in 
        !            11: supporting documentation, and that the names of Digital or MIT not be
        !            12: used in advertising or publicity pertaining to distribution of the
        !            13: software without specific, written prior permission.  
        !            14: 
        !            15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
        !            16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
        !            17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
        !            18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
        !            19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
        !            20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
        !            21: SOFTWARE.
        !            22: 
        !            23: ******************************************************************/
        !            24: /* $Header: filenames.c,v 1.27 87/09/08 08:50:26 swick Exp $ */
        !            25: 
        !            26: #include <stdio.h>
        !            27: #include <sys/types.h>
        !            28: #include <ndir.h>
        !            29: #include <ctype.h>
        !            30: #include <strings.h>
        !            31: #include "misc.h"
        !            32: #include "resource.h"
        !            33: #include "osstruct.h"
        !            34: #include "X.h"
        !            35: #include "Xmd.h"
        !            36: #include "opaque.h"
        !            37: 
        !            38: extern char *defaultFontPath;
        !            39: 
        !            40: /* The fontSearchList should contain zero paths to start with. */
        !            41: static FontPathRec fontSearchList = { 0, 0, 0};
        !            42: 
        !            43: /*
        !            44:  * description
        !            45:  *     DDX interface routines
        !            46:  *
        !            47:  * caveats:
        !            48:  *     These are OS-dependent to the extent that they assume pathnames contain
        !            49:  *     no NULL characters.
        !            50:  */
        !            51: 
        !            52: 
        !            53: /*
        !            54:  * This is called from main.c, not in response to a protocol request, so it
        !            55:  * may take a null-terminated string as argument.
        !            56:  */
        !            57: 
        !            58: void
        !            59: SetDefaultFontPath( name)
        !            60:     char *     name;
        !            61: {
        !            62:     int                len = strlen( name);
        !            63:     int i;
        !            64: /* If there is a previous fontSearchList, free the space that it contains. */
        !            65: 
        !            66:     for (i=0; i<fontSearchList.npaths; i++)
        !            67:         Xfree(fontSearchList.paths[i]);
        !            68:     Xfree(fontSearchList.paths);
        !            69:     Xfree(fontSearchList.length);
        !            70: 
        !            71:     if (name[len-1] != '/')
        !            72:         len++;
        !            73:     fontSearchList.npaths = 1;
        !            74:     fontSearchList.length = (int *)Xalloc(sizeof(int));
        !            75:     fontSearchList.length[0] = len;
        !            76:     fontSearchList.paths = (char **)Xalloc(sizeof(char *));
        !            77:     fontSearchList.paths[0] = (char *)Xalloc(len + 1);
        !            78:     bcopy(name, fontSearchList.paths[0], len);
        !            79:     if (name[strlen(name)-1] != '/')
        !            80:         fontSearchList.paths[0][len-1] = '/';
        !            81:     fontSearchList.paths[0][len] = '\0';        
        !            82: }
        !            83: 
        !            84: 
        !            85: void
        !            86: FreeFontRecord(pFP)
        !            87:     FontPathPtr pFP;
        !            88: {
        !            89:     int i;
        !            90:     for (i=0; i<pFP->npaths; i++)
        !            91:         Xfree(pFP->paths[i]);
        !            92:     Xfree(pFP->paths);
        !            93:     Xfree(pFP->length);
        !            94:     Xfree(pFP);
        !            95: }
        !            96: 
        !            97: /*
        !            98:  * pnames is a pointer to counted strings, each string long word
        !            99:  * aligned
        !           100:  */
        !           101: void
        !           102: SetFontPath( npaths, totalLength, countedStrings)
        !           103:     int                npaths;
        !           104:     int                totalLength;
        !           105:     char *     countedStrings;
        !           106: {
        !           107:     int i;
        !           108:     char * bufPtr = countedStrings;
        !           109:     char n, len;
        !           110: 
        !           111:     if (npaths == 0)
        !           112:     {
        !           113:        SetDefaultFontPath(defaultFontPath); /* this frees old paths */
        !           114:     }
        !           115:     else
        !           116:     {
        !           117:         for (i=0; i<fontSearchList.npaths; i++)
        !           118:            Xfree(fontSearchList.paths[i]);
        !           119:        Xfree(fontSearchList.paths);
        !           120:        Xfree(fontSearchList.length);
        !           121: 
        !           122:         fontSearchList.length = (int *)Xalloc(npaths * sizeof(int));
        !           123:         fontSearchList.paths = (char **)Xalloc(npaths * sizeof(char *));
        !           124:        for (i=0; i<npaths; i++)
        !           125:         {
        !           126:            n = len = *bufPtr;
        !           127:             if (bufPtr[n] != '/')
        !           128:                 len++;
        !           129:            fontSearchList.length[i] = len;
        !           130:            fontSearchList.paths[i] = (char *) Xalloc(len + 1);
        !           131:            bcopy(bufPtr+1, fontSearchList.paths[i], n);
        !           132:             if (bufPtr[n] != '/')
        !           133:                 fontSearchList.paths[i][n] = '/';
        !           134:            fontSearchList.paths[i][len] = '\0';
        !           135:            bufPtr += n + 1;
        !           136:        }
        !           137:        fontSearchList.npaths = npaths;
        !           138:     }
        !           139: }
        !           140: 
        !           141: 
        !           142: /*
        !           143:  * return value is length in bytes 
        !           144:  */
        !           145: 
        !           146: FontPathPtr
        !           147: GetFontPath()
        !           148: {
        !           149:     return( & fontSearchList);
        !           150: }
        !           151: 
        !           152: static int
        !           153: match( pat, string)
        !           154:     char       *pat;
        !           155:     char       *string;
        !           156: {
        !           157:     int        ip;
        !           158:     Bool matched;
        !           159: 
        !           160:     for ( ip=0; pat[ip]!='\0'; ip++)
        !           161:     {
        !           162:         if ( pat[ip] == '*')
        !           163:        {
        !           164:            matched = FALSE;
        !           165:            while (! matched )   /* find where pat & string start to match */
        !           166:            {
        !           167:                if ( string[ip] == '\0')
        !           168:                {
        !           169:                    if (pat[ip+1] == '\0')
        !           170:                        return TRUE;
        !           171:                    break;
        !           172:                }
        !           173:                while ( ! (matched = match( &pat[ip+1], &string[ip])))
        !           174:                {
        !           175:                    string++;
        !           176:                    if ( string[0] == '\0') 
        !           177:                        return FALSE;
        !           178:                }
        !           179:            }
        !           180:             if (matched)
        !           181:                 return TRUE;
        !           182:        }
        !           183:         else if (string[ip] == '\0')
        !           184:             return FALSE;
        !           185:        else if (( pat[ip] != '?') && (pat[ip] != string[ip]))
        !           186:             return FALSE;
        !           187:     }
        !           188:     return TRUE;
        !           189: }
        !           190: 
        !           191: 
        !           192: /*
        !           193:  * Make further assumption that '/' is the pathname separator.
        !           194:  * Still assume NULL ends strings.
        !           195:  */
        !           196: /*
        !           197:  * used by OpenFont
        !           198:  *
        !           199:  *  returns length of ppathname.
        !           200:  *  may set *ppPathname to fname;
        !           201:  */
        !           202: 
        !           203: int
        !           204: ExpandFontName( ppPathname, lenfname, fname)
        !           205:     char       **ppPathname;
        !           206:     int                lenfname;
        !           207:     char       *fname;
        !           208: {
        !           209:     int                in;
        !           210:     char       *fullname = NULL;
        !           211:     char       *lowername;
        !           212:     char       *pch;
        !           213: 
        !           214:     lowername = (char *) Xalloc(lenfname + 5);
        !           215:     bzero(lowername, lenfname + 5);
        !           216:     strncpy(lowername, fname, lenfname);
        !           217:     /* if the name doesn't end in .snf, append that to the name */
        !           218:     if((pch = index(lowername, '.')) == NULL || 
        !           219:      *(pch + 1) != 's' ||
        !           220:      *(pch + 2) != 'n' ||
        !           221:      *(pch + 3) != 'f' ||
        !           222:      pch + 4 - lowername != lenfname)
        !           223:     {
        !           224:        strcat(lowername, ".snf");
        !           225:        lenfname += 4;
        !           226:     }
        !           227:        
        !           228: 
        !           229:     /*
        !           230:      * reduce to lower case only
        !           231:      */
        !           232:     for ( in=0; in<lenfname; in++)
        !           233:        if ( isupper( lowername[in]))
        !           234:            lowername[in] = tolower( lowername[in]);
        !           235:     
        !           236:     if (lowername[0] == '/')
        !           237:     {
        !           238:        if ( access( lowername, R_OK) == 0)
        !           239:        {
        !           240:            *ppPathname = lowername;
        !           241:            return lenfname;
        !           242:        }
        !           243:     }
        !           244:     else       
        !           245:     {
        !           246:        int             n, ifp;
        !           247: 
        !           248:        for ( ifp=0; ifp<fontSearchList.npaths; ifp++)
        !           249:        {
        !           250:            fullname = (char *) Xrealloc( fullname, 
        !           251:                          n = fontSearchList.length[ifp] + lenfname + 1);
        !           252:            strcpy( fullname, fontSearchList.paths[ifp]);
        !           253:            strncat( fullname, lowername, lenfname);
        !           254:            fullname[n-1] = '\0';
        !           255:            if ( access( fullname, R_OK) == 0)
        !           256:            {
        !           257:                *ppPathname = fullname;
        !           258:                Xfree(lowername);
        !           259:                return strlen( fullname);
        !           260:            }
        !           261:        }
        !           262:     }
        !           263:     Xfree(lowername);
        !           264:     Xfree(fullname);
        !           265:     *ppPathname = NULL;
        !           266:     return 0;
        !           267: }
        !           268: 
        !           269: static void
        !           270: SearchDirectory(dname, pat, pFP, limit)
        !           271:     char *dname;
        !           272:     char *pat;
        !           273:     FontPathPtr pFP;
        !           274:     int limit;
        !           275: {
        !           276:     DIR                *dp;
        !           277:     struct direct *nextdent;
        !           278:     int                n, i;
        !           279: 
        !           280:     dp = opendir( dname);  
        !           281:     if (dp == NULL)
        !           282:         return ;
        !           283:     i = pFP->npaths;
        !           284:     while ( (nextdent = readdir( dp)) != NULL) 
        !           285:     { 
        !           286:        if (i >= limit)  
        !           287:            break ;
        !           288:        if ( match( pat, nextdent->d_name))  
        !           289:        {  
        !           290:            pFP->length = (int *)Xrealloc(pFP->length, (i+1)*sizeof(int));
        !           291:            pFP->paths = (char **)Xrealloc(pFP->paths, (i+1)*sizeof(char *));  
        !           292:            pFP->length[i] = n = strlen( nextdent->d_name);  
        !           293:            pFP->paths[i] = (char *) Xalloc(n);
        !           294:            bcopy(nextdent->d_name, pFP->paths[i], n);
        !           295:            i = ++pFP->npaths;
        !           296:        }
        !           297:     }
        !           298:     closedir(dp);
        !           299: }
        !           300: 
        !           301: /*******************************************************************
        !           302:  *  ExpandFontPathPattern
        !           303:  *
        !           304:  *     Returns a FontPathPtr with at most max-names, of names of fonts
        !           305:  *      matching
        !           306:  *     the pattern.  The pattern should use the ASCII encoding, and
        !           307:  *      upper/lower case does not matter.  In the pattern, the '?' character
        !           308:  *     (octal value 77) will match any single character, and the character '*'
        !           309:  *     (octal value 52) will match any number of characters.  The return
        !           310:  *     names are in lower case.
        !           311:  *
        !           312:  *      Used only by protocol request ListFonts
        !           313:  *******************************************************************/
        !           314: 
        !           315: 
        !           316: FontPathPtr
        !           317: ExpandFontNamePattern(lenpat, countedPattern, maxNames)
        !           318:     int                lenpat;
        !           319:     char       *countedPattern;
        !           320:     int                maxNames;
        !           321: {
        !           322:     char       *pattern;
        !           323:     int                i;
        !           324:     FontPathPtr        fpr;
        !           325: 
        !           326: 
        !           327:     fpr = (FontPathPtr)Xalloc(sizeof(FontPathRec));
        !           328:     fpr->npaths = 0;
        !           329:     fpr->length = (int *)NULL;
        !           330:     fpr->paths = (char **)NULL;
        !           331: 
        !           332:     /*
        !           333:      * make a pattern which is guaranteed NULL-terminated
        !           334:      */
        !           335:     pattern = (char *) ALLOCATE_LOCAL( lenpat + 1 + 4);
        !           336:     strncpy( pattern, countedPattern, lenpat);
        !           337:     pattern[lenpat] = '\0';
        !           338:     strcat(pattern, ".snf");
        !           339: 
        !           340:     /*
        !           341:      * find last '/' in pattern, if any
        !           342:      */
        !           343:     for ( i=lenpat-1; i>=0; i--)
        !           344:        if ( pattern[i] == '/')
        !           345:            break;
        !           346: 
        !           347:     if ( i >= 0)               /* pattern contains its own dir prefix */
        !           348:     {
        !           349:        pattern[i] = '\0';      /* break pattern at the last path separator */
        !           350:         SearchDirectory(pattern, &pattern[i+1], fpr, maxNames);
        !           351:     }
        !           352:     else
        !           353:     {
        !           354:         /*
        !           355:         * for each prefix in the font path list
        !           356:         */
        !           357:        for ( i=0; i<fontSearchList.npaths; i++)
        !           358:        {
        !           359:            SearchDirectory( fontSearchList.paths[i], pattern, fpr, maxNames);
        !           360:            if (fpr->npaths >= maxNames)
        !           361:                break;
        !           362:        }
        !           363:     }
        !           364:     DEALLOCATE_LOCAL(pattern);
        !           365:     /*
        !           366:      * logically strip the ".snf" off the end since the client wants font
        !           367:      * names and not file names.
        !           368:      */
        !           369:     for (i = 0; i < fpr->npaths; i++)
        !           370:        fpr->length[i] -= 4;
        !           371:     return fpr;
        !           372: }
        !           373: 
        !           374: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.