<?php
##
## rename files
## san2@2011.12.15: add urldecode
## san2@2011.02.05: new build

function preview_dorename($preview$file$t, &$renamed)
{
  
## preview
  ##
  
if($preview)
  {
    
printf('%-50s=> %s'."\n",$file,$t);
    return;
  }

  
## do rename
  ##
  
if(rename($file,$t)) printf('%-50s=> %s'."\n",$file,$t);
  else
  {
    
printf('%-50s=> %s'."\n",$file,"XX Rename failure to $t");
    
$renamed[$i] = $file// reset
  
}
}

## check OS
##
$iswin preg_match('/WIN/',PHP_OS) ? TRUE FALSE;

## check argv
##
$size sizeof($_SERVER['argv']);
for(
$i=1$i<$size$i++)
{
  
$argv =  $_SERVER['argv'][$i];
  if(
preg_match(';[-]+(test|preview);i',$argv)) $preview TRUE;
  else if(
preg_match(';[-]+urldecode;i',$argv)) { $urldecode TRUE$pattern '/.+/_urldecode_/';}
  else if(
preg_match(';^([^0-9a-zA-Z\\\\\s]).+\\1.*\\1[imsxeADSUXJu]*$;',$argv)) $pattern $argv;
  else if(
preg_match(';^[^-]+;',$argv)) $path $argv;
}

if(
is_dir($path)) $path preg_replace(';/+$;','',$path).'/*';

$files glob($path);

if(!
$files || !$pattern)
{
  
// error_log() not work in win32
  
if(!$pattern) echo "ERROR: preg-pattern $pattern\n";
  if(!
$files) echo "ERROR: target\n";
  echo 
'usage: php '.$_SERVER['argv'][0].' [--test|--preview] [--urldecode] <preg-pattern> <target>'."\n";
  exit(
1); // error
}

$dirname dirname($path);
$delm substr($pattern,0,1);
list(,
$from,$to,$modx) = explode($delm,$pattern);

if(
$preview) echo "preview/test mode: Yes\n";
echo 
"target : $path \n";

## get fileinode
##
$finodes = array();
foreach(
$files AS $i=>$file)
{
  if(!
is_file($file)) continue; // directory or link ...
  
$finodes[$i] = fileinode($file);
}

$posts = array();
$renamed $files;
foreach(
$finodes AS $i=>$inode)
{
  
$file $files[$i];
  
$f basename($file);

  if(
$urldecode)
  {
    
$f urldecode($f);
    
$f mb_check_encoding($f,'UTF-8') ? iconv('UTF-8','EUC-KR',$f) : $f;
    
$f str_replace('/','',$f);
    
$f str_replace('?','',$f);
    
$t $dirname.'/'.$f;
  }
  else 
$t $dirname.'/'.preg_replace($delm.$from.$delm.$modx,$to,$f);

  
## check is same name
  ##
  
if("$file== "$t")
  {
    
printf('%-50s%s'."\n",$file,'=> Skip(It\'s a self.)');
    continue;
  }

  
## check file exists(support preview mode)
  ##
  
if(!$iswin// for Unix/Linux, but win32 do rename
  
{
    
$ekey array_search($t,$renamed);
    if(
$ekey !== FALSE)
    {
        if(
$inode != $finodes[$ekey])
        {
            
//echo '?? Skip(same file name exists)'."\n";
            
$posts[] = array($inode,$file,$t);
            continue;
        }
    }
  }

  
$renamed[$i] = $t;

  
preview_dorename($preview,$file,$t,&$renamed);

  
flush();
}

foreach(
$posts AS $arr)
{
  list(
$inode,$file,$t) = $arr;

  
$ekey array_search($t,$renamed);
  
  if(
$ekey === FALSE// file not exists
  
{
    
preview_dorename($preview,$file,$t,&$renamed);
    continue;
  }

  
printf('%-50s%s'."\n",$file,"XX Skip($t file name exists");
}

exit(
0);
?>