3 "This package contains the useful stuff in the old STR package, rewritten
4 in Muddle instead of assembly code."
6 <ENTRY SUBSTR SUBSNC UPPERCASE SIXTOS STRTOX LOWERCASE>
8 "STRTOX -- String to Sixbit, takes a string and returns a single-word sixbit
11 <DEFINE STRTOX (STR "AUX" (W 0) (CNT 0) C)
12 #DECL ((STR) STRING (W) <PRIMTYPE WORD> (CNT C) FIX)
14 <COND (<EMPTY? .STR> <SET C 0>)
15 (<G? <SET C <C2I <1 .STR>>> 31>
18 <COND (<L? .C 64> <RETURN>)>>)
20 <SET W <ORB <LSH .W 6> .C>>
21 <COND (<==? <SET CNT <+ .CNT 1>> 6> <RETURN .W>)>
22 <OR <EMPTY? .STR> <SET STR <REST .STR>>>>>
24 "SIXTOS -- Sixbit to String, takes a sixbit word and returns the string
25 corresponding to it. Note that trailing sixbit spaces are not put in the
28 <DEFINE SIXTOS (W "OPTIONAL" (Q <>))
29 #DECL ((W) <PRIMTYPE WORD> (Q) <OR CHARACTER FALSE>)
32 #DECL ((C) <PRIMTYPE FIX>)
33 <AND <0? <CHTYPE .W FIX>> <MAPSTOP>>
35 <SET C <I2C <+ <ANDB .W 63> 32>>>
37 <COND (<AND .Q <MEMQ .C " :;">>
41 "CHARACTER <-> FIX : Faster than ASCII."
43 <DEFMAC I2C ('I) <FORM CHTYPE .I CHARACTER>>
45 <DEFMAC C2I ('C) <FORM CHTYPE .C FIX>>
47 "SUBSTR -- Substring search, takes arguments such as MEMQ and optionally a maximum
48 length to search and a flag indicating whether case is to be considered
51 <DEFINE SUBSTR (S1 S2 "OPTIONAL" (N <LENGTH .S2>) (CASE? T)
52 "AUX" (S .S1) (WIN <>) (CNT 0) C)
53 #DECL ((S S1 S2) STRING (WIN) <OR STRING FALSE> (N CNT) FIX (C) CHARACTER)
57 <COND (<G? <SET CNT <+ .CNT 1>> .N> <MAPLEAVE <>>)
58 (<OR <==? <1 .S> <SET C <1 .S2>>>
60 <==? <COND (<AND <G=? <C2I .C> <C2I !\a>>
61 <L=? <C2I .C> <C2I !\z>>>
62 <I2C <- <C2I .C> 32>>)
64 <COND (<AND <G=? <C2I <1 .S>> <C2I !\a>>
65 <L=? <C2I <1 .S>> <C2I !\z>>>
66 <I2C <- <C2I <1 .S>> 32>>)
68 <OR .WIN <SET WIN .S2>>
69 <COND (<EMPTY? <SET S <REST .S>>>
76 "SUBSNC -- Substring No Case, encapsulates SUBSTR with a fourth arg of <>"
78 <DEFINE SUBSNC (S1 S2 "OPTIONAL" (N <LENGTH .S2>))
79 #DECL ((S1 S2) STRING (N) FIX)
80 <SUBSTR .S1 .S2 .N <>>>
82 "UPPERCASE -- Uppercases a string, clobbers the old string."
84 <DEFINE UPPERCASE (S "OPTIONAL" (CNT <LENGTH .S>))
85 #DECL ((S) STRING (CNT) FIX)
88 <COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)
89 (<AND <G=? <C2I <1 .S>> <C2I !\a>>
90 <L=? <C2I <1 .S>> <C2I !\z>>>
91 <PUT .S 1 <I2C <- <C2I <1 .S>> 32>>>)>
95 "LOWERCASE -- Lowercases a string, clobbers the old string."
97 <DEFINE LOWERCASE (S "OPTIONAL" (CNT <LENGTH .S>))
98 #DECL ((S) STRING (CNT) FIX)
101 <COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)
102 (<AND <G=? <C2I <1 .S>> <C2I !\A>>
103 <L=? <C2I <1 .S>> <C2I !\Z>>>
104 <PUT .S 1 <I2C <+ <C2I <1 .S>> 32>>>)>