X-Git-Url: https://jasonwoof.com/gitweb/?p=wfpl.git;a=blobdiff_plain;f=misc.php;h=528053c759bec7646c683c87904b51f08cfb0173;hp=35ed78db59715488012668e137d8e2662920bac8;hb=15459c86d0996ab3037b1738a8be6efd378c1258;hpb=96ab9b23972c443b12f6ddf62fafeaacca5976a4 diff --git a/misc.php b/misc.php index 35ed78d..528053c 100644 --- a/misc.php +++ b/misc.php @@ -2,21 +2,57 @@ # Copyright (C) 2006 Jason Woofenden # -# This file is part of wfpl. -# -# wfpl 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. -# -# wfpl 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 wfpl; if not, write to the Free Software Foundation, Inc., 51 -# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# 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 3 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# pass an integer, returns the suffix +function ordinal_suffix($i) { + # teens are all __th + if(strlen($i) > 1 && substr($i, -2, 1) === '1') { + return 'th'; + } + switch(substr($i, -1)) { + case '': + return ''; + case '1': + return 'st'; + case '2': + return 'nd'; + case '3': + return 'rd'; + default; + return 'th'; + } +} + +# ordinalize(1) => "1st" +# ordinalize(2) => "2nd" +# ordinalize(3) => "3rd" +# ordinalize(111) => "111th" +# ordinalize("62") => "62nd" +function ordinalize($i) { + return $i . ordinal_suffix($i); +} + +# remove the $key from $_REQUEST and return it's value (or null if it's not there) +function _REQUEST_cut($key) { + if(!isset($_REQUEST[$key])) { + return null; + } + $ret = $_REQUEST[$key]; + unset($_REQUEST[$key]); + return $ret; +} # returns an array containing just the elements of $pipes that are readable (without blocking) # timeout 0 means don't wait, timeout NULL means wait indefinitely @@ -40,12 +76,11 @@ function readable_sockets($pipes, $timeout = 0){ # Returns: (as array) # exit code # stdout -# stderr function exec_pipe($command, $stdin) { $descriptorspec = array( 0 => array('pipe', 'r'), // stdin is a pipe that the child will read from 1 => array('pipe', 'w'), // stdout is a pipe that the child will write to - 2 => array('pipe', 'w') // stderr is a pipe that the child will write to + 2 => array('file', '/dev/null', 'w') // stderr is a pipe that the child will write to ); $process = proc_open($command, $descriptorspec, $pipes); @@ -54,62 +89,29 @@ function exec_pipe($command, $stdin) { fwrite($pipes[0], $stdin); fclose($pipes[0]); - $stdout_open = true; - $stderr_open = true; - while($stdout_open || $stderr_open) { - $pipes_to_check = array(); - if($stdout_open) { - $pipes_to_check[] = $pipes[1]; - } - if($stderr_open) { - $pipes_to_check[] = $pipes[2]; - } - $readables = readable_sockets($pipes_to_check); - if($readables === false) { - die('select failed'); - } - foreach($readables as $pipe) { - $ret = fread($pipe, 4096); - if($ret === false) { - die('fread (in exec_pipe) failed'); - } - if($pipe = $pipes[1]) { - if($ret == '') { - fclose($pipes[1]); - $stdout_open = false; - } else { - $stdout .= $ret; - } - } - if($pipe = $pipes[2]) { - if($ret == '') { - fclose($pipes[2]); - $stderr_open = false; - } else { - $stderr .= $ret; - } - } - } + while (!feof($pipes[1])) { + $chunk = fread($pipes[1], 1024); + $stdout .= $chunk; + sleep(0.5); } + fclose($pipes[1]); + // It is important that you close any pipes before calling // proc_close in order to avoid a deadlock $return_value = proc_close($process); - return array($return_value, $stdout, $stderr); + return array($return_value, $stdout); } } - - - - function unix_newlines($str) { $str = str_replace("\r\n", "\n", $str); return str_replace("\r", "\n", $str); } + # return current year (all 4 digits) function this_year() { return strftime('%Y'); @@ -125,6 +127,48 @@ function today_ymd() { return strftime('%Y-%m-%d'); } +function now_yyyymmdd() { + return strftime('%Y-%m-%d'); +} + +function now_yyyymmddhhmmss() { + return strftime('%Y-%m-%d %H:%M:%S'); +} + + +function get_text_between($text, $start_text, $end_text) { + $start = strpos($text, $start_text); + if($start === false) { + return false; + } + $text = substr($text, $start + strlen($start_text)); + $end = strpos($text, $end_text); + if($end === false) { + return false; + } + return substr($text, 0, $end); +} + +# Make it easy to insert an array into the template data structure so that each +# element of the array gets its own row. +# +# passed this: columnize(array('a', 'b', 'c'), 'k'); +# it returns: array(array('k' => 'a'), +# array('k' => 'b'), +# array('k' => 'c')); +# passed this: columnate(array(), 'k'); +# it returns: false +function columnize($arr, $key = 'data') { + if(!$arr) { + return false; + } + $ret = array(); + foreach($arr as $val) { + $ret[] = array($key => $val); + } + return $ret; +} + # php4 is broken, in that you cannot set a default value for a parameter that # is passed by reference. So, this is set up to use the following screwy # syntax: @@ -149,4 +193,8 @@ function ref(&$foo) { return new stupid_reference($foo); } +function &last(&$array) { + if(count($array)) return $array[count($array) - 1]; +} + ?>