--- metal/metal_class.php 2000/03/20 05:48:50 1.15 +++ metal/metal_class.php 2000/03/20 21:42:24 1.16 @@ -6,23 +6,22 @@ if(!defined("METAL_CLASS_INCLUDED")) /* * metal_class.php * - * @(#) $Header: /opt2/mlemos/cvs/metal/metal/metal_class.php,v 1.15 2000/03/20 05:48:50 mlemos Exp $ + * @(#) $Header: /opt2/mlemos/cvs/metal/metal/metal_class.php,v 1.16 2000/03/20 21:42:24 mlemos Exp $ * */ class metal_class_class extends metal_base_class { - var $class_file=""; - var $class_base_path=""; - var $functions=array(); - var $variables=array(); - var $function_name=""; - var $return_type=""; - var $return_value_set=0; + var $classes=array(); var $static_load=0; - Function Setup(&$compiler,&$code,&$attributes) + Function SetupClass(&$compiler,&$code,&$attributes,&$class) { + $class["function_name"]=""; + $class["return_type"]=""; + $class["return_value_set"]=0; + $class["functions"]=array(); + $class["variables"]=array(); $elements=$code->structure[$attributes->path]["Elements"]; for($element=0;$element<$elements;$element++) { @@ -52,9 +51,9 @@ class metal_class_class extends metal_ba } if(!$compiler->GetValidName($attributes->file,$function_element_path,&$name,"it was not specified a valid class function name option")) return(0); - if(IsSet($this->functions[$name])) + if(IsSet($class["functions"][$name])) { - $compiler->SetElementError($attributes->file,$function_element_path,"it was specified a NAME of an already defined class function"); + $compiler->SetElementError($attributes->file,$function_element_path,"it was specified a name of an already defined class function"); return(0); } break; @@ -192,24 +191,24 @@ class metal_class_class extends metal_ba $file=$function["do"]["file"]; $path=$function["do"]["path"]; $function["do"]=array(); - $this->functions[$name]=$function; - $function_name=$this->function_name; - $return_type=$this->return_type; - $return_value_set=$this->return_value_set; - $this->function_name=$name; - $this->return_type=$function["type"]; - $this->return_value_set=0; - if(!$compiler->GetOutputData($file,$path,&$this->functions[$name]["do"],"it were not defined valid class function do statements",1)) + $class["functions"][$name]=$function; + $function_name=$class["function_name"]; + $return_type=$class["return_type"]; + $return_value_set=$class["return_value_set"]; + $class["function_name"]=$name; + $class["return_type"]=$function["type"]; + $class["return_value_set"]=0; + if(!$compiler->GetOutputData($file,$path,&$class["functions"][$name]["do"],"it were not defined valid class function do statements",1)) return(0); if(strcmp($function["type"],"VOID") - && $this->return_value_set==0) + && $class["return_value_set"]==0) { $compiler->SetElementError($attributes->file,$attributes->path,"it was not set the class function return value"); return(0); } - $this->function_name=$function_name; - $this->return_type=$return_type; - $this->return_value_set=$return_value_set; + $class["function_name"]=$function_name; + $class["return_type"]=$return_type; + $class["return_value_set"]=$return_value_set; break; case "variable": Unset($name); @@ -231,7 +230,7 @@ class metal_class_class extends metal_ba } if(!$compiler->GetValidName($attributes->file,$variable_element_path,&$name,"it was not specified a valid class variable name option")) return(0); - if(IsSet($this->variables[$name])) + if(IsSet($class["variables"][$name])) { $compiler->SetElementError($attributes->file,$variable_element_path,"it was specified a name of an already defined class variable"); return(0); @@ -292,14 +291,51 @@ class metal_class_class extends metal_ba if(IsSet($variable["value"]) && !$compiler->ConvertData(&$attributes,$variable["type"],$variable["value"],&$variable["value"])) return(0); - $this->variables[$name]=$variable; + $class["variables"][$name]=$variable; + break; + case "file": + if(!$compiler->GetValidData($attributes->file,$element_path,&$class["file"],"it was not specified a valid class file")) + return(0); break; - case "classfile": - if(!$compiler->GetValidData($attributes->file,$element_path,&$this->class_file,"it was not specified a valid class file")) + case "basepath": + if(!$compiler->GetValidData($attributes->file,$element_path,&$class["basepath"],"it was not specified a valid class base path")) return(0); break; - case "classbasepath": - if(!$compiler->GetValidData($attributes->file,$element_path,&$this->class_base_path,"it was not specified a valid class base path")) + default: + $compiler->SetElementError($attributes->file,$element_path,$data["Tag"]." is not a supported class object class attribute"); + return(0); + } + } + else + { + if(!$compiler->CheckWhiteSpace($attributes->file,$data,$element_path)) + return(0); + } + } + return(1); + } + + Function Setup(&$compiler,&$code,&$attributes) + { + $elements=$code->structure[$attributes->path]["Elements"]; + for($element=0;$element<$elements;$element++) + { + $element_path=$attributes->path.",$element"; + $data=$code->structure[$element_path]; + if(GetType($data)=="array") + { + switch($data["Tag"]) + { + case "class": + if(IsSet($this->classes[0])) + { + $compiler->SetElementError($attributes->file,$element_path,"it was attempted to redefine the base class"); + return(0); + } + $this->classes[0]=array("index"=>0); + $class_attributes=$attributes; + $class_attributes->path=$element_path; + if(!$this->SetupClass(&$compiler,&$code,&$class_attributes,&$this->classes[0])) return(0); break; default: @@ -336,7 +372,7 @@ class metal_class_class extends metal_ba } if(!$compiler->GetValidData($context->file,$element_path,&$call["function"],"it was not specified a valid class $function function argument")) return(0); - if(!IsSet($this->functions[$call["function"]])) + if(!IsSet($this->classes[0]["functions"][$call["function"]])) { $compiler->SetElementError($context->file,$element_path,"it was requested to $function a class function that was not defined"); return(0); @@ -364,12 +400,12 @@ class metal_class_class extends metal_ba $compiler->SetElementError($context->file,$element_path,"it was not defined the function to call before specifying the $function arguments"); return(0); } - if(!IsSet($this->functions[$call["function"]]["Arguments"])) + if(!IsSet($this->classes[0]["functions"][$call["function"]]["Arguments"])) { $compiler->SetElementError($context->file,$element_path,"the specified function to $function does not take any arguments"); return(0); } - $function_arguments=$this->functions[$call["function"]]["Arguments"]; + $function_arguments=$this->classes[0]["functions"][$call["function"]]["Arguments"]; $argument_elements=$code->structure[$element_path]["Elements"]; for($argument_element=0;$argument_element<$argument_elements;$argument_element++) { @@ -416,7 +452,7 @@ class metal_class_class extends metal_ba Function GetClassTag() { - return("CLASS_".strtoupper(ereg_replace("[^A-Za-z0-9]","_",$this->class_file))); + return("CLASS_".strtoupper(ereg_replace("[^A-Za-z0-9]","_",$this->classes[0]["file"]))); } Function GenerateClass(&$result,&$initialization_result) @@ -426,7 +462,7 @@ class metal_class_class extends metal_ba "Data"=>0, "Type"=>"RESETINDENT" ); - if(strcmp($this->class_file,"")) + if(strcmp($this->classes[0]["file"],"")) { $result[]=array( "Data"=>"", @@ -453,20 +489,20 @@ class metal_class_class extends metal_ba "Data"=>1, "Type"=>"INDENT" ); - for(Reset($this->variables),$function=0;$functionvariables);$function++,Next($this->variables)) + for(Reset($this->classes[0]["variables"]),$function=0;$functionclasses[0]["variables"]);$function++,Next($this->classes[0]["variables"])) { - $name=Key($this->variables); - $value=(IsSet($this->variables[$name]["value"]) ? "=".$this->variables[$name]["value"] : ""); + $name=Key($this->classes[0]["variables"]); + $value=(IsSet($this->classes[0]["variables"][$name]["value"]) ? "=".$this->classes[0]["variables"][$name]["value"] : ""); $result[]=array( "Data"=>"var \$$name$value;", "Type"=>"COMMAND" ); } - for(Reset($this->functions),$function=0;$functionfunctions);$function++,Next($this->functions)) + for(Reset($this->classes[0]["functions"]),$function=0;$functionclasses[0]["functions"]);$function++,Next($this->classes[0]["functions"])) { - $name=Key($this->functions); + $name=Key($this->classes[0]["functions"]); if($function>0 - || count($this->variables)) + || count($this->classes[0]["variables"])) { $result[]=array( "Data"=>1, @@ -482,9 +518,9 @@ class metal_class_class extends metal_ba ); } $argument_list=""; - if(IsSet($this->functions[$name]["Arguments"])) + if(IsSet($this->classes[0]["functions"][$name]["Arguments"])) { - $arguments=$this->functions[$name]["Arguments"]; + $arguments=$this->classes[0]["functions"][$name]["Arguments"]; for(Reset($arguments),$argument=0;$argument0) @@ -504,12 +540,12 @@ class metal_class_class extends metal_ba "Data"=>1, "Type"=>"INDENT" ); - for($part=0;$partfunctions[$name]["do"]);$part++) + for($part=0;$partclasses[0]["functions"][$name]["do"]);$part++) { - if(strcmp($this->functions[$name]["do"][$part]["Type"],"INITIALIZATION")) - $result[]=$this->functions[$name]["do"][$part]; + if(strcmp($this->classes[0]["functions"][$name]["do"][$part]["Type"],"INITIALIZATION")) + $result[]=$this->classes[0]["functions"][$name]["do"][$part]; else - $initialization_result[]=$this->functions[$name]["do"][$part]; + $initialization_result[]=$this->classes[0]["functions"][$name]["do"][$part]; } $result[]=array( "Data"=>1, @@ -582,10 +618,10 @@ class metal_class_class extends metal_ba return(0); } } - $relative_path=$compiler->RelativePath($this->class_base_path,$this->class_file); + $relative_path=$compiler->RelativePath($this->classes[0]["basepath"],$this->classes[0]["file"]); $context->result[]=array( "Data"=>array( - "Name"=>$this->class_file, + "Name"=>$this->classes[0]["file"], "Type"=>"SUPPLIED" ), "Type"=>"FILE" @@ -690,9 +726,9 @@ class metal_class_class extends metal_ba return(0); } $argument_list=""; - if(IsSet($this->functions[$call["function"]]["Arguments"])) + if(IsSet($this->classes[0]["functions"][$call["function"]]["Arguments"])) { - $arguments=$this->functions[$call["function"]]["Arguments"]; + $arguments=$this->classes[0]["functions"][$call["function"]]["Arguments"]; for(Reset($arguments),$argument=0;$argument".$call["function"]."($argument_list)"; - if(strcmp($this->functions[$call["function"]]["type"],"VOID")) + if(strcmp($this->classes[0]["functions"][$call["function"]]["type"],"VOID")) { $context->result[]=array( "Data"=>array( @@ -733,30 +769,30 @@ class metal_class_class extends metal_ba } break; case "return": - if(!strcmp($this->return_type,"")) + if(!strcmp($this->classes[0]["return_type"],"")) { $compiler->SetElementError($context->file,$context->path,"the return function is being from called outside a class function"); return(0); } $evaluate_context=$context; - if(!$compiler->GetValidExpression(&$evaluate_context,$this->return_type,"NOTLEFT","it was not specified a valid class function return ".$this->return_type." expression",1) + if(!$compiler->GetValidExpression(&$evaluate_context,$this->classes[0]["return_type"],"NOTLEFT","it was not specified a valid class function return ".$this->classes[0]["return_type"]." expression",1) || !$compiler->GetExpressionValue(&$context,&$evaluate_context->result,&$return_value,&$expression_type)) return(0); $context->result[]=array( "Data"=>"return $return_value;", "Type"=>"COMMAND" ); - $this->return_value_set=1; + $this->classes[0]["return_value_set"]=1; break; case "instancevariable": - if(!strcmp($this->return_type,"")) + if(!strcmp($this->classes[0]["return_type"],"")) { $compiler->SetElementError($context->file,$context->path,"the instance variable function is being from called outside a class function"); return(0); } if(!$compiler->GetValidName($context->file,$context->path,&$name,"it was not specified a valid class variable name")) return(0); - if(!IsSet($this->variables[$name])) + if(!IsSet($this->classes[0]["variables"][$name])) { $compiler->SetElementError($context->file,$context->path,"it was not specified a defined class variable name"); return(0); @@ -764,7 +800,7 @@ class metal_class_class extends metal_ba $context->result[]=array( "Data"=>array( "Value"=>"\$"."this->$name", - "Type"=>$this->variables[$name]["type"], + "Type"=>$this->classes[0]["variables"][$name]["type"], "Side"=>"ANY" ), "Type"=>"EXPRESSION" @@ -811,7 +847,7 @@ class metal_class_class extends metal_ba } if(!$compiler->GetValidName($context->file,$context->path,&$name,"it was not specified a valid class variable name")) return(0); - if(!IsSet($this->variables[$name])) + if(!IsSet($this->classes[0]["variables"][$name])) { $compiler->SetElementError($context->file,$context->path,"it was not specified a defined class variable name"); return(0); @@ -819,26 +855,26 @@ class metal_class_class extends metal_ba $context->result[]=array( "Data"=>array( "Value"=>$object_variable["object"]."->$name", - "Type"=>$this->variables[$name]["type"], + "Type"=>$this->classes[0]["variables"][$name]["type"], "Side"=>"ANY" ), "Type"=>"EXPRESSION" ); break; case "functionargument": - if(!strcmp($this->function_name,"")) + if(!strcmp($this->classes[0]["function_name"],"")) { $compiler->SetElementError($context->file,$context->path,"the function argument function is being from called outside a class function"); return(0); } if(!$compiler->GetValidName($context->file,$context->path,&$name,"it was not specified a valid class function argument name")) return(0); - if(!IsSet($this->functions[$this->function_name]["Arguments"][$name])) + if(!IsSet($this->classes[0]["functions"][$this->classes[0]["function_name"]]["Arguments"][$name])) { $compiler->SetElementError($context->file,$context->path,"it was not specified a defined class function argument name"); return(0); } - $argument=$this->functions[$this->function_name]["Arguments"][$name]; + $argument=$this->classes[0]["functions"][$this->classes[0]["function_name"]]["Arguments"][$name]; $context->result[]=array( "Data"=>array( "Value"=>"\$".$name, @@ -849,7 +885,7 @@ class metal_class_class extends metal_ba ); break; case "output": - if(!strcmp($this->class_file,"")) + if(!strcmp($this->classes[0]["file"],"")) { $compiler->SetElementError($context->file,$context->path,"it was not specified the class output file"); return(0); @@ -857,11 +893,11 @@ class metal_class_class extends metal_ba $this->GenerateClass(&$result,&$initialization_result); if(!$compiler->GenerateOutput(&$context,&$result,&$output,"",0)) return(0); - if(!$compiler->CreateContextOutputDirectory(dirname($this->class_file),&$context,"it was not possible to create the directory for the class output file \"".dirname($this->class_file)."\"")) + if(!$compiler->CreateContextOutputDirectory(dirname($this->classes[0]["file"]),&$context,"it was not possible to create the directory for the class output file \"".dirname($this->classes[0]["file"])."\"")) return(0); - if(!($output_file=@fopen($this->class_file,"w"))) + if(!($output_file=@fopen($this->classes[0]["file"],"w"))) { - $compiler->SetElementError($context->file,$context->path,"it was not possible to open the class output file \"".$this->class_file."\""); + $compiler->SetElementError($context->file,$context->path,"it was not possible to open the class output file \"".$this->classes[0]["file"]."\""); return(0); } $written=fwrite($output_file,$output); @@ -874,7 +910,7 @@ class metal_class_class extends metal_ba } $context->result[]=array( "Data"=>array( - "Name"=>$this->class_file, + "Name"=>$this->classes[0]["file"], "Type"=>"GENERATED" ), "Type"=>"FILE" @@ -894,21 +930,21 @@ class metal_class_class extends metal_ba $compiler->SetElementError($context->file,$context->path,$compiler->language["name"]." is not a language supported by the class class"); return(0); } - if(strcmp($this->class_file,"")) + if(strcmp($this->classes[0]["file"],"")) { - for(Reset($this->functions),$function=0;$functionfunctions);$function++,Next($this->functions)) + for(Reset($this->classes[0]["functions"]),$function=0;$functionclasses[0]["functions"]);$function++,Next($this->classes[0]["functions"])) { - $name=Key($this->functions); - for($part=0;$partfunctions[$name]["do"]);$part++) + $name=Key($this->classes[0]["functions"]); + for($part=0;$partclasses[0]["functions"][$name]["do"]);$part++) { - if(!strcmp($this->functions[$name]["do"][$part]["Type"],"INITIALIZATION")) - $context->result[]=$this->functions[$name]["do"][$part]; + if(!strcmp($this->classes[0]["functions"][$name]["do"][$part]["Type"],"INITIALIZATION")) + $context->result[]=$this->classes[0]["functions"][$name]["do"][$part]; } } - $relative_path=$compiler->RelativePath($this->class_base_path,$this->class_file); + $relative_path=$compiler->RelativePath($this->classes[0]["basepath"],$this->classes[0]["file"]); $context->result[]=array( "Data"=>array( - "Name"=>$this->class_file, + "Name"=>$this->classes[0]["file"], "Type"=>"SUPPLIED" ), "Type"=>"FILE"