1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; UrForth level
1: self
-hosting
32-bit Forth compiler
3 ;; Copyright
(C
) 2020 Ketmar Dark
// Invisible Vector
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 ;; search the string specified by c
-addr1 u1
for the string specified by c
-addr2 u2
.
10 ;; if flag is true
, a match was found at c
-addr3 with u3 characters remaining
.
11 ;; if flag is false there was no match and c
-addr3 is c
-addr1 and u3 is u1
.
12 code: SEARCH ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag )
17 jr z
,.exitfound
;; this is what tester wants
22 mov edi
,[esp
+12] ;; c
-addr1
23 add edx
,edi
;; EDX is
end address
25 mov esi
,[esp
+4] ;; c
-addr2
31 jr nz
,.notfound
;; no first char found
33 jr z
,.found
;; our pattern is one char
, and it was found
39 jr c
,.notfound
;; the rest is shorter than a pattern
45 dec edi
;; exact match found
47 mov
[esp
+12],edi
;; c
-addr1
61 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
62 code: UPCASE-CHAR ( ch -- ch ) ;; koi8
63 ld eax
,TOS
;; to avoid register dependency
80 cp al
,0xa3 ;; yo small
89 code: UPCASE-STR ( addr count -- )
109 code: LOCASE-CHAR ( ch -- ch )
110 ld eax
,TOS
;; to avoid register dependency
136 code: LOCASE-STR ( addr count -- )
156 ;; this may be slower than the table solution
, but it is smaller too
157 code: IS-ALPHA? ( ch -- flag )
158 ld eax
,TOS
;; to avoid register dependency
181 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
182 code: MEMEQU ( addr1 addr2 size -- equflag )
197 code: MEMEQU-CI ( addr1 addr2 size -- equflag )
217 xchg al
,ah
;; AL
:[addr2
]; AH
:[addr1
]
221 xchg al
,ah
;; AL
:[addr1
]; AH
:[addr2
]
237 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
239 code: MEMCMP ( addr1 addr2 size -- n )
257 code: MEMCMP-CI ( addr1 addr2 size -- n )
276 xchg al
,ah
;; AL
:[addr2
]; AH
:[addr1
]
280 xchg al
,ah
;; AL
:[addr1
]; AH
:[addr2
]
299 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
300 : S
= ( addr0 count0 addr1 count1
-- flag
) rot over
- if drop
2drop false
else memequ
endif ;
301 : S
=CI
( addr0 count0 addr1 count1
-- flag
) rot over
- if drop
2drop false
else memequ
-ci
endif ;
303 : COMPARE
( c
-addr1 u1 c
-addr2 u2
-- n
) rot
2dup
2>r umin memcmp ?dup ifnot
2r
> swap ucmp
else 2rdrop
endif ;
304 : COMPARE
-CI
( c
-addr1 u1 c
-addr2 u2
-- n
) rot
2dup
2>r umin memcmp
-ci ?dup ifnot
2r
> swap ucmp
else 2rdrop
endif ;
307 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
308 ;; search the string specified by addr size
for the char ch
.
309 ;; if flag is true
, a match was found at addr1 with size1 characters remaining
.
310 ;; if flag is false there was no match and addr1 is addr and size1 is size
.
311 ;; if size1 is zero
, flag is always false
312 code: MEMCHR ( addr size ch -- addr1 size1 flag )
332 code: MEMCHR-CI ( addr size ch -- addr1 size1 flag )