<?php
/***************************************************************************
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
***************************************************************************/
/**
* Class to handle command line in and output.
*
* @author Steffen 'j0inty' Stollfuß
* @class CommandLine
*/
class CommandLine
{
/**
* Write the $str to the given $handle
*
* @param string $str
* @param resource $handle STDOUT|STDERR
* @return int|false
*
* @see fwrite() function documentation
*/
static public function write( $str, $handle = STDOUT)
{
return @fwrite($handle, $str, strlen($str));
}
/**
* Append PHP_EOL to $str and write the line to the given handle
*
* @param string $str
* @param resource $handle STDOUT|STDERR
* @return int|false
*/
static public function writeline( $line, $handle = STDOUT)
{
return self::write($line. PHP_EOL, $handle);
}
/**
* Write the given lines given as an array to the given handle
*
* @param array $lines
* @param resource $handle STDOUT|STDERR
* @return int|false
*/
static public function writelines( array &$lines, $handle = STDOUT)
{
$bytes_written = 0;
foreach ($lines as &$line)
{
if( !$bytes = self::writeline($line, $handle) )
{
return false;
}
$bytes_written += $bytes;
}
return $bytes_written;
}
/**
* Read data from STDIN with fscanf() until $end is reached
*
* @param mixed &$data
* @param string $pattern
* @param string $end
*
* @return string|boolean
*/
static public function read( &$data, $pattern = "%s", $end )
{
self::fscanf($pattern . $end, $data);
}
/**
* Read a line from STDIN with fscanf() which ended with PHP_EOL as default.
* You can choose another lineend by the second parameter
*
* @param type $end
* @return type
*/
static public function readLine(&$line, $end = PHP_EOL)
{
return self::read($line, "%s", $end);
}
/**
* Read an integer from STDIN with fscanf()
*
* @param integer $number
* @param boolean $unsigned
* @param string $end
*/
static public function readInt(&$number, $unsigned = false, $end = PHP_EOL)
{
self::fscanf( (($unsigned) ? "%u" : "%d") . $end, $number);
}
/**
* Read a floating number from STDIN with fscanf()
*
* @param float $number
* @param boolean $aware_local_settings
* @param string $end
*/
static public function readFloat(&$number, $aware_local_settings = true, $end = PHP_EOL)
{
self::fscanf( (($aware_local_settings) ? "%f" : "%F" ) . $end, $number);
}
/**
* Read a hexadecimal number from STDIN with fscanf()
*
* @param type $hex
* @param boolean $upperCase
* @param string $end
*/
static public function readHex(&$hex, $upperCase = false, $end = PHP_EOL)
{
self::fscanf( (($upperCase) ? "%X" : "%x") . $end, $hex);
}
/**
* Read a octal number from STDIN with fscanf()
*
* @param array $octal
*/
static public function readOctal(&$octal, $end = PHP_EOL)
{
self::fscanf("%o".$end, $octal);
}
/**
* Read a binary number from STDIN with fscanf()
*
* @param array $binary
* @param string $end
*/
static public function readBinary(&$binary, $end = PHP_EOL)
{
self::fscanf("%b".$end, $binary);
}
/**
* Read a ascii from STDIN with fscanf() and return the according character
*
* @param array $char
* @param string $end
*/
static public function readAsciiToChar(&$char, $end = PHP_EOL)
{
self::fscanf("%c".$end, $char);
}
/**
* Read a scientific number with fscanf()
*
* Scientific notation (e.g. 1.2e+2)
*
* @param string &$number
* @param string $end
*/
static public function readScientificNumber(&$number, $end = PHP_EOL)
{
self::fscanf("%e" . $end, $number);
}
/**
* Security Note:
*
* Although it is a very powerful technique, keep in mind that it is easily deceived.
* Many successful exploits have been based on scanf attacks.
* It should not be used on untrusted input without a lot of additional validation.
*
* @param type $pattern
* @param mixed $data
*/
static public function fscanf($pattern, &$data)
{
@fscanf(STDIN, $pattern, $data);
}
/**
* Read a csv line from STDIN with fgetcsv()
*
* @see fgetcsv()
*
* @param type &$arrCSV
* @param type $length
* @param type $delimiter
* @param type $enclosure
* @param type $escape
*/
static public function readCSV(&$arrCSV, $length = 0, $delimiter = ",", $enclosure = "\"", $escape = "\\")
{
stream_set_blocking(STDIN, 0);
$arrCSV = fgetcsv(STDIN, $length, $delimiter, $enclosure, $escape);
stream_set_blocking(STDIN, 1);
}
}
|