wok annotate linld/stuff/src/ISO9660.CPP @ rev 25040

cups-filters: use standard c++14
author Hans-G?nter Theisgen
date Fri May 27 07:47:27 2022 +0100 (2022-05-27)
parents 217c02cbbe8d
children
rev   line source
pascal@19515 1 #include "crtl.h"
pascal@24019 2 #include "common.h"
pascal@19515 3 #include "iso9660.h"
pascal@19515 4
pascal@24019 5 #ifdef ISO9660
pascal@23996 6 #define setdirpage(to,sec) ((to) = *(int*)&(sec)<<(SECTORBITS-8))
pascal@23996 7 #define cpytodirpage(to,from) ((to) = *(int*)((char*)&(from)+1))
pascal@23996 8 #define cpyfromdirpage(to,from) (*(int*)((char*)&(to)+1) = (from))
pascal@20747 9
pascal@23984 10 #define isoroot() \
pascal@23984 11 { \
pascal@23996 12 extern void isoreadrootsector(void); \
pascal@23996 13 isoreadrootsector(); \
pascal@24022 14 setdirpage(x->dirpage, (* (unsigned long *) (buf2k + 0x9E))); \
pascal@24022 15 x->dirsize = filesize2dirsize(* (unsigned long *) (buf2k + 0xA6)); \
pascal@23984 16 }
pascal@19515 17
pascal@24034 18 #if !defined(BASIC_ISO9660) && defined(CLEAN_ISO9660)
pascal@24022 19 #define BASIC_ISO9660
pascal@24022 20 #endif
pascal@24019 21 #if !defined(BASIC_ISO9660) && !defined(ROCKRIDGE)
pascal@24020 22 #define BASIC_ISO9660
pascal@24019 23 #endif
pascal@23996 24 static int isoreaddir(void)
pascal@19515 25 {
pascal@19636 26 char *p;
pascal@23870 27
pascal@19571 28 struct isostate *x=&isostate;
pascal@19515 29
pascal@24022 30 p = buf2k;
pascal@23999 31 if (x->curpos >= SECTORSZ || * (short *) (p + x->curpos) == 0) {
pascal@24022 32 x->curpos = 0;
pascal@23996 33 if ((x->curdirsize =- DIRSECTORSZ) < 0) return -1;
pascal@23996 34 isoreadsector(&x->curdirofs); // x->filepos = 0
pascal@20453 35 //x->curdirofs += SECTORSZ;
pascal@20453 36 *(int *)((char *) &x->curdirofs+1) += SECTORSZ/256;
pascal@19515 37 }
pascal@23999 38 p += x->curpos;
pascal@23996 39 x->fileofs = (* (unsigned long *) (p + 2)) << SECTORBITS;
pascal@21735 40 if ((x->entrysize = * (short *) p) == 0) {
pascal@19515 41 return -1;
pascal@20538 42 }
pascal@24022 43 #ifdef CHECKISOFILETYPE
pascal@24022 44 x->c = p[25];
pascal@24022 45 #endif
pascal@24020 46 register char *s;
pascal@19636 47 x->filesize = * (unsigned long *) (p + 10);
pascal@24020 48 s = ".."+1-p[33];
pascal@24020 49 #ifdef ROCKRIDGE
pascal@24022 50 p = buf2k + 34 + ((p[32] + x->curpos) & -2);
pascal@23871 51 x->curpos += x->entrysize;
pascal@19515 52 do {
pascal@23870 53 register len = p[2];
pascal@20751 54 if (* (short *) p == 0x4D4E) {
pascal@24020 55 s = p + 5;
pascal@23870 56 p[len] = 0;
pascal@23870 57 goto found;
pascal@19515 58 }
pascal@19636 59 p += len;
pascal@24022 60 } while (buf2k - 3 + x->curpos >= p);
pascal@24019 61 #endif
pascal@24019 62 #ifdef BASIC_ISO9660
pascal@24020 63 # ifdef ROCKRIDGE
pascal@24022 64 p = buf2k + 32 + x->curpos - x->entrysize;
pascal@24020 65 # else
pascal@24020 66 x->curpos += x->entrysize;
pascal@24020 67 p += 32;
pascal@24020 68 # endif
pascal@24019 69 if (((* (short *) p) & 0xFEFF) -1 != 0) {
pascal@24019 70 s = p + 1; p += *p;
pascal@24034 71 # ifdef CLEAN_ISO9660
pascal@24022 72 if (* (short *) (p-1) == 0x313B) p-=2; // remove ;1
pascal@24019 73 if (*p != '.') p++;
pascal@24022 74 # endif
pascal@24019 75 *p = 0;
pascal@24019 76 }
pascal@24019 77 #endif
pascal@23870 78 found:
pascal@24020 79 x->filename = s;
pascal@19515 80 return 0;
pascal@19515 81 }
pascal@19515 82
pascal@23996 83 #define isoreaddir_reset() \
pascal@23996 84 { \
pascal@23996 85 x->curdirsize = x->dirsize; \
pascal@23996 86 cpyfromdirpage(x->curdirofs, x->dirpage); \
pascal@23996 87 x->curpos = -1; \
pascal@23996 88 }
pascal@23996 89
pascal@21628 90 int _isoopen(void)
pascal@19515 91 {
pascal@21735 92 // char *name, *s, c;
pascal@21735 93 // char _64bits = cpuhaslm();
pascal@19571 94 struct isostate *x=&isostate;
pascal@21735 95 #define name (x->filename2open)
pascal@21754 96 #define c (x->c)
pascal@21754 97 #define _64bits (x->_64bits)
pascal@21735 98 char *s;
pascal@19515 99
pascal@23863 100 s = (char *) x->filename2open;
pascal@23863 101 if (*s == '/') {
pascal@24022 102 isoroot();
pascal@24022 103 //if (strncmp(buf2k+1,"CD001",5) == -1) return -1;
pascal@24022 104 //if (*(int*)(buf2k+1) != 0x4443) return -1;
pascal@24022 105 next:
pascal@23863 106 s++;
pascal@19515 107 }
pascal@20751 108 name = s;
pascal@21754 109 do s++; while (*s && *s != '/');
pascal@21750 110 c = *s; *s = 0;
pascal@24020 111 #ifdef ISOHOOK
pascal@24020 112 _64bits = cpuhaslm();
pascal@24020 113 _32bits:
pascal@24020 114 #endif
pascal@24020 115 isoreaddir_reset();
pascal@23996 116 do {
pascal@23996 117 if (isoreaddir() == -1) {
pascal@23999 118 #ifdef ISOHOOK
pascal@23996 119 if ((_64bits ^= CPUMASKLM) == 0) goto _32bits;
pascal@23999 120 #endif
pascal@23996 121 return -1;
pascal@23996 122 }
pascal@21735 123 const char *n = name;
pascal@21735 124 #define i (x->tmp)
pascal@21735 125 i = x->filename;
pascal@23999 126 #ifdef ISOHOOK
pascal@19825 127 if (_64bits) {
pascal@21628 128 if (strhead(i, n) == -1) continue;
pascal@19825 129 n = "64";
pascal@19825 130 i += s - name; // strlen(name);
pascal@19515 131 }
pascal@23999 132 #endif
pascal@23996 133 if (strcmp(i, n) != -1) break;
pascal@23996 134 } while (1);
pascal@24022 135 *s = c;
pascal@24022 136 if (c) {
pascal@24022 137 #ifdef CHECKISOFILETYPE
pascal@24022 138 if ((x->c & 2) == 0) return -1;
pascal@24022 139 #endif
pascal@23996 140 cpytodirpage(x->dirpage, x->fileofs);
pascal@23996 141 x->dirsize = filesize2dirsize(x->filesize);
pascal@24022 142 goto next;
pascal@19515 143 }
pascal@23996 144 isolseek(&x->fileofs);
pascal@23996 145 return x->fd;
pascal@19515 146 }
pascal@24019 147 #endif