diff -r 45e887f23282 -r 7152ca0a0ce9 includes/functions.php --- a/includes/functions.php Mon Feb 16 16:04:54 2009 -0500 +++ b/includes/functions.php Mon Feb 16 16:17:25 2009 -0500 @@ -206,57 +206,17 @@ function makeUrlComplete($n, $t, $query = false, $escape = false) { - global $db, $session, $paths, $template, $plugins; // Common objects - $flags = ''; - - if(defined('ENANO_BASE_CLASSES_INITIALIZED')) - { - $sep = urlSeparator; - } - else - { - $sep = (strstr($_SERVER['REQUEST_URI'], '?')) ? '&' : '?'; - } - if ( isset( $_GET['printable'] ) ) { - $flags .= $sep . 'printable'; - $sep = '&'; - } - if ( isset( $_GET['theme'] ) ) - { - $flags .= $sep . 'theme='.$session->theme; - $sep = '&'; - } - if ( isset( $_GET['style'] ) ) - { - $flags .= $sep . 'style='.$session->style; - $sep = '&'; - } - if ( isset($_GET['lang']) && preg_match('/^[a-z0-9_]+$/', @$_GET['lang']) ) - { - $flags .= $sep . 'lang=' . urlencode($_GET['lang']); - $sep = '&'; - } - - if(defined('ENANO_BASE_CLASSES_INITIALIZED')) - { - $url = $session->append_sid(contentPath . $paths->nslist[$n] . $t . $flags); - } - else - { - // If the path manager hasn't been initted yet, take an educated guess at what the URI should be - $url = contentPath . $n . ':' . $t . $flags; - } - if($query) - { - if(strstr($url, '?')) $sep = '&'; - else $sep = '?'; - $url = $url . $sep . $query . $flags; - } - - $baseprot = 'http' . ( isset($_SERVER['HTTPS']) ? 's' : '' ) . '://' . $_SERVER['HTTP_HOST']; - $url = $baseprot . $url; - - return ($escape) ? htmlspecialchars($url) : $url; + return get_server_url() . makeUrlNS($n, $t, $query, $escape); +} + +/** + * Returns an http:// URL for this server. + * @return string + */ + +function get_server_url() +{ + return 'http' . ( $GLOBALS['is_https'] ) . '://' . $_SERVER['HTTP_HOST']; } /** @@ -277,7 +237,7 @@ { $logged_in = true; } - return $logged_in && getConfig('main_page_alt_enable', '0') == '1' ? getConfig('main_page_alt', getConfig('main_page')) : getConfig('main_page'); + return $logged_in && getConfig('main_page_alt_enable', '0') == '1' ? getConfig('main_page_alt', getConfig('main_page', 'Main_Page')) : getConfig('main_page', 'Main_Page'); } /** @@ -439,7 +399,7 @@ $ns_prefix = ( isset($paths->nslist[ $namespace ]) ) ? $paths->nslist[ $namespace ] : $namespace . substr($paths->nslist['Special'], -1); $page_id_key = $ns_prefix . $page_id; - if ( isset($paths->pages[$page_id_key]) ) + if ( isPage($page_id_key) ) { $page_data = $paths->pages[$page_id_key]; } @@ -1509,69 +1469,51 @@ * @param string $bits the text to compress, should be only 1s and 0s * @return string */ - + function compress_bitfield($bits) { - $crc32 = crc32($bits); - $bits .= '0'; - $start_pos = 0; - $current = substr($bits, 1, 1); - $last = substr($bits, 0, 1); - $chunk_size = 1; - $len = strlen($bits); - $crc = $len; - $crcval = 0; - for ( $i = 1; $i < $len; $i++ ) - { - $current = substr($bits, $i, 1); - $last = substr($bits, $i - 1, 1); - $next = substr($bits, $i + 1, 1); - // Are we on the last character? - if($current == $last && $i+1 < $len) - $chunk_size++; - else + if ( !preg_match('/^[01]+$/', $bits) ) + return false; + + $current = intval($bits{0}); + $clen = 0; + $out = ''; + for ( $i = 0; $i < strlen($bits); $i++ ) + { + $cbit = intval($bits{$i}); + if ( $cbit !== $current || $clen == 127 || $i == strlen($bits) - 1 ) { - if($i+1 == $len && $current == $next) + if ( $i == strlen($bits) - 1 && $cbit === $current ) { - // This character completes a chunk - $chunk_size++; - $i++; - $chunk = substr($bits, $start_pos, $chunk_size); - $chunklen = strlen($chunk); - $newchunk = $last . '[' . $chunklen . ']'; - $newlen = strlen($newchunk); - $bits = substr($bits, 0, $start_pos) . $newchunk . substr($bits, $i, $len); - $chunk_size = 1; - $i = $start_pos + $newlen; - $start_pos = $i; - $len = strlen($bits); - $crcval = $crcval + $chunklen; + $clen++; } - else + // write chunk + $byte = $clen; + if ( $current === 1 ) + $byte |= 0x80; + $out .= chr($byte); + + if ( $i == strlen($bits) - 1 && $cbit !== $current ) { - // Last character completed a chunk - $chunk = substr($bits, $start_pos, $chunk_size); - $chunklen = strlen($chunk); - $newchunk = $last . '[' . $chunklen . '],'; - $newlen = strlen($newchunk); - $bits = substr($bits, 0, $start_pos) . $newchunk . substr($bits, $i, $len); - $chunk_size = 1; - $i = $start_pos + $newlen; - $start_pos = $i; - $len = strlen($bits); - $crcval = $crcval + $chunklen; + $out .= ( $cbit === 1 ) ? chr(0x81) : chr(0x1); } + + // reset + $current = intval($cbit); + $clen = 0; } - } - if($crc != $crcval) - { - echo __FUNCTION__.'(): ERROR: length check failed, this is a bug in the algorithm
Debug info: aiming for a CRC val of '.$crc.', got '.$crcval; - return false; - } - $compressed = 'cbf:len='.$crc.';crc='.dechex($crc32).';data='.$bits.'|end'; - return $compressed; + $clen++; + } + $crc = dechex(crc32($out)); + while ( strlen($crc) < 8 ) + $crc = "0$crc"; + return "cbf2:{$crc}" . hexencode($out, '', ''); } +// test case +// $bf = '0111100010000000000000000000000100000000000000001110000000000000000101100000010100001100010000000000000000000000000000111111111111111111111100100001000000000000000000000000000000000000'; +// die('
Original:  ' . " $bf\nCompressed: " . compress_bitfield($bf) . "\nProcessed:  ".uncompress_bitfield(compress_bitfield($bf)).'
'); + /** * Uncompresses a bitfield compressed with compress_bitfield() * @param string $bits the compressed bitfield @@ -1580,6 +1522,47 @@ function uncompress_bitfield($bits) { + if ( substr($bits, 0, 4) == 'cbf:' ) + { + return uncompress_bitfield_old($bits); + } + if ( substr($bits, 0, 5) != 'cbf2:' ) + { + echo __FUNCTION__.'(): ERROR: Invalid stream'; + return false; + } + $bits = substr($bits, 5); + $crc = substr($bits, 0, 8); + $bits = substr($bits, 8); + $bits = hexdecode($bits); + if ( dechex(crc32($bits)) !== $crc ) + { + echo __FUNCTION__."(): ERROR: CRC failed"; + return false; + } + $out = ''; + for ( $i = 0; $i < strlen($bits); $i++ ) + { + $byte = ord($bits{$i}); + $char = $byte & 0x80 ? '1' : '0'; + $byte &= ~0x80; + for ( $j = 0; $j < $byte; $j++ ) + { + $out .= $char; + } + } + return $out; +} + +/** + * Decompressor for old-format bitfields. + * @param string + * @return string + * @access private + */ + +function uncompress_bitfield_old($bits) +{ if(substr($bits, 0, 4) != 'cbf:') { echo __FUNCTION__.'(): ERROR: Invalid stream'; @@ -4640,7 +4623,7 @@ // eliminate comments $json = preg_replace(array( // eliminate single line comments in '// ...' form - '#^\s*//(.+)$#m', + '#^\s*//(.*)$#m', // eliminate multi-line comments in '/* ... */' form, at start of string '#^\s*/\*(.+)\*/#Us', // eliminate multi-line comments in '/* ... */' form, at end of string @@ -5011,6 +4994,4 @@ return false; } -//die('
Original:  01010101010100101010100101010101011010'."\nProcessed: ".uncompress_bitfield(compress_bitfield('01010101010100101010100101010101011010')).'
'); - ?>