Annotation of 43BSD/usr.lib/libpc/GETNAME.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)GETNAME.c 1.12 10/18/85";
                      4: 
                      5: #include "h00vars.h"
                      6: #include "libpc.h"
                      7: 
                      8: /*
                      9:  * GETNAME - activate a file
                     10:  *
                     11:  * takes a name, name length, element size, and variable
                     12:  * level and returns a pointer to a file structure.
                     13:  *
                     14:  * a new file structure is initialized if necessary.
                     15:  * temporary names are generated, and given
                     16:  * names are blank trimmed.
                     17:  */
                     18: 
                     19: static char *tmpname = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
                     20: 
                     21: struct iorec *
                     22: GETNAME(filep, name, namlim, datasize)
                     23: 
                     24:        register struct iorec   *filep;
                     25:        char                    *name;
                     26:        long                    namlim;
                     27:        long                    datasize;
                     28: {
                     29:        int             maxnamlen = namlim;
                     30:        struct iorec    *prev;
                     31:        struct iorec    *next;
                     32:        register int    cnt;
                     33:        struct iorec    locvar;
                     34: 
                     35:        if (filep->fblk < MAXFILES && _actfile[filep->fblk] == filep) {
                     36:                /* 
                     37:                 * Close and immediately reactivate the file.
                     38:                 */
                     39:                PFCLOSE(filep, name != NULL);
                     40:                _actfile[filep->fblk] = filep;
                     41:                filep->funit &= (TEMP | FTEXT);
                     42:        } else {
                     43:                /*
                     44:                 * Initialize a new file record.
                     45:                 */
                     46:                filep->funit = 0;
                     47:                if (datasize == 0) {
                     48:                        filep->funit |= FTEXT;
                     49:                        datasize = 1;
                     50:                }
                     51:                filep->fsize = datasize;
                     52:                filep->fbuf = 0;
                     53:                filep->lcount = 0;
                     54:                filep->llimit = 0x7fffffff;
                     55:                filep->fileptr = &filep->window[0];
                     56:                *filep->fname = NULL;
                     57:                /*
                     58:                 * Check to see if file is global, or allocated in
                     59:                 * the stack by checking its address against the
                     60:                 * address of one of our routine's local variables.
                     61:                 */
                     62:                if (filep < &locvar)
                     63:                        filep->flev = GLVL;
                     64:                else
                     65:                        filep->flev = filep;
                     66:                for (_filefre++; _filefre < MAXFILES; _filefre++)
                     67:                        if (_actfile[_filefre] == FILNIL)
                     68:                                goto gotone;
                     69:                for (_filefre = PREDEF + 1; _filefre < MAXFILES; _filefre++)
                     70:                        if (_actfile[_filefre] == FILNIL)
                     71:                                goto gotone;
                     72:                ERROR("File table overflow\n");
                     73:                return;
                     74: gotone:
                     75:                filep->fblk = _filefre;
                     76:                _actfile[_filefre] = filep;
                     77:                /*
                     78:                 * Link the new record into the file chain.
                     79:                 */
                     80:                prev = (struct iorec *)&_fchain;
                     81:                next = _fchain.fchain;
                     82:                while (filep->flev > next->flev) {
                     83:                        prev = next;
                     84:                        next = next->fchain;
                     85:                }
                     86:                if (filep->flev == GLVL)
                     87:                        /*
                     88:                         * Must order global files so that all dynamic files
                     89:                         * within a record are grouped together.
                     90:                         */
                     91:                        while ((next != FILNIL) &&
                     92:                               (next->flev == GLVL) &&
                     93:                               ((struct iorec *)filep > next)) {
                     94:                                prev = next;
                     95:                                next = next->fchain;
                     96:                        }
                     97:                filep->fchain = next;
                     98:                prev->fchain = filep;
                     99:        }
                    100:        /*
                    101:         * Get the filename associated with the buffer.
                    102:         */
                    103:        if (name == NULL) {
                    104:                if (*filep->fname != NULL) {
                    105:                        return(filep);
                    106:                }
                    107:                /*
                    108:                 * No name given and no previous name, so generate
                    109:                 * a new one of the form #tmp.xxxxxx.
                    110:                 */
                    111:                filep->funit |= TEMP;
                    112:                sprintf(filep->fname, "#tmp.%c%d", tmpname[filep->fblk],
                    113:                    getpid());
                    114:                filep->pfname = &filep->fname[0];
                    115:                return(filep);
                    116:        }
                    117:        /*
                    118:         * Trim trailing blanks, and insure that the name 
                    119:         * will fit into the file structure.
                    120:         */
                    121:        for (cnt = 0; cnt < maxnamlen; cnt++)
                    122:                if (name[cnt] == '\0' || name[cnt] == ' ')
                    123:                        break;
                    124:        if (cnt >= NAMSIZ) {
                    125:                ERROR("%s: File name too long\n", name);
                    126:                return;
                    127:        }
                    128:        maxnamlen = cnt;
                    129:        filep->funit &= ~TEMP;
                    130:        /*
                    131:         * Put the new name into the structure.
                    132:         */
                    133:        for (cnt = 0; cnt < maxnamlen; cnt++)
                    134:                filep->fname[cnt] = name[cnt];
                    135:        filep->fname[cnt] = '\0';
                    136:        filep->pfname = &filep->fname[0];
                    137:        return(filep);
                    138: }

unix.superglobalmegacorp.com

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