Login   Register  
PHP Classes
elePHPant
Icontem

File: fx-conf.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Jonathan Gotti  >  Console App  >  fx-conf.php  >  Download  
File: fx-conf.php
Role: Auxiliary script
Content type: text/plain
Description: use to manage config file
Class: Console App
Parse and retrieve command line argument values
Author: By
Last change:
Date: 2006-02-03 05:26
Size: 5,000 bytes
 

Contents

Class file image Download
<?php
/**
* @author Jonathan Gotti <nathan at the-ring dot homelinux dot net>
* @copyleft (l) 2003-2004  Jonathan Gotti
* @package config
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @changelog 2005-09-30 - remove GUI_TYPE==GTK suppport
*                       - optimize all the code for better performance (parsing) and better multiline support (writing)
* @changelog 2005-06-11 - now write_conf_file() can unset or comment some vars using --COMMENT--,--UNSET-- in place of the value
*/

/**
* read a config file and define CONSTANT in it or return it as an array
* @param string $file_path
* @param bool $out default is FALSE mean define the value, return an array if set to TRUE
* @return array | bool depend on $out
*/
function parse_conf_file($file_path,$out false){
    if(! 
file_exists($file_path))
        return 
FALSE;
    
# get file content
  
if(! is_array($conf file($file_path))){
    return 
False;
  }
  
# parse conf file
    
$preserve FALSE;
    foreach(
$conf as $line){
    if(
ereg("^[[:blank:]]*#+",$line))
      continue;
    if(
$preserve && preg_match("!^\s*((?:[^#\\\\]+|\\\\[^\s]+)+)(\\\\?)\s*!",$line,$match)){ # continue line
      
$value .= $match[1];
      
$preserve = ((trim($match[2])!=='\\')?FALSE:TRUE);
    }elseif(
preg_match("!^\s*([^#=]+)=((?:[^#\\\\]+|\\\\[^\r\n]+)+)(\\\\?)\s*$!",$line,$match)){ # read line
      
$var  trim($match[1]);
      
$value$match[2];
      
$preserve = ((trim($match[3])!=='\\')?FALSE:TRUE);
        }else{
      continue; 
# considered as commentary
        
}
    
    if(
$preserve) continue;
    
$value preg_replace(array("!(%([^%\s]+)%)!","!\\\\\s*\r?\n!"),array('".\\2."',"\n"),trim($value));

    if(! 
in_array(strtoupper($value),array('NULL','FALSE','TRUE')) )
      
$value '"'.($out?str_replace('"','\\"',$value):$value).'"';

    if(! 
$out)
      eval(
'define("'.trim($var).'",'.$value.');');
    else
      eval(
'$out_[$var]='.$value.';');
  }

    return 
$out?@$out_:TRUE;
}

/**
* prend un tableau associatif et ajoute les entrée dans un fichier de configuration
* en conservant les commentaires ainsi que les valeurs non renseigné
* @param string $file file to write configuration
* @param array $config the configuration to add to config file
* @param bool $force if true create the file if doesn't exist
* @return bool
* @changelog 2005-06-11 now can unset or comment some vars using --COMMENT--,--UNSET-- in place of the value
*/
function write_conf_file($file,$config,$force=FALSE){
  if(! 
is_array($config))
    return 
FALSE;
    
# check if file exist or not
  
if( (! file_exists($file))&& (!$force) )
        return 
FALSE;
  
# get the old config
  
if( (!is_array($oldconf = @file($file)))&& (!$force))
    return 
FALSE;
  
# first rewrite old conf
  
if(is_array($oldconf)){
    
$follow FALSE;
    foreach(
$oldconf as $linenb => $line){
      if( 
preg_match("!^\s*#!",$line)){# keep comment lines
        
$newconf[$linenb]=$line;
      }elseif(
preg_match("!^\s*([^#=]+)=([^#\\\\]+)(\\\\?)!",$line,$match)){ # first line of config var
        
$var trim($match[1]); # get varname

        
if(! isset($config[$var])) # not set so keep the line as is
          
$newconf[$linenb] = $line;
        else 
# we have a new value we write it
          
$newconf[$linenb] = _write_conf_line($var,$config[$var],$line);

        if(
preg_match('!\\\\\s*\n$!',$line))
          
$follow TRUE;
      }elseif(
$follow){ # multiline values
        
if(!isset($config[$var])){ # keep old multiline values
          
$newconf[$linenb] = $line;
        }elseif(
trim($config[$var])==='--COMMENT--' ){ # comment all multilines values
          
$newconf[$linenb] = "#~ $line";
        }
        if(! 
preg_match('!\\\\\s*\n$!',$line))
          
$follow FALSE;
      }
      if( (! 
$follow) && @isset($config[$var]) )
        unset(
$config[$var]);

    }
    if(
count($config)>0){ # write new config vars at the end
      
foreach($config as $var=>$value)
        
$newconf[] = _write_conf_line($var,$value);
    }
  }elseif(
$force){
    foreach(
$config as $var=>$value)
      
$newconf[] = _write_conf_line($var,$value);
    }
  return 
array2file(@$newconf,$file);
}
    
/**
* take an array and write each value as a line
* @param array $arr array containings data to write
* @param string $file file to write in it
* @return bool
*/
function array2file($arr,$file){
  if(! 
is_array($arr) ) return FALSE;
  if(! 
$f fopen($file,'w'))
        return 
FALSE;
    
fputs($f,implode('',$arr));
  return 
fclose($f);
}

/**
* used by write_conf_file to prepare line for passed values
*/
function _write_conf_line($var,$value=null,$oldline=null){
  
$commented = (substr_count($value,'--COMMENT--')?TRUE:FALSE);
  
$value $value?preg_replace("!([^\\\\])\r?\n!",($commented?"\\1\\\\\n# ":"\\1\\\\\n"),$value):$value;
  if(
$commented)
    
$line = (($oldline && trim($value)==='--COMMENT--')?"#~ $oldline":"# $var = ".str_replace('--COMMENT--','',$value)."\n");
  elseif(
$value === '--UNSET--')
    
$line '';
  else
    
$line "$var = ".$value."\n";
  return 
$line;
}
?>