RosettaCodeData/Task/String-comparison/ALGOL-68/string-comparison.alg

68 lines
3.2 KiB
Plaintext

STRING a := "abc ", b := "ABC ";
# when comparing strings, Algol 68 ignores trailing blanks #
# so e.g. "a" = "a " is true #
# test procedure, prints message if condition is TRUE #
PROC test = ( BOOL condition, STRING message )VOID:
IF condition THEN print( ( message, newline ) ) FI;
# equality? #
test( a = b, "a = b" );
# inequality? #
test( a /= b, "a not = b" );
# lexically ordered before? #
test( a < b, "a < b" );
# lexically ordered after? #
test( a > b, "a > b" );
# Algol 68's builtin string comparison operators are case-sensitive. #
# To perform case insensitive comparisons, procedures or operators #
# would need to be written #
# e.g. #
# compare two strings, ignoring case #
# Note the "to upper" PROC is an Algol 68G extension #
# It could be written in standard Algol 68 (assuming ASCII) as e.g. #
# PROC to upper = ( CHAR c )CHAR: #
# IF c < "a" OR c > "z" THEN c #
# ELSE REPR ( ( ABS c - ABS "a" ) + ABS "A" ) FI; #
PROC caseless comparison = ( STRING a, b )INT:
BEGIN
INT a max = UPB a, b max = UPB b;
INT a pos := LWB a, b pos := LWB b;
INT result := 0;
WHILE result = 0
AND ( a pos <= a max OR b pos <= b max )
DO
CHAR a char := to upper( IF a pos <= a max THEN a[ a pos ] ELSE " " FI );
CHAR b char := to upper( IF b pos <= b max THEN b[ b pos ] ELSE " " FI );
result := ABS a char - ABS b char;
a pos +:= 1;
b pos +:= 1
OD;
IF result < 0 THEN -1 ELIF result > 0 THEN 1 ELSE 0 FI
END ; # caseless comparison #
# compare two strings for equality, ignoring case #
PROC equal ignoring case = ( STRING a, b )BOOL: caseless comparison( a, b ) = 0;
# similar procedures for inequality and lexical ording ... #
test( equal ignoring case( a, b ), "a = b (ignoring case)" );
# Algol 68 is strongly typed - strings cannot be compared to e.g. integers #
# unless procedures or operators are written, e.g. #
# e.g. OP = = ( STRING a, INT b )BOOL: a = whole( b, 0 ); #
# OP = = ( INT a, STRING b )BOOL: b = a; #
# etc. #
# Algol 68 also has <= and >= comparison operators for testing for #
# "lexically before or equal" and "lexically after or equal" #
test( a <= b, "a <= b" );
test( a >= b, "a >= b" );
# there are no other forms of string comparison builtin to Algol 68 #