06b1764dd4e261d3631eb16fe288e67d028b7bb8
[pdp8.git] / sw / disk8 / src / directory.c
1 /* All directory related stuff goes here. */
2
3 /*!
4 *\file directory.c
5 *\brief OS/8 directory operations
6 */
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 #include "structures.h"
11 #include "directory.h"
12 #include "ops.h"
13 #include "logging.h"
14
15 #define SUCCESS 1
16 #define FAILED 0
17
18 #define INST(TYPE) ((TYPE *)malloc(sizeof(TYPE)))
19 #define INSTN(TYPE,NUM)(TYPE *) malloc(NUM* sizeof(TYPE))
20
21
22 /*!
23 * \brief Read OS/8 directory from partition image
24 */
25 directory_t * directory_read(os8_partition_t * image){
26
27 /* Make instance */
28 directory_t * result=INST(directory_t);
29 result->entries=0;
30
31
32 os8_direntry_t * list_head=INST(os8_direntry_t);
33 os8_direntry_t * current_entry=list_head;
34 os8_direntry_t * tmp_entry;
35
36 os8_partition_header_t * header = &image->header;
37 os8_directory_segment_t * segs=header->directory;
38 int seg_no=0;
39
40 list_head->prev=NULL; //Mark first element
41
42 do{
43 /* Data from the segment we're working on: */
44 os8_directory_segment_t * seg=segs+seg_no;
45 int additional_info=p8_neg(seg->additional_info_neg);
46 int first_file_start=seg->first_file_start;
47 int next_segment=seg->next_segment;
48 int no_entries=p8_neg(seg->neg_entries);
49
50 DBG ("Segment %i, Entries: %i, First Block: 0%o, additional info: 0%o, Next segment: 0%o\n",seg_no,
51 no_entries,
52 first_file_start,
53 additional_info,
54 next_segment
55 );
56
57 int offset=0;
58 char clear[10];
59 result->entries+=no_entries;
60 result->additional_info=additional_info;
61
62 /* Pointer to current entry */
63 p8word * entry=seg->entry_data;
64
65 int entry_no;
66 for (entry_no=0;entry_no < p8_neg(seg->neg_entries);entry_no++){
67
68 /* Link a new entry at the end of the list */
69 current_entry->next=INST(os8_direntry_t);
70 tmp_entry=current_entry;
71 current_entry=current_entry->next;
72 current_entry->prev=tmp_entry;
73 current_entry->next=NULL;
74
75 if (entry[0]){ // No empty file!
76 int size=p8_neg(entry[4+additional_info]);
77 current_entry->size_blocks=size;
78 if (size==0) current_entry->type=FT_TENTATIVE;
79 else current_entry->type=FT_PERMANENT;
80
81 os8_file_name_extract((os8_file_name_t *) entry , current_entry->name);
82 DBG("File: %9s %i\n",current_entry->name,size);
83 entry += 5+additional_info;
84 } else { // Empty file
85 int size=p8_neg(entry[1]);
86 current_entry->size_blocks=size;
87 current_entry->type=FT_EMPTY;
88 DBG("File: <empty> %i\n",size);
89 entry += 2;
90 }
91 }
92 seg_no++;
93 } while (segs[seg_no-1].next_segment);
94
95 result->entries=list_head->next;
96 free(list_head);
97 return result;
98 }