|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)GETNAME.c 1.1 10/29/80"; ! 4: ! 5: #include "h00vars.h" ! 6: #include "h01errs.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: struct iorec * ! 20: GETNAME(filep, name, maxnamlen, datasize) ! 21: ! 22: register struct iorec *filep; ! 23: char *name; ! 24: int maxnamlen; ! 25: int datasize; ! 26: { ! 27: struct iorec *prev; ! 28: struct iorec *next; ! 29: register int cnt; ! 30: struct iorec locvar; ! 31: extern char *mktemp(); ! 32: ! 33: if (filep->fblk >= MAXFILES || _actfile[filep->fblk] != filep) { ! 34: /* ! 35: * initialize a new filerecord ! 36: */ ! 37: filep->funit = 0; ! 38: if (datasize == 0) { ! 39: filep->funit |= FTEXT; ! 40: datasize = 1; ! 41: } ! 42: filep->fsize = datasize; ! 43: filep->fbuf = 0; ! 44: filep->lcount = 0; ! 45: filep->llimit = 0x7fffffff; ! 46: filep->fileptr = &filep->window[0]; ! 47: /* ! 48: * check to see if file is global, or allocated in ! 49: * the stack by checking its address against the ! 50: * address of one of our routine's local variables. ! 51: */ ! 52: if (filep < &locvar) ! 53: filep->flev = GLVL; ! 54: else ! 55: filep->flev = filep; ! 56: do { ! 57: if (++_filefre == MAXFILES) ! 58: _filefre = PREDEF + 1; ! 59: } while (_actfile[_filefre] != FILNIL); ! 60: filep->fblk = _filefre; ! 61: _actfile[_filefre] = filep; ! 62: /* ! 63: * link the newrecord into the file chain ! 64: */ ! 65: prev = (struct iorec *)&_fchain; ! 66: next = _fchain.fchain; ! 67: while (filep->flev > next->flev) { ! 68: prev = next; ! 69: next = next->fchain; ! 70: } ! 71: filep->fchain = next; ! 72: prev->fchain = filep; ! 73: } else { ! 74: if (filep->funit & FDEF) { ! 75: filep->funit &= (TEMP | FTEXT); ! 76: } else { ! 77: /* ! 78: * have a previous buffer, close associated file ! 79: */ ! 80: fclose(filep->fbuf); ! 81: if (ferror(filep->fbuf)) { ! 82: ERROR(ECLOSE, filep->pfname); ! 83: return; ! 84: } ! 85: /* ! 86: * renamed temporary files are discarded ! 87: */ ! 88: if ((filep->funit & TEMP) && ! 89: (name != NULL) && ! 90: (unlink(filep->pfname))) { ! 91: ERROR(EREMOVE, filep->pfname); ! 92: return; ! 93: } ! 94: filep->funit &= (TEMP | FTEXT); ! 95: } ! 96: } ! 97: /* ! 98: * get the filename associated with the buffer ! 99: */ ! 100: if (name == NULL) { ! 101: if (*filep->fname != NULL) { ! 102: return(filep); ! 103: } ! 104: /* ! 105: * no name given and no previous name, so generate ! 106: * a new one of the form tmp.xxxxxx ! 107: */ ! 108: filep->funit |= TEMP; ! 109: name = mktemp("tmp.XXXXXX"); ! 110: maxnamlen = 10; ! 111: } else { ! 112: /* ! 113: * trim trailing blanks, and insure that the name ! 114: * will fit into the file structure ! 115: */ ! 116: for (cnt = 0; cnt < maxnamlen; cnt++) ! 117: if (name[cnt] == '\0' || name[cnt] == ' ') ! 118: break; ! 119: if (cnt >= NAMSIZ) { ! 120: ERROR(ENAMESIZE, name); ! 121: return; ! 122: } ! 123: maxnamlen = cnt; ! 124: filep->funit &= ~TEMP; ! 125: } ! 126: /* ! 127: * put the new name into the structure ! 128: */ ! 129: for (cnt = 0; cnt < maxnamlen; cnt++) ! 130: filep->fname[cnt] = name[cnt]; ! 131: filep->fname[cnt] = '\0'; ! 132: filep->pfname = &filep->fname[0]; ! 133: return(filep); ! 134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.