-# 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
-
-function read_whole_file($name) {
- $fd = fopen($name, 'r');
- if($fd === false) {
- die("Failed to read file: '$name'");
+# 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
+function readable_sockets($pipes, $timeout = 0){
+ $read = array_values($pipes);
+ $ret = stream_select($read, $write = NULL, $exceptions = NULL, $timeout);
+ if($ret === false) {
+ return false;
+ }
+ if($ret) {
+ return $read;
+ } else {
+ return array();