BSD 1 development
[unix-history] / px / 30getname.s
CommitLineData
4e754410
BJ
1/
2/ getname
3/
4/ takes the width of a string in r3
5/ returns a pointer to a file structure in r0
6/
7/ there should be a string on the stack
8/ of length the contents of r3 on top of
9/ a pointer to the file variable
10/
11/ a new file structure is allocated if needed
12/ temporary names are generated, and given
13/ names are blank trimmed
14/
15/ if a new file buffer is allocated, the address
16/ is stored throught the file variable pointer
17/
18/
19getname:
20 mov (sp)+,reta
21 mov sp,r2
22 mov r3,r1
23 inc r1
24 bic $1,r1
25 add sp,r1
26 mov (r1)+,r0
27 mov r1,newsp
28 tst (r0)
29 bne gotone
30/
31/ dont have a file struct
32/ so alloc a new one
33/
34 mov r0,-(sp)
35 mov (lc),r0
36 bne 1f
37 mov $1,r0
381:
39 add $518.+14.,r0
40 mov r0,-(sp)
41 jsr pc,_alloc
42 tst (sp)+
43 mov r0,518.(r0)
44 add $518.+12.,r0
45 mov (lc)+,(r0)+
46 bne 1f
47 bis $FTEXT,FUNIT(r0)
48 mov $1,FSIZE(r0)
491:
50 mov (sp),FLEV(r0)
51 mov $fchain-FCHAIN,-(sp) / get head of file chain
52 mov fchain,r1 / contents of head of file chain
531:
54 bne 2f / end of the chain?
55 mov (sp)+,r1 / get last chain entry
56 mov r0,FCHAIN(r1) / and stuff the current file in
57 clr FCHAIN(r0) / last entry
58 br 3f
592:
60 cmp FLEV(r1),2(sp) / are we past it yet?
61 beq 3f
62 bhi 2f
63 mov r1,(sp) / advance the chain
64 mov FCHAIN(r1),r1
65 br 1b
662:
67 mov r1,FCHAIN(r0)
68 mov (sp)+,r1 / address of last entry
69 mov r0,FCHAIN(r1) / stuff in the current entry
703:
71 mov r0,*(sp)+
72 br 2f
73/
74/ have a previous buffer
75/ close the associated file
76/
77gotone:
78 tst (lc)+
79 mov (r0),r1
80 mov FUNIT(r1),r0
81 bgt 3f / from name from prog hedr
82 bic $100000,FUNIT(r1)
83 br 1f
843:
85 bit $FWRITE,FUNIT(r1)
86 beq 6f
87 mov r0,-(sp)
88 mov r1,-(sp)
89 mov FBUF(r1),-(sp)
90 jsr pc,_fflush
91 tst (sp)+
92 mov (sp)+,r1
93 mov (sp)+,r0
946:
95 bic $!17,r0
96 sys close
97 bes 9f
98 bit $TEMP,FUNIT(r1)
99 beq 1f
100 tst r3
101 beq 1f
102 mov r0,-(sp)
103 mov r1,-(sp)
104 jsr pc,cleanup
105 mov (sp)+,r1
106 mov (sp)+,r0
1071:
108 bic $![TEMP+FTEXT],FUNIT(r1)
109 mov FBUF(r1),r0
110 clr (r0)+ / clear the getc/putc buffer
111 clr (r0)+
112 clr (r0)+
113 mov r1,r0
114/
115/ get the filename to the
116/ buffer (not necess. easy)
117/
1182:
119 tst r3
120 bne 2f
121/
122/ no name given
123/
124 tst FNAME(r0)
125 beq 1f
126/
127/ no name given and had
128/ a prev name so use it
129/ again
130/
131 mov newsp,sp
132 jmp *reta
1339:
134 mov $ECLOSE,_perrno
135 error ECLOSE
136/
137/ no name given and no
138/ prev name so generate
139/ a new one of the form
140/ "tmp.x"
141/
1421:
143 bis $TEMP,FUNIT(r0)
144 inc nextu
145 movb nextu,tnam+4
146 mov $tnam,r2
147 mov $6.,-(sp)
148 br alname
149/
150/ name given
151/ strip trailing blanks
152/
1532:
154 bic $TEMP,FUNIT(r0)
155 add r3,r2
156 clrb (r2)
1571:
158 cmpb -1(r2),$'
159 bne 1f
160 clrb -(r2)
161 dec r3
162 bne 1b
1631:
164 sub r3,r2
165 inc r3
166 mov r3,-(sp)
167/
168/ save the new name
169/ in dynamic space
170/
171alname:
172 mov r0,r3
173 jsr pc,_alloc
174 mov r0,r1
1751:
176 movb (r2)+,(r0)+
177 bne 1b
178 mov r1,r2
179/
180/ free previous file name
181/ (if any)
182/
183 mov FNAME(r3),r0
184 beq 1f
185 mov r0,-(sp)
186 jsr pc,_free
187 tst (sp)+
188/
189/ put the new name
190/ into the structure
191/
1921:
193 mov r2,FNAME(r3)
194 mov r2,PFNAME(r3)
195 mov r3,r0
196 mov newsp,sp
197 jmp *reta
198.bss
199reta: .=.+2
200newsp: .=.+2
201.text
202 .globl cleanup
203cleanup:
204 mov r2,-(sp)
205 mov 4(sp),r2
206 mov PFNAME(r2),0f
207 sys indir;8f
208.data
2098: sys unlink;0: ..
210.text
211 bec 1f
212 mov PFNAME(r2),_file
213 mov $EREMOVE,_perrno
214 error EREMOVE
2151:
216 mov PFNAME(r2),-(sp)
217 jsr pc,_free
218 tst (sp)+
219 mov (sp)+,r2
220 rts pc