############################################################################ # # File: labeler.icn # # Subject: Procedure to produce successive labels # # Author: Gregg M. Townsend # # Date: April 9, 1993 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # This procedure produces a new label in sequence each time it's called. # The labels consist of all possible combinations of the characters given # in the argument the first time it is called. See star(s) in gener.icn # for a generator that does the same thing (and much more concisely). # ############################################################################ # # Increment a counter and convert to a label. procedure label(chars) static s, abet local i initial { abet := string(chars) # initialize alphabet s := abet[1] # initialize string return s } i := *s # start with last `digit' while s[i] == abet[*abet] do { # while need to `carry' s[i] := abet[1] # reset digit i -:= 1 # move left one digit if i = 0 then # if no more digits return s := abet[1] || s # lengthen string } s[i] := abet[find(s[i],abet)+1] # normal case: incr one digit return s end