strings.asm
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:19k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. ; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2. ; This library is free software; you can redistribute it and/or
  3. ; modify it under the terms of the GNU Library General Public
  4. ; License as published by the Free Software Foundation; either
  5. ; version 2 of the License, or (at your option) any later version.
  6. ; This library is distributed in the hope that it will be useful,
  7. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  9. ; Library General Public License for more details.
  10. ; You should have received a copy of the GNU Library General Public
  11. ; License along with this library; if not, write to the Free
  12. ; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  13. ; MA 02111-1307, USA
  14. ; Note that if you don't have a macro assembler (like MASM) to compile
  15. ; this file, you can instead compile all *.c files in the string
  16. ; directory.
  17. TITLE   Stringfunctions that we use often at MSDOS / Intel 8086
  18. ifndef M_I386
  19. .8087
  20. DOSSEG
  21. .MODEL LARGE
  22. .CODE
  23. ;
  24. ; Some macros
  25. ;
  26. q_movs MACRO ; as rep movsb but quicker
  27. shr cx,1
  28. rep movsw ; Move 2 bytes at a time
  29. adc cx,cx
  30. rep movsb ; Move last byte if any
  31. ENDM
  32. q_stos MACRO ; as rep stosb but quicker
  33. mov ah,al ; For word store
  34. shr cx,1
  35. rep stosw ; Move 2 bytes at a time
  36. adc cx,cx
  37. rep stosb ; Move last byte if any
  38.   ENDM
  39. ifndef  ZTC ; If not using ZORTECH compiler
  40. ;
  41. ; Compare memory
  42. ; Args: s1,s2,length
  43. ;
  44. PUBLIC _bcmp
  45. _bcmp PROC
  46. mov bx,bp ; Save bp
  47. mov dx,di ; Save di
  48. mov bp,sp
  49. push ds
  50. push si
  51. les di,DWORD PTR [bp+8] ; s2
  52. lds si,DWORD PTR [bp+4] ; s1
  53. mov cx,WORD PTR [bp+12] ; Length of memory-area
  54. jcxz @F ; Length = 0, return same
  55. ; cld ; Work uppward
  56. repe cmpsb ; Compare strings
  57. jz @F ; Match found
  58. inc cx ; return matchpoint +1
  59. @@: mov ax,cx ; Return 0 if match, else pos from end
  60. pop si
  61. pop ds
  62. mov di,dx
  63. mov bp,bx
  64. ret
  65. _bcmp ENDP
  66. ;
  67. ; Find a char in a string
  68. ; Arg: str,char
  69. ; Ret: pointer to found char or NullS
  70. ;
  71. ifdef better_stringfunctions ; Breaks window linkage (broken linking)
  72. PUBLIC _strchr
  73. _strchr PROC
  74. mov bx,bp ; Save bp and di
  75. mov dx,di
  76. mov bp,sp
  77. les di,DWORD PTR [bp+4] ; str
  78. mov ah,BYTE PTR [bp+8] ; search
  79. xor al,al ; for scasb to find end
  80. @@: cmp ah,es:[di]
  81. jz @F ; Found char
  82. scasb
  83. jnz @B ; Not end
  84. xor di,di ; Not found
  85. mov es,di
  86. @@: mov ax,di
  87. mov di,dx ; Restore
  88. mov dx,es ; Seg adr
  89. mov bp,bx ; Restore
  90. ret
  91. _strchr ENDP
  92. ;
  93. ; Find length of string
  94. ; arg: str
  95. ; ret: length
  96. ;
  97. PUBLIC _strlen
  98. _strlen PROC
  99. mov bx,sp
  100. mov dx,di
  101. les di,DWORD PTR ss:[bx+4] ; Str
  102. xor al,al ; Find end of string
  103. mov cx,-1
  104. ; cld
  105. repne scasb ; Find strend or length
  106. inc cx ; Calc strlength
  107. not cx
  108. mov ax,cx
  109. mov di,dx ; Restore register
  110. ret
  111. _strlen ENDP
  112. endif
  113. ;
  114. ; Move a string
  115. ; arg: dst,src
  116. ; ret: end-null of to
  117. ;
  118. PUBLIC _strmov
  119. _strmov PROC
  120. mov bx,bp
  121. mov cx,si
  122. mov bp,sp
  123. push ds
  124. push di
  125. les di,DWORD PTR [bp+4] ; dst
  126. lds si,DWORD PTR [bp+8] ; src
  127. ; cld
  128. @@: mov al,ds:[si]
  129. movsb ; move arg
  130. and al,al
  131. jnz @B ; Not last
  132. lea ax,WORD PTR [di-1] ; Set DX:AX to point at last null
  133. mov dx,es
  134. pop di
  135. pop ds
  136. mov si,cx
  137. mov bp,bx
  138. ret
  139. _strmov ENDP
  140. ;
  141. ; Fill a area of memory with a walue
  142. ; Args: to,length,fillchar
  143. ;
  144. PUBLIC _bfill
  145. _bfill PROC
  146. mov bx,sp ; Get args through BX
  147. mov al,BYTE PTR ss:[bx+10] ; Fill
  148. bfill_10:
  149. mov dx,di ; Save di
  150. les di,DWORD PTR ss:[bx+4] ; Memory pointer
  151. mov cx,WORD PTR ss:[bx+8] ; Length
  152. ; cld
  153. q_stos
  154. mov di,dx
  155. ret
  156. _bfill ENDP
  157. ;
  158. ; Fill a area with null
  159. ; Args: to,length
  160. PUBLIC _bzero
  161. _bzero PROC
  162. mov bx,sp ; Get args through BX
  163. mov al,0 ; Fill with null
  164. jmp short bfill_10
  165. _bzero ENDP
  166. endif ; ZTC
  167. ;
  168. ; Move a memory area
  169. ; Args: to,from,length
  170. ;
  171. PUBLIC _bmove
  172. _bmove PROC
  173. mov bx,bp
  174. mov dx,di
  175. mov ax,si
  176. mov bp,sp
  177. push ds
  178. lds si,DWORD PTR [bp+8] ; from
  179. les di,DWORD PTR [bp+4] ; to
  180. mov cx,WORD PTR [bp+12] ; Length of memory-area
  181. ; cld ; Work uppward
  182. rep movsb ; Not q_movs because overlap ?
  183. pop ds
  184. mov si,ax
  185. mov di,dx
  186. mov bp,bx
  187. ret
  188. _bmove ENDP
  189. ;
  190. ; Move a alligned, not overlapped, by (long) divided memory area
  191. ; Args: to,from,length
  192. ;
  193. PUBLIC _bmove_align
  194. _bmove_align PROC
  195. mov bx,bp
  196. mov dx,di
  197. mov ax,si
  198. mov bp,sp
  199. push ds
  200. lds si,DWORD PTR [bp+8] ; from
  201. les di,DWORD PTR [bp+4] ; to
  202. mov cx,WORD PTR [bp+12] ; Length of memory-area
  203. ; cld ; Work uppward
  204. inc cx ; fix if not divisible with word
  205. shr cx,1
  206. rep movsw ; Move 2 bytes at a time
  207. pop ds
  208. mov si,ax
  209. mov di,dx
  210. mov bp,bx
  211. ret
  212. _bmove_align ENDP
  213. ;
  214. ; Move a string from higher to lower
  215. ; Arg from+1,to+1,length
  216. ;
  217. PUBLIC _bmove_upp
  218. _bmove_upp PROC
  219. mov bx,bp
  220. mov dx,di
  221. mov ax,si
  222. mov bp,sp
  223. push ds
  224. lds si,DWORD PTR [bp+8] ; from
  225. les di,DWORD PTR [bp+4] ; to
  226. mov cx,WORD PTR [bp+12] ; Length of memory-area
  227. dec di ; Don't move last arg
  228. dec si
  229. std ; Work downward
  230. rep movsb ; Not q_movs because overlap ?
  231. cld ; C compilator want cld
  232. pop ds
  233. mov si,ax
  234. mov di,dx
  235. mov bp,bx
  236. ret
  237. _bmove_upp ENDP
  238. ;
  239. ; Append fillchars to string
  240. ; Args: dest,len,fill
  241. ;
  242. PUBLIC _strappend
  243. _strappend PROC
  244. mov bx,bp
  245. mov dx,di
  246. mov bp,sp
  247. les di,DWORD PTR [bp+4] ; Memory pointer
  248. mov cx,WORD PTR [bp+8] ; Length
  249. sub al,al ; Find end of string
  250. ; cld
  251. repne scasb
  252. jnz sa_99 ; String to long, shorten it
  253. mov al,BYTE PTR [bp+10] ; Fillchar
  254. dec di ; Point at end null
  255. inc cx ; rep made one dec for null-char
  256. q_stos ; Store al in string
  257. sa_99: mov BYTE PTR es:[di],0 ; End of string
  258. mov di,dx
  259. mov bp,bx
  260. ret
  261. _strappend ENDP
  262. ;
  263. ; Find if string contains any char in another string
  264. ; Arg: str,set
  265. ; Ret: Pointer to first found char in str
  266. ;
  267. PUBLIC _strcont
  268. _strcont PROC
  269. mov bx,bp ; Save bp and di in regs
  270. mov dx,di
  271. mov bp,sp
  272. push ds
  273. push si
  274. lds si,DWORD PTR [bp+4] ; str
  275. les di,DWORD PTR [bp+8] ; Set
  276. mov cx,di ; Save for loop
  277. xor ah,ah ; For endtest
  278. jmp sc_60
  279. sc_10: scasb
  280. jz sc_fo ; Found char
  281. sc_20: cmp ah,es:[di] ; Test if null
  282. jnz sc_10 ; Not end of set yet
  283. inc si ; Next char in str
  284. mov di,cx ; es:di = Set
  285. sc_60: mov al,ds:[si] ; Test if this char exist
  286. and al,al
  287. jnz sc_20 ; Not end of string
  288. sub si,si ; Return Null
  289. mov ds,si
  290. sc_fo: mov ax,si ; Char found here
  291. mov di,dx ; Restore
  292. mov dx,ds ; Seg of found char
  293. pop si
  294. pop ds
  295. mov bp,bx
  296. ret
  297. _strcont ENDP
  298. ;
  299. ; Found end of string
  300. ; Arg: str
  301. ; ret: Pointer to end null
  302. ;
  303. PUBLIC _strend
  304. _strend PROC
  305. mov bx,sp
  306. mov dx,di ; Save
  307. les di,DWORD PTR ss:[bx+4] ; str
  308. mov cx,-1
  309. sub al,al ; Find end of string
  310. ; cld
  311. repne scasb
  312. lea ax,WORD PTR [di-1] ; Endpos i DX:AX
  313. mov di,dx ; Restore
  314. mov dx,es
  315. ret
  316. _strend ENDP
  317. ;
  318. ; Make a string with len fill-chars and endnull
  319. ; Args: dest,len,fill
  320. ; Ret:  dest+len
  321. ;
  322. PUBLIC _strfill
  323. _strfill PROC
  324. mov bx,bp ; Save sp
  325. mov bp,sp
  326. push di
  327. les di,DWORD PTR [bp+4] ; Memory pointer
  328. mov cx,WORD PTR [bp+8] ; Length
  329. mov al,BYTE PTR [bp+10] ; Fill
  330. ; cld
  331. q_stos
  332. mov BYTE PTR es:[di],0 ; End NULL
  333. mov ax,di ; End i DX:AX
  334. mov dx,es
  335. pop di
  336. mov bp,bx
  337. ret
  338. _strfill ENDP
  339. ;
  340. ; Find a char in or end of a string
  341. ; Arg: str,char
  342. ; Ret: pointer to found char or NullS
  343. ;
  344. PUBLIC _strcend
  345. _strcend PROC
  346. mov bx,bp ; Save bp and di
  347. mov dx,di
  348. mov bp,sp
  349. les di,DWORD PTR [bp+4] ; str
  350. mov ah,BYTE PTR [bp+8] ; search
  351. xor al,al ; for scasb to find end
  352. @@: cmp ah,es:[di]
  353. jz @F ; Found char
  354. scasb
  355. jnz @B ; Not end
  356. dec  di ; Not found, point at end of string
  357. @@: mov ax,di
  358. mov di,dx ; Restore
  359. mov dx,es ; Seg adr
  360. mov bp,bx ; Restore
  361. ret
  362. _strcend ENDP
  363. ;
  364. ; Test if string has a given suffix
  365. ;
  366. PUBLIC  _is_prefix
  367. _is_prefix PROC
  368. mov dx,di ; Save di
  369. mov bx,sp ; Arguments through bx
  370. push ds
  371. push si
  372. les di,DWORD PTR ss:[bx+8] ; s2
  373. lds si,DWORD PTR ss:[bx+4] ; s1
  374. mov ax,1 ; Ok and zero-test
  375. ; cld ; Work uppward
  376. @@: cmp ah,es:[di]
  377. jz suf_ok ; End of string; found suffix
  378. cmpsb ; Compare strings
  379. jz @B ; Same, possible prefix
  380. xor ax,ax ; Not suffix
  381. suf_ok: pop si
  382. pop ds
  383. mov di,dx
  384. ret
  385. _is_prefix ENDP
  386. ;
  387. ; Find a substring in string
  388. ; Arg: str,search
  389. ;
  390. PUBLIC _strstr
  391. _strstr PROC
  392. mov bx,bp
  393. mov bp,sp
  394. push ds
  395. push di
  396. push si
  397. lds si,DWORD PTR [bp+4] ; str
  398. les di,DWORD PTR [bp+8] ; search
  399. mov cx,di
  400. inc cx ; CX = search+1
  401. mov ah,es:[di] ; AH = First char in search
  402. jmp sf_10
  403. sf_00: mov si,dx ; si = Current str-pos
  404. sf_10: mov al,ds:[si] ; Test if this char exist
  405. and al,al
  406. jz sf_90 ; End of string, didn't find search
  407. inc si
  408. cmp al,ah
  409. jnz sf_10 ; Didn't find first char, continue
  410. mov dx,si ; Save str-pos in DX
  411. mov di,cx
  412. sf_20: cmp BYTE PTR es:[di],0
  413. jz sf_fo ; Found substring
  414. cmpsb
  415. jz sf_20 ; Char ok
  416. jmp sf_00 ; Next str-pos
  417. sf_90: sub dx,dx ; Return Null
  418. mov ds,dx
  419. inc dx ; Because of following dec
  420. sf_fo: mov ax,dx ; Char found here
  421. dec ax ; Pointed one after
  422. mov dx,ds
  423. pop si
  424. pop di ; End
  425. pop ds
  426. mov bp,bx
  427. ret
  428. _strstr ENDP
  429. ;
  430. ; Find a substring in string, return index
  431. ; Arg: str,search
  432. ;
  433. PUBLIC _strinstr
  434. _strinstr PROC
  435. push bp
  436. mov bp,sp
  437. push di
  438. les di,DWORD PTR [bp+10] ; search
  439. push es
  440. push di
  441. les di,DWORD PTR [bp+6] ; str
  442. push es
  443. push di
  444. call _strstr
  445. mov cx,ax
  446. or cx,dx
  447. jz si_99
  448. sub ax,di ; Pos from start
  449. inc ax ; And first pos = 1
  450. si_99: add sp,8
  451. pop di
  452. pop bp
  453. ret
  454. _strinstr ENDP
  455. ;
  456. ; Make a string of len length from another string
  457. ; Arg: dst,src,length
  458. ; ret: end of dst
  459. ;
  460. PUBLIC _strmake
  461. _strmake PROC
  462. mov bx,bp
  463. mov bp,sp
  464. push ds
  465. push di
  466. push si
  467. les di,DWORD PTR [bp+4] ; dst
  468. lds si,DWORD PTR [bp+8] ; src
  469. mov cx,WORD PTR [bp+12] ; Length of memory-area
  470. xor al,al ; For test of end-null
  471. jcxz sm_90 ; Nothing to move, put zero at end.
  472. ; cld ; Work uppward
  473. @@: cmp al,ds:[si] ; Next char to move
  474. movsb ; move arg
  475. jz sm_99 ; last char, we are ready
  476. loop @B ; Continue moving
  477. sm_90: mov BYTE PTR es:[di],al ; Set end pos
  478. inc di ; Fix that di points at end null
  479. sm_99: dec di ; di points now at end null
  480. mov ax,di ; Ret value in DX:AX
  481. mov dx,es
  482. pop si
  483. pop di
  484. pop ds
  485. mov bp,bx
  486. ret
  487. _strmake ENDP
  488. ;
  489. ; Find length of string with maxlength
  490. ; arg: str,maxlength
  491. ; ret: length
  492. ;
  493. PUBLIC _strnlen
  494. _strnlen PROC
  495. mov bx,bp
  496. mov bp,sp
  497. push di
  498. les di,DWORD PTR [bp+4] ; Str
  499. mov cx,WORD PTR [bp+8] ; length
  500. mov dx,di ; Save str to calc length
  501. jcxz sn_10 ; Length = 0
  502. xor al,al ; Find end of string
  503. ; cld
  504. repne scasb ; Find strend or length
  505. jnz sn_10
  506. dec di ; DI points at last null
  507. sn_10: mov ax,di
  508. sub ax,dx ; Ax = length
  509. pop di
  510. mov bp,bx
  511. ret
  512. _strnlen ENDP
  513. ;
  514. ; Move a string with max len chars
  515. ; arg: dst,src,len
  516. ; ret: pos to first null or dst+len
  517. PUBLIC _strnmov
  518. _strnmov PROC
  519. mov bx,bp
  520. mov bp,sp
  521. push ds
  522. push di
  523. push si
  524. les di,DWORD PTR [bp+4] ; dst
  525. lds si,DWORD PTR [bp+8] ; src
  526. mov cx,WORD PTR [bp+12] ; length
  527. jcxz snm_99 ; Nothing to do
  528. xor al,al ; For test of end-null
  529. ; cld
  530. @@: cmp al,ds:[si] ; Next char to move
  531. movsb ; move arg
  532. jz snm_20 ; last char, fill with null
  533. loop @B ; Continue moving
  534. inc di ; Point two after last
  535. snm_20: dec di ; Point at first null (or last+1)
  536. snm_99: mov ax,di ; Pointer at last char
  537. mov dx,es ; To-segment
  538. pop si
  539. pop di
  540. pop ds
  541. mov bp,bx ; Restore
  542. ret
  543. _strnmov ENDP
  544. else ; M_I386
  545. include macros.asm
  546. q_stos MACRO ; as rep stosb but quicker, Uses edx
  547. mov ah,al ;(2) Set up a 32 bit pattern.
  548. mov edx,eax ;(2)
  549. shl edx,16 ;(3)
  550. or eax,edx ;(2) EAX has the 32 bit pattern.
  551. mov edx,ecx ;(2) Save the count of bytes.
  552. shr ecx,2 ;(2) Number of dwords.
  553. rep stosd ;(5 + 5n)
  554. mov cl,3 ;(2)
  555. and ecx,edx ;(2) Fill in the remaining odd bytes.
  556. rep stosb ; Move last bytes if any
  557. ENDM
  558. fix_es MACRO fix_cld ; Load ES if neaded
  559.   ife ESeqDS
  560. mov ax,ds
  561. mov es,ax
  562.   endif
  563.   ifnb <fix_cld>
  564. cld
  565.   endif
  566. ENDM
  567. ;
  568. ; Move a memory area
  569. ; Args: to,from,length
  570. ; Acts as one byte was moved a-time from dst to source.
  571. ;
  572. begcode bmove
  573. public _bmove
  574. _bmove proc near
  575. fix_es 1
  576. mov edx,edi
  577. mov eax,esi
  578. mov edi,P-SIZEPTR[esp] ;p1
  579. mov esi,P[esp] ;p2
  580. mov ecx,P+SIZEPTR[esp]
  581. rep movsb ; Not q_movs because overlap ?
  582. mov esi,eax
  583. mov edi,edx
  584. ret
  585. _bmove ENDP
  586. endcode bmove
  587. ;
  588. ; Move a alligned, not overlapped, by (long) divided memory area
  589. ; Args: to,from,length
  590. ;
  591. begcode bmove_align
  592. public _bmove_align
  593. _bmove_align proc near
  594. fix_es 1
  595. mov edx,edi
  596. mov eax,esi
  597. mov edi,P-SIZEPTR[esp] ;to
  598. mov esi,P[esp] ;from
  599. mov ecx,P+SIZEPTR[esp] ;length
  600. add cx,3 ;fix if not divisible with long
  601. shr cx,2
  602. rep movsd
  603. mov esi,eax
  604. mov edi,edx
  605. ret
  606. _bmove_align ENDP
  607. endcode bmove_align
  608. ;
  609. ; Move a string from higher to lower
  610. ; Arg from+1,to+1,length
  611. ;
  612. begcode bmove_upp
  613. public _bmove_upp
  614. _bmove_upp proc near
  615. fix_es
  616. std ; Work downward
  617. mov edx,edi
  618. mov eax,esi
  619. mov edi,P-SIZEPTR[esp] ;p1
  620. mov esi,P[esp] ;p2
  621. mov ecx,P+SIZEPTR[esp]
  622. dec edi ; Don't move last arg
  623. dec esi
  624. rep movsb ; One byte a time because overlap !
  625. cld ; C compilator wants cld
  626. mov esi,eax
  627. mov edi,edx
  628. ret
  629. _bmove_upp ENDP
  630. endcode bmove_upp
  631. ;
  632. ; Append fillchars to string
  633. ; Args: dest,len,fill
  634. ;
  635. begcode strappend
  636. public _strappend
  637. _strappend proc near
  638. push ebp
  639. mov ebp,esp
  640. fix_es  1
  641. push edi
  642. mov edi,P[ebp] ; Memory pointer
  643. mov ecx,P+SIZEPTR[ebp] ; Length
  644. clr eax ; Find end of string
  645. repne scasb
  646. jnz sa_99 ; String to long, shorten it
  647. movzx eax,byte ptr P+(2*SIZEPTR)[ebp] ; Fillchar
  648. dec edi ; Point at end null
  649. inc ecx ; rep made one dec for null-char
  650. q_stos ; Store al in string
  651. sa_99: mov BYTE PTR [edi],0 ; End of string
  652. pop edi
  653. pop ebp
  654. ret
  655. _strappend ENDP
  656. endcode strappend
  657. ;
  658. ; Find if string contains any char in another string
  659. ; Arg: str,set
  660. ; Ret: Pointer to first found char in str
  661. ;
  662. begcode strcont
  663. PUBLIC _strcont
  664. _strcont proc near
  665. push ebp
  666. mov ebp,esp
  667. fix_es 1
  668. mov edx,edi
  669. push esi
  670. mov esi,P[ebp] ; str
  671. mov ecx,P+SIZEPTR[ebp] ; Set
  672. clr ah ; For endtest
  673. jmps sc_60
  674. sc_10: scasb
  675. jz sc_fo ; Found char
  676. sc_20: cmp ah,[edi] ; Test if null
  677. jnz sc_10 ; Not end of set yet
  678. inc esi ; Next char in str
  679. sc_60: mov edi,ecx ; edi = Set
  680. mov al,[esi] ; Test if this char exist
  681. and al,al
  682. jnz sc_20 ; Not end of string
  683. clr esi ; Return Null
  684. sc_fo: mov eax,esi ; Char found here
  685. mov edi,edx ; Restore
  686. pop esi
  687. pop ebp
  688. ret
  689. _strcont ENDP
  690. endcode strcont
  691. ;
  692. ; Found end of string
  693. ; Arg: str
  694. ; ret: Pointer to end null
  695. ;
  696. begcode strend
  697. public _strend
  698. _strend proc near
  699. fix_es 1
  700. mov edx,edi ; Save
  701. mov edi,P-SIZEPTR[esp] ; str
  702. clr eax ; Find end of string
  703. mov ecx,eax
  704. dec ecx ; ECX = -1
  705. repne scasb
  706. mov eax,edi
  707. dec eax
  708. mov edi,edx ; Restore
  709. ret
  710. _strend endp
  711. endcode strend
  712. ;
  713. ; Make a string with len fill-chars and endnull
  714. ; Args: dest,len,fill
  715. ; Ret:  dest+len
  716. ;
  717. begcode strfill
  718. public _strfill
  719. _strfill proc near
  720. push ebp
  721. mov ebp,esp
  722. fix_es  1
  723. push edi
  724. mov edi,P[ebp] ; Memory pointer
  725. mov ecx,P+SIZEPTR[ebp] ; Length
  726. movzx eax,byte ptr P+(2*SIZEPTR)[ebp] ; Fill
  727. q_stos
  728. mov BYTE PTR [edi],0 ; End NULL
  729. mov eax,edi ; End i DX:AX
  730. pop edi
  731. pop ebp
  732. ret
  733. _strfill endp
  734. endcode strfill
  735. ;
  736. ; Find a char in or end of a string
  737. ; Arg: str,char
  738. ; Ret: pointer to found char or NullS
  739. ;
  740. begcode strcend
  741. public _strcend
  742. _strcend proc near
  743. push ebp
  744. mov ebp,esp
  745. fix_es  1
  746. mov edx,edi
  747. mov edi,P[ebp] ; str
  748. mov ah,P+SIZEPTR[ebp] ; search
  749. clr al ; for scasb to find end
  750. @@: cmp ah,[edi]
  751. jz @F ; Found char
  752. scasb
  753. jnz @B ; Not end
  754. dec  edi ; Not found, point at end of string
  755. @@: mov eax,edi
  756. mov edi,edx ; Restore
  757. pop ebp
  758. ret
  759. _strcend ENDP
  760. endcode strcend
  761. ;
  762. ; Test if string has a given suffix
  763. ;
  764. begcode is_prefix
  765. public _is_prefix
  766. _is_prefix proc near
  767. fix_es 1
  768. mov edx,edi ; Save edi
  769. mov eax,esi ; Save esi
  770. mov esi,P[esp] ; get suffix
  771. mov edi,P-SIZEPTR[esp] ; s1
  772. push eax ; push esi
  773. mov eax,1 ; Ok and zero-test
  774. @@: cmp ah,[esi]
  775. jz suf_ok ; End of string; found suffix
  776. cmpsb ; Compare strings
  777. jz @B ; Same, possible prefix
  778. xor eax,eax ; Not suffix
  779. suf_ok: pop esi
  780. mov edi,edx
  781. ret
  782. _is_prefix endp
  783. endcode _is_prefix
  784. ;
  785. ; Find a substring in string
  786. ; Arg: str,search
  787. ;
  788. begcode strstr
  789. public _strstr
  790. _strstr proc near
  791. push ebp
  792. mov ebp,esp
  793. fix_es 1
  794. push EDI
  795. push ESI
  796. mov esi,P[ebp] ; str
  797. mov edi,P+SIZEPTR[ebp] ; search
  798. mov ecx,edi
  799. inc ecx ; ECX = search+1
  800. mov ah,[edi] ; AH = First char in search
  801. jmps sf_10
  802. sf_00: mov esi,edx ; si = Current str-pos
  803. sf_10: mov al,[esi] ; Test if this char exist
  804. and al,al
  805. jz sf_90 ; End of string, didn't find search
  806. inc esi
  807. cmp al,ah
  808. jnz sf_10 ; Didn't find first char, continue
  809. mov edx,esi ; Save str-pos in EDX
  810. mov edi,ecx
  811. sf_20: cmp BYTE PTR [edi],0
  812. jz sf_fo ; Found substring
  813. cmpsb
  814. jz sf_20 ; Char ok
  815. jmps sf_00 ; Next str-pos
  816. sf_90: mov edx,1 ; Return Null
  817. sf_fo: mov eax,edx ; Char found here
  818. dec eax ; Pointed one after
  819. pop ESI
  820. pop EDI
  821. pop ebp
  822. ret
  823. _strstr endp
  824. endcode strstr
  825. ;
  826. ; Find a substring in string, return index
  827. ; Arg: str,search
  828. ;
  829. begcode strinstr
  830. public _strinstr
  831. _strinstr proc near
  832. push ebp
  833. mov ebp,esp
  834. push P+SIZEPTR[ebp] ; search
  835. push P[ebp] ; str
  836. call _strstr
  837. add esp,SIZEPTR*2
  838. or eax,eax
  839. jz si_99 ; Not found, return NULL
  840. sub eax,P[ebp] ; Pos from start
  841. inc eax ; And first pos = 1
  842. si_99: pop ebp
  843. ret
  844. _strinstr endp
  845. endcode strinstr
  846. ;
  847. ; Make a string of len length from another string
  848. ; Arg: dst,src,length
  849. ; ret: end of dst
  850. ;
  851. begcode strmake
  852. public _strmake
  853. _strmake proc near
  854. push ebp
  855. mov ebp,esp
  856. fix_es 1
  857. push EDI
  858. push ESI
  859. mov edi,P[ebp] ; dst
  860. mov esi,P+SIZEPTR[ebp] ; src
  861. mov ecx,P+SIZEPTR*2[ebp] ; Length of memory-area
  862. clr al ; For test of end-null
  863. jcxz sm_90 ; Nothing to move, put zero at end.
  864. @@: cmp al,[esi] ; Next char to move
  865. movsb ; move arg
  866. jz sm_99 ; last char, we are ready
  867. loop @B ; Continue moving
  868. sm_90: mov BYTE PTR [edi],al ; Set end pos
  869. inc edi ; Fix that di points at end null
  870. sm_99: dec edi ; di points now at end null
  871. mov eax,edi ; Ret value in DX:AX
  872. pop ESI
  873. pop EDI
  874. pop ebp
  875. ret
  876. _strmake ENDP
  877. endcode strmake
  878. ;
  879. ; Find length of string with maxlength
  880. ; arg: str,maxlength
  881. ; ret: length
  882. ;
  883. begcode strnlen
  884. public _strnlen
  885. _strnlen proc near
  886. push ebp
  887. mov ebp,esp
  888. fix_es 1
  889. push edi
  890. mov edi,P[ebp] ; Str
  891. mov ecx,P+SIZEPTR[ebp] ; length
  892. mov edx,edi ; Save str to calc length
  893. jcxz sn_10 ; Length = 0
  894. clr al ; Find end of string
  895. repne scasb ; Find strend or length
  896. jnz sn_10
  897. dec edi ; DI points at last null
  898. sn_10: mov eax,edi
  899. sub eax,edx ; Ax = length
  900. pop edi
  901. pop ebp
  902. ret
  903. _strnlen ENDP
  904. endcode strnlen
  905. ;
  906. ; Move a string with max len chars
  907. ; arg: dst,src,len
  908. ; ret: pos to first null or dst+len
  909. begcode strnmov
  910. public _strnmov
  911. _strnmov PROC near
  912. push ebp
  913. mov ebp,esp
  914. fix_es 1
  915. push EDI
  916. push ESI
  917. mov edi,P[ebp] ; dst
  918. mov esi,P+SIZEPTR[ebp] ; src
  919. mov ecx,P+(SIZEPTR*2)[ebp] ; length
  920. jcxz snm_99 ; Nothing to do
  921. clr al ; For test of end-null
  922. @@: cmp al,[esi] ; Next char to move
  923. movsb ; move arg
  924. jz snm_20 ; last char, fill with null
  925. loop @B ; Continue moving
  926. inc edi ; Point two after last
  927. snm_20: dec edi ; Point at first null (or last+1)
  928. snm_99: mov eax,edi ; Pointer at last char
  929. pop ESI
  930. pop EDI
  931. pop ebp
  932. ret
  933. _strnmov ENDP
  934. endcode strnmov
  935. ;
  936. ; Zortech has this one in standard library
  937. ;
  938. begcode strmov
  939. public _strmov
  940. _strmov proc near
  941. mov ecx,esi ; Save old esi and edi
  942. mov edx,edi
  943. mov esi,P[esp] ; get source pointer (s2)
  944. mov edi,P-SIZEPTR[esp] ; EDI -> s1
  945. fix_es 1
  946. @@: mov al,[esi]
  947. movsb ; move arg
  948. and al,al
  949. jnz @B ; Not last
  950. mov eax,edi
  951. dec eax
  952. mov esi,ecx ; Restore args
  953. mov edi,edx
  954. ret
  955. _strmov endp
  956. endcode strmov
  957. endif ; M_I386
  958. END