diff options
-rw-r--r-- | includes/isobuilder.h | 6 | ||||
-rw-r--r-- | lib/isobuilder.cpp | 109 |
2 files changed, 76 insertions, 39 deletions
diff --git a/includes/isobuilder.h b/includes/isobuilder.h index 7f86f05..a18e64d 100644 --- a/includes/isobuilder.h +++ b/includes/isobuilder.h @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* $Id: isobuilder.h,v 1.13 2005-11-02 21:34:02 pixel Exp $ */ +/* $Id: isobuilder.h,v 1.14 2006-07-17 16:11:25 pixel Exp $ */ #ifndef __ISOBUILDER_H__ #define __ISOBUILDER_H__ @@ -47,7 +47,7 @@ class isobuilder : public Base { virtual ~DirTree(); void fromdir(cdutils::DirEntry *); void dumpdirs(isobuilder *) throw (GeneralException); - int buildpath(Byte * data, int size, bool bigendian = false) throw (GeneralException); + int buildpath(Byte * data, int size, bool bigendian = false); bool isdir(); void setbasicsxa(); int sector; @@ -64,6 +64,8 @@ class isobuilder : public Base { DirTree * Brother(); DirTree * Find(const String &); private: + int buildpath_r(Byte * data, int size, int current_level, int level_to_dump, bool bigendian) throw (GeneralException); + int maxlevel(int current_level = 1); DirTree * father, * child, * brother; bool dir; int node; diff --git a/lib/isobuilder.cpp b/lib/isobuilder.cpp index 327b55c..107fbe8 100644 --- a/lib/isobuilder.cpp +++ b/lib/isobuilder.cpp @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* $Id: isobuilder.cpp,v 1.18 2005-11-02 21:34:02 pixel Exp $ */ +/* $Id: isobuilder.cpp,v 1.19 2006-07-17 16:11:25 pixel Exp $ */ #include "isobuilder.h" @@ -169,55 +169,84 @@ void isobuilder::DirTree::dumpdirs(isobuilder * builder) throw (GeneralException free(odir); } +int isobuilder::DirTree::maxlevel(int current_level) { + int m_level_c = 0, m_level_b = 0; + if (dir) { + if (child) { + m_level_c = child->maxlevel(current_level + 1); + } + } + + if (brother) { + m_level_b = brother->maxlevel(current_level); + } + + return max(current_level, max(m_level_c, m_level_b)); +} + int isobuilder::DirTree::buildpath(Byte * data, int size, bool bigendian) throw (GeneralException) { - int N, r, tr; + int maxlv = maxlevel(), i, R, cumul = 0; + + for (i = 1; i < maxlv; i++) { + R = buildpath_r(data, size, 1, i, bigendian); + data += R; + cumul += R; + } + + return cumul; +} + +int isobuilder::DirTree::buildpath_r(Byte * data, int size, int current_level, int level_to_dump, bool bigendian) throw (GeneralException) { + int N, r = 0, tr; Uint16 pn; char pbuf[256], pad; if (!dir) { if (brother) { - return brother->buildpath(data, size, bigendian); + return brother->buildpath_r(data, size, current_level, level_to_dump, bigendian); } else { return 0; } } - if (!father) { - numerate(1); - N = 1; - pbuf[0] = 0; - pn = 1; - } else { - N = name.strlen(); - strcpy(pbuf, name.to_charp()); - pn = father->node; - } + if (current_level == level_to_dump) { + if (!father) { + numerate(1); + N = 1; + pbuf[0] = 0; + pn = 1; + } else { + N = name.strlen(); + strcpy(pbuf, name.to_charp()); + pn = father->node; + } - pad = N & 1; - size -= (r = N + pad + 8); + pad = N & 1; + size -= (r = N + pad + 8); - if (size < 0) - throw GeneralException("Path table too small."); + if (size < 0) + throw GeneralException("Path table too small."); - data[0] = N; - data[1] = 0; - *((Uint32 *) (data + 2)) = bigendian ? cdutils::to_BE32(sector) : cdutils::to_LE32(sector); - *((Uint16 *) (data + 6)) = bigendian ? cdutils::to_BE16(pn) : cdutils::to_LE16(pn); - memcpy(data + 8, pbuf, N); - if (pad) - data[8 + N] = 0; + data[0] = N; + data[1] = 0; + *((Uint32 *) (data + 2)) = bigendian ? cdutils::to_BE32(sector) : cdutils::to_LE32(sector); + *((Uint16 *) (data + 6)) = bigendian ? cdutils::to_BE16(pn) : cdutils::to_LE16(pn); + memcpy(data + 8, pbuf, N); + if (pad) + data[8 + N] = 0; - data += r; + data += r; + } - if (brother) { - tr = brother->buildpath(data, size, bigendian); + if (child) { + tr = child->buildpath_r(data, size, current_level + 1, level_to_dump, bigendian); r += tr; size -= tr; data += tr; } - if (child) { - tr = child->buildpath(data, size, bigendian); + if (brother) { + tr = brother->buildpath_r(data, size, current_level, level_to_dump, bigendian); r += tr; size -= tr; data += tr; @@ -236,6 +265,10 @@ int isobuilder::DirTree::buildentry(Byte * buffer, int spaceleft, bool put_xa) { memset(pbuf, 0, 256); + if (name == "BM2.ELF") { + printm(M_INFO, "GRON"); + } + if (name == ".") { N = 1; pbuf[0] = 0; @@ -314,14 +347,16 @@ void isobuilder::DirTree::fromdir(cdutils::DirEntry * d) { return; } - if ((d->N == 1) && (d->id[0] == 0)) { - name = "."; - } else if ((d->N == 1) && (d->id[0] == 1)) { - name = ".."; - } else { - memcpy(pbuf, d->id, s = (d->N - ((d->Flags & 2) ? 0 : 2))); - pbuf[s] = 0; - name = pbuf; + if (name == "") { + if ((d->N == 1) && (d->id[0] == 0)) { + name = "."; + } else if ((d->N == 1) && (d->id[0] == 1)) { + name = ".."; + } else { + memcpy(pbuf, d->id, s = (d->N - ((d->Flags & 2) ? 0 : 2))); + pbuf[s] = 0; + name = pbuf; + } } hidden = d->Flags & 1; if (d->Year < 70) |