first multi-segment version
[unix-history] / usr / src / old / arff / arff.c
CommitLineData
fa61ea79 1static char *sccsid = "@(#)arff.c 4.3 (Berkeley) 81/03/22";
9323c1d3
BJ
2#include <sys/types.h>
3#include <sys/stat.h>
4#include <time.h>
5#include <signal.h>
6#include <stdio.h>
7#define dbprintf printf
8struct rt_dat {
9unsigned short int rt_yr:5; /*Year - 1972 */
10unsigned short int rt_dy:5; /*day */
11unsigned short int rt_mo:5; /*month */
12};
13struct rt_axent {
14 char rt_sent[14];
15};
16
17struct rt_ent {
18 char rt_pad; /*unusued */
19 char rt_stat; /*Type of entry, or end of seg*/
20 unsigned short rt_name[3]; /*Name, 3 words in rad50 form */
21 short rt_len; /*Length of file */
22 char rt_chan; /*Only used in temporary files*/
23 char rt_job; /*Only used in temporary files*/
24 struct rt_dat rt_date; /*Creation Date */
25};
26#define RT_TEMP 1
27#define RT_NULL 2
28#define RT_FILE 4
29#define RT_ESEG 8
30#define RT_BLOCK 512
fa61ea79 31#define RT_DIRSIZE 31 /* max # of directory segments */
9323c1d3
BJ
32struct rt_head {
33 short rt_numseg; /*number of segments available*/
34 short rt_nxtseg; /*segment no of next log. seg */
35 short rt_lstseg; /*highest seg currenltly open */
36 unsigned short rt_entpad; /*extra words/dir. entry */
37 short rt_stfile; /*block no where files begin */
38};
39struct rt_dir {
40 struct rt_head rt_axhead;
41 struct rt_ent rt_ents[72];
42 char _dirpad[6];
43};
fa61ea79 44extern struct rt_dir rt_dir[RT_DIRSIZE];
9323c1d3
BJ
45extern int rt_entsiz;
46extern int floppydes;
47extern char *rt_last;
48typedef struct fldope {
49 int startad;
50 int count;
51struct rt_ent *rtdope;
52} FLDOPE;
53FLDOPE *lookup();
54#define rt(p) ((struct rt_ent *) p )
55#define Ain1 03100
56#define Ain2 050
57#define flag(c) (flg[(c) - 'a'])
58
59char *man = { "rxtd" };
60
61char zeroes[512];
62extern char *val;
63extern char table[256];
fa61ea79
BJ
64struct rt_dir
65 rt_dir[RT_DIRSIZE] = {{4,0,1,0,14},{0,RT_NULL,{0,0,0},494,0}, {0,RT_ESEG}};
9323c1d3
BJ
66int rt_entsiz;
67int rt_nleft;
fa61ea79 68struct rt_ent *rt_curend[RT_DIRSIZE];
9323c1d3
BJ
69int floppydes;
70int dirdirty;
71char *rt_last;
72char *defdev = "/dev/floppy";
73
74char *opt = { "vf" };
75
76int signum[] = {SIGHUP, SIGINT, SIGQUIT, 0};
77long lseek();
78int rcmd();
79int dcmd();
80int xcmd();
81int tcmd();
82int (*comfun)();
83char flg[26];
84char **namv;
85int namc;
86int file;
87
88
89main(argc, argv)
90char *argv[];
91{
92 register char *cp;
93
94 /*register i;
95 for(i=0; signum[i]; i++)
96 if(signal(signum[i], SIG_IGN) != SIG_IGN)
97 signal(signum[i], sigdone);*/
98 if(argc < 2)
99 usage();
100 cp = argv[1];
101 for(cp = argv[1]; *cp; cp++)
102 switch(*cp) {
103 case 'm':
104 case 'v':
105 case 'u':
106 case 'w':
107 flg[*cp - 'a']++;
108 continue;
109 case 'c':
110 {
111#define SURE "Are you sure you want to clobber the floppy?\n"
112 int tty;
bc04334b 113 char response[128];
9323c1d3
BJ
114 tty = open("/dev/tty",2);
115 write(tty,SURE,sizeof(SURE));
bc04334b 116 read(tty,response,128);
9323c1d3
BJ
117 if(*response!='y')
118 exit(50);
119 flag('c')++;
120 close(tty);
121 }
122 dirdirty++;
123 continue;
124
125 case 'r':
126 setcom(rcmd);
127 flag('r')++;
128 continue;
129
130 case 'd':
131 setcom(dcmd);
132 flag('d')++;
133 continue;
134
135 case 'x':
136 setcom(xcmd);
137 continue;
138
139 case 't':
140 setcom(tcmd);
141 continue;
142
143 case 'f':
144 defdev = argv[2];
145 argv++;
146 argc--;
147 continue;
148
149
150 default:
151 fprintf(stderr, "arff: bad option `%c'\n", *cp);
152 exit(1);
153 }
154 namv = argv+2;
155 namc = argc-2;
156 if(comfun == 0) {
157 if(flg['u'-'a'] == 0) {
158 fprintf(stderr, "arff: one of [%s] must be specified\n", man);
159 exit(1);
160 }
161 setcom(rcmd);
162 }
163 (*comfun)();
164 exit(notfound());
165}
166
167setcom(fun)
168int (*fun)();
169{
170
171 if(comfun != 0) {
172 fprintf(stderr, "arff: only one of [%s] allowed\n", man);
173 exit(1);
174 }
175 comfun = fun;
176}
177
178
179
180
181
182
183
184
185usage()
186{
187 printf("usage: ar [%s][%s] archive files ...\n", opt, man);
188 exit(1);
189}
190
191
192
193notfound()
194{
195 register i, n;
196
197 n = 0;
198 for(i=0; i<namc; i++)
199 if(namv[i]) {
200 fprintf(stderr, "arff: %s not found\n", namv[i]);
201 n++;
202 }
203 return(n);
204}
205
206
207
208phserr()
209{
210
211 fprintf(stderr, "arff: phase error on %s\n", file);
212}
213
214mesg(c)
215{
216
217 if(flg['v'-'a'])
218 if(c != 'c' || flg['v'-'a'] > 1)
219 printf("%c - %s\n", c, file);
220}
221
222tcmd()
223{
224 register char *de;
fa61ea79
BJ
225 int segnum;
226 register char *last;
9323c1d3
BJ
227 FLDOPE *lookup(), *dope;
228 int nleft; register i;
229 register struct rt_ent *rde;
230
231 rt_init();
232 if(namc==0)
fa61ea79
BJ
233 for (segnum=0; segnum != -1; /* for all dir. segments */
234 segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
235 last = rt_last + segnum*2*RT_BLOCK;
236 for(de=((char *)&rt_dir[segnum])+10; de <= last;
237 de += rt_entsiz) {
9323c1d3 238 if(rtls(rt(de))) {
fa61ea79
BJ
239 nleft = (last - de) / rt_entsiz;
240 printf("\n%d entries remaining",nleft);
241 printf(" in directory segment %d.\n",segnum+1);
9323c1d3
BJ
242 break;
243 }
244 }
fa61ea79 245 }
9323c1d3
BJ
246 else
247 for(i = 0; i < namc; i++) {
248 if(dope = lookup(namv[i])) {
249 rde = dope->rtdope;
250 rtls(rde);
251 namv[i] = 0;
252 }
253 }
254}
255rtls(de)
256register struct rt_ent *de;
257{
258 int month,day,year;
259 char name[12], ext[4];
260
261 if(flg['v'-'a'])
262 switch(de->rt_stat) {
263 case RT_TEMP:
264 printf("Tempfile:\n");
265 case RT_FILE:
266 unrad50(2,de->rt_name,name);
267 unrad50(1,&(de->rt_name[2]),ext);
268 day = de->rt_date.rt_dy;
269 year = de->rt_date.rt_yr + 72;
270 month = de->rt_date.rt_mo;
271 printf("%6.6s %3.3s %02d/%02d/%02d %d\n",name,
272 ext,month,day,year,de->rt_len);
273 break;
274
275 case RT_NULL:
276 printf("%-25.9s %d\n","<UNUSED>",de->rt_len);
277 break;
278
279 case RT_ESEG:
280 return(1);
281 }
282 else {
283 switch(de->rt_stat) {
284 case RT_TEMP:
285 case RT_FILE:
286 sunrad50(name,de->rt_name);
287 printf(name);putchar('\n');
288 break;
289
290 case RT_ESEG:
291 return(1);
292
293 case RT_NULL:
294 ;
295 }
296 }
297 return(0);
298}
299xcmd()
300{
301 register char *de;
fa61ea79
BJ
302 int segnum;
303 register char *last;
9323c1d3
BJ
304 char name[12];
305 register int i;
306
307 rt_init();
308 if(namc==0)
fa61ea79
BJ
309 for (segnum=0; segnum != -1; /* for all dir. segments */
310 segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
311 last = rt_last + segnum*2*RT_BLOCK;
312 for(de=((char *)&rt_dir[segnum])+10; de <= last;
313 de += rt_entsiz) {
9323c1d3
BJ
314 sunrad50(name,rt(de)->rt_name);
315 rtx(name);
316 }
fa61ea79 317 }
9323c1d3
BJ
318
319 else
320 for(i = 0; i < namc; i++)
321 if(rtx(namv[i])==0) namv[i] = 0;
322}
323rtx(name)
324char *name;
325{
326 register FLDOPE *dope;
327 FLDOPE *lookup();
328 register startad, count;
329 int file; char buff[512];
330
331
332 if(dope = lookup(name)) {
333 if(flg['v' - 'a'])
334 rtls(dope->rtdope);
335 else
336 printf("x - %s\n",name);
337
338 file = creat(name, 0666);
339 if(file < 0) return(1);
340 count = dope->count;
341 startad = dope->startad;
342 for( ; count > 0 ; count -= 512) {
343 lread(startad,512,buff);
344 write(file,buff,512);
345 startad += 512;
346 }
347 close(file);
348 return(0);
349 }
350 return(1);
351}
352rt_init()
353{
354 static initized = 0;
355 register char *de;
fa61ea79
BJ
356 register i;
357 int mode, dirnum;
358 register char *last;
9323c1d3
BJ
359
360 if(initized) return;
361 initized = 1;
362 if(flag('c') || flag('d') || flag('r'))
363 mode = 2;
364 else
365 mode = 0;
366 if((floppydes = open(defdev,mode)) < 0)
367 dbprintf("Floppy open failed\n");
fa61ea79
BJ
368 if(flag('c')==0) {
369 lread(6*RT_BLOCK,2*RT_BLOCK,(char *)&rt_dir[0]);
370 dirnum = rt_dir[0].rt_axhead.rt_numseg;
371 if (dirnum > RT_DIRSIZE) {
372 fprintf(stderr,"arff: too many directory segments\n");
373 exit(1);
374 }
375 for (i=1; i<dirnum; i++)
376 lread((6+2*i)*RT_BLOCK,2*RT_BLOCK,(char *)&rt_dir[i]);
377 }
9323c1d3 378
fa61ea79
BJ
379 rt_entsiz = 2*rt_dir[0].rt_axhead.rt_entpad + 14;
380 rt_entsiz = 14; /* assume rt_entpad = 0 ??? */
381 rt_last = ((char *) &rt_dir[0]) + 10 + 1014/rt_entsiz*rt_entsiz;
382 rt_nleft = 0;
383
384 for (i=0; i<dirnum; i++) {
385 last = rt_last + i*2*RT_BLOCK;
386 for(de=((char *)&rt_dir[i])+10; de <= last; de += rt_entsiz) {
9323c1d3 387 if(rt(de)->rt_stat==RT_ESEG) break;
fa61ea79
BJ
388 }
389 rt_curend[i] = rt(de);
390 rt_nleft += (last - de) / rt_entsiz;
9323c1d3 391 }
9323c1d3
BJ
392}
393
394static FLDOPE result;
395FLDOPE *
396lookup(name)
397char * name;
398{
399 unsigned short rname[3];
400 register char *de;
fa61ea79
BJ
401 int segnum;
402 register char *last;
9323c1d3
BJ
403 register index;
404
405 srad50(name,rname);
406
407 /*
408 * Search for name, accumulate blocks in index
409 */
410 rt_init();
fa61ea79
BJ
411 for (segnum=0; segnum != -1; /* for all dir. segments */
412 segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
413 index = 0;
414 last = rt_last + segnum*2*RT_BLOCK;
415 for(de=((char *)&rt_dir[segnum])+10;
416 rt(de)->rt_stat != RT_ESEG; de += rt_entsiz) {
9323c1d3
BJ
417 switch(rt(de)->rt_stat) {
418 case RT_ESEG:
fa61ea79 419 exit(1);
9323c1d3
BJ
420 case RT_FILE:
421 case RT_TEMP:
422 if(samename(rname,rt(de)->rt_name))
423 goto found;
424 case RT_NULL:
425 index += rt(de)->rt_len;
426 }
fa61ea79
BJ
427 }
428 }
9323c1d3
BJ
429 return((FLDOPE *) 0);
430found: result.count = rt(de)->rt_len * 512;
fa61ea79 431 result.startad = 512 * (rt_dir[segnum].rt_axhead.rt_stfile + index);
9323c1d3
BJ
432 result.rtdope = (struct rt_ent *) de;
433 return(&result);
434}
435static
436samename(a,b)
437unsigned short a[3],b[3];
438{
439 return( a[0]==b[0] && a[1]==b[1] && a[2]==b[2] );
440}
441
442
443rad50(cp,out)
444register unsigned char *cp;
445unsigned short *out;
446{
447 register index;
448 register temp;
449
450 for(index = 0;*cp; index++) {
451
452 temp = Ain1 * table[*cp++];
453 if(*cp!=0) {
454 temp += Ain2 * table[*cp++];
455
456 if(*cp!=0)
457 temp += table[*cp++];
458 }
459
460 out[index] = temp;
461 }
462}
463#define reduce(x,p,q) \
464 (x = v[p/q], p %= q);
465
466unrad50(count,in,cp)
467unsigned short *in;
468register char *cp;
469{
470 register i, temp; register unsigned char *v = (unsigned char *) val;
471
472 for(i = 0; i < count; i++) {
473 temp = in[i];
474
475 reduce (*cp++,temp,Ain1);
476 reduce (*cp++,temp,Ain2);
477 reduce (*cp++,temp,1);
478 }
479 *cp=0;
480}
481
482srad50(name,rname)
483register char * name;
484register unsigned short *rname;
485{
486 register index; register char *cp;
487 char file[7],ext[4];
488 /*
489 * Find end of pathname
490 */
491 for(cp = name; *cp++; );
492 while(cp >= name && *--cp != '/');
493 cp++;
494 /*
495 * Change to rad50
496 *
497 */
498 for(index = 0; *cp; ){
499 file[index++] = *cp++;
500 if(*cp=='.') {
501 cp++;
502 break;
503 }
504 if(index>=6) {
505 break;
506 }
507 }
508 file[index] = 0;
509 for(index = 0; *cp; ){
510 ext[index++] = *cp++;
511 if(*cp=='.' || index>=3) {
512 break;
513 }
514 }
515 ext[index]=0;
516 rname[0] = 0;
517 rname[1] = 0;
518 rname[2] = 0;
519 rad50((unsigned char *)file,rname);
520 rad50((unsigned char *)ext,rname+2);
521}
522sunrad50(name,rname)
523unsigned short rname[3];
524register char *name;
525{
526 register char *cp, *cp2;
527 char ext[4];
528
529 unrad50(2,rname,name);
530 unrad50(1,rname + 2,ext);
531 /* Jam name and extension together with a dot
532 deleting white space */
533 for(cp = name; *cp++;);--cp; while(*--cp==' ' && cp>=name);
534 *++cp = '.';cp++;
535 for(cp2=ext; *cp2!=' ' && cp2 < ext + 3;) {
536 *cp++ = *cp2++;
537 }
538 *cp=0;
539 if(cp[-1]=='.') cp[-1] = 0;
540}
541
542static char *oval = " ABCDEFGHIJKLMNOPQRSTUVWXYZ$.@0123456789";
543static char *val = " abcdefghijklmnopqrstuvwxyz$.@0123456789";
544static char table[256] = {
54529, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
54629, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
5470, 29, 29, 29, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 29,
54830, 31, 32, 33, 34, 35, 36, 37, 38, 39, 29, 29, 29, 29, 29, 29,
54929, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
55016, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29,
55129, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
55216, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29,
55329, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
55429, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
5550, 29, 29, 29, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 29,
55630, 31, 32, 33, 34, 35, 36, 37, 38, 39, 29, 29, 29, 29, 29, 29,
55729, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
55816, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29,
55929, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
56016, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29 };
561
562long trans(logical)
563register int logical;
564{
565 /* Logical to physical adress translation */
566 register int sector, bytes, track;
567
568 logical += 26 * 128;
569 bytes = (logical & 127);
570 logical >>= 7;
571 sector = logical % 26;
572 if(sector >= 13)
573 sector = sector *2 +1;
574 else
575 sector *= 2;
576 sector += 26 + ((track = (logical / 26)) - 1) * 6;
577 sector %= 26;
578 return( (((track *26) + sector) << 7) + bytes);
579}
580lread(startad,count,obuff)
581register startad, count;
582register char * obuff;
583{
584 long trans();
585 extern floppydes;
586 rt_init();
587 if(flg['m'-'a']==0)
588 while( (count -= 128) >= 0) {
589 lseek(floppydes, trans(startad), 0);
590 read(floppydes,obuff,128);
591 obuff += 128;
592 startad += 128;
593 }
594 else
595 while( (count -= 512) >= 0) {
596 lseek(floppydes,(long) (startad), 0);
597 read(floppydes,obuff,512);
598 obuff += 512;
599 startad += 512;
600 }
601}
602lwrite(startad,count,obuff)
603register startad, count;
604register char * obuff;
605{
606 long trans();
607 extern floppydes;
608 rt_init();
609 if(flg['m'-'a']==0)
610 while( (count -= 128) >= 0) {
611 lseek(floppydes, trans(startad), 0);
612 write(floppydes,obuff,128);
613 obuff += 128;
614 startad += 128;
615 }
616 else
617 while( (count -= 512) >= 0) {
618 lseek(floppydes,(long) (startad), 0);
619 write(floppydes,obuff,512);
620 obuff += 512;
621 startad += 512;
622 }
623}
624
625rcmd()
626{
627 register int i;
fa61ea79 628 int debug;
9323c1d3
BJ
629
630 rt_init();
631 if(namc>0)
632 for(i = 0; i < namc; i++)
fa61ea79
BJ
633 if((debug = rtr(namv[i]))==0) namv[i]=0;
634 else printf("debug-rtr returns %d\n",debug);
9323c1d3
BJ
635
636
637}
638
639rtr(name)
640char *name;
641{
642 register FLDOPE *dope; register struct rt_ent *de;
643 struct stat buf; register struct stat *bufp = &buf;
fa61ea79
BJ
644 int segnum;
645 register char *last;
9323c1d3
BJ
646
647 if(stat(name,bufp)<0) return(1);
648 if(dope = lookup(name)) {
649 /* can replace, no problem */
650 de = dope->rtdope;
651 if(bufp->st_size <= (de->rt_len * 512))
652 printf("r - %s\n",name),
653 toflop(name,bufp->st_size,dope);
654 else {
655 printf("%s will not fit in currently used file on floppy\n",name);
656 return(1);
657 }
658 } else {
fa61ea79
BJ
659 /* Search for vacant spot */
660 for (segnum=0; segnum != -1; /* for all dir. segments */
661 segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
662 last = rt_last + segnum*2*RT_BLOCK;
663 for(de = rt_dir[segnum].rt_ents;
664 rt(de)->rt_stat != RT_ESEG; de++) {
9323c1d3
BJ
665 switch((de)->rt_stat) {
666 case RT_NULL:
667 if(bufp->st_size <= (de->rt_len * 512)) {
668 printf("a - %s\n",name),
fa61ea79 669 mkent(de,segnum,bufp,name);
9323c1d3
BJ
670 goto found;
671 }
672 continue;
673 case RT_ESEG:
fa61ea79 674 exit(1);
9323c1d3
BJ
675 }
676 }
fa61ea79
BJ
677 }
678 return(3);
9323c1d3
BJ
679 }
680found: if(dope=lookup(name)) {
681 toflop(name,bufp->st_size,dope);
682 return(0);
683 }
684 return(7);
685
686}
fa61ea79 687mkent(de,segnum,bufp,name)
9323c1d3 688register struct rt_ent *de;
fa61ea79 689int segnum;
9323c1d3
BJ
690register struct stat *bufp;
691char *name;
692{
693 struct tm *localtime(); register struct tm *timp;
694 register struct rt_ent *workp; int count;
695
696 count = (((bufp->st_size -1) >>9) + 1);
697 /* Make sure there is room */
698 if(de->rt_len==count)
699 goto overwrite;
fa61ea79
BJ
700 if(rt_curend[segnum] == (rt_last + (segnum*2*RT_BLOCK))) {
701 /* no entries left on segment */
9323c1d3
BJ
702 if(flg['o'-'a'])
703 goto overwrite;
fa61ea79
BJ
704 fprintf(stderr,"Directory segment #%d full on %s\n",segnum+1,
705 defdev);
9323c1d3
BJ
706 exit(1);
707 }
708 /* copy directory entries up */
fa61ea79 709 for(workp = rt_curend[segnum]+1; workp > de; workp--)
9323c1d3
BJ
710 *workp = workp[-1];
711 de[1].rt_len -= count;
712 de->rt_len = count;
fa61ea79 713 rt_curend[segnum]++;
9323c1d3
BJ
714 rt_nleft--;
715overwrite:
716 srad50(name,de->rt_name);
717 timp = localtime(&bufp->st_mtime);
718 de->rt_date.rt_dy = timp->tm_mday + 1;
719 de->rt_date.rt_mo = timp->tm_mon + 1;
720 de->rt_date.rt_yr = timp->tm_year - 72;
721 de->rt_stat = RT_FILE;
722 de->rt_pad = 0;
723 de->rt_chan = 0;
724 de->rt_job = 0;
fa61ea79 725 lwrite((6+segnum*2)*RT_BLOCK,2*RT_BLOCK,(char *)&rt_dir[segnum]);
9323c1d3
BJ
726
727}
728
729toflop(name,ocount,dope)
730char *name;
731register FLDOPE *dope;
732long ocount;
733{
734 register file, n, startad = dope->startad, count = ocount;
735 char buff[512];
736
737 file = open(name,0);
738 if(file < 0) {
739 printf("arff: couldn't open %s\n",name);exit(1);}
740 for( ; count >= 512; count -= 512) {
741 read(file,buff,512);
742 lwrite(startad,512,buff);
743 startad += 512;
744 }
745 read(file,buff,count);
746 close(file);
747 if(count <= 0) return;
748 for(n = count; n < 512; n ++) buff[n] = 0;
749 lwrite(startad,512,buff);
750 count = (dope->rtdope->rt_len * 512 - ocount) / 512 ;
751 if(count <= 0) return;
752 for( ; count > 0 ; count--) {
753 startad += 512;
754 lwrite(startad,512,zeroes);
755 }
756
757}
758dcmd()
759{
760 register int i;
761
762 rt_init();
763 if(namc)
764 for(i = 0; i < namc; i++)
765 if(rtk(namv[i])==0) namv[i]=0;
766 if(dirdirty)
767 scrunch();
768
769}
770rtk(name)
771char *name;
772{
773 register FLDOPE *dope;
774 register struct rt_ent *de;
775 FLDOPE *lookup();
776
777 if(dope = lookup(name)) {
778 printf("d - %s\n",name);
779 de = dope->rtdope;
780 de->rt_stat = RT_NULL;
781 de->rt_name[0] = 0;
782 de->rt_name[1] = 0;
783 de->rt_name[2] = 0;
784 * ((unsigned short *) & (de->rt_date)) = 0;
785 dirdirty = 1;
786 return(0);
787 }
788 return(1);
789}
790scrunch() {
fa61ea79
BJ
791 register struct rt_ent *de , *workp;
792 register segnum;
793 for (segnum=0; segnum != -1; /* for all dir. segments */
794 segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
795 dirdirty = 0;
796 for(de = rt_dir[segnum].rt_ents; de <= rt_curend[segnum]; de++) {
9323c1d3
BJ
797 if(de->rt_stat==RT_NULL && de[1].rt_stat==RT_NULL) {
798 (de+1)->rt_len += de->rt_len;
fa61ea79 799 for(workp = de; workp < rt_curend[segnum]; workp++)
9323c1d3
BJ
800 *workp = workp[1];
801 de--;
fa61ea79 802 rt_curend[segnum]--;
9323c1d3 803 rt_nleft++;
fa61ea79 804 dirdirty = 1;
9323c1d3 805 }
fa61ea79
BJ
806 }
807 if (dirdirty)
808 lwrite((6+segnum*2)*RT_BLOCK,2*RT_BLOCK,(char *)&rt_dir[segnum]);
9323c1d3 809 }
9323c1d3 810}