JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
clean up my urls
[wfpl.git] / misc.php
index 35ed78d..528053c 100644 (file)
--- 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 <http://www.gnu.org/licenses/>.
+
+# 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];
+}
+
 ?>