73 lines
1.8 KiB
Plaintext
73 lines
1.8 KiB
Plaintext
STRING input := "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW";
|
|
STRING output := "12W1B12W3B24W1B14W";
|
|
|
|
MODE YIELDCHAR = PROC(CHAR)VOID;
|
|
MODE GENCHAR = PROC(YIELDCHAR)VOID;
|
|
|
|
PROC gen char string = (REF STRING s, YIELDCHAR yield)VOID:
|
|
FOR i FROM LWB s TO UPB s DO yield(s[i]) OD;
|
|
|
|
CO
|
|
# Note: The following 2 lines use currying. This not supported by ELLA ALGOL 68RS #
|
|
GENCHAR input seq = gen char string(input,),
|
|
output seq = gen char string(output,);
|
|
END CO
|
|
|
|
GENCHAR
|
|
input seq = (YIELDCHAR yield)VOID: gen char string(input, yield),
|
|
output seq = (YIELDCHAR yield)VOID: gen char string(output, yield);
|
|
|
|
PROC gen encode = (GENCHAR gen char, YIELDCHAR yield)VOID: (
|
|
INT count := 0;
|
|
CHAR prev;
|
|
# FOR CHAR c IN # gen char( # ) DO ( #
|
|
## (CHAR c)VOID: (
|
|
IF count = 0 THEN
|
|
count := 1;
|
|
prev := c
|
|
ELIF c NE prev THEN
|
|
STRING str count := whole(count,0);
|
|
gen char string(str count, yield); count := 1;
|
|
yield(prev); prev := c
|
|
ELSE
|
|
count +:=1
|
|
FI
|
|
# OD # ));
|
|
IF count NE 0 THEN
|
|
STRING str count := whole(count,0);
|
|
gen char string(str count,yield);
|
|
yield(prev)
|
|
FI
|
|
);
|
|
|
|
STRING zero2nine = "0123456789";
|
|
|
|
PROC gen decode = (GENCHAR gen char, YIELDCHAR yield)VOID: (
|
|
INT repeat := 0;
|
|
# FOR CHAR c IN # gen char( # ) DO ( #
|
|
## (CHAR c)VOID: (
|
|
IF char in string(c, LOC INT, zero2nine) THEN
|
|
repeat := repeat*10 + ABS c - ABS "0"
|
|
ELSE
|
|
FOR i TO repeat DO yield(c) OD;
|
|
repeat := 0
|
|
FI
|
|
# OD # ))
|
|
);
|
|
|
|
# iterate through input string #
|
|
print("Encode input: ");
|
|
# FOR CHAR c IN # gen encode(input seq, # ) DO ( #
|
|
## (CHAR c)VOID:
|
|
print(c)
|
|
# OD # );
|
|
print(new line);
|
|
|
|
# iterate through output string #
|
|
print("Decode output: ");
|
|
# FOR CHAR c IN # gen decode(output seq, # ) DO ( #
|
|
## (CHAR c)VOID:
|
|
print(c)
|
|
# OD # );
|
|
print(new line)
|