Annotation of qemu/roms/openbios/forth/lib/string.fs, revision 1.1.1.1

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: ;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.