Commit | Line | Data |
---|---|---|
4c60c82b KM |
1 | /* Copyright (c) 1979 Regents of the University of California */ |
2 | ||
31cef89c | 3 | static char sccsid[] = "@(#)GETNAME.c 1.1 10/29/80"; |
4c60c82b KM |
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 | } |