|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1979 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)GETNAME.c 1.13 (Berkeley) 4/9/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include "h00vars.h" ! 25: #include "libpc.h" ! 26: ! 27: /* ! 28: * GETNAME - activate a file ! 29: * ! 30: * takes a name, name length, element size, and variable ! 31: * level and returns a pointer to a file structure. ! 32: * ! 33: * a new file structure is initialized if necessary. ! 34: * temporary names are generated, and given ! 35: * names are blank trimmed. ! 36: */ ! 37: ! 38: static char *tmpname = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; ! 39: ! 40: struct iorec * ! 41: GETNAME(filep, name, namlim, datasize) ! 42: ! 43: register struct iorec *filep; ! 44: char *name; ! 45: long namlim; ! 46: long datasize; ! 47: { ! 48: int maxnamlen = namlim; ! 49: struct iorec *prev; ! 50: struct iorec *next; ! 51: register int cnt; ! 52: struct iorec locvar; ! 53: ! 54: if (filep->fblk < MAXFILES && _actfile[filep->fblk] == filep) { ! 55: /* ! 56: * Close and immediately reactivate the file. ! 57: */ ! 58: PFCLOSE(filep, name != NULL); ! 59: _actfile[filep->fblk] = filep; ! 60: filep->funit &= (TEMP | FTEXT); ! 61: } else { ! 62: /* ! 63: * Initialize a new file record. ! 64: */ ! 65: filep->funit = 0; ! 66: if (datasize == 0) { ! 67: filep->funit |= FTEXT; ! 68: datasize = 1; ! 69: } ! 70: filep->fsize = datasize; ! 71: filep->fbuf = 0; ! 72: filep->lcount = 0; ! 73: filep->llimit = 0x7fffffff; ! 74: filep->fileptr = &filep->window[0]; ! 75: *filep->fname = NULL; ! 76: /* ! 77: * Check to see if file is global, or allocated in ! 78: * the stack by checking its address against the ! 79: * address of one of our routine's local variables. ! 80: */ ! 81: if (filep < &locvar) ! 82: filep->flev = GLVL; ! 83: else ! 84: filep->flev = filep; ! 85: for (_filefre++; _filefre < MAXFILES; _filefre++) ! 86: if (_actfile[_filefre] == FILNIL) ! 87: goto gotone; ! 88: for (_filefre = PREDEF + 1; _filefre < MAXFILES; _filefre++) ! 89: if (_actfile[_filefre] == FILNIL) ! 90: goto gotone; ! 91: ERROR("File table overflow\n"); ! 92: return; ! 93: gotone: ! 94: filep->fblk = _filefre; ! 95: _actfile[_filefre] = filep; ! 96: /* ! 97: * Link the new record into the file chain. ! 98: */ ! 99: prev = (struct iorec *)&_fchain; ! 100: next = _fchain.fchain; ! 101: while (filep->flev > next->flev) { ! 102: prev = next; ! 103: next = next->fchain; ! 104: } ! 105: if (filep->flev == GLVL) ! 106: /* ! 107: * Must order global files so that all dynamic files ! 108: * within a record are grouped together. ! 109: */ ! 110: while ((next != FILNIL) && ! 111: (next->flev == GLVL) && ! 112: ((struct iorec *)filep > next)) { ! 113: prev = next; ! 114: next = next->fchain; ! 115: } ! 116: filep->fchain = next; ! 117: prev->fchain = filep; ! 118: } ! 119: /* ! 120: * Get the filename associated with the buffer. ! 121: */ ! 122: if (name == NULL) { ! 123: if (*filep->fname != NULL) { ! 124: return(filep); ! 125: } ! 126: /* ! 127: * No name given and no previous name, so generate ! 128: * a new one of the form #tmp.xxxxxx. ! 129: */ ! 130: filep->funit |= TEMP; ! 131: sprintf(filep->fname, "#tmp.%c%d", tmpname[filep->fblk], ! 132: getpid()); ! 133: filep->pfname = &filep->fname[0]; ! 134: return(filep); ! 135: } ! 136: /* ! 137: * Trim trailing blanks, and insure that the name ! 138: * will fit into the file structure. ! 139: */ ! 140: for (cnt = 0; cnt < maxnamlen; cnt++) ! 141: if (name[cnt] == '\0' || name[cnt] == ' ') ! 142: break; ! 143: if (cnt >= NAMSIZ) { ! 144: ERROR("%s: File name too long\n", name); ! 145: return; ! 146: } ! 147: maxnamlen = cnt; ! 148: filep->funit &= ~TEMP; ! 149: /* ! 150: * Put the new name into the structure. ! 151: */ ! 152: for (cnt = 0; cnt < maxnamlen; cnt++) ! 153: filep->fname[cnt] = name[cnt]; ! 154: filep->fname[cnt] = '\0'; ! 155: filep->pfname = &filep->fname[0]; ! 156: return(filep); ! 157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.