Mini Shell

Direktori : /home/admin/web/mcpv.demarco.ddnsfree.com/public_html/wp-includes/pomo/
Upload File :
Current File : /home/admin/web/mcpv.demarco.ddnsfree.com/public_html/wp-includes/pomo/plural-forms.php

<?php

/**
 * A gettext Plural-Forms parser.
 *
 * @since 4.9.0
 */
if ( ! class_exists( 'Plural_Forms', false ) ) :
	#[AllowDynamicProperties]
	class Plural_Forms {
		/**
		 * Operator characters.
		 *
		 * @since 4.9.0
		 * @var string OP_CHARS Operator characters.
		 */
		const OP_CHARS = '|&><!=%?:';

		/**
		 * Valid number characters.
		 *
		 * @since 4.9.0
		 * @var string NUM_CHARS Valid number characters.
		 */
		const NUM_CHARS = '0123456789';

		/**
		 * Operator precedence.
		 *
		 * Operator precedence from highest to lowest. Higher numbers indicate
		 * higher precedence, and are executed first.
		 *
		 * @see https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
		 *
		 * @since 4.9.0
		 * @var array $op_precedence Operator precedence from highest to lowest.
		 */
		protected static $op_precedence = array(
			'%'  => 6,

			'<'  => 5,
			'<=' => 5,
			'>'  => 5,
			'>=' => 5,

			'==' => 4,
			'!=' => 4,

			'&&' => 3,

			'||' => 2,

			'?:' => 1,
			'?'  => 1,

			'('  => 0,
			')'  => 0,
		);

		/**
		 * Tokens generated from the string.
		 *
		 * @since 4.9.0
		 * @var array $tokens List of tokens.
		 */
		protected $tokens = array();

		/**
		 * Cache for repeated calls to the function.
		 *
		 * @since 4.9.0
		 * @var array $cache Map of $n => $result
		 */
		protected $cache = array();

		/**
		 * Constructor.
		 *
		 * @since 4.9.0
		 *
		 * @param string $str Plural function (just the bit after `plural=` from Plural-Forms)
		 */
		public function __construct( $str ) {
			$this->parse( $str );
		}

		/**
		 * Parse a Plural-Forms string into tokens.
		 *
		 * Uses the shunting-yard algorithm to convert the string to Reverse Polish
		 * Notation tokens.
		 *
		 * @since 4.9.0
		 *
		 * @throws Exception If there is a syntax or parsing error with the string.
		 *
		 * @param string $str String to parse.
		 */
		protected function parse( $str ) {
			$pos = 0;
			$len = strlen( $str );

			// Convert infix operators to postfix using the shunting-yard algorithm.
			$output = array();
			$stack  = array();
			while ( $pos < $len ) {
				$next = substr( $str, $pos, 1 );

				switch ( $next ) {
					// Ignore whitespace.
					case ' ':
					case "\t":
						$pos++;
						break;

					// Variable (n).
					case 'n':
						$output[] = array( 'var' );
						$pos++;
						break;

					// Parentheses.
					case '(':
						$stack[] = $next;
						$pos++;
						break;

					case ')':
						$found = false;
						while ( ! empty( $stack ) ) {
							$o2 = $stack[ count( $stack ) - 1 ];
							if ( '(' !== $o2 ) {
								$output[] = array( 'op', array_pop( $stack ) );
								continue;
							}

							// Discard open paren.
							array_pop( $stack );
							$found = true;
							break;
						}

						if ( ! $found ) {
							throw new Exception( 'Mismatched parentheses' );
						}

						$pos++;
						break;

					// Operators.
					case '|':
					case '&':
					case '>':
					case '<':
					case '!':
					case '=':
					case '%':
					case '?':
						$end_operator = strspn( $str, self::OP_CHARS, $pos );
						$operator     = substr( $str, $pos, $end_operator );
						if ( ! array_key_exists( $operator, self::$op_precedence ) ) {
							throw new Exception( sprintf( 'Unknown operator "%s"', $operator ) );
						}

						while ( ! empty( $stack ) ) {
							$o2 = $stack[ count( $stack ) - 1 ];

							// Ternary is right-associative in C.
							if ( '?:' === $operator || '?' === $operator ) {
								if ( self::$op_precedence[ $operator ] >= self::$op_precedence[ $o2 ] ) {
									break;
								}
							} elseif ( self::$op_precedence[ $operator ] > self::$op_precedence[ $o2 ] ) {
								break;
							}

							$output[] = array( 'op', array_pop( $stack ) );
						}
						$stack[] = $operator;

						$pos += $end_operator;
						break;

					// Ternary "else".
					case ':':
						$found = false;
						$s_pos = count( $stack ) - 1;
						while ( $s_pos >= 0 ) {
							$o2 = $stack[ $s_pos ];
							if ( '?' !== $o2 ) {
								$output[] = array( 'op', array_pop( $stack ) );
								$s_pos--;
								continue;
							}

							// Replace.
							$stack[ $s_pos ] = '?:';
							$found           = true;
							break;
						}

						if ( ! $found ) {
							throw new Exception( 'Missing starting "?" ternary operator' );
						}
						$pos++;
						break;

					// Default - number or invalid.
					default:
						if ( $next >= '0' && $next <= '9' ) {
							$span     = strspn( $str, self::NUM_CHARS, $pos );
							$output[] = array( 'value', intval( substr( $str, $pos, $span ) ) );
							$pos     += $span;
							break;
						}

						throw new Exception( sprintf( 'Unknown symbol "%s"', $next ) );
				}
			}

			while ( ! empty( $stack ) ) {
				$o2 = array_pop( $stack );
				if ( '(' === $o2 || ')' === $o2 ) {
					throw new Exception( 'Mismatched parentheses' );
				}

				$output[] = array( 'op', $o2 );
			}

			$this->tokens = $output;
		}

		/**
		 * Get the plural form for a number.
		 *
		 * Caches the value for repeated calls.
		 *
		 * @since 4.9.0
		 *
		 * @param int $num Number to get plural form for.
		 * @return int Plural form value.
		 */
		public function get( $num ) {
			if ( isset( $this->cache[ $num ] ) ) {
				return $this->cache[ $num ];
			}
			$this->cache[ $num ] = $this->execute( $num );
			return $this->cache[ $num ];
		}

		/**
		 * Execute the plural form function.
		 *
		 * @since 4.9.0
		 *
		 * @throws Exception If the plural form value cannot be calculated.
		 *
		 * @param int $n Variable "n" to substitute.
		 * @return int Plural form value.
		 */
		public function execute( $n ) {
			$stack = array();
			$i     = 0;
			$total = count( $this->tokens );
			while ( $i < $total ) {
				$next = $this->tokens[ $i ];
				$i++;
				if ( 'var' === $next[0] ) {
					$stack[] = $n;
					continue;
				} elseif ( 'value' === $next[0] ) {
					$stack[] = $next[1];
					continue;
				}

				// Only operators left.
				switch ( $next[1] ) {
					case '%':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 % $v2;
						break;

					case '||':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 || $v2;
						break;

					case '&&':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 && $v2;
						break;

					case '<':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 < $v2;
						break;

					case '<=':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 <= $v2;
						break;

					case '>':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 > $v2;
						break;

					case '>=':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 >= $v2;
						break;

					case '!=':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 != $v2;
						break;

					case '==':
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 == $v2;
						break;

					case '?:':
						$v3      = array_pop( $stack );
						$v2      = array_pop( $stack );
						$v1      = array_pop( $stack );
						$stack[] = $v1 ? $v2 : $v3;
						break;

					default:
						throw new Exception( sprintf( 'Unknown operator "%s"', $next[1] ) );
				}
			}

			if ( count( $stack ) !== 1 ) {
				throw new Exception( 'Too many values remaining on the stack' );
			}

			return (int) $stack[0];
		}
	}
endif;
March 5, 2021 – Base de données MCPV "Prestataires"

Day: March 5, 2021

The complete expertise, Seneca Buffalo Creek Casino, is where

Most Popular Slots & Online Casino Games >> Play Free Of Charge Any meeting or group occasion held at the World’s Biggest Casino is bound to be unforgettable. Contact our skilled team today to get started planning your next event at present. As a Little River Casino Resort Players Club member, you have the opportunity…

Read More

Our collection promotes versatility and excellence

How to Spot a Fake Louis Vuitton Alma Bag Academy by FASHIONPHILE Discover the defining features of Louis Vuitton men’s bag replicas at Replica Collect Replica Bags, where elegance and quality seamlessly merge. Each replica is crafted to mirror Louis Vuitton’s iconic designs, featuring premium materials and meticulous attention to detail. From the distinctive LV…

Read More

The Dame Aer is the primary suction vibrator that we’ve liked

Purchase Adult Intercourse Toys Online The Explore Your Self Store Purchasing the Pride Edition of the Tenga Egg helps the model help the LGBTQ+ group, as 100 percent of the earnings get donated to LGBTQ+ organizations peachy colorful realistic dildo 10, in accordance with Adachi. However peachy colorful realistic dildo 13 alien silicone dildo beast,…

Read More

Besides saving you from the tedious button monitoring

Purchase Adult Intercourse Toys Online The Explore Yourself Store Individuals can get pleasure from some double-penetration play Adult toys, or get pleasure from simultaneous partnered play together. For an extra-intense expertise out of your me-time, contemplate going for one that has a built-in vibrator. Enjoy the penetration, plus turn on the vibrations for added pleasure.…

Read More

The glass building means it’s temperature-play friendly; stick

20 Best Sex Toys For Men That May Enhance Your Intercourse Life In 2025 Whether you’re on the lookout for a bullet vibrator, cock ring, or butt plug (or a little bit bit of everything) you may discover affordable intercourse toy deals which might be as scorching as you are. This lesbian-owned company focuses on…

Read More

Professional buying firms usually have a whole product class

The Rise Of ‘superfakes’: Why Ultra-realistic Designer Knockoffs Are Disrupting The Luxury Trade In the world of style, luxurious handbags are symbols of status, craftsmanship, and timeless design. However, as prices for designer luggage proceed to rise, increasingly more fashion-conscious individuals are turning to replica purses as an inexpensive various. At their core, duplicate handbags…

Read More

As you probably can imagine, it’s impossible to choose one of

Louisiana’s Best Bet! Simple card sport during which you wager on the banker to win, the participant to win, or a tie. The guidelines of Baccarat seem quite complicated, but as all the foundations are set, you usually do not must make any additional selections after inserting your bet. Our international reach is mirrored in…

Read More

All of the actual cash online casinos and sweepstakes casinos

Online Sportsbook, Casino, And Poker Online casinos aren’t regulated in California but, but you’ll have the ability to nonetheless legally play at offshore sites that welcome gamers from the state. BetUS is the most effective online on line casino web site for players that love each on line casino and sportsbook gambling. With a powerful…

Read More

And whereas it wasn’t essentially the most highly effective

Sex Toys & Sizzling Lingerie Free Shipping $50+ If you grew up loving Pokémon (and who didn’t?) you’ll love CFL. Experience highly effective pleasure with the Romp Switch X in vibrant orange, a compact clitoral stimulator designed to ship intense sensations. Featuring patented Pleasure Air Technology & 6 customizable depth levels Punk Cross Bracelet0, this…

Read More

Womanizer is understood for its impressive vary of toys made

15 Finest Sex Toys For Men Based On Consultants In 2022: Cock Rings, Prostate Massagers, Strokers ht v4 nub metal chastity cock cage, Dildos While you shouldn’t go broke for these luxurious masturbators, dishing out the additional dough for products just like the Lelo F1S V3 and Arcwave Ion does have advantages. But honestly, there…

Read More