В примере работы с библиотекой PolarSSL есть такой брейканутый цикл:
Код:
do
{
len = sizeof( buf ) - 1;
memset( buf, 0, sizeof( buf ) );
ret = ssl_read( &ssl, buf, len );
if( ret == POLARSSL_ERR_NET_WANT_READ || ret == POLARSSL_ERR_NET_WANT_WRITE )
continue;
if( ret == POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY )
break;
if( ret < 0 )
{
printf( "failed\n ! ssl_read returned %d\n\n", ret );
break;
}
if( ret == 0 )
{
printf( "\n\nEOF\n\n" );
break;
}
len = ret;
printf( " %d bytes read\n\n%s", len, (char *) buf );
}
while( 1 );
Переводится в ЦД (действия по EOF и по ошибке, разумеется, выносятся из цикла, как не входящие в циклическую последовательность):
Код:
res1 := Ssl.read(c.ssl, buf, bufLen-1);
LOOP IF res1 > 0 THEN
C.buf2str(buf, req, res1);
req[res1] := 0X;
Log.Int(res1); Log.String(" bytes read:"); Log.Ln;
Log.String(req$); Log.Ln;
res1 := Ssl.read(c.ssl, buf, bufLen-1)
ELSIF (res1 = Net.ERR_WANT_READ) OR (res1 = Net.ERR_WANT_WRITE) THEN
res1 := Ssl.read(c.ssl, buf, bufLen-1)
ELSE EXIT
END END;
IF res1 = 0 THEN
Log.String("EOF"); Log.Ln
ELSE
Log.String("Error: "); Log.Int(res1)
END
Для сравнения - запись через REPEAT:
Код:
REPEAT
res1 := Ssl.read(c.ssl, buf, bufLen-1);
IF res1 > 0 THEN
C.buf2str(buf, req, res1);
req[res1] := 0X;
Log.Int(res1); Log.String(" bytes read:"); Log.Ln;
Log.String(req$); Log.Ln
END
UNTIL (res1 <= 0) & (res1 # Net.ERR_WANT_READ) & (res1 # Net.ERR_WANT_WRITE);
IF res1 = 0 THEN
Log.String("EOF"); Log.Ln
ELSE
Log.String("Error: "); Log.Int(res1)
END
Видим, что классы ситуаций "замаскированы" в монолитной охране выхода и условии IF внутри.
ЦД выигрывает.