]> git.sur5r.net Git - cc65/blob - libsrc/cbm/cbm_dir.c
bedbdaf6ace3e59a0caa08fb97e84c984d15af52
[cc65] / libsrc / cbm / cbm_dir.c
1 /* This is very simplified version of POSIX opendir(), readdir() and closedir() */
2 /* for Commodore computers.                                                     */
3 /* Created by Josef Soucek, 2003    E-mail:josef.soucek@ct.cz                   */
4
5 /* Version 0.1 - 21.1.2003 */
6 /* Tested with floppy drive and IDE64 devices                                   */
7 /* Not tested with messed (buggy) directory listing                             */
8 /* Limits filenames to 16 chars (VICE supports more in directory listing)       */
9
10
11
12 #include <cbm.h>
13
14
15
16 unsigned char __fastcall__ cbm_opendir (unsigned char lfn, unsigned char device)
17 {
18     unsigned char status;
19     if ((status = cbm_open (lfn, device, CBM_READ, "$")) == 0) {
20         if (cbm_k_chkin (lfn) == 0) {
21             if (cbm_k_basin () == 0x01) {         /* Start address */
22                 if (cbm_k_basin () == 0x04) {
23                     cbm_k_clrch ();
24                     return 0;
25                 }
26             } else {
27                 cbm_close (lfn);
28                 cbm_k_clrch ();
29                 return 2;
30             }
31         }
32     }
33     return status;
34 }
35
36
37
38 unsigned char __fastcall__ cbm_readdir (unsigned char lfn, register struct cbm_dirent* l_dirent)
39 {
40     unsigned char byte, i;
41
42     if (cbm_k_chkin (lfn) == 0) {
43         if (cbm_k_readst () == 0) {
44             cbm_k_basin ();                    /* 0x01, 0x01, next basic line */
45             cbm_k_basin ();
46
47             byte = cbm_k_basin();             /* File-size */
48             l_dirent->size = byte | ((cbm_k_basin()) << 8);
49
50             byte = cbm_k_basin();
51
52             if (byte == 'b') {                 /* "B" BLOCKS FREE. */
53                 while (cbm_k_readst () == 0) { /* Read until end */
54                     cbm_k_basin ();
55                 }
56                 cbm_k_clrch ();
57                 return 2;                       /* END */
58             }
59
60             if (byte != '\"') {
61                 while (cbm_k_basin() != '\"') {
62                     if (cbm_k_readst () != 0) {   /* ### Included to prevent */
63                         cbm_k_clrch ();           /* ### Endless loop */
64                         return 3;                 /* ### Should be probably removed */
65                     }                             /* ### */
66                 }
67             }
68
69             i = 0;
70             while ((byte = cbm_k_basin ()) != '\"') {
71                 if (cbm_k_readst () != 0) {     /* ### Included to prevent */
72                     cbm_k_clrch ();             /* ### Endless loop */
73                     return 4;                   /* ### Should be probably removed */
74                 }                               /* ### */
75
76                 if (i < sizeof (l_dirent->name) - 1) {
77                     l_dirent->name[i] = byte;
78                     ++i;
79                 }
80             }
81             l_dirent->name[i] = '\0';
82
83             while ((byte=cbm_k_basin ()) == ' ') {
84                 if (cbm_k_readst ()) {          /* ### Included to prevent */
85                     cbm_k_clrch ();             /* ### Endless loop */
86                     return 5;                   /* ### Should be probably removed */
87                 }                               /* ### */
88             }
89
90             switch (byte) {
91                 case 's':
92                     l_dirent->type = CBM_T_SEQ;
93                     break;
94                 case 'p':
95                     l_dirent->type = CBM_T_PRG;
96                     break;
97                 case 'u':
98                     l_dirent->type = CBM_T_USR;
99                     break;
100                 case 'r':
101                     l_dirent->type = CBM_T_REL;
102                     break;
103                 case 'c':
104                     l_dirent->type = CBM_T_CBM;
105                     break;
106                 case 'd':
107                     l_dirent->type = CBM_T_DIR;
108                     break;
109                 case 'v':
110                     l_dirent->type = CBM_T_VRP;
111                     break;
112                 default:
113                     l_dirent->type = CBM_T_OTHER;
114             }
115
116             cbm_k_basin ();
117             cbm_k_basin ();
118
119             byte = cbm_k_basin ();
120
121             l_dirent->access = (byte == 0x3C)? CBM_A_RO : CBM_A_RW;
122
123             if (byte != 0) {
124                 while (cbm_k_basin() != 0) {
125                     if (cbm_k_readst () != 0) { /* ### Included to prevent */
126                         cbm_k_clrch ();         /* ### Endless loop */
127                         return 6;               /* ### Should be probably removed */
128                     }                           /* ### */
129                 }
130             }
131
132             cbm_k_clrch ();
133             return 0;                         /* Line read successfuly */
134         }
135     }
136     cbm_k_clrch ();
137     return 1;
138 }
139
140
141 void __fastcall__ cbm_closedir( unsigned char lfn)
142 {
143     cbm_close(lfn);
144 }
145
146