diff options
| -rwxr-xr-x | Makefile | 3 | ||||
| -rw-r--r-- | cd-tool.cpp | 4 | ||||
| -rw-r--r-- | cd-tool.lua | 22 | ||||
| -rw-r--r-- | includes/cdutils.h | 7 | ||||
| -rw-r--r-- | lib/cdutils.cpp | 43 | ||||
| -rw-r--r-- | lib/isobuilder.cpp | 4 | ||||
| -rw-r--r-- | lib/luacd.cpp | 75 | 
7 files changed, 132 insertions, 26 deletions
@@ -57,5 +57,4 @@ bin2c: bin2c.o Makefile  clean:  	for d in ${SUBDIRS} ; do make -C $$d clean || exit -1 ; done -	rm -f *.o ${TARGET} compil.c - +	rm -f *.o ${TARGET} compil.c cd-tool-hc.h cd-tool.bin diff --git a/cd-tool.cpp b/cd-tool.cpp index d6a9b68..14f0f0b 100644 --- a/cd-tool.cpp +++ b/cd-tool.cpp @@ -17,7 +17,7 @@   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */ -/* $Id: cd-tool.cpp,v 1.29 2004-05-02 12:29:02 pixel Exp $ */ +/* $Id: cd-tool.cpp,v 1.30 2004-05-03 12:55:04 pixel Exp $ */  #define WIP @@ -69,7 +69,7 @@ enum basecdtool_t {  };  struct lua_functypes_t basecdtool_functions[] = { -    { BASECDTOOL_LOAD,	"load", 	0, 1, { LUA_ANY } }, +    { BASECDTOOL_LOAD,	"load", 	0, 1, { LUA_STRING | LUA_OBJECT } },      { -1, 0, 0, 0, 0 }  }; diff --git a/cd-tool.lua b/cd-tool.lua index 30ebd34..577b091 100644 --- a/cd-tool.lua +++ b/cd-tool.lua @@ -4,9 +4,9 @@  function extract_file(source, dest, mode)      if (mode == nil) then -	source = cdfile(findpath(source)) +	source = cdfile(source)      else -	source = cdfile(findpath(source), mode) +	source = cdfile(source, mode)      end      dest = Output(dest)      source.copyto(dest) @@ -26,21 +26,28 @@ function insert_file(source, dest, mode)      end  end -function display(inp) +function display(inp, n) +    local i      if (type(inp) == "string") then          inp = Input(inp)      elseif (type(inp) ~= "table") then          error("Display needs a string or an Input object")      end +    i = 0 +          while(not inp:isclosed()) do +	i = i + 1          print(inp:read()) +	if ((n ~= nil) and (i >= n)) then +	    return +	end      end  end  function pchar(n)      if (not ((n >= 32) and (n <= 127))) then -        n = 46 -- a dot, 0x2e. +        n = 46 -- aka '.' or 0x2e      end      return hex(n, "%c")  end @@ -125,6 +132,13 @@ function cdfile(arg1, arg2, arg3, arg4)      if ((type(arg1) ~= "table") or (arg1.cdfile == nil)) then  	check_cdutil()          cdutil_implied = true +	if (type(arg1) == "string") then +	    arg1 = findpath(arg1) +	end +    else +	if (type(arg2) == "string") then +	    arg2 = findpath(arg2) +	end      end      if ((arg2 == nil) and (arg3 == nil) and (arg4 == nil)) then diff --git a/includes/cdutils.h b/includes/cdutils.h index d21c9cf..c81c093 100644 --- a/includes/cdutils.h +++ b/includes/cdutils.h @@ -17,7 +17,7 @@   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    */ -/* $Id: cdutils.h,v 1.15 2003-12-14 22:04:34 pixel Exp $ */ +/* $Id: cdutils.h,v 1.16 2004-05-03 12:55:04 pixel Exp $ */  #ifndef __CDUTILS_H__  #define __CDUTILS_H__ @@ -83,9 +83,10 @@ class cdutils : public Base {      long read_sector(Byte * buffer, int type = GUESS, int number = -1);      void read_datas(Byte * buffer, long size, int type = GUESS, int number = -1);      void read_file(Handle * Handle, long size, int type = GUESS, int number = -1); -    void write_sector(Byte * buffer, int type = GUESS, int number = -1); +    void write_sector(Byte * buffer, int type = GUESS, int number = -1) throw (GeneralException);      void write_datas(Byte * buffer, long size, int type = GUESS, int number = -1);      void write_file(Handle * Handle, long size = -1, int type = GUESS, int number = -1); +    void create_sector(int type, int number, bool eof = false) throw (GeneralException);      int get_iso_infos();      int show_iso_infos();      int get_pt_infos(); @@ -104,6 +105,8 @@ class cdutils : public Base {      static bool is_valid_BCD(unsigned char x);      static unsigned long from_MSF(unsigned long msf, unsigned long start = 150);      static unsigned long from_MSF(unsigned char m, unsigned char s, unsigned char f, unsigned long start = 150); +    static unsigned long to_MSF(int sect, unsigned long start = 150); +    static void to_MSF(int sect, unsigned char & m, unsigned char & s, unsigned char & f, unsigned long start = 150);    private:      void write_ppf(Byte * old_sec, Byte * new_sec, int sec_num);      String format_date(String input); diff --git a/lib/cdutils.cpp b/lib/cdutils.cpp index 821d51a..3ab4982 100644 --- a/lib/cdutils.cpp +++ b/lib/cdutils.cpp @@ -17,7 +17,7 @@   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */ -/* $Id: cdutils.cpp,v 1.28 2004-05-02 21:04:45 pixel Exp $ */ +/* $Id: cdutils.cpp,v 1.29 2004-05-03 12:55:04 pixel Exp $ */  #include <stdio.h>  #include <string.h> @@ -63,6 +63,20 @@ unsigned long cdutils::from_MSF(unsigned long msf, unsigned long start) {      return from_MSF(m, s, f, start);  } +void cdutils::to_MSF(int sect, unsigned char & m, unsigned char & s, unsigned char & f, unsigned long start) { +    sect += start; +    f = to_BCD(sect % 75); +    sect /= 75; +    s = to_BCD(sect % 60); +    m = to_BCD(sect / 60); +} + +unsigned long cdutils::to_MSF(int sect, unsigned long start) { +    unsigned char m, s, f; +    to_MSF(sect, m, s, f, start); +    return f | (s << 8) | (m << 16); +} +  Handle * cdutils::open_ppf(String ppf, String comment) throw (GeneralException) {      int i, l; @@ -255,7 +269,7 @@ void cdutils::read_file(Handle * file, long size, int type, int number) {      }  } -void cdutils::write_sector(Byte * buffer, int type, int number) { +void cdutils::write_sector(Byte * buffer, int type, int number) throw (GeneralException) {      Byte old_sector[2352], new_sector[2352];      if (type == GUESS) { @@ -283,7 +297,7 @@ void cdutils::write_sector(Byte * buffer, int type, int number) {      } else if (ppf_file) {  	write_ppf(old_sector, new_sector, number);      } else { -	printm(M_ERROR, "No writing method for iso file"); +	throw GeneralException("No writing method for iso file");      }  } @@ -339,6 +353,29 @@ void cdutils::write_file(Handle * file, long size, int type, int number) {      }  } +void cdutils::create_sector(int type, int number, bool eof) throw (GeneralException) { +    Byte sector[2352]; +    if (!f_iso_w) +	throw GeneralException("Can't create sector: ISO not in write mode"); +     +    to_MSF(number, yazedc_o.minute, yazedc_o.second, yazedc_o.frame); +    memset(sector, 0, 2352); +    if ((type == MODE2_FORM1) || (type == MODE2_FORM2)) { +	sector[16] = sector[20] = 0;  // File Number +	sector[17] = sector[21] = 0;  // Channel Number +	sector[18] = sector[22] = 8 | (eof ? 129 : 0) | +	                          (type == MODE2_FORM2 ? 32 : 0); +	sector[19] = sector[23] = 0;  // Coding Info +    } +    yazedc_o.do_encode_L2(sector, type, 0); + +    f_iso_w->seek(2352 * number); +     +    f_iso_w->write(sector, 2352); +     +    sector_seek(number); +} +  void cdutils::show_head_entry(void) {      printm(M_BARE, "Sector   Size        Date       Time       Flags  Name           XA flags\n");  } diff --git a/lib/isobuilder.cpp b/lib/isobuilder.cpp index 586e6f4..3f31c73 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.11 2004-01-03 15:04:47 pixel Exp $ */ +/* $Id: isobuilder.cpp,v 1.12 2004-05-03 12:55:04 pixel Exp $ */  #include "isobuilder.h" @@ -543,7 +543,7 @@ int isobuilder::createsector(Byte * datas, int smode, int n) {          dsector[17] = dsector[21] = 0;  // Channel Number          dsector[18] = dsector[22] = sub_EOR | sub_EOF | 8 |                                     (smode == MODE2_FORM2 ? 32 : 0); -        dsector[19] = dsector[23] = 0; +        dsector[19] = dsector[23] = 0;  // Coding Info      }      if (smode != MODE_RAW) { diff --git a/lib/luacd.cpp b/lib/luacd.cpp index 2c10b3f..97efe82 100644 --- a/lib/luacd.cpp +++ b/lib/luacd.cpp @@ -17,7 +17,7 @@   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */ -/* $Id: luacd.cpp,v 1.12 2004-05-02 21:04:45 pixel Exp $ */ +/* $Id: luacd.cpp,v 1.13 2004-05-03 12:55:04 pixel Exp $ */  #include "luacd.h" @@ -48,6 +48,9 @@ enum cdutils_methods_t {      CDUTILS_FINDPARENT,      CDUTILS_FINDDIRENTRY,      CDUTILS_NEWCDFILE, +    CDUTILS_UPDATESIZE, +    CDUTILS_UPDATESECTOR, +    CDUTILS_CREATESECTOR,  };  enum cdutils_functions_t { @@ -58,6 +61,7 @@ enum cdutils_functions_t {      CDUTILS_TO_BCD,      CDUTILS_IS_VALID_BCD,      CDUTILS_FROM_MSF, +    CDUTILS_TO_MSF,  };  struct lua_functypes_t cdutils_methods[] = { @@ -76,6 +80,9 @@ struct lua_functypes_t cdutils_methods[] = {      { CDUTILS_FINDPARENT,   "findparent",   1, 1, {LUA_STRING} },      { CDUTILS_FINDDIRENTRY, "finddirentry", 2, 2, {LUA_OBJECT, LUA_STRING} },      { CDUTILS_NEWCDFILE,    "cdfile",       1, 3, {LUA_ANY, LUA_NUMBER, LUA_NUMBER} }, +    { CDUTILS_UPDATESIZE,   "updatesize",   2, 2, {LUA_STRING, LUA_NUMBER} }, +    { CDUTILS_UPDATESECTOR, "updatesector", 2, 2, {LUA_STRING, LUA_NUMBER} }, +    { CDUTILS_CREATESECTOR, "createsector", 2, 3, {LUA_NUMBER, LUA_NUMBER, LUA_BOOLEAN} },      { -1, 0, 0, 0, 0 }  }; @@ -87,6 +94,7 @@ struct lua_functypes_t cdutils_functions[] = {      { CDUTILS_TO_BCD,       "to_BCD",       1, 1, {LUA_NUMBER} },      { CDUTILS_IS_VALID_BCD, "is_valid_BCD", 1, 1, {LUA_NUMBER} },      { CDUTILS_FROM_MSF,     "from_MSF",     1, 4, {LUA_NUMBER, LUA_NUMBER, LUA_NUMBER, LUA_NUMBER} }, +    { CDUTILS_TO_MSF,       "to_MSF",       1, 2, {LUA_NUMBER, LUA_NUMBER} },      { -1, 0, 0, 0, 0 }  }; @@ -107,6 +115,9 @@ class sLua_cdutils : public Base {      DECLARE_METHOD(cdutils, CDUTILS_FINDPARENT);      DECLARE_METHOD(cdutils, CDUTILS_FINDDIRENTRY);      DECLARE_METHOD(cdutils, CDUTILS_NEWCDFILE); +    DECLARE_METHOD(cdutils, CDUTILS_UPDATESIZE); +    DECLARE_METHOD(cdutils, CDUTILS_UPDATESECTOR); +    DECLARE_METHOD(cdutils, CDUTILS_CREATESECTOR);      DECLARE_FUNCTION(cdutils, CDUTILS_NEWCDUTILS);      DECLARE_FUNCTION(cdutils, CDUTILS_SWAPWORD); @@ -115,6 +126,7 @@ class sLua_cdutils : public Base {      DECLARE_FUNCTION(cdutils, CDUTILS_TO_BCD);      DECLARE_FUNCTION(cdutils, CDUTILS_IS_VALID_BCD);      DECLARE_FUNCTION(cdutils, CDUTILS_FROM_MSF); +    DECLARE_FUNCTION(cdutils, CDUTILS_TO_MSF);    private:      static int cdutils_proceed(Lua * L, int n, cdutils * obj, int caller); @@ -139,6 +151,9 @@ void Luacdutils::pushmembers(Lua * L) {      PUSH_METHOD(cdutils, CDUTILS_FINDPARENT);      PUSH_METHOD(cdutils, CDUTILS_FINDDIRENTRY);      PUSH_METHOD(cdutils, CDUTILS_NEWCDFILE); +    PUSH_METHOD(cdutils, CDUTILS_UPDATESIZE); +    PUSH_METHOD(cdutils, CDUTILS_UPDATESECTOR); +    PUSH_METHOD(cdutils, CDUTILS_CREATESECTOR);  }  void Luacdutils::pushstatics(Lua * L) throw (GeneralException) { @@ -152,6 +167,7 @@ void Luacdutils::pushstatics(Lua * L) throw (GeneralException) {      PUSH_FUNCTION(cdutils, CDUTILS_TO_BCD);      PUSH_FUNCTION(cdutils, CDUTILS_IS_VALID_BCD);      PUSH_FUNCTION(cdutils, CDUTILS_FROM_MSF); +    PUSH_FUNCTION(cdutils, CDUTILS_TO_MSF);      L->push("MODE0");      L->push((lua_Number) MODE0); @@ -216,8 +232,8 @@ int sLua_cdutils::cdutils_proceed(Lua * L, int n, cdutils * cd, int caller) {      Handle * h;      Byte sdatas[2352], * datas;      String path; -    cdutils::DirEntry * dir, * bdir, * adir; -    bool invalid = false; +    cdutils::DirEntry * dir, * bdir, * adir, pdir; +    bool invalid = false, eof = false;      int sector;      cdfile * cdf; @@ -228,13 +244,13 @@ int sLua_cdutils::cdutils_proceed(Lua * L, int n, cdutils * cd, int caller) {          break;      case CDUTILS_GUESSTYPE:          if (n == 1) { -            sect = L->tonumber(); +            sect = L->tonumber(2);          }          L->push((lua_Number) cd->guess_type(sect));          r = 1;          break;      case CDUTILS_SECTORSEEK: -        sect = L->tonumber(); +        sect = L->tonumber(2);          cd->sector_seek(sect);          break;      case CDUTILS_READSECTOR: @@ -382,20 +398,20 @@ int sLua_cdutils::cdutils_proceed(Lua * L, int n, cdutils * cd, int caller) {          break;      case CDUTILS_NEWCDFILE:          if (L->istable(2)) { -            if (n <= 3) { +            if (n <= 2) {                  dir = (cdutils::DirEntry *) LuaObject::getme(L, 2); -                if (n == 3) +                if (n == 2)                      mode = L->tonumber(3);                  cdf = new cdfile(cd, dir, mode);              } else {                  invalid = true;              }          } else if (L->isnumber(2)) { -            if (n >= 2) { +            if (n >= 1) {                  sector = L->tonumber(2); -                if (n >= 3) +                if (n >= 2)                      size = L->tonumber(3); -                if (n == 4) +                if (n == 3)                      mode = L->tonumber(4);                  cdf = new cdfile(cd, sector, size, mode);              } else { @@ -412,6 +428,31 @@ int sLua_cdutils::cdutils_proceed(Lua * L, int n, cdutils * cd, int caller) {              r = 1;          }          break; +    case CDUTILS_UPDATESIZE: +    case CDUTILS_UPDATESECTOR: +	path = L->tostring(2); +	pdir = cd->find_parent(path); +	dir = cd->find_path(&datas, path); +	switch (caller) { +	case CDUTILS_UPDATESIZE: +	    dir->Size = tolittle((Uint32) L->tonumber(3)); +	    dir->BESize = tobig((Uint32) L->tonumber(3)); +	    break; +	case CDUTILS_UPDATESECTOR: +	    dir->Sector = tolittle((Uint32) L->tonumber(3)); +	    dir->BESector = tobig((Uint32) L->tonumber(3)); +	    break; +	} +	cd->write_datas(datas, pdir.Size, GUESS, pdir.Sector); +	free(datas); +	break; +    case CDUTILS_CREATESECTOR: +	mode = L->tonumber(2); +	sect = L->tonumber(3); +	if (n == 3) +	    eof = L->toboolean(4); +	cd->create_sector(mode, sect, eof); +	break;      } @@ -422,7 +463,7 @@ int sLua_cdutils::cdutils_proceed_statics(Lua * L, int n, int caller) {      int r = 0;      Uint32 x;      Handle * isor = 0, * isow = 0; -    Uint32 msf, start = 150; +    Uint32 sector, msf, start = 150;      Byte m, s, f;      switch(caller) { @@ -476,6 +517,18 @@ int sLua_cdutils::cdutils_proceed_statics(Lua * L, int n, int caller) {          }          r = 1;          break; +    case CDUTILS_TO_MSF: +	sector = L->tonumber(1); +	if (n == 2) +	    start = L->tonumber(2); +	cdutils::to_MSF(sector, m, s, f, start); +	msf = cdutils::to_MSF(sector, start); +	L->push((lua_Number) msf); +	L->push((lua_Number) m); +	L->push((lua_Number) s); +	L->push((lua_Number) f); +	r = 4; +	break;      }      return r;  | 
