Commit | Line | Data |
---|---|---|
919757fd PH |
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 | } |