aboutsummaryrefslogtreecommitdiff
path: root/project/src/lib-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'project/src/lib-file.c')
-rw-r--r--project/src/lib-file.c156
1 files changed, 93 insertions, 63 deletions
diff --git a/project/src/lib-file.c b/project/src/lib-file.c
index 2e193f5..18d26c1 100644
--- a/project/src/lib-file.c
+++ b/project/src/lib-file.c
@@ -118,6 +118,19 @@ void SetSource ( ccp source )
///////////////////////////////////////////////////////////////////////////////
+void SetIdList ( ccp source )
+{
+ #ifdef __CYGWIN__
+ opt_id_list = IsWindowsDriveSpec(source)
+ ? AllocNormalizedFilenameCygwin(source,false)
+ : source;
+ #else
+ opt_id_list = source;
+ #endif
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
void SetReference ( ccp source )
{
#ifdef __CYGWIN__
@@ -888,9 +901,11 @@ file_format_t GetByMagicFF
case LE_REFERENCE_MAGIC8_NUM: return FF_LEREF;
case LE_STRINGS_MAGIC8_NUM: return FF_LESTR;
case LE_SHA1REF_MAGIC8_NUM: return FF_SHA1REF;
+ case LE_SHA1ID_MAGIC8_NUM: return FF_SHA1ID;
case LE_PREFIX_MAGIC8_NUM: return FF_PREFIX;
case LE_MTCAT_MAGIC8_NUM: return FF_MTCAT;
case LE_CT_SHA1_MAGIC8_NUM: return FF_CT_SHA1;
+ case USELTA_MAGIC_NUM: return FF_USE_LTA;
case LTA_MAGIC_NUM: return FF_LTA;
}
}
@@ -910,6 +925,8 @@ file_format_t GetByMagicFF
case KRT_TEXT_MAGIC_NUM: return FF_KRT_TXT;
case KRM_TEXT_MAGIC_NUM: return FF_KRM_TXT;
+ case GCTTXT_MAGIC_NUM: return FF_GCT_TXT;
+
case YAZ0_MAGIC_NUM: return FF_YAZ0;
case YAZ1_MAGIC_NUM: return FF_YAZ1;
case XYZ0_MAGIC_NUM: return FF_XYZ;
@@ -1786,7 +1803,7 @@ int disable_patch_on_load = 0; // if >0: disable patching after loading
static const KeywordTab_t opt_patch_tab[] =
{
- { 0, "CLEAR", "RESET", PFILE_M_ALL | PFILE_F_HIDE },
+ { 0, "NONE", "CLEAR", PFILE_M_ALL | PFILE_F_HIDE },
{ PFILE_M_DEFAULT, "DEFAULT", 0, PFILE_M_ALL | PFILE_F_HIDE },
{ PFILE_M_ALL, "ALL", 0, PFILE_M_ALL | PFILE_F_HIDE },
{ PFILE_F_LOG, "LOG", 0, 0 },
@@ -1811,7 +1828,7 @@ static const KeywordTab_t opt_patch_tab[] =
///////////////////////////////////////////////////////////////////////////////
-int ScanOptPatchFile ( ccp arg )
+int ScanOptPatchFiles ( ccp arg )
{
if (!arg)
return 0;
@@ -2614,6 +2631,13 @@ bool IsByMagicBRSUB ( const void * data, uint data_size )
///////////////////////////////////////////////////////////////////////////////
+bool CanBeTrackFF ( file_format_t ff )
+{
+ return (uint)ff < FF_N && FileTypeTab[ff].attrib & FFT_TRACK;
+}
+
+//-----------------------------------------------------------------------------
+
bool IsArchiveFF ( file_format_t ff )
{
return (uint)ff < FF_N && FileTypeTab[ff].attrib & FFT_ARCHIVE;
@@ -2704,15 +2728,15 @@ file_format_t GetCompressedFF ( file_format_t ff )
void SetCompressionFF
(
- file_format_t ff_arch, // if >0: set 'opt_fform'
- file_format_t ff_compr // if >0: set 'fform_compr'
+ file_format_t ff_arch, // if >=0: set 'opt_fform'
+ file_format_t ff_compr // if >=0: set 'fform_compr'
// and 'fform_compr_force'
)
{
- if ( ff_arch > 0 )
+ if ( ff_arch >= 0 )
opt_fform = ff_arch;
- if ( ff_compr > 0 )
+ if ( ff_compr >= 0 )
fform_compr = fform_compr_force = ff_compr;
}
@@ -4256,7 +4280,7 @@ const mkw_prefix_t * GetPrefixTable(void)
///////////////////////////////////////////////////////////////////////////////
-const mkw_prefix_t * FindPrefix ( ccp pre, int pre_len, bool exact )
+const mkw_prefix_t * FindPrefix ( ccp pre, int pre_len )
{
if ( !pre || !*pre )
return 0;
@@ -4277,32 +4301,46 @@ const mkw_prefix_t * FindPrefix ( ccp pre, int pre_len, bool exact )
if (!tab)
return 0;
- for ( int i = 0; i < 2; i++ )
+ int beg = 0;
+ int end = current_prefix_tab_len - 1;
+ while ( beg <= end )
{
- int beg = 0;
- int end = current_prefix_tab_len - 1;
- while ( beg <= end )
- {
- const uint idx = (beg+end)/2;
- const mkw_prefix_t *p = tab + idx;
- const int stat = strcmp(pre,p->prefix);
- if ( stat < 0 )
- end = idx - 1 ;
- else if ( stat > 0 )
- beg = idx + 1;
- else
- return p;
- }
+ const uint idx = (beg+end)/2;
+ const mkw_prefix_t *p = tab + idx;
+ const int stat = strcmp(pre,p->prefix);
+ if ( stat < 0 )
+ end = idx - 1 ;
+ else if ( stat > 0 )
+ beg = idx + 1;
+ else
+ return p;
+ }
+ return 0;
+}
- if ( exact || i )
- return 0;
+///////////////////////////////////////////////////////////////////////////////
- StringUpperS(pbuf,sizeof(pbuf),pre);
- if (!strcmp(pbuf,pre))
- return 0;
- pre = pbuf;
+const mkw_prefix_t * GetPrefix ( ccp name, int name_len )
+{
+ if (!name)
+ return 0;
+
+ if ( name_len < 0 )
+ name_len = strlen(name);
+
+ ccp p1 = memchr(name,' ',name_len);
+ if (!p1)
+ return 0;
+
+ ccp p2 = memchr(p1+1,' ',name+name_len-p1-1);
+ if (p2)
+ {
+ const mkw_prefix_t *res = FindPrefix(name,p2-name);
+ if (res)
+ return res;
}
- return 0;
+
+ return FindPrefix(name,p1-name);
}
///////////////////////////////////////////////////////////////////////////////
@@ -5279,47 +5317,39 @@ void AnalyseSPF
//--- game prefix
+// [[mtcat]]
spf->game_order = 999999;
- p1 = memchr(name,' ',nlen);
- if (p1)
+ const mkw_prefix_t *pre1 = GetPrefix(name,nlen);
+ if (pre1)
{
- const mkw_prefix_t *pre1 = FindPrefix(name,p1-name,true);
-// [[mtcat]]
- if (pre1)
- {
- spf->game1.ptr = name;
- spf->game1.len = p1 - name;
- spf->game = spf->game1;
- spf->game1_color = pre1->color;
- spf->game_order = 1000 * pre1->order;
- int add_game = 998;
- name = p1+1;
- nlen = end - name;
+ spf->game1.ptr = name;
+ spf->game1.len = strlen(pre1->prefix);
+ spf->game = spf->game1;
+ spf->game1_color = pre1->color;
+ spf->game_order = 1000 * pre1->order;
+ int add_game = 998;
+ name += strlen(pre1->prefix) + 1;
+ nlen = end - name;
- if ( pre1->flags & MPF_PREFIX1 )
+ if ( pre1->flags & MPF_PREFIX1 )
+ {
+ const mkw_prefix_t *pre2 = GetPrefix(name,nlen);
+ if ( pre2 && pre2->flags & MPF_PREFIX2 )
{
- p1 = memchr(name,' ',nlen);
- if (p1)
- {
- const mkw_prefix_t *pre2 = FindPrefix(name,p1-name,true);
- if ( pre2 && pre2->flags & MPF_PREFIX2 )
- {
- spf->game2.ptr = name;
- spf->game2.len = p1 - name;
- spf->game.len += spf->game2.len + 1;
- spf->game2_color = pre2->color;
- name = p1+1;
- nlen = end - name;
- add_game = 2*pre2->order;
- }
- }
+ spf->game2.ptr = name;
+ spf->game2.len = strlen(pre2->prefix);
+ spf->game.len += spf->game2.len + 1;
+ spf->game2_color = pre2->color;
+ name += strlen(pre1->prefix) + 1;
+ nlen = end - name;
+ add_game = 2*pre2->order;
}
- spf->game_order += add_game;
- if (spf->boost.len)
- spf->game_order++;
}
+ spf->game_order += add_game;
+ if (spf->boost.len)
+ spf->game_order++;
}
-
+
//--- finally we have the pure name