# Copyright (C) 2002-2004 gregoire HUBERT.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Author : gregoire HUBERT
#
# XML_node.objet
#
# This object is an XML node representation
#
# /- name (string)
# xml_node --- attributes (array)
# \- children (array) or value (string)
class xml_node {
var $name;
var $attributes = array();
var $children = array();
var $value = "";
function xml_node($name,$attributes,$children=array(),$value="") {
$this->name = $name;
if (is_array($attributes)) {
$this->attributes = $attributes;
}
$this->children = $children;
$this->value = $value;
}
}
# Copyright (C) 2003-2004 gregoire HUBERT.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Author : gregoire HUBERT
#
# xml_tree class
#
# This object parses an XML stream and offers a tree composed by xml_nodes
#
class xml_tree {
var $xml_stream;
var $current_node;
var $root_node;
var $index;
var $value;
function xml_tree() {
$this->root_node = new xml_node("__ROOT_NODE",array());
$this->current_node = $this->root_node;
}
function add_tree($xml_stream) {
# Managing the parser
$this->xml_stream = $xml_stream;
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
if (!xml_parse_into_struct($xml_parser,$this->xml_stream,$this->value,$this->index)) {
xml_parser_free($xml_parser);
die("XML Parse error");
}
xml_parser_free($xml_parser);
# Now, $this->value and $this->index are informed, we can use the get_node methode.
$tab_result = $this->get_node(0,count($this->value) - 1);
$this->root_node->children[] = $tab_result[0];
$this->current_node = $this->root_node;
}
function get_node($index_start,$index_stop) {
#echo " \n";
#echo "GET-NODE($index_start,$index_stop) \n";
# What we are going to return is an array of xml_nodes
$return_tab = array();
# depth is only here to check if everything is all right
$tab_node = $this->value[$index_start];
$depth = $tab_node["level"]-1;
# Now we have to be sure we do not forget a single node
for ($index = $index_start;$index <= $index_stop;$index++) {
#echo "\$index = $index ";
# get the current node
$tab_node = $this->value[$index];
# what type of node is it ?
switch($tab_node["type"]) {
case "complete" :
# Depth integrity check
if ($tab_node["level"] != $depth+1) {
die("ERREUR # contrainte d'intégrité au noeud complet $index, niveau $depth + 1 au lieu de ".$tab_node["level"]);
}
#echo "Noeud complet trouvé position $index TAG ".$tab_node["tag"]." \n";
# Easy one, no children to manage, only a value...
$return_tab[] = new xml_node($tab_node["tag"],$tab_node["attributes"],"",$tab_node["value"]);
break;
case "open" :
# Depth integrity check
if ($tab_node["level"] != $depth +1 ) {
die("ERREUR # contrainte d'intégrité au noeud ouvert $index, niveau $depth au lieu de ".$tab_node["level"]);
}
# Open tag, we re-use this methode to return its children
# Where is the correspondong close tag ?
$node_index = $this->index[$tab_node["tag"]];
$flipped_node_index = array_flip($node_index);
#echo "This ".$tab_node["tag"]." is at coords ".$flipped_node_index[$index]." ";
$i=1;
do {
$next_index = $node_index[$flipped_node_index[$index] + $i++];
$next_tag=$this->value[$next_index];
}
while ($next_tag["level"]!=$tab_node["level"]);
#echo "Ouverture de noeud détectée pos $index TAG ".$tab_node["tag"]." \n Parcours jusqu au $next_index \n";
# good, we can now instanciate our node
$return_tab[] = new xml_node($tab_node["tag"],$tab_node["attributes"],$this->get_node($index+1,$next_index),"");
# As we called the get_node methode, we are sure that nodes have been parsed to the corresponding close tag
$index = $next_index;
break;
case "close" :
# Depth integrity check
if ($tab_node["level"] != $depth ){
die("ERREUR # contrainte d'intégrité au noeud fermé $index, niveau $depth au lieu de ".$tab_node["level"]);
}
#echo "Fermeture de noeud detectée pos $index TAG ".$tab_node["tag"]."
\n";
# This ugly thing is useless because reaching a close tag means that $index==$index_stop but who knows ? =)
# it will be skipped soon
$index = $index_stop;
break;
default:
die("Erreur de type de TAG non déterminé :'".$tab_node["type"]."'");
}
}
# We are out ... returns the array with collected children...
return ($return_tab);
}
# this function browse the xml tree and set the current node to the selected node
function give_node($path) {
if ($path[0]=="/") {
$current_node=$this->root_node;
$path=substr($path,1);
#echo "ABSOLUTE PATH GIVEN=$path ";
}
else {
$current_node = $this->current_node;
}
#echo "PATH GIVEN=$path ";
$tab_path = split("/",$path);
foreach ($tab_path as $node_expr) {
#echo "STUDYING EXPR='$node_expr' ";
$node = $current_node;
$expr_tab = split("\?",$node_expr);
$node_name = $expr_tab[0];
$attr_tab = 0;
if (count($expr_tab)>1) {
##echo "TROUVE AU MOINS UNE CONDITION SUR LES ATTRIBUTS... ";
$attr_expr_tab=split(",",$expr_tab[1]);
$attr_tab=array();
foreach($attr_expr_tab as $attr_expr) {
$attr_split_expr=split("=",$attr_expr);
$attr_tab[$attr_split_expr[0]]=$attr_split_expr[1];
}
}
$last=0;
foreach ($node->children as $children) {
#echo "COMPARING WITH '$children->name' ";
if ($children->name == $node_name) {
##echo "TROUVE NOEUD CORRESPONDANT $node_name ";
if (is_array($attr_tab)) {
$node_attributes = $children->attributes;
foreach ($attr_tab as $key=>$value) {
if ($node_attributes[$key] == $value) {
#echo "ATTRIBUTE & CHANGE CURRENT NODE TO ".$children->name." ";
$current_node = $children;
$last = 1;
}
}
}
else {
##echo "CHILD=".$children->name." ";
#echo "CHANGE CURRENT NODE TO ".$children->name." ";
$current_node = $children;
$last=1;
}
}
if ($last) {
break;
}
}
if (!$last) {
#echo "PATH ERROR $node_name ";
#die("MMmmmh It seems that this file is not a DIA XML format...sorry...");
return 0;
}
}
return $current_node;
}
function browse_tree($path) {
$node = $this->give_node($path);
if (is_object($node)) {
$this->current_node = $node;
return 1;
}
return 0;
}
# this method dumps an html representation of the xml tree
function xml_show($node = "",$level=0,$last=0) {
if ($node=="") {
$node=$this->root_node;
}
if (!is_object($node)) {
die("ERROR : node is not an object");
}
$line="";
for($i=1;$i<=$level;$i++) {
if ((i==$level-1) and ($last)) {
$line.=" ";
}
else {
$line.=" |";
}
if ($i==$level) {
$line.="`-";
}
}
$line.=$node->name;
#echo $line;
$line.="".count($node->children)."";
if (count($node->children)==1) {
$line.=" (".$node->value.") \n";
echo "$line";
}
else {
$line.=" \n";
echo "$line";
$i=1;
foreach($node->children as $children) {
if ($i==count($node->children)) {
$this->xml_show($children,$level+1,1);
}
else {
$this->xml_show($children,$level+1);
}
$i++;
}
}
}
#END_CLASS
}
BLOODSPOT (de) - By The Horns (2013)
Label : Bret Hard Records
Sortie du Scud : 29 novembre 2013
Pays : Allemagne
Genre : Thrash / Death Metal
Type : Album
Playtime : 9 Titres - 38 Mins
Ce n'est pas l'ambiance des fêtes de Bayonne. Encore moins celle d'Intervilles. Pourtant, BLOODSPOT a un point commun avec ces deux évènements. Un point commun... cornu. Après avoir fait dans le meurtre via Embrace The End en 2011, ces allemands assument enfin leur paire de couilles et veulent prendre le taureau By The Horns en 2013. Dont acte, surtout dans un pays très peu concerné par les problèmes éthiques soulevés par la pratique de la corrida. L'Allemagne a d'autres soucis en tête, comme par exemple de savoir qui va prendre la relève de son "Big Three Of Teutotic Thrash" une fois que Tom Angelripper, Mille Petrozza et Schmier auront rendu les armes, ou pire encore, qu'ils les auront passées à gauche. BLOODSPOT candidat ? BLOODSPOT potentiel successeur ? Manifestement, ce n'est pas le moment, d'autant que ce second opus va envoyer le quintet germanique faire campagne en... Amérique !
Tout se perd ! Avec un tel patrimoine "thrashistique" derrière lui, BLOODSPOT avait le devoir moral d'honorer ses aïeuls. Et quels groupes ne devine-t-on pas derrière By The Horns ? Je vous le donne en mille Emile : SLAYER, ANTHRAX, DEATH ANGEL, EXODUS, TESTAMENT. Avec une lichette de LAMB OF GOD et de PANTERA sous le derme. Au moins, le choix est tranché. Même pas l'ombre d'un riff SODOMite au hasard d'un "Death Illusion" fourre-tout. Ô tristesse. Plus sérieusement maintenant (car oui, BLOODSPOT est bien libre de faire ce qu'il veut après tout), on appréciera forcément chez By The Horns une vitesse d'exécution ébouriffante, boostée par la voix profonde (et presque Death) de Peter Kunz. Ce gène de nervosité universel qui est omniprésent dans l'ADN de ce groupe est bel et bien la raison pour laquelle on tapera du pied aussi souvent, malgré le peu d'originalité d'un morceau introductif comme "And They Brought Gold". C'est d'ailleurs à n'en pas douter le seul défaut de ce disque, qui brode son Thrash Metal d'un fil fragile, à deux doigts de rompre quand l'ennui se pointe autour de "Death Down There Hold My Approach". BLOODSPOT est une formation très professionnelle mais désespérément fade, se contentant de brefs épisodes en simili-mid-tempo ("Burst Black", "Enter The Gray", "Volcanos") pour tremper sa tartine de Thrash dans un fond d'eau tiède vaguement groovy. Alors oui, on devine dans la foulée un fond de commerce texan (PANTERA encore ?) soutenu par ce crâne de buffle représenté en couverture, mais c'est surtout une façade visuelle, car en musique c'est Waterloo morne plaine. Il ne se passe pas grand-chose sur ce second opus, (trop) propre, (trop) appliqué, sans un mot de travers, sans une composition forte. Les teutons ont déroulé, avec toute l'intensité qu'on aime dans ce Thrash teinté de Death et toute la banalité qu'on n'aime pas dans ce Thrash teinté de Death. Une non-performance (à ne pas confondre avec contre-performance !) qui rend caduque la production de Markus Teske (EXHUMER, U.D.O...).
BLOODSPOT voulait prendre le taureau par les cornes ? Tout juste peut-on parler d'une vachette un peu nerveuse, pas très à l'aise à l'idée de se donner en spectacle. Certes, By The Horns vainc plus qu'il ne convainc, mais c'est surtout avec facilité, fort d'une aptitude à jouer du Thrash sans faire un vrai effort d'écriture derrière. Une victoire facile face à un taurillon fragile, confirmant la maxime selon laquelle à vaincre sans péril on triomphe sans gloire.
Ajouté : Vendredi 07 Août 2015 Chroniqueur : Stef. Score : Lien en relation: Bloodspot Website Hits: 5994
|