Re: Разбор idec №2

Ответ на комментарий от revoltech
Вот чего я родил - всем сестра'м по серьга'м как говорится :)
elseif ($opts[0] == 'u' and $opts[1] == 'e') {
	$work_options=array_slice($opts, 2);
	$aecho = [];
	$aoff = [];
	$alen = [];
	$lim = 0;
	$count = 0;
	foreach ($work_options as $work) {
		if(is_numeric($work)) {
			if($lim >= 0) die("error: unexpected single number");
			$lim = intval($work);
			if($lim < 0) die("error: unexpected negative number");
		} elseif(strpos($work,".")!==false) {
			if($lim < 0) die("error: missing lim value");
			array_push($aecho,$work);
			if($lim > 0) {
				array_push($aoff,-$lim);
				array_push($alen,$lim);
			} else {
				array_push($aoff,NULL);
				array_push($alen,NULL);
			}
			$count = $count + 1;
		} elseif(strpos($work,":")!==false || strcmp($work,"all")==0 || strcmp($work,"last")==0) {
			if($lim != 0) die("error: slice can not be used with lim");
			if(strcmp($work,"all")==0) {
				$a = 0;
				$b = 0;
			} elseif(strcmp($work,"last")==0) {
				$a = -1;
				$b = 1;
			} else {
				$numbers=explode(":", $work);
				$a = intval($numbers[0]);
				$b = intval($numbers[1]);
			}
			for($i=$count-1;$i>=0;$i--) {
				if(!is_null($aoff[$i])) break;
				$aoff[$i] = $a;
				$alen[$i] = $b;
			}
		} elseif(strcmp($work,"lim")==0) {
			$lim = -1;
		} else die("error: wrong arguments");
	}
	$buffer = "";
	for($i=0;$i<$count;$i++) {
		$echo = $aecho[$i];
		if($aoff[$i]==0 && $alen[$i]==0) {
			$slice = $access->getMsgList($echo); // NULL, NULL
		} else {
			$slice = $access->getMsgList($echo, $aoff[$i], $alen[$i]);
		}
		if (count($slice) > 0) {
			$buffer.=$echo."\n".implode("\n", $slice)."\n";
		} else {
			$buffer.=$echo."\n";
		}
	}
	echo $buffer;
}
тут тебе и стандартный ii, и со слайсами в конце [-]N:M как в IDEC, и со слайсами внутри (между именами эх) как я предлагал ранее, и можно писать last вместо -1:1, и можно писать all внутри если в конце стоит last или какие другие нумера (типа /u/e/echo.1/all/echo.2/echo.3/last если надо только последнее сообщение для последних двух эх и всё для первой), и можно после каждой эхи писать, как предлагал revoltech, и даже lim/N в начале пройдёт как у Ромы (правда при этом уже нельзя будет слайсы воткнуть), а вот от msgid и далее делать неохота ибо оно криво будет работать т.к. порядок может быть чуть разный на разных нодах...
Ответы на это сообщение: revoltech (2024-11-01 06:40:05)
shaos (2024-11-01 06:19:54) [Ответить]
Предыдущее сообщение Следующее сообщение