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