[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]

    {
     Here's a routine that's faster than Pos on my system. It's written
     in external assembly language, and linked directly into TP program
     code.  I'm including an example of using the code, the assembly
     source code, and a pre-assembled ready-to-compile POSIN.OBJ file:

     Here's the example... }

    (*******************************************************************)
    PROGRAM Demo; { A faster Pos() for TP4+. June 17/94 Greg Vigneault  }

    VAR str : STRING;  j : BYTE;

    FUNCTION PosIn (Pattern, Str : STRING) : BYTE; EXTERNAL;
    {$L POSIN.OBJ}    (* link in the external code *)

    BEGIN
          WriteLn;
          str := 'Position of THIS in string is ';
          j := PosIn ('THIS',str);;  WriteLn (str,j);
          WHILE (j > 1) DO BEGIN Write (' '); DEC(j); END;
          WriteLn ('^^^^');
          WriteLn;
    END.
    (*******************************************************************)

    Here's the assembly code source...
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    code    segment byte public 'CODE'
            assume  cs:code
    ; FUNCTION PosIn (pattern, string : STRING) : BYTE;
    pattern equ dword ptr 8[bp]
    string  equ dword ptr 4[bp]
    PosIn   proc    near
            public  PosIn
            push  bp                    ; preserve
            mov   bp, sp
            push  ds
            push  es
            cld                         ; assure forward scans
            lds   si, pattern           ; DS:SI -> pattern
            sub   ax, ax                ; zero
            lodsb                       ; get length byte
            test  ax, ax                ; null string?
            jz    done                  ; yes: exit with zero
            mov   dx, ax                ; length of pattern
            les   di, string            ; ES:DI -> string
            sub   bx, bx                ; zero
            mov   bl, es:[di]           ; string length
            cmp   bx, dx                ; pattern > string ?
            jc    none                  ; yes: exit with zero
            inc   di                    ; point to 1st string char
            lodsb                       ; get pattern 1st char
            dec   dx                    ; adjust pointer
            sub   bx, dx                ; don't need to check end
      po0:  mov   cx, bx                ; unsearched chars count
            repne scasb                 ; search for pattern char
            jne   none                  ; no char match
            mov   bx, cx                ; unsearched count
            push  di                    ; save text pointers
            push  si
            mov   cx, dx                ; length of pattern
            repe  cmpsb                 ; check for pattern
            pop   si                    ; restore pointers
            pop   di
            jne   po0                   ; loop if no pattern match
            lds   ax, string            ; string pointer
            xchg  ax, di                ; swap offsets
            sub   ax, di                ; subtract offsets
            dec   ax                    ; adjust for PosIn
            jmp   short done            ; found pattern
      none: sub   ax, ax                ; pattern not found
      done: pop   es                    ; restore
            pop   ds
            mov   sp, bp
            pop   bp
            ret   8
    PosIn   endp
    code    ends
            end
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    USE XX3402 to decode this and obtain POSIN.OBJ requried for this unit.

    *XX3402-000140-170694--72--85-37398-------POSIN.OBJ--1-OF--1
    U+g+0L-jQqZi9Y3HHHGK-k++-2BDF2J2a+Q+82U++U6-v7+A+++--J-DIoZC++++pMU2++0W
    +R4UH++-++-JWykS-jn3RUUfk8m3k5EkWx12TUEfqmO85HjOQW-5f2cfqcj9wetp3MjNJpO9
    mjCaLZxpvgJ4-7QfloXf+Wj+-ly9tJr00+1nWU6++5E+
    ***** END OF BLOCK 1 *****

[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]