Cleanup
This commit is contained in:
parent
2c7050d437
commit
e943c8a434
3 changed files with 1167 additions and 1160 deletions
|
@ -49,7 +49,7 @@
|
|||
----------------------------------------------------------------------------*/
|
||||
|
||||
/// All dependencies hash
|
||||
local DependRule* DependHash[101];
|
||||
local DependRule* DependHash[101];
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Functions
|
||||
|
@ -63,8 +63,8 @@ local DependRule* DependHash[101];
|
|||
** @param count Amount of the required needed.
|
||||
** @param or_flag Start of or rule.
|
||||
*/
|
||||
global void AddDependency(const char* target,const char* required,int count
|
||||
,int or_flag)
|
||||
global void AddDependency(const char* target, const char* required, int count,
|
||||
int or_flag)
|
||||
{
|
||||
DependRule rule;
|
||||
DependRule* node;
|
||||
|
@ -74,106 +74,105 @@ global void AddDependency(const char* target,const char* required,int count
|
|||
//
|
||||
// Setup structure.
|
||||
//
|
||||
if ( !strncmp( target, "unit-", 5 ) ) {
|
||||
if (!strncmp(target, "unit-", 5)) {
|
||||
// target string refers to unit-xxx
|
||||
rule.Type = DependRuleUnitType;
|
||||
rule.Kind.UnitType = UnitTypeByIdent( target );
|
||||
} else if ( !strncmp( target, "upgrade-", 8 ) ) {
|
||||
rule.Kind.UnitType = UnitTypeByIdent(target);
|
||||
} else if (!strncmp(target, "upgrade-", 8)) {
|
||||
// target string refers to upgrade-XXX
|
||||
rule.Type = DependRuleUpgrade;
|
||||
rule.Kind.Upgrade = UpgradeByIdent( target );
|
||||
rule.Kind.Upgrade = UpgradeByIdent(target);
|
||||
} else {
|
||||
DebugLevel0Fn("dependency target `%s' should be unit-type or upgrade\n"
|
||||
_C_ target);
|
||||
DebugLevel0Fn("dependency target `%s' should be unit-type or upgrade\n" _C_
|
||||
target);
|
||||
return;
|
||||
}
|
||||
hash=(int)(long)rule.Kind.UnitType%(sizeof(DependHash)/sizeof(*DependHash));
|
||||
hash = (int)(long)rule.Kind.UnitType % (sizeof(DependHash) / sizeof(*DependHash));
|
||||
|
||||
//
|
||||
// Find correct hash slot.
|
||||
//
|
||||
if( (node=DependHash[hash]) ) { // find correct entry
|
||||
while( node->Type!=rule.Type
|
||||
|| node->Kind.Upgrade!=rule.Kind.Upgrade ) {
|
||||
if( !node->Next ) { // end of list
|
||||
temp=malloc(sizeof(DependRule));
|
||||
temp->Next=NULL;
|
||||
temp->Rule=NULL;
|
||||
temp->Type=rule.Type;
|
||||
temp->Kind=rule.Kind;
|
||||
node->Next=temp;
|
||||
node=temp;
|
||||
if ((node = DependHash[hash])) { // find correct entry
|
||||
while (node->Type != rule.Type ||
|
||||
node->Kind.Upgrade != rule.Kind.Upgrade) {
|
||||
if (!node->Next) { // end of list
|
||||
temp = malloc(sizeof(DependRule));
|
||||
temp->Next = NULL;
|
||||
temp->Rule = NULL;
|
||||
temp->Type = rule.Type;
|
||||
temp->Kind = rule.Kind;
|
||||
node->Next = temp;
|
||||
node = temp;
|
||||
break;
|
||||
}
|
||||
node=node->Next;
|
||||
}
|
||||
} else { // create new slow
|
||||
node=malloc(sizeof(DependRule));
|
||||
node->Next=NULL;
|
||||
node->Rule=NULL;
|
||||
node->Type=rule.Type;
|
||||
node->Kind=rule.Kind;
|
||||
DependHash[hash]=node;
|
||||
node = malloc(sizeof(DependRule));
|
||||
node->Next = NULL;
|
||||
node->Rule = NULL;
|
||||
node->Type = rule.Type;
|
||||
node->Kind = rule.Kind;
|
||||
DependHash[hash] = node;
|
||||
}
|
||||
|
||||
//
|
||||
// Adjust count.
|
||||
//
|
||||
if ( count < 0 || count > 255 ) {
|
||||
if (count < 0 || count > 255) {
|
||||
DebugLevel0Fn("wrong count `%d' range 0 .. 255\n" _C_ count);
|
||||
count = 255;
|
||||
}
|
||||
|
||||
temp=malloc(sizeof(DependRule));
|
||||
temp->Rule=NULL;
|
||||
temp->Next=NULL;
|
||||
temp->Count=count;
|
||||
temp = malloc(sizeof(DependRule));
|
||||
temp->Rule = NULL;
|
||||
temp->Next = NULL;
|
||||
temp->Count = count;
|
||||
//
|
||||
// Setup structure.
|
||||
//
|
||||
if ( !strncmp( required, "unit-", 5 ) ) {
|
||||
if (!strncmp(required, "unit-", 5)) {
|
||||
// required string refers to unit-xxx
|
||||
temp->Type = DependRuleUnitType;
|
||||
temp->Kind.UnitType = UnitTypeByIdent( required );
|
||||
} else if ( !strncmp( required, "upgrade-", 8 ) ) {
|
||||
temp->Kind.UnitType = UnitTypeByIdent(required);
|
||||
} else if (!strncmp(required, "upgrade-", 8)) {
|
||||
// required string refers to upgrade-XXX
|
||||
temp->Type = DependRuleUpgrade;
|
||||
temp->Kind.Upgrade = UpgradeByIdent( required );
|
||||
temp->Kind.Upgrade = UpgradeByIdent(required);
|
||||
} else {
|
||||
DebugLevel0Fn(
|
||||
"dependency required `%s' should be unit-type or upgrade\n"
|
||||
_C_ required);
|
||||
DebugLevel0Fn("dependency required `%s' should be unit-type or upgrade\n" _C_
|
||||
required);
|
||||
free(temp);
|
||||
return;
|
||||
}
|
||||
|
||||
if( or_flag ) {
|
||||
if (or_flag) {
|
||||
// move rule to temp->next
|
||||
temp->Next=node->Rule; // insert rule
|
||||
node->Rule=temp;
|
||||
temp->Next = node->Rule; // insert rule
|
||||
node->Rule = temp;
|
||||
} else {
|
||||
// move rule to temp->rule
|
||||
temp->Rule=node->Rule; // insert rule
|
||||
temp->Rule = node->Rule; // insert rule
|
||||
|
||||
// also Link temp to old "or" list
|
||||
if (node->Rule) {
|
||||
temp->Next=node->Rule->Next;
|
||||
temp->Next = node->Rule->Next;
|
||||
}
|
||||
|
||||
node->Rule=temp;
|
||||
node->Rule = temp;
|
||||
}
|
||||
|
||||
#ifdef neverDEBUG
|
||||
printf("New rules are :");
|
||||
node=node->Rule;
|
||||
while(node){
|
||||
temp=node;
|
||||
while(temp){
|
||||
printf("temp->Kind.UnitType=%p ",temp->Kind.UnitType);
|
||||
temp=temp->Rule;
|
||||
}
|
||||
node=node->Next;
|
||||
printf("\n or ... ");
|
||||
node = node->Rule;
|
||||
while (node) {
|
||||
temp = node;
|
||||
while (temp){
|
||||
printf("temp->Kind.UnitType=%p ", temp->Kind.UnitType);
|
||||
temp = temp->Rule;
|
||||
}
|
||||
node = node->Next;
|
||||
printf("\n or ... ");
|
||||
}
|
||||
printf("\n");
|
||||
#endif
|
||||
|
@ -187,7 +186,7 @@ global void AddDependency(const char* target,const char* required,int count
|
|||
**
|
||||
** @return True if available, false otherwise.
|
||||
*/
|
||||
global int CheckDependByIdent(const Player* player,const char* target)
|
||||
global int CheckDependByIdent(const Player* player, const char* target)
|
||||
{
|
||||
DependRule rule;
|
||||
const DependRule* node;
|
||||
|
@ -197,17 +196,17 @@ global int CheckDependByIdent(const Player* player,const char* target)
|
|||
//
|
||||
// first have to check, if target is allowed itself
|
||||
//
|
||||
if ( !strncmp( target, "unit-", 5 ) ) {
|
||||
if (!strncmp(target, "unit-", 5)) {
|
||||
// target string refers to unit-XXX
|
||||
rule.Kind.UnitType = UnitTypeByIdent( target );
|
||||
if ( UnitIdAllowed( player, rule.Kind.UnitType->Type ) != 'A' ) {
|
||||
rule.Kind.UnitType = UnitTypeByIdent(target);
|
||||
if (UnitIdAllowed(player, rule.Kind.UnitType->Type) != 'A') {
|
||||
return 0;
|
||||
}
|
||||
rule.Type = DependRuleUnitType;
|
||||
} else if ( !strncmp( target, "upgrade-", 8 ) ) {
|
||||
} else if (!strncmp(target, "upgrade-", 8)) {
|
||||
// target string refers to upgrade-XXX
|
||||
rule.Kind.Upgrade = UpgradeByIdent( target );
|
||||
if( UpgradeIdAllowed( player, rule.Kind.Upgrade-Upgrades ) != 'A' ) {
|
||||
rule.Kind.Upgrade = UpgradeByIdent(target);
|
||||
if (UpgradeIdAllowed(player, rule.Kind.Upgrade-Upgrades) != 'A') {
|
||||
return 0;
|
||||
}
|
||||
rule.Type = DependRuleUpgrade;
|
||||
|
@ -219,15 +218,15 @@ global int CheckDependByIdent(const Player* player,const char* target)
|
|||
//
|
||||
// Find rule
|
||||
//
|
||||
i=(int)(long)rule.Kind.UnitType%(sizeof(DependHash)/sizeof(*DependHash));
|
||||
i = (int)(long)rule.Kind.UnitType % (sizeof(DependHash) / sizeof(*DependHash));
|
||||
|
||||
if( (node=DependHash[i]) ) { // find correct entry
|
||||
while( node->Type!=rule.Type
|
||||
|| node->Kind.Upgrade!=rule.Kind.Upgrade ) {
|
||||
if( !node->Next ) { // end of list
|
||||
if ((node = DependHash[i])) { // find correct entry
|
||||
while (node->Type != rule.Type ||
|
||||
node->Kind.Upgrade != rule.Kind.Upgrade) {
|
||||
if (!node->Next) { // end of list
|
||||
return 1;
|
||||
}
|
||||
node=node->Next;
|
||||
node = node->Next;
|
||||
}
|
||||
} else {
|
||||
return 1;
|
||||
|
@ -236,31 +235,31 @@ global int CheckDependByIdent(const Player* player,const char* target)
|
|||
//
|
||||
// Prove the rules
|
||||
//
|
||||
node=node->Rule;
|
||||
node = node->Rule;
|
||||
|
||||
while( node ) {
|
||||
temp=node;
|
||||
while( temp ) {
|
||||
switch( temp->Type ) {
|
||||
case DependRuleUnitType:
|
||||
i=HaveUnitTypeByType( player, temp->Kind.UnitType );
|
||||
if ( temp->Count ? i<temp->Count : i ) {
|
||||
goto try_or;
|
||||
}
|
||||
break;
|
||||
case DependRuleUpgrade:
|
||||
i=UpgradeIdAllowed( player, temp->Kind.Upgrade-Upgrades) != 'R';
|
||||
if ( temp->Count ? i : !i ) {
|
||||
goto try_or;
|
||||
}
|
||||
break;
|
||||
while (node) {
|
||||
temp = node;
|
||||
while (temp) {
|
||||
switch (temp->Type) {
|
||||
case DependRuleUnitType:
|
||||
i = HaveUnitTypeByType(player, temp->Kind.UnitType);
|
||||
if (temp->Count ? i < temp->Count : i) {
|
||||
goto try_or;
|
||||
}
|
||||
break;
|
||||
case DependRuleUpgrade:
|
||||
i = UpgradeIdAllowed(player, temp->Kind.Upgrade-Upgrades) != 'R';
|
||||
if (temp->Count ? i : !i) {
|
||||
goto try_or;
|
||||
}
|
||||
break;
|
||||
}
|
||||
temp=temp->Rule;
|
||||
temp = temp->Rule;
|
||||
}
|
||||
return 1; // all rules matches.
|
||||
|
||||
try_or:
|
||||
node=node->Next;
|
||||
node = node->Next;
|
||||
}
|
||||
|
||||
return 0; // no rule matches
|
||||
|
@ -269,7 +268,9 @@ try_or:
|
|||
/**
|
||||
** Initialize unit and upgrade dependencies.
|
||||
*/
|
||||
global void InitDependencies(void){}
|
||||
global void InitDependencies(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
** Save state of the dependencies to file.
|
||||
|
@ -288,48 +289,48 @@ global void SaveDependencies(CLFile* file)
|
|||
|
||||
// Save all dependencies
|
||||
|
||||
for( u=0; u<sizeof(DependHash)/sizeof(*DependHash); ++u ) {
|
||||
node=DependHash[u];
|
||||
while( node ) { // all hash links
|
||||
CLprintf(file,"(define-dependency '");
|
||||
switch( node->Type ) {
|
||||
for (u = 0; u < sizeof(DependHash) / sizeof(*DependHash); ++u) {
|
||||
node = DependHash[u];
|
||||
while (node) { // all hash links
|
||||
CLprintf(file, "(define-dependency '");
|
||||
switch (node->Type) {
|
||||
case DependRuleUnitType:
|
||||
CLprintf(file,"%s",node->Kind.UnitType->Ident);
|
||||
CLprintf(file, "%s", node->Kind.UnitType->Ident);
|
||||
break;
|
||||
case DependRuleUpgrade:
|
||||
CLprintf(file,"%s",node->Kind.Upgrade->Ident);
|
||||
CLprintf(file, "%s", node->Kind.Upgrade->Ident);
|
||||
break;
|
||||
}
|
||||
// All or cases
|
||||
|
||||
CLprintf(file,"\n '(");
|
||||
rule=node->Rule;
|
||||
for( ;; ) {
|
||||
temp=rule;
|
||||
while( temp ) {
|
||||
switch( temp->Type ) {
|
||||
case DependRuleUnitType:
|
||||
CLprintf(file,"%s",temp->Kind.UnitType->Ident);
|
||||
break;
|
||||
case DependRuleUpgrade:
|
||||
CLprintf(file,"%s",temp->Kind.Upgrade->Ident);
|
||||
break;
|
||||
CLprintf(file, "\n '(");
|
||||
rule = node->Rule;
|
||||
for (;;) {
|
||||
temp = rule;
|
||||
while (temp) {
|
||||
switch (temp->Type) {
|
||||
case DependRuleUnitType:
|
||||
CLprintf(file, "%s", temp->Kind.UnitType->Ident);
|
||||
break;
|
||||
case DependRuleUpgrade:
|
||||
CLprintf(file, "%s", temp->Kind.Upgrade->Ident);
|
||||
break;
|
||||
}
|
||||
temp=temp->Rule;
|
||||
if( temp ) {
|
||||
temp = temp->Rule;
|
||||
if (temp) {
|
||||
CLprintf(file," ");
|
||||
}
|
||||
}
|
||||
CLprintf(file,")");
|
||||
if( !(rule=rule->Next) ) {
|
||||
CLprintf(file, ")");
|
||||
if (!(rule = rule->Next)) {
|
||||
break;
|
||||
}
|
||||
CLprintf(file,"\n 'or '( ");
|
||||
CLprintf(file, "\n 'or '( ");
|
||||
}
|
||||
|
||||
CLprintf(file,")\n");
|
||||
CLprintf(file, ")\n");
|
||||
|
||||
node=node->Next;
|
||||
node = node->Next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -347,30 +348,30 @@ global void CleanDependencies(void)
|
|||
|
||||
// Free all dependencies
|
||||
|
||||
for( u=0; u<sizeof(DependHash)/sizeof(*DependHash); ++u ) {
|
||||
node=DependHash[u];
|
||||
while( node ) { // all hash links
|
||||
for (u = 0; u < sizeof(DependHash) / sizeof(*DependHash); ++u) {
|
||||
node = DependHash[u];
|
||||
while (node) { // all hash links
|
||||
// All or cases
|
||||
|
||||
rule=node->Rule;
|
||||
while( rule ) {
|
||||
if( rule ) {
|
||||
temp=rule->Rule;
|
||||
while( temp ) {
|
||||
next=temp;
|
||||
temp=temp->Rule;
|
||||
rule = node->Rule;
|
||||
while (rule) {
|
||||
if (rule) {
|
||||
temp = rule->Rule;
|
||||
while (temp) {
|
||||
next = temp;
|
||||
temp = temp->Rule;
|
||||
free(next);
|
||||
}
|
||||
}
|
||||
temp=rule;
|
||||
rule=rule->Next;
|
||||
temp = rule;
|
||||
rule = rule->Next;
|
||||
free(temp);
|
||||
}
|
||||
temp=node;
|
||||
node=node->Next;
|
||||
temp = node;
|
||||
node = node->Next;
|
||||
free(temp);
|
||||
}
|
||||
DependHash[u]=NULL;
|
||||
DependHash[u] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -394,40 +395,40 @@ local SCM CclDefineDependency(SCM list)
|
|||
SCM temp;
|
||||
int or_flag;
|
||||
|
||||
value=gh_car(list);
|
||||
list=gh_cdr(list);
|
||||
target=gh_scm2newstr(value,NULL);
|
||||
value = gh_car(list);
|
||||
list = gh_cdr(list);
|
||||
target = gh_scm2newstr(value,NULL);
|
||||
|
||||
//
|
||||
// All or rules.
|
||||
//
|
||||
or_flag=0;
|
||||
while( !gh_null_p(list) ) {
|
||||
temp=gh_car(list);
|
||||
list=gh_cdr(list);
|
||||
or_flag = 0;
|
||||
while (!gh_null_p(list)) {
|
||||
temp = gh_car(list);
|
||||
list = gh_cdr(list);
|
||||
|
||||
while( !gh_null_p(temp) ) {
|
||||
value=gh_car(temp);
|
||||
temp=gh_cdr(temp);
|
||||
required=gh_scm2newstr(value,NULL);
|
||||
count=1;
|
||||
if( !gh_null_p(temp) && gh_exact_p(temp) ) {
|
||||
value=gh_car(temp);
|
||||
count=gh_scm2int(value);
|
||||
temp=gh_cdr(temp);
|
||||
while (!gh_null_p(temp)) {
|
||||
value = gh_car(temp);
|
||||
temp = gh_cdr(temp);
|
||||
required = gh_scm2newstr(value, NULL);
|
||||
count = 1;
|
||||
if (!gh_null_p(temp) && gh_exact_p(temp)) {
|
||||
value = gh_car(temp);
|
||||
count = gh_scm2int(value);
|
||||
temp = gh_cdr(temp);
|
||||
}
|
||||
|
||||
AddDependency(target,required,count,or_flag);
|
||||
AddDependency(target, required, count, or_flag);
|
||||
free(required);
|
||||
or_flag=0;
|
||||
or_flag = 0;
|
||||
}
|
||||
if( !gh_null_p(list) ) {
|
||||
if( !gh_eq_p(gh_car(list),gh_symbol2scm("or")) ) {
|
||||
errl("not or symbol",gh_car(list));
|
||||
if (!gh_null_p(list)) {
|
||||
if (!gh_eq_p(gh_car(list), gh_symbol2scm("or"))) {
|
||||
errl("not or symbol", gh_car(list));
|
||||
return SCM_UNSPECIFIED;
|
||||
}
|
||||
or_flag=1;
|
||||
list=gh_cdr(list);
|
||||
or_flag = 1;
|
||||
list = gh_cdr(list);
|
||||
}
|
||||
}
|
||||
free(target);
|
||||
|
@ -468,9 +469,9 @@ local SCM CclCheckDependency(SCM target __attribute__((unused)))
|
|||
*/
|
||||
global void DependenciesCclRegister(void)
|
||||
{
|
||||
gh_new_procedureN("define-dependency",CclDefineDependency);
|
||||
gh_new_procedure1_0("get-dependency",CclGetDependency);
|
||||
gh_new_procedure1_0("check-dependency",CclCheckDependency);
|
||||
gh_new_procedureN("define-dependency", CclDefineDependency);
|
||||
gh_new_procedure1_0("get-dependency", CclGetDependency);
|
||||
gh_new_procedure1_0("check-dependency", CclCheckDependency);
|
||||
}
|
||||
|
||||
//@}
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue