X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fstrings.php;h=3e5c9db2c32715842b92ffabcee710b58095f807;hp=9a4bb5c0cf943d0c6cf8e0d6c5c5971693ee2b4d;hb=4022e8fe81d0d357eff13c9993971ce62ce981f6;hpb=a37f3771b11544a29ebd521a69599381c90e7df2
diff --git a/functions/strings.php b/functions/strings.php
index 9a4bb5c0..3e5c9db2 100644
--- a/functions/strings.php
+++ b/functions/strings.php
@@ -1,214 +1,608 @@
= strlen($haystack))
- return -1;
- $pos++;
- }
- return $pos;
- }
-
- // Wraps text at $wrap characters
- function wordWrap($passed, $wrap) {
- $passed = str_replace(">", ">", $passed);
- $passed = str_replace("<", "<", $passed);
-
- $words = explode(" ", trim($passed));
- $i = 0;
- $line_len = strlen($words[$i])+1;
- $line = "";
- if (count($words) > 1) {
- while ($i < count($words)-1) {
- while ($line_len < $wrap) {
- $line = "$line$words[$i] ";
- $i++;
- $line_len = $line_len + strlen($words[$i])+1;
- }
- $line_len = strlen($words[$i])+1;
- if ($line_len < $wrap) {
- if ($i < count($words)) // don't
the last line
- $line = "$line\n";
+/**
+ * strings.php
+ *
+ * Copyright (c) 1999-2002 The SquirrelMail Project Team
+ * Licensed under the GNU GPL. For full terms see the file COPYING.
+ *
+ * This code provides various string manipulation functions that are
+ * used by the rest of the Squirrelmail code.
+ *
+ * $Id$
+ */
+
+/*****************************************************************/
+/*** THIS FILE NEEDS TO HAVE ITS FORMATTING FIXED!!! ***/
+/*** PLEASE DO SO AND REMOVE THIS COMMENT SECTION. ***/
+/*** + Base level indent should begin at left margin, as ***/
+/*** the comment and $version stuff below. ***/
+/*** + All identation should consist of four space blocks ***/
+/*** + Tab characters are evil. ***/
+/*** + all comments should use "slash-star ... star-slash" ***/
+/*** style -- no pound characters, no slash-slash style ***/
+/*** + FLOW CONTROL STATEMENTS (if, while, etc) SHOULD ***/
+/*** ALWAYS USE { AND } CHARACTERS!!! ***/
+/*** + Please use ' instead of ", when possible. Note " ***/
+/*** should always be used in _( ) function calls. ***/
+/*** Thank you for your help making the SM code more readable. ***/
+/*****************************************************************/
+
+/**
+ * SquirrelMail version number -- DO NOT CHANGE
+ */
+global $version;
+$version = '1.2.4 [cvs]';
+
+/**
+ * If $haystack is a full mailbox name and $needle is the mailbox
+ * separator character, returns the last part of the mailbox name.
+ */
+function readShortMailboxName($haystack, $needle) {
+ if ($needle == '') {
+ return $haystack;
+ }
+ $parts = explode($needle, $haystack);
+ $elem = array_pop($parts);
+ while ($elem == '' && count($parts)) {
+ $elem = array_pop($parts);
+ }
+ return $elem;
+}
+
+/**
+ * If $haystack is a full mailbox name, and $needle is the mailbox
+ * separator character, returns the second last part of the full
+ * mailbox name (i.e. the mailbox's parent mailbox)
+ */
+function readMailboxParent($haystack, $needle) {
+ if ($needle == '') return '';
+ $parts = explode($needle, $haystack);
+ $elem = array_pop($parts);
+ while ($elem == '' && count($parts)) {
+ $elem = array_pop($parts);
+ }
+ return join($needle, $parts);
+}
+
+/**
+ * Returns the index of the first chunk of string $haystack that
+ * starts with non-white-space character, starting at position $pos.
+ * If there is no such chunk, returns -1.
+ */
+function next_pos_minus_white ($haystack, $pos) {
+ $len = strlen($haystack);
+ while ($pos < $len) {
+ /* Get the next character. */
+ $c = substr($haystack, $pos, 1);
+
+ /* Check the next character. */
+ if (($c != ' ') && ($c != "\t") && ($c != "\n") && ($c != "\r")) {
+ return $pos;
+ }
+
+ /* Increment position in string. */
+ ++$pos;
+ }
+ return -1;
+}
+
+/**
+ * Wraps text at $wrap characters
+ *
+ * Has a problem with special HTML characters, so call this before
+ * you do character translation.
+ *
+ * Specifically, ' comes up as 5 characters instead of 1.
+ * This should not add newlines to the end of lines.
+ */
+function sqWordWrap(&$line, $wrap) {
+ ereg("^([\t >]*)([^\t >].*)?$", $line, $regs);
+ $beginning_spaces = $regs[1];
+ if (isset($regs[2])) {
+ $words = explode(' ', $regs[2]);
+ } else {
+ $words = "";
+ }
+
+ $i = 0;
+ $line = $beginning_spaces;
+
+ while ($i < count($words)) {
+ // Force one word to be on a line (minimum)
+ $line .= $words[$i];
+ $line_len = strlen($beginning_spaces) + strlen($words[$i]) + 2;
+ if (isset($words[$i + 1]))
+ $line_len += strlen($words[$i + 1]);
+ $i ++;
+
+ // Add more words (as long as they fit)
+ while ($line_len < $wrap && $i < count($words)) {
+ $line .= ' ' . $words[$i];
+ $i++;
+ if (isset($words[$i]))
+ $line_len += strlen($words[$i]) + 1;
+ else
+ $line_len += 1;
+ }
+
+ // Skip spaces if they are the first thing on a continued line
+ while (!isset($words[$i]) && $i < count($words)) {
+ $i ++;
+ }
+
+ // Go to the next line if we have more to process
+ if ($i < count($words)) {
+ $line .= "\n" . $beginning_spaces;
+ }
+ }
+}
+
+
+/**
+ * Does the opposite of sqWordWrap()
+ */
+function sqUnWordWrap(&$body) {
+ $lines = explode("\n", $body);
+ $body = "";
+ $PreviousSpaces = "";
+ for ($i = 0; $i < count($lines); $i ++) {
+ ereg("^([\t >]*)([^\t >].*)?$", $lines[$i], $regs);
+ $CurrentSpaces = $regs[1];
+ if (isset($regs[2])) {
+ $CurrentRest = $regs[2];
+ }
+
+ if ($i == 0) {
+ $PreviousSpaces = $CurrentSpaces;
+ $body = $lines[$i];
+ } else if (($PreviousSpaces == $CurrentSpaces) // Do the beginnings match
+ && (strlen($lines[$i - 1]) > 65) // Over 65 characters long
+ && strlen($CurrentRest)) { // and there's a line to continue with
+ $body .= ' ' . $CurrentRest;
+ } else {
+ $body .= "\n" . $lines[$i];
+ $PreviousSpaces = $CurrentSpaces;
+ }
+ }
+ $body .= "\n";
+}
+
+
+/**
+ * Returns an array of email addresses.
+ * Be cautious of "user@host.com"
+ */
+function parseAddrs($text) {
+ if (trim($text) == "")
+ return array();
+ $text = str_replace(' ', '', $text);
+ $text = ereg_replace('"[^"]*"', '', $text);
+ $text = ereg_replace('\\([^\\)]*\\)', '', $text);
+ $text = str_replace(',', ';', $text);
+ $array = explode(';', $text);
+ for ($i = 0; $i < count ($array); $i++) {
+ $array[$i] = eregi_replace ("^.*[<]", '', $array[$i]);
+ $array[$i] = eregi_replace ("[>].*$", '', $array[$i]);
+ }
+ return $array;
+}
+
+/**
+ * Returns a line of comma separated email addresses from an array.
+ */
+function getLineOfAddrs($array) {
+ if (is_array($array)) {
+ $to_line = implode(', ', $array);
+ $to_line = ereg_replace(', (, )+', ', ', $to_line);
+ $to_line = trim(ereg_replace('^, ', '', $to_line));
+ if( substr( $to_line, -1 ) == ',' )
+ $to_line = substr( $to_line, 0, -1 );
+ } else {
+ $to_line = '';
+ }
+
+ return( $to_line );
+}
+
+function translateText(&$body, $wrap_at, $charset) {
+ global $where, $what; // from searching
+ global $color; // color theme
+
+ require_once('../functions/url_parser.php');
+
+ $body_ary = explode("\n", $body);
+ $PriorQuotes = 0;
+ for ($i=0; $i < count($body_ary); $i++) {
+ $line = $body_ary[$i];
+ if (strlen($line) - 2 >= $wrap_at) {
+ sqWordWrap($line, $wrap_at);
+ }
+ $line = charset_decode($charset, $line);
+ $line = str_replace("\t", ' ', $line);
+
+ parseUrl ($line);
+
+ $Quotes = 0;
+ $pos = 0;
+ while (1) {
+ if ($line[$pos] == ' ') {
+ $pos ++;
+ } else if (strpos($line, '>', $pos) === $pos) {
+ $pos += 4;
+ $Quotes ++;
} else {
- $endline = $words[$i];
- while ($line_len >= $wrap) {
- $bigline = substr($endline, 0, $wrap);
- $endline = substr($endline, $wrap, strlen($endline));
- $line_len = strlen($endline);
- $line = "$line$bigline
";
- }
- $line = "$line$endline
";
- $i++;
+ break;
+ }
+ }
+
+ if ($Quotes > 1) {
+ if (! isset($color[14])) {
+ $color[14] = '#FF0000';
+ }
+ $line = '' . $line . '';
+ } elseif ($Quotes) {
+ if (! isset($color[13])) {
+ $color[13] = '#800000';
+ }
+ $line = '' . $line . '';
+ }
+
+ $body_ary[$i] = $line;
+ }
+ $body = '
' . implode("\n", $body_ary) . ''; +} + +function find_mailbox_name ($mailbox) { + if (ereg(" *\"([^\r\n\"]*)\"[ \r\n]*$", $mailbox, $regs)) + return $regs[1]; + ereg(" *([^ \r\n\"]*)[ \r\n]*$",$mailbox,$regs); + return $regs[1]; + +} + +function php_self () { + global $PHP_SELF, $HTTP_SERVER_VARS; + + if (isset($PHP_SELF) && !empty($PHP_SELF)) { + return $PHP_SELF; + } else if (isset($HTTP_SERVER_VARS['PHP_SELF']) && + !empty($HTTP_SERVER_VARS['PHP_SELF'])) { + return $HTTP_SERVER_VARS['PHP_SELF']; + } else { + return ''; + } +} + + +/** + * This determines the location to forward to relative to your server. + * If this doesnt work correctly for you (although it should), you can + * remove all this code except the last two lines, and change the header() + * function to look something like this, customized to the location of + * SquirrelMail on your server: + * + * http://www.myhost.com/squirrelmail/src/login.php + */ +function get_location () { + + global $PHP_SELF, $SERVER_NAME, $HTTP_HOST, $SERVER_PORT, + $HTTP_SERVER_VARS; + + /* Get the path. */ + $path = substr($PHP_SELF, 0, strrpos($PHP_SELF, '/')); + + /* Check if this is a HTTPS or regular HTTP request. */ + $proto = 'http://'; + + /* + * If you have 'SSLOptions +StdEnvVars' in your apache config + * OR if you have HTTPS in your HTTP_SERVER_VARS + * OR if you are on port 443 + */ + $getEnvVar = getenv('HTTPS'); + if ((isset($getEnvVar) && !strcasecmp($getEnvVar, 'on')) || + (isset($HTTP_SERVER_VARS['HTTPS'])) || + (isset($HTTP_SERVER_VARS['SERVER_PORT']) && + $HTTP_SERVER_VARS['SERVER_PORT'] == 443)) { + $proto = 'https://'; + } + + // Get the hostname from the Host header or server config. + $host = ''; + if (isset($HTTP_HOST) && !empty($HTTP_HOST)) { + $host = $HTTP_HOST; + } else if (isset($SERVER_NAME) && !empty($SERVER_NAME)) { + $host = $SERVER_NAME; + } else if (isset($HTTP_SERVER_VARS['SERVER_NAME']) && + !empty($HTTP_SERVER_VARS['SERVER_NAME'])) { + $host = $HTTP_SERVER_VARS['SERVER_NAME']; + } + + + $port = ''; + if (! strstr($host, ':')) { + if (isset($SERVER_PORT)) { + if (($SERVER_PORT != 80 && $proto == 'http://') + || ($SERVER_PORT != 443 && $proto == 'https://')) { + $port = sprintf(':%d', $SERVER_PORT); } - } - } else { - $line = $words[0]; - } - - $line = str_replace(">", ">", $line); - $line = str_replace("<", "<", $line); - return $line; - } - - /** Returns an array of email addresses **/ - function parseAddrs($text) { - if (trim($text) == "") { - return; - } - $text = str_replace(" ", "", $text); - $text = ereg_replace( '"[^"]*"', "", $text); - $text = str_replace(",", ";", $text); - $array = explode(";", $text); - for ($i = 0; $i < count ($array); $i++) { - $array[$i] = eregi_replace ("^.*\<", "", $array[$i]); - $array[$i] = eregi_replace ("\>.*$", "", $array[$i]); - } - return $array; - } - - /** Returns a line of comma separated email addresses from an array **/ - function getLineOfAddrs($array) { - if (is_array($array)) { - $to_line = implode(", ", $array); - $to_line = trim(ereg_replace(",,+", ",", $to_line)); - } else { - $to_line = ""; - } - return $to_line; - } - - function translateText($body, $wrap_at, $charset) { - global $where, $what; // from searching - - if (!isset($url_parser_php)) { - include "../functions/url_parser.php"; - } - - $body_ary = explode("\n", $body); - for ($i=0; $i < count($body_ary); $i++) { - $line = $body_ary[$i]; - $line = charset_decode($charset, $line); - - if (strlen($line) - 2 >= $wrap_at) { - $line = wordWrap($line, $wrap_at); - } - - $line = str_replace(" ", " ", $line); - $line = str_replace("\t", " ", $line); - $line = nl2br($line); - - $line = parseEmail ($line); - $line = parseUrl ($line); - - $line = "^^$line"; // gotta do this because if not, strpos() returns 0 - // which in PHP is the same as false. Now it returns 2 - if (strpos(trim(str_replace(" ", "", $line)), ">>") == 2) { - $line = substr($line, 2); - $line = "$line\n"; - } else if (strpos(trim(str_replace(" ", "", $line)), ">") == 2) { - $line = substr($line, 2); - $line = "$line\n"; - } else { - $line = substr($line, 2); - } - - $body_ary[$i] = "$line