This commit is contained in:
jsalmon3 2003-10-02 15:15:06 +00:00
parent 2c7050d437
commit e943c8a434
3 changed files with 1167 additions and 1160 deletions

View file

@ -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