|
|
1.1 root 1: \ tag: misc useful functions
2: \
3: \ Misc useful functions
4: \
5: \ Copyright (C) 2003 Samuel Rydh
6: \
7: \ See the file "COPYING" for further information about
8: \ the copyright and warranty status of this work.
9: \
10:
11: \ compare c-string with (str len) pair
12: : comp0 ( cstr str len -- 0|-1|1 )
13: 3dup
14: comp ?dup if >r 3drop r> exit then
15: nip + c@ 0<> if 1 else 0 then
16: ;
17:
18: \ returns 0 if the strings match
19: : strcmp ( str1 len1 str2 len2 -- 0|1 )
20: rot over <> if 3drop 1 exit then
21: comp if 1 else 0 then
22: ;
23:
24: : strchr ( str len char -- where|0 )
25: >r
26: begin
27: 1- dup 0>=
28: while
29: ( str len )
30: over c@ r@ = if r> 2drop exit then
31: swap 1+ swap
32: repeat
33: r> 3drop 0
34: ;
35:
36: : cstrlen ( cstr -- len )
37: dup
38: begin dup c@ while 1+ repeat
39: swap -
40: ;
41:
42: : strdup ( str len -- newstr len )
43: dup if
44: dup >r
45: dup alloc-mem dup >r swap move
46: r> r>
47: else
48: 2drop 0 0
49: then
50: ;
51:
52: : dict-strdup ( str len -- dict-addr len )
53: dup here swap allot null-align
54: swap 2dup >r >r move r> r>
55: ;
56:
57: \ -----------------------------------------------------
58: \ string copy and cat variants
59: \ -----------------------------------------------------
60:
61: : tmpstrcat ( addr2 len2 addr1 len1 tmpbuf -- buf len1+len2 tmpbuf+l1+l2 )
62: \ save return arguments
63: dup 2 pick + 4 pick + >r ( R: buf+l1+l2 )
64: over 4 pick + >r
65: dup >r
66: \ copy...
67: 2dup + >r
68: swap move r> swap move
69: r> r> r>
70: ;
71:
72: : tmpstrcpy ( addr1 len1 tmpbuf -- tmpbuf len1 tmpbuf+len1 )
73: swap 2dup >r >r move
74: r> r> 2dup +
75: ;
76:
77:
78:
79: \ -----------------------------------------------------
80: \ number to string conversion
81: \ -----------------------------------------------------
82:
83: : numtostr ( num buf -- buf len )
84: swap rdepth -rot
85: ( rdepth buf num )
86: begin
87: base @ u/mod swap
88: \ dup 0< if base @ + then
89: dup a < if ascii 0 else ascii a a - then + >r
90: ?dup 0=
91: until
92:
93: rdepth rot - 0
94: ( buf len cnt )
95: begin
96: r> over 4 pick + c!
97: 1+ 2dup <=
98: until
99: drop
100: ;
101:
102: : tohexstr ( num buf -- buf len )
103: base @ hex -rot numtostr rot base !
104: ;
105:
106: : toudecstr ( num buf -- buf len )
107: base @ decimal -rot numtostr rot base !
108: ;
109:
110: : todecstr ( num buf -- buf len )
111: over 0< if
112: swap negate over ascii - over c! 1+
113: ( buf num buf+1 )
114: toudecstr 1+ nip
115: else
116: toudecstr
117: then
118: ;
119:
120:
121: \ -----------------------------------------------------
122: \ string to number conversion
123: \ -----------------------------------------------------
124:
125: : parse-hex ( str len -- value )
126: base @ hex -rot $number if 0 then swap base !
127: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.