• Модуль: ui
  • Путь к файлу: ~/bitrix/modules/ui/lib/barcode/barcodegenerator.php
  • Класс: BitrixUIBarcodeBarcodeGenerator
  • Вызов: BarcodeGenerator::code_128_normalize
private function code_128_normalize($data, $dstate, $fnc1) {
	$detectcba = '/(^[0-9]{4,}|^[0-9]{2}$)|([x60-x7F])|([x00-x1F])/';
	$detectc = '/(^[0-9]{6,}|^[0-9]{4,}$)/';
	$detectba = '/([x60-x7F])|([x00-x1F])/';
	$consumec = '/(^[0-9]{2})/';
	$state = (($dstate > 0 && $dstate < 4) ? $dstate : 0);
	$abstate = ((abs($dstate) == 2) ? 2 : 1);
	$chars = array(102 + ($state ? $state : $abstate));
	if ($fnc1) $chars[] = 102;
	while (strlen($data)) {
		switch ($state) {
			case 0:
				if (preg_match($detectcba, $data, $m)) {
					if ($m[1]) {
						$state = 3;
					} else if ($m[2]) {
						$state = 2;
					} else {
						$state = 1;
					}
				} else {
					$state = $abstate;
				}
				$chars = array(102 + $state);
				if ($fnc1) $chars[] = 102;
				break;
			case 1:
				if ($dstate <= 0 && preg_match($detectc, $data, $m)) {
					if (strlen($m[0]) % 2) {
						$data = substr($data, 1);
						$chars[] = 16 + substr($m[0], 0, 1);
					}
					$state = 3;
					$chars[] = 99;
				} else {
					$ch = ord(substr($data, 0, 1));
					$data = substr($data, 1);
					if ($ch < 32) {
						$chars[] = $ch + 64;
					} else if ($ch < 96) {
						$chars[] = $ch - 32;
					} else {
						if (preg_match($detectba, $data, $m)) {
							if ($m[1]) {
								$state = 2;
								$chars[] = 100;
							} else {
								$chars[] = 98;
							}
						} else {
							$chars[] = 98;
						}
						$chars[] = $ch - 32;
					}
				}
				break;
			case 2:
				if ($dstate <= 0 && preg_match($detectc, $data, $m)) {
					if (strlen($m[0]) % 2) {
						$data = substr($data, 1);
						$chars[] = 16 + substr($m[0], 0, 1);
					}
					$state = 3;
					$chars[] = 99;
				} else {
					$ch = ord(substr($data, 0, 1));
					$data = substr($data, 1);
					if ($ch >= 32) {
						$chars[] = $ch - 32;
					} else {
						if (preg_match($detectba, $data, $m)) {
							if ($m[2]) {
								$state = 1;
								$chars[] = 101;
							} else {
								$chars[] = 98;
							}
						} else {
							$chars[] = 98;
						}
						$chars[] = $ch + 64;
					}
				}
				break;
			case 3:
				if (preg_match($consumec, $data, $m)) {
					$data = substr($data, 2);
					$chars[] = (int)$m[0];
				} else {
					if (preg_match($detectba, $data, $m)) {
						if ($m[1]) {
							$state = 2;
						} else {
							$state = 1;
						}
					} else {
						$state = $abstate;
					}
					$chars[] = 102 - $state;
				}
				break;
		}
	}
	return $chars;
}