rev |
line source |
pascal@19515
|
1 #include "crtl.h"
|
pascal@19515
|
2 #include "iso9660.h"
|
pascal@19515
|
3
|
pascal@23996
|
4 #define setdirpage(to,sec) ((to) = *(int*)&(sec)<<(SECTORBITS-8))
|
pascal@23996
|
5 #define cpytodirpage(to,from) ((to) = *(int*)((char*)&(from)+1))
|
pascal@23996
|
6 #define cpyfromdirpage(to,from) (*(int*)((char*)&(to)+1) = (from))
|
pascal@20747
|
7
|
pascal@23984
|
8 #define isoroot() \
|
pascal@23984
|
9 { \
|
pascal@23996
|
10 extern void isoreadrootsector(void); \
|
pascal@23996
|
11 isoreadrootsector(); \
|
pascal@23996
|
12 setdirpage(x->dirpage, (* (unsigned long *) (isostate.buffer + 0x9E))); \
|
pascal@23996
|
13 x->dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6)); \
|
pascal@23984
|
14 }
|
pascal@19515
|
15
|
pascal@23996
|
16 static int isoreaddir(void)
|
pascal@19515
|
17 {
|
pascal@19636
|
18 char *p;
|
pascal@23870
|
19
|
pascal@19571
|
20 struct isostate *x=&isostate;
|
pascal@19515
|
21
|
pascal@20534
|
22 if (x->curpos >= SECTORSZ || * (short *) (x->buffer + x->curpos) == 0) {
|
pascal@23996
|
23 if ((x->curdirsize =- DIRSECTORSZ) < 0) return -1;
|
pascal@23996
|
24 isoreadsector(&x->curdirofs); // x->filepos = 0
|
pascal@20453
|
25 //x->curdirofs += SECTORSZ;
|
pascal@20453
|
26 *(int *)((char *) &x->curdirofs+1) += SECTORSZ/256;
|
pascal@20458
|
27 x->curpos = 0;
|
pascal@19515
|
28 }
|
pascal@20534
|
29 p = x->buffer; p += x->curpos;
|
pascal@23996
|
30 x->fileofs = (* (unsigned long *) (p + 2)) << SECTORBITS;
|
pascal@21735
|
31 if ((x->entrysize = * (short *) p) == 0) {
|
pascal@19515
|
32 return -1;
|
pascal@20538
|
33 }
|
pascal@23996
|
34 // x->filename = "";
|
pascal@19636
|
35 x->filesize = * (unsigned long *) (p + 10);
|
pascal@20543
|
36 x->filemod = 0x81ED; if (p[25] & 2) ((char *)&(x->filemod))[1] = 0x41;
|
pascal@20534
|
37 p = x->buffer + 34 + ((p[32] + x->curpos) & -2);
|
pascal@23871
|
38 x->curpos += x->entrysize;
|
pascal@19515
|
39 do {
|
pascal@23870
|
40 register len = p[2];
|
pascal@20751
|
41 if (* (short *) p == 0x4D4E) {
|
pascal@20751
|
42 x->filename = p + 5;
|
pascal@23870
|
43 p[len] = 0;
|
pascal@23870
|
44 goto found;
|
pascal@19515
|
45 }
|
pascal@19636
|
46 p += len;
|
pascal@23996
|
47 } while (x->buffer + x->curpos - 3 >= p);
|
pascal@23870
|
48 found:
|
pascal@19515
|
49 return 0;
|
pascal@19515
|
50 }
|
pascal@19515
|
51
|
pascal@23996
|
52 #define isoreaddir_reset() \
|
pascal@23996
|
53 { \
|
pascal@23996
|
54 x->curdirsize = x->dirsize; \
|
pascal@23996
|
55 cpyfromdirpage(x->curdirofs, x->dirpage); \
|
pascal@23996
|
56 x->curpos = -1; \
|
pascal@23996
|
57 }
|
pascal@23996
|
58
|
pascal@21628
|
59 int _isoopen(void)
|
pascal@19515
|
60 {
|
pascal@21735
|
61 // char *name, *s, c;
|
pascal@21735
|
62 // char _64bits = cpuhaslm();
|
pascal@19571
|
63 struct isostate *x=&isostate;
|
pascal@21735
|
64 #define name (x->filename2open)
|
pascal@21754
|
65 #define c (x->c)
|
pascal@21754
|
66 #define _64bits (x->_64bits)
|
pascal@21735
|
67 char *s;
|
pascal@19515
|
68
|
pascal@21735
|
69 _64bits = cpuhaslm();
|
pascal@23996
|
70 _32bits:
|
pascal@23863
|
71 s = (char *) x->filename2open;
|
pascal@23863
|
72 if (*s == '/') {
|
pascal@23863
|
73 s++;
|
pascal@23863
|
74 isoroot();
|
pascal@23996
|
75 //if (strncmp(x->buffer+1,"CD001,5) == -1) return -1;
|
pascal@23996
|
76 //if (*(int*)(x->buffer+1) != 0x4443) return -1;
|
pascal@19515
|
77 }
|
pascal@19825
|
78 next:
|
pascal@23996
|
79 isoreaddir_reset();
|
pascal@20751
|
80 name = s;
|
pascal@21754
|
81 do s++; while (*s && *s != '/');
|
pascal@21750
|
82 c = *s; *s = 0;
|
pascal@23996
|
83 do {
|
pascal@23996
|
84 if (isoreaddir() == -1) {
|
pascal@23996
|
85 if ((_64bits ^= CPUMASKLM) == 0) goto _32bits;
|
pascal@23996
|
86 return -1;
|
pascal@23996
|
87 }
|
pascal@21735
|
88 const char *n = name;
|
pascal@21735
|
89 #define i (x->tmp)
|
pascal@21735
|
90 i = x->filename;
|
pascal@19825
|
91 if (_64bits) {
|
pascal@21628
|
92 if (strhead(i, n) == -1) continue;
|
pascal@19825
|
93 n = "64";
|
pascal@19825
|
94 i += s - name; // strlen(name);
|
pascal@19515
|
95 }
|
pascal@23996
|
96 if (strcmp(i, n) != -1) break;
|
pascal@23996
|
97 } while (1);
|
pascal@23996
|
98 *s++ = c;
|
pascal@23996
|
99 #define IS_DIR(x)( (*((char*) &x + 1) & (char)0676) == (char)0)
|
pascal@23996
|
100 if (IS_DIR(x->filemod)) {
|
pascal@23996
|
101 cpytodirpage(x->dirpage, x->fileofs);
|
pascal@23996
|
102 x->dirsize = filesize2dirsize(x->filesize);
|
pascal@23996
|
103 if (c) goto next;
|
pascal@19515
|
104 }
|
pascal@23996
|
105 isolseek(&x->fileofs);
|
pascal@23996
|
106 return x->fd;
|
pascal@19515
|
107 }
|