Index: rewrite.php
===================================================================
--- rewrite.php	(revision 13880)
+++ rewrite.php	(working copy)
@@ -54,7 +54,7 @@
  * @param string $struct Permalink structure.
  * @param bool $with_front Prepend front base to permalink structure.
  */
-function add_permastruct( $name, $struct, $with_front = true, $ep_mask = EP_NONE ) {
+function add_permastruct( $name, $struct, $with_front = true, $ep_mask = 'none' ) {
 	global $wp_rewrite;
 	return $wp_rewrite->add_permastruct( $name, $struct, $with_front, $ep_mask );
 }
@@ -93,11 +93,13 @@
 	$wp_rewrite->flush_rules( $hard );
 }
 
-//pseudo-places
+// pseudo-places -- these are deprecated
+
 /**
  * Endpoint Mask for default, which is nothing.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_NONE', 0);
 
@@ -105,6 +107,7 @@
  * Endpoint Mask for Permalink.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_PERMALINK', 1);
 
@@ -112,6 +115,7 @@
  * Endpoint Mask for Attachment.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_ATTACHMENT', 2);
 
@@ -119,6 +123,7 @@
  * Endpoint Mask for date.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_DATE', 4);
 
@@ -126,6 +131,7 @@
  * Endpoint Mask for year
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_YEAR', 8);
 
@@ -133,6 +139,7 @@
  * Endpoint Mask for month.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_MONTH', 16);
 
@@ -140,6 +147,7 @@
  * Endpoint Mask for day.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_DAY', 32);
 
@@ -147,6 +155,7 @@
  * Endpoint Mask for root.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_ROOT', 64);
 
@@ -154,6 +163,7 @@
  * Endpoint Mask for comments.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_COMMENTS', 128);
 
@@ -161,6 +171,7 @@
  * Endpoint Mask for searches.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_SEARCH', 256);
 
@@ -168,6 +179,7 @@
  * Endpoint Mask for categories.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_CATEGORIES', 512);
 
@@ -175,6 +187,7 @@
  * Endpoint Mask for tags.
  *
  * @since 2.3.0
+ * @deprecated 3.0.0
  */
 define('EP_TAGS', 1024);
 
@@ -182,6 +195,7 @@
  * Endpoint Mask for authors.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_AUTHORS', 2048);
 
@@ -189,6 +203,7 @@
  * Endpoint Mask for pages.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_PAGES', 4096);
 
@@ -196,6 +211,7 @@
  * Endpoint Mask for everything.
  *
  * @since 2.1.0
+ * @deprecated 3.0.0
  */
 define('EP_ALL', 8191);
 
@@ -712,7 +728,27 @@
 	 */
 	var $feeds = array ( 'feed', 'rdf', 'rss', 'rss2', 'atom' );
 
+	// prolly will need one of these
+
 	/**
+	 * @since 3.0.0
+	 * @access private
+	 * @var array
+	 */
+	var $_endpoints = array( 'none', 'permalink', 'attachment', 'date', 'year', 'month', 'day',
+		'root', 'comments', 'search', 'categories', 'tags', 'authors', 'pages' );
+
+	/**
+	 * @since 3.0.0
+	 * @access private
+	 * @var array
+	 */
+	var $_bitmasks = array( 'EP_NONE' => 'none', 'EP_PERMALINK' => 'permalink', 'EP_attachment' => 'attachment',
+		'EP_DATE' => 'date', 'EP_YEAR' => 'year', 'EP_MONTH' => 'month', 'EP_DAY' => 'day', 'EP_ROOT' => 'root',
+		'EP_COMMENTS' => 'comments', 'EP_SEARCH' => 'search', 'EP_CATEGORIES' => 'categories', 'EP_TAGS' => 'tags',
+		'EP_AUTHORS' => 'authors', 'EP_PAGES' => 'pages' );
+
+	/**
 	 * Whether permalinks are being used.
 	 *
 	 * This can be either rewrite module or permalink in the HTTP query string.
@@ -855,7 +891,7 @@
 
 		if ( ! $this->use_verbose_page_rules ) {
 			$this->add_rewrite_tag('%pagename%', "(.+?)", 'pagename=');
-			$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES));
+			$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, 'pages'));
 			return $rewrite_rules;
 		}
 
@@ -866,13 +902,13 @@
 		if ( is_array( $attachment_uris ) ) {
 			foreach ( $attachment_uris as $uri => $pagename ) {
 				$this->add_rewrite_tag('%pagename%', "($uri)", 'attachment=');
-				$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES));
+				$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, 'pages'));
 			}
 		}
 		if ( is_array( $uris ) ) {
 			foreach ( $uris as $uri => $pagename ) {
 				$this->add_rewrite_tag('%pagename%', "($uri)", 'pagename=');
-				$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, EP_PAGES));
+				$rewrite_rules = array_merge($rewrite_rules, $this->generate_rewrite_rules($page_structure, 'pages'));
 			}
 		}
 
@@ -1258,7 +1294,7 @@
 	 * @access public
 	 *
 	 * @param string $permalink_structure The permalink structure.
-	 * @param int $ep_mask Optional, default is EP_NONE. Endpoint constant, see EP_* constants.
+	 * @param int $ep_mask Optional, default is false, for none. Endpoint, see WP_Rewrite::add_endpoint().
 	 * @param bool $paged Optional, default is true. Whether permalink request is paged.
 	 * @param bool $feed Optional, default is true. Whether for feed.
 	 * @param bool $forcomments Optional, default is false. Whether for comments.
@@ -1266,7 +1302,9 @@
 	 * @param bool $endpoints Optional, default is true. Whether endpoints are enabled.
 	 * @return array Rewrite rule list.
 	 */
-	function generate_rewrite_rules($permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true) {
+	function generate_rewrite_rules($permalink_structure, $ep_mask = 'none', $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true) {
+		$this->_bitmasks_to_array( $ep_mask );
+
 		//build a regex to match the feed section of URLs, something like (feed|atom|rss|rss2)/?
 		$feedregex2 = '';
 		foreach ( (array) $this->feeds as $feed_name)
@@ -1351,16 +1389,16 @@
 			//set up $ep_mask_specific which is used to match more specific URL types
 			switch ( $dirs[$j] ) {
 				case '%year%':
-					$ep_mask_specific = EP_YEAR;
+					$ep_mask_specific = 'year';
 					break;
 				case '%monthnum%':
-					$ep_mask_specific = EP_MONTH;
+					$ep_mask_specific = 'month';
 					break;
 				case '%day%':
-					$ep_mask_specific = EP_DAY;
+					$ep_mask_specific = 'day';
 					break;
 				default:
-					$ep_mask_specific = EP_NONE;
+					$ep_mask_specific = 'none';
 			}
 
 			//create query for /page/xx
@@ -1399,16 +1437,16 @@
 				$rewrite = array_merge($rewrite, array($pagematch => $pagequery));
 
 			//only on pages with comments add ../comment-page-xx/
-			if ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask || EP_NONE & $ep_mask )
+			if ( array_intersect( $ep_mask, array ( 'pages', 'permalink', 'none' ) ) )
 				$rewrite = array_merge($rewrite, array($commentmatch => $commentquery));
-			else if ( EP_ROOT & $ep_mask && get_option('page_on_front') )
+			else if ( in_array( $ep_mask, 'root' ) && get_option('page_on_front') )
 				$rewrite = array_merge($rewrite, array($rootcommentmatch => $rootcommentquery));
 
 			//do endpoints
 			if ( $endpoints ) {
 				foreach ( (array) $ep_query_append as $regex => $ep) {
 					//add the endpoints on if the mask fits
-					if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific )
+					if ( array_intersect( $ep[0], array( $ep_mask, $ep_mask_specific ) ) )
 						$rewrite[$match . $regex] = $index . '?' . $query . $ep[1] . $this->preg_index($num_toks + 2);
 				}
 			}
@@ -1480,7 +1518,7 @@
 					//do endpoints for attachments
 					if ( !empty($endpoints) ) {
 						foreach ( (array) $ep_query_append as $regex => $ep ) {
-							if ( $ep[0] & EP_ATTACHMENT ) {
+							if ( in_array( 'attachment', $ep[0] ) ) {
 								$rewrite[$sub1 . $regex] = $subquery . $ep[1] . $this->preg_index(2);
 								$rewrite[$sub2 . $regex] = $subquery . $ep[1] . $this->preg_index(2);
 							}
@@ -1538,7 +1576,7 @@
 	 * @return array
 	 */
 	function generate_rewrite_rule($permalink_structure, $walk_dirs = false) {
-		return $this->generate_rewrite_rules($permalink_structure, EP_NONE, false, false, false, $walk_dirs);
+		return $this->generate_rewrite_rules($permalink_structure, false, false, false, false, $walk_dirs);
 	}
 
 	/**
@@ -1577,36 +1615,36 @@
 								'.*wp-commentsrss2.php$'	=>	$this->index . '?feed=rss2&withcomments=1');
 
 		// Post
-		$post_rewrite = $this->generate_rewrite_rules($this->permalink_structure, EP_PERMALINK);
+		$post_rewrite = $this->generate_rewrite_rules($this->permalink_structure, 'permalink');
 		$post_rewrite = apply_filters('post_rewrite_rules', $post_rewrite);
 
 		// Date
-		$date_rewrite = $this->generate_rewrite_rules($this->get_date_permastruct(), EP_DATE);
+		$date_rewrite = $this->generate_rewrite_rules($this->get_date_permastruct(), 'date');
 		$date_rewrite = apply_filters('date_rewrite_rules', $date_rewrite);
 
 		// Root
-		$root_rewrite = $this->generate_rewrite_rules($this->root . '/', EP_ROOT);
+		$root_rewrite = $this->generate_rewrite_rules($this->root . '/', 'root');
 		$root_rewrite = apply_filters('root_rewrite_rules', $root_rewrite);
 
 		// Comments
-		$comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, EP_COMMENTS, true, true, true, false);
+		$comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, 'comments', true, true, true, false);
 		$comments_rewrite = apply_filters('comments_rewrite_rules', $comments_rewrite);
 
 		// Search
 		$search_structure = $this->get_search_permastruct();
-		$search_rewrite = $this->generate_rewrite_rules($search_structure, EP_SEARCH);
+		$search_rewrite = $this->generate_rewrite_rules($search_structure, 'search');
 		$search_rewrite = apply_filters('search_rewrite_rules', $search_rewrite);
 
 		// Categories
-		$category_rewrite = $this->generate_rewrite_rules($this->get_category_permastruct(), EP_CATEGORIES);
+		$category_rewrite = $this->generate_rewrite_rules($this->get_category_permastruct(), 'categories');
 		$category_rewrite = apply_filters('category_rewrite_rules', $category_rewrite);
 
 		// Tags
-		$tag_rewrite = $this->generate_rewrite_rules($this->get_tag_permastruct(), EP_TAGS);
+		$tag_rewrite = $this->generate_rewrite_rules($this->get_tag_permastruct(), 'tags');
 		$tag_rewrite = apply_filters('tag_rewrite_rules', $tag_rewrite);
 
 		// Authors
-		$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS);
+		$author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), 'authors');
 		$author_rewrite = apply_filters('author_rewrite_rules', $author_rewrite);
 
 		// Pages
@@ -1618,7 +1656,7 @@
 			if ( is_array($permastruct) )
 				$this->extra_rules_top = array_merge($this->extra_rules_top, $this->generate_rewrite_rules($permastruct[0], $permastruct[1]));
 			else
-				$this->extra_rules_top = array_merge($this->extra_rules_top, $this->generate_rewrite_rules($permastruct, EP_NONE));
+				$this->extra_rules_top = array_merge($this->extra_rules_top, $this->generate_rewrite_rules($permastruct, false));
 		}
 
 		// Put them together.
@@ -1895,11 +1933,26 @@
 	 * @param array $places URL types that endpoint can be used.
 	 */
 	function add_endpoint($name, $places) {
+		$this->_bitmasks_to_array( $places );
+
 		global $wp;
 		$this->endpoints[] = array ( $places, $name );
 		$wp->add_query_var($name);
 	}
 
+	function _bitmasks_to_array( &$places ) {
+		if ( is_int( $places ) ) {
+			$_places = array();
+			foreach ( $this->_bitmasks as $bit => $new ) {
+				if ( constant( $bit ) & $places )
+					$_places[] = $new;
+			}
+			$places = $_places;
+		} elseif ( ! is_array( $places ) ) {
+			$places = array( 'none' );
+		}
+	}
+
 	/**
 	 * Add permalink structure.
 	 *
@@ -1913,7 +1966,8 @@
 	 * @param string $struct Permalink structure.
 	 * @param bool $with_front Prepend front base to permalink structure.
 	 */
-	function add_permastruct($name, $struct, $with_front = true, $ep_mask = EP_NONE) {
+	function add_permastruct($name, $struct, $with_front = true, $ep_mask = 'none' ) {
+		$this->_bitmasks_to_array( $ep_mask );
 		if ( $with_front )
 			$struct = $this->front . $struct;
 		$this->extra_permastructs[$name] = array($struct, $ep_mask);
