RosettaCodeData/Task/String-length/Simula/string-length-2.simula

47 lines
1.3 KiB
Plaintext

BEGIN
! NUMBER OF UFT8 CHARACTERS IN STRING ;
INTEGER PROCEDURE UTF8STRLEN(S); TEXT S;
BEGIN
INTEGER R, LEN, BYTES, ALLBYTES;
CHARACTER BYTE;
WHILE S.MORE DO
BEGIN
BYTE := S.GETCHAR;
ALLBYTES := ALLBYTES + 1;
R := RANK(BYTE);
LEN := LEN + 1;
BYTES :=
IF R >= 0 AND R <= 127 THEN 1 ELSE ! 0....... ASCII ;
IF R >= 128 AND R <= 191 THEN 0 ELSE ! 10...... CONTINUATION ;
IF R >= 192 AND R <= 223 THEN 2 ELSE ! 110..... 10x ;
IF R >= 224 AND R <= 239 THEN 3 ELSE ! 1110.... 10x 10x ;
IF R >= 240 AND R <= 247 THEN 4 ELSE ! 11110... 10x 10x 10x ;
-1;
IF BYTES = -1 THEN ERROR("ILLEGAL UTF8 STRING");
WHILE BYTES > 1 DO
BEGIN
BYTE := S.GETCHAR;
ALLBYTES := ALLBYTES + 1;
BYTES := BYTES - 1;
END;
END;
UTF8STRLEN := LEN;
END UTF8STRLEN;
TEXT LINE;
WHILE NOT LASTITEM DO
BEGIN
INTEGER L;
LINE :- COPY(SYSIN.IMAGE).STRIP;
OUTCHAR('"');
OUTTEXT(LINE);
OUTCHAR('"');
L := UTF8STRLEN(LINE);
OUTTEXT(" CHARACTER LENGTH = "); OUTINT(UTF8STRLEN(LINE), 0);
OUTIMAGE;
INIMAGE;
END;
END.